[
  {
    "path": ".github/FUNDING.yml",
    "content": "patreon: lombok\ntidelift: maven/org.projectlombok:lombok\ngithub: projectlombok\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Let us know about a bug in lombok\ntitle: '[BUG] '\nlabels: ''\nassignees: ''\n\n---\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior, preferably in the form of the smallest java source file you can make that will show the problem when compiled with `javac -cp lombok.jar ExampleFile.java` or as sole java file in a fresh new eclipse project.\n\nIf this is not possible, give us enough to reproduce the problem. If you have stack traces or error messages please include all of them, and include screen shots if that will help explain the problem.\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Version info (please complete the following information):**\n - Lombok version\n - Platform (javac or eclipse, and if so, what is the output of `javac -version` / the version listed in the _about..._ dialog of eclipse.\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Request a lombok feature or enhancement\ntitle: '[FEATURE] '\nlabels: ''\nassignees: ''\n\n---\n\n**Before submitting**\nPlease check our [wiki](https://github.com/projectlombok/lombok/wiki) because some feature requests are asked _a lot_ and there are good reasons (as explained on the wiki) why we can't (yet) implement them or why we won't implement them.\n\n**Describe the feature**\nA clear and concise description of what the feature request/enhancement is. What is the goal of adding this feature request? This should include 2 java snippets: One 'lomboked' version, which is java code with (for example) an annotation that is short and boilerplate free, and a second snippet that shows precisely what lombok will do under the hood. Lombok can only turn java code that is valid java syntax into different java code.\n\n**Describe the target audience**\nDescribe which programmers and/or which kinds of programs would benefit from your feature proposal. If the feature proposal interacts with a library that isn't part of the core java libraries, link to this project.\n\n**Additional context**\nAdd any other context about the feature / enhancement here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/intellij_plugin.md",
    "content": "---\nname: IntelliJ plugin bug report or feature request\nabout: Let us know about a problem with lombok support in JetBrains IntelliJ IDEA \ntitle: '[DO NOT POST HERE]'\nlabels: ''\nassignees: ''\n\n---\n\n***You're in the wrong place!***\n\nPlease do not report any problems or feature requests for the intellij plugin here; file these with the [intellij lombok plugin github repo](https://github.com/mplushnikov/lombok-intellij-plugin/issues).\n\nThank you!\n"
  },
  {
    "path": ".github/workflows/ant.yml",
    "content": "name: Tests\n\non:\n  push:\n  pull_request:\n\njobs:\n  build:\n    runs-on: ubuntu-24.04\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n      \n      - name: Set up JDK 11\n        uses: actions/setup-java@v4\n        with:\n          distribution: 'zulu'\n          java-version: 11\n      \n      - name: Cache dependencies\n        uses: actions/cache@v4\n        with:\n          path: |\n            ivyCache\n            lib\n          key: ivy-${{ hashFiles('**/ivy.xml') }}\n          restore-keys: |\n            ivy-\n        \n      - name: Build with Ant\n        run: ant -noinput dist\n        \n      - uses: actions/upload-artifact@v4\n        with:\n          name: lombok.jar\n          path: dist/lombok.jar\n    \n  \n  test-javac:\n    runs-on: ubuntu-24.04\n    needs: build\n    env:\n      EA_JDK: 25\n    strategy: \n      matrix: \n        jdk: [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]\n        goal: [javacCurrent]\n        include:\n          - jdk: 11\n            goal: javac6\n          - jdk: 11\n            goal: javac8\n      fail-fast: false\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n      \n      - name: Set up JDK ${{ matrix.jdk }}\n        if: ${{ matrix.jdk < env.EA_JDK }}\n        uses: actions/setup-java@v4\n        with:\n          java-version: ${{ matrix.jdk }}\n          distribution: 'zulu'\n      \n      - name: Set up JDK ${{ matrix.jdk }} Early Access release\n        if: ${{ matrix.jdk >= env.EA_JDK }}\n        uses: oracle-actions/setup-java@v1\n        with:\n          website: jdk.java.net\n          release: ${{ matrix.jdk }}\n          version: latest\n      \n      - name: Cache dependencies\n        uses: actions/cache@v4\n        with:\n          path: |\n            ivyCache\n            lib\n          key: ivy-${{ hashFiles('**/ivy.xml') }}\n          restore-keys: |\n            ivy-\n        \n      - name: Run tests\n        run: ant -noinput test.${{ matrix.goal }}\n  \n  test-eclipse:\n    runs-on: ubuntu-24.04\n    needs: build\n    strategy: \n      matrix: \n        version:\n          - eclipse-oxygen\n          - eclipse-202006\n          - eclipse-202006-jdk8\n          - eclipse-202403\n          - eclipse-202503\n          - eclipse-I-build\n          - eclipse-oxygen-full\n          - eclipse-202403-full\n          - eclipse-202503-full\n          - eclipse-I-build-full\n          - ecj11\n          - ecj14\n          - ecj16\n          - ecj19\n      fail-fast: false\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n        \n      - name: Set up JDK 21\n        uses: actions/setup-java@v4\n        with:\n          java-version: 21\n          distribution: 'zulu'\n\n      - name: Cache dependencies\n        uses: actions/cache@v4\n        with:\n          path: |\n            ivyCache\n            lib\n          key: ivy-${{ hashFiles('**/ivy.xml') }}\n          restore-keys: |\n            ivy-\n\n      - name: Cache base testenv\n        if: ${{ !endsWith(matrix.version, 'full') }}\n        uses: actions/cache@v4\n        with:\n          path: |\n            testenv\n          key: base-testenv-${{ hashFiles('**/setup.ant.xml') }}\n\n      - name: Cache full testenv\n        if: ${{ endsWith(matrix.version, 'full') }}\n        uses: actions/cache@v4\n        with:\n          path: |\n            testenv\n          key: ${{ matrix.version }}-testenv-${{ hashFiles('**/setup.ant.xml') }}\n          \n      - name: Build with Ant\n        run: xvfb-run ant -noinput dist test.${{ matrix.version }}\n        \n  docker-integration-test:\n    runs-on: ubuntu-24.04\n    needs: build\n    strategy: \n      matrix: \n        jdk: [8, 11, 17, 21, 25]\n        tool: \n          - {name: \"maven\",  cmd: \"mvn compile\"}\n          - {name: \"gradle\", cmd: \"gradle assemble\", buildArgs: {\"25\": \"--build-arg gradle=9.1.0\"}}\n          - {name: \"ant\",    cmd: \"ant dist\"}\n          - {name: \"bazel\",  cmd: \"bazel build //:ProjectRunner\"}\n      fail-fast: false\n    env:\n      IMAGE_NAME: lombok-${{ matrix.tool.name }}-jdk${{ matrix.jdk }}\n      \n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n        \n      - uses: actions/download-artifact@v4\n        with:\n          name: lombok.jar\n        \n      - name: Build container\n        working-directory: ./docker\n        run: docker build --build-arg jdk=${{ matrix.jdk }} ${{ matrix.tool.buildArgs[matrix.jdk] }} -t $IMAGE_NAME -f ${{ matrix.tool.name }}/Dockerfile .\n        \n      - name: Compile in container\n        run: docker run --entrypoint=\"\" -v $(pwd)/lombok.jar:/workspace/lombok.jar $IMAGE_NAME /bin/bash -c \"cd classpath; ${{ matrix.tool.cmd }}\"\n  \n  manual-tests:\n    runs-on: ubuntu-24.04\n    needs: build\n    strategy: \n      matrix: \n        jdk: [8, 11, 17, 21, 25]\n        dir: [compileTests]\n      fail-fast: false\n    \n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n        \n      - name: Set up JDK ${{ matrix.jdk }}\n        uses: actions/setup-java@v4\n        with:\n          java-version: ${{ matrix.jdk }}\n          distribution: 'zulu'\n          \n      - uses: actions/download-artifact@v4\n        with:\n          name: lombok.jar\n          path: dist\n          \n      - name: Run tests\n        working-directory: ./test/manual/${{ matrix.dir }}/\n        run: ./runTests.sh\n\n"
  },
  {
    "path": ".github/workflows/codeql-analysis.yml",
    "content": "# For most projects, this workflow file will not need changing; you simply need\n# to commit it to your repository.\n#\n# You may wish to alter this file to override the set of languages analyzed,\n# or to provide custom queries or build logic.\n#\n# ******** NOTE ********\n# We have attempted to detect the languages in your repository. Please check\n# the `language` matrix defined below to confirm you have the correct set of\n# supported CodeQL languages.\n#\nname: \"CodeQL\"\n\non:\n  push:\n    branches: [ master ]\n  pull_request:\n    # The branches below must be a subset of the branches above\n    branches: [ master ]\n  schedule:\n    - cron: '18 19 * * 2'\n\njobs:\n  analyze:\n    name: Analyze\n    runs-on: ubuntu-latest\n    permissions:\n      actions: read\n      contents: read\n      security-events: write\n\n    strategy:\n      fail-fast: false\n      matrix:\n        language: [ 'java', 'javascript' ]\n        # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]\n        # Learn more about CodeQL language support at https://git.io/codeql-language-support\n\n    steps:\n    - name: Checkout repository\n      uses: actions/checkout@v2\n\n    # Initializes the CodeQL tools for scanning.\n    - name: Initialize CodeQL\n      uses: github/codeql-action/init@v1\n      with:\n        languages: ${{ matrix.language }}\n        # If you wish to specify custom queries, you can do so here or in a config file.\n        # By default, queries listed here will override any specified in a config file.\n        # Prefix the list here with \"+\" to use these queries and those in the config file.\n        # queries: ./path/to/local/query, your-org/your-repo/queries@main\n\n    # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).\n    # If this step fails, then you should remove it and run the build manually (see below)\n    \n    # No, you cannot just build lombok\n    ###- name: Autobuild\n    ###  uses: github/codeql-action/autobuild@v1\n\n    # ℹ️ Command-line programs to run using the OS shell.\n    # 📚 https://git.io/JvXDl\n\n    # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines\n    #    and modify them (or add more) to build your code if your project\n    #    uses a compiled language\n\n    #- run: |\n    #   make bootstrap\n    #   make release\n    - run: |\n        ant dist\n\n    - name: Perform CodeQL Analysis\n      uses: github/codeql-action/analyze@v1\n"
  },
  {
    "path": ".gitignore",
    "content": "/testenvironment.properties\n/bin\n/build\n/dist\n/ivyCache\n/google.properties\n/debug\n/*.launch\n/findbugsReport.html\n/lib\n/.settings\n/.project\n/.classpath\n/.factorypath\n/lombok.iml\n/.idea\n*.iml\n*.markdown.html\n/junit*.properties\n/eclipse.location\n/.apt_generated/\n/out\n/website/lombokSupporters\n/pom.xml\n/jvm.locations\n/testenv\n/gpg.keyring\n"
  },
  {
    "path": "AUTHORS",
    "content": "Lombok contributors in alphabetical order:\n\nAdam Juraszek <juriad@gmail.com>\nAleksandr Zhelezniak <lekan1992@gmail.com>\nAmine Touzani <ttzn.dev@gmail.com>\nAndre Brait <andrebrait@gmail.com>\nAnshuman Mishra <a.mishra@uber.com>\nBulgakov Alexander <buls@yandex.ru>\nCaleb Brinkman <floralvikings@gmail.com>\nChristian Nüssgens <christian@nuessgens.com>\nChristian Schlichtherle <christian-schlichtherle@users.noreply.github.com>\nChristian Sterzl <christian.sterzl@gmail.com>\nChristoph Dreis <christoph.dreis@freenet.de>\nDaveLaw <project.lombok@apconsult.de>\nDave Brosius <dbrosius@mebigfatguy.com>\nDawid Rusin <dawidrusin90@gmail.com>\nDenis Stepanov <denis.stepanov@gmail.com>\nEmil Lundberg <emil@yubico.com>\nEnrique da Costa Cambio <enrique.dacostacambio@gmail.com>\nJacob Middag <jacob@gaddim.nl>\nJames Yoo <jyoo980@gmail.com>\nJan Matèrne <jhm@apache.org>\nJan Rieke <it@janrieke.de>\nJappe van der Hel <jappe.vanderhel@gmail.com>\nJohn Paul Taylor II <johnpaultaylorii@gmail.com>\nKarthik kathari <44122128+varkart@users.noreply.github.com>\nKevin Chirls <kchirls@users.noreply.github.com>\nLars Uffmann <lars.uffmann@gmail.com>\nLiu DongMiao <liudongmiao@gmail.com>\nLiam Pace <liam.hollum.pace@gmail.com>\nLuan Nico <luannico27@gmail.com>\nMaarten Mulders <mthmulders@users.noreply.github.com>\nManu Sridharan <msridhar@gmail.com>\nMark Haynes <markhaynes.work@gmail.com>\nMart Hagenaars <marthagenaars@gmail.com>\nMartin O'Connor <38929043+martinoconnor@users.noreply.github.com>\nMartin Panzer <postremus1996@googlemail.com>\nMateusz Matela <mateusz.matela@gmail.com>\nMichael Dardis <git@md-5.net>\nMichael Ernst <mernst@alum.mit.edu>\nMichiel Verheul <cheelio@gmail.com>\nMoonFruit <dkmoonfruit@gmail.com>\nOle Ludwig <o.ludwig@wtnet.de>\nPascal Bihler <pascal@qfs.de>\nPeter Grant <petercgrant@users.noreply.github.com>\nPhilipp Eichhorn <peichhor@web.de>\nPhilippe Charles <philippe.charles@nbb.be>\nPim van der Loos <pimvanderloos@gmail.com>\nRabea Gransberger <rgra@users.noreply.github.com>\nRaul Wißfeld <Rawi01@users.noreply.github.com>\nReinier Zwitserloot <reinier@zwitserloot.com>\nRob Stryker <rob@oxbeef.net>\nRobbert Jan Grootjans <grootjans@gmail.com>\nRobert Wertman <robert.wertman@gmail.com>\nRoel Spilker <r.spilker@gmail.com>\nRoland Praml <pram@gmx.de>\nRostislav Krasny <45571812+rosti-il@users.noreply.github.com>\nSamuel Pereira <samuel.p.araujo@gmail.com>\nSasha Koning <askoning@gmail.com>\nSzymon Pacanowski <spacanowski@gmail.com>\nTaiki Sugawara <buzz.taiki@gmail.com>\nTakuya Murakami <tmurakam@tmurakam.org>\nThomas Darimont <thomas.darimont@gmail.com>\nTill Brychcy <till.brychcy@mercateo.com>\nVictor Williams Stafusa da Silva <victorwssilva@gmail.com>\nYonatan Sherwin <yonatansherwin@gmail.com>\nYun Zhi Lin <yun@yunspace.com>\n\nBy adding your name to this list, you grant full and irrevocable copyright and patent indemnity to Project Lombok and all use of Project Lombok in relation to all commits you add to Project Lombok, and you certify that you have the right to do so.\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (C) 2009-2021 The Project Lombok Authors.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n==============================================================================\nLicenses for included components:\n\norg.ow2.asm:asm\norg.ow2.asm:asm-analysis\norg.ow2.asm:asm-commons\norg.ow2.asm:asm-tree\norg.ow2.asm:asm-util\nASM: a very small and fast Java bytecode manipulation framework\n Copyright (c) 2000-2011 INRIA, France Telecom\n All rights reserved.\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions\n are met:\n 1. Redistributions of source code must retain the above copyright\n    notice, this list of conditions and the following disclaimer.\n 2. Redistributions in binary form must reproduce the above copyright\n    notice, this list of conditions and the following disclaimer in the\n    documentation and/or other materials provided with the distribution.\n 3. Neither the name of the copyright holders nor the names of its\n    contributors may be used to endorse or promote products derived from\n    this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\n THE POSSIBILITY OF SUCH DAMAGE.\n\n------------------------------------------------------------------------------\nrzwitserloot/com.zwitserloot.cmdreader \n \n Copyright © 2010 Reinier Zwitserloot.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in\n all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n THE SOFTWARE.\n\n------------------------------------------------------------------------------\n\nprojectlombok/lombok.patcher\n\n Copyright (C) 2009-2021 The Project Lombok Authors.\n \n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in\n all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n THE SOFTWARE.\n\n------------------------------------------------------------------------------"
  },
  {
    "path": "README.md",
    "content": "# Project Lombok\n\n**Project Lombok** is a java library that automatically plugs into your editor and build tools, spicing up your java.\nNever write another getter or equals method again, with one annotation your class has a fully featured builder, automate your logging variables, and much more.\n\nSee [LICENSE] for the Project Lombok license.\n\nLooking for professional support of Project Lombok? Lombok is now part of a [tidelift subscription]!\n\nFor a list of all authors, see the [AUTHORS] file. \n\nFor complete project information, a short tutorial on what lombok does, and how to download / use / install it, see [projectlombok.org]\n\nYou can review our security policy via [SECURITY.md]\n\n[LICENSE]: https://github.com/projectlombok/lombok/blob/master/LICENSE\n[AUTHORS]: https://github.com/projectlombok/lombok/blob/master/AUTHORS\n[SECURITY.md]: https://github.com/projectlombok/lombok/blob/master/SECURITY.md\n[projectlombok.org]: https://projectlombok.org/\n[tidelift subscription]: https://tidelift.com/subscription/pkg/maven-org-projectlombok-lombok?utm_source=maven-org-projectlombok-lombok&utm_medium=referral&campaign=website\n"
  },
  {
    "path": "SECURITY.md",
    "content": "# Security Policies and Procedures\n\nLombok only runs during compilation and is not required on your servers or in your application's distribution. Nevertheless, the _Project Lombok_ team and community take all security bugs seriously.\n\n## Reporting a Bug\n\nTo report a security vulnerability, please follow the procedure described in the [Tidelift security policy](https://tidelift.com/docs/security?utm_source=lombok&utm_medium=referral&utm_campaign=github).\n\nAlternatively, you can send us an email privately via `security@projectlombok.org`.\n\n## Disclosure Policy\n\nWhen we receive a security bug report, it will be assigned a primary handler. This person will coordinate the fix and release process. In case this process requires additional resources beyond the scope of what the core contributors of _Project Lombok_ can reasonably supply, we will inform the Tidelift security team for additional help and coordination. This process will involve the following steps:\n\n* Inventorize all affected versions along with the platform(s) that lombok runs on which are affected.\n* Audit code to find any potential similar problems.\n* Prepare fixes for all releases, push these out to all distribution channels including the maven central repo, and put in all due effort to get affected versions marked as affected.\n\n## Comments on this Policy\n\nAny comments on this policy or suggestions for improvement can be discussed on [our forum](https://groups.google.com/forum/#!forum/project-lombok), or you can send us an email for any comments or suggestions that contain sensitive information.\n"
  },
  {
    "path": "build.xml",
    "content": "<!--\n Copyright (C) 2010-2020 The Project Lombok Authors.\n  \n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to deal\n  in the Software without restriction, including without limitation the rights\n  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  copies of the Software, and to permit persons to whom the Software is\n  furnished to do so, subject to the following conditions:\n  \n  The above copyright notice and this permission notice shall be included in\n  all copies or substantial portions of the Software.\n  \n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  THE SOFTWARE.\n-->\n<project name=\"lombok\" default=\"quickstart\" xmlns:ivy=\"antlib:com.zwitserloot.ivyplusplus\">\n\t<description>\nThis buildfile is part of projectlombok.org. It is the main entry point that contains\nthe common tasks and can be called on to run the main aspects of all the sub-scripts.\n\t</description>\n\t\n\t<import file=\"buildScripts/info.ant.xml\" />\n\t<import file=\"buildScripts/setup.ant.xml\" />\n\t<import file=\"buildScripts/vm-finder.ant.xml\" />\n\t<import file=\"buildScripts/build-support.ant.xml\" />\n\t<import file=\"buildScripts/compile.ant.xml\" />\n\t<import file=\"buildScripts/maven.ant.xml\" />\n\t<import file=\"buildScripts/tests.ant.xml\" />\n\t<import file=\"buildScripts/create-eclipse-project.ant.xml\" />\n\t<import file=\"buildScripts/create-intellij-project.ant.xml\" />\n\t<import file=\"buildScripts/website.ant.xml\" />\n\t<import file=\"buildScripts/eclipse-p2.ant.xml\" />\n\t<import file=\"buildScripts/mapstructBinding.ant.xml\" />\n</project>\n"
  },
  {
    "path": "buildScripts/.gitignore",
    "content": "/lombok.jks.password\n"
  },
  {
    "path": "buildScripts/build-support.ant.xml",
    "content": "<!--\n Copyright (C) 2010-2020 The Project Lombok Authors.\n  \n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to deal\n  in the Software without restriction, including without limitation the rights\n  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  copies of the Software, and to permit persons to whom the Software is\n  furnished to do so, subject to the following conditions:\n  \n  The above copyright notice and this permission notice shall be included in\n  all copies or substantial portions of the Software.\n  \n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  THE SOFTWARE.\n-->\n<project name=\"lombok.build-support\" default=\"dist\" xmlns:ivy=\"antlib:com.zwitserloot.ivyplusplus\" basedir=\"..\">\n\t<description>\nThis buildfile is part of projectlombok.org. It is responsible for tasks that help with setting up the build infrastructure.\nNone of these tasks are normally needed, unless modifying how the build works, such as updating dependencies.\n\t</description>\n\t\n\t<condition property=\"executable.suffix\" value=\".exe\" else=\"\">\n\t\t<os family=\"windows\" />\n\t</condition>\n\t\n\t<condition property=\"java_home.exe\" value=\"/usr/libexec/java_home\">\n\t\t<os family=\"mac\" />\n\t</condition>\n\t\n\t<target name=\"-ask.target-jdk.via-javahome\" if=\"java_home.exe\" unless=\"target.jdk\">\n\t\t<input addproperty=\"target.jdk.ver\">You need to specify the JDK9+ jdk whose jdk.compiler and java.compiler modules are to be converted. Use -Dtarget.jdk.ver=14 to automate this, or type a version in now (for example: 11):</input>\n\t\t<condition property=\"target.jdk.ver.missing\" value=\"true\">\n\t\t\t<equals arg1=\"${target.jdk.ver}\" arg2=\"\" trim=\"true\" />\n\t\t</condition>\n\t\t<fail if=\"target.jdk.ver.missing\">Aborted (no version entered)</fail>\n\t\t<exec executable=\"${java_home.exe}\" outputproperty=\"target.jdk\" failonerror=\"true\">\n\t\t\t<arg value=\"-v\" />\n\t\t\t<arg value=\"${target.jdk.ver}\" />\n\t\t</exec>\n\t\t<echo>Using VM at: ${target.jdk}</echo>\n\t</target>\n\t\n\t<target name=\"-ask.target-jdk\" depends=\"-ask.target-jdk.via-javahome\" unless=\"target.jdk\">\n\t\t<input addproperty=\"target.jdk\">You need to specify the JDK9+ jdk whose jdk.compiler and java.compiler modules are to be converted. Run ant with -Dtarget.jdk=/full/path/here to automate this, or type the path in now (for example: /Library/JavaVirtualMachines/jdk-14.jdk/Contents/Home):</input>\n\t</target>\n\t\n\t<target name=\"make.javac-patch-jar\" depends=\"-ask.target-jdk, -setup.build\" description=\"to test javac13 on JDK14, for example, you need a jar (not a jmod), to use with --patch-modules. This task makes those.\">\n\t\t<exec executable=\"${target.jdk}/bin/java${executable.suffix}\" outputproperty=\"target.javac.version.full\" errorproperty=\"target.javac.version.err\">\n\t\t\t<arg value=\"--version\" />\n\t\t</exec>\n\t\t<condition property=\"target.javac.tooearly\" >\n\t\t\t<contains string=\"${target.javac.version.err}\" substring=\"Unrecognized option\" />\n\t\t</condition>\n\t\t<fail if=\"target.javac.tooearly\">This tool converts javac as stored in jmods of JDK distributions; JDK8 and below doesn't ship like that, and you don't need this for 8 and below.</fail>\n\t\t\n\t\t<delete dir=\"build/jdk-compiler-jar\" quiet=\"true\" />\n\t\t<mkdir dir=\"build/jdk-compiler-jar\" />\n\t\t<echo file=\"build/jdk-compiler-jar/version.txt\">${target.javac.version.full}</echo>\n\t\t<copy file=\"build/jdk-compiler-jar/version.txt\" tofile=\"build/jdk-compiler-jar/shortversion.txt\" />\n\t\t<replaceregexp file=\"build/jdk-compiler-jar/version.txt\" match=\"^openjdk ([^ ]+) (\\d{4}-\\d{2}-\\d{2}).*$\" replace=\"\\1_\\2\" flags=\"si\" />\n\t\t<replaceregexp file=\"build/jdk-compiler-jar/shortversion.txt\" match=\"^openjdk ([^ ]+) (\\d{4}-\\d{2}-\\d{2}).*$\" replace=\"\\1\" flags=\"si\" />\n\t\t<loadfile property=\"target.javac.version\" srcfile=\"build/jdk-compiler-jar/version.txt\" />\n\t\t<loadfile property=\"target.javac.shortversion\" srcfile=\"build/jdk-compiler-jar/shortversion.txt\" />\n\t\t\n\t\t<mkdir dir=\"build/jdk-compiler-jar/java.compiler\" />\n\t\t<exec executable=\"${target.jdk}/bin/jmod${executable.suffix}\">\n\t\t\t<arg value=\"--dir\" />\n\t\t\t<arg file=\"build/jdk-compiler-jar/java.compiler\" />\n\t\t\t<arg value=\"extract\" />\n\t\t\t<arg file=\"${target.jdk}/jmods/java.compiler.jmod\" />\n\t\t</exec>\n\t\t<jar destfile=\"build/javac${target.javac.version}-java.compiler.jar\" index=\"true\">\n\t\t\t<fileset dir=\"build/jdk-compiler-jar/java.compiler/classes\" />\n\t\t\t<fileset dir=\"build/jdk-compiler-jar/java.compiler/legal\" />\n\t\t</jar>\n\t\t\n\t\t<mkdir dir=\"build/jdk-compiler-jar/jdk.compiler\" />\n\t\t<exec executable=\"${target.jdk}/bin/jmod${executable.suffix}\">\n\t\t\t<arg value=\"--dir\" />\n\t\t\t<arg file=\"build/jdk-compiler-jar/jdk.compiler\" />\n\t\t\t<arg value=\"extract\" />\n\t\t\t<arg file=\"${target.jdk}/jmods/jdk.compiler.jmod\" />\n\t\t</exec>\n\t\t<jar destfile=\"build/javac${target.javac.version}-jdk.compiler.jar\" index=\"true\">\n\t\t\t<fileset dir=\"build/jdk-compiler-jar/jdk.compiler/classes\" />\n\t\t\t<fileset dir=\"build/jdk-compiler-jar/jdk.compiler/legal\" />\n\t\t</jar>\n\t\t\n\t\t<tstamp>\n\t\t\t<format property=\"target.javac.pubstamp\" pattern=\"yyyyMMddHHmmss\" />\n\t\t</tstamp>\n\t\t<echo file=\"buildScripts/ivy-repo/net.java.openjdk.custom-javac${target.javac.shortversion}-${target.javac.version}.xml\">&lt;ivy-module version=\"2.0\"&gt;\n\t&lt;info organisation=\"net.java.openjdk.custom\" module=\"javac${target.javac.shortversion}\" revision=\"${target.javac.version}\" publication=\"${target.javac.pubstamp}\"&gt;\n\t\t&lt;license name=\"GNU General Public License v2 with Classpath Exception\" url=\"https://openjdk.java.net/legal/gplv2+ce.html\" /&gt;\n\t\t&lt;description homepage=\"https://openjdk.java.net\" /&gt;\n\t&lt;/info&gt;\n\t&lt;configurations&gt;\n\t\t&lt;conf name=\"runtime\" /&gt;\n\t&lt;/configurations&gt;\n\t&lt;publications&gt;\n\t\t&lt;artifact name=\"javac${target.javac.shortversion}-java.compiler\" conf=\"runtime\" url=\"https://projectlombok.org/ivyrepo/langtools/javac${target.javac.version}-java.compiler.jar\" /&gt;\n\t\t&lt;artifact name=\"javac${target.javac.shortversion}-jdk.compiler\" conf=\"runtime\" url=\"https://projectlombok.org/ivyrepo/langtools/javac${target.javac.version}-jdk.compiler.jar\" /&gt;\n\t&lt;/publications&gt;\n&lt;/ivy-module&gt;</echo>\n\t\t<echo>File build/javac${target.javac.version}-java.compiler.jar and build/javac${target.javac.version}-jdk.compiler.jar are available for upload; custom ivy target made as GAV net.java.openjdk.custom::javac${target.javac.shortversion}::${target.javac.version}</echo>\n\t</target>\n</project>\n"
  },
  {
    "path": "buildScripts/compile.ant.xml",
    "content": "<!--\n Copyright (C) 2020-2023 The Project Lombok Authors.\n  \n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to deal\n  in the Software without restriction, including without limitation the rights\n  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  copies of the Software, and to permit persons to whom the Software is\n  furnished to do so, subject to the following conditions:\n  \n  The above copyright notice and this permission notice shall be included in\n  all copies or substantial portions of the Software.\n  \n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  THE SOFTWARE.\n-->\n<project name=\"lombok.compile\" default=\"dist\" xmlns:ivy=\"antlib:com.zwitserloot.ivyplusplus\" basedir=\"..\">\n\t<description>\nThis buildfile is part of projectlombok.org. It takes care of compiling and building lombok itself.\n\t</description>\n\t\n\t<property name=\"mapstruct-binding.version\" value=\"0.2.0\" />\n\t\n\t<!-- compiles just 'version.java' and runs the produced class file, setting up the various version properties -->\n\t<target name=\"version\" depends=\"ipp.setup, deps.jdk-runtime, -setup.build\" description=\"Shows the version number\" unless=\"lombok.version\">\n\t\t<ivy:compile destdir=\"build/lombok-version\" source=\"1.5\" target=\"1.5\" ecj=\"true\" nowarn=\"true\">\n\t\t\t<bootclasspath path=\"${jdk6-rt.loc}\" />\n\t\t\t<src path=\"src/core\" />\n\t\t\t<include name=\"lombok/core/Version.java\" />\n\t\t</ivy:compile>\n\t\t<java\n\t\t\tclassname=\"lombok.core.Version\"\n\t\t\tclasspath=\"build/lombok-version\"\n\t\t\tfailonerror=\"true\"\n\t\t\toutput=\"build/version.txt\">\n\t\t\t<arg value=\"full\" />\n\t\t</java>\n\t\t<ivy:loadversion property=\"lombok.fullversion\" file=\"build/version.txt\" />\n\t\t<java\n\t\t\tclassname=\"lombok.core.Version\"\n\t\t\tclasspath=\"build/lombok-version\"\n\t\t\tfailonerror=\"true\"\n\t\t\toutput=\"build/version.txt\" />\n\t\t<ivy:loadversion property=\"lombok.version\" file=\"build/version.txt\" />\n\t\t<echo level=\"info\">Lombok version: ${lombok.version} (${lombok.fullversion})</echo>\n\t</target>\n\t\n\t<property name=\"packing.basedirs\" value=\"build/lombok-transplants,build/lombok-utils,build/lombok-utils6,build/lombok-main,build/lombok-main8,build/lombok-deps\" />\n\t<loadresource property=\"packing.basedirs.colon\">\n\t\t<propertyresource name=\"packing.basedirs\" />\n\t\t<filterchain><tokenfilter>\n\t\t\t<filetokenizer/>\n\t\t\t<replacestring from=\",\" to=\":\" />\n\t\t</tokenfilter></filterchain>\n\t</loadresource>\n\t<path id=\"packing.basedirs.path\">\n\t\t<pathelement path=\"${packing.basedirs.colon}\" />\n\t</path>\n\t\n\t<target name=\"create.spiProcessor\" depends=\"version, -setup.build\" description=\"Compiles the services file generating processor\">\n\t\t<ivy:compile destdir=\"build/spiProcessor\" source=\"1.8\" target=\"1.8\" ecj=\"true\">\n\t\t\t<src path=\"src/spiProcessor\" />\n\t\t\t<classpath location=\"build/spiProcessor\" />\n\t\t</ivy:compile>\n\t\t<mkdir dir=\"build/spiProcessor/META-INF/services\" />\n\t\t<echo file=\"build/spiProcessor/META-INF/services/javax.annotation.processing.Processor\">lombok.spi.SpiProcessor</echo>\n\t\t<jar destfile=\"dist/spiProcessor.jar\">\n\t\t\t<fileset dir=\"build/spiProcessor\" />\n\t\t</jar>\n\t</target>\n\t\n\t<target name=\"create.mavenEcjBootstrapAgent\" depends=\"-setup.build\" description=\"Compiles the Maven ECJ bootstrap agent\">\n\t\t<ivy:compile destdir=\"build/mavenEcjBootstrapAgent\" source=\"1.6\" target=\"1.6\" ecj=\"true\">\n\t\t\t<bootclasspath path=\"${jdk6-rt.loc}\" />\n\t\t\t<src path=\"src/mavenEcjBootstrapAgent\" />\n\t\t</ivy:compile>\n\t\t<mkdir dir=\"build/lombok-main/lombok/launch\" />\n\t\t<jar destfile=\"build/lombok-main/lombok/launch/mavenEcjBootstrapAgent.jar\" basedir=\"build/mavenEcjBootstrapAgent\">\n\t\t\t<manifest>\n\t\t\t\t<attribute name=\"Premain-Class\" value=\"lombok.launch.MavenEcjBootstrapAgent\" />\n\t\t\t\t<attribute name=\"Can-Redefine-Classes\" value=\"true\" />\n\t\t\t</manifest>\n\t\t</jar>\n\t</target>\n\t\n\t<target name=\"compile\" depends=\"version, deps, -setup.build, create.spiProcessor, create.mavenEcjBootstrapAgent\" description=\"Compiles the code\">\n\t\t<!--\n\t\t\t1. Compile stubs.\n\t\t\t2. Compile transplants.\n\t\t\t3. Compile lombok-utils.\n\t\t\t4. Compile lombok. -->\n\t\t\n\t\t<!--\n\t\t\tant includes the destination dir on the classpath (and there are good reasons to do this), but that also means\n\t\t\tthe bleeding edge lombok from the previous build is run (as lombok is an annotation processor), which means if\n\t\t\tthere are bugs in it, you can't compile anymore until you 'ant clean'. That's very undesirable. so we kill the processor,\n\t\t\twhich stops lombok from running. We re-create the file at the end of this target. -->\n\t\t<delete file=\"build/lombok-main/META-INF/services/javax.annotation.processing.Processor\" quiet=\"true\" />\n\t\t\n\t\t<!--\n\t\t\tfirst, compile stubs. Lombok needs to produce class files that run in a wide variety of JDK, javac, and ecj/eclipse versions.\n\t\t\tInstead of depending on conflicting versions, we write stub files; just enough for compilation to succeed.\n\t\t\t\n\t\t\tHowever, the stubs themselves also have a ton of dependencies; to avoid _that_, we have stubs for stubs, too! -->\n\t\t<ivy:compile destdir=\"build/stubsstubs\" source=\"1.5\" target=\"1.5\" ecj=\"true\">\n\t\t\t<bootclasspath path=\"${jdk6-rt.loc}\" />\n\t\t\t<src path=\"src/stubsstubs\" />\n\t\t</ivy:compile>\n\t\t<ivy:compile destdir=\"build/stubs\" source=\"1.5\" target=\"1.5\" ecj=\"true\">\n\t\t\t<bootclasspath path=\"${jdk6-rt.loc}\" />\n\t\t\t<src path=\"src/stubs\" />\n\t\t\t<src path=\"src/javac-only-stubs\" />\n\t\t\t<classpath location=\"build/stubsstubs\" />\n\t\t\t<classpath location=\"build/stubs\" />\n\t\t</ivy:compile>\n\t\t\n\t\t<!--\n\t\t\tcompile the eclipse agent's transplant sources.\n\t\t\tThis is code that is not actually run within lombok; it is bytecode that the eclipse agent extracts from the class file\n\t\t\twithin its own jar and injects it into the eclipse classes as a patch.\n\t\t\t\n\t\t\tTo keep the project clean of warnings, a few SuppressWarnings have been added, but we don't want them there during compilation,\n\t\t\tso remove them first.\n\t\t\t\n\t\t\tFor legacy eclipse support we include them in both class file format 48 (java 1.4) and 50 (java 1.6), though in practice\n\t\t\twe don't support eclipses that run on anything below java 1.8 anymore. -->\n\t\t<mkdir dir=\"build/transformedSources\" />\n\t\t<copy todir=\"build/transformedSources\">\n\t\t\t<fileset dir=\"src/eclipseAgent\">\n\t\t\t\t<include name=\"**/*Transplants.java\" />\n\t\t\t</fileset>\n\t\t\t<filterchain>\n\t\t\t\t<lineContainsRegExp negate=\"true\">\n\t\t\t\t\t<regexp pattern=\"^\\s*@SuppressWarnings.*$\" />\n\t\t\t\t</lineContainsRegExp>\n\t\t\t</filterchain>\n\t\t</copy>\n\t\t\n\t\t<ivy:compile destdir=\"build/lombok-transplants\" source=\"1.4\" target=\"1.4\" ecj=\"true\">\n\t\t\t<bootclasspath location=\"build/stubs\" />\n\t\t\t<bootclasspath path=\"${jdk6-rt.loc}\" />\n\t\t\t<src path=\"build/transformedSources\" />\n\t\t</ivy:compile>\n\t\t\n\t\t<ivy:compile destdir=\"build/lombok-transplants/Class50\" source=\"1.4\" target=\"1.6\" ecj=\"true\">\n\t\t\t<bootclasspath location=\"build/stubs\" />\n\t\t\t<bootclasspath path=\"${jdk6-rt.loc}\" />\n\t\t\t<src path=\"build/transformedSources\" />\n\t\t</ivy:compile>\n\t\t\n\t\t<ivy:compile destdir=\"build/lombok-utils\" source=\"1.5\" target=\"1.5\" ecj=\"true\">\n\t\t\t<bootclasspath location=\"build/stubs\" />\n\t\t\t<bootclasspath path=\"${jdk6-rt.loc}\" />\n\t\t\t<src path=\"src/utils\" />\n\t\t\t<exclude name=\"lombok/javac/**\" />\n\t\t\t<classpath location=\"build/lombok-utils\" />\n\t\t\t<classpath refid=\"cp.javac6\" />\n\t\t\t<classpath refid=\"cp.ecj8\" />\n\t\t</ivy:compile>\n\t\t<ivy:compile destdir=\"build/lombok-utils6\" source=\"1.6\" target=\"1.6\" ecj=\"true\">\n\t\t\t<bootclasspath location=\"build/stubs\" />\n\t\t\t<bootclasspath path=\"${jdk6-rt.loc}\" />\n\t\t\t<src path=\"src/utils\" />\n\t\t\t<include name=\"lombok/javac/**\" />\n\t\t\t<classpath refid=\"cp.javac6\" />\n\t\t\t<classpath path=\"build/lombok-utils:build/lombok-utils6\" />\n\t\t</ivy:compile>\n\t\t\n\t\t<!--\n\t\t\tcompile lombok proper. We target java 1.6 to be as compatible with older releases as we can, using a JDK6 boot rt to ensure we don't\n\t\t\tuse API that didn't exist in those versions yet. -->\n\t\t<ivy:compile destdir=\"build/lombok-main\" source=\"1.6\" target=\"1.6\" ecj=\"true\" nowarn=\"true\">\n\t\t\t<bootclasspath location=\"build/stubs\" />\n\t\t\t<bootclasspath path=\"${jdk6-rt.loc}\" />\n\t\t\t<src path=\"src/launch\" />\n\t\t\t<src path=\"src/core\" />\n\t\t\t<src path=\"src/installer\" />\n\t\t\t<src path=\"src/eclipseAgent\" />\n\t\t\t<src path=\"src/delombok\" />\n\t\t\t<exclude name=\"**/*Transplants.java\" />\n\t\t\t<classpath refid=\"cp.build\" />\n\t\t\t<classpath refid=\"cp.eclipse-oxygen\" />\n\t\t\t<classpath refid=\"cp.javac6\" />\n\t\t\t<classpath path=\"build/lombok-utils:build/lombok-utils6:build/lombok-main:dist/spiProcessor.jar\" />\n\t\t\t<annotationProcessor jar=\"dist/spiProcessor.jar\" processor=\"lombok.spi.SpiProcessor\" />\n\t\t</ivy:compile>\n\t\t\n\t\t<!-- This is really part of the eclipse agent, but references lombok, so that had to be compiled first -->\n\t\t<ivy:compile destdir=\"build/lombok-main/Class50\" source=\"1.5\" target=\"1.6\" ecj=\"true\">\n\t\t\t<bootclasspath location=\"build/stubs\" />\n\t\t\t<bootclasspath path=\"${jdk6-rt.loc}\" />\n\t\t\t<src path=\"src/eclipseAgent\" />\n\t\t\t<include name=\"lombok/launch/PatchFixesHider.java\" />\n\t\t\t<classpath refid=\"cp.build\" />\n\t\t\t<classpath refid=\"cp.eclipse-oxygen\" />\n\t\t\t<classpath path=\"build/lombok-utils:build/lombok-utils6:build/lombok-main\" />\n\t\t</ivy:compile>\n\t\t\n\t\t<!--\n\t\t\ta couple of classes to cater to the bits of javac8+ that require j8 language constructs/API types; the main lombok\n\t\t\tcompile refers to these via reflection -->\n\t\t<ivy:compile destdir=\"build/lombok-main8\" source=\"1.8\" target=\"1.8\" ecj=\"true\" nowarn=\"true\" includesystembootclasspath=\"true\">\n\t\t\t<bootclasspath location=\"build/stubs\" />\n\t\t\t<src path=\"src/core8\" />\n\t\t\t<classpath refid=\"cp.javac8\" />\n\t\t\t<classpath path=\"build/lombok-main:build/lombok-main8:build\" />\n\t\t</ivy:compile>\n\t\t\n\t\t<!--\n\t\t\tWe also act as a jigsaw module so that module-based compile runs can use module-style dependency management. Obviously,\n\t\t\tthat bit we can only compile with jdk9+. -->\n\t\t<ivy:compile destdir=\"build/lombok-main\" release=\"9\">\n\t\t\t<src path=\"src/core9\" />\n\t\t\t<compilerarg value=\"-Xlint:none\" />\n\t\t\t<classpath refid=\"cp.build\" />\n\t\t</ivy:compile>\n\t\t\n\t\t<mkdir dir=\"build/lombok-main/META-INF/services\" />\n\t\t<echo file=\"build/lombok-main/META-INF/services/javax.annotation.processing.Processor\">lombok.launch.AnnotationProcessorHider$AnnotationProcessor\nlombok.launch.AnnotationProcessorHider$ClaimingProcessor</echo>\n\t\t<mkdir dir=\"build/lombok-main/META-INF/gradle\" />\n\t\t<echo file=\"build/lombok-main/META-INF/gradle/incremental.annotation.processors\">lombok.launch.AnnotationProcessorHider$AnnotationProcessor,isolating\nlombok.launch.AnnotationProcessorHider$ClaimingProcessor,isolating</echo>\n\t</target>\n\t\n\t<!-- compiles the bit of API from mapstruct that lombok compiles against. -->\n\t<target name=\"mapstruct.compile\" depends=\"-setup.build\">\n\t\t<mkdir dir=\"build/mapstruct\" />\n\t\t<ivy:compile destdir=\"build/mapstruct\" release=\"8\">\n\t\t\t<src path=\"src/j9stubs\" />\n\t\t</ivy:compile>\n\t</target>\n\t\n\t<target name=\"-deps.unpack\" depends=\"deps\">\n\t\t<ivy:cachedunjar dest=\"build/lombok-deps\" marker=\"build/unpackDeps.marker\">\n\t\t\t<path refid=\"cp.stripe\" />\n\t\t</ivy:cachedunjar>\n\t</target>\n\t\n\t<target name=\"dist\" depends=\"version, compile, latest-changes.build, mapstruct.compile, -deps.unpack\" description=\"Builds the 'everything' lombok.jar\">\n\t\t<mkdir dir=\"dist\" />\n\t\t<copy file=\"doc/changelog.markdown\" tofile=\"build/changelog.txt\" />\n\t\t<tstamp><format property=\"release.timestamp\" pattern=\"yyyy-MM-dd\" /></tstamp>\n\t\t<echo file=\"release-timestamp.txt\">${release.timestamp}</echo>\n\t\t\n\t\t<!-- the ant jar task doesn't quite let us do all we need to, so build with zip, then do the jar bits afterwards -->\n\t\t<zip destfile=\"dist/lombok-${lombok.version}.jar\">\n\t\t\t<fileset dir=\"build\" includes=\"changelog.txt, latestchanges.html\" />\n\t\t\t<fileset dir=\".\" includes=\"README.md, LICENSE, AUTHORS, release-timestamp.txt\" />\n\t\t\t\n\t\t\t<!--\n\t\t\t\tmost class files that need to be in the lombok distro are loaded in a separate class loader;\n\t\t\t\twe want any project that includes lombok.jar as a dependency to NOT get a bunch of otherwise public\n\t\t\t\tlombok classes served up in autocomplete dialogs, amongst other reasons.\n\t\t\t\t\n\t\t\t\tThus, we list here only the few class files that serve as 'entry points'. -->\n\t\t\t<patternset id=\"packing.entrypoints\">\n\t\t\t\t<include name=\"module-info.class\" />\n\t\t\t\t<include name=\"lombok/*.class\" />\n\t\t\t\t<include name=\"lombok/experimental/**\" />\n\t\t\t\t<include name=\"lombok/extern/**\" />\n\t\t\t\t<include name=\"lombok/launch/**\" />\n\t\t\t\t<include name=\"lombok/delombok/ant/Tasks*\" />\n\t\t\t\t<include name=\"lombok/javac/apt/Processor.class\" />\n\t\t\t\t<include name=\"lombok/META-INF/**\" />\n\t\t\t</patternset>\n\t\t\t\n\t\t\t<fileset dir=\"build/lombok-main\"><patternset refid=\"packing.entrypoints\" /></fileset>\n\t\t\t\n\t\t\t<!-- now include everything else but renamed for the shadowloader system, to make these classes invisible to other projects. -->\n\t\t\t<patternset id=\"packing.shadowed\">\n\t\t\t\t<exclude name=\"com/sun/tools/javac/**\" />\n\t\t\t\t<invert><patternset refid=\"packing.entrypoints\" /></invert>\n\t\t\t</patternset>\n\t\t\t<mappedresources>\n\t\t\t\t<multirootfileset basedirs=\"${packing.basedirs}\">\n\t\t\t\t\t<patternset refid=\"packing.shadowed\" />\n\t\t\t\t</multirootfileset>\n\t\t\t\t<firstmatchmapper>\n\t\t\t\t\t<globmapper from=\"*.class\" to=\"SCL.lombok/*.SCL.lombok\" />\n\t\t\t\t\t<identitymapper />\n\t\t\t\t</firstmatchmapper>\n\t\t\t</mappedresources>\n\t\t</zip>\n\t\t\n\t\t<!-- ... but manifest is not part of the ant zip task, so do that with the jar task -->\n\t\t<jar destfile=\"dist/lombok-${lombok.version}.jar\" update=\"true\">\n\t\t\t<manifest>\n\t\t\t\t<attribute name=\"Premain-Class\" value=\"lombok.launch.Agent\" />\n\t\t\t\t<attribute name=\"Agent-Class\" value=\"lombok.launch.Agent\" />\n\t\t\t\t<attribute name=\"Can-Redefine-Classes\" value=\"true\" />\n\t\t\t\t<attribute name=\"Main-Class\" value=\"lombok.launch.Main\" />\n\t\t\t\t<attribute name=\"Lombok-Version\" value=\"${lombok.version}\" />\n\t\t\t\t<attribute name=\"Automatic-Module-Name\" value=\"lombok\" />\n\t\t\t</manifest>\n\t\t</jar>\n\t\t<delete file=\"release-timestamp.txt\" />\n\t\t<copy overwrite=\"true\" tofile=\"dist/lombok.jar\" file=\"dist/lombok-${lombok.version}.jar\" />\n\t\t<property name=\"lombok.dist.built\" value=\"true\" />\n\t</target>\n\t\n\t<target name=\"compile.support\" depends=\"ipp.setup, deps, -setup.build\" description=\"Compiles code that is used solely by the build, such as website and IDE project creation\">\n\t\t<ivy:compile includeDestClasses=\"false\" includeantruntime=\"false\" destdir=\"build/support\" debug=\"on\" source=\"1.8\" target=\"1.8\">\n\t\t\t<compilerarg value=\"-proc:none\" />\n\t\t\t<compilerarg value=\"-Xlint:-options\" />\n\t\t\t<classpath refid=\"cp.buildtools\" />\n\t\t\t<src path=\"src/support\" />\n\t\t</ivy:compile>\n\t</target>\n</project>\n"
  },
  {
    "path": "buildScripts/create-eclipse-project.ant.xml",
    "content": "<!--\n Copyright (C) 2010-2022 The Project Lombok Authors.\n  \n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to deal\n  in the Software without restriction, including without limitation the rights\n  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  copies of the Software, and to permit persons to whom the Software is\n  furnished to do so, subject to the following conditions:\n  \n  The above copyright notice and this permission notice shall be included in\n  all copies or substantial portions of the Software.\n  \n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  THE SOFTWARE.\n-->\n<project name=\"lombok.create-eclipse-project\" default=\"\" xmlns:ivy=\"antlib:com.zwitserloot.ivyplusplus\" basedir=\"..\">\n\t<description>\nThis buildfile is part of projectlombok.org. It creates the infrastructure needed to develop lombok on eclipse.\n\t</description>\n\t\n\t<target name=\"eclipse\" depends=\"create.spiProcessor, eclipse.projectfiles, eclipse.testtarget.default\" description=\"Downloads dependencies, create eclipse project files, as well as debug/run test targets. Open this directory as project in eclipse (via import... existing projects)\" />\n\t\n\t<target name=\"eclipse.projectfiles\" depends=\"deps\">\n\t\t<ivy:eclipsegen source=\"1.8\" srcout=\"bin/main\">\n\t\t\t<srcdir dir=\"src/spiProcessor\" />\n\t\t\t<srcdir dir=\"src/core\" />\n\t\t\t<srcdir dir=\"src/core8\" />\n\t\t\t<srcdir dir=\"src/launch\" />\n\t\t\t<srcdir dir=\"src/utils\" />\n\t\t\t<srcdir dir=\"src/eclipseAgent\" />\n\t\t\t<srcdir dir=\"src/mavenEcjBootstrapAgent\" />\n\t\t\t<srcdir dir=\"src/installer\" />\n\t\t\t<srcdir dir=\"src/delombok\" />\n\t\t\t<srcdir dir=\"src/stubs\" srcout=\"bin/stubs\" />\n\t\t\t<srcdir dir=\"src/support\" />\n\t\t\t<srcdir dir=\"experimental/src\" />\n\t\t\t<srcdir dir=\"test/transform/src\" />\n\t\t\t<srcdir dir=\"test/core/src\" />\n\t\t\t<srcdir dir=\"test/bytecode/src\" />\n\t\t\t<srcdir dir=\"test/configuration/src\" />\n\t\t\t<srcdir dir=\"test/stubs\" />\n\t\t\t<conf name=\"build\" sources=\"sources\" />\n\t\t\t<conf name=\"javac6\" sources=\"sources\" />\n\t\t\t<conf name=\"eclipse-oxygen\" sources=\"sources\" />\n\t\t\t<conf name=\"test\" sources=\"sources\" />\n\t\t\t<conf name=\"buildtools\" sources=\"sources\" />\n\t\t\t<local org=\"org.projectlombok\" name=\"lombok.patcher\" dir=\"../lombok.patcher\" />\n\t\t\t<settings>\n\t\t\t\t<url url=\"https://projectlombok.org/downloads/lombok.eclipse.settings\" />\n\t\t\t</settings>\n\t\t\t<apt location=\"dist/spiProcessor.jar\" />\n\t\t</ivy:eclipsegen>\n\t</target>\n\t\n\t<target name=\"eclipse.testtarget.default\" depends=\"deps, compile.support\">\n\t\t<property name=\"cp.test\" refid=\"cp.test\" />\n\t\t<property name=\"cp.stripe\" refid=\"cp.stripe\" />\n\t\t\n\t\t<java classname=\"lombok.eclipseCreate.CreateEclipseDebugTarget\" failonerror=\"true\">\n\t\t\t<classpath>\n\t\t\t\t<path refid=\"cp.buildtools\" />\n\t\t\t\t<pathelement location=\"build/support\" />\n\t\t\t</classpath>\n\t\t\t<arg value=\"name=Lombok-test Base\" />\n\t\t\t<arg value=\"testType=lombok.TestBase\" />\n\t\t\t<arg value=\"jvmTarget=1.8\" />\n\t\t\t<arg value=\"bootpath=${jdk8-rt.loc}\" />\n\t\t\t<arg value=\"conf.test=${cp.test}\" />\n\t\t\t<arg value=\"conf.stripe=${cp.stripe}\" />\n\t\t\t<arg value=\"favorite\" />\n\t\t</java>\n\t\t\n\t\t<fetchdep.eclipse version=\"202006\" />\n\t\t<java classname=\"lombok.eclipseCreate.CreateEclipseDebugTarget\" failonerror=\"true\">\n\t\t\t<classpath>\n\t\t\t\t<path refid=\"cp.buildtools\" />\n\t\t\t\t<pathelement location=\"build/support\" />\n\t\t\t</classpath>\n\t\t\t<arg value=\"name=Lombok-test Eclipse-202006\" />\n\t\t\t<arg value=\"testType=lombok.TestEclipse\" />\n\t\t\t<arg value=\"shadowLoaderBased\" />\n\t\t\t<arg value=\"jvmTarget=1.8\" />\n\t\t\t<arg value=\"bootpath=${jdk8-rt.loc}\" />\n\t\t\t<arg value=\"conf.test=${cp.test}\" />\n\t\t\t<arg value=\"conf.stripe=${cp.stripe}\" />\n\t\t\t<arg value=\"conf.eclipse-202006=${cp.eclipse-202006}\" />\n\t\t\t<arg value=\"favorite\" />\n\t\t</java>\n\t\t\n\t\t<java classname=\"lombok.eclipseCreate.CreateEclipseDebugTarget\" failonerror=\"true\">\n\t\t\t<classpath>\n\t\t\t\t<path refid=\"cp.buildtools\" />\n\t\t\t\t<pathelement location=\"build/support\" />\n\t\t\t</classpath>\n\t\t\t<arg value=\"name=Lombok-test Javac 25\" />\n\t\t\t<arg value=\"testType=lombok.TestJavac\" />\n\t\t\t<arg value=\"jvmTarget=25\" />\n\t\t\t<arg value=\"conf.test=${cp.test}\" />\n\t\t\t<arg value=\"conf.stripe=${cp.stripe}\" />\n\t\t\t<arg value=\"favorite\" />\n\t\t</java>\n\t</target>\n\t\n\t<macrodef name=\"eclipse.testtarget.conf.jvmtarget\">\n\t\t<attribute name=\"question\" default=\"Which JDK do you want to target? Enter a version, such as '11'. Suggested (default): 8\" />\n\t\t<attribute name=\"validargs\" default=\"6,8,11,14\" />\n\t\t<sequential>\n\t\t\t<property name=\"cp.test\" refid=\"cp.test\" />\n\t\t\t<property name=\"cp.stripe\" refid=\"cp.stripe\" />\n\t\t\t\n\t\t\t<input message=\"@{question}\" validargs=\"@{validargs}\" defaultvalue=\"8\" addproperty=\"inputs.jvmtarget.raw\" />\n\t\t\t\n\t\t\t<condition property=\"inputs.jvmtarget\" value=\"1.6\"><equals arg1=\"${inputs.jvmtarget.raw}\" arg2=\"6\" /></condition>\n\t\t\t<condition property=\"inputs.jvmtarget\" value=\"1.8\"><equals arg1=\"${inputs.jvmtarget.raw}\" arg2=\"8\" /></condition>\n\t\t\t<property name=\"inputs.jvmtarget\" value=\"${inputs.jvmtarget.raw}\" />\n\t\t\t\n\t\t\t<condition property=\"inputs.bootpath\" value=\"${jdk6-rt.loc}\"><equals arg1=\"${inputs.jvmtarget.raw}\" arg2=\"6\" /></condition>\n\t\t\t<condition property=\"inputs.bootpath\" value=\"${jdk8-rt.loc}\"><equals arg1=\"${inputs.jvmtarget.raw}\" arg2=\"8\" /></condition>\n\t\t\t<property name=\"inputs.bootpath\" value=\"0\" />\n\t\t</sequential>\n\t</macrodef>\n\t\n\t<target name=\"eclipse.testtarget.javac\" depends=\"compile.support\" description=\"Makes an eclipse launch target for running the tests for javac\">\n\t\t<eclipse.testtarget.conf.jvmtarget question=\"Which javac do you want to target? Enter a version, such as '11'.\" validargs=\"8,11,13,14,15\" />\n\t\t\n\t\t<local name=\"inputs.confcp\" />\n\t\t<condition property=\"inputs.confcp\" value=\"NONE\">\n\t\t\t<not><equals arg1=\"8\" arg2=\"${inputs.jvmtarget.raw}\" /></not>\n\t\t</condition>\n\t\t<property name=\"inputs.confcp\" refid=\"cp.javac8\" />\n\t\t\n\t\t<java classname=\"lombok.eclipseCreate.CreateEclipseDebugTarget\" failonerror=\"true\">\n\t\t\t<classpath>\n\t\t\t\t<path refid=\"cp.buildtools\" />\n\t\t\t\t<pathelement location=\"build/support\" />\n\t\t\t</classpath>\n\t\t\t<arg value=\"name=Lombok-test Javac ${inputs.jvmtarget.raw}\" />\n\t\t\t<arg value=\"testType=lombok.TestJavac\" />\n\t\t\t<arg value=\"jvmTarget=${inputs.jvmtarget}\" />\n\t\t\t<arg value=\"bootpath=${inputs.bootpath}\" />\n\t\t\t<arg value=\"conf.test=${cp.test}\" />\n\t\t\t<arg value=\"conf.stripe=${cp.stripe}\" />\n\t\t\t<arg value=\"conf.${inputs.confname}=${inputs.confcp}\" />\n\t\t\t<arg value=\"favorite\" />\n\t\t</java>\n\t</target>\n\t\n\t<target name=\"eclipse.testtarget.eclipse\" depends=\"compile.support\" description=\"Makes an eclipse launch target for running the tests for eclipse support\">\n\t\t<eclipse.testtarget.conf.jvmtarget />\n\t\t\n\t\t<local name=\"inputs.eclipsetarget\" />\n\t\t<input message=\"Which eclipse do you want to target? Enter a version, such as 'oxygen'.\" validargs=\"oxygen\" addproperty=\"inputs.eclipsetarget\" />\n\t\t\n\t\t<local name=\"inputs.confname\" />\n\t\t<property name=\"inputs.confname\" value=\"eclipse-${inputs.eclipsetarget}\" />\n\t\t\n\t\t<local name=\"inputs.confcp\" />\n\t\t<property name=\"inputs.confcp\" refid=\"cp.eclipse-${inputs.eclipsetarget}\" />\n\t\t\n\t\t<fetchdep.eclipse version=\"${inputs.eclipsetarget}\" />\n\t\t\n\t\t<java classname=\"lombok.eclipseCreate.CreateEclipseDebugTarget\" failonerror=\"true\">\n\t\t\t<classpath>\n\t\t\t\t<path refid=\"cp.buildtools\" />\n\t\t\t\t<pathelement location=\"build/support\" />\n\t\t\t</classpath>\n\t\t\t<arg value=\"name=Lombok-test Eclipse-${inputs.eclipsetarget}\" />\n\t\t\t<arg value=\"testType=lombok.TestEclipse\" />\n\t\t\t<arg value=\"shadowLoaderBased\" />\n\t\t\t<arg value=\"jvmTarget=${inputs.jvmtarget}\" />\n\t\t\t<arg value=\"bootpath=${inputs.bootpath}\" />\n\t\t\t<arg value=\"conf.test=${cp.test}\" />\n\t\t\t<arg value=\"conf.stripe=${cp.stripe}\" />\n\t\t\t<arg value=\"conf.${inputs.confname}=${inputs.confcp}\" />\n\t\t\t<arg value=\"favorite\" />\n\t\t</java>\n\t</target>\n\t\n\t<target name=\"eclipse.testtarget.ecj\" depends=\"compile.support\" description=\"Makes an eclipse launch target for running the tests for ecj support\">\n\t\t<eclipse.testtarget.conf.jvmtarget />\n\t\t\n\t\t<local name=\"inputs.ecjtarget\" />\n\t\t<input message=\"Which ecj do you want to target? Enter a version, such as '8'.\" validargs=\"8,11,14\" addproperty=\"inputs.ecjtarget\" />\n\t\t\n\t\t<local name=\"inputs.confname\" />\n\t\t<property name=\"inputs.confname\" value=\"ecj${inputs.ecjtarget}\" />\n\t\t\n\t\t<local name=\"inputs.confcp\" />\n\t\t<property name=\"inputs.confcp\" refid=\"cp.ecj${inputs.ecjtarget}\" />\n\t\t\n\t\t<local name=\"inputs.bootpath\" />\n\t\t<condition property=\"inputs.bootpath\" value=\"${jdk6-rt.loc}\"><equals arg1=\"${inputs.jvmtarget.raw}\" arg2=\"6\" /></condition>\n\t\t<condition property=\"inputs.bootpath\" value=\"${jdk8-rt.loc}\"><equals arg1=\"${inputs.jvmtarget.raw}\" arg2=\"8\" /></condition>\n\t\t<property name=\"inputs.bootpath\" value=\"0\" />\n\t\t\n\t\t<fetchdep.ecj version=\"${inputs.ecjtarget}\" />\n\t\t\n\t\t<java classname=\"lombok.eclipseCreate.CreateEclipseDebugTarget\" failonerror=\"true\">\n\t\t\t<classpath>\n\t\t\t\t<path refid=\"cp.buildtools\" />\n\t\t\t\t<pathelement location=\"build/support\" />\n\t\t\t</classpath>\n\t\t\t<arg value=\"name=Lombok-test ECJ${inputs.ecjtarget}\" />\n\t\t\t<arg value=\"testType=lombok.TestEclipse\" />\n\t\t\t<arg value=\"shadowLoaderBased\" />\n\t\t\t<arg value=\"jvmTarget=${inputs.jvmtarget}\" />\n\t\t\t<arg value=\"bootpath=${inputs.bootpath}\" />\n\t\t\t<arg value=\"conf.test=${cp.test}\" />\n\t\t\t<arg value=\"conf.stripe=${cp.stripe}\" />\n\t\t\t<arg value=\"conf.${inputs.confname}=${inputs.confcp}\" />\n\t\t\t<arg value=\"favorite\" />\n\t\t</java>\n\t</target>\n</project>\n"
  },
  {
    "path": "buildScripts/create-intellij-project.ant.xml",
    "content": "<!--\n Copyright (C) 2010-2022 The Project Lombok Authors.\n  \n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to deal\n  in the Software without restriction, including without limitation the rights\n  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  copies of the Software, and to permit persons to whom the Software is\n  furnished to do so, subject to the following conditions:\n  \n  The above copyright notice and this permission notice shall be included in\n  all copies or substantial portions of the Software.\n  \n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  THE SOFTWARE.\n-->\n<project name=\"lombok.create-intellij-project\" default=\"\" xmlns:ivy=\"antlib:com.zwitserloot.ivyplusplus\" basedir=\"..\">\n\t<description>\nThis buildfile is part of projectlombok.org. It creates the infrastructure needed to develop lombok on intellij.\n\t</description>\n\t\n\t<target name=\"intellij\" depends=\"create.spiProcessor, deps\" description=\"Creates intellij project files and downloads all dependencies. Open this directory as a project in IntelliJ after running this target\">\n\t\t<echo> ** WARNING ** The core lombok contributors all use eclipse to develop lombok. This script will attempt to set up your lombok directory up as intellij project; whether can be used in a modern intellij is currently unknown. Please do continue, but be aware that trying to work on lombok from intellij may run into problems. If you want to adopt 'work on lombok via intellij' as a task, we're open to it!</echo>\n\t\t<echo>NOT IMPLEMENTED: The project should optimally be configured as a java1.6, using the rt.jar in lib/openjdk6_rt.jar as boot basis, to ensure lombok remains 1.6 compatible.</echo>\n\t\t<echo>NOT IMPLEMENTED: Ability to run tests targeted at a specific jvm/javac/ecj/eclipse release; the relevant entrypoint test classes are lombok.RunBaseAndJavacTests and lombok.RunEclipseTests - you can run the eclipse tests even on intellij; an eclipse installation is not required.</echo>\n\t\t<echo>NOT SURE: The annotation processor system that automatically generates the services files has been changed. This AP is now internal to the project, \n\t\tthe source files for it are in `src/spiProcessor`, and a build of this is now in `dist/spiProcessor.jar` - you may have to manually add it, though I'm not\n\t\tsure if you actually need it - the files generated by this processor are relevant only when running lombok itself, and if intellij accomplishes this by\n\t\tinvoking ant, all will be well.</echo>\n\t\t<input>Press return to continue</input>\n\t\t<ivy:intellijgen>\n\t\t\t<conf name=\"build\" sources=\"sources\" />\n\t\t\t<conf name=\"javac6\" sources=\"sources\" />\n\t\t\t<conf name=\"test\" sources=\"sources\" />\n\t\t\t<conf name=\"buildtools\" sources=\"sources\" />\n\t\t\t<module name=\"lombok\" depends=\"build, test\">\n\t\t\t\t<srcdir dir=\"src/spiProcessor\" />\n\t\t\t\t<srcdir dir=\"src/core\" />\n\t\t\t\t<srcdir dir=\"src/core8\" />\n\t\t\t\t<srcdir dir=\"src/launch\" />\n\t\t\t\t<srcdir dir=\"src/utils\" />\n\t\t\t\t<srcdir dir=\"src/eclipseAgent\" />\n\t\t\t\t<srcdir dir=\"src/mavenEcjBootstrapAgent\" />\n\t\t\t\t<srcdir dir=\"src/installer\" />\n\t\t\t\t<srcdir dir=\"src/delombok\" />\n\t\t\t\t<srcdir dir=\"src/stubs\" />\n\t\t\t\t<srcdir dir=\"src/support\" />\n\t\t\t\t<srcdir dir=\"experimental/src\" />\n\t\t\t\t<srcdir dir=\"test/transform/src\" test=\"true\" />\n\t\t\t\t<srcdir dir=\"test/core/src\" test=\"true\" />\n\t\t\t\t<srcdir dir=\"test/bytecode/src\" test=\"true\" />\n\t\t\t\t<srcdir dir=\"test/configuration/src\" test=\"true\" />\n\t\t\t\t<srcdir dir=\"test/stubs\" test=\"true\" />\n\t\t\t</module>\n\t\t\t<settings>\n\t\t\t\t<url url=\"https://projectlombok.org/downloads/lombok.intellij.settings\" />\n\t\t\t</settings>\n\t\t\t<apt enabled=\"true\" />\n\t\t</ivy:intellijgen>\n\t</target>\n</project>\n"
  },
  {
    "path": "buildScripts/eclipse-p2.ant.xml",
    "content": "<!--\n  Copyright (C) 2020-2023 The Project Lombok Authors.\n  \n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to deal\n  in the Software without restriction, including without limitation the rights\n  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  copies of the Software, and to permit persons to whom the Software is\n  furnished to do so, subject to the following conditions:\n  \n  The above copyright notice and this permission notice shall be included in\n  all copies or substantial portions of the Software.\n  \n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  THE SOFTWARE.\n-->\n<project name=\"lombok.eclipsep2\" basedir=\"..\" xmlns:ivy=\"antlib:com.zwitserloot.ivyplusplus\">\n\t<description>\nThis buildfile is part of projectlombok.org. It is responsible for building the eclipse P2 update site.\n\t</description>\n\t\n\t<target name=\"eclipsep2.clean\">\n\t\t<delete dir=\"build/p2\" quiet=\"true\" />\n\t</target>\n\t\n\t<target name=\"-eclipsep2.get-epoch\">\n\t\t<mkdir dir=\"build/p2-support\" />\n\t\t<echo file=\"build/p2-support/Epoch.java\">public class Epoch {public static void main(String[] args) {System.out.print(System.currentTimeMillis());}}</echo>\n\t\t<javac srcdir=\"build/p2-support\" release=\"8\" includeAntRuntime=\"false\" destdir=\"build/p2-support\" />\n\t\t<java classname=\"Epoch\" classpath=\"build/p2-support\" fork=\"false\" outputproperty=\"dt.epochMillis\" />\n\t</target>\n\t\n\t<target name=\"eclipsep2.build\" depends=\"version, dist, -eclipsep2.get-epoch\">\n\t\t<tstamp><format property=\"dt.year\" pattern=\"yyyy\" /></tstamp>\n\t\t<mkdir dir=\"build/p2\" />\n\t\t<mkdir dir=\"build/p2/features\" />\n\t\t<mkdir dir=\"build/p2/plugins\" />\n\t\t\n\t\t<jar destfile=\"build/p2/plugins/org.projectlombok.agent_${lombok.version}.jar\">\n\t\t\t<manifest>\n\t\t\t\t<attribute name=\"Manifest-Version\" value=\"1.0\" />\n\t\t\t\t<attribute name=\"Bundle-ManifestVersion\" value=\"2\" />\n\t\t\t\t<attribute name=\"Bundle-Name\" value=\"Lombok Agent\" />\n\t\t\t\t<attribute name=\"Bundle-SymbolicName\" value=\"org.projectlombok.agent\" />\n\t\t\t\t<attribute name=\"Bundle-Version\" value=\"${lombok.version}\" />\n\t\t\t\t<attribute name=\"Automatic-Module-Name\" value=\"org.projectlombok.agent\" />\n\t\t\t</manifest>\n\t\t\t<zipfileset dir=\"buildScripts/p2\" includes=\"p2.inf\" prefix=\"META-INF/\" />\n\t\t\t<zipfileset dir=\"dist\" includes=\"lombok-${lombok.version}.jar\" fullpath=\"lombok.jar\" />\n\t\t</jar>\n\t\t<loadfile property=\"store.pass\" srcFile=\"buildScripts/lombok.jks.password\" />\n\t\t<signjar\n\t\t\tjar=\"build/p2/plugins/org.projectlombok.agent_${lombok.version}.jar\"\n\t\t\talias=\"lombok\"\n\t\t\tstorepass=\"${store.pass}\"\n\t\t\tkeystore=\"buildScripts/lombok.jks\"\n\t\t/>\n\t\t\n\t\t<length property=\"agent.zip.size\" file=\"build/p2/plugins/org.projectlombok.agent_${lombok.version}.jar\" />\n\t\t\n\t\t<copy todir=\"build/p2\" overwrite=\"true\">\n\t\t\t<fileset dir=\"buildScripts/p2\" includes=\"feature.xml\" />\n\t\t\t<filterset>\n\t\t\t\t<filter token=\"YEAR\" value=\"${dt.year}\" />\n\t\t\t\t<filter token=\"EPOCH_MILLIS\" value=\"${dt.epochMillis}\" />\n\t\t\t\t<filter token=\"VERSION\" value=\"${lombok.version}\" />\n\t\t\t</filterset>\n\t\t</copy>\n\t\t<zip destfile=\"build/p2/features/org.projectlombok.feature_${lombok.version}.jar\" basedir=\"build/p2\" includes=\"feature.xml\" />\n\t\t<signjar\n\t\t\tjar=\"build/p2/features/org.projectlombok.feature_${lombok.version}.jar\"\n\t\t\talias=\"lombok\"\n\t\t\tstorepass=\"${store.pass}\"\n\t\t\tkeystore=\"buildScripts/lombok.jks\"\n\t\t/>\n\t\t<delete file=\"build/p2/feature.xml\" />\n\t\t<length property=\"feature.zip.size\" file=\"build/p2/features/org.projectlombok.feature_${lombok.version}.jar\" />\n\t\t\n\t\t<copy todir=\"build/p2\" overwrite=\"true\">\n\t\t\t<fileset dir=\"buildScripts/p2\" includes=\"artifacts.xml,content.xml\" />\n\t\t\t<filterset>\n\t\t\t\t<filter token=\"YEAR\" value=\"${dt.year}\" />\n\t\t\t\t<filter token=\"EPOCH_MILLIS\" value=\"${dt.epochMillis}\" />\n\t\t\t\t<filter token=\"VERSION\" value=\"${lombok.version}\" />\n\t\t\t\t<filter token=\"FEATURE_ZIP_SIZE\" value=\"${feature.zip.size}\" />\n\t\t\t\t<filter token=\"AGENT_ZIP_SIZE\" value=\"${agent.zip.size}\" />\n\t\t\t</filterset>\n\t\t</copy>\n\t\t<zip destfile=\"build/p2/artifacts.jar\" basedir=\"build/p2\" includes=\"artifacts.xml\" />\n\t\t<signjar\n\t\t\tjar=\"build/p2/artifacts.jar\"\n\t\t\talias=\"lombok\"\n\t\t\tstorepass=\"${store.pass}\"\n\t\t\tkeystore=\"buildScripts/lombok.jks\"\n\t\t/>\n\t\t<zip destfile=\"build/p2/content.jar\" basedir=\"build/p2\" includes=\"content.xml\" />\n\t\t<signjar\n\t\t\tjar=\"build/p2/content.jar\"\n\t\t\talias=\"lombok\"\n\t\t\tstorepass=\"${store.pass}\"\n\t\t\tkeystore=\"buildScripts/lombok.jks\"\n\t\t/>\n\t\t<delete file=\"build/p2/artifacts.xml\" />\n\t\t<delete file=\"build/p2/content.xml\" />\n\t</target>\n\t\n\t<target name=\"eclipsep2.publish\" depends=\"eclipsep2.build, compile.support\">\n\t\t<java fork=\"true\" classname=\"lombok.publish.PublishToBucket\" failonerror=\"true\">\n\t\t\t<classpath>\n\t\t\t\t<path refid=\"cp.buildtools\" />\n\t\t\t\t<pathelement location=\"build/support\" />\n\t\t\t</classpath>\n\t\t\t<arg value=\"${gpg.keyrings}/s3_creds.txt\" />\n\t\t\t<arg value=\"build/p2\" />\n\t\t\t<arg value=\"p2\" />\n\t\t\t<arg value=\"true\" />\n\t\t</java>\n\t</target>\n</project>\n"
  },
  {
    "path": "buildScripts/info.ant.xml",
    "content": "<!--\n Copyright (C) 2020 The Project Lombok Authors.\n  \n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to deal\n  in the Software without restriction, including without limitation the rights\n  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  copies of the Software, and to permit persons to whom the Software is\n  furnished to do so, subject to the following conditions:\n  \n  The above copyright notice and this permission notice shall be included in\n  all copies or substantial portions of the Software.\n  \n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  THE SOFTWARE.\n-->\n<project name=\"lombok.info\" basedir=\"..\" default=\"quickstart\">\n\t<target name=\"quickstart\">\n\t\t<echo>\nDear contributor,\n\nFor full instructions and information on what this project contains, run:\n\n  &gt; ant help\n\nIf you want to get started quickly:\n\n1. Run `ant eclipse`.\n2. Start up eclipse (https://www.eclipse.org/).\n3. In the menu: File &gt; Import... &gt; Existing Project Into Workspace\n4. Browse to this directory and import it:\n (${basedir})\n5. In eclipse: Run &gt; Debug configurations... &gt;\n  then pick one of the configs named `Lombok test`.\n6. Run `ant dist`.\n\nHave fun!</echo>\n\t</target>\n\t\n\t<target name=\"help\" description=\"Start here!\">\n\t\t<echo>\nJust want to get started quickly? Run:\n\n  &gt; ant quickstart\n\n---\n\nLombok is specced to run on a wide array of underlying platforms:\n\n* Any JVM from 1.6 up to the upcoming next official release.\n* Javac, from 1.6 up to the upcoming next official release.\n* ECJ, from ecj 4.4.2 (2015/java8) up to the upcoming next official release.\n* Eclipse, from eclipse-oxygen up to the upcoming next official release.\n\nThe build is a little more complicated to cater to these requirements.\n\nThis build script can perform the following tasks:\n* IDE\n  Create project files so that you can work on lombok in eclipse or intellij.\n  Includes creating debuggable test targets.\n* compile\n  Turn java files into class files.\n* test\n  Run the tests against the various combinations of VM, Javac, eclipse and ecj\n  we support, including finding suitable VMs to run them on.\n* packaging\n  Create the lombok 'everything' jar, that can serve as eclipse agent, as\n  installer, as library you include on the classpath with javac, and which\n  does not inject its transitive dependencies into your project namespace.\n* website\n  Builds the website and documentation (projectlombok.org) from templates,\n  including creating the version history page and changelog, and deploying\n  builds to the website (and the maven repo hosted there).\n* p2\n  We host an experimental eclipse marketplace installer.\n\nFor more info on any of these sections, run for example `ant help.IDE`.\n\nIf you're new to lombok, you should start with `ant help.IDE`,\nthen move on to `ant help.test`.</echo>\n\t</target>\n\t\n\t<target name=\"help.IDE\">\n\t\t<echo>\nWe strongly suggest you use eclipse to develop lombok.\nExperimentally, developing with intellij is possible as well.\n\nIDE support consists of two features:\n1. Generate project files so that this directory can be imported as project.\n2. Generate debug/run launch files so you can debug lombok in your IDE.\n\n  &gt; ant eclipse\n  &gt; ant intellij\n\nThese commands generate project files and download all dependencies required\nto develop Project Lombok in the named IDE. Run these commands first, then\nimport this directory as project in your IDE.\n\n  &gt; ant eclipse.testtarget.eclipse\n  &gt; ant eclipse.testtarget.ecj\n  &gt; ant eclipse.testtarget.javac\n\nThese 3 commands generate launch targets (these appear in your debug menu),\nfor testing the stated platform (eclipse, ecj, or javac) and will ask you\nwhich version of the VM and the relevant platform are to be targeted by\nthese tests. Note that `ant eclipse` already generates  default test targets,\nyou don't need these unless you're specifically testing lombok behaviour on\nsome specific version of the JVM or a target platform.\n\nNB: No debug/launch targets are currently generated for intellij.\nGot the know how? We'd love a contribution!</echo>\n\t</target>\n\t\n\t<target name=\"help.compile\">\n\t\t<echo>\nThe build compilation system is self contained and generally invoked by the\nother jobs this build script can do; you rarely need to mess with it.\n\nThe compilation is quite complicated; parts of lombok are injected into\nfor example eclipse at runtime via an agent mechanism. To produce the bytecode\nthat is to be injected, we need to compile against various different versions\nof the core java libraries as well as eclipse/ecj. To make this process smooth\nand fast, lombok has a 'stubs' concept: We have signature-only versions of\nvarious classes of other libraries. We compile these first, then we compile\nthe rest of lombok with these stub classes on the classpath, and then we\npackage lombok without the stubs.\n\nVarious bits of lombok are targeted at different versions, and therefore,\ndifferent parts of lombok are compiled with different `-release` targets.\n\n  &gt; ant compile\n\nCompiles lombok itself\n\n  &gt; ant compile.support\n\nCompiles code that isn't part of the lombok distribution, but which is used\nfor other jobs; For example, eclipse debug target generation, and fetching\nthe current lombok stable release version number on offer at\nthe projectlombok.org website involve java code.</echo>\n\t</target>\n\t\n\t<target name=\"help.packaging\">\n\t\t<echo>\nLombok is shipped as an 'everything' jar; it is a stand-alone java app,\nwith both a GUI and a command line interface, it's an agent, it's an\nannotation processor, and it's a module.\n\nIn addition, lombok is a compile-time only dependency, designed to be included\nin every project a lombok user has. Therefore, we don't want any of the\nlombok classes that you aren't meant to use directly to be visible,\nshowing up in auto-complete dialogs. Starting with JDK9, the module system's\n'export' feature does a lot of this, but we also want to avoid contaminating\nthings on JDK8 and below. As a consequence, lombok uses a classloader system,\nand most classes are included in the jar with a different name, not as\n.class files, thus avoiding contaminating the namespace.\n\nThe packaging targets take care of setting up the file rename as well as\nregistering all the various manifest and file entries needed so that lombok\ncan be an everything jar.\n\n  &gt; ant dist\n\npackages the lombok build into a single jar.\n\n  &gt; ant maven\n  &gt; ant maven.publish\n\n'maven' packages the lombok build ready to upload to mavencentral (sonatype).\n'maven.publish' also sends this via the lombok server to oss.sonatype.org.\n\n</echo>\n\t</target>\n\t\n\t<target name=\"help.test\">\n\t\t<echo>\nLombok tests need to be run against a targeted platform.\n\n  &gt; ant test.javacCurrent\n  &gt; ant test.javac6\n  &gt; ant test.javac8\n  &gt; ant test.javac11\n  &gt; ant test.javac14\n\nThis runs the test suite that tests lombok on javac, as well as testing\nthe delombok feature.\n\n`javacCurrent` runs the tests on the JVM running this build: ${ant.java.version}\n\n`javac6` and `javac8` are run on the JVM running this build, by downloading\nthe complete java runtime classes from those versions, including javac, and\nusing module limits to exclude your VM's own javac.\n\nYou _DO NOT_ need an installed JDK1.6 or JDK1.8 to run these.\n\n`javac11`, `javac14`, etc require that you have a JDK of that version\ninstalled on your system. The build will automatically find such a JDK in most\ncases; alternatively, the system will ask you to provide a path to them.\nThe tests are then run by invoking that VM to run them.\n\nYou can force a particular VM by making a file named `jvm.locations`, and putting\nin it, for example:\n\n   j11 = /Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home\n\nOr just enter the path your VM installation when prompted, and the build will\nautomatically create this file for you to remember your choice.\n\n  &gt; ant test.eclipse-oxygen\n  &gt; ant test.eclipse-202006\n\nThis runs the test suite that tests lombok on eclipse/ecj.\n\nThe tests are run on your current VM (${ant.java.version}), fetching\nthe relevant bits of the chosen eclipse release to test against.\n\n  &gt; ant test\n\nRuns the 'default' targets for all supported platforms. This should catch\nmost problems.\n\n  &gt; ant test.broad\n\nRuns tests against a selection of versions designed to catch virtually all\nproblems. Doesn't quite test _every_ supported combination.\n\n  &gt; ant test.compile\n\nCompiles the test suite; generally invoked by the other test targets;\nyou don't need to explicitly invoke this yourself.</echo>\n\t</target>\n\t\n\t<target name=\"help.website\">\n\t\t<echo>\nThis build also builds the website, which is a static site generated via\nfreemarker templates. Parts of the site build also involve other custom\nsoftware, such as building the 'all available versions' page by checking\nthe available versions on the live website, compiling markdown\n(as used by the changelog) into html, and generated color-coded syntax\nin HTML for the example snippets.\n\n  &gt; ant changelog.build\n\nTurns the changelog at doc/changelog.markdown into\nbuild/website/changelog.html.\n\n  &gt; ant website.build\n  &gt; ant website.release-build\n  &gt; ant website.publish\n  &gt; ant website.release-publish\n\n'build' Builds the website into build/website, _without_ reflecting a new release; this is\n  just in case you e.g. edited some documentation.\n'publish' deploys this to the server.\n'release-build' builds the website _with_ reflecting a new release, updating all-versions,\n  the download page, updating the javadoc, etc.\n'release-ppublic' deploys this to the server.\n\n  &gt; ant website.open\n  \n  First builds the website, then hosts it locally and opens it in your browser so\n  you can see the website in its full, template-applied form.\n\n  &gt; ant latest-changes.build\n\nMakes a changelog variant that lists only the newest changes; it is included\nin the distribution for convenience.\n\n  &gt; ant javadoc.build\n\n'build' Builds the javadoc into build/api.\n\n  &gt; ant edge.publish\n\n'pack' creates a bzip with all relevant files needed to deploy a new edge\nrelease to the server: A fresh build of the lombok everything jar, plus the\nmaven repo update so that the edge release can be fetched as a maven dep,\nand an update to the download-edge page listing the latest changes included\nin the edge release.\n\n'publish' sends the edge release to projectlombok.org directly.</echo>\n\t</target>\n\t\n\t<target name=\"help.p2\">\n\t\t<echo>\nThis is still an experimental feature.\n\nWe ship lombok as an eclipse plugin. The plugin isn't much of a plugin; the\ninstall script of the plugin fulfills the same role as lombok's installer\n(which is: add a line configuring lombok as an agent during eclipse bootup),\nand the uninstall script removes it.\n\n  &gt; ant eclipsep2.build\n  &gt; ant eclipsep2.pack\n  &gt; ant eclipsep2.publish\n\n'build' generates the various files required to appear as an eclipse plugin,\nand makes the jar(s).\n'pack' makes a bzip ready to ship to a server.\n'publish' ships it and runs a script server-side to put these files in the\nright place; requires SSH access to the server.</echo>\n\t</target>\n</project>\n"
  },
  {
    "path": "buildScripts/ivy-repo/net.java.openjdk.custom-javac11-11_2018-09-25.xml",
    "content": "<ivy-module version=\"2.0\">\n\t<info organisation=\"net.java.openjdk.custom\" module=\"javac11\" revision=\"11_2018-09-25\" publication=\"20200606144743\">\n\t\t<license name=\"GNU General Public License v2 with Classpath Exception\" url=\"https://openjdk.java.net/legal/gplv2+ce.html\" />\n\t\t<description homepage=\"https://openjdk.java.net\" />\n\t</info>\n\t<configurations>\n\t\t<conf name=\"runtime\" />\n\t</configurations>\n\t<publications>\n\t\t<artifact name=\"javac11-java.compiler\" conf=\"runtime\" url=\"https://projectlombok.org/ivyrepo/langtools/javac11_2018-09-25-java.compiler.jar\" />\n\t\t<artifact name=\"javac11-jdk.compiler\" conf=\"runtime\" url=\"https://projectlombok.org/ivyrepo/langtools/javac11_2018-09-25-jdk.compiler.jar\" />\n\t</publications>\n</ivy-module>"
  },
  {
    "path": "buildScripts/ivy-repo/net.java.openjdk.custom-javac13-13_2019-09-17.xml",
    "content": "<ivy-module version=\"2.0\">\n\t<info organisation=\"net.java.openjdk.custom\" module=\"javac13\" revision=\"13_2019-09-17\" publication=\"20200508032346\">\n\t\t<license name=\"GNU General Public License v2 with Classpath Exception\" url=\"https://openjdk.java.net/legal/gplv2+ce.html\" />\n\t\t<description homepage=\"https://openjdk.java.net\" />\n\t</info>\n\t<configurations>\n\t\t<conf name=\"runtime\" />\n\t</configurations>\n\t<publications>\n\t\t<artifact conf=\"runtime\" url=\"https://projectlombok.org/ivyrepo/langtools/javac13_2019-09-17.jar\" />\n\t</publications>\n</ivy-module>"
  },
  {
    "path": "buildScripts/ivy-repo/net.java.openjdk.custom-javac14-14-ea_2020-03-17.xml",
    "content": "<ivy-module version=\"2.0\">\n\t<info organisation=\"net.java.openjdk.custom\" module=\"javac14\" revision=\"14-ea_2020-03-17\" publication=\"20200508035315\">\n\t\t<license name=\"GNU General Public License v2 with Classpath Exception\" url=\"https://openjdk.java.net/legal/gplv2+ce.html\" />\n\t\t<description homepage=\"https://openjdk.java.net\" />\n\t</info>\n\t<configurations>\n\t\t<conf name=\"runtime\" />\n\t</configurations>\n\t<publications>\n\t\t<artifact conf=\"runtime\" url=\"https://projectlombok.org/ivyrepo/langtools/javac14-ea_2020-03-17.jar\" />\n\t</publications>\n</ivy-module>\n"
  },
  {
    "path": "buildScripts/ivy-repo/net.java.openjdk.custom-javac6-1.6.0.18.xml",
    "content": "<ivy-module version=\"2.0\">\n\t<info organisation=\"net.java.openjdk.custom\" module=\"javac6\" revision=\"1.6.0.18\" publication=\"20100225011200\">\n\t\t<license name=\"GNU General Public License v2 with Classpath Exception\" url=\"http://openjdk.java.net/legal/gplv2+ce.html\" />\n\t\t<description homepage=\"http://openjdk.java.net/\" />\n\t</info>\n\t<configurations>\n\t\t<conf name=\"runtime\" />\n\t\t<conf name=\"sources\" />\n\t</configurations>\n\t<publications>\n\t\t<artifact conf=\"runtime\" url=\"https://projectlombok.org/ivyrepo/langtools/javac-1.6.0.18.jar\" />\n\t\t<artifact type=\"zip\" conf=\"sources\" url=\"https://projectlombok.org/ivyrepo/langtools/javac-1.6.0.18-sources.zip\" />\n\t</publications>\n</ivy-module>\n"
  },
  {
    "path": "buildScripts/ivy-repo/net.java.openjdk.custom-javac7-1.7.0.xml",
    "content": "<ivy-module version=\"2.0\">\n\t<info organisation=\"net.java.openjdk.custom\" module=\"javac7\" revision=\"1.7.0\" publication=\"20110811230000\">\n\t\t<license name=\"GNU General Public License v2 with Classpath Exception\" url=\"http://openjdk.java.net/legal/gplv2+ce.html\" />\n\t\t<description homepage=\"http://openjdk.java.net/\" />\n\t</info>\n\t<configurations>\n\t\t<conf name=\"runtime\" />\n\t\t<conf name=\"sources\" />\n\t</configurations>\n\t<publications>\n\t\t<artifact conf=\"runtime\" url=\"https://projectlombok.org/ivyrepo/langtools/javac-1.7.0.jar\" />\n\t\t<artifact type=\"zip\" conf=\"sources\" url=\"https://projectlombok.org/ivyrepo/langtools/javac-1.7.0-sources.zip\" />\n\t</publications>\n</ivy-module>\n"
  },
  {
    "path": "buildScripts/ivy-repo/net.java.openjdk.custom-javac8-1.8.0.xml",
    "content": "<ivy-module version=\"2.0\">\n\t<info organisation=\"net.java.openjdk.custom\" module=\"javac8\" revision=\"1.8.0\" publication=\"20140613120000\">\n\t\t<license name=\"GNU General Public License v2 with Classpath Exception\" url=\"https://openjdk.java.net/legal/gplv2+ce.html\" />\n\t\t<description homepage=\"https://openjdk.java.net\" />\n\t</info>\n\t<configurations>\n\t\t<conf name=\"runtime\" />\n\t</configurations>\n\t<publications>\n\t\t<artifact conf=\"runtime\" url=\"https://projectlombok.org/ivyrepo/langtools/jdk8-javac.jar\" />\n\t</publications>\n</ivy-module>\n"
  },
  {
    "path": "buildScripts/ivy-repo/netbeans.org-boot-6.8beta.xml",
    "content": "<ivy-module version=\"2.0\">\n\t<info organisation=\"netbeans.org\" module=\"boot\" revision=\"6.8beta\" publication=\"20100419062500\">\n\t\t<license name=\"CDDL 1.0 / GPL 2.0\" url=\"http://netbeans.org/cddl-gplv2.html\" />\n\t\t<description homepage=\"http://www.netbeans.org/\" />\n\t</info>\n\t<configurations>\n\t\t<conf name=\"build\" />\n\t</configurations>\n\t<publications>\n\t\t<artifact conf=\"build\" url=\"https://projectlombok.org/ivyrepo/netbeans/boot_6.8beta.jar\" />\n\t</publications>\n</ivy-module>\n"
  },
  {
    "path": "buildScripts/ivy-repo/netbeans.org-modules.java.source-6.8beta.xml",
    "content": "<ivy-module version=\"2.0\">\n\t<info organisation=\"netbeans.org\" module=\"modules.java.source\" revision=\"6.8beta\" publication=\"20100419062500\">\n\t\t<license name=\"CDDL 1.0 / GPL 2.0\" url=\"http://netbeans.org/cddl-gplv2.html\" />\n\t\t<description homepage=\"http://www.netbeans.org/\" />\n\t</info>\n\t<configurations>\n\t\t<conf name=\"build\" />\n\t</configurations>\n\t<publications>\n\t\t<artifact conf=\"build\" url=\"https://projectlombok.org/ivyrepo/netbeans/org-netbeans-modules-java-source_6.8beta.jar\" />\n\t</publications>\n</ivy-module>\n"
  },
  {
    "path": "buildScripts/ivy-repo/netbeans.org-openide.modules-6.8beta.xml",
    "content": "<ivy-module version=\"2.0\">\n\t<info organisation=\"netbeans.org\" module=\"openide.modules\" revision=\"6.8beta\" publication=\"20100419062500\">\n\t\t<license name=\"CDDL 1.0 / GPL 2.0\" url=\"http://netbeans.org/cddl-gplv2.html\" />\n\t\t<description homepage=\"http://www.netbeans.org/\" />\n\t</info>\n\t<configurations>\n\t\t<conf name=\"build\" />\n\t</configurations>\n\t<publications>\n\t\t<artifact conf=\"build\" url=\"https://projectlombok.org/ivyrepo/netbeans/org-openide-modules_6.8beta.jar\" />\n\t</publications>\n</ivy-module>\n"
  },
  {
    "path": "buildScripts/ivy-repo/netbeans.org-openide.util-6.8beta.xml",
    "content": "<ivy-module version=\"2.0\">\n\t<info organisation=\"netbeans.org\" module=\"openide.util\" revision=\"6.8beta\" publication=\"20100419062500\">\n\t\t<license name=\"CDDL 1.0 / GPL 2.0\" url=\"http://netbeans.org/cddl-gplv2.html\" />\n\t\t<description homepage=\"http://www.netbeans.org/\" />\n\t</info>\n\t<configurations>\n\t\t<conf name=\"build\" />\n\t</configurations>\n\t<publications>\n\t\t<artifact conf=\"build\" url=\"https://projectlombok.org/ivyrepo/netbeans/org-openide-util_6.8beta.jar\" />\n\t</publications>\n</ivy-module>\n"
  },
  {
    "path": "buildScripts/ivy-repo/org.projectlombok-lombok.patcher-0.50.xml",
    "content": "<ivy-module version=\"2.0\">\n\t<info organisation=\"org.projectlombok\" module=\"lombok.patcher\" revision=\"0.50\" publication=\"20240112010000\">\n\t\t<license name=\"MIT License\" url=\"https://www.opensource.org/licenses/mit-license.php\" />\n\t\t<ivyauthor name=\"rzwitserloot\" url=\"https://github.com/rzwitserloot\" />\n\t\t<ivyauthor name=\"rspilker\" url=\"https://github.com/rspilker\" />\n\t\t<description homepage=\"https://projectlombok.org/\" />\n\t</info>\n\t<configurations>\n\t\t<conf name=\"default\" />\n\t</configurations>\n\t<publications>\n\t\t<artifact conf=\"default\" url=\"https://projectlombok.org/downloads/lombok.patcher-0.50.jar\" />\n\t</publications>\n</ivy-module>\n"
  },
  {
    "path": "buildScripts/ivy-repo/org.projectlombok-lombok.patcher-0.52.xml",
    "content": "<ivy-module version=\"2.0\">\n\t<info organisation=\"org.projectlombok\" module=\"lombok.patcher\" revision=\"0.52\" publication=\"20240920010000\">\n\t\t<license name=\"MIT License\" url=\"https://www.opensource.org/licenses/mit-license.php\" />\n\t\t<ivyauthor name=\"rzwitserloot\" url=\"https://github.com/rzwitserloot\" />\n\t\t<ivyauthor name=\"rspilker\" url=\"https://github.com/rspilker\" />\n\t\t<description homepage=\"https://projectlombok.org/\" />\n\t</info>\n\t<configurations>\n\t\t<conf name=\"default\" />\n\t</configurations>\n\t<publications>\n\t\t<artifact conf=\"default\" url=\"https://projectlombok.org/downloads/lombok.patcher-0.52.jar\" />\n\t</publications>\n</ivy-module>\n"
  },
  {
    "path": "buildScripts/ivy-repo/org.projectlombok-lombok.patcher-0.54.xml",
    "content": "<ivy-module version=\"2.0\">\n\t<info organisation=\"org.projectlombok\" module=\"lombok.patcher\" revision=\"0.54\" publication=\"20250306230000\">\n\t\t<license name=\"MIT License\" url=\"https://www.opensource.org/licenses/mit-license.php\" />\n\t\t<ivyauthor name=\"rzwitserloot\" url=\"https://github.com/rzwitserloot\" />\n\t\t<ivyauthor name=\"rspilker\" url=\"https://github.com/rspilker\" />\n\t\t<description homepage=\"https://projectlombok.org/\" />\n\t</info>\n\t<configurations>\n\t\t<conf name=\"default\" />\n\t</configurations>\n\t<publications>\n\t\t<artifact conf=\"default\" url=\"https://projectlombok.org/downloads/lombok.patcher-0.54.jar\" />\n\t</publications>\n</ivy-module>\n"
  },
  {
    "path": "buildScripts/ivy-repo/org.projectlombok-lombok.patcher-0.56.xml",
    "content": "<ivy-module version=\"2.0\">\n\t<info organisation=\"org.projectlombok\" module=\"lombok.patcher\" revision=\"0.56\" publication=\"20250523040000\">\n\t\t<license name=\"MIT License\" url=\"https://www.opensource.org/licenses/mit-license.php\" />\n\t\t<ivyauthor name=\"rzwitserloot\" url=\"https://github.com/rzwitserloot\" />\n\t\t<ivyauthor name=\"rspilker\" url=\"https://github.com/rspilker\" />\n\t\t<description homepage=\"https://projectlombok.org/\" />\n\t</info>\n\t<configurations>\n\t\t<conf name=\"default\" />\n\t</configurations>\n\t<publications>\n\t\t<artifact conf=\"default\" url=\"https://projectlombok.org/downloads/lombok.patcher-0.56.jar\" />\n\t</publications>\n</ivy-module>\n"
  },
  {
    "path": "buildScripts/ivy-repo/projectlombok.org-jsch-ant-fixed-0.1.42.xml",
    "content": "<ivy-module version=\"2.0\">\n\t<info organisation=\"projectlombok.org\" module=\"jsch-ant-fixed\" revision=\"0.1.42\" publication=\"20100225011200\">\n\t\t<license name=\"BSD\" url=\"http://www.jcraft.com/jsch/LICENSE.txt\" />\n\t\t<description homepage=\"http://www.jcraft.com/jsch/\" />\n\t</info>\n\t<configurations>\n\t\t<conf name=\"build\" />\n\t</configurations>\n\t<publications>\n\t\t<artifact conf=\"build\" url=\"https://projectlombok.org/ivyrepo/tools/ant-jsch-fixed.jar\" />\n\t</publications>\n</ivy-module>\n"
  },
  {
    "path": "buildScripts/ivy-repo/projectlombok.org-markdownj-1.02b4.xml",
    "content": "<ivy-module version=\"2.0\">\n\t<info organisation=\"projectlombok.org\" module=\"markdownj\" revision=\"1.02b4\" publication=\"20100419062500\">\n\t\t<description homepage=\"https://github.com/myabc/markdownj\" />\n\t</info>\n\t<configurations>\n\t\t<conf name=\"build\" />\n\t</configurations>\n\t<publications>\n\t\t<artifact conf=\"build\" url=\"https://projectlombok.org/ivyrepo/tools/markdownj-1.02b4-0.3.0.jar\" />\n\t</publications>\n</ivy-module>\n"
  },
  {
    "path": "buildScripts/ivy-repo/projectlombok.org-spi-0.2.4.xml",
    "content": "<ivy-module version=\"2.0\">\n\t<info organisation=\"projectlombok.org\" module=\"spi\" revision=\"0.2.4\" publication=\"20100419062500\">\n\t\t<license name=\"Apache License v2.0\" url=\"http://www.apache.org/licenses/LICENSE-2.0\" />\n\t\t<description homepage=\"http://code.google.com/p/spi/\" />\n\t</info>\n\t<configurations>\n\t\t<conf name=\"build\" />\n\t</configurations>\n\t<publications>\n\t\t<artifact conf=\"build\" url=\"https://projectlombok.org/ivyrepo/tools/spi-0.2.4.jar\" />\n\t</publications>\n</ivy-module>\n"
  },
  {
    "path": "buildScripts/ivy-repo/projectlombok.org-spi-0.2.7.xml",
    "content": "<ivy-module version=\"2.0\">\n\t<info organisation=\"projectlombok.org\" module=\"spi\" revision=\"0.2.7\" publication=\"20130910135600\">\n\t\t<license name=\"Apache License v2.0\" url=\"http://www.apache.org/licenses/LICENSE-2.0\" />\n\t\t<description homepage=\"http://code.google.com/p/spi/\" />\n\t</info>\n\t<configurations>\n\t\t<conf name=\"build\" />\n\t</configurations>\n\t<publications>\n\t\t<artifact conf=\"build\" url=\"https://projectlombok.org/ivyrepo/tools/spi-0.2.7.jar\" />\n\t</publications>\n</ivy-module>\n"
  },
  {
    "path": "buildScripts/ivy-repo/zwitserloot.com-cmdreader-1.2.xml",
    "content": "<ivy-module version=\"2.0\">\n\t<info organisation=\"zwitserloot.com\" module=\"cmdreader\" revision=\"1.2\" publication=\"20100210120000\">\n\t\t<license name=\"MIT License\" url=\"http://www.opensource.org/licenses/mit-license.php\" />\n\t\t<ivyauthor name=\"rzwitserloot\" url=\"http://zwitserloot.com/\" />\n\t\t<description homepage=\"http://github.com/rzwitserloot/com.zwitserloot.cmdreader\" />\n\t</info>\n\t<configurations>\n\t\t<conf name=\"runtime\" />\n\t\t<conf name=\"sources\" />\n\t</configurations>\n\t<publications>\n\t\t<artifact conf=\"runtime\" url=\"https://projectlombok.org/ivyrepo/tools/com.zwitserloot.cmdreader-1.2.jar\" />\n\t\t<artifact type=\"zip\" conf=\"sources\" url=\"https://projectlombok.org/ivyrepo/tools/com.zwitserloot.cmdreader-src-1.2.zip\" />\n\t</publications>\n</ivy-module>\n"
  },
  {
    "path": "buildScripts/ivy.xml",
    "content": "<ivy-module version=\"2.0\">\n\t<info organisation=\"projectlombok.org\" module=\"lombok\" />\n\t<configurations>\n\t\t<!-- dependencies for the build itself, such as tools to create the website or deploy to servers. -->\n\t\t<conf name=\"buildtools\" />\n\t\t\n\t\t<!-- test: base dependencies required to run the tests. Does not include javac or ecj. -->\n\t\t<conf name=\"test\" />\n\t\t\n\t\t<!-- build: dependencies that need to be on the classpath during builds -->\n\t\t<conf name=\"build\" />\n\t\t\n\t\t<!-- stripe: dependencies that need to be striped into lombok.jar itself, and are required for both build and test/run purposes -->\n\t\t<conf name=\"stripe\" />\n\t\t\n\t\t<!-- sources of various dependencies where having the sources is useful (for example for debugging purposes) -->\n\t\t<conf name=\"sources\" />\n\t\t\n\t\t<!-- and now for custom configs for testing lombok against -->\n\t\t\n\t\t<conf name=\"javac6\" />\n\t\t<conf name=\"javac7\" />\n\t\t<conf name=\"javac8\" />\n\t\t\n\t\t<conf name=\"ecj8\" />\n\t\t<conf name=\"ecj11\" />\n\t\t<conf name=\"ecj14\" />\n\t\t<conf name=\"ecj16\" />\n\t\t<conf name=\"ecj19\" />\n\t\t\n\t\t<conf name=\"eclipse-oxygen\" />\n\t\t<conf name=\"eclipse-202006\" />\n\t\t<conf name=\"eclipse-202403\" />\n\t\t<conf name=\"eclipse-202503\" />\n\t\t\n\t\t<conf name=\"mapstruct\" />\n\t</configurations>\n\t<dependencies>\n\t\t\n\t\t<dependency org=\"org.projectlombok\" name=\"lombok.patcher\" rev=\"0.56\" conf=\"build,stripe->default\" />\n\t\t<dependency org=\"zwitserloot.com\" name=\"cmdreader\" rev=\"1.2\" conf=\"build,stripe->runtime\" />\n\t\t<dependency org=\"org.apache.ant\" name=\"ant\" rev=\"1.10.5\" conf=\"build->default\" />\n\t\t<dependency org=\"org.apache.ant\" name=\"ant-junit\" rev=\"1.10.5\" conf=\"build->default\" />\n\t\t\n\t\t<!-- test deps -->\n\t\t<dependency org=\"junit\" name=\"junit\" rev=\"4.13.2\" conf=\"test->default; sources\" />\n\t\t<dependency org=\"log4j\" name=\"log4j\" rev=\"1.2.17\" conf=\"test->default; sources\" />\n\t\t<dependency org=\"org.apache.logging.log4j\" name=\"log4j-api\" rev=\"2.17.1\" conf=\"test->default; sources\" />\n\t\t<dependency org=\"commons-logging\" name=\"commons-logging\" rev=\"1.2\" conf=\"test->default; sources\" />\n\t\t<dependency org=\"org.slf4j\" name=\"slf4j-api\" rev=\"1.8.0-beta2\" conf=\"test->default; sources\" />\n\t\t<dependency org=\"org.slf4j\" name=\"slf4j-ext\" rev=\"1.8.0-beta2\" conf=\"test->default; sources\" />\n\t\t<dependency org=\"org.jboss.logging\" name=\"jboss-logging\" rev=\"3.3.0.Final\" conf=\"test->default; sources\" />\n\t\t<dependency org=\"com.google.flogger\" name=\"flogger\" rev=\"0.2\" conf=\"test->default; sources\" />\n\t\t<dependency org=\"com.google.guava\" name=\"guava\" rev=\"18.0\" conf=\"test->default; sources\" />\n\t\t<dependency org=\"com.google.code.findbugs\" name=\"findbugs\" rev=\"3.0.1\" conf=\"test->master\" />\n\t\t<dependency org=\"org.springframework\" name=\"spring-core\" rev=\"5.3.4\" conf=\"test->master\" />\n\t\t<dependency org=\"com.fasterxml.jackson.core\" name=\"jackson-databind\" rev=\"2.10.0\" conf=\"test->master\" />\n\t\t<dependency org=\"com.fasterxml.jackson.core\" name=\"jackson-annotations\" rev=\"2.10.0\" conf=\"test->master\" />\n\t\t\n\t\t<!-- build tooling -->\n\t\t<dependency org=\"com.hierynomus\" name=\"sshj\" rev=\"0.26.0\" conf=\"buildtools->default\" />\n\t\t<dependency org=\"projectlombok.org\" name=\"markdownj\" rev=\"1.02b4\" conf=\"buildtools->build\" />\n\t\t<dependency org=\"de.java2html\" name=\"java2html\" rev=\"5.0\" conf=\"buildtools->default\" />\n\t\t<dependency org=\"org.freemarker\" name=\"freemarker\" rev=\"2.3.28\" conf=\"buildtools->default\" />\n\t\t<dependency org=\"com.sparkjava\" name=\"spark-core\" rev=\"2.9.2\" conf=\"buildtools->default\" />\n\t\t<dependency org=\"software.amazon.awssdk\" name=\"s3\" rev=\"2.19.29\" conf=\"buildtools->default\" />\n\t\t<dependency org=\"com.sun.xml.bind\" name=\"jaxb-impl\" rev=\"2.3.9\" conf=\"buildtools->default\" />\n\t\t\n\t\t<!-- javacs -->\n\t\t<dependency org=\"net.java.openjdk.custom\" name=\"javac6\" rev=\"1.6.0.18\" conf=\"javac6->runtime\" />\n\t\t<dependency org=\"net.java.openjdk.custom\" name=\"javac7\" rev=\"1.7.0\" conf=\"javac7->runtime\" />\n\t\t<dependency org=\"net.java.openjdk.custom\" name=\"javac8\" rev=\"1.8.0\" conf=\"javac8->runtime\" />\n\t\t\n\t\t<!-- ecjs -->\n\t\t\n\t\t<dependency org=\"org.eclipse.jdt\" name=\"ecj\" rev=\"3.32.0\" conf=\"ecj19->master\" />\n\t\t<dependency org=\"org.eclipse.jdt\" name=\"ecj\" rev=\"3.25.0\" conf=\"ecj16->master\" />\n\t\t<dependency org=\"org.eclipse.jdt\" name=\"ecj\" rev=\"3.22.0\" conf=\"ecj14->master\" />\n\t\t<dependency org=\"org.eclipse.jdt\" name=\"ecj\" rev=\"3.16.0\" conf=\"ecj11->master\" />\n\t\t<!-- until oct 2016, ecj was released under org 'org.eclipse.jdt.core.compiler', and the versioning followed eclipse's versions. -->\n\t\t<!-- after that, it switched to group 'org.eclipse.jdt', and follows its own version. That means 3.16.0 is a later release than 4.6.1 on the old group! -->\n\t\t<dependency org=\"org.eclipse.jdt.core.compiler\" name=\"ecj\" rev=\"4.4.2\" conf=\"ecj8->master\" />\n\t\t\n\t\t<!-- eclipses -->\n\t\t\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.core.runtime\" rev=\"3.13.0\" conf=\"eclipse-oxygen->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.jdt\" name=\"org.eclipse.jdt.core\" rev=\"3.13.102\" conf=\"eclipse-oxygen->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.jdt\" name=\"org.eclipse.jdt.ui\" rev=\"3.13.100\" conf=\"eclipse-oxygen->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.equinox.common\" rev=\"3.9.0\" conf=\"eclipse-oxygen->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.equinox.registry\" rev=\"3.7.0\" conf=\"eclipse-oxygen->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.equinox.app\" rev=\"1.3.400\" conf=\"eclipse-oxygen->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.core.resources\" rev=\"3.12.0\" conf=\"eclipse-oxygen->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.core.contenttype\" rev=\"3.6.0\" conf=\"eclipse-oxygen->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.core.jobs\" rev=\"3.9.0\" conf=\"eclipse-oxygen->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.osgi\" rev=\"3.12.100\" conf=\"eclipse-oxygen->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.text\" rev=\"3.6.100\" conf=\"eclipse-oxygen->default\" transitive=\"false\" />\n\t\t\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.core.runtime\" rev=\"3.18.0\" conf=\"eclipse-202006->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.jdt\" name=\"org.eclipse.jdt.core\" rev=\"3.22.0\" conf=\"eclipse-202006->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.jdt\" name=\"org.eclipse.jdt.ui\" rev=\"3.21.100\" conf=\"eclipse-202006->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.equinox.common\" rev=\"3.12.0\" conf=\"eclipse-202006->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.equinox.preferences\" rev=\"3.8.0\" conf=\"eclipse-202006->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.equinox.registry\" rev=\"3.8.700\" conf=\"eclipse-202006->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.equinox.app\" rev=\"1.4.400\" conf=\"eclipse-202006->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.core.resources\" rev=\"3.13.700\" conf=\"eclipse-202006->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.core.contenttype\" rev=\"3.7.600\" conf=\"eclipse-202006->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.core.jobs\" rev=\"3.10.800\" conf=\"eclipse-202006->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.osgi\" rev=\"3.15.300\" conf=\"eclipse-202006->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.text\" rev=\"3.10.200\" conf=\"eclipse-202006->default\" transitive=\"false\" />\n\t\t\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.core.runtime\" rev=\"3.31.0\" conf=\"eclipse-202403->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.jdt\" name=\"org.eclipse.jdt.core\" rev=\"3.37.0\" conf=\"eclipse-202403->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.jdt\" name=\"org.eclipse.jdt.ui\" rev=\"3.32.0\" conf=\"eclipse-202403->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.jdt\" name=\"ecj\" rev=\"3.37.0\" conf=\"eclipse-202403->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.equinox.common\" rev=\"3.19.0\" conf=\"eclipse-202403->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.equinox.registry\" rev=\"3.12.0\" conf=\"eclipse-202403->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.equinox.app\" rev=\"1.7.0\" conf=\"eclipse-202403->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.core.resources\" rev=\"3.20.100\" conf=\"eclipse-202403->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.core.contenttype\" rev=\"3.9.300\" conf=\"eclipse-202403->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.core.jobs\" rev=\"3.15.200\" conf=\"eclipse-202403->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.osgi\" rev=\"3.19.0\" conf=\"eclipse-202403->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.text\" rev=\"3.14.0\" conf=\"eclipse-202403->default\" transitive=\"false\" />\n\t\t\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.core.runtime\" rev=\"3.33.0\" conf=\"eclipse-202503->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.jdt\" name=\"org.eclipse.jdt.core\" rev=\"3.41.0\" conf=\"eclipse-202503->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.jdt\" name=\"org.eclipse.jdt.ui\" rev=\"3.34.0\" conf=\"eclipse-202503->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.jdt\" name=\"ecj\" rev=\"3.41.0\" conf=\"eclipse-202503->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.equinox.common\" rev=\"3.20.0\" conf=\"eclipse-202503->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.equinox.registry\" rev=\"3.12.300\" conf=\"eclipse-202503->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.equinox.app\" rev=\"1.7.300\" conf=\"eclipse-202503->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.core.resources\" rev=\"3.22.100\" conf=\"eclipse-202503->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.core.contenttype\" rev=\"3.9.600\" conf=\"eclipse-202503->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.core.jobs\" rev=\"3.15.500\" conf=\"eclipse-202503->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.osgi\" rev=\"3.23.0\" conf=\"eclipse-202503->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.osgi\" name=\"org.osgi.service.prefs\" rev=\"1.1.2\" conf=\"eclipse-202503->default\" transitive=\"false\" />\n\t\t<dependency org=\"org.eclipse.platform\" name=\"org.eclipse.text\" rev=\"3.14.300\" conf=\"eclipse-202503->default\" transitive=\"false\" />\n\t\t\n\t\t<!-- integration with other libraries -->\n\t\t<dependency org=\"org.mapstruct\" name=\"mapstruct-processor\" rev=\"1.3.1.Final\" conf=\"mapstruct->default\" transitive=\"false\" />\n\t</dependencies>\n</ivy-module>\n"
  },
  {
    "path": "buildScripts/ivysettings.xml",
    "content": "<ivysettings>\n\t<resolvers>\n\t\t<chain name=\"projectRepos\">\n\t\t\t<filesystem name=\"projectLocalRepo\">\n\t\t\t\t<ivy pattern=\"${ivy.settings.dir}/ivy-repo/[organization]-[module]-[revision].xml\" />\n\t\t\t</filesystem>\n\t\t\t<ibiblio name=\"eclipse-staging-repo\" m2compatible=\"true\" root=\"https://repo.eclipse.org/content/repositories/eclipse-staging\" />\n\t\t\t<ibiblio name=\"maven-repo2\" m2compatible=\"true\" root=\"https://repo1.maven.org/maven2\" />\n\t\t</chain>\n\t</resolvers>\n\t<settings defaultResolver=\"projectRepos\" validate=\"false\" />\n\t<caches defaultCacheDir=\"${ivy.basedir}/ivyCache\" />\n</ivysettings>\n"
  },
  {
    "path": "buildScripts/javadoc/java6/package-list",
    "content": "java.applet\njava.awt\njava.awt.color\njava.awt.datatransfer\njava.awt.dnd\njava.awt.event\njava.awt.font\njava.awt.geom\njava.awt.im\njava.awt.im.spi\njava.awt.image\njava.awt.image.renderable\njava.awt.print\njava.beans\njava.beans.beancontext\njava.io\njava.lang\njava.lang.annotation\njava.lang.instrument\njava.lang.management\njava.lang.ref\njava.lang.reflect\njava.math\njava.net\njava.nio\njava.nio.channels\njava.nio.channels.spi\njava.nio.charset\njava.nio.charset.spi\njava.rmi\njava.rmi.activation\njava.rmi.dgc\njava.rmi.registry\njava.rmi.server\njava.security\njava.security.acl\njava.security.cert\njava.security.interfaces\njava.security.spec\njava.sql\njava.text\njava.text.spi\njava.util\njava.util.concurrent\njava.util.concurrent.atomic\njava.util.concurrent.locks\njava.util.jar\njava.util.logging\njava.util.prefs\njava.util.regex\njava.util.spi\njava.util.zip\njavax.accessibility\njavax.activation\njavax.activity\njavax.annotation\njavax.annotation.processing\njavax.crypto\njavax.crypto.interfaces\njavax.crypto.spec\njavax.imageio\njavax.imageio.event\njavax.imageio.metadata\njavax.imageio.plugins.bmp\njavax.imageio.plugins.jpeg\njavax.imageio.spi\njavax.imageio.stream\njavax.jws\njavax.jws.soap\njavax.lang.model\njavax.lang.model.element\njavax.lang.model.type\njavax.lang.model.util\njavax.management\njavax.management.loading\njavax.management.modelmbean\njavax.management.monitor\njavax.management.openmbean\njavax.management.relation\njavax.management.remote\njavax.management.remote.rmi\njavax.management.timer\njavax.naming\njavax.naming.directory\njavax.naming.event\njavax.naming.ldap\njavax.naming.spi\njavax.net\njavax.net.ssl\njavax.print\njavax.print.attribute\njavax.print.attribute.standard\njavax.print.event\njavax.rmi\njavax.rmi.CORBA\njavax.rmi.ssl\njavax.script\njavax.security.auth\njavax.security.auth.callback\njavax.security.auth.kerberos\njavax.security.auth.login\njavax.security.auth.spi\njavax.security.auth.x500\njavax.security.cert\njavax.security.sasl\njavax.sound.midi\njavax.sound.midi.spi\njavax.sound.sampled\njavax.sound.sampled.spi\njavax.sql\njavax.sql.rowset\njavax.sql.rowset.serial\njavax.sql.rowset.spi\njavax.swing\njavax.swing.border\njavax.swing.colorchooser\njavax.swing.event\njavax.swing.filechooser\njavax.swing.plaf\njavax.swing.plaf.basic\njavax.swing.plaf.metal\njavax.swing.plaf.multi\njavax.swing.plaf.synth\njavax.swing.table\njavax.swing.text\njavax.swing.text.html\njavax.swing.text.html.parser\njavax.swing.text.rtf\njavax.swing.tree\njavax.swing.undo\njavax.tools\njavax.transaction\njavax.transaction.xa\njavax.xml\njavax.xml.bind\njavax.xml.bind.annotation\njavax.xml.bind.annotation.adapters\njavax.xml.bind.attachment\njavax.xml.bind.helpers\njavax.xml.bind.util\njavax.xml.crypto\njavax.xml.crypto.dom\njavax.xml.crypto.dsig\njavax.xml.crypto.dsig.dom\njavax.xml.crypto.dsig.keyinfo\njavax.xml.crypto.dsig.spec\njavax.xml.datatype\njavax.xml.namespace\njavax.xml.parsers\njavax.xml.soap\njavax.xml.stream\njavax.xml.stream.events\njavax.xml.stream.util\njavax.xml.transform\njavax.xml.transform.dom\njavax.xml.transform.sax\njavax.xml.transform.stax\njavax.xml.transform.stream\njavax.xml.validation\njavax.xml.ws\njavax.xml.ws.handler\njavax.xml.ws.handler.soap\njavax.xml.ws.http\njavax.xml.ws.soap\njavax.xml.ws.spi\njavax.xml.ws.wsaddressing\njavax.xml.xpath\norg.ietf.jgss\norg.omg.CORBA\norg.omg.CORBA.DynAnyPackage\norg.omg.CORBA.ORBPackage\norg.omg.CORBA.TypeCodePackage\norg.omg.CORBA.portable\norg.omg.CORBA_2_3\norg.omg.CORBA_2_3.portable\norg.omg.CosNaming\norg.omg.CosNaming.NamingContextExtPackage\norg.omg.CosNaming.NamingContextPackage\norg.omg.Dynamic\norg.omg.DynamicAny\norg.omg.DynamicAny.DynAnyFactoryPackage\norg.omg.DynamicAny.DynAnyPackage\norg.omg.IOP\norg.omg.IOP.CodecFactoryPackage\norg.omg.IOP.CodecPackage\norg.omg.Messaging\norg.omg.PortableInterceptor\norg.omg.PortableInterceptor.ORBInitInfoPackage\norg.omg.PortableServer\norg.omg.PortableServer.CurrentPackage\norg.omg.PortableServer.POAManagerPackage\norg.omg.PortableServer.POAPackage\norg.omg.PortableServer.ServantLocatorPackage\norg.omg.PortableServer.portable\norg.omg.SendingContext\norg.omg.stub.java.rmi\norg.w3c.dom\norg.w3c.dom.bootstrap\norg.w3c.dom.events\norg.w3c.dom.ls\norg.xml.sax\norg.xml.sax.ext\norg.xml.sax.helpers\n"
  },
  {
    "path": "buildScripts/mapstructBinding.ant.xml",
    "content": "<!--\n Copyright (C) 2020 The Project Lombok Authors.\n  \n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to deal\n  in the Software without restriction, including without limitation the rights\n  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  copies of the Software, and to permit persons to whom the Software is\n  furnished to do so, subject to the following conditions:\n  \n  The above copyright notice and this permission notice shall be included in\n  all copies or substantial portions of the Software.\n  \n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  THE SOFTWARE.\n-->\n<project name=\"lombok.mapstructBinding\" xmlns:ivy=\"antlib:com.zwitserloot.ivyplusplus\" basedir=\"..\">\n\t<description>\nThis buildfile is part of projectlombok.org. It builds the mapstruct-lombok binding; we think the\nversion on mavencentral is the last version that is ever needed; the code itself is trivial and\nexists as a separate dependency solely because it is itself dependent on both lombok and mapstruct.\n\t</description>\n\t\n\t<target name=\"-mapstructBinding.compile\" depends=\"-setup.build\">\n\t\t<mkdir dir=\"build/mapstruct\" />\n\t\t<javac includeAntRuntime=\"false\" source=\"1.8\" target=\"1.8\" destdir=\"build/mapstruct\">\n\t\t\t<src path=\"src/j9stubs\" />\n\t\t</javac>\n\t</target>\n\t\n\t<target name=\"-mapstructBinding.prepare\" depends=\"-mapstructBinding.compile\">\n\t\t<mkdir dir=\"build/mapstruct-module-path\" />\n\t\t<copy file=\"dist/lombok.jar\" todir=\"build/mapstruct-module-path\" />\n\t\t<jar destfile=\"build/mapstruct-module-path/mapstruct-processor.jar\" basedir=\"build/mapstruct\" includes=\"org/**\">\n\t\t\t<manifest>\n\t\t\t\t <attribute name=\"Automatic-Module-Name\" value=\"org.mapstruct.processor\" />\n\t\t\t</manifest>\n\t\t</jar>\n\t\t\n\t\t<mkdir dir=\"build/mapstruct-binding/maven\" />\n\t\t<copy tofile=\"build/mapstruct-binding/maven/pom.xml\" overwrite=\"true\" file=\"doc/mapstruct-binding-maven-pom.xml\">\n\t\t\t<filterchain>\n\t\t\t\t<replacetokens>\n\t\t\t\t\t<token key=\"VERSION\" value=\"${mapstruct-binding.version}\" />\n\t\t\t\t</replacetokens>\n\t\t\t</filterchain>\n\t\t</copy>\n\t</target>\n\t\n\t<target name=\"-mapstructBinding.doc\" depends=\"-mapstructBinding.prepare\">\n\t\t<mkdir dir=\"build/mapstruct-binding/api\" />\n\t\t<javadoc \n\t\t\tPackage=\"true\"\n\t\t\tpackagenames=\"lombok.*\"\n\t\t\tsourcepath=\"src/bindings/mapstruct\"\n\t\t\tclasspath=\"build/mapstruct\"\n\t\t\tdefaultexcludes=\"yes\"\n\t\t\tdestdir=\"build/mapstruct-binding/api\"\n\t\t\twindowtitle=\"Lombok Mapstruct Binding\"\n\t\t\tsource=\"1.8\" />\n\t\t\n\t\t<!-- bugfix for boneheaded javadoc bug where ?is-external=true is inserted before an anchor ref, breaking the anchor ref.\n\t\tis-external=true doesn't actually do anything, so, we'll just get rid of it. -->\n\t\t<replaceregexp match=\"\\?is-external=true#\" replace=\"#\" flags=\"gi\">\n\t\t\t<fileset dir=\"build/mapstruct-binding/api\" includes=\"**/*.html\" />\n\t\t</replaceregexp>\n\t\t\n\t\t<jar destfile=\"dist/lombok-mapstruct-binding-${mapstruct-binding.version}-javadoc.jar\" basedir=\"build/mapstruct-binding/api\" includes=\"**\" />\n\t</target>\n\t\n\t<target name=\"-mapstructBinding.jar\" depends=\"dist, -mapstructBinding.prepare\">\n\t\t<mkdir dir=\"build/mapstruct-binding/classes\" />\n\t\t<echo file=\"build/mapstruct-binding/classes/META-INF/services/org.mapstruct.ap.spi.AstModifyingAnnotationProcessor\">lombok.mapstruct.NotifierHider$AstModificationNotifier</echo>\n\t\t\n\t\t<javac includeAntRuntime=\"false\" source=\"1.8\" target=\"1.8\" destdir=\"build/mapstruct-binding/classes\">\n\t\t\t<src path=\"src/bindings/mapstruct\" />\n\t\t\t<exclude name=\"module-info.java\" />\n\t\t\t<classpath location=\"build/mapstruct\" />\n\t\t</javac>\n\t\t<javac includeAntRuntime=\"false\" source=\"1.9\" target=\"1.9\" destdir=\"build/mapstruct-binding/classes\" modulepath=\"build/mapstruct-module-path\">\n\t\t\t<src path=\"src/bindings/mapstruct\" />\n\t\t\t<include name=\"module-info.java\" />\n\t\t</javac>\n\t\t<jar destfile=\"dist/lombok-mapstruct-binding-${mapstruct-binding.version}.jar\" basedir=\"build/mapstruct-binding/classes\" includes=\"**\" />\n\t</target>\n\t\n\t<target name=\"-mapstructBinding.src\" depends=\"-mapstructBinding.jar\">\n\t\t<jar destfile=\"dist/lombok-mapstruct-binding-${mapstruct-binding.version}-sources.jar\" basedir=\"src/bindings/mapstruct\" includes=\"**\" />\n\t</target>\n\t\n\t<target name=\"mapstructBinding.pack\" depends=\"dist,-mapstructBinding.jar,-mapstructBinding.doc,-mapstructBinding.src\">\n\t</target>\n\t\n\t<target name=\"mapstructBinding.publish\" depends=\"mapstructBinding.pack\">\n\t\t<tar destfile=\"dist/mavenPublish-mapstructBinding.tar.bz2\" compression=\"bzip2\">\n\t\t<tarfileset dir=\"dist\">\n\t\t\t<include name=\"lombok-mapstruct-binding-${mapstruct-binding.version}.jar\" />\n\t\t\t<include name=\"lombok-mapstruct-binding-${mapstruct-binding.version}-sources.jar\" />\n\t\t\t<include name=\"lombok-mapstruct-binding-${mapstruct-binding.version}-javadoc.jar\" />\n\t\t</tarfileset>\n\t\t<tarfileset dir=\"build/mapstruct-binding/maven\" includes=\"pom.xml\" />\n\t\t</tar>\n\t\t<ivy:scpUpload\n\t\t\tfrom=\"dist/mavenPublish-mapstructBinding.tar.bz2\"\n\t\t\tto=\"/data/lombok/staging\"\n\t\t\tserver=\"projectlombok.org\"\n\t\t\tusername=\"${ssh.username}\"\n\t\t\tkeyfile=\"${ssh.keyfile}\"\n\t\t\tknownHosts=\"ssh.knownHosts\" />\n\t\t<ivy:sshExec\n\t\t\tcmd=\"/data/lombok/stagingCmd/publishToMavenCentral-mapstructBinding\"\n\t\t\tserver=\"projectlombok.org\"\n\t\t\tusername=\"${ssh.username}\"\n\t\t\tkeyfile=\"${ssh.keyfile}\"\n\t\t\tknownHosts=\"ssh.knownHosts\" />\n\t\t<echo>The artifact has been published to staging. Now go to https://oss.sonatype.org/ and log in as Reinier, then doublecheck if all is well and 'release' it.</echo>\n\t\t<ivy:sshExec\n\t\t\tcmd=\"/data/lombok/stagingCmd/showMavenCentralPassword\"\n\t\t\tserver=\"projectlombok.org\"\n\t\t\tusername=\"${ssh.username}\"\n\t\t\tkeyfile=\"${ssh.keyfile}\"\n\t\t\tknownHosts=\"ssh.knownHosts\" />\n\t</target>\n\t\n\t<target name=\"mapstructBinding.maven\" depends=\"mapstructBinding.pack\" description=\"Create a maven repo for mapstruct binding into a build dir.\">\n\t\t<delete quiet=\"true\" dir=\"build/mapstruct-binding-maven\" />\n\t\t<mkdir dir=\"build/mapstruct-binding-maven\" />\n\t\t<condition property=\"exe.mvn.base\" value=\"mvn.cmd\" else=\"mvn\">\n\t\t\t<os family=\"windows\" />\n\t\t</condition>\n\t\t<condition property=\"exe.mvn\" value=\"${env.MAVEN_HOME}/bin/${exe.mvn.base}\" else=\"${exe.mvn.base}\">\n\t\t\t<isset property=\"env.MAVEN_HOME\" />\n\t\t</condition>\n\t\t\n\t\t<local name=\"mvn.result\" />\n\t\t<exec executable=\"${exe.mvn}\" failifexecutionfails=\"false\" resultproperty=\"mvn.result\">\n\t\t\t<arg value=\"deploy:deploy-file\" />\n\t\t\t<arg value=\"-Dfile=dist/lombok-mapstruct-binding-${mapstruct-binding.version}.jar\" />\n\t\t\t<arg value=\"-Dsources=dist/lombok-mapstruct-binding-${mapstruct-binding.version}-sources.jar\" />\n\t\t\t<arg value=\"-Djavadoc=dist/lombok-mapstruct-binding-${mapstruct-binding.version}-javadoc.jar\" />\n\t\t\t<arg value=\"-DgroupId=org.projectlombok\" />\n\t\t\t<arg value=\"-DartifactId=lombok-mapstruct-binding\" />\n\t\t\t<arg value=\"-Dversion=${mapstruct-binding.version}\" />\n\t\t\t<arg value=\"-DpomFile=build/mapstruct-binding/maven/pom.xml\" />\n\t\t\t<arg value=\"-Durl=file://${basedir}/build/mapstruct-binding-maven\" />\n\t\t</exec>\n\t\t<fail>\n\t\t\tmvn is not on your path and/or MAVEN_HOME is not set. Add mvn to your path or set MAVEN_HOME to continue.\n\t\t\t<condition>\n\t\t\t\t<not><isset property=\"mvn.result\" /></not>\n\t\t\t</condition>\n\t\t</fail>\n\t</target>\n</project>\n"
  },
  {
    "path": "buildScripts/maven.ant.xml",
    "content": "<!--\n Copyright (C) 2020-2023 The Project Lombok Authors.\n  \n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to deal\n  in the Software without restriction, including without limitation the rights\n  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  copies of the Software, and to permit persons to whom the Software is\n  furnished to do so, subject to the following conditions:\n  \n  The above copyright notice and this permission notice shall be included in\n  all copies or substantial portions of the Software.\n  \n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  THE SOFTWARE.\n-->\n<project name=\"lombok.maven\" xmlns:ivy=\"antlib:com.zwitserloot.ivyplusplus\" basedir=\"..\">\n\t<description>\nThis buildfile is part of projectlombok.org. It makes maven-compatible repositories.\n\t</description>\n\t\n\t<condition property=\"exe.mvn.base\" value=\"mvn.cmd\" else=\"mvn\">\n\t\t<os family=\"windows\" />\n\t</condition>\n\t<condition property=\"exe.mvn\" value=\"${env.MAVEN_HOME}/bin/${exe.mvn.base}\" else=\"${exe.mvn.base}\">\n\t\t<isset property=\"env.MAVEN_HOME\" />\n\t</condition>\n\t\n\t<macrodef name=\"maven.make\">\n\t\t<attribute name=\"version-name\" />\n\t\t<sequential>\n\t\t\t<jar destfile=\"dist/lombok-${lombok.version}-javadoc.jar\">\n\t\t\t\t<fileset dir=\"doc/api\" />\n\t\t\t</jar>\n\t\t\t\n\t\t\t<jar destfile=\"dist/lombok-${lombok.version}-sources.jar\">\n\t\t\t\t<fileset dir=\"src/core\" />\n\t\t\t\t<fileset dir=\"src/launch\" />\n\t\t\t\t<fileset dir=\"src/utils\" />\n\t\t\t\t<fileset dir=\"src/eclipseAgent\" />\n\t\t\t\t<fileset dir=\"src/mavenEcjBootstrapAgent\" />\n\t\t\t\t<fileset dir=\"src/installer\" />\n\t\t\t\t<fileset dir=\"src/delombok\" />\n\t\t\t\t<fileset dir=\"test/transform/src\" />\n\t\t\t\t<fileset dir=\"test/core/src\" />\n\t\t\t</jar>\n\t\t\t\n\t\t\t<copy tofile=\"build/lombok-@{version-name}.pom\" overwrite=\"true\" file=\"doc/maven-pom.xml\">\n\t\t\t\t<filterchain>\n\t\t\t\t\t<replacetokens>\n\t\t\t\t\t\t<token key=\"VERSION\" value=\"@{version-name}\" />\n\t\t\t\t\t</replacetokens>\n\t\t\t\t</filterchain>\n\t\t\t</copy>\n\t\t</sequential>\n\t</macrodef>\n\t\n\t<target name=\"maven\" depends=\"version, dist, javadoc.build, -setup.build\" description=\"Creates a maven repo for the current release into a build dir. The intent is for you to put that on a server someplace. Will invoke your local mvn installation.\">\n\t\t<mkdir dir=\"build\" />\n\t\t<mkdir dir=\"dist\" />\n\t\t\n\t\t<maven.make version-name=\"${lombok.version}\" />\n\t</target>\n\t\n\t<target name=\"maven.publish\" depends=\"maven, -setup.mavenCentral\">\n\t\t<fail>\n\t\t\tYour lombok clone does not include the central.sonatype.org deployment keys. Contact the core maintainers for these keys;\n\t\t\tplace them in ${gpg.keyrings} to continue.\n\t\t\t\n\t\t\t<condition>\n\t\t\t\t<not><available file=\"${gpg.keyrings}\" /></not>\n\t\t\t</condition>\n\t\t</fail>\n\t\t\n\t\t<fail unless=\"mavencentral.authToken\">\n\t\t\tYour lombok clone does not include an central.sonatype.org authToken, needed to upload and deploy to maven central. Contact the core maintainers.\n\t\t</fail>\n\t\t\n\t\t<delete quiet=\"true\" dir=\"build/maven-publish\" />\n\t\t<property name=\"maven.publish.projdir\" location=\"build/maven-publish/org/projectlombok/lombok/${lombok.version}\" />\n\t\t<mkdir dir=\"${maven.publish.projdir}\" />\n\t\t<copy todir=\"${maven.publish.projdir}\">\n\t\t\t<fileset dir=\"dist\">\n\t\t\t\t<include name=\"lombok-${lombok.version}.jar\" />\n\t\t\t\t<include name=\"lombok-${lombok.version}-sources.jar\" />\n\t\t\t\t<include name=\"lombok-${lombok.version}-javadoc.jar\" />\n\t\t\t</fileset>\n\t\t\t<fileset dir=\"build\" includes=\"lombok-${lombok.version}.pom\" />\n\t\t</copy>\n\t\t\n\t\t<apply executable=\"${exe.gpg}\" failifexecutionfails=\"false\" resultproperty=\"gpg.result\">\n\t\t\t<arg value=\"-ab\" />\n\t\t\t<arg value=\"--batch\" />\n\t\t\t<arg value=\"--yes\" />\n\t\t\t<arg value=\"--homedir\" />\n\t\t\t<arg value=\"${gpg.keyrings}\" />\n\t\t\t<fileset dir=\"${maven.publish.projdir}\" />\n\t\t</apply>\n\t\t\n\t\t<fail>\n\t\t\tgpg (Gnu Privacy Guard) is not on your path, or ant property exe.gpg is not properly set. Install gpg/add it to your PATH. Alternatively, run with ant -Dexe.gpg=/loc/to/gpg to continue.\n\t\t\t<condition>\n\t\t\t\t<not><isset property=\"gpg.result\" /></not>\n\t\t\t</condition>\n\t\t</fail>\n\t\t\n\t\t<checksum algorithm=\"SHA-1\" fileext=\".sha1\">\n\t\t\t<fileset dir=\"${maven.publish.projdir}\">\n\t\t\t\t<include name=\"*.jar\" />\n\t\t\t\t<include name=\"*.pom\" />\n\t\t\t</fileset>\n\t\t</checksum>\n\t\t\n\t\t<checksum algorithm=\"MD5\" fileext=\".md5\">\n\t\t\t<fileset dir=\"${maven.publish.projdir}\">\n\t\t\t\t<include name=\"*.jar\" />\n\t\t\t\t<include name=\"*.pom\" />\n\t\t\t</fileset>\n\t\t</checksum>\n\t\t\n\t\t<property name=\"maven.publish.bundlezip\" location=\"build/maven-publish/lombok-maven-deploy-bundle-${lombok.version}.zip\" />\n\t\t<zip destfile=\"${maven.publish.bundlezip}\">\n\t\t\t<fileset dir=\"build/maven-publish\" />\n\t\t</zip>\n\t\t\n\t\t<echo>An artifact ready to upload to central.sonatype.com is available at: ${maven.publish.bundlezip}</echo>\n\t</target>\n\t\n\t<target name=\"maven.edge\" depends=\"version, dist, javadoc.build\" description=\"Create a maven repo for the current snapshot into a build dir. The intent is for you to put that on a server someplace. Will invoke your local mvn installation.\">\n\t\t<delete quiet=\"true\" dir=\"build/edge-releases\" />\n\t\t<mkdir dir=\"build/edge-releases\" />\n\t\t\n\t\t<maven.make version-name=\"edge-SNAPSHOT\" />\n\t\t\n\t\t<local name=\"mvn.result\" />\n\t\t<exec executable=\"${exe.mvn}\" failifexecutionfails=\"false\" resultproperty=\"mvn.result\">\n\t\t\t<arg value=\"deploy:deploy-file\" />\n\t\t\t<arg value=\"-Dfile=dist/lombok-${lombok.version}.jar\" />\n\t\t\t<arg value=\"-Dsources=dist/lombok-${lombok.version}-sources.jar\" />\n\t\t\t<arg value=\"-Djavadoc=dist/lombok-${lombok.version}-javadoc.jar\" />\n\t\t\t<arg value=\"-DgroupId=org.projectlombok\" />\n\t\t\t<arg value=\"-DartifactId=lombok\" />\n\t\t\t<arg value=\"-Dversion=edge-SNAPSHOT\" />\n\t\t\t<arg value=\"-DpomFile=build/pom.xml\" />\n\t\t\t<arg value=\"-Durl=file://${basedir}/build/edge-releases\" />\n\t\t</exec>\n\t\t<fail>\n\t\t\tmvn is not on your path and/or MAVEN_HOME is not set. Add mvn to your path or set MAVEN_HOME to continue.\n\t\t\t<condition>\n\t\t\t\t<not><isset property=\"mvn.result\" /></not>\n\t\t\t</condition>\n\t\t</fail>\n\t</target>\n</project>\n"
  },
  {
    "path": "buildScripts/p2/artifacts.xml",
    "content": "<?xml version='1.0' encoding='UTF-8'?>\n<?artifactRepository version='1.1.0'?>\n<repository name='Exported Repository' type='org.eclipse.equinox.p2.artifact.repository.simpleRepository' version='1'>\n  <properties size='2'>\n    <property name='p2.timestamp' value='@EPOCH_MILLIS@'/>\n    <property name='p2.compressed' value='true'/>\n  </properties>\n  <mappings size='3'>\n    <rule filter='(&amp; (classifier=osgi.bundle))' output='${repoUrl}/plugins/${id}_${version}.jar'/>\n    <rule filter='(&amp; (classifier=binary))' output='${repoUrl}/binary/${id}_${version}'/>\n    <rule filter='(&amp; (classifier=org.eclipse.update.feature))' output='${repoUrl}/features/${id}_${version}.jar'/>\n  </mappings>\n  <artifacts size='2'>\n    <artifact classifier='org.eclipse.update.feature' id='org.projectlombok.feature' version='@VERSION@'>\n      <properties size='2'>\n        <property name='download.contentType' value='application/zip'/>\n        <property name='download.size' value='@FEATURE_ZIP_SIZE@'/>\n      </properties>\n    </artifact>\n    <artifact classifier='osgi.bundle' id='org.projectlombok.agent' version='@VERSION@'>\n      <properties size='1'>\n        <property name='download.size' value='@AGENT_ZIP_SIZE@'/>\n      </properties>\n    </artifact>\n  </artifacts>\n</repository>\n"
  },
  {
    "path": "buildScripts/p2/content.xml",
    "content": "<?xml version='1.0' encoding='UTF-8'?>\n<?metadataRepository version='1.2.0'?>\n<repository name='Exported Repository' type='org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository' version='1'>\n  <properties size='2'>\n    <property name='p2.timestamp' value='@EPOCH_MILLIS@'/>\n    <property name='p2.compressed' value='true'/>\n  </properties>\n  <units size='4'>\n    <unit id='org.projectlombok' version='@VERSION@'>\n      <properties size='2'>\n        <property name='org.eclipse.equinox.p2.name' value='Lombok'/>\n        <property name='org.eclipse.equinox.p2.type.category' value='true'/>\n      </properties>\n      <provides size='1'>\n        <provided namespace='org.eclipse.equinox.p2.iu' name='org.projectlombok' version='@VERSION@'/>\n      </provides>\n      <requires size='1'>\n        <required namespace='org.eclipse.equinox.p2.iu' name='org.projectlombok.feature.feature.group' range='[@VERSION@,@VERSION@]'/>\n      </requires>\n      <touchpoint id='null' version='0.0.0'/>\n    </unit>\n    <unit id='org.projectlombok.feature.feature.jar' version='@VERSION@'>\n      <properties size='3'>\n        <property name='org.eclipse.equinox.p2.name' value='Lombok'/>\n        <property name='org.eclipse.equinox.p2.description' value='Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java. Never write another getter or equals method again, with one annotation your class has a fully featured builder, automate your logging variables, and much more.'/>\n        <property name='org.eclipse.equinox.p2.description.url' value='https://projectlombok.org'/>\n      </properties>\n      <provides size='3'>\n        <provided namespace='org.eclipse.equinox.p2.iu' name='org.projectlombok.feature.feature.jar' version='@VERSION@'/>\n        <provided namespace='org.eclipse.equinox.p2.eclipse.type' name='feature' version='1.0.0'/>\n        <provided namespace='org.eclipse.update.feature' name='org.projectlombok.feature' version='@VERSION@'/>\n      </provides>\n      <filter>\n        (org.eclipse.update.install.features=true)\n      </filter>\n      <artifacts size='1'>\n        <artifact classifier='org.eclipse.update.feature' id='org.projectlombok.feature' version='@VERSION@'/>\n      </artifacts>\n      <touchpoint id='org.eclipse.equinox.p2.osgi' version='1.0.0'/>\n      <touchpointData size='1'>\n        <instructions size='1'>\n          <instruction key='zipped'>\n            true\n          </instruction>\n        </instructions>\n      </touchpointData>\n      <licenses size='1'>\n        <license uri='https://raw.githubusercontent.com/projectlombok/lombok/master/LICENSE' url='https://raw.githubusercontent.com/projectlombok/lombok/master/LICENSE'>\n          Copyright (C) 2009-@YEAR@ The Project Lombok Authors.&#xA;&#xA;Permission is hereby granted, free of charge, to any person obtaining a copy&#xA;of this software and associated documentation files (the &quot;Software&quot;), to deal&#xA;in the Software without restriction, including without limitation the rights&#xA;to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&#xA;copies of the Software, and to permit persons to whom the Software is&#xA;furnished to do so, subject to the following conditions:&#xA;&#xA;The above copyright notice and this permission notice shall be included in&#xA;all copies or substantial portions of the Software.&#xA;&#xA;THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&#xA;IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&#xA;FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&#xA;AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&#xA;LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&#xA;OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&#xA;THE SOFTWARE.\n        </license>\n      </licenses>\n    </unit>\n    <unit id='org.projectlombok.agent' version='@VERSION@' singleton='false'>\n      <update id='org.projectlombok.agent' range='[0.0.0,@VERSION@)' severity='0'/>\n      <properties size='1'>\n        <property name='org.eclipse.equinox.p2.name' value='Lombok Agent'/>\n      </properties>\n      <provides size='4'>\n        <provided namespace='org.eclipse.equinox.p2.iu' name='org.projectlombok.agent' version='@VERSION@'/>\n        <provided namespace='osgi.bundle' name='org.projectlombok.agent' version='@VERSION@'/>\n        <provided namespace='osgi.identity' name='org.projectlombok.agent' version='@VERSION@'>\n          <properties size='1'>\n            <property name='type' value='osgi.bundle'/>\n          </properties>\n        </provided>\n        <provided namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' version='1.0.0'/>\n      </provides>\n      <artifacts size='1'>\n        <artifact classifier='osgi.bundle' id='org.projectlombok.agent' version='@VERSION@'/>\n      </artifacts>\n      <touchpoint id='org.eclipse.equinox.p2.osgi' version='1.0.0'/>\n      <touchpointData size='1'>\n        <instructions size='4'>\n          <instruction key='uninstall'>\n            org.eclipse.equinox.p2.touchpoint.eclipse.removeJvmArg(jvmArg:-javaagent:${artifact.location}/lombok.jar);\n          </instruction>\n          <instruction key='zipped'>\n            true\n          </instruction>\n          <instruction key='install'>\n            org.eclipse.equinox.p2.touchpoint.eclipse.addJvmArg(jvmArg:-javaagent:${artifact.location}/lombok.jar);org.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/lombok.eclipse.agent.jar);\n          </instruction>\n          <instruction key='manifest'>\n            Bundle-SymbolicName: org.projectlombok.agent&#xA;Bundle-Version: @VERSION@\n          </instruction>\n        </instructions>\n      </touchpointData>\n    </unit>\n    <unit id='org.projectlombok.feature.feature.group' version='@VERSION@' singleton='false'>\n      <update id='org.projectlombok.feature.feature.group' range='[0.0.0,@VERSION@)' severity='0'/>\n      <properties size='4'>\n        <property name='org.eclipse.equinox.p2.name' value='Lombok'/>\n        <property name='org.eclipse.equinox.p2.description' value='Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java. Never write another getter or equals method again, with one annotation your class has a fully featured builder, automate your logging variables, and much more.'/>\n        <property name='org.eclipse.equinox.p2.description.url' value='https://projectlombok.org'/>\n        <property name='org.eclipse.equinox.p2.type.group' value='true'/>\n      </properties>\n      <provides size='1'>\n        <provided namespace='org.eclipse.equinox.p2.iu' name='org.projectlombok.feature.feature.group' version='@VERSION@'/>\n      </provides>\n      <requires size='2'>\n        <required namespace='org.eclipse.equinox.p2.iu' name='org.projectlombok.agent' range='[@VERSION@,@VERSION@]'/>\n        <required namespace='org.eclipse.equinox.p2.iu' name='org.projectlombok.feature.feature.jar' range='[@VERSION@,@VERSION@]'>\n          <filter>\n            (org.eclipse.update.install.features=true)\n          </filter>\n        </required>\n      </requires>\n      <touchpoint id='null' version='0.0.0'/>\n      <licenses size='1'>\n        <license uri='https://raw.githubusercontent.com/projectlombok/lombok/master/LICENSE' url='https://raw.githubusercontent.com/projectlombok/lombok/master/LICENSE'>\n          Copyright (C) 2009-@YEAR@ The Project Lombok Authors.&#xA;&#xA;Permission is hereby granted, free of charge, to any person obtaining a copy&#xA;of this software and associated documentation files (the &quot;Software&quot;), to deal&#xA;in the Software without restriction, including without limitation the rights&#xA;to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&#xA;copies of the Software, and to permit persons to whom the Software is&#xA;furnished to do so, subject to the following conditions:&#xA;&#xA;The above copyright notice and this permission notice shall be included in&#xA;all copies or substantial portions of the Software.&#xA;&#xA;THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&#xA;IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&#xA;FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&#xA;AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&#xA;LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&#xA;OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN&#xA;THE SOFTWARE.\n        </license>\n      </licenses>\n    </unit>\n  </units>\n</repository>\n"
  },
  {
    "path": "buildScripts/p2/feature.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<feature\n      id=\"org.projectlombok.feature\"\n      label=\"Lombok\"\n      version=\"@VERSION@\">\n\n   <description url=\"https://projectlombok.org\">\n      Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java. Never write another getter or equals method again, with one annotation your class has a fully featured builder, automate your logging variables, and much more.\n   </description>\n\n   <license url=\"https://raw.githubusercontent.com/projectlombok/lombok/master/LICENSE\">\n      Copyright (C) 2009-@YEAR@ The Project Lombok Authors.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the &quot;Software&quot;), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n   </license>\n\n   <plugin\n         id=\"org.projectlombok.agent\"\n         download-size=\"1158\"\n         install-size=\"1158\"\n         version=\"@VERSION@\"/>\n\n</feature>\n"
  },
  {
    "path": "buildScripts/p2/p2.inf",
    "content": "instructions.install=\\\norg.eclipse.equinox.p2.touchpoint.eclipse.addJvmArg(jvmArg:-javaagent:${artifact.location}/lombok.jar);\\\norg.eclipse.equinox.p2.touchpoint.natives.remove(path:${installFolder}/lombok.eclipse.agent.jar);\n\ninstructions.uninstall=\\\norg.eclipse.equinox.p2.touchpoint.eclipse.removeJvmArg(jvmArg:-javaagent:${artifact.location}/lombok.jar);\n"
  },
  {
    "path": "buildScripts/setup.ant.xml",
    "content": "<!--\n Copyright (C) 2020-2021 The Project Lombok Authors.\n  \n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to deal\n  in the Software without restriction, including without limitation the rights\n  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  copies of the Software, and to permit persons to whom the Software is\n  furnished to do so, subject to the following conditions:\n  \n  The above copyright notice and this permission notice shall be included in\n  all copies or substantial portions of the Software.\n  \n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  THE SOFTWARE.\n-->\n<project name=\"lombok.setup\" default=\"deps\" xmlns:ivy=\"antlib:com.zwitserloot.ivyplusplus\" xmlns:unless=\"ant:unless\" basedir=\"..\">\n\t<description>\nThis buildfile is part of projectlombok.org. It sets up the build itself.\n\t</description>\n\t\n\t<!-- increment this number to force a clean of the 'build' dir -->\n\t<property name=\"build.version\" value=\"2021-03-18_001\" />\n\t\n\t<property name=\"pattern.jdk11plus\" value=\"^(\\d\\d\\d+|1[1-9]|[2-9]\\d)(\\..*)?$\" />\n\t<property name=\"ivy.retrieve.pattern\" value=\"lib/[conf]/[organisation]-[artifact].[ext]\" />\n\t<property environment=\"env\" />\n\t<available file=\"lib/ivyplusplus.jar\" property=\"ivyplusplus.available\" />\n\t\n\t<property name=\"jdk6-rt.loc\" location=\"lib/openjdk6_rt.jar\" />\n\t<property name=\"jdk8-rt.loc\" location=\"lib/openjdk8_rt.jar\" />\n\t<property name=\"rtstubs18.loc\" location=\"lib/rtstubs18.jar\" />\n\t<available file=\"${jdk6-rt.loc}\" property=\"jdk6-rt.available\" />\n\t<available file=\"${jdk8-rt.loc}\" property=\"jdk8-rt.available\" />\n\t<available file=\"${rtstubs18.loc}\" property=\"rtstubs18.available\" />\n\t<property name=\"ssh.configuration.file\" location=\"ssh.configuration\" />\n\t\n\t<property name=\"gpg.keyrings\" location=\"gpg.keyring\" />\n\t<property name=\"exe.gpg\" value=\"gpg\" />\n\t<property name=\"exe.curl\" value=\"curl\" />\n\t<property name=\"exe.git\" value=\"git\" />\n\t\n\t<condition property=\"os.supported\">\n\t\t<and>\n\t\t\t<or>\n\t\t\t\t<os family=\"unix\" />\n\t\t\t\t<os family=\"windows\" />\n\t\t\t\t<os name=\"Mac OS X\" />\n\t\t\t</or>\n\t\t\t<or>\n\t\t\t\t<os arch=\"aarch64\" />\n\t\t\t\t<os arch=\"x86-64\" />\n\t\t\t\t<os arch=\"x86_64\" />\n\t\t\t\t<os arch=\"amd64\" />\n\t\t\t</or>\n\t\t</and>\n\t</condition>\n\t<fail unless=\"os.supported\">Full eclipse testing requires downloading a native SWT binding. This script knows how to download for OS = [mac, linux, or windows] and architecture = [aarch64 or x86-64]. You have something different, you unique snowflake you. Your OS: \"${os.name}\", Your arch: \"${os.arch}\".</fail>\n\t\n\t<target name=\"-autoclean.check\">\n\t\t<available type=\"dir\" file=\"build\" property=\"existingbuild.present\" />\n\t\t<loadresource property=\"existingbuild.ver\">\n\t\t\t<first count=\"1\">\n\t\t\t\t<resources>\n\t\t\t\t\t<restrict>\n\t\t\t\t\t\t<fileset dir=\".\" includes=\"build/build-ver.txt\" />\n\t\t\t\t\t\t<exists />\n\t\t\t\t\t</restrict>\n\t\t\t\t\t<string>0</string>\n\t\t\t\t</resources>\n\t\t\t</first>\n\t\t</loadresource>\n\t\t<condition property=\"existingbuild.mismatch\">\n\t\t\t<and>\n\t\t\t\t<isset property=\"existingbuild.present\" />\n\t\t\t\t<not><equals arg1=\"${existingbuild.ver}\" arg2=\"${build.version}\" trim=\"true\" /></not>\n\t\t\t</and>\n\t\t</condition>\n\t</target>\n\t\n\t<target name=\"autoclean\" depends=\"-autoclean.check\" if=\"existingbuild.mismatch\" description=\"Checks if a change in the build or deplist neccessitates a clean\">\n\t\t<echo>build ver has been incremented, neccessitating a clean...</echo>\n\t\t<delete dir=\"build\" />\n\t</target>\n\t\n\t<target name=\"-setup.build\" depends=\"autoclean\">\n\t\t<mkdir dir=\"build\" />\n\t\t<echo file=\"build/build-ver.txt\">${build.version}</echo>\n\t</target>\n\t\n\t<target name=\"clean\" description=\"Removes all generated files.\">\n\t\t<delete dir=\"build\" quiet=\"true\" />\n\t</target>\n\t\n\t<target name=\"clean.dist\" depends=\"clean\" description=\"Deletes everything that this build script has ever generated.\">\n\t\t<delete dir=\"lib\" quiet=\"true\" />\n\t\t<delete dir=\"dist\" quiet=\"true\" />\n\t\t<delete file=\".project\" quiet=\"true\" />\n\t\t<delete file=\".classpath\" quiet=\"true\" />\n\t\t<delete dir=\".settings\" quiet=\"true\" />\n\t\t<delete dir=\".idea\" quiet=\"true\" />\n\t\t<delete file=\"lombok.iml\" quiet=\"true\" />\n\t\t<delete dir=\"ivyCache\" quiet=\"true\" />\n\t</target>\n\t\n\t<target name=\"-ipp.download\" unless=\"ivyplusplus.available\">\n\t\t<mkdir dir=\"lib\" />\n\t\t<get src=\"https://projectlombok.org/downloads/ivyplusplus.jar\" dest=\"lib/ivyplusplus.jar\" usetimestamp=\"true\" />\n\t</target>\n\t\n\t<target name=\"-ipp.load\" depends=\"-ipp.download\">\n\t\t<taskdef classpath=\"lib/ivyplusplus.jar\" resource=\"com/zwitserloot/ivyplusplus/antlib.xml\" uri=\"antlib:com.zwitserloot.ivyplusplus\" />\n\t\t<ivy:ensureippversion version=\"1.42\" property=\"ivyplusplus.minimumAvailable\" />\n\t</target>\n\t\n\t<target name=\"-ipp.redownload\" unless=\"ivyplusplus.minimumAvailable\">\n\t\t<get src=\"https://projectlombok.org/downloads/ivyplusplus.jar\" dest=\"lib/ivyplusplus.jar\" />\n\t\t<fail>A new version of ivyplusplus was required and has been downloaded. Rerun the script to continue.</fail>\n\t</target>\n\t\n\t<target name=\"ipp.setup\" depends=\"-ipp.load, -ipp.redownload\" />\n\t\n\t<target name=\"ivy.config\" depends=\"ipp.setup\" unless=\"ivy.config\">\n\t\t<ivy:configure file=\"buildScripts/ivysettings.xml\" />\n\t\t<property name=\"ivy.config\" value=\"true\" />\n\t</target>\n\t\n\t<target name=\"deps.jdk6-runtime\" unless=\"jdk6-rt.available\">\n\t\t<echo>To ensure stable builds and avoid accessing API that was not available in JDK6, most of lombok is set up to build against OpenJDK6's runtime, which will now be downloaded...</echo>\n\t\t<mkdir dir=\"lib\" />\n\t\t<get src=\"https://projectlombok.org/ivyrepo/langtools/rt-openjdk6.jar\" dest=\"${jdk6-rt.loc}\" verbose=\"true\" usetimestamp=\"true\" />\n\t</target>\n\t\n\t<target name=\"deps.jdk8-runtime\" unless=\"jdk8-rt.available\">\n\t\t<echo>To test java8, we need a java8 runtime, which will now be downloaded...</echo>\n\t\t<mkdir dir=\"lib\" />\n\t\t<get src=\"https://projectlombok.org/ivyrepo/langtools/rt-openjdk8.jar\" dest=\"${jdk8-rt.loc}\" verbose=\"true\" usetimestamp=\"true\" />\n\t</target>\n\t\n\t<target name=\"deps.rtstubs18\" unless=\"rtstubs18.available\">\n\t\t<echo>To test in eclipse, we need a java runtime, which will now be downloaded...</echo>\n\t\t<mkdir dir=\"lib\" />\n\t\t<get src=\"https://github.com/eclipse-jdt/eclipse.jdt.ui/raw/master/org.eclipse.jdt.ui.tests/testresources/rtstubs18.jar\" dest=\"${rtstubs18.loc}\" verbose=\"true\" usetimestamp=\"true\" />\n\t</target>\n\t\n\t<target name=\"deps.jdk-runtime\" depends=\"deps.jdk6-runtime, deps.jdk8-runtime\" />\n\t\n\t<target name=\"deps.custom\" depends=\"ivy.config\" description=\"Download the dependencies that comprise a configuration (from ivy.xml)\">\n\t\t<fail unless=\"deps.conf\">Supply ant with -Ddeps.conf=confname to pick the configuration you want to fetch</fail>\n\t\t<ivy:resolve file=\"buildScripts/ivy.xml\" refresh=\"true\" conf=\"${deps.conf}\" />\n\t\t<ivy:retrieve symlink=\"true\" />\n\t</target>\n\t\n\t<target name=\"deps.eclipse.oxygen\" depends=\"deps.rtstubs18, compile.support\">\n\t\t<fetchdep.eclipse.osgi name=\"oxygen\" version=\"4.7\" />\n\t</target>\n\t\n\t<target name=\"deps.eclipse.202203\" depends=\"deps.rtstubs18, compile.support\">\n\t\t<fetchdep.eclipse.osgi name=\"2022-03\" version=\"4.23\" />\n\t</target>\n\t\n\t<target name=\"deps.eclipse.202403\" depends=\"deps.rtstubs18, compile.support\">\n\t\t<fetchdep.eclipse.osgi name=\"2024-03\" version=\"4.31\" />\n\t</target>\n\t\n\t<target name=\"deps.eclipse.202503\" depends=\"deps.rtstubs18, compile.support\">\n\t\t<fetchdep.eclipse.osgi name=\"2025-03\" version=\"4.35\" />\n\t</target>\n\t\n\t<target name=\"deps.eclipse.integration\" depends=\"deps.rtstubs18, compile.support\">\n\t\t<fetchdep.eclipse.osgi name=\"I-build\" version=\"I-builds\" />\n\t</target>\n\t\n\t<macrodef name=\"fetchdep.ecj\">\n\t\t<attribute name=\"version\" />\n\t\t<sequential>\n\t\t\t<ivy:resolve file=\"buildScripts/ivy.xml\" refresh=\"true\" conf=\"ecj@{version}\" />\n\t\t\t<ivy:retrieve symlink=\"true\" />\n\t\t\t<ivy:cachepath pathid=\"cp.ecj@{version}\" conf=\"ecj@{version}\" />\n\t\t\t<property name=\"cp.ecj@{version}\" refid=\"cp.ecj@{version}\" />\n\t\t</sequential>\n\t</macrodef>\n\t\n\t<macrodef name=\"fetchdep.eclipse\">\n\t\t<attribute name=\"version\" />\n\t\t<sequential>\n\t\t\t<ivy:resolve file=\"buildScripts/ivy.xml\" refresh=\"true\" conf=\"eclipse-@{version}\" />\n\t\t\t<ivy:retrieve symlink=\"true\" />\n\t\t\t<ivy:cachepath pathid=\"cp.eclipse-@{version}\" conf=\"eclipse-@{version}\" />\n\t\t\t<property name=\"cp.eclipse-@{version}\" refid=\"cp.eclipse-@{version}\" />\n\t\t</sequential>\n\t</macrodef>\n\t\n\t<macrodef name=\"fetchdep.eclipse.osgi\">\n\t\t<attribute name=\"name\" />\n\t\t<attribute name=\"version\" />\n\t\t<sequential>\n\t\t\t<fetchdep.eclipse.updatesite name=\"@{name}\" version=\"@{version}\">\n\t\t\t\t<bundles>\n\t\t\t\t\t<!-- osgi.extender dependecies -->\n\t\t\t\t\t<arg value=\"osgi.bundle:org.apache.felix.scr\" />\n\t\t\t\t\t<arg value=\"osgi.bundle:org.apache.aries.spifly.dynamic.bundle\" />\n\t\t\t\t\t<!-- Unresolvable until we add property based dependency resolution -->\n\t\t\t\t\t<arg value=\"osgi.bundle:org.eclipse.swt.svg\" />\n\t\t\t\t\t<!-- Real dependencies -->\n\t\t\t\t\t<arg value=\"osgi.bundle:org.eclipse.jdt.core\" />\n\t\t\t\t\t<arg value=\"osgi.bundle:org.eclipse.jdt.ui\" />\n\t\t\t\t</bundles>\n\t\t\t</fetchdep.eclipse.updatesite>\n\t\t</sequential>\n\t</macrodef>\n\t\n\t<macrodef name=\"fetchdep.eclipse.updatesite\">\n\t\t<attribute name=\"target\" default=\"testenv\" />\n\t\t<attribute name=\"name\" />\n\t\t<attribute name=\"version\" />\n\t\t<attribute name=\"resolveDependencies\" default=\"true\" />\n\t\t<element name=\"bundles\" />\n\t\t<sequential>\n\t\t\t<java classname=\"lombok.eclipse.dependencies.DownloadEclipseDependencies\" failonerror=\"true\">\n\t\t\t\t<classpath>\n\t\t\t\t\t<path refid=\"cp.buildtools\" />\n\t\t\t\t\t<pathelement location=\"build/support\" />\n\t\t\t\t</classpath>\n\t\t\t\t<arg value=\"@{target}\" />\n\t\t\t\t<arg value=\"eclipse-@{name}\" />\n\t\t\t\t<arg value=\"https://download.eclipse.org/eclipse/updates/@{version}/\" />\n\t\t\t\t<arg value=\"@{resolveDependencies}\" />\n\t\t\t\t<bundles />\n\t\t\t</java>\n\t\t</sequential>\n\t</macrodef>\n\t\n\t<target name=\"deps\" depends=\"ivy.config, deps.jdk-runtime\" description=\"Downloads all dependencies needed for common tasks\">\n\t\t<ivy:resolve file=\"buildScripts/ivy.xml\" refresh=\"true\" conf=\"javac6,javac8,ecj8,build,eclipse-oxygen,mapstruct,sources,stripe,buildtools,test\" />\n\t\t<ivy:retrieve symlink=\"true\" />\n\t\t<ivy:cachepath pathid=\"cp.javac6\" conf=\"javac6\" />\n\t\t<ivy:cachepath pathid=\"cp.javac8\" conf=\"javac8\" />\n\t\t<ivy:cachepath pathid=\"cp.ecj8\" conf=\"ecj8\" />\n\t\t<ivy:cachepath pathid=\"cp.build\" conf=\"build\" />\n\t\t<ivy:cachepath pathid=\"cp.eclipse-oxygen\" conf=\"eclipse-oxygen\" />\n\t\t<ivy:cachepath pathid=\"cp.mapstruct\" conf=\"mapstruct\" />\n\t\t<ivy:cachepath pathid=\"cp.stripe\" conf=\"stripe\" />\n\t\t<ivy:cachepath pathid=\"cp.buildtools\" conf=\"buildtools\" />\n\t\t<ivy:cachepath pathid=\"cp.test\" conf=\"test\" />\n\t</target>\n\t\n\t<target name=\"-setup.mavenCentral\">\n\t\t<loadfile quiet=\"true\" failonerror=\"false\" encoding=\"UTF-8\" property=\"mavencentral.authToken\" srcfile=\"${gpg.keyrings}/mavenCentral.authToken\">\n\t\t\t<filterchain>\n\t\t\t\t<striplinebreaks />\n\t\t\t</filterchain>\n\t\t</loadfile>\n\t</target>\n\t\n\t<target name=\"test.release.version\" depends=\"-test.release.version\" />\n\t<target name=\"-test.release.version\" depends=\"version\" unless=\"skip.test.version\">\n\t\t<fail>\n\t\t\t<condition>\n\t\t\t\t<not><matches pattern=\"^.*[02468]$\" string=\"${lombok.version}\"/></not>\n\t\t\t</condition>\n\t\t\tYou need to manually sort out the changelog, and set Version.java so that the release version is an even number (and the name isn't Edgy Guinea Pig). Use -Dskip.test.version= to override.\n\t\t</fail>\n\t</target>\n\t\n\t<fail>ant needs to be at least v1.10.0 or higher to build lombok. Your version is: ${ant.version}\n\t\t<condition>\n\t\t\t<not><antversion atleast=\"1.10.0\" /></not>\n\t\t</condition>\n\t</fail>\n\t<fail>lombok must be compiled on jdk11 or later. Your version is: ${ant.java.version}\n\t\t<condition>\n\t\t\t<not><matches string=\"${ant.java.version}\" pattern=\"${pattern.jdk11plus}\" /></not>\n\t\t</condition>\n\t</fail>\n</project>\n"
  },
  {
    "path": "buildScripts/tests.ant.xml",
    "content": "<!--\n Copyright (C) 2020-2025 The Project Lombok Authors.\n  \n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to deal\n  in the Software without restriction, including without limitation the rights\n  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  copies of the Software, and to permit persons to whom the Software is\n  furnished to do so, subject to the following conditions:\n  \n  The above copyright notice and this permission notice shall be included in\n  all copies or substantial portions of the Software.\n  \n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  THE SOFTWARE.\n-->\n<project name=\"lombok.tests\" default=\"test\" xmlns:ivy=\"antlib:com.zwitserloot.ivyplusplus\" basedir=\"..\">\n\t<description>\nThis buildfile is part of projectlombok.org. It takes care of compiling and running tests.\n\t</description>\n\t\n\t<target name=\"test.formatter.compile\" depends=\"deps\">\n\t\t<mkdir dir=\"build/ant\" />\n\t\t<ivy:compile ecj=\"true\" srcdir=\"src/ant\" includes=\"**/SimpleTestFormatter.java\" destdir=\"build/ant\" source=\"1.6\" target=\"1.6\">\n\t\t\t<classpath refid=\"cp.build\" />\n\t\t\t<classpath refid=\"cp.test\" />\n\t\t</ivy:compile>\n\t</target>\n\t\n\t<target name=\"test.compile\" depends=\"deps, compile\" description=\"compiles the tests\" unless=\"skip.tests\">\n\t\t<mkdir dir=\"build/tests\" />\n\t\t<ivy:compile destdir=\"build/teststubs\" source=\"1.6\" target=\"1.6\" ecj=\"true\" nowarn=\"true\">\n\t\t\t<src path=\"test/stubs\" />\n\t\t</ivy:compile>\n\t\t<ivy:compile destdir=\"build/tests\" source=\"1.5\" target=\"1.5\" ecj=\"true\" nowarn=\"true\">\n\t\t\t<bootclasspath path=\"${jdk6-rt.loc}\" />\n\t\t\t<classpath refid=\"cp.test\" />\n\t\t\t<classpath refid=\"cp.eclipse-oxygen\" />\n\t\t\t<classpath refid=\"cp.javac6\" />\n\t\t\t<classpath refid=\"packing.basedirs.path\" />\n\t\t\t<classpath path=\"build/tests\" />\n\t\t\t<src path=\"test/core/src\" />\n\t\t\t<src path=\"test/transform/src\" />\n\t\t\t<src path=\"test/bytecode/src\" />\n\t\t\t<src path=\"test/configuration/src\" />\n\t\t</ivy:compile>\n\t\t<mkdir dir=\"build/teststubs\" />\n\t\t<ivy:compile destdir=\"build/teststubs\" source=\"1.6\" target=\"1.6\" ecj=\"true\" nowarn=\"true\">\n\t\t\t<src path=\"test/stubs\" />\n\t\t</ivy:compile>\n\t</target>\n\t\n\t<target name=\"test.eclipse.compile\" depends=\"deps.eclipse.oxygen, compile\" description=\"compiles the eclipse tests\" unless=\"skip.tests\">\n\t\t<mkdir dir=\"build/tests\" />\n\t\t<path id=\"cp.eclipse\">\n\t\t\t<fileset dir=\"testenv/eclipse-oxygen/plugins\">\n\t\t\t\t<include name=\"*.jar\" />\n\t\t\t</fileset>\n\t\t</path>\n\t\t<ivy:compile destdir=\"build/tests\" source=\"1.8\" target=\"1.8\" ecj=\"true\" nowarn=\"true\">\n\t\t\t<bootclasspath path=\"${jdk8-rt.loc}\" />\n\t\t\t<classpath refid=\"cp.eclipse\" />\n\t\t\t<classpath refid=\"cp.test\" />\n\t\t\t<classpath refid=\"cp.javac8\" />\n\t\t\t<classpath refid=\"packing.basedirs.path\" />\n\t\t\t<classpath path=\"build/tests\" />\n\t\t\t<src path=\"test/eclipse/src\" />\n\t\t</ivy:compile>\n\t</target>\n\t\n\t<target name=\"test.ecj11.call\" depends=\"deps, dist\" description=\"Runs a few ecj-specific tests\" unless=\"skip.tests\">\n\t\t<java jar=\"lib/ecj11/org.eclipse.jdt-ecj.jar\" fork=\"true\" failonerror=\"true\">\n\t\t\t<jvmarg value=\"-javaagent:dist/lombok.jar=ecj\" />\n\t\t\t<arg line=\"-source 1.6 -target 1.6 -cp dist/lombok.jar test/ecj/SimpleTest.java\" />\n\t\t</java>\n\t\t<echo>run ecj11 with a test file to confirm agent injection works: OK</echo>\n\t</target>\n\t\n\t<property name=\"test.limitmodules\">--limit-modules java.base,jdk.unsupported</property>\n\t\n\t<target name=\"test.javac6\" depends=\"test.compile, test.formatter.compile\" description=\"runs the tests on your default VM, using javac6 as underlying compiler\">\n\t\t<echo>Running TestJavac on JVM${ant.java.version}, with lowest supported javac: 1.6.</echo>\n\t\t<junit haltonfailure=\"yes\" fork=\"true\" forkmode=\"once\">\n\t\t\t<formatter classname=\"lombok.ant.SimpleTestFormatter\" usefile=\"false\" unless=\"tests.quiet\" />\n\t\t\t<classpath location=\"build/ant\" />\n\t\t\t<jvmarg value=\"-Xbootclasspath/a:${jdk6-rt.loc}\" />\n\t\t\t<jvmarg line=\"${test.limitmodules}\" />\n\t\t\t<jvmarg value=\"-Ddelombok.bootclasspath=${jdk6-rt.loc}\" />\n\t\t\t<jvmarg value=\"-Dsun.boot.class.path=${jdk6-rt.loc}\" />\n\t\t\t<classpath refid=\"cp.test\" />\n\t\t\t<classpath refid=\"cp.stripe\" />\n\t\t\t<classpath refid=\"cp.javac6\" />\n\t\t\t<classpath refid=\"packing.basedirs.path\" />\n\t\t\t<classpath location=\"build/tests\" />\n\t\t\t<classpath location=\"build/teststubs\" />\n\t\t\t<test name=\"lombok.TestJavac\" />\n\t\t</junit>\n\t</target>\n\t\n\t<target name=\"test.javac8\" depends=\"test.compile, test.formatter.compile, deps.jdk8-runtime\" description=\"runs the tests on your default VM, using javac8 as underlying compiler\">\n\t\t<echo>Running TestJavac on JVM${ant.java.version}, with javac: 1.8.</echo>\n\t\t<junit haltonfailure=\"yes\" fork=\"true\" forkmode=\"once\">\n\t\t\t<formatter classname=\"lombok.ant.SimpleTestFormatter\" usefile=\"false\" unless=\"tests.quiet\" />\n\t\t\t<jvmarg value=\"-Xbootclasspath/a:${jdk8-rt.loc}\" />\n\t\t\t<jvmarg line=\"${test.limitmodules}\" />\n\t\t\t<jvmarg value=\"-Ddelombok.bootclasspath=${jdk8-rt.loc}\" />\n\t\t\t<jvmarg value=\"-Dsun.boot.class.path=${jdk8-rt.loc}\" />\n\t\t\t<classpath location=\"build/ant\" />\n\t\t\t<classpath refid=\"cp.test\" />\n\t\t\t<classpath refid=\"cp.stripe\" />\n\t\t\t<classpath refid=\"cp.javac8\" />\n\t\t\t<classpath refid=\"packing.basedirs.path\" />\n\t\t\t<classpath location=\"build/tests\" />\n\t\t\t<classpath location=\"build/teststubs\" />\n\t\t\t<test name=\"lombok.TestJavac\" />\n\t\t</junit>\n\t</target>\n\t\n\t<macrodef name=\"test.javacX\">\n\t\t<attribute name=\"version\" />\n\t\t<sequential>\n\t\t\t<find-vm version=\"@{version}\" />\n\t\t\t<echo>Running TestJavac with JVM ${jvm.loc.@{version}}.</echo>\n\t\t\n\t\t\t<junit haltonfailure=\"yes\" fork=\"true\" forkmode=\"once\" jvm=\"${jvm.loc.@{version}}/bin/${exe.java}\">\n\t\t\t\t<formatter classname=\"lombok.ant.SimpleTestFormatter\" usefile=\"false\" unless=\"tests.quiet\" />\n\t\t\t\t<classpath location=\"build/ant\" />\n\t\t\t\t<classpath refid=\"cp.test\" />\n\t\t\t\t<classpath refid=\"cp.stripe\" />\n\t\t\t\t<classpath refid=\"packing.basedirs.path\" />\n\t\t\t\t<classpath location=\"build/tests\" />\n\t\t\t\t<classpath location=\"build/teststubs\" />\n\t\t\t\t<test name=\"lombok.TestJavac\" />\n\t\t\t</junit>\n\t\t</sequential>\n\t</macrodef>\n\t\n\t<!-- 11 is LTS -->\n\t<target name=\"test.javac11\" depends=\"test.compile, test.formatter.compile\" description=\"runs the tests on your default VM, using javac11 as underlying compiler\">\n\t\t<test.javacX version=\"11\" />\n\t</target>\n\t\n\t<!-- 17 is LTS -->\n\t<target name=\"test.javac17\" depends=\"test.compile, test.formatter.compile\" description=\"runs the tests on your default VM, using javac17 as underlying compiler\">\n\t\t<test.javacX version=\"17\" />\n\t</target>\n\t\n\t<!-- 21 is LTS -->\n\t<target name=\"test.javac21\" depends=\"test.compile, test.formatter.compile\" description=\"runs the tests on your default VM, using javac21 as underlying compiler\">\n\t\t<test.javacX version=\"21\" />\n\t</target>\n\t\n\t<!-- For non-LTS versions, feel free to aggressively update these to the current non-LTS openjdk version, and delete them once they roll out of the 6 month window. -->\n\t\n\t<!-- 24 is non-LTS, but the current release -->\n\t<target name=\"test.javac24\" depends=\"test.compile, test.formatter.compile\" description=\"runs the tests on your default VM, using javac24 as underlying compiler\">\n\t\t<test.javacX version=\"24\" />\n\t</target>\n\t\n\t<!-- 25 is LTS -->\n\t<target name=\"test.javac25\" depends=\"test.compile, test.formatter.compile\" description=\"runs the tests on your default VM, using javac25 as underlying compiler\">\n\t\t<test.javacX version=\"25\" />\n\t</target>\n\t\n\t<target name=\"test.javacCurrent\" depends=\"test.compile, test.formatter.compile\" description=\"runs the tests on your default VM, using its javac as underlying compiler\">\n\t\t<echo>Running TestJavac on JVM${ant.java.version}, with the javac built into your VM distributon.</echo>\n\t\t<junit haltonfailure=\"yes\" fork=\"true\" forkmode=\"once\">\n\t\t\t<formatter classname=\"lombok.ant.SimpleTestFormatter\" usefile=\"false\" unless=\"tests.quiet\" />\n\t\t\t<classpath location=\"build/ant\" />\n\t\t\t<classpath refid=\"cp.test\" />\n\t\t\t<classpath refid=\"cp.stripe\" />\n\t\t\t<classpath refid=\"packing.basedirs.path\" />\n\t\t\t<classpath location=\"build/tests\" />\n\t\t\t<classpath location=\"build/teststubs\" />\n\t\t\t<test name=\"lombok.TestJavac\" />\n\t\t</junit>\n\t</target>\n\t\n\t<macrodef name=\"test.eclipse-X\">\n\t\t<attribute name=\"version\" />\n\t\t<attribute name=\"compiler.compliance.level\" default=\"latest\" />\n\t\t<sequential>\n\t\t\t<condition property=\"compiler.compliance.level\" value=\"-Dcompiler.compliance.level=@{compiler.compliance.level}\" else=\"-Dnot=set\">\n\t\t\t\t<not><equals arg1=\"@{compiler.compliance.level}\" arg2=\"latest\" /></not>\n\t\t\t</condition>\n\t\t\t<echo>Running TestEclipse on eclipse-@{version} on JVM${ant.java.version}. Compiler compliance level: @{compiler.compliance.level}</echo>\n\t\t\t<junit haltonfailure=\"yes\" fork=\"true\" forkmode=\"once\">\n\t\t\t\t<formatter classname=\"lombok.ant.SimpleTestFormatter\" usefile=\"false\" unless=\"tests.quiet\" />\n\t\t\t\t<jvmarg value=\"-Xbootclasspath/a:${jdk8-rt.loc}\" />\n\t\t\t\t<jvmarg value=\"-Ddelombok.bootclasspath=${jdk8-rt.loc}\" />\n\t\t\t\t<jvmarg value=\"-javaagent:dist/lombok.jar\" />\n\t\t\t\t<jvmarg value=\"${compiler.compliance.level}\" />\n\t\t\t\t<classpath location=\"build/ant\" />\n\t\t\t\t<classpath refid=\"cp.test\" />\n\t\t\t\t<classpath refid=\"cp.stripe\" />\n\t\t\t\t<classpath refid=\"cp.eclipse-@{version}\" />\n\t\t\t\t<classpath refid=\"packing.basedirs.path\" />\n\t\t\t\t<classpath location=\"build/tests\" />\n\t\t\t\t<classpath location=\"build/teststubs\" />\n\t\t\t\t<test name=\"lombok.TestEclipse\" />\n\t\t\t</junit>\n\t\t</sequential>\n\t</macrodef>\n\t\n\t<target name=\"test.eclipse-oxygen\" depends=\"test.compile, test.formatter.compile\" description=\"runs the tests on your default VM, testing the oxygen release of eclipse\">\n\t\t<test.eclipse-X version=\"oxygen\" />\n\t</target>\n\t\n\t<target name=\"test.eclipse-202006\" depends=\"test.compile, test.formatter.compile\" description=\"runs the tests on your default VM, testing the 2020-06 release of eclipse\">\n\t\t<fetchdep.eclipse version=\"202006\" />\n\t\t<test.eclipse-X version=\"202006\" />\n\t</target>\n\t\n\t<target name=\"test.eclipse-202006-jdk8\" depends=\"test.compile, test.formatter.compile\" description=\"runs the tests on your default VM, testing the 2020-06 release of eclipse with compiler compliance level 8\">\n\t\t<fetchdep.eclipse version=\"202006\" />\n\t\t<test.eclipse-X version=\"202006\" compiler.compliance.level=\"8\" />\n\t</target>\n\t\n\t<target name=\"test.eclipse-202403\" depends=\"test.compile, test.formatter.compile\" description=\"runs the tests on your default VM, testing the 2024-03 release of eclipse\">\n\t\t<fetchdep.eclipse version=\"202403\" />\n\t\t<test.eclipse-X version=\"202403\" />\n\t</target>\n\t\n\t<target name=\"test.eclipse-202503\" depends=\"test.compile, test.formatter.compile\" description=\"runs the tests on your default VM, testing the 2025-03 release of eclipse\">\n\t\t<fetchdep.eclipse version=\"202503\" />\n\t\t<test.eclipse-X version=\"202503\" />\n\t</target>\n\t\n\t<target name=\"test.eclipse-I-build\" depends=\"test.compile, test.formatter.compile, deps.rtstubs18, compile.support\" description=\"runs the tests on your default VM, testing the latest integration build of eclipse\">\n\t\t<fetchdep.eclipse.updatesite name=\"I-build\" version=\"I-builds\" target=\"lib/\" resolveDependencies=\"false\">\n\t\t\t<bundles>\n\t\t\t\t<arg value=\"osgi.bundle:org.eclipse.core.runtime\" />\n\t\t\t\t<arg value=\"osgi.bundle:org.eclipse.jdt.core\" />\n\t\t\t\t<arg value=\"osgi.bundle:org.eclipse.jdt.ui\" />\n\t\t\t\t<arg value=\"osgi.bundle:org.eclipse.jdt.core.compiler.batch\" />\n\t\t\t\t<arg value=\"osgi.bundle:org.eclipse.equinox.common\" />\n\t\t\t\t<arg value=\"osgi.bundle:org.eclipse.equinox.registry\" />\n\t\t\t\t<arg value=\"osgi.bundle:org.eclipse.equinox.app\" />\n\t\t\t\t<arg value=\"osgi.bundle:org.eclipse.core.resources\" />\n\t\t\t\t<arg value=\"osgi.bundle:org.eclipse.core.contenttype\" />\n\t\t\t\t<arg value=\"osgi.bundle:org.eclipse.core.jobs\" />\n\t\t\t\t<arg value=\"osgi.bundle:org.eclipse.osgi\" />\n\t\t\t\t<arg value=\"osgi.bundle:org.eclipse.text\" />\n\t\t\t\t<arg value=\"osgi.bundle:org.osgi.service.prefs\" />\n\t\t\t</bundles>\n\t\t</fetchdep.eclipse.updatesite>\n\t\t<path id=\"cp.eclipse-I-build\">\n\t\t\t<fileset dir=\"lib/eclipse-I-build/plugins\">\n\t\t\t\t<include name=\"*.jar\" />\n\t\t\t</fileset>\n\t\t</path>\n\t\t<test.eclipse-X version=\"I-build\" />\n\t</target>\n\t\n\t<macrodef name=\"test.eclipse-X-full\">\n\t\t<attribute name=\"version\" />\n\t\t<sequential>\n\t\t\t<path id=\"cp.eclipse-@{version}\">\n\t\t\t\t<fileset dir=\"testenv/eclipse-@{version}/plugins\">\n\t\t\t\t\t<include name=\"*.jar\" />\n\t\t\t\t</fileset>\n\t\t\t</path>\n\t\t\t<echo>Running EclipseTests on eclipse-@{version} on JVM${ant.java.version}</echo>\n\t\t\t<condition property=\"os.specific.firstThread\" value=\"-XstartOnFirstThread\">\n\t\t\t\t<os name=\"Mac OS X\" />\n\t\t\t</condition>\n\t\t\t<!-- On Mac OS X, -XstartOnFirstThread is required, on other OSes, the JVM doesn't recognize the option. -showversion serves as a no-op -->\n\t\t\t<property name=\"os.specific.firstThread\" value=\"-showversion\" />\n\t\t\t<junit haltonfailure=\"yes\" fork=\"true\" forkmode=\"once\">\n\t\t\t\t<formatter classname=\"lombok.ant.SimpleTestFormatter\" usefile=\"false\" unless=\"tests.quiet\" />\n\t\t\t\t<jvmarg value=\"-javaagent:dist/lombok.jar\" />\n\t\t\t\t<jvmarg value=\"${os.specific.firstThread}\" />\n\t\t\t\t<jvmarg value=\"-Dlombok.testenv=testenv/eclipse-@{version}\" />\n\t\t\t\t<classpath refid=\"cp.eclipse-@{version}\" />\n\t\t\t\t<classpath location=\"build/ant\" />\n\t\t\t\t<classpath refid=\"cp.test\" />\n\t\t\t\t<classpath refid=\"cp.stripe\" />\n\t\t\t\t<classpath refid=\"cp.eclipse-@{version}\" />\n\t\t\t\t<classpath refid=\"packing.basedirs.path\" />\n\t\t\t\t<classpath location=\"build/tests\" />\n\t\t\t\t<test name=\"lombok.eclipse.EclipseTests\" />\n\t\t\t</junit>\n\t\t</sequential>\n\t</macrodef>\n\t\n\t<target name=\"test.eclipse-oxygen-full\" depends=\"test.eclipse.compile, test.formatter.compile, deps.eclipse.oxygen\" description=\"runs the full eclipse tests on your default VM, testing the oxygen release of eclipse\">\n\t\t<test.eclipse-X-full version=\"oxygen\" />\n\t</target>\n\t\n\t<target name=\"test.eclipse-202403-full\" depends=\"test.eclipse.compile, test.formatter.compile, deps.eclipse.202403\" description=\"runs the full eclipse tests on your default VM, testing the 2024-03 release of eclipse\">\n\t\t<test.eclipse-X-full version=\"2024-03\" />\n\t</target>\n\t\n\t<target name=\"test.eclipse-202503-full\" depends=\"test.eclipse.compile, test.formatter.compile, deps.eclipse.202503\" description=\"runs the full eclipse tests on your default VM, testing the 2025-03 release of eclipse\">\n\t\t<test.eclipse-X-full version=\"2025-03\" />\n\t</target>\n\t\n\t<target name=\"test.eclipse-I-build-full\" depends=\"test.eclipse.compile, test.formatter.compile, deps.eclipse.integration\" description=\"runs the full eclipse tests on your default VM, testing the latest integration build of eclipse\">\n\t\t<test.eclipse-X-full version=\"I-build\" />\n\t</target>\n\t\n\t<macrodef name=\"test.ecj-X\">\n\t\t<attribute name=\"version\" />\n\t\t<sequential>\n\t\t\t<echo>Running TestEclipse on ecj-@{version} on JVM${ant.java.version}.</echo>\n\t\t\t<junit haltonfailure=\"yes\" fork=\"true\" forkmode=\"once\">\n\t\t\t\t<formatter classname=\"lombok.ant.SimpleTestFormatter\" usefile=\"false\" unless=\"tests.quiet\" />\n\t\t\t\t<jvmarg value=\"-Xbootclasspath/a:${jdk8-rt.loc}\" />\n\t\t\t\t<jvmarg value=\"-Ddelombok.bootclasspath=${jdk8-rt.loc}\" />\n\t\t\t\t<jvmarg value=\"-javaagent:dist/lombok.jar\" />\n\t\t\t\t<classpath location=\"build/ant\" />\n\t\t\t\t<classpath refid=\"cp.test\" />\n\t\t\t\t<classpath refid=\"cp.stripe\" />\n\t\t\t\t<classpath refid=\"cp.ecj@{version}\" />\n\t\t\t\t<classpath refid=\"packing.basedirs.path\" />\n\t\t\t\t<classpath location=\"build/tests\" />\n\t\t\t\t<classpath location=\"build/teststubs\" />\n\t\t\t\t<test name=\"lombok.TestEclipse\" />\n\t\t\t</junit>\n\t\t</sequential>\n\t</macrodef>\n\t\n\t<target name=\"test.ecj11\" depends=\"test.compile, test.formatter.compile\" description=\"runs the tests on your default VM, testing the ecj11 release\">\n\t\t<fetchdep.ecj version=\"11\" />\n\t\t<test.ecj-X version=\"11\" />\n\t</target>\n\t\n\t<target name=\"test.ecj14\" depends=\"test.compile, test.formatter.compile\" description=\"runs the tests on your default VM, testing the ecj14 release\">\n\t\t<fetchdep.ecj version=\"14\" />\n\t\t<test.ecj-X version=\"14\" />\n\t</target>\n\t\n\t<target name=\"test.ecj16\" depends=\"test.compile, test.formatter.compile\" description=\"runs the tests on your default VM, testing the ecj16 release\">\n\t\t<fetchdep.ecj version=\"16\" />\n\t\t<test.ecj-X version=\"16\" />\n\t</target>\n\t\n\t<target name=\"test.ecj19\" depends=\"test.compile, test.formatter.compile\" description=\"runs the tests on your default VM, testing the ecj19 release\">\n\t\t<fetchdep.ecj version=\"19\" />\n\t\t<test.ecj-X version=\"19\" />\n\t</target>\n\t\n\t<target name=\"test\" depends=\"test.javacCurrent, test.eclipse-202503\" description=\"runs the tests against the default JVM, javac, and eclipse\" />\n\t<target name=\"test.broad\" depends=\"test.javac8, test.javac17, test.javac21, test.javac24, test.javac25, test.eclipse-oxygen, test.eclipse-202503, test.eclipse-202006-jdk8\" description=\"runs the tests against the default JVM, javac, and eclipse\" />\n</project>\n"
  },
  {
    "path": "buildScripts/vm-finder.ant.xml",
    "content": "<!--\n Copyright (C) 2020 The Project Lombok Authors.\n  \n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to deal\n  in the Software without restriction, including without limitation the rights\n  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  copies of the Software, and to permit persons to whom the Software is\n  furnished to do so, subject to the following conditions:\n  \n  The above copyright notice and this permission notice shall be included in\n  all copies or substantial portions of the Software.\n  \n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  THE SOFTWARE.\n-->\n<project name=\"lombok.vm-finder\" xmlns:ivy=\"antlib:com.zwitserloot.ivyplusplus\" basedir=\"..\">\n\t<description>\nThis buildfile is part of projectlombok.org. It contains platform specific code to find installed JVMs.\n\t</description>\n\t\n\t<available property=\"exe.java_home\" value=\"/usr/libexec/java_home\" file=\"/usr/libexec/java_home\" />\n\t<property name=\"env.SystemRoot\" value=\"C:\\Windows\" />\n\t<available property=\"exe.reg\" value=\"${env.SystemRoot}/System32/reg.exe\" file=\"${env.SystemRoot}/System32/reg.exe\" />\n\t<condition property=\"exe.java\" value=\"java.exe\" else=\"java\">\n\t\t<os family=\"windows\" />\n\t</condition>\n\t\n\t<property name=\"jvm.locations.file\" location=\"jvm.locations\" />\n\t<property prefix=\"jvm.locations\" file=\"${jvm.locations.file}\" />\n\t\n\t<target name=\"-find.vm.property\">\n\t\t<condition property=\"jvm.loc\" value=\"${jvm.loc.force}\">\n\t\t\t<and>\n\t\t\t\t<isset property=\"jvm.loc.force\" />\n\t\t\t\t<not><matches string=\"${jvm.loc.force}\" pattern=\"^\\$\\{jvm\\.locations\\.j[0-9\\.]+\\}$\" /></not>\n\t\t\t</and>\n\t\t</condition>\n\t\t<condition property=\"jvm.loc.invalid\">\n\t\t\t<and>\n\t\t\t\t<isset property=\"jvm.loc\" />\n\t\t\t\t<not><available file=\"${jvm.loc}/bin/${exe.java}\" type=\"file\" /></not>\n\t\t\t</and>\n\t\t</condition>\n\t\t<fail if=\"jvm.loc.invalid\">\n\t\t\t.\n\t\t\t\nERROR: You explicitly specified the home of JVM${find-vm.version} as: ${jvm.loc} in the ${jvm.locations.file} file.\nHowever, ${jvm.loc}/bin/${exe.java} does not exist or is not executable. Please fix the entry in jvm.locations, or delete it\nand rerun the build; this build is capable of finding VMs automatically on many platforms.\n\t\t</fail>\n\t</target>\n\t\n\t<target name=\"-find.vm.java_home\" if=\"exe.java_home\" unless=\"jvm.loc\">\n\t\t<fail unless=\"find-vm.version\">Set property find-vm.version first</fail>\n\t\t<local name=\"java_home.answer\" />\n\t\t<local name=\"java_home.result\" />\n\t\t<exec newenvironment=\"true\" executable=\"${exe.java_home}\" errorproperty=\"discard\" outputproperty=\"java_home.answer\" failifexecutionfails=\"false\" resultproperty=\"java_home.result\">\n\t\t\t<env key=\"floobargle\" value=\"FOO\" /> <!-- we do not want JAVA_HOME to be set. This requires newenvironment=\"true\" AND some sort of env value -->\n\t\t\t<arg value=\"-Fv\" />\n\t\t\t<arg value=\"${find-vm.version}\" />\n\t\t</exec>\n\t\t<condition property=\"jvm.loc\" value=\"${java_home.answer}\">\n\t\t\t<equals arg1=\"0\" arg2=\"${java_home.result}\" />\n\t\t</condition>\n\t</target>\n\t\n\t<target name=\"-find.vm.reg\" if=\"exe.reg\" unless=\"jvm.loc\">\n\t\t<fail unless=\"find-vm.version\">Set property find-vm.version first</fail>\n\t\t\n\t\t<macrodef name=\"findkey\">\n\t\t\t<attribute name=\"idx\" />\n\t\t\t<attribute name=\"key\" />\n\t\t\t<attribute name=\"regex\" />\n\t\t\t<attribute name=\"value\" />\n\t\t\t<sequential>\n\t\t\t\t<local name=\"reg.answer1.@{idx}\" />\n\t\t\t\t<local name=\"reg.result1.@{idx}\" />\n\t\t\t\t<local name=\"reg.first.@{idx}\" />\n\t\t\t\t<local name=\"reg.answer2.@{idx}\" />\n\t\t\t\t<local name=\"reg.result2.@{idx}\" />\n\t\t\t\t<exec executable=\"${exe.reg}\" errorproperty=\"discard\" outputproperty=\"reg.answer1.@{idx}\" failifexecutionfails=\"false\" resultproperty=\"reg.result1.@{idx}\">\n\t\t\t\t\t<arg value=\"query\" />\n\t\t\t\t\t<arg value=\"@{key}\" />\n\t\t\t\t\t<arg value=\"/f\" />\n\t\t\t\t\t<arg value=\"${find-vm.version}\"/>\n\t\t\t\t\t<arg value=\"/k\" />\n\t\t\t\t</exec>\n\t\t\t\t\n\t\t\t\t<loadresource property=\"reg.first.@{idx}\">\n\t\t\t\t\t<propertyresource name=\"reg.answer1.@{idx}\" />\n\t\t\t\t\t<filterchain>\n\t\t\t\t\t\t<tokenfilter>\n\t\t\t\t\t\t\t<containsregex flags=\"i\" pattern=\"@{regex}\" replace=\"\\1\" />\n\t\t\t\t\t\t\t<trim />\n\t\t\t\t\t\t\t<ignoreblank />\n\t\t\t\t\t\t</tokenfilter>\n\t\t\t\t\t\t<headfilter lines=\"1\" />\n\t\t\t\t\t\t<striplinebreaks />\n\t\t\t\t\t</filterchain>\n\t\t\t\t</loadresource>\n\t\t\t\t<exec executable=\"${exe.reg}\" errorproperty=\"discard\" outputproperty=\"reg.answer2.@{idx}\" failifexecutionfails=\"false\" resultproperty=\"reg.result2.@{idx}\">\n\t\t\t\t\t<arg value=\"query\" />\n\t\t\t\t\t<arg value=\"${reg.first.@{idx}}\" />\n\t\t\t\t\t<arg value=\"/s\" />\n\t\t\t\t\t<arg value=\"/f\" />\n\t\t\t\t\t<arg value=\"@{value}\" />\n\t\t\t\t\t<arg value=\"/v\" />\n\t\t\t\t\t<arg value=\"@{value}\" />\n\t\t\t\t</exec>\n\t\t\t\t<loadresource property=\"jvm.loc\">\n\t\t\t\t\t<propertyresource name=\"reg.answer2.@{idx}\" />\n\t\t\t\t\t<filterchain>\n\t\t\t\t\t\t<tokenfilter>\n\t\t\t\t\t\t\t<trim />\n\t\t\t\t\t\t\t<containsregex flags=\"i\" pattern=\"\\s*@{value}\\s*REG_SZ\\s*(.*)$\" replace=\"\\1\" />\n\t\t\t\t\t\t\t<ignoreblank />\n\t\t\t\t\t\t</tokenfilter>\n\t\t\t\t\t\t<headfilter lines=\"1\" />\n\t\t\t\t\t\t<striplinebreaks />\n\t\t\t\t\t</filterchain>\n\t\t\t\t</loadresource>\n\t\t\t</sequential>\n\t\t</macrodef>\n\t\t\n\t\t<findkey idx=\"1\" key=\"hklm\\Software\\AdoptOpenJDK\\JDK\" value=\"Path\"\n\t\t\tregex=\"\\s*(HKEY.*\\\\AdoptOpenJDK\\\\JDK\\\\${find-vm.version}(?:\\.\\S*)?)\\s*$\" />\n\t\t<findkey idx=\"2\" key=\"hklm\\Software\\JavaSoft\\Java Development Kit\" value=\"JavaHome\"\n\t\t\tregex=\"\\s*(HKEY.*\\\\JavaSoft\\\\Java Development Kit\\\\${find-vm.version}(?:\\.\\S*)?)\\s*$\" />\n\t</target>\n\t\n\t<target name=\"-find.vm.ask\" unless=\"jvm.loc\">\n\t\t<fail unless=\"find-vm.version\">Set property find-vm.version first</fail>\n\t\t<echo>A JVM${find-vm.version} is required to run the request tests.</echo>\n\t\t<echo>this script can automatically find VMs on mac and windows but did not find a suitable VM.</echo>\n\t\t<input message=\"Enter the full path to JVM${find-vm.version}:\" addproperty=\"jvm.loc\" />\n\t\t<condition property=\"jvm.loc.aborted\">\n\t\t\t<matches pattern=\"^\\s*$\" string=\"${jvm.loc}\" />\n\t\t</condition>\n\t\t<fail if=\"jvm.loc.aborted\">aborted</fail>\n\t\t<fail if=\"jvm.loc.invalid\">.\n\nERROR: That does not appear to be a valid location; ${jvm.loc}/bin/${exe.java} should exist.\n\t\t\t<condition>\n\t\t\t\t<not><available file=\"${jvm.loc}/bin/${exe.java}\" type=\"file\" /></not>\n\t\t\t</condition>\n\t\t</fail>\n\t\t<exec executable=\"${jvm.loc}/bin/${exe.java}\" errorproperty=\"jvm.versioncheck.answer\" failifexecutionfails=\"false\" resultproperty=\"jvm.versioncheck.result\">\n\t\t\t<arg value=\"-version\" />\n\t\t</exec>\n\t\t<fail>\n\t\t\tThat does not appear to be a valid JVM${find-vm.version} - perhaps it isn't the right version?\n\t\t\t<condition>\n\t\t\t\t<not><and>\n\t\t\t\t\t<equals arg1=\"${jvm.versioncheck.result}\" arg2=\"0\" />\n\t\t\t\t\t<contains string=\"${jvm.versioncheck.answer}\" substring=\"version &quot;${find-vm.version}\" />\n\t\t\t\t</and></not>\n\t\t\t</condition>\n\t\t</fail>\n\t\t<propertyfile file=\"${jvm.locations.file}\" comment=\"Locations of various JVMs to be used to run lombok tests if targeting specific versions.\">\n\t\t\t<entry key=\"j${find-vm.version}\" value=\"${jvm.loc}\" />\n\t\t</propertyfile>\n\t\t<echo>Your choice of VM has been written to ${jvm.locations.file} and will be remembered for future invocations.</echo>\n\t</target>\n\t\n\t<target name=\"-find.vm.save\" if=\"jvm.loc\">\n\t\t<mkdir dir=\"build\" />\n\t\t<echo file=\"build/vmloc.${find-vm.version}.tmp\" message=\"${jvm.loc}\" />\n\t</target>\n\t\n\t<target name=\"-find.vm\" depends=\"-find.vm.property, -find.vm.java_home, -find.vm.reg, -find.vm.ask, -find.vm.save\">\n\t\t<fail unless=\"jvm.loc\">JVM ${find-vm.version} cannot be found</fail>\n\t</target>\n\t\n\t<macrodef name=\"find-vm\">\n\t\t<attribute name=\"version\" />\n\t\t<sequential>\n\t\t\t<delete quiet=\"true\" file=\"build/vmloc.@{version}.tmp\" />\n\t\t\t<antcall target=\"-find.vm\">\n\t\t\t\t<param name=\"find-vm.version\" value=\"@{version}\" />\n\t\t\t\t<param name=\"jvm.loc.force\" value=\"${jvm.locations.j@{version}}\" />\n\t\t\t</antcall>\n\t\t\t<loadfile property=\"jvm.loc.@{version}\" failonerror=\"true\" srcFile=\"build/vmloc.@{version}.tmp\" />\n\t\t\t<delete quiet=\"true\" file=\"build/vmloc.@{version}.tmp\" />\n\t\t</sequential>\n\t</macrodef>\n</project>\n"
  },
  {
    "path": "buildScripts/website.ant.xml",
    "content": "<!--\n  Copyright (C) 2020-2023 The Project Lombok Authors.\n  \n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to deal\n  in the Software without restriction, including without limitation the rights\n  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  copies of the Software, and to permit persons to whom the Software is\n  furnished to do so, subject to the following conditions:\n  \n  The above copyright notice and this permission notice shall be included in\n  all copies or substantial portions of the Software.\n  \n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  THE SOFTWARE.\n-->\n<project name=\"lombok-website\" basedir=\"..\" default=\"website\" xmlns:ivy=\"antlib:com.zwitserloot.ivyplusplus\">\n\t<description>\nThis buildfile is part of projectlombok.org. It is responsible for building the website and all website-related aspects,\nsuch as applying the templates to produce the website, converting the changelog into HTML, and creating javadoc.\n\t</description>\n\t\n\t<property name=\"web.root\" value=\"https://projectlombok.org/\" />\n\t<property name=\"SNIPPET_TAB_STOP\" value=\"2\" />\n\t\n\t<target name=\"-website.clean\">\n\t\t<delete dir=\"build/website\" quiet=\"true\" />\n\t</target>\n\t\n\t<!-- Fetches the current (latest) lombok available from projectlombok.org, tracking this 'latest available version' in ant properties -->\n\t<target name=\"-website.fetch-version\" depends=\"compile.support\">\n\t\t<java classname=\"lombok.website.FetchCurrentVersion\" outputproperty=\"lombok.version.live\" failonerror=\"true\">\n\t\t\t<classpath>\n\t\t\t\t<path refid=\"cp.buildtools\" />\n\t\t\t\t<pathelement location=\"build/support\" />\n\t\t\t</classpath>\n\t\t\t<arg value=\"${web.root}\" />\n\t\t\t<arg value=\"base\" />\n\t\t</java>\n\t\t<java classname=\"lombok.website.FetchCurrentVersion\" outputproperty=\"lombok.fullversion.live\" failonerror=\"true\">\n\t\t\t<classpath>\n\t\t\t\t<path refid=\"cp.buildtools\" />\n\t\t\t\t<pathelement location=\"build/support\" />\n\t\t\t</classpath>\n\t\t\t<arg value=\"${web.root}\" />\n\t\t\t<arg value=\"full\" />\n\t\t</java>\n\t</target>\n\t\n\t<target name=\"website.print-live-version\" depends=\"-website.fetch-version\" description=\"Print the current version of lombok available from projectlombok.org\">\n\t\t<echo>Live version: ${lombok.version.live}</echo>\n\t\t<echo>Live full versionstring : ${lombok.fullversion.live}</echo>\n\t</target>\n\t\n\t<target name=\"changelog.build\" depends=\"version, deps, compile.support\" description=\"Turns the current changelog (doc/changelog.markdown) into HTML\">\n\t\t<mkdir dir=\"build/website\" />\n\t\t<java classname=\"lombok.website.WebsiteMaker\" failonerror=\"true\">\n\t\t\t<classpath>\n\t\t\t\t<path refid=\"cp.buildtools\" />\n\t\t\t\t<pathelement location=\"build/support\" />\n\t\t\t</classpath> \n\t\t\t<arg value=\"${web.root}\" />\n\t\t\t<arg value=\"${lombok.version}\" />\n\t\t\t<arg value=\"${lombok.fullversion}\" />\n\t\t\t<arg value=\"changelog\" />\n\t\t</java>\n\t</target>\n\t\n\t<macrodef name=\"website.make\">\n\t\t<attribute name=\"version\" />\n\t\t<attribute name=\"fullversion\" />\n\t\t<attribute name=\"cmd\" />\n\t\t<sequential>\n\t\t\t<mkdir dir=\"build/website\" />\n\t\t\t<copy todir=\"build/website\">\n\t\t\t\t<fileset dir=\"website/resources\" />\n\t\t\t\t<fileset dir=\".\" includes=\"LICENSE\" />\n\t\t\t</copy>\n\t\t\t\n\t\t\t<java classname=\"lombok.website.WebsiteMaker\" failonerror=\"true\">\n\t\t\t\t<classpath>\n\t\t\t\t\t<path refid=\"cp.buildtools\" />\n\t\t\t\t\t<pathelement location=\"build/support\" />\n\t\t\t\t</classpath>\n\t\t\t\t<arg value=\"${web.root}\" />\n\t\t\t\t<arg value=\"@{version}\" />\n\t\t\t\t<arg value=\"@{fullversion}\" />\n\t\t\t\t<arg value=\"@{cmd}\" />\n\t\t\t</java>\n\t\t</sequential>\n\t</macrodef>\n\t\n\t<target name=\"website.release-build\" depends=\"version, -website.clean, javadoc.build, compile.support\">\n\t\t<website.make version=\"${lombok.version}\" fullversion=\"${lombok.fullversion}\" cmd=\"all-newrelease\" />\n\t</target>\n\t\n\t<target name=\"website.build\" depends=\"-website.fetch-version, -website.clean, compile.support\" description=\"Builds the website based on current live version\">\n\t\t<website.make version=\"${lombok.version.live}\" fullversion=\"${lombok.fullversion.live}\" cmd=\"all\" />\n\t</target>\n\t\n\t<target name=\"website.open\" depends=\"website.build, compile.support\" description=\"Builds the website, then serves it locally, opening a browser.\">\n\t\t<local name=\"dir.build.website\" />\n\t\t<property name=\"dir.build.website\" location=\"build/website\" />\n\t\t<java classname=\"lombok.website.RunSite\" failonerror=\"true\">\n\t\t\t<classpath>\n\t\t\t\t<path refid=\"cp.buildtools\" />\n\t\t\t\t<pathelement location=\"build/support\" />\n\t\t\t</classpath>\n\t\t\t<arg value=\"${dir.build.website}\" />\n\t\t\t<arg value=\"open\" />\n\t\t</java>\n\t</target>\n\t\n\t<target name=\"website.print-all-versions\" depends=\"compile.support\">\n\t\t<java classname=\"lombok.website.WebsiteMaker\" failonerror=\"true\">\n\t\t\t<classpath>\n\t\t\t\t<path refid=\"cp.buildtools\" />\n\t\t\t\t<pathelement location=\"build/support\" />\n\t\t\t</classpath>\n\t\t\t<arg value=\"${web.root}\" />\n\t\t\t<arg value=\"1\" />\n\t\t\t<arg value=\"1\" />\n\t\t\t<arg value=\"print-allversions\" />\n\t\t</java>\n\t</target>\n\t\n\t<target name=\"-website.init-hostgit\">\n\t\t<property name=\"loc.hostingGit\" location=\"../website-cloudflare\" />\n\t\t<fail>\n\t\t\tYou need the website-cloudflare repo as a sibling to your lombok repo to publish the website.\n\t\t\t<condition>\n\t\t\t\t<not><available file=\"${loc.hostingGit}/.git\" /></not>\n\t\t\t</condition>\n\t\t</fail>\n\t</target>\n\t\n\t<target name=\"-website.copyto-hostgit\">\n\t\t<sync todir=\"${loc.hostingGit}/website\">\n\t\t\t<fileset dir=\"build/website\" />\n\t\t</sync>\n\t</target>\n\t\n\t<target name=\"-website.pull-hostgit\" depends=\"deps, -website.init-hostgit\">\n\t\t<exec executable=\"${exe.git}\" failonerror=\"true\" dir=\"${loc.hostingGit}\">\n\t\t\t<arg value=\"pull\" />\n\t\t</exec>\n\t</target>\n\t\n\t<target name=\"-website.commit-and-push-hostgit\">\n\t\t<exec executable=\"${exe.git}\" failonerror=\"true\" dir=\"${loc.hostingGit}\">\n\t\t\t<arg value=\"add\" />\n\t\t\t<arg value=\"-A\" />\n\t\t</exec>\n\t\t<exec executable=\"${exe.git}\" failonerror=\"true\" dir=\"${loc.hostingGit}\">\n\t\t\t<arg value=\"commit\" />\n\t\t\t<arg value=\"-m\" />\n\t\t\t<arg value=\"website update\" />\n\t\t</exec>\n\t\t<exec executable=\"${exe.git}\" failonerror=\"true\" dir=\"${loc.hostingGit}\">\n\t\t\t<arg value=\"push\" />\n\t\t</exec>\n\t</target>\n\t\n\t<target name=\"website.publish\" depends=\"-website.pull-hostgit, website.build, -website.copyto-hostgit\" description=\"Builds the website and copies it to the git repo serving as source for the cloudflare-hosted projectlombok.org site\">\n\t\t<antcall target=\"-website.commit-and-push-hostgit\" />\n\t</target>\n\t\n\t<target name=\"website.release-publish\" depends=\"dist, -website.pull-hostgit, website.release-build, -website.copyto-hostgit\" description=\"Builds the website and copies it to the git repo serving as source for the cloudflare-hosted projectlombok.org site\">\n\t\t<sync todir=\"${loc.hostingGit}/api\">\n\t\t\t<fileset dir=\"doc/api\" />\n\t\t</sync>\n\t\t<echo file=\"${loc.hostingGit}/CURRENT_VERSION\">${lombok.version}</echo>\n\t\t<copy file=\"dist/lombok-${lombok.version}.jar\" todir=\"${loc.hostingGit}/releases\" />\n\t\t<antcall target=\"-website.commit-and-push-hostgit\" />\n\t</target>\n\t\n\t<target name=\"javadoc.build\" description=\"Generates the javadoc\" depends=\"version, compile\" unless=\"skip.javadoc\">\n\t\t<delete dir=\"build/api\" quiet=\"true\" />\n\t\t<delete dir=\"doc/api\" quiet=\"true\" />\n\t\t<mkdir dir=\"build/api\" />\n\t\t<property name=\"javadoc.overview.html\" location=\"build/javadoc.overview.html\" />\n\t\t<echo file=\"${javadoc.overview.html}\"><![CDATA[<html><body>\n\t\t\tWelcome to the lombok javadoc.&nbsp;If you're just looking to learn more about using lombok\n\t\t\tYou probably want to look at <a href=\"https://projectlombok.org/features/all\">the feature documentation</a>.&nbsp;Otherwise,\n\t\t\tcheck the <a href=\"lombok/package-summary.html\">lombok</a> package.&nbsp;If you're trying to extend lombok or\n\t\t\twrite your own plugins, the other packages are what you're looking for.</body></html>\n\t\t]]></echo>\n\t\t<tstamp>\n\t\t\t<format property=\"javadoc.year\" pattern=\"yyyy\" />\n\t\t</tstamp>\n\t\t<javadoc sourcepath=\"src/core\" defaultexcludes=\"yes\" destdir=\"build/api\" windowtitle=\"Lombok\" source=\"1.8\" Overview=\"${javadoc.overview.html}\">\n\t\t\t<package name=\"lombok\" />\n\t\t\t<package name=\"lombok.experimental\" />\n\t\t\t<package name=\"lombok.extern.*\" />\n\t\t\t<classpath location=\"build/lombok-main\" />\n\t\t\t<classpath location=\"build/lombok-utils\" />\n\t\t\t<header><![CDATA[<a href='https://projectlombok.org/' target='_blank'>Lombok</a> - ]]>v${lombok.version}</header>\n\t\t\t<bottom><![CDATA[<i>Copyright &copy; 2009-${javadoc.year} The Project Lombok Authors, licensed under the <a href='http://www.opensource.org/licenses/mit-license.php' target='_blank'>MIT licence</a>.</i>]]></bottom>\n\t\t</javadoc>\n\t\t<!-- bugfix for boneheaded javadoc bug where ?is-external=true is inserted before an anchor ref, breaking the anchor ref.\n\t\tis-external=true doesn't actually do anything except mess with titles, so, we'll just get rid of it. -->\n\t\t<replaceregexp match=\"\\?is-external=true#\" replace=\"#\" flags=\"gi\">\n\t\t\t<fileset dir=\"build/api\" includes=\"**/*.html\" />\n\t\t</replaceregexp>\n\t\t<mkdir dir=\"doc/api\" />\n\t\t<copy todir=\"doc/api\">\n\t\t\t<fileset dir=\"build/api\" includes=\"**/*.html\" />\n\t\t\t<filterchain>\n\t\t\t\t<linecontainsregexp negate=\"true\">\n\t\t\t\t\t<regexp pattern=\"(Generated by javadoc)|(.META NAME=.date.)|(meta name=.dc.created.)\" />\n\t\t\t\t</linecontainsregexp>\n\t\t\t</filterchain>\n\t\t</copy>\n\t\t<copy todir=\"doc/api\">\n\t\t\t<fileset dir=\"build/api\" includes=\"**/*.css\" />\n\t\t\t<filterchain>\n\t\t\t\t<linecontainsregexp negate=\"true\">\n\t\t\t\t\t<regexp pattern=\"@import.*dejavu.css.*\" />\n\t\t\t\t</linecontainsregexp>\n\t\t\t</filterchain>\n\t\t</copy>\n\t\t<copy todir=\"doc/api\">\n\t\t\t<fileset dir=\"build/api\">\n\t\t\t\t<exclude name=\"**/*.html\" />\n\t\t\t\t<exclude name=\"**/*.css\" />\n\t\t\t</fileset>\n\t\t</copy>\n\t\t<echo append=\"true\" file=\"doc/api/module-search-index.js\"></echo>\n\t\t<echo append=\"true\" file=\"doc/api/tag-search-index.js\"></echo>\n\t</target>\n\t\n\t<target name=\"latest-changes.build\" depends=\"compile.support, version\" description=\"Creates the latest changes HTML file from the markdown in doc/changelog\">\n\t\t<mkdir dir=\"build/website\" />\n\t\t<java classname=\"lombok.website.WebsiteMaker\" failonerror=\"true\">\n\t\t\t<classpath>\n\t\t\t\t<path refid=\"cp.buildtools\" />\n\t\t\t\t<pathelement location=\"build/support\" />\n\t\t\t</classpath>\n\t\t\t<arg value=\"${web.root}\" />\n\t\t\t<arg value=\"${lombok.version}\" />\n\t\t\t<arg value=\"${lombok.fullversion}\" />\n\t\t\t<arg value=\"changelog-latest\" />\n\t\t\t<arg value=\"website\" />\n\t\t\t<arg value=\"build/latestchanges.html\" />\n\t\t</java>\n\t</target>\n\t\n\t<target name=\"release.pack\" depends=\"dist, website.release-build\">\n\t\t<tar destfile=\"dist/website-release.tar.bz2\" compression=\"bzip2\">\n\t\t\t<tarfileset dir=\"dist\" includes=\"lombok-${lombok.version}.jar\" prefix=\"downloads/\" />\n\t\t\t<tarfileset dir=\"dist\" includes=\"lombok-${lombok.version}.jar\" fullpath=\"downloads/lombok.jar\" />\n\t\t\t<tarfileset dir=\"dist\" includes=\"lombok-${lombok.version}.jar\" fullpath=\"lombok-edge.jar\" />\n\t\t\t<tarfileset dir=\"build/website\" includes=\"all-versions.html,download.html,download-edge.html\" />\n\t\t</tar>\n\t</target>\n\t\n\t<target name=\"release.publish\" depends=\"-test.release.version, maven, website.release-publish, eclipsep2.publish, maven.publish, -edge.publish\" description=\"Deploys a new official lombok release everywhere: maven, website, p2 site\" />\n\t\n\t<target name=\"edge.website\" depends=\"compile.support, version, dist\">\n\t\t<delete quiet=\"true\" file=\"build/website/download-edge.html\" />\n\t\t<mkdir dir=\"build/website-edge\" />\n\t\t<java classname=\"lombok.website.WebsiteMaker\" failonerror=\"true\">\n\t\t\t<classpath>\n\t\t\t\t<path refid=\"cp.buildtools\" />\n\t\t\t\t<pathelement location=\"build/support\" />\n\t\t\t</classpath>\n\t\t\t<arg value=\"${web.root}\" />\n\t\t\t<arg value=\"${lombok.version}\" />\n\t\t\t<arg value=\"${lombok.fullversion}\" />\n\t\t\t<arg value=\"download-edge\" />\n\t\t\t<arg value=\"website\" />\n\t\t\t<arg value=\"build/website-edge/download-edge.html\" />\n\t\t</java>\n\t</target>\n\t\n\t<target name=\"-edge.website.tohost\" depends=\"edge.website, -website.init-hostgit, -website.pull-hostgit\">\n\t\t<copy file=\"build/website-edge/download-edge.html\" todir=\"${loc.hostingGit}/website\" />\n\t</target>\n\t\t\n\t<target name=\"-edge.website.publish\" depends=\"-edge.website.tohost, -website.commit-and-push-hostgit\" />\n\t\n\t<target name=\"edge.publish\" depends=\"-edge.website.publish, -edge.publish\" description=\"Builds an edge release, sends it to the projectlombok.org server and deploys it by updating the download-edge link\" />\n\t\n\t<target name=\"-edge.publish\" depends=\"dist, maven.edge\">\n\t\t<copy file=\"dist/lombok-${lombok.version}.jar\" tofile=\"build/edge-releases/lombok-edge.jar\" />\n\t\t<java classname=\"lombok.publish.PublishToBucket\" failonerror=\"true\">\n\t\t\t<classpath>\n\t\t\t\t<path refid=\"cp.buildtools\" />\n\t\t\t\t<pathelement location=\"build/support\" />\n\t\t\t</classpath>\n\t\t\t<arg value=\"${gpg.keyrings}/s3_creds.txt\" />\n\t\t\t<arg value=\"build/edge-releases\" />\n\t\t\t<arg value=\"edge\" />\n\t\t\t<arg value=\"true\" />\n\t\t</java>\n\t\t<exec executable=\"/usr/bin/git\" failonerror=\"true\">\n\t\t\t<arg value=\"merge-base\" />\n\t\t\t<arg value=\"--is-ancestor\" />\n\t\t\t<arg value=\"edge\" />\n\t\t\t<arg value=\"master\" />\n\t\t</exec>\n\t\t<exec executable=\"/usr/bin/git\">\n\t\t\t<arg value=\"branch\" />\n\t\t\t<arg value=\"-f\" />\n\t\t\t<arg value=\"edge\" />\n\t\t\t<arg value=\"master\" />\n\t\t</exec>\n\t\t<exec executable=\"/usr/bin/git\">\n\t\t\t<arg value=\"push\" />\n\t\t\t<arg value=\"origin\" />\n\t\t\t<arg value=\"edge:refs/heads/edge\" />\n\t\t</exec>\n\t</target>\n</project>\n"
  },
  {
    "path": "doc/.gitignore",
    "content": "api\n\n"
  },
  {
    "path": "doc/PlannedExtensions.txt",
    "content": "Planned lombok features\n=======================\n\n## more hooks\n\nThe parse and compilation process looks roughly like this:\n\n* raw text\n* list of tokens\n* Abstract Syntax Tree\n* Bound AST (a.k.a. LST)\n* bytecode\n* file on disk\n\nCurrently lombok hooks right after the AST is built. It would be nice if you can also hook post binding,\nfor modifying how types work. That way you could for example add a 'sort' method to List, or some such.\n\nIt would also be nice if lombok can hook right after the bytecode is built, so bytecode-level rewriters such\nas generators can have a go, as well as cleanup some of the work lombok did in an earlier phase (such as just\nreplacing try { /* block */ } catch ( Throwable t ) { throw sneakyThow(t); } with just 'block' - on the JVM\nlevel it boils down to the same thing in faster and smaller code.\n\nIt may even be interesting to hook into the parser right at the raw text phase, not to modify the raw text,\nbut to add more tokens and tree building primitives to the parser, such as closures, but that would probably\nbe extremely complicated.\n\n## Package level annotations and world awareness\n\nLombok cannot currently figure out where sibling source files are, and it cannot for example find package-info.java or\nmodule-info.java (looking ahead to java7). Package-level or module-level annotations to enable or disable certain\nbehaviours would probably be nice to be able to do. Javac has the filer, and eclipse has the IProject, so we ought to\nbe able to hack something together.\n\nTo hook after bytecode generation in javac:\ncom.sun.tools.javac.jvm.ClassWriter.writeClassFile(OutputStream out, ClassSymbol c) - hack the one line where out.write() is called.\n\n\n## Netbeans support\n\nNetbeans uses a slightly modified version of javac internally. This version seems compatible with everything\nthe lombok.javac package does, however it is started specifically without annotation processors which is why\nlombok can't hook into netbeans that way. Using an agent failed because somehow the agent stops getting called on\nto instrument class files. Possibly netbeans is starting a new JVM under the hood and we need to instrument THAT\ncall to add our agent? We may have to look into how netbeans' classloading works and hook there to load modified classes.\n\n## IDEA support\n\nIt's not open source and I've heard that they don't use javac under the hood but some sort of ANTLR based parser.\nIf that is true, IDEA will need a dedicated lombok/IDEA aficionado to write and maintain an IDEA version of lombok,\nbecause that's far too much effort for Roel or Reinier, who don't own an IDEA copy and weren't planning to switch IDEs.\n\nPlanned transformations\n=======================\n\n## @Property\n\nBasic needs:\n - generate a getter and a setter. The setter needs to fire notification handlers.\n - bind 2 properties together, with an optional value mapper. The utility of binding with mapping is too low to consider\n  that 'too complicated, just write it out' territory. Note that conversion is 2-way, the slew of Mapping interfaces in\n  functionaljava and similar libraries are all one-way.\n - add/remove a property change listeners.\n - optional: Support an 'invalid' state. Any 'get' operation must first update (re-validate) the value. This way\n   properties backed by expensive operations can be lazily queried.\n\n### JSR295 and JGoodies binding\n\nJSR295 has a Property class that is capable of getting/setting/notifying for a wide range of string-based\nproperties, which seems like needlessly dumb design (Never use (non-compile-time checked) string literals for this stuff!)\nBeing compatible with it can be done if specifically asked for, but using that as the default seems like a bad idea.\nJSR295 seems like it won't make it into java7.\n\nString literals completely eliminate the ability to have some sort of static type checking for the actual type of\nobject that you need to set/get, and for properties that only expose one value, this string is usually ignored, and\nignored variables are an obvious indicator of bad API design.\n\nJGoodies binding has made the similar fatal mistake of using a string literal.\n\n### JavaFX binding\n\nSee [Hacking JavaFX Binding](http://today.java.net/pub/a/today/2009/06/02/hacking-javafx-binding.html) for source on this info.\n\nSee also [FishEye browser for the JavaFX's com.sun.javafx.runtime.location package](http://fisheye4.atlassian.com/browse/openjfx-compiler/trunk/src/share/classes/com/sun/javafx/runtime/location)\n\nJavaFX actually uses `$foo` as a field that holds a Location object (JavaFX's take on properties).\n\nIn JavaFX's internals, a property is called a Location, and it has the methods:\n* `isMutable()`\n* `isValid()` / `invalidate()` / `update()`\n* `addChangeListener()` / `removeChangeListener()`\n\nThe actual set and get methods are implemented via dynamically generated subtypes, in order for the return/param type\non the methods to be properly typed. These methods also have unique names; the `IntVariable` class has methods named\n`getAsInt()` and `setAsInt(int)` for example. Each type comes in `xxxConstant` and `xxxVariable` variants, for\nmutable and immutable. Having an immutable property in java seems overkill. Change\n\nChangeListener just contains an onChange() method; the listener is evidently supposed to both hold a reference to\nthe actual Location to get the change/interact, AND to be registered on only one Location as there's no way to\ndifferentiate the onChange() calls if you're listening to more than 1 property. There's also a getDependencyKind()\nmethod which seems more related to JavaFX's internal workings. There are generated unique subclasses per type which\nadd more methods to do retrieval.\n\nUsing this system directly also seems problematic:\n\n* All this auto-generation really isn't helping - lombok is a compile-time device. We'd have to roll specific subclasses.\n* There's quite a bit of javafx-specific stuff going on which we'd have to leave blank.\n* This is all in a com.sun.javafx.runtime.location package.\n\nHowever, we could use it as inspiration, and strive to be as API compatible with it as seems reasonable, without of\ncourse the package name. At some point we might introduce a module/package level annotation to state that all lombok\nproperties need to be generated as JavaFX properties.\n\n\n\n\n\n## @Generator\n\nThere are bytecode rewriters out there, though technically it may be possible to do this on the source level.\nThe idea behind @Generator is that all method local state is retained when you return, so this:\n\n    @Generator public int return0Through9() {\n        for ( int i = 0 ; i < 10 ; i++ ) return i;\n    }\n\nwould actually do what it says, instead of returning 0 every time you call it.\n\nThe return type should probably be `Iterable<Integer>` instead, which would work well with a source-level rewrite.\nbytecode rewrite based generators use a superclass type named 'Generator' and use this to support a method that returns X,\nbut which when called from the outside returns Iterable<X>.\n\n## @Finalizer\n\nCreates a new unique (serializable?) anonymous inner class based object that has a finalizer which will call the\nannotated method.\n\n# Maybes:\n\n## @RunInEDT\n\nAutomatically wraps the method in a SwingUtilities.invoke(andWait/later).\n\n## @SaneEquals\n\nFinds all instances of `a == b` where both a and b are non-primitive types, and replaces it with:\n`a == null ? b == null : a.equals(b)` - this is dangerous new territory where we change the semantics of legal\njava code into different java code, but it is admittedly a lot more useful than what `a == b` does now.\n\n## List Comprehensions\n\nSomething like:\n\n    List<Integer> lengths = build; for ( String s : list ) toInt().filter(s != null).select(s.length());\n\nissues: Ugly; what happens if you use 'for' as an expression? Does the AST still contain a ForStatement, or\ndoes the parser just give up at that point?\n\nCan the toInt() bit be eliminated somehow, inferencing the type from the parameter in s.length()?\n\nAuto-formatters will screw this up.\n\nThe biggest advantage of list comprehensions is that you can use them in-place as an expression instead of adding\na bunch of code lines to first create a new list and then fill it. However, the above is only going to work when\nassigning to a new variable, which defeats a lot of the purpose!\n\n## Dodge access restrictions (call method private stuff, recompile to reflection).\n\nAn annotation on a local variable declaration or field that states that any method calls to non-accessible methods\ngets rewritten to reflective calls. Would require knowledge of the dependencies which lombok does not currently have.\n\n## @ReturnThis\n\nEnforces that 'this' is returned, or if missing, adds 'return this' to the end of the method and any return statements.\nFiguring out where to put statements is _very_ hard, because sticking a 'return this;' at the end of a method that consists\nof an endless while loop is illegal java code (unreachable code), and without auto-generating the 'return this' statements,\nthe utility of this annotation seems too low to bother with it. It would also be nice if extending classes automatically\ngenerated a new method with itself as return type - THAT would be worth it, but requires knowledge of the world and sets\na precedent where annotations in a supertype have an effect on compilation, which is not java-esque.\n\n## "
  },
  {
    "path": "doc/changelog.markdown",
    "content": "Lombok Changelog\n----------------\n\n### v1.18.45 \"Edgy Guinea Pig\"\n* No changes since v1.18.44 yet.\n\n### v1.18.44 (March 11th, 2026)\n* FEATURE: `@Jacksonized` now supports both Jackson2 and Jackson3; you'll get a warning until you configure which one (or even both!) you want lombok to generate. [#3950](https://github.com/projectlombok/lombok/issues/3950).\n* BUGFIX: On JDK25, `val` and `@ExtensionMethod` could sometimes cause erroneous errors (in that you see errors but compilation succeeds anyway) using javac. [#3947](https://github.com/projectlombok/lombok/issues/3947).\n* BUGFIX: `@Jacksonized` + fields marked `transient` would result in those transient fields being serialised which is surprising (and thus undesired) behaviour. [#3936](https://github.com/projectlombok/lombok/issues/3936).\n\n### v1.18.42 (September 18th, 2025)\n* FEATURE: All the various `@Log` annotations now allow you to change their access level (they still default to `private`). [#2280](https://github.com/projectlombok/lombok/issues/2280). Thanks to new contributor Liam Pace!\n* BUGFIX: Javadoc parsing was broken in Netbeans and ErrorProne for JDK25 [#3940](https://github.com/projectlombok/lombok/issues/3940).\n\n### v1.18.40 (September 4th, 2025)\n* PLATFORM: JDK25 support added [#3859](https://github.com/projectlombok/lombok/issues/3859).\n* BUGFIX: Recent versions of eclipse (or the eclipse-based java lang server for VSCode) caused `java.lang.IllegalArgumentException: Document does not match the AST`. [Issue #3886](https://github.com/projectlombok/lombok/issues/3886).\n* PERFORMANCE: `@ExtensionMethod` is now significantly faster [Issue #3866](https://github.com/projectlombok/lombok/issues/3866).\n* BUGFIX: the command line `config` tool would emit incorrect output for nullity annotations. [Issue #3931](https://github.com/projectlombok/lombok/issues/3931).\n* FEATURE: `@Jacksonized @Accessors(fluent=true)` automatically creates the relevant annotations such that Jackson correctly identifies fluent accessors. [Issue #3265](https://github.com/projectlombok/lombok/issues/3265), [Issue #3270](https://github.com/projectlombok/lombok/issues/3270).\n* IMPROBABLE BREAKING CHANGE: From versions 1.18.16 to 1.18.38, lombok automatically copies certain Jackson annotations (e.g., `@JsonProperty`) from fields to the corresponding accessors (getters/setters). However, it turned out to be harmful in certain situations. Thus, Lombok does not automatically copy those annotations any more. You can restore the old behavior using the [config key](https://projectlombok.org/features/configuration) `lombok.copyJacksonAnnotationsToAccessors = true`.\n\n### v1.18.38 (March 31st, 2025)\n* PLATFORM: JDK24 support added.\n* FEATURE: Lombok's nullity annotation now supports [JSpecify](https://jspecify.dev) out of the box, using [config key](https://projectlombok.org/features/configuration) `jspecify`.\n* BUGFIX: Recent eclipse releases would get you 'negative length' error. The bug had always been in lombok but didn't matter until recent releases. [Issue #3823](https://github.com/projectlombok/lombok/issues/3823).\n* BUGFIX: The 'extract local variable' refactor script of VSCode wouldn't replace all occurrences if run on a method call to a lombok generated method. [Issue #3783](https://github.com/projectlombok/lombok/issues/3783).\n\n### v1.18.36 (November 15th, 2024)\n* PLATFORM: JDK23 support added.\n* BUGFIX: Eclipse projects using the `com.pro-crafting.tools:jasperreports-maven-plugin` will now compile.\n\n### v1.18.34 (June 28th, 2024)\n* PLATFORM: Added support for Eclipse 2024-06; you'd get some `NoSuchMethodError` traces in your logs if using `@Builder` or `@Singular` prior to this fix. [Issue #3638](https://github.com/projectlombok/lombok/issues/3638).\n* IMPROBABLE BREAKING CHANGE: Lombok now adds `@lombok.Generated` by default to methods and types it generates. This may result in accidentally increasing your test coverage percentage. [Issue #3667](https://github.com/projectlombok/lombok/issues/3667).\n* IMPROBABLE BREAKING CHANGE: When `lombok.config` contains `lombok.onX.flagUsage = WARNING`, from now on warnings will actually be generated if onX is used.[Issue #2848](https://github.com/projectlombok/lombok/issues/2848)\n* BUGFIX: When `@SuperBuilder` was used on a type with an generic array type, it would error `wrong number of type arguments`.  [Issue #3694](https://github.com/projectlombok/lombok/issues/3694).\n* FEATURE: Lombok generates javadoc for you for most of the methods it adds; with this release, javadoc is also added to generated constructors. [Issue #933](https://github.com/projectlombok/lombok/issues/933).\n\n### v1.18.32 (March 20th, 2024)\n* PLATFORM: Initial JDK22 support added.\n* PLAFTORM  Added support for Eclipse 2024-03. [Issue #3620](https://github.com/projectlombok/lombok/issues/3620).\n* PLATFORM: Added support for recent versions of eclipse (released Q4 2023 or later or so) which would cause failures in the eclipse logs such as `java.lang.NoSuchMethodError: 'java.lang.StringBuffer org.eclipse.jdt…`. [Issue #3564](https://github.com/projectlombok/lombok/issues/3564).\n* FEATURE: `@Locked` has been introduced. Like `@Synchronized` but with `java.util.concurrent.locks` locks instead of the `synchronized` primitive. Thanks, Pim van der Loos for the PR! [Issue #3506](https://github.com/projectlombok/lombok/issues/3506).\n* NECROMANCY: Inlining a generated getter in eclipse would result in eclipse incorrectly replacing calls with `@Getter` instead of the actual field's name. [Issue #562](https://github.com/projectlombok/lombok/issues/562). This issue is almost old enough to drink. Points for dedication go to Rawi for fixing this one.\n* BUGFIX: When `@SuperBuilder` was used on a type with an annotated generic type, it would error `wrong number of type arguments`.  [Issue #3592](https://github.com/projectlombok/lombok/issues/3592).\n* BUGFIX: It was possible to create an infinite build loop using `@ExtensionMethod`. [Issue #3225](https://github.com/projectlombok/lombok/issues/3225).\n* BUGFIX: Using `@Getter(lazy=true)` would fail if the expression contained a variable called `value`. [Issue #2917](https://github.com/projectlombok/lombok/issues/2917).\n* BUGFIX: Many lombok features wouldn't work properly on records contained within an outer type unless you explicitly marked it `static`. [Issue #3497](https://github.com/projectlombok/lombok/issues/3497) [Issue #3559](https://github.com/projectlombok/lombok/issues/3559).\n* BUGFIX: Eclipse projects using the `com.pro-crafting.tools:jasperreports-plugin` will now compile.\n* BUGFIX: `@FieldNameConstants` now works when generated fields are involved. [Issue #3529](https://github.com/projectlombok/lombok/issues/3529).\n* IMPROBABLE BREAKING CHANGE: For JSpecify, the package name changed from `org.jspecify.nullness` to `org.jspecify.annotations`, which might lead to a different null analysis. [Issue #3608](https://github.com/projectlombok/lombok/pull/3608).\n\n### v1.18.30 (September 20th, 2023)\n* PLATFORM: Initial JDK21 support added. [Issue #3393](https://github.com/projectlombok/lombok/issues/3393).\n* BUGFIX: Any `@Helper` class directly in a method (and not nested more deeply) wouldn't work. [Issue #3370](https://github.com/projectlombok/lombok/issues/3370).\n* BUGFIX: If using the module system and lombok is on the runtime classpath (shouldn't be, but happens), you'd get a split package error: `Package org.objectweb.asm in both module lombok and module org.objectweb.asm`. [Issue #3474](https://github.com/projectlombok/lombok/issues/3474).\n* BUGFIX: Lombok wasn't properly copying the annotations it should be copying when generating methods in `record`s. [Issue #3315](https://github.com/projectlombok/lombok/issues/3315).\n* BUGFIX: Delomboking anything with `@lombok.Singular` in it wouldn't remove that annotation. [Issue #1377](https://github.com/projectlombok/lombok/issues/1377).\n* BUGFIX: Calling extension methods such that automatic widening is applied (i.e. calling `void ext(long arg)` with an `int`) would fail at runtime. [Issue #3463](https://github.com/projectlombok/lombok/issues/3463).\n* BUGFIX: Extension methods can now be used in records. [Issue #3450](https://github.com/projectlombok/lombok/issues/3450).\n* BUGFIX: `@Getter(lazy=true)` with complicated initialization expressions would fail on javac. [Issue #3314](https://github.com/projectlombok/lombok/issues/3314).\n* BUGFIX: Using the maven surefire plugin with a `module-info.java` based project would fail with a `SurefireBooterForkException`. [Issue #3474](https://github.com/projectlombok/lombok/issues/3474).\n\n### v1.18.28 (May 24th, 2023)\n* PLATFORM: JDK20 support added. [Issue #3353](https://github.com/projectlombok/lombok/issues/3353).\n* BUGFIX: Eclipse 4.27 and VSCode 1.14.0 would ignore `lombok.config`. [Issue #3332](https://github.com/projectlombok/lombok/issues/3332).\n* BUGFIX: `@NonNull` on a primitive array field on a record wouldn't work. [Issue #3366](https://github.com/projectlombok/lombok/issues/3366).\n* FEATURE: Jakarta has some non-null annotations (such as `jakarta.annotation.Nonnull`) which we now support. [Issue #3346](https://github.com/projectlombok/lombok/issues/3346).\n* BUGFIX: Eclipse didn't find usages of extension methods (`@ExtensionMethod`) in \"find references\" nor rename-refactoring. [Issue #3373](https://github.com/projectlombok/lombok/issues/3373)\n\n### v1.18.26 (Feb 3rd, 2023)\n\n* PLATFORM: JDK19 support added. [Issue #3264](https://github.com/projectlombok/lombok/issues/3264).\n* BUGFIX: Using the refactor script: \"Rename field\" in a `@(Super)Builder`-marked file in eclipse or VSCode would cause issues. [Issue #3181](https://github.com/projectlombok/lombok/issues/3181).\n* BUGFIX: Using `val` together with any call to a method that explicitly resolves to a default impl in an interface didn't work in javac. [Issue #3242](https://github.com/projectlombok/lombok/issues/3242).\n\n### v1.18.24 (April 18th, 2022)\n\n* PLATFORM: JDK18 support added. [Issue #3129](https://github.com/projectlombok/lombok/issues/3129).\n* PLATFORM: Using ecj and maven? There's now a [command line option to integrate lombok into your build chain](https://projectlombok.org/setup/ecj). [Issue #3143](https://github.com/projectlombok/lombok/issues/3143).\n* FEATURE: `@ToString` has an annotation parameter called `onlyExplicitlyIncluded`. There's now a config key `lombok.toString.onlyExplicitlyIncluded` to set this property as well. [Issue #2849](https://github.com/projectlombok/lombok/pull/2849).\n* FEATURE: Turning a field named `uShape` into a getter is tricky: `getUShape` or `getuShape`? The community is split on which style to use. Lombok does `getUShape`, but if you prefer the `getuShape` style, add to `lombok.config`: `lombok.accessors.capitalization = beanspec`. [Issue #2693](https://github.com/projectlombok/lombok/issues/2693) [Pull Request #2996](https://github.com/projectlombok/lombok/pull/2996). Thanks __@YonathanSherwin__!\n* FEATURE: You can now use `@Accessors(makeFinal = true)` to make `final` getters, setters, and with-ers. [Issue #1456](https://github.com/projectlombok/lombok/issues/1456).\n* BUGFIX: Various save actions and refactor scripts in eclipse work better. [Issue #2995](https://github.com/projectlombok/lombok/issues/2995) [Issue #1309](https://github.com/projectlombok/lombok/issues/1309) [Issue #2985](https://github.com/projectlombok/lombok/issues/2985) [Issue #2509](https://github.com/projectlombok/lombok/issues/2509).\n* BUGFIX: Eclipse projects using the jasperreports-plugin will now compile. [Issue #1036](https://github.com/projectlombok/lombok/issues/1036).\n* BUGFIX: inner classes in `@UtilityClass` classes were broken in JDK9+. [Issue #3097](https://github.com/projectlombok/lombok/issues/3097).\n* BUGFIX: Delomboking code with `@Builder.Default` in it would generate different code vs lombok itself. [Issue #3053](https://github.com/projectlombok/lombok/issues/3053).\n* BUGFIX: Combining `@NonNullByDefault` and `lombok.addNullAnnotations` would generate two `@Nullable` annotations and thus generate a compiler error. [Issue #3120](https://github.com/projectlombok/lombok/issues/3120). Thanks __@JohnPaulTaylorII__!\n* BUGFIX: Null analysis in eclipse was broken for incremental builds. [Issue #3133](https://github.com/projectlombok/lombok/issues/3133).\n* BUGFIX `VerifyError` would show up in the latest eclipse release when using various refactor scripts. [Issue #3134](https://github.com/projectlombok/lombok/issues/3134).\n* BUGFIX: The various `@Log` annotations can now be placed on inner enums and records. [Issue #2990](https://github.com/projectlombok/lombok/issues/2990).\n* SECURITY: A widely reported security issue with log4j2 ([CVE-2021-44228](https://www.randori.com/blog/cve-2021-44228/)) has absolutely no effect on either lombok itself nor does usage of lombok on its own, or even the usage of lombok's `@Log4j2`, cause any issues whatsoever: You have to ship your own log4j2 dependency in your app - update that to 2.17 or otherwise mitigate this issue (see the CVE page). To avoid unnecessary warnings from dependency checkers, our dep on log4j2, which is used solely for testing, isn't shipped by us, and cannot be exploited in any way, has been updated to 2.17.1. [Issue #3063](https://github.com/projectlombok/lombok/issues/3063)\n* IMPROBABLE BREAKING CHANGE: Lombok now understands a few more annotations that imply \"this field should not ever contain a null reference\". Lombok will thus copy some of these new annotations e.g. to generated getters and the like.  [Pull Request #2904](https://github.com/projectlombok/lombok/pull/2904)\n\n### v1.18.22 (October 6th, 2021)\n* PLATFORM: JDK17 support added. [Issue #2898](https://github.com/projectlombok/lombok/issues/2898).\n* FEATURE: Added the `@StandardException` feature. [Pull Request #2702](https://github.com/projectlombok/lombok/pull/2702).\n* IMPROBABLE BREAKING CHANGE: If the underlying compiler and `--release` / `--source` option is 10 or higher, lombok's `val` is now replaced by `final var`. That means compound declarations such as `val x = 10, y = 12;` now fail (lombok's old `val` implementation supported it, javac's `var` does not), but IDE support in particular is more reliable. We decided it was worth the tradeoff.\n* BUGFIX: Syntax highlighting in VSCode now works reliably when using lombok. [Issue #2950](https://github.com/projectlombok/lombok/issues/2950).\n* BUGFIX: Eclipse's _organize imports_ feature would sometimes remove your `lombok.val` import. [Issue #2972](https://github.com/projectlombok/lombok/issues/2972).\n\n\n### v1.18.20 (April 2nd, 2021)\n* PLATFORM: JDK16 support added. [Issue #2681](https://github.com/projectlombok/lombok/issues/2681).\n* PLATFORM: All lombok features updated to act in a sane fashion with JDK16's _record_ feature. In particular, you can annotate record components with `@NonNull` to have lombok add null checks to your compact constructor (which will be created if need be).\n* BUGFIX: Trying to use a lambda expression as parameter to an `@ExtensionMethod` did not work. [Issue #2741](https://github.com/projectlombok/lombok/issues/2741). (by __@Rawi01__).\n* BUGFIX: `@SuperBuilder` with an existing constructor caused issues in eclipse. [Issue #2704](https://github.com/projectlombok/lombok/issues/2704). (by [@JanRieke](https://github.com/projectlombok/lombok/pull/2770)).\n* BUGFIX: Using `@SuperBuilder` with a handwritten builder class caused issues. [Issue #2701](https://github.com/projectlombok/lombok/issues/2701). (by [@JanRieke](https://github.com/projectlombok/lombok/pull/2772)).\n* BUGFIX: Lombok interacts properly with the new save actions in eclipse 2021-03.\n* POTENTIAL BUGFIX: lombok + errorprone could cause `IllegalArgumentException` if using the `MissingSummary` bug pattern. [Issue #2730](https://github.com/projectlombok/lombok/issues/2730).\n\n### v1.18.18 (January 28th, 2021)\n* BUGFIX: Various tools using ecj under the hood (including intellij) could cause corrupt class files to be generated. [PR #2637](https://github.com/projectlombok/lombok/pull/2637), [lombok-intellij-plugin issue #969](https://github.com/mplushnikov/lombok-intellij-plugin/issues/969).\n* BUGFIX: Netbeans would not work with 1.18.16 anymore. [Issue #2612](https://github.com/projectlombok/lombok/issues/2612).\n* BUGFIX: `@ExtensionMethod` support in ecj improved when generics are involved. [Issue #2648](https://github.com/projectlombok/lombok/issues/2648), [PR #2658](https://github.com/projectlombok/lombok/pull/2658) thanks to __@Rawi01__.\n* PLATFORM: using `lombok.config` files when compiling with sbt 1.4 now works again. [Issue #2645](https://github.com/projectlombok/lombok/issues/2645)\n\n### v1.18.16 (October 15th, 2020)\n* BUGFIX: Version 1.18.14 could not be installed in Eclipse, it would break Eclipse.\n* BREAKING CHANGE: mapstruct users should now add a dependency to lombok-mapstruct-binding. This solves compiling modules with lombok (and mapstruct).\n* IMPROBABLE BREAKING CHANGE: The generated hashcode has changed for classes that include both primitive fields and reference fields.\n* FEATURE: Similar to `@Builder`, you can now configure a `@SuperBuilder`'s 'setter' prefixes via `@SuperBuilder(setterPrefix = \"set\")` for example. We still discourage doing this. [Pull Request #2357](https://github.com/projectlombok/lombok/pull/2357).\n* FEATURE: If using `@Synchronized(\"lockVar\")`, if `lockVar` is referring to a static field, the code lombok generates no longer causes a warning about accessing a static entity incorrectly. [Issue #678](https://github.com/projectlombok/lombok/issues/678)\n* FEATURE: `@Jacksonized` on a `@Builder` or `@SuperBuilder` will configure [Jackson](https://github.com/FasterXML/jackson) to use this builder when deserializing. [Pull Request #2387](https://github.com/projectlombok/lombok/pull/2387) thanks to __@JanRieke__. [@Jacksonized documentation](https://projectlombok.org/features/experimental/Jacksonized).\n* FEATURE: The checkerframework support has been updated; the relevant annotations were renamed in checkerframework's APIs, lombok now generates the annotations according to their current API names.\n* FEATURE: Add option to cache hashCode via `@EqualsAndHashCode(cacheStrategy = EqualsAndHashCode.CacheStrategy.LAZY)`. [Issue #784](https://github.com/projectlombok/lombok/issues/784) [Pull Request #2513](https://github.com/projectlombok/lombok/pull/2513) thanks to __@andrebrait__.\n* PLATFORM: Added support for compiling projects with OpenJ9 [Pull Request #2437](https://github.com/projectlombok/lombok/pull/2437)\n* PLATFORM: Improved support for recent JVM/javac versions (14 and 15) and new language features.\n* PERFORMANCE: Several performance improvements during parsing/compilation, both using javac and Eclipse. Thanks __@Rawi01__!\n* PERFORMANCE: The generated equals method will first compare primitives, then primitive wrappers and then reference fields. Manual re-ordering is possible using `@Include(rank=n)`. [Pull Request #2485](https://github.com/projectlombok/lombok/pull/2485), [Issue #1543](https://github.com/projectlombok/lombok/issues/1543)\n* BUGFIX: Delombok prints the first `this` parameter. [Issue #2444](https://github.com/projectlombok/lombok/issues/2444)\n* BUGFIX: Using `val` in combination with values whose generics include wildcards that reference themselves would cause a `StackOverflowError` in javac. [Issue #2358](https://github.com/projectlombok/lombok/issues/2358).\n* BUGFIX: Using `@SuperBuilder` on a class that has some fairly convoluted generics usage would fail with 'Wrong number of type arguments'. [Issue #2359](https://github.com/projectlombok/lombok/issues/2359) [Pull Request #2362](https://github.com/projectlombok/lombok/pull/2362)\n* BUGFIX: Various lombok annotations on classes nested inside enums or interfaces would cause errors in eclipse. [Issue #2369](https://github.com/projectlombok/lombok/issues/2369)\n* BUGFIX: Trying to add `@ExtensionMethod`s with exactly 2 arguments would fail in eclipse. [Issue #1441](https://github.com/projectlombok/lombok/issues/1441) [Pull Request #2376](https://github.com/projectlombok/lombok/pull/2376) thanks to __@Rawi01__.\n* BUGFIX: Javac sets incorrect annotated type on with methods. [Issue #2463](https://github.com/projectlombok/lombok/issues/2463)\n\n### v1.18.14 (October 8th, 2020)\n* Don't use this version. It is broken. Changes are listed under 1.18.16\n\n\n### v1.18.12 (February 1st, 2020)\n* PLATFORM: Support for JDK13 (including `yield` in switch expressions, as well as delombok having a nicer style for arrow-style switch blocks, and text blocks).\n* PLATFORM: Support for JDK14 (including `pattern match` instanceof expressions).\n* FEATURE: In [`lombok.config`](https://projectlombok.org/features/configuration) it is possible to import other config files, even from a `.zip` or `.jar`.\n* FEATURE: You can now configure a builder's 'setter' prefixes via `@Builder(setterPrefix = \"set\")` for example. We discourage doing this, but if some library you use requires them, have at it. [Pull Request #2174](https://github.com/projectlombok/lombok/pull/2174), [Issue #1805](https://github.com/projectlombok/lombok/issues/1805).\n* FEATURE: If you use `@Builder`'s `@Singular`, a plural form is also generated, which has the effect of adding all elements in the passed collection. If you pass a null reference, this would result in a message-less `NullPointerException`. Now, it results in that exception but with a useful message attached (uses the same config as `@NonNull`), or alternatively via a parameter on `@Singular`, you can choose to ignore such a call (add nothing, return immediately); this can be useful when deserializing (e.g. Jackson JSON) and JPA/Hibernate code. [Issue #2221](https://github.com/projectlombok/lombok/issues/2221). [singular documentation](https://projectlombok.org/features/Builder).\n* FEATURE: Tired of being unable to use `@javax.annotation.ParametersAreNonnullByDefault` or `@org.eclipse.jdt.annotation.NonNullByDefault` because then the equals method that lombok generates isn't valid? Fret no more; lombok can now add nullity annotations where relevant. Set the flavour of nullity annotation you prefer in your `lombok.config`. Applies to the return value of `toString`, `withX`, chainable `setX`, static constructors, `build`, `builder`, etcetera, and the parameter of `equals`, `canEqual`, and the plural form of `@Singular` marked fields for builder classes. [Issue #788](https://github.com/projectlombok/lombok/issues/788)\n* BUGFIX: If using the sonarlint plugin in eclipse for projects bound to sonarcloud, you now no longer get internal errors on sonarlint processing. [Issue #2351](https://github.com/projectlombok/lombok/issues/2351)\n* BUGFIX: `lombok.experimental.Wither` has been deprecated (it has been renamed to `lombok.With`). However, the intent is that lombok still handles the old annotation in case you haven't updated your lombok dep yet. However, only a star import on `lombok.experimental.*` worked; an explicit one would cause lombok to not generate any with method. [Issue #2235](https://github.com/projectlombok/lombok/issues/2235)\n* BUGFIX: Referring to an inner class inside the generics on a class marked with `@SuperBuilder` would cause the error `wrong number of type arguments; required 3` [Issue #2262](https://github.com/projectlombok/lombok/issues/2262); fixed by github user [`@Lekanich`](https://github.com/projectlombok/lombok/issues/2262) - thank you!\n* BUGFIX: Some of the code generated by `@Builder` did not include `this.` prefixes when accessing fields. While semantically it didn't matter, if you use the 'add this prefix for field accesses' save action in eclipse, the save action would break. [Issue #2327](https://github.com/projectlombok/lombok/issues/2327)\n* BUGFIX: When lombok copies javadoc from fields to relevant methods, it should generate an appropriate `@return this` line if lombok copies the javadoc to a generated setter that is chainable (returns itself). It didn't do that when generating the 'setters' in a `@Builder`. Lombok also didn't generate an appropriate `@return` item for `@With` methods. The javadoc has also been updated slightly (the `this` reference in the javadoc is now rendered in a code tag).[Issue #2323](https://github.com/projectlombok/lombok/issues/2323)\n* IMPROBABLE BREAKING CHANGE: Lombok now generates qualified types (so, `Outer.Inner` instead of just `Inner`) in most type signatures that it generates; this should avoid exotic scenarios where the types lombok puts in signatures end up referring to unintended other types, which can occur if your class implements an interface that itself defines a type with the same name as one defined in your source file. I told you it was exotic. Thanks to Hunter Anderson for doing some preliminary work on this change. [Issue #2268](https://github.com/projectlombok/lombok/issues/2268)\n* IMPROBABLE BREAKING CHANGE: Running `java -jar lombok.jar config -v <files>` no longer shows which files do not mention the specified keys. Use `--non-mentioned` or `-n` to show them anyway.\n\n\n### v1.18.10 (September 10th, 2019)\n* PROMOTION: `@Wither` has been promoted to the main package, renamed to `@With`. Otherwise, no changes have been made to the annotation. The old experimental annotation will remain for a few versions as a deprecated annotation. If you had `lombok.config` configuration for this annotation, the configuration keys for this feature have been renamed.\n* FEATURE: You can now configure a custom logger framework using the new `@CustomLog` annotation in combination with the `lombok.log.custom.declaration` configuration key. See the [log documentation](https://projectlombok.org/features/log) for more information. [Pullrequest #2086](https://github.com/projectlombok/lombok/pull/2086) with thanks to Adam Juraszek.\n* ENHANCEMENT: Thanks to Mark Haynes, the `staticConstructor` will now also be generated if a (private) constructor already exists. [Issue #2100](https://github.com/projectlombok/lombok/issues/2100)\n* ENHANCEMENT: `val` is now capable of decoding the type of convoluted expressions (particularly if the right hand side involves lambdas and conditional (ternary) expressions). [Pull Request #2109](https://github.com/projectlombok/lombok/pull/2109) with thanks to Alexander Bulgakov.\n* ENHANCEMENT: You can now configure the generated builder class name via the config system, using key `lombok.builder.className`. See the [Builder documentation](https://projectlombok.org/features/Builder) and [SuperBuilder documentation](https://projectlombok.org/features/experimental/SuperBuilder)\n* ENHANCEMENT: If you mix up eclipse's non-null support, such as `@NonNullByDefault`, with lombok's `@NonNull`, you get a bunch of warnings about dead code that are inappropriate. These warnings are now suppressed, thanks to a contribution from Till Brychcy! [Pull Request #2155](https://github.com/projectlombok/lombok/pull/2155)\n* ENHANCEMENT: `@NonNull` can now also generate checks using jdk's `Objects.requireNonNull` or Guava's `Preconditions.checkNotNull`. [Issue #1197](https://github.com/projectlombok/lombok/issues/1197)\n* EXPERIMENT: Lombok is working together with [checkerframework](https://checkerframework.org/) to enable detection of improper builder use (such as forgetting to set a mandatory property prior to calling `build()`). This experiment can be turned on by adding `checkerframework = true` to your `lombok.config` file.\n* BUGFIX: Using `@JsonProperty` or `@JsonValue` on a field in combination with `@Setter` or `@Data` would sometimes throw a ClassCastException during compilation. [Issue #2156](https://github.com/projectlombok/lombok/issues/2156)\n* BUGFIX: Delombok would turn something like `List<byte[]>...` in a method parameter to `List<byte...>...` [Issue #2140](https://github.com/projectlombok/lombok/issues/2140)\n* BUGFIX: Javac would generate the wrong equals and hashCode if a type-use annotation was put on an array type field [Issue #2165](https://github.com/projectlombok/lombok/issues/2165)\n* BUGFIX: Eclipse 2019-06 + JDK-12 compatibility + an `@Singular` builder entry would produce a cascade of error dialogs. [Issue #2169](https://github.com/projectlombok/lombok/issues/2169)\n* BUGFIX: Javac would throw a NullPointerException if the package-info.java did not contain a package declaration. [Issue #2184](https://github.com/projectlombok/lombok/issues/2184)\n* BUGFIX: Javac sets incorrect annotated type on constructor, getter and setter. [Issue #2189](https://github.com/projectlombok/lombok/issues/2189)\n* IMPROBABLE BREAKING CHANGE: Stricter validation of configuration keys dealing with identifiers and types (`lombok.log.fieldName`, `lombok.fieldNameConstants.innerTypeName`, `lombok.copyableAnnotations`).\n* IMPROBABLE BREAKING CHANGE: The fields generated inside builders for fields with defaults (with `@Builder` on a class with fields marked `@Default`) now have `$value` as the name; direct manipulation of these fields is not advised because there is an associated `$set` variable that also needs to be taken into account. [Issue #2115](https://github.com/projectlombok/lombok/issues/2115)\n\n### v1.18.8 (May 7th, 2019)\n* FEATURE: You can now configure `@FieldNameConstants` to `CONSTANT_CASE` the generated constants, using a `lombok.config` option. See the [FieldNameConstants documentation](https://projectlombok.org/features/experimental/FieldNameConstants). [Issue #2092](https://github.com/projectlombok/lombok/issues/2092).\n* FEATURE: You can now suppress generation of the `builder` method when using `@Builder`; usually because you're only interested in the `toBuilder` method. As a convenience we won't emit warnings about missing `@Builder.Default` annotations when you do this. [Issue #2046](https://github.com/projectlombok/lombok/issues/2046)\n* FEATURE: You can now change the access modifier of generated builder classes. [Issue #2083](https://github.com/projectlombok/lombok/issues/2083).\n* FEATURE: When using `@NonNull`, or any other annotation that would result in a null-check, you can configure to generate an assert statement instead. [Issue #2078](https://github.com/projectlombok/lombok/issues/2078).\n* FEATURE: Lombok now knows exactly how to treat `@com.fasterxml.jackson.annotation.JsonProperty` and will copy it to the right places for example when making builders. [Issue #1961](https://github.com/projectlombok/lombok/issues/1961) [Issue #1981](https://github.com/projectlombok/lombok/issues/1981)\n* PLATFORM: A few lombok features (most notably delombok) failed on JDK12. [Issue #2082](https://github.com/projectlombok/lombok/issues/2082)\n* BUGFIX: var/val on methods that return an intersection type would now work in Eclipse. [Issue #1986](https://github.com/projectlombok/lombok/issues/1986)\n* BUGFIX: Fix for java6 regression if a field has javadoc. [Issue #2066](https://github.com/projectlombok/lombok/issues/2066)\n* BUGFIX: Delombok now delomboks java10's own `var` as `var` and not as the actual underlying type. [Issue #2049](https://github.com/projectlombok/lombok/issues/2049)\n* BUGFIX: If you use `@Builder` and manually write the `build()` method in your builder class, javac would error out instead of deferring to your implementation. [Issue #2050](https://github.com/projectlombok/lombok/issues/2050) [Issue #2061](https://github.com/projectlombok/lombok/issues/2061)\n* BUGFIX: `@SuperBuilder` together with `@Singular` on non-lists would produce an erroneous `emptyList` call. [Issue #2104](https://github.com/projectlombok/lombok/issues/2104).\n* IMPROBABLE BREAKING CHANGE: For fields and parameters marked non-null, if the method body starts with an assert statement to ensure the value isn't null, no code to throw an exception will be generated.\n* IMPROBABLE BREAKING CHANGE: When using `ecj` to compile java code with `@Builder` or `@SuperBuilder` in it, and a builder setter method was generated for a `@NonNull`-marked method, no explicit null check would be present. However, running `javac` on the exact same file _would_ produce the null check. Now ecj also produces this null check. [Issue #2120](https://github.com/projectlombok/lombok/issues/2120).\n* IMPROBABLE BREAKING CHANGE: We slightly changed the message of the exception lombok generates to handle `@NonNull` marked parameters. [Issue #2122](https://github.com/projectlombok/lombok/issues/2122)\n\n### v1.18.6 (February 12th, 2019)\n* FEATURE: Javadoc on fields will now also be copied to the Builders' setters. Thanks for the contribution, Emil Lundberg. [Issue #2008](https://github.com/projectlombok/lombok/issues/2008)\n* FEATURE: The `@FieldNameConstants` feature now allows you to write the inner type by hand and add whatever you like to it; lombok will add the constants to this class. See the updated [FieldNameConstants feature](https://projectlombok.org/features/experimental/FieldNameConstants) page.\n* FEATURE: There is now a `lombok.config` key to configure `@ToString`'s call super behavior; it's just like `@EqualsAndHashCode` which has had it for a while now. [Issue #1918](https://github.com/projectlombok/lombok/issues/1918)\n* ENHANCEMENT: The toString generation of enums now contains the name of the enum constant. [Issue #1916](https://github.com/projectlombok/lombok/issues/1916)\n* PLATFORM: Due to changes to switch statements in JDK12, lombok wasn't working with the JDK12 preview. [Issue #1888](https://github.com/projectlombok/lombok/issues/1888)\n* BUGFIX: Using `@Delegate` in combination `@NonNull` would give an error in jdk8. [Issue #1935](https://github.com/projectlombok/lombok/issues/1935)\n* BUGFIX: Using the new `@FieldNameConstants` in eclipse would cause errors in the error log view, and error popups if save actions are turned on. [Issue #2024](https://github.com/projectlombok/lombok/issues/2024)\n* BUGFIX: Since version 1.18.4, the delombok ant task didn't work and errored with a `NoClassDefFoundError`. [Issue #1932](https://github.com/projectlombok/lombok/issues/1932)\n* BUGFIX: Combining both `@Setter` and `@Wither` on the same field, when that field also has javadoc with a `--setter--` section or an `@param` tag, resulted in a race condition where the first handler to get to the field would take that part of the javadoc. This is a step along the way to fixing [Issue #1033](https://github.com/projectlombok/lombok/issues/1033)\n* BUGFIX: Compiling multi-module projects would fail on forcing new rounds. [Issue #1723](https://github.com/projectlombok/lombok/issues/1723), [Issue #1858](https://github.com/projectlombok/lombok/issues/1858), [Issue #1946](https://github.com/projectlombok/lombok/issues/1946), [Issue #2028](https://github.com/projectlombok/lombok/issues/2028)\n\n### v1.18.4 (October 30th, 2018)\n* PLATFORM: Support for Eclipse Photon. [Issue #1831](https://github.com/projectlombok/lombok/issues/1831)\n* PLATFORM: Angular IDE is now recognized by the installer [Issue #1830](https://github.com/projectlombok/lombok/issues/1830)\n* PLATFORM: Many improvements for lombok's JDK10/11 support.\n* BREAKING CHANGE: The `@FieldNameConstants` feature has been completely redesigned. [Issue #1774](https://github.com/projectlombok/lombok/issues/1774) [FieldNameConstants documentation](https://projectlombok.org/features/experimental/FieldNameConstants)\n* BREAKING CHANGE: Lombok will now always copy specific annotations around (from field to getter, from field to builder 'setter', etcetera): A specific curated list of known annotations where that is the right thing to do (generally, `@NonNull` style annotations from various libraries), as well as any annotations you explicitly list in the `lombok.copyableAnnotations` config key in your `lombok.config` file. Also, lombok is more consistent about copying these annotations. (Previous behaviour: Lombok used to copy any annotation whose simple name was `NonNull`, `Nullable`, or `CheckForNull`). [Issue #1570](https://github.com/projectlombok/lombok/issues/1570) and [Issue #1634](https://github.com/projectlombok/lombok/issues/1634)\n* FEATURE: Lombok's `@NonNull` annotation can now be used on type usages (annotation on type usages has been introduced in JDK 8). `@Builder`'s `@Singular` annotation now properly deals with annotations on the generics type on the collection: `@Singular List<@NonNull String> names;` now does the right thing.\n* FEATURE: You can now mix `@SuperBuilder` and `toBuilder`, and `toBuilder` no longer throws `NullPointerException` if a `@Singular`-marked collection field is `null`. [Issue #1324](https://github.com/projectlombok/lombok/issues/1324)\n* FEATURE: delombok now supports module paths via the `--module-path` option, and will automatically add lombok itself to the module path. This should make it possible to delombok your modularized projects. [Issue #1848](https://github.com/projectlombok/lombok/issues/1848)\n* FEATURE: You can pass `@args.txt` to `delombok` to read args from the text file; useful if you have really long classpaths you need to pass to delombok. [Issue #1795](https://github.com/projectlombok/lombok/issues/1795)\n* BUGFIX: `@NoArgsConstructor(force=true)` would try to initialize already initialized final fields in Eclipse. [Issue #1829](https://github.com/projectlombok/lombok/issues/1829)\n* BUGFIX: When using lombok to compile modularized (`module-info.java`-style) code, if the module name has dots in it, it wouldn't work. [Issue #1808](https://github.com/projectlombok/lombok/issues/1808)\n* BUGFIX: Errors about lombok not reading a module providing `org.mapstruct.ap.spi` when trying to use lombok in jigsaw-mode on JDK 11. [Issue #1806](https://github.com/projectlombok/lombok/issues/1806)\n* BUGFIX: Fix NetBeans compile on save. [Issue #1770](https://github.com/projectlombok/lombok/issues/1770)\n* BUGFIX: If you manually write your builder class so you can add a few methods of your own, and those methods refer to generated methods, you'd usually run into various bizarre error messages, but only on JDK9/10/11. This one is hard to describe, but we fixed it. [Issue #1907](https://github.com/projectlombok/lombok/issues/1907)\n\n### v1.18.2 (July 26th, 2018)\n* BUGFIX: mapstruct + lombok in eclipse should hopefully work again. [Issue #1359](https://github.com/projectlombok/lombok/issues/1359) and [mapstruct issue #1159](https://github.com/mapstruct/mapstruct/issues/1159)\n* BUGFIX: Equals and hashCode again exclude transient fields by default. [Issue #1724](https://github.com/projectlombok/lombok/issues/1724)\n* BUGFIX: Eclipse 'organize imports' feature (either explicitly, or if automatically triggered on saving via 'save actions') would remove the import for `lombok.var`. [Issue #1783](https://github.com/projectlombok/lombok/issues/1783)\n* BUGFIX: Lombok and gradle v4.9 didn't work together; that's been fixed. [Issue #1716](https://github.com/projectlombok/lombok/issues/1716) and [gradle-apt-plugin issue #87](https://github.com/tbroyer/gradle-apt-plugin/issues/87)\n* FEATURE: You can now make builders for type hierarchies, using the new (experimental) `@SuperBuilder` annotation. Thanks for the contribution, Jan Rieke. [`@SuperBuilder` documentation](https://projectlombok.org/features/experimental/SuperBuilder)\n* FEATURE: `@NoArgsConstructor`, including forcing one with `lombok.config: lombok.noArgsConstructor.extraPrivate=true` now take any defaults set with `@Builder.Default` into account. [Issue #1347](https://github.com/projectlombok/lombok/issues/1347)\n\n### v1.18.0 (June 5th, 2018)\n* BREAKING CHANGE: The in 1.16.22 introduced configuration key `lombok.noArgsConstructor.extraPrivate` is now `false` by default. [Issue #1708](https://github.com/projectlombok/lombok/issues/1708)\n* BUGFIX: Do not generate a private no-args constructor if that breaks the code. [Issue #1703](https://github.com/projectlombok/lombok/issues/1703), [Issue #1704](https://github.com/projectlombok/lombok/issues/1704), [Issue #1712](https://github.com/projectlombok/lombok/issues/1712)\n* BUGFIX: Using boolean parameters in lombok annotations would fail. [Issue #1709](https://github.com/projectlombok/lombok/issues/1709)\n* BUGFIX: Delombok would give an error message. [Issue #1705](https://github.com/projectlombok/lombok/issues/1705)\n* BUGFIX: Eclipse java10 var support didn't work if lombok was installed in your eclipse. [Issue #1676](https://github.com/projectlombok/lombok/issues/1676)\n* FEATURE: Google's [Flogger (a.k.a. FluentLogger)](https://google.github.io/flogger/) is now available via `@Flogger`. [Issue #1697](https://github.com/projectlombok/lombok/issues/1697)\n* FEATURE: `@FieldNameConstants` has been extended to support prefixes and suffixes. By default, the generated constants are prefixed with `FIELD_`. [Docs on @FieldNameConstants](https://projectlombok.org/features/experimental/FieldNameConstants).\n\n### v1.16.22 \"Envious Ferret\" (May 29th, 2018)\n* FEATURE: Private no-args constructor for `@Data` and `@Value` to enable deserialization frameworks (like Jackson) to operate out-of-the-box. Use `lombok.noArgsConstructor.extraPrivate = false` to disable this behavior.\n* FEATURE: Methods can now be marked for inclusion in `toString`, `equals`, and `hashCode` generation. There is a new mechanism to mark which fields (and now, methods) are to be included or excluded for the generation of these methods: mark the relevant member with for example `@ToString.Include` or `@EqualsAndHashCode.Exclude`. [ToString documentation](https://projectlombok.org/features/ToString) [EqualsAndHashCode documentation](https://projectlombok.org/features/EqualsAndHashCode)\n* FEATURE: `@Getter` and `@Setter` also allow `onMethod` and `onParam` when put on a type. [Issue #1653](https://github.com/projectlombok/lombok/issues/1653)\n* FEATURE: `@FieldNameConstants` is a new feature that generates string constants for your field names. [Docs on @FieldNameConstants](https://projectlombok.org/features/experimental/FieldNameConstants).\n* PLATFORM: Lombok can be compiled on JDK10, and should run on JDK10. [Issue #1693](https://github.com/projectlombok/lombok/issues/1693)\n* PLATFORM: lombok now counts as an _incremental annotation processor_ for gradle. Should speed up your gradle builds considerably! [Issue #1580](https://github.com/projectlombok/lombok/issues/1580)\n* PLATFORM: Fix for using lombok together with JDK9+'s new `module-info.java` feature. [Issue #985](https://github.com/projectlombok/lombok/issues/985)\n* BUGFIX: Solved some issues in eclipse that resulted in error 'A save participant caused problems'. [Issue #879](https://github.com/projectlombok/lombok/issues/879)\n* BUGFIX: Netbeans on jdk9. [Issue #1617](https://github.com/projectlombok/lombok/issues/1617)\n* BUGFIX: Netbeans < 9. [Issue #1555](https://github.com/projectlombok/lombok/issues/1555)\n* PROMOTION: `var` has been promoted from experimental to the main package with no changes. The 'old' experimental one is still around but is deprecated, and is an alias for the new main package one. [var documentation](https://projectlombok.org/features/var).\n* OLD-CRUFT: `lombok.experimental.Builder` and `lombok.experimental.Value` are deprecated remnants of when these features were still in experimental. They are now removed entirely. If your project is dependent on an older version of lombok which still has those; fret not, lombok still processes these annotations. It just no longer includes them in the jar.\n\n### v1.16.20 (January 9th, 2018)\n* PLATFORM: Better support for jdk9 in the new IntelliJ, Netbeans and for Gradle.\n* BREAKING CHANGE: _lombok config_ key `lombok.addJavaxGeneratedAnnotation` now defaults to `false` instead of true. Oracle broke this annotation with the release of JDK9, necessitating this breaking change.\n* BREAKING CHANGE: _lombok config_ key `lombok.anyConstructor.suppressConstructorProperties` is now deprecated and defaults to `true`, that is, by default lombok no longer automatically generates `@ConstructorProperties` annotations. New config key `lombok.anyConstructor.addConstructorProperties` now exists; set it to `true` if you want the old behavior. Oracle more or less broke this annotation with the release of JDK9, necessitating this breaking change.\n* DEVELOPMENT: Compiling lombok on JDK1.9 is now possible.\n* BUGFIX: The generated hashCode would break the contract if `callSuper=true,of={}`. [Issue #1505](https://github.com/projectlombok/lombok/issues/1505)\n* BUGFIX: `delombok` no longer prints the synthetic outer-class parameter. [Issue #1521](https://github.com/projectlombok/lombok/issues/1521)\n* BUGFIX: @Builder.Default now also works when type parameters are present. [Issue #1527](https://github.com/projectlombok/lombok/issues/1527)\n* BUGFIX: @Builder now also works on method with a generified return type. [Issue #1420](https://github.com/projectlombok/lombok/issues/1420)\n* INSTALLER: By default, the lombok installer now inserts an absolute path in `eclipse.ini` and friends, instead of a relative path. If you want the old behavior, you can use `java -jar -Dlombok.installer.fullpath=false lombok.jar`.\n\n### v1.16.18 (July 3rd, 2017)\n* PLATFORM: JDK9 support much improved since v1.16.16; [Issue #985](https://github.com/projectlombok/lombok/issues/985)\n* BUGFIX: Lombok now works with [Bazel](https://bazel.build/) and [Error Prone](https://error-prone.info/). [Issue #1290](https://github.com/projectlombok/lombok/issues/1290)\n* FEATURE: Lombok has a new [website](https://projectlombok.org/)! A few very minor changes to the code to be more consistent with it have been added, mostly to the javadoc.\n\n### v1.16.16 \"Dancing Elephant\" (March 23rd, 2017)\n* FEATURE: `@Builder.Default` lets you configure default values for your fields when using `@Builder`. See the [Builder feature page](https://projectlombok.org/features/Builder) for more information. [Issue #1201](https://github.com/projectlombok/lombok/issues/1201)\n* PLATFORM: JDK9 now supported for compilation (delomboking with java9 not yet possible). Note, you'll have to do some command line wrangling. See [Issue #985](https://github.com/projectlombok/lombok/issues/985)\n* BUGFIX: The `onX` feature (which lets you add annotations to generated methods) did not work if the annotation you added contained named parameters, and you are compiling with JDK8's javac. We can't fix this (it's a bug in javac), but we have provided an alternate, prettier way to do `onX` on javac8+. [Issue #778](https://github.com/projectlombok/lombok/issues/778) [onX documentation](https://projectlombok.org/features/experimental/onX)\n* BUGFIX: `@Data` and `@Value` now respect the configuration for field access when generating equals, hashCode and toString. [Issue #1329](https://github.com/projectlombok/lombok/issues/1329)\n* BUGFIX: `@Builder` now marks generated builder 'setters' as `@Deprecated` if the source field is deprecated. [Issue #1342](https://github.com/projectlombok/lombok/issues/1342)\n* CHANGE: `@ConstructorProperties` will now also be generated for private and package private constructors. This is useful for Jackson [Issue #1180](https://github.com/projectlombok/lombok/issues/1180)\n\n### v1.16.14 (February 10th, 2017)\n* FEATURE: Generated classes, methods and fields can now also annotated with `@lombok.Generated` [Issue #1014](https://github.com/projectlombok/lombok/issues/1014)\n* PLATFORM: Lombok can now be used together with other annotation processors that are looking for lombok-generated methods, but only if lombok is the first annotation processor executed. The most commonly used annotation processor affected by this change is [MapStruct](http://mapstruct.org/); we've worked with the mapstruct team specifically to allow any order. Other annotation processors might follow the framework we've built to make this possible; point the authors of any such processor to us and we'll get it sorted [MapStruct issue #510](https://github.com/mapstruct/mapstruct/issues/510) [Lombok issue #973](https://github.com/projectlombok/lombok/issues/973)\n* PLATFORM: Eclipse: Refactor script 'rename field' when lombok has also generated getters and/or setters for this field is nicer now [Issue #210](https://github.com/projectlombok/lombok/issues/210)\n* BUGFIX: Something you never encountered. [Issue #1274](https://github.com/projectlombok/lombok/issues/1274)\n* DEPRECATION: The configuration key `lombok.addGeneratedAnnotation` is now deprecated, use `lombok.addJavaxGeneratedAnnotation` instead.\n\n### v1.16.12 (December 5th, 2016)\n* FEATURE: `var` is the mutable sister of `val`. For now experimental, and opt-in using `ALLOW` in the flagUsage configuration key. Thanks for the contribution, Bulgakov Alexander.\n* CHANGE: `@Value` and `@FieldDefaults` no longer touch static fields [Issue #1254](https://github.com/projectlombok/lombok/issues/1254)\n* BUGFIX: `val` in lambda expressions now work as expected [Issue #911](https://github.com/projectlombok/lombok/issues/911)\n* BUGFIX: `Getter(lazy=true)` now emits an error message when used on a transient field [Issue #1236](https://github.com/projectlombok/lombok/issues/1236)\n* BUGFIX: Annotation Processors that use ecj internally (dagger) no longer give linkage errors [Issue #1218](https://github.com/projectlombok/lombok/issues/1218)\n* PLATFORM: Red Hat JBoss Developer Studio is now correctly identified by the installer [Issue #1164](https://github.com/projectlombok/lombok/issues/1164)\n* BUGFIX: delombok: for-loops with initializers that are not local variables would be generated incorrectly [Issue #1076](https://github.com/projectlombok/lombok/issues/1076)\n\n### v1.16.10 (July 15th, 2016)\n* FEATURE: Added support for JBoss logger [Issue #1103](https://github.com/projectlombok/lombok/issues/1103)\n* ENHANCEMENT: Running `javac -Xlint:all` would generate a warning about unclaimed annotations [Issue #1117](https://github.com/projectlombok/lombok/issues/1117)\n* BUGFIX: Eclipse Mars would sometimes throw a NullPointerException when using `@Delegate` [Issue #913](https://github.com/projectlombok/lombok/issues/913)\n* ENHANCEMENT: Add support for older maven-compiler-plugin [Issue #1138](https://github.com/projectlombok/lombok/issues/1138)\n\n### v1.16.8 (March 7th, 2016)\n* PLATFORM: Starting jdk9 support: No more error message regarding `pid`\n* FEATURE: `@Builder` updates: It now generates `clearFieldName()` methods if `@Singular` is used. [Issue #967](https://github.com/projectlombok/lombok/issues/967).\n* FEATURE: `@Builder` updates: The annotation can now be put on instance methods. [Issue #63](https://github.com/projectlombok/lombok/issues/63).\n* FEATURE: `@Builder` updates: `@Singular` now supports guava's ImmutableTable [Issue #937](https://github.com/projectlombok/lombok/issues/937).\n* FEATURE: A `lombok.config` key can now be used to make your fields `final` and/or `private`... __everywhere__. We'll be monitoring the performance impact of this for a while. We'll touch every source file if you turn these on, and even if you don't, we have to call into the lombok config system for every file.\n* FEATURE: A `lombok.config` key can now be used to set the default behaviour of `@EqualsAndHashCode` when generating methods for a class that extends something in regards to calling the superclass implementations of `equals` and `hashCode` or not. [Issue #965](https://github.com/projectlombok/lombok/issues/965).\n* FEATURE: Putting `@Wither` on abstract classes now generates something slightly more useful: An abstract wither method. [Issue #945](https://github.com/projectlombok/lombok/issues/945).\n* BUGFIX: `@Helper` used to only be be legal in pretty specific places; now it works just about everywhere.\n* BUGFIX: lambdas with 1 argument that has an explicit type did not pretty print correctly. [Issue #972](https://github.com/projectlombok/lombok/issues/972).\n* BUGFIX: When using delombok, a source file with only `@NonNull` annotations on parameters as lombok feature would not get properly delomboked.  [Issue #950](https://github.com/projectlombok/lombok/issues/950).\n* BUGFIX: `@Delegate` in javac would generate arrays instead of varargs parameters. [Issue #932](https://github.com/projectlombok/lombok/issues/932).\n* BUGFIX: `@Value` and `@FieldDefaults` no longer make uninitialized static fields final. [Issue #928](https://github.com/projectlombok/lombok/issues/928).\n* ENHANCEMENT: `@Builder.ObtainVia` now has `@Retention(SOURCE)` [Issue #986](https://github.com/projectlombok/lombok/issues/986).\n* ENHANCEMENT: Putting `@NonNull` on a parameter of an abstract method no longer generates a warning, to allow you to use this annotation to document intended behaviour [Issue #807](https://github.com/projectlombok/lombok/issues/807).\n\n### v1.16.6 (August 18th, 2015)\n* FEATURE: `@Helper` can be placed on method-local inner classes to make all methods in the class accessible to the rest of the method. [Full documentation](https://projectlombok.org/features/experimental/Helper).\n* FEATURE: `@Builder(toBuilder = true)` is now available. It produces an instance method that creates a new builder, initialized with all the values of that instance. For more, read the [Feature page on Builder](https://projectlombok.org/features/Builder).\n* FEATURE: the `hashCode()` method generated by lombok via `@EqualsAndHashCode`, `@Data`, and `@Value` is now smarter about nulls; they are treated as if they hash to a magic prime instead of 0, which reduces hash collisions.\n* FEATURE: `@NoArgsConstructor(force = true)` can be used to create no args constructors even if final fields are present.\n* BUGFIX: Parameterized static methods with `@Builder` would produce compiler errors in javac. [Issue #828](https://github.com/projectlombok/lombok/issues/828).\n* BUGFIX: The new annotations-on-types feature introduced in JDK8 did not delombok correctly. [Issue #855](https://github.com/projectlombok/lombok/issues/855).\n* PERFORMANCE: the config system caused significant slowdowns in eclipse if the filesystem is very slow (network file system) or has a slow authentication system.\n* BUGFIX: Various quickfixes in Eclipse Mars were broken. [Issue #861](https://github.com/projectlombok/lombok/issues/861) [Issue #866](https://github.com/projectlombok/lombok/issues/866) [Issue #870](https://github.com/projectlombok/lombok/issues/870).\n\n### v1.16.4 (April 14th, 2015)\n* BUGFIX: Lombok now works with Eclipse Mars.\n* BUGFIX: @UtilityClass could result in uninitialized static variables if compiled with ecj/eclipse. [Issue #839](https://github.com/projectlombok/lombok/issues/839)\n* BUGFIX: This version of lombok has a refactored launcher (the one introduced in v1.16.0), which fixes various bugs related to errors in eclipse concerning loading classes, failure to find lombok classes, and errors on ClassLoaders. Probably impacts issues [Issue #767](https://github.com/projectlombok/lombok/issues/767) and [Issue #826](https://github.com/projectlombok/lombok/issues/826).\n\n### v1.16.2 (February 10th, 2015)\n* FEATURE: The config key `lombok.extern.findbugs.addSuppressFBWarnings` can now be used to add findbugs suppress warnings annotations to all code lombok generates. This addresses feature request [Issue #737](https://github.com/projectlombok/lombok/issues/737).\n* FEATURE: New lombok annotation: `@UtilityClass`, for making utility classes (not instantiable, contains only static 'function' methods). See the [feature documentation](https://projectlombok.org/features/experimental/UtilityClass) for more information.\n* BUGFIX: The ant `delombok` task was broken starting with v1.16.0. Note that the task def class has been changed; taskdef `lombok.delombok.ant.Tasks$Delombok` instead of the old `lombok.delombok.ant.DelombokTask`. [Issue #810](https://github.com/projectlombok/lombok/issues/810).\n* BUGFIX: `val` in javac would occasionally fail if used inside inner classes. This is (probably) fixed. [Issue #729](https://github.com/projectlombok/lombok/issues/729) and [Issue #616](https://github.com/projectlombok/lombok/issues/616).\n* BUGFIX: Starting with v1.16.0, lombok would fail to execute as an executable jar if it was in a path with spaces in it. [Issue #812](https://github.com/projectlombok/lombok/issues/812).\n* BUGFIX: v1.16.0 did not work in old eclipse versions (such as eclipse indigo). [Issue #818](https://github.com/projectlombok/lombok/issues/818).\n\n### v1.16.0 \"Candid Duck\" (January 26th, 2015)\n* BUGFIX: `@ExtensionMethod` was broken in Eclipse using java 8. [Issue #777](https://github.com/projectlombok/lombok/issues/777), [Issue #782](https://github.com/projectlombok/lombok/issues/782)\n* BUGFIX: delombok: Using exotic characters in your source files would overzealously backslash-u escape them. Now, all characters are printed unescaped, assuming your chosen encoding can support them. Otherwise, they are escaped. [Issue #794](https://github.com/projectlombok/lombok/issues/794)\n* PROMOTION: `@Builder` has graduated from experimental to the main package with a few changes (addition of `@Singular`, removal of the `fluent` and `chain` options). The old one still exists and has been deprecated.\n* FEATURE: `@Builder` now supports adding the `@Singular` annotation to any field/parameter that represents a collection, which results in a method in the generated builder that takes in one element of that collection and adds it. Lombok takes care of generating the appropriate code to produce a compacted immutable version of the appropriate type. In this version, java.util collections and guava's ImmutableCollections are supported. See the [feature documentation](https://projectlombok.org/features/Builder) for more information.\n* FEATURE: Added a launcher to the lombok boot process which removes the need for `-Xbootclasspath` to be in your `eclipse.ini` file, and removes all non-public API and third party dependencies (such as ASM) from the lombok jar, thus removing them from your IDE's auto complete offerings in any project that uses lombok. For those debugging lombok, the launcher enables hot code replace which makes debugging a lot easier, as previously one was required to shut down the IDE, rebuild the jar, and relaunch. Add `-Dshadow.override.lombok=/path/to/lombok/bin` to the launch target for hot code replace.\n\n### v1.14.8 (September 15th, 2014)\n* PERFORMANCE: The configuration system typically hit the filesystem twice per read configuration key instead of hardly ever. This is a continuation of [Issue #717](https://github.com/projectlombok/lombok/issues/717).\n\n### v1.14.6 (September 2nd, 2014)\n* BUGFIX: Usage of `val` would break starting with JDK8 release `1.8.0_20`. [Issue #766](https://github.com/projectlombok/lombok/issues/766)\n* BUGFIX: Depending on your eclipse project setup, releases v1.14.0 through v1.14.4 could noticably slow down your eclipse. [Issue #717](https://github.com/projectlombok/lombok/issues/717).\n\n\n### v1.14.4 (July 1st, 2014)\n* BUGFIX: GWT produces errors in handlers on line 1 in any source files that use lombok; this has been fixed. [Issue #734](https://github.com/projectlombok/lombok/issues/734)\n* BUGFIX-IN-PROGRESS: Many pathfinder issues in eclipse (see the bugfix in progress in v1.14.2) have now been fixed. [Issue #717](https://github.com/projectlombok/lombok/issues/717)\n\n### v1.14.2  (June 10th, 2014)\n* BUGFIX: syntax highlighting in eclipse will become weird and auto-complete may stop working amongst other eclipse features in v1.14.0 (regression from v1.12.6). [Issue #723](https://github.com/projectlombok/lombok/issues/723)\n* FEATURE: Added `@Tolerate`; put this annotation on any method or constructor and lombok will skip it when considering whether or not to generate a method or constructor. This is useful if the types of the parameters of your method do not clash with what lombok would generate.\n* FEATURE: Added config key `lombok.getter.noIsPrefix`, which lets you disable use and generation of `isFoo()`, instead going with `getFoo()`, for {@code boolean} fields.\n* BUGFIX: Errors in the eclipse log with `IndexOutOfBound: 2` in `ASTConverter.convertType`. [Issue #721](https://github.com/projectlombok/lombok/issues/721)\n* BUGFIX-IN-PROGRESS: As yet unknown conditions in eclipse result in lots of `IllegalArgumentException` in the log with message \"Path must include project and resource name\". Also, 'invalid URL' or 'URI not absolute' errors can occur when using exotic file system abstractions such as Jazz. These bugs haven't been fixed, but instead of catastrophic failure, warning logs will be emitted instead. [Issue #717](https://github.com/projectlombok/lombok/issues/717)\n* BUGFIX: mvn builds fail with a 'URI not absolute' exception. [Issue #718](https://github.com/projectlombok/lombok/issues/718)\n\n### v1.14.0 \"Branching Cobra\" (May 27th, 2014)\n* FEATURE: You can now configure aspects of lombok project wide (or even workspace wide, or just for a single package) via the [configuration system](https://projectlombok.org/features/configuration). You can configure many things; run `java -jar lombok.jar config -gv` for the complete list.\n* DEPRECATION: `@Delegate` has been moved to `lombok.experimental.Delegate`, and corner cases such as recursive delegation (delegating a type that itself has fields or methods annotated with `@Delegate`) are now error conditions. See the [feature documentation](https://projectlombok.org/features/experimental/Delegate) for more information.\n* FEATURE: It is now possible to put annotations, such as `@Nullable`, on the one parameter of generated `equals()` methods by specifying the `onParam=` option on `@EqualsAndHashCode`, similar to how that feature already exists for `@Setter`. [Issue #709](https://github.com/projectlombok/lombok/issues/709)\n* CHANGE: suppressConstructorProperties should now be configured via lombok configuration. [Issue #694](https://github.com/projectlombok/lombok/issues/694)\n* CHANGE: The `canEqual` method generated by `@EqualsAndHashCode`, `@Value` and `@Data` is now `protected` instead of `public`.  [Issue #695](https://github.com/projectlombok/lombok/issues/695)\n* BUGFIX: Major work on improving support for JDK8, both for javac and eclipse.\n* BUGFIX: Deadlocks would occasionally occur in eclipse when using lazy getters [Issue #625](https://github.com/projectlombok/lombok/issues/625)\n* BUGFIX: Usage of `@SneakyThrows` with a javac from JDK8 with `-target 1.8` would result in a post compiler error. [Issue #690](https://github.com/projectlombok/lombok/issues/690)\n* BUGFIX: Switching workspace on some versions of eclipse resulted in a 'duplicate field' error. [Issue #701](https://github.com/projectlombok/lombok/issues/701)\n\n### v1.12.6 (March 6th, 2014)\n* BUGFIX: Deadlocks would occasionally occur in eclipse during project builds, especially if using the gradle plugin. [Issue #680](https://github.com/projectlombok/lombok/issues/680)\n* PLATFORM: Added support for Eclipse Luna. [Issue #644](https://github.com/projectlombok/lombok/issues/644)\n* PLATFORM: Initial JDK8 support for eclipse's alpha support in kepler. [Issue #632](https://github.com/projectlombok/lombok/issues/632)\n* FEATURE: The various `@Log` annotations now support the `topic` parameter, which sets the logger's name. The default remains the fully qualified type name of the class itself. [Issue #667](https://github.com/projectlombok/lombok/issues/667).\n* BUGFIX: Using lombok with IntelliJ and the IBM JDK would result in NPEs during initialization. [Issue #683](https://github.com/projectlombok/lombok/issues/683).\n* BUGFIX: Eclipse quickfix _Surround with try/catch block_ didn't work inside `@SneakyThrows` annotated methods [Issue #511](https://github.com/projectlombok/lombok/issues/511).\n* BUGFIX: Eclipse refactoring _Extract Local Variable_ didn't work inside `@SneakyThrows` annotated methods [Issue #668](https://github.com/projectlombok/lombok/issues/668).\n* BUGFIX: {Netbeans} @SneakyThrows would lead to unused import and break refactorings [Issue #544](https://github.com/projectlombok/lombok/issues/544).\n* BUGFIX: Eclipse Organize Imports would generate error: AST must not be null [Issue #666](https://github.com/projectlombok/lombok/issues/666).\n* BUGFIX: Copying javadoc to getters / setters / withers would copy non-relevant sections too. [Issue #620](https://github.com/projectlombok/lombok/issues/620).\n* ENHANCEMENT: Lombok used to ship with [JNA](http://en.wikipedia.org/wiki/Java_Native_Access). It added over 800k to the size of lombok.jar and could mess with usage of JNA in your local environment, especially in eclipse. [Issue #682](https://github.com/projectlombok/lombok/issues/682)\n* DETAIL: {Delombok} Inside enum bodies the delombok formatter didn't respect the emptyLines directive [Issue #664](https://github.com/projectlombok/lombok/issues/664).\n* DETAIL: Use smaller primes (<127) for generating hashcodes [Issue #660](https://github.com/projectlombok/lombok/issues/660)\n\n### v1.12.4 (January 15th, 2014)\n* BUGFIX: v1.12.2's delombok turns all operator+assignments into just assignment. Fixed. [Issue #633](https://github.com/projectlombok/lombok/issues/633)\n* BUGFIX: {Netbeans} v1.12.2 doesn't well with netbeans. [Issue #626](https://github.com/projectlombok/lombok/issues/626)\n* ENHANCEMENT: Delombok now supports varied options for how it formats the resulting source files. This includes scanning the source for things like the preferred indent. Use option `--format-help` for more information. [Issue #643](https://github.com/projectlombok/lombok/issues/643)\n* DETAIL: The primes lombok generates for use in generated hashCode() methods used to be direct copies from Effective Java. It turns out these particular primes are used so much, they tend to be a bit more collision-prone, so we switched them. Now, '277' is used instead of '31'. The primes for booleans have also been changed. [Issue #660](https://github.com/projectlombok/lombok/issues/660)\n\n### v1.12.2 (October 10th, 2013)\n* PLATFORM: Initial JDK8 support, without affecting existing support for JDK6 and 7. [Issue #524](https://github.com/projectlombok/lombok/issues/524). While lombok will now work on JDK8 / javac8, and netbeans 7.4 and up, lombok does not (yet) support new language features introduced with java8, such as lambda expressions. Support for these features will be added in a future version.\n* PLATFORM: Running javac on IBM J9 VM would cause NullPointerExceptions when compiling with lombok. These issues should be fixed. [Issue #589](https://github.com/projectlombok/lombok/issues/589).\n* CHANGE: [JDK8-related] The canonical way to write onMethod / onParameter / onConstructor annotation now uses a double underscore instead of a single underscore, so, now, the proper way to use this feature is `@RequiredArgsConstructor(onConstructor=@__(@Inject))`. The old way (single underscore) still works, but generates warnings on javac 8.\n* BUGFIX: Using `@NonNull` on an abstract method used to cause exceptions during compilation. [Issue #594](https://github.com/projectlombok/lombok/issues/594).\n* BUGFIX: Using `@NonNull` on methods that also have `@SneakyThrows` or `@Synchronized` caused arbitrary behaviour. [Issue #623](https://github.com/projectlombok/lombok/issues/623).\n* GERMANY: Major version bumped from 0 to 1, because allegedly this is important. Rest assured, this change is nevertheless backwards compatible.\n\n### v0.12.0 \"Angry Butterfly\" (July 16th, 2013)\n* FEATURE: javadoc on fields will now be copied to generated getters / setters / withers. There are ways to specify separate javadoc for the field, the setter, and the getter, and `@param` and `@return` are handled appropriately. Addresses feature request [Issue #132](https://github.com/projectlombok/lombok/issues/132). [@Getter and @Setter documentation](https://projectlombok.org/features/GetterSetter). [@Wither documentation](https://projectlombok.org/features/experimental/Wither).\n* CHANGE: The desugaring of @Getter(lazy=true) is now less object creation intensive. Documentation has been updated to reflect what the new desugaring looks like. [@Getter(lazy=true) documentation](https://projectlombok.org/features/GetterLazy).\n* PROMOTION: `@Value` has been promoted from experimental to the main package with no changes. The 'old' experimental one is still around but is deprecated, and is an alias for the new main package one. [@Value documentation](https://projectlombok.org/features/Value).\n* FEATURE: {Experimental} `@Builder` support. One of our earliest feature request issues, [Issue #89](https://github.com/projectlombok/lombok/issues/89), has finally been addressed. [@Builder documentation](https://projectlombok.org/features/experimental/Builder).\n* FEATURE: `@NonNull` on a method or constructor parameter now generates a null-check statement at the start of your method. This nullcheck will throw a `NullPointerException` with the name of the parameter as the message. [Issue #549](https://github.com/projectlombok/lombok/issues/549)\n* BUGFIX: Usage of `Lombok.sneakyThrow()` or `@SneakyThrows` would sometimes result in invalid classes (classes which fail with `VerifyError`). [Issue #543](https://github.com/projectlombok/lombok/issues/543)\n* BUGFIX: Using `val` in try-with-resources did not work for javac. [Issue #555](https://github.com/projectlombok/lombok/issues/555)\n* BUGFIX: When using `@Data`, warnings are not generated if certain aspects are not generated because you wrote explicit versions of them. However, this gets confusing with `equals` / `hashCode` / `canEqual`, as nothing is generated if any one of those methods is present. Now, if one of `equals` or `hashCode` is present but not the other one (or `canEqual` is present but `equals` and/or `hashCode` is missing), a warning is emitted to explain that lombok will not generate any of the equals / hashCode methods, and that you should either write them all yourself or remove them all. [Issue #548](https://github.com/projectlombok/lombok/issues/548)\n* BUGFIX: Possibly fixed a race condition in patcher [Issue #566](https://github.com/projectlombok/lombok/issues/566).\n\n### v0.11.8 (April 23rd, 2013)\n* FEATURE: Major performance improvements in eclipse by profiling the project clean process.\n* CHANGE: {Experimental} The experimental `@Value` feature no longer implies the also experimental `@Wither`. If you like your `@Value` classes to make withers, add `@Wither` to the class right next to `@Value`.\n* FEATURE: {Experimental} Reintroduced `onMethod`, `onConstructor` and `onParam` to `@Getter`, `@Setter`, `@Wither`, and `@XArgsConstructor`. These parameters allow you to add annotations to the methods/constructors that lombok will generate. This is a workaround feature: The stability of the feature on future versions of javac is not guaranteed, and if a better way to implement this feature is found, this feature's current incarnation will be removed without a reasonable period of deprecation. [Documentation on the onX feature](https://projectlombok.org/features/experimental/onX)\n* FEATURE: Added support for Log4j v2.0 via `@Log4j2` [Issue #505](https://github.com/projectlombok/lombok/issues/505)\n* ENHANCEMENT: The Lombok installer can now find and install lombok into [JBoss Developer Studio](http://www.redhat.com/products/jbossenterprisemiddleware/developer-studio/). The installer will now also look for eclipse and eclipse variants in your home directory. [Issue #507](https://github.com/projectlombok/lombok/issues/507)\n* BUGFIX: `@ExtensionMethods` no longer causes `VerifyError` exceptions when running eclipse-compiled code if extension methods are called on expressions which are method calls whose return type is a type variable. For example, `someList.get(i).extensionMethod()` would fail that way. [Issue #509](https://github.com/projectlombok/lombok/issues/509)\n* BUGFIX: java 7's try-with-resources statement did not delombok correctly. [Issue #532](https://github.com/projectlombok/lombok/issues/532)\n\n### v0.11.6 (October 30th, 2012)\n* FEATURE: Lombok can be disabled entirely for any given compile run by using JVM switch `-Dlombok.disable`. This might be useful for code style checkers and such.\n* FEATURE: Added support for Slf4j extended logger [Issue #494](https://github.com/projectlombok/lombok/issues/494)\n* BUGFIX: {Delombok} Running delombok has been causing VerifyError errors when used with javac 1.7 since 0.11.0. [Issue #495](https://github.com/projectlombok/lombok/issues/495)\n* BUGFIX: A conflict between lombok and certain eclipse plugins would result in NullPointerExceptions in the log when using `@Delegate`.\n* BUGFIX: `NullPointerException in lombok.&#8203;javac.&#8203;handlers.&#8203;JavacHandlerUtil.&#8203;upToTypeNode&#8203;(JavacHandlerUtil.java:978)` when compiling with `@ExtensionMethod` in javac and generated constructors are involved. [Issue #496](https://github.com/projectlombok/lombok/issues/496)\n* BUGFIX: `@Deprecated` on a field that gets a generated setter in eclipse would result in `IllegalArgumentException`, which you wouldn't see unless you have the error log open. If you have save actions defined, you'd get a popup box with the exception. Now fixed. [Issue #481](https://github.com/projectlombok/lombok/issues/481)\n\n### v0.11.4 (August 13th, 2012)\n* FEATURE: {Experimental} `@Value`, `@Wither` and `@FieldDefaults` are now available. These are a lot like `@Data` but geared towards immutable classes. [Documentation on @Value](https://projectlombok.org/features/experimental/Value), [Documentation on @Wither](https://projectlombok.org/features/experimental/Wither) and [Documentation on @FieldDefaults](https://projectlombok.org/features/experimental/FieldDefaults).\n* BUGFIX: Eclipse would throw an OOME if using `@ExtensionMethod`. [Issue #463](https://github.com/projectlombok/lombok/issues/463)\n* BUGFIX: {Netbeans} `@Cleanup` and `@Synchronized` cause far fewer issues in the netbeans editor. [Issue #466](https://github.com/projectlombok/lombok/issues/466)\n* BUGFIX: {Installer} Erroneous messages about the installer complaining about needing root access when installing or removing lombok from eclipse installs has been fixed. The installer edge of this problem was actually already fixed in v0.11.2. [Issue #436](https://github.com/projectlombok/lombok/issues/436)\n* BUGFIX: `@ExtensionMethod` had all sorts of issues in javac. [Issue #472](https://github.com/projectlombok/lombok/issues/472)\n* BUGFIX: Generating static constructors with javac when you have fields with generics, i.e. `Class<T>`, caused errors. [Issue #469](https://github.com/projectlombok/lombok/issues/469)\n* BUGFIX: Minor `@ExtensionMethod` issues in eclipse, such as the ability to call extension methods on a `super` reference which is now no longer possible. [Issue #479](https://github.com/projectlombok/lombok/issues/479)\n\n### v0.11.2 \"Dashing Kakapo\" (July 3rd, 2012)\n* FEATURE: {Experimental} `@ExtensionMethod` is now available to add extensions to\nany type in the form of static methods that take as first parameter an object of that type. [Documentation on @ExtensionMethod](https://projectlombok.org/features/experimental/ExtensionMethod)\n* FEATURE: ONGOING: Fix for using lombok together with gwt-designer.\n* ENHANCEMENT: Small performance enhancements in `equals` and `hashCode`. [Issue #439](https://github.com/projectlombok/lombok/issues/439)\n* BUGFIX: Eclipse would display an error message regarding an invalid super constructor in the wrong location. [Issue #409](https://github.com/projectlombok/lombok/issues/409)\n* BUGFIX: Eclipse refactor script 'rename method arguments' should work more often with lombok-affected methods.\n* BUGFIX: Using `val` in an enhanced for loop did not work if the iterable was a raw type.\n* BUGFIX: Using `@Getter(lazy=true)` when the data type is boolean, int, array, or some other type that requires special treatment for hashCode/equals, now works properly with `@Data`, `@EqualsHashCode` and `@ToString`. [Issue #449](https://github.com/projectlombok/lombok/issues/449)\n* BUGFIX: `SneakyThrows` in constructor should not wrap this/super call in try-block [Issue #454](https://github.com/projectlombok/lombok/issues/454)\n* BUGFIX: Setting breakpoints on code above the first generated method was not possible. [Issue #450](https://github.com/projectlombok/lombok/issues/450)\n\n### v0.11.0 (March 26th, 2012)\n* FEATURE: {Experimental} 'fluent' getters and setters (using just `fieldName` as methodname instead of `getFieldName`), setters that return `this` instead of `void`, and support for fields with prefixes is introduced with this lombok version. Also, the number of parameters of any existing methods with the same name that lombok would generate are now taken into account; previously if you had any method named `setX` regardless of how many parameters it has, lombok would avoid generating a `setX` method. Now lombok generates the method if all present `setX` methods have a number of parameters other than 1. [documentation](https://projectlombok.org/features/experimental/Accessors).\n* FEATURE: The combination of `@Delegate` and `@Getter` or `@Data` will now delegate to the result of a generated getter. [Issue #401](https://github.com/projectlombok/lombok/issues/401)\n* FEATURE: Developing android apps on eclipse with lombok is now possible by running `java -jar lombok.jar publicApi` and including the generated jar in your project. [Documentation on using lombok for android development](https://projectlombok.org/setup/android).\n* BUGFIX: In NetBeans the generated default constructor would still be generated even if Lombok also generated constructors. [Issue #399](https://github.com/projectlombok/lombok/issues/399)\n* BUGFIX: Some classes that contain @SneakyThrows would not compile (throw ClassFormatError). [Issue #412](https://github.com/projectlombok/lombok/issues/412)\n* BUGFIX: delombok: When `@Delegate` would generate a method with type parameters of the type `T extends package.Class`, a dot would be prepended to the type name. [Issue #414](https://github.com/projectlombok/lombok/issues/414)\n* BUGFIX: @Getter and @Setter now generate deprecated methods for deprecated fields. Fixes [Issue #415](https://github.com/projectlombok/lombok/issues/415)\n* BUGFIX: @Delegate would not generate @Deprecated on methods marked deprecated in javadoc. Fixes [Issue #421](https://github.com/projectlombok/lombok/issues/421)\n* BUGFIX: Using `val` with a type like `Outer<TypeArgs>.Inner` now works. [Issue #416](https://github.com/projectlombok/lombok/issues/416)\n* BUGFIX: `@Getter(lazy=true)` where the variable type is a primitive and the initializing expression is of a different primitive type that would type coerce implicitly, i.e. ints can be assigned to longs without a cast, didn't work before. [Issue #418](https://github.com/projectlombok/lombok/issues/418)\n* BUGFIX: `val` is no longer legal inside basic for loops (the old kind, not the foreach kind). These variables should rarely be final, and in practice it wasn't possible to delombok this code properly. [Issue #419](https://github.com/projectlombok/lombok/issues/419)\n* BUGFIX: PrettyCommentsPrinter now prints default clause of annotation methods. Fixes [Issue #423](https://github.com/projectlombok/lombok/issues/423)\n\n### v0.10.8 (January 19th, 2012)\n* FEATURE: `@Delegate` can now be used on a no-argument method, which works similarly to adding it to fields. See [documentation](https://projectlombok.org/features/Delegate).\n* BUGFIX: Eclipse refactoring Extract Interface was broken when using lombok annotation to generate methods. [Issue #159](https://github.com/projectlombok/lombok/issues/159)\n* BUGFIX: Eclipse action Sort Members was broken when using lombok annotations to generate methods or fields. [Issue #338](https://github.com/projectlombok/lombok/issues/338)\n* BUGFIX: Eclipse action Refactor/Rename on an inner type was broken when using lombok annotations. [Issue #389](https://github.com/projectlombok/lombok/issues/389)\n* BUGFIX: 0.10.6 causes ClassNotFoundErrors when using ecj (and thus, play framework, gwt, etc). [Issue #393](https://github.com/projectlombok/lombok/issues/393)\n* BUGFIX: Eclipse parsing was broken when using lombok annotations with parentheses. [Issue #398](https://github.com/projectlombok/lombok/issues/398)\n* ENHANCEMENT: Lombok now adds a line to the Eclipse About dialog about itself.\n\n### v0.10.6 (December 19th, 2011)\n* PERFORMANCE: Performance issues (memory leaks) when using lombok in netbeans, introduced in 0.10, have been fixed. [Issue #315](https://github.com/projectlombok/lombok/issues/315)\n* BUGFIX: Eclipse quickfix \"Add unimplemented methods\" would sometimes insert the new method stubs in strange places, especially if `@Data` was present. [Issue #124](https://github.com/projectlombok/lombok/issues/124)\n* BUGFIX: Eclipse quickfix \"Assign parameter to new field\" would insert it outside the class body if `@Data` was present. [Issue #295](https://github.com/projectlombok/lombok/issues/295)\n* BUGFIX: Renaming a @Data-annotated class in eclipse using Alt+Shift+R no longer mangles the data annotation. [Issue #359](https://github.com/projectlombok/lombok/issues/359)\n* BUGFIX: Using save action 'Use this qualifier for field accesses, only if necessary' did not work together with `@Data` in certain cases. [Issue #374](https://github.com/projectlombok/lombok/issues/374)\n* BUGFIX: Organize imports, either run manually or as save action, would throw an exception. [Issue #381](https://github.com/projectlombok/lombok/issues/381)\n* BUGFIX: Extracted constants would be placed outside the class body when a logging annotation was present. [Issue #388](https://github.com/projectlombok/lombok/issues/388)\n\n### v0.10.4 (November 21st, 2011)\n* BUGFIX: Using the `log` field from `@Log`, etc, now works in static initializers. [Issue #368](https://github.com/projectlombok/lombok/issues/368)\n* BUGFIX: Auto-formatting code containing lombok on eclipse, even via an auto-save action, now works. [Issue #163](https://github.com/projectlombok/lombok/issues/163)\n* BUGFIX: Letting eclipse generate various methods when a lombok annotation is present now works. [Issue #211](https://github.com/projectlombok/lombok/issues/211)\n* BUGFIX: Renaming a @Data-annotated class in eclipse no longer mangles the data annotation. [Issue #359](https://github.com/projectlombok/lombok/issues/359)\n* BUGFIX: Eclipse save action *Add final modifier to private fields* no longer adds final keyword to `@Setter` fields. [Issue #336](https://github.com/projectlombok/lombok/issues/336)\n* BUGFIX: Mixing labels and `lombok.val` would cause NPEs in javac. [Issue #372](https://github.com/projectlombok/lombok/issues/372)\n* BUGFIX: Writing `lombok.val` out in full (vs. using an import statement) did not work in eclipse. [Issue #373](https://github.com/projectlombok/lombok/issues/373)\n\n### v0.10.2 (November 1st, 2011)\n* BUGFIX: Delombok will no longer jumble up comments from different files when using -sourcepath option. [Issue #357](https://github.com/projectlombok/lombok/issues/357)\n* BUGFIX: Turns out treating `@NotNull` as an annotation that indicates lombok should generate nullcheck guards causes all sorts of problems. This has been removed again, and documentation has been updated to reflect this. [Issue #360](https://github.com/projectlombok/lombok/issues/360)\n* BUGFIX: `@EqualsAndHashCode` or `@Data` did not work on non-static inner classes whose outer class has a type variable. It does now. [Issue #362](https://github.com/projectlombok/lombok/issues/362)\n\n### v0.10.1 (October 3rd, 2011)\n* BUGFIX: `@Delegate` in eclipse could cause memory leaks in 0.10.0. [Issue #337](https://github.com/projectlombok/lombok/issues/337)\n* BUGFIX: Annotations on enum values were being deleted by delombok. [Issue #342](https://github.com/projectlombok/lombok/issues/342)\n* BUGFIX: `@AllArgsConstructor` was erroneously generating a parameter and an assignment for final variables already assigned in their declaration. [Issue #351](https://github.com/projectlombok/lombok/issues/351)\n* ENHANCEMENT: `@NotNull` is now also recognized as an annotation indicating that lombok should generate nullcheck guards in generated constructors and setters. [Issue #344](https://github.com/projectlombok/lombok/issues/344)\n\n### v0.10.0 \"Burning Emu\" (August 19th, 2011)\n* FEATURE: New annotation: @Delegate. This annotation lets lombok generate delegation methods for a given field. [More&hellip;](https://projectlombok.org/features/Delegate)\n* FEATURE: Added support for 'val'. Val is an immutable variable that infers its type from the right hand side of the initializing expression. [More&hellip;](https://projectlombok.org/features/val)\n* FEATURE: Added support for several logging frameworks via the `@Log`, `@Slf4j`, etc. annotation. [More&hellip;](https://projectlombok.org/features/log)\n* FEATURE: Lombok now supports post-compile transformers. [Issue #217](https://github.com/projectlombok/lombok/issues/217)\n* FEATURE: Using `@SneakyThrows` no longer requires a runtime dependency on lombok.jar. In fact, any call to `Lombok.sneakyThrows(ex)` is optimized at the bytecode level and no longer requires you to actually have lombok.jar or lombok-runtime.jar on the classpath.\n* FEATURE: @*X*ArgsConstructor, @Getter, and @ToString can now be used on enum declarations. Previously, behaviour of these annotations on enums was undefined.\n* FEATURE: @Getter/@Setter (and by extension, @Data) in v0.9.3 and earlier would generate getter and setter method names that did not conform to the beanspec, primarily when faced with boolean properties. This has been fixed. In practice this won't affect you unless you have properties named `isFoo` or `hasFoo`. Now the setter generated for this will be called `setFoo` (as the property name is `foo`) and not `setIsFoo`. Also, `hasFoo` is now no longer special; the names would be `isHasFoo` and `setHasFoo`. The java bean spec does not give `has` special meaning.\n* FEATURE: `@EqualsAndHashCode` (and by extension, `@Data`) now add a `canEqual` method which improves the sanity of equality amongst a hierarchy of classes. [More&hellip;](https://projectlombok.org/features/EqualsAndHashCode)\n* FEATURE: `@Getter` now supports a `lazy=true` attribute. [More&hellip;](https://projectlombok.org/features/GetterLazy)\n* ENHANCEMENT: The installer will now find Eclipse installations when they are located in a subdirectory of a directory containing the word 'eclipse' . [Issue #283](https://github.com/projectlombok/lombok/issues/283)\n* ENHANCEMENT: Add null check for `@Cleanup` [Issue #227](https://github.com/projectlombok/lombok/issues/227)\n* BUGFIX: Lombok is now compatible with javac 7.\n* BUGFIX: Hard to reproduce `NullPointerException` in Eclipse on the `getTypeBinding` method in the error log has been fixed. [Issue #237](https://github.com/projectlombok/lombok/issues/237)\n* BUGFIX: `@Setter` and `@Getter` can now be applied to static fields again (was broken in v0.9.3 only). [Issue #209](https://github.com/projectlombok/lombok/issues/209)\n* BUGFIX: delombok added type parameters to constructors that mirror the type's own type parameters. This resulted in delombok turning any generated constructor that takes at least 1 parameter of type 'T' into something that didn't compile, and to boot, a confusing error message ('T is not compatible with T'). This is now fixed. [Issue #213](https://github.com/projectlombok/lombok/issues/213)\n* BUGFIX: The Eclipse source generator would place the generated code outside the class [Issue #228](https://github.com/projectlombok/lombok/issues/228)\n* BUGFIX: When using m2eclipse, occasionally you'd see a ClassNotFoundError on JavacProcessingEnvironment. This has been fixed. [Issue #250](https://github.com/projectlombok/lombok/issues/250)\n* BUGFIX: Either all or none of `equals`, `hashCode` and `canEqual` will be generated. [Issue #313](https://github.com/projectlombok/lombok/issues/313)\n* BUGFIX: Delombok in output-to-directory mode was generating very long paths on mac and linux. [Issue #322](https://github.com/projectlombok/lombok/issues/322)\n* BUGFIX: Various refactor scripts and save actions bugs have been fixed in eclipse, though most remain.\n\n### v0.9.3 \"Burrowing Whale\" (July 25th, 2010)\n* FEATURE: Adding `@Getter` or `@Setter` to a class is now legal and is like adding those annotations to every non-static field in it. [Issue #202](https://github.com/projectlombok/lombok/issues/202)\n* FEATURE: Three new annotations, `@NoArgsConstructor`, `@RequiredArgsConstructor` and `@AllArgsConstructor` have been added. These split off `@Data`'s ability to generate constructors, and also allow you to finetune what kind of constructor you want. In addition, by using these annotations, you can force generation of constructors even if you have your own. [Issue #152](https://github.com/projectlombok/lombok/issues/152)\n* FEATURE: Constructors generated by lombok now include a `@java.beans.ConstructorProperties` annotation. This does mean these constructors no longer work in java 1.5, as this is a java 1.6 feature. The annotation can be suppressed by setting `suppressConstructorProperties` to `true` in a `@RequiredArgsConstructor` or `@AllArgsConstructor` annotation. [Issue #195](https://github.com/projectlombok/lombok/issues/195)\n* FEATURE: generated `toString`, `equals` and `hashCode` methods will now use `this.getX()` and `other.getX()` instead of `this.x` and `other.x` if a suitable getter is available. This behaviour is useful for proxied classes, such as the POJOs that hibernate makes. Usage of the getters can be suppressed with `@ToString/@EqualsAndHashCode(doNotUseGetters = true)`. [Issue #183](https://github.com/projectlombok/lombok/issues/183)\n* ENHANCEMENT: FindBugs' `@CheckForNull` is now copied from a field to a setter's parameter and the getter method just like `@Nullable`. [Issue #201](https://github.com/projectlombok/lombok/issues/201)\n* ENHANCEMENT: plugins and `@SneakyThrows`: Resolving types in annotations now works better especially for classes that aren't in the core java libraries. [Issue #161](https://github.com/projectlombok/lombok/issues/161)\n* ENHANCEMENT: If `tools.jar` isn't found (required when running _delombok_), now a useful error message is generated. The search for `tools.jar` now also looks in `JAVA_HOME`.\n* ENHANCEMENT: toString() on inner classes now lists the class name as `Outer.Inner` instead of just `Inner`. [Issue #206](https://github.com/projectlombok/lombok/issues/206)\n* ENHANCEMENT: All field accesses generated by lombok are now qualified (like so: `this.fieldName`). For those who have a warning configured for unqualified field access, those should no longer occur. [Issue #121](https://github.com/projectlombok/lombok/issues/121)\n* ENHANCEMENT: All fields and methods generated by lombok now get `@SuppressWarnings(\"all\")` attached to avoid such warnings as missing javadoc, for those of you who have that warning enabled. [Issue #120](https://github.com/projectlombok/lombok/issues/120)\n* PLATFORMS: Lombok should now run in stand-alone ecj (Eclipse Compiler for Java). This isn't just useful for the few souls actually using this compiler day to day, but various eclipse build tools such as the RCP builder run ecj internally as well. [Issue #145](https://github.com/projectlombok/lombok/issues/145)\n* BUGFIX: Eclipse: `@Data` and other annotations now don't throw errors when you include fields with bounded wildcard generics, such as `List<? extends Number>`. [Issue #157](https://github.com/projectlombok/lombok/issues/157)\n* BUGFIX: complex enums didn't get delomboked properly. [Issue #169](https://github.com/projectlombok/lombok/issues/169)\n* BUGFIX: delombok now no longer forgets to remove `import lombok.AccessLevel;`. In netbeans, that import will no longer be flagged erroneously as being unused. [Issue #173](https://github.com/projectlombok/lombok/issues/173) and [Issue #176](https://github.com/projectlombok/lombok/issues/176)\n* BUGFIX: While its discouraged, `import lombok.*;` is supposed to work in the vast majority of cases. In eclipse, however, it didn't. Now it does. [Issue #175](https://github.com/projectlombok/lombok/issues/175)\n* BUGFIX: When `@Getter` or `@Setter` is applied to a multiple field declaration, such as `@Getter int x, y;`, the annotation now applies to all fields, not just the first. [Issue #127](https://github.com/projectlombok/lombok/issues/127)\n* BUGFIX: delombok on most javacs would quit with a NoSuchFieldError if it contains `<?>` style wildcards anywhere in the source, as well as at least 1 lombok annotation. No longer. [Issue #207](https://github.com/projectlombok/lombok/issues/207)\n* BUILD: dependencies are now fetched automatically via ivy, and most dependencies now include sources by default, which is particularly handy for those working on the lombok sources themselves.\n\n### v0.9.2 \"Hailbunny\" (December 15th, 2009)\n* preliminary support for lombok on NetBeans! - thanks go to Jan Lahoda from NetBeans. [Issue #93](https://github.com/projectlombok/lombok/issues/93)\n* lombok now ships with the delombok tool, which copies an entire directory filled with sources to a new directory, desugaring any java files to what it would look like without lombok's transformations. Compiling the sources in this new directory without lombok support should result in the same class files as compiling the original with lombok support. Great to double check on what lombok is doing, and for chaining the delombok-ed sources to source-based java tools such as Google Web Toolkit or javadoc. lombok.jar itself also provides an ant task for delombok. [Full documentation of delombok](https://projectlombok.org/features/delombok).\n* Lombok now works on openjdk7 (tested with JDK7m5)! For all the folks on the cutting edge, this should be very good news. [Issue #134](https://github.com/projectlombok/lombok/issues/134) - thanks go to Jan Lahoda from NetBeans.\n* lombok now has various command-line accessible utilities bundled with it. Run `java -jar lombok.jar --help` to see them. Included (aside from the already mentioned delombok):\n* Ability to create a tiny jar named lombok-runtime.jar with runtime dependencies. The lombok transformations that have a runtime dependency on this jar can be listed as well. Run `java -jar lombok.jar createRuntime --help` for more information.\n* Scriptable command line install and uninstall options. Run `java -jar lombok.jar install --help` (or `uninstall`, of course) for more information. Technically this support has been there in earlier versions, but the command line options are now much more lenient, not to mention more visible.\n* Lombok now works on Springsource Tool Suite. [Issue #95](https://github.com/projectlombok/lombok/issues/95)\n* Lombok now works on JDK 1.6.0_0, for those of us who have really old JDK1.6's installed on their system. [Issue #156](https://github.com/projectlombok/lombok/issues/156)\n* Erroneous use of lombok in Eclipse (adding it to a project as an annotation processor, which is not how lombok is to be used on Eclipse) now generates a useful warning message with helpful information, instead of a confusing error hidden in the logs. [Issue #126](https://github.com/projectlombok/lombok/issues/126)\n* FIXED: Regression bug where you would occasionally see errors with the gist 'loader constraint violation: when resolving...', such as when opening the help system, starting the diff editor, or, rarely, opening any java source file. [Issue #141](https://github.com/projectlombok/lombok/issues/141)\n* FIXED: @SneakyThrows without any parameters should default to `Throwable.class` but it didn't do anything in javac. [Issue #146](https://github.com/projectlombok/lombok/issues/146)\n* FIXED: Capitalization is now ignored when scanning for existing methods, so if `setURL` already exists, then a `@Data` annotation on a class with a field named `url` will no longer _also_ generate `setUrl`. [Issue #148](https://github.com/projectlombok/lombok/issues/148)\n\n### v0.9.1 (November 9th, 2009)\n\n* The installer now works much better on linux, in that it auto-finds eclipse in most locations linux users tend to put their eclipse installs, and it can now handle apt-get installed eclipses, which previously didn't work well at all. There's also a hidden feature where the installer can work as a command-line only tool (`java -jar lombok.jar install eclipse path/to/eclipse`) which also supports `uninstall` of course. You can now also point at `eclipse.ini` in case you have a really odd eclipse install, which should always work.\n* For lombok developers, the eclipse launch target now works out-of-the-box on snow leopard. [Issue #139](https://github.com/projectlombok/lombok/issues/139)\n\n### v0.9.0 (November 2nd, 2009)\n\n* The lombok class patching system has been completely revamped; the core business of patching class files has been offloaded in an independent project called 'lombok.patcher', which is now used to patch lombok into eclipse.\n* Many behind-the-scenes changes to improve lombok's stability and flexibility on eclipse.\n* Changes to the lombok core API which aren't backwards compatible with lombok series v0.8 but which were necessary to make writing third party processors for lombok a lot easier.\n* Minor version number bumped due to the above 3 issues.\n* Eclipse's \"rename\" refactor script, invoked by pressing CMD/CTRL+SHIFT+R, now works on `@Data` annotated classes.\n* The windows installer would fail on boot if you have unformatted drives. [Issue #138](https://github.com/projectlombok/lombok/issues/138)\n* The static constructor that `@Data` can make was being generated as package private when compiling with javac. [Issue #136](https://github.com/projectlombok/lombok/issues/136)\n\n### v0.8.5 (September 3rd, 2009)\n\n* There's now an `AccessLevel.NONE` that you can use for your `@Getter` and `@Setter` annotations to suppress generating setters and getters when you're using the `@Data` annotation. Address [Issue #110](https://github.com/projectlombok/lombok/issues/110)\n* Both `@EqualsAndHashCode` and `@ToString` now support explicitly specifying the fields to use, via the new 'of' parameter. Fields that begin with a '$' are now also excluded by default from equals, hashCode, and toString generation, unless of course you explicitly mention them in the 'of' parameter. Addresses [Issue #105](https://github.com/projectlombok/lombok/issues/105)\n* There's a commonly used `@NotNull` annotation, from javax.validation (and in earlier versions of hibernate, which is the origin of javax.validation) which does not quite mean what we want it to mean: It is not legal on parameters, and it is checked at runtime after an explicit request for validation. As a workaround, we've removed checking for any annotation named `NotNull` from the nonnull support of lombok's generated Getters, Setters, and constructors. [Issue #116](https://github.com/projectlombok/lombok/issues/116)\n* Fixed yet another issue with `@SneakyThrows`. This was reported fixed in v0.8.4. but it still didn't work quite as it should. Still falls under the bailiwick of\n[Issue #103](https://github.com/projectlombok/lombok/issues/103)\n\n### v0.8.4 (September 2nd, 2009)\n\n* Fixed many issues with `@SneakyThrows` - in previous versions, using it would sometimes confuse the syntax colouring, and various constructs in the annotated method would cause outright eclipse errors, such as beginning the method with a try block. This also fixes [Issue #103](https://github.com/projectlombok/lombok/issues/103)\n* Fixed the David Lynch bug - in eclipse, classes with lombok features used in them would sometimes appear invisible from other source files. It's described in more detail on [Issue #114](https://github.com/projectlombok/lombok/issues/114). If you suffered from it, you'll know what this is about.\n* Fixed the problem where eclipse's help system did not start up on lombokized eclipses. [Issue #99](https://github.com/projectlombok/lombok/issues/99)\n* All generated methods now make their parameters (if they have any) final. This should help avoid problems with the 'make all parameters final' save action in eclipse. [Issue #113](https://github.com/projectlombok/lombok/issues/113)\n* Okay, this time _really_ added support for @NonNull and @NotNull annotations. It was reported for v0.8.3 but it wasn't actually in that release. @Nullable annotations are now also copied over to the getter's return type and the setter and constructor's parameters (but, obviously, no check is added). Any @NonNull annotated non-final fields that are not initialized are now also added to the generated constructor by @Data in order to ensure via an explicit null check that they contain a legal value.\n* @ToString (and hence, @Data) now default to includeFieldNames=true. [Issue #108](https://github.com/projectlombok/lombok/issues/108)\n\n### v0.8.3 (August 21st, 2009)\n\n* @EqualsAndHashCode (and, indirectly, @Data) generate a warning when overriding a class other than java.lang.Object but not setting EqualsAndHashCode's callSuper to true. There are, however, legitimate reasons to do this, so this warning is now no longer generated if you explicitly set callSuper to false. The warning text now also refers to this action if not calling super is intentional.\n* If your fields have @NonNull or @NotNull annotations, then generated setters are generated with a null check, and the\nannotation is copied to the setter's parameter, and the getter's method.\n* An annoying bug that usually showed up if you had package-info.java files has been fixed. It would cause a `NullPointerException` at lombok.javac.apt.Processor.toUnit(Processor.java:143)\n\n### v0.8.2 (July 29th, 2009)\n\n* @EqualsAndHashCode and @ToString created; these are subsets of what @Data does (namely: generate toString(), and generate equals() and hashCode() implementations). @Data will still generate these methods, but you can now generate them separately if you wish. As part of this split off, you can now specify for toString generation to include the field names in the produced toString method, and for all 3 methods: You can choose to involve the implementation of the superclass, and you can choose to exclude certain fields. [Issue #81](https://github.com/projectlombok/lombok/issues/81)\n* when compiling with javac: warnings on specific entries of an annotation parameter (such as non-existent fields in a @EqualsAndHashCode exclude parameter) now show up on the problematic parameter and not on the entire annotation. [Issue #84](https://github.com/projectlombok/lombok/issues/84)\n\n### v0.8.1 (July 26th, 2009)\n\n* Changelog tracking from this version on.\n* Using eclipse's 'find callers' on a @Data annotation will now find callers of the static constructor if you generated it. If not, it still finds callers to hashCode() as before (it's not possible to make eclipse find callers to the normal constructor, though you can just use 'find callers' on the class name, which works fine). [Issue #78](https://github.com/projectlombok/lombok/issues/78)\n* If your field is called 'hasFoo' and its a boolean, and you use @Getter or @Data to generate a getter for it, that getter will now be called 'hasFoo' and not 'isHasFoo' as before. This rule holds for any field prefixed with 'has', 'is', or 'get', AND the character following the prefix is not lowercase (so that 'hashCodeGenerated' is not erroneously identified as already having a prefix!). Similar logic has been added to not generate a getter at all for a field named 'foo' or 'hasFoo' if there is already a method named 'isFoo'. [Issue #77](https://github.com/projectlombok/lombok/issues/77)\n* Starting the lombok installer on mac os X using soylatte instead of apple's JVM now correctly detects being on a mac, and using mac-specific code for finding and installing eclipses. [Issue #80](https://github.com/projectlombok/lombok/issues/80)\n* For non-mac, non-windows installations, the jar file in the `-javaagent` parameter is now written as an absolute path in `eclipse.ini` instead of a relative one. For some reason, on at least 1 linux installation, an absolute path is required to make javaagent work. This 'fix' has the unfortunate side-effect of making it impossible to move your eclipse installation around without breaking the pointer to the lombok java agent, so this change has only been introduced for non-windows, non-mac. Thanks to WouterS for spotting this one and helping us out with some research on fixing it. [Issue #79](https://github.com/projectlombok/lombok/issues/79)\n\n### v0.8\n\n* Initial release before announcements\n* (note: There are a few different editions of lombok out there, all tagged with v0.8.)\n"
  },
  {
    "path": "doc/debug-insights/eclipse.txt",
    "content": "# How to debug lombok running in eclipse\n\n## Overview\n\nLombok's build scripting can generate a target for you, that lets you run the same eclipse installation inside eclipse, in debug mode. Now you can add breakpoints.\n\nAs lombok is an agent, lombok __must__ load from a jar file.\nNevertheless, lombok can be hot-code-replaced in the debugger.\nThis works via the loader: The lombok agent has its own classloading architecture, and this architecture is capable of loading lombok's class files from a location of your choosing. Choose the /bin dir from your eclipse project which will help with debugging; eclipse will then be able to apply HCR to the eclipse-running-in-eclipse. Unless there are issues with the loader architecture itself, of course.\n\nThe end goal is that you can make some changes to the lombok sources in your eclipse, then click the 'debug' button, and a new 'test eclipse' starts up using lombok as you wrote it just now. You can now make changes to lombok sources in the original eclipse, hit 'save', and these changes now get automatically applied to the 'test eclipse', as long as you aren't making any changes to signatures (add or remove methods/fields/types, or change return types, param types, etc).\n\nIf you have the sources to eclipse itself, you can open them, set breakpoints, and step through, though be aware that lombok's agent injection system does cause some issues here; we move methods into different classes and eclipse's debugger naturally doesn't understand this, so you can't breakpoint lombok's own patch methods, and stepping through them 'works' but looks bizarre in the debugger as the debugger now thinks your source file clearly cannot possibly match the class file currently running. Just keep going ('step out'), eclipse will figure it out again once you're back in un-instrumented eclipse code.\n\n\nTODO:\n\nDescribe in detail:\n\n* Which ant tasks to run to create the targets\n* How to modify this target, if needed, to point at your bin dir\n\n"
  },
  {
    "path": "doc/debug-insights/vscode.txt",
    "content": "As per @Rawi01's experimenting:\n\n* VSCode's lombok plugin simply adds the appropriate `-javaagent` options when it fires up the eclipse-based language server. You can also add debug flags here.\n* Add the flags `-agentlib:jdwp-transport=dt_socket,server=y,suspend=n,quiet=y,address=12345` to the `settings.json` of the VSCode lombok plugin, and then tell your debugger to attach to localhost:12345.\n* Set the property `java.server.launchMode` to `\"Standard\"`.\n* Consider activating the language server debug mode.\n\n"
  },
  {
    "path": "doc/experiences.txt",
    "content": "## Fix HandleCleanup\n\nConsider requiring an initializer and warn when the varname gets reassigned, if the declaration wasn't already final. Think about this more.\n\nRight now exceptions thrown by the cleanup method will mask any exceptions thrown in the main body, which is not wanted. This does not appear to be doable without java 7 features or very extensive additions to the lombok framework.\n\nA lot has been tried:\n\n    Tried tactics, and why they won't work:\n    \n     - Replace every 'return', 'break', and 'continue' statement (for the latter 2, only if they break/continue out of the try block) with a block that first sets a uniquely named flag before doing the operation.\n       Then, check that flag in the finally block to see if the cleanup call should be guarded by a try/catchThrowable. This doesn't work, because its not possible to instrument the 4th way out of a try block:\n       just running to the end of it. Putting a 'flag = true;' at the end isn't safe, because that might be unreachable code.\n    \n     - Put catch blocks in for all relevant exceptions (RuntimeException, Error, all exceptions declared as thrown by the method, and all types of exceptions of the catch blocks of encapsulating try blocks.\n       This doesn't work, partly because it'll fail for sneakily thrown exceptions, but mostly because you can't just catch an exception listed in the 'throws' clause of the method body; catching an exception\n       that no statement in the try block can throw is a compile time error, but it is perfectly allright to declare these as 'thrown'.\n    \n     - Put in a blanket catch Throwable to set the flag. Two problems with this:\n       First, sneaky throw can't be done. Thread.stop invokes a security manager and triggers a warning, Calling a sneakyThrow method creates a runtime dependency on lombok, constructing a sneakyThrow in-class\n       requires either lots of \"$1\" classes that clog up permgen, or are slow and require reflection tricks to load live off of a byte array literal.\n       Secondly, this would mean that any statements in the try body that throw an exception aren't flagged to the user as needing to be handled. Unacceptable.\n    \n    The Cleanup annotation now also calls the cleanup method for you, and will call it at the END of the current scope. The following plans have been tried and abandoned:\n    \n     - Cleanup right after the final mention. This doesn't work, because the final mention may not be the final use-place. Example:\n       @Cleanup InputStream in = new FileInputStream(someFile);\n       InputStreamReader reader = new InputStreamReader(in);\n       reader.read(); //oops - in is already closed by now.\n    \n     - Require an explicit var.cleanup() call and consider that the cue to close off the try block.\n       This doesn't work either, because now variables set in between the @Cleanup declaration and the var.cleanup() call become invisible to following statements. Example:\n       @Cleanup InputStream in = new FileInputStream(someFile);\n       int i = in.read();\n       in.close();\n       System.out.println(i); //fail - i is inside the generated try block but this isn't, so 'i' is not visible from here.\n    \n    By running to the end of visible scope, all these problems are avoided. This does remove the flexibility of declaring where you want a close call to be executed, but there are two mitigating factors available:\n    \n     1) Create an explicit scope block. You can just stick { code } in any place where you can legally write a statement, in java. This is relatively unknown, so I expect most users will go for:\n    \n     2) Just call close explicitly. I've yet to see a cleanup method which isn't idempotent anyway (calling it multiple times is no different than calling it once).\n    "
  },
  {
    "path": "doc/git-workflow.txt",
    "content": "# git workflow for Project Lombok\n\npublic branch 'master' tracks major releases and should always be in an effectively working condition. It is updated only occasionally, and virtually always just points at a particularly stable point on the more dynamic 'develop' branch.\n\npublic branch 'develop' is still intended to run more or less stable, but is less tested and is what developers check completed features into.\n\nEach version release is accompanied by a tag.\n\nTo develop a new feature, no matter how trivial:\n\n\tgit checkout develop        # start from branch 'develop'\n\tgit checkout -b fixFoobar   # Create a new branch for yourself\n\t.....                       # write and commit stuff\n\tgit checkout develop        # go back to develop to update it\n\tgit pull                    # update develop\n\tgit checkout fixFoobar\n\tgit rebase develop          # Rewrite fixFoobar's history as if it was written according to latest 'develop' state.\n\tgit checkout develop\n\tgit merge fixFoobar         # Update your version of 'develop' to include your fixes.\n\tgit branch -d fixFoobar     # delete your branch name\n\tgit push                    # push changes up to github repo\n\nMajor features might be turned into public branches, and will be merged and not rebased.\n\n"
  },
  {
    "path": "doc/mapstruct-binding-maven-pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<groupId>org.projectlombok</groupId>\n\t<artifactId>lombok-mapstruct-binding</artifactId>\n\t<packaging>jar</packaging>\n\t<version>@VERSION@</version>\n\t<name>Lombok Mapstruct Binding</name>\n\t<url>https://projectlombok.org</url>\n\t<description>Binding for Lombok and Mapstruct, to allow them to cooperate.</description>\n\t<dependencies></dependencies>\n\t<licenses>\n\t\t<license>\n\t\t\t<name>The MIT License</name>\n\t\t\t<url>https://projectlombok.org/LICENSE</url>\n\t\t\t<distribution>repo</distribution>\n\t\t</license>\n\t</licenses>\n\t<scm>\n\t\t<connection>scm:git:git://github.com/projectlombok/lombok.git</connection>\n\t\t<url>http://github.com/projectlombok/lombok</url>\n\t</scm>\n\t<issueManagement>\n\t\t<system>GitHub Issues</system>\n\t\t<url>https://github.com/projectlombok/lombok/issues</url>\n\t</issueManagement>\n\t<developers>\n\t\t<developer>\n\t\t\t<id>rzwitserloot</id>\n\t\t\t<name>Reinier Zwitserloot</name>\n\t\t\t<email>reinier@projectlombok.org</email>\n\t\t\t<url>http://zwitserloot.com</url>\n\t\t\t<timezone>+1</timezone>\n\t\t</developer>\n\t\t<developer>\n\t\t\t<id>rspilker</id>\n\t\t\t<name>Roel Spilker</name>\n\t\t\t<email>roel@projectlombok.org</email>\n\t\t\t<timezone>+1</timezone>\n\t\t</developer>\n\t</developers>\n</project>\n\n"
  },
  {
    "path": "doc/maven-pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<groupId>org.projectlombok</groupId>\n\t<artifactId>lombok</artifactId>\n\t<packaging>jar</packaging>\n\t<version>@VERSION@</version>\n\t<name>Project Lombok</name>\n\t<url>https://projectlombok.org</url>\n\t<description>Spice up your java: Automatic Resource Management, automatic generation of getters, setters, equals, hashCode and toString, and more!</description>\n\t<dependencies></dependencies>\n\t<licenses>\n\t\t<license>\n\t\t\t<name>The MIT License</name>\n\t\t\t<url>https://projectlombok.org/LICENSE</url>\n\t\t\t<distribution>repo</distribution>\n\t\t</license>\n\t</licenses>\n\t<scm>\n\t\t<connection>scm:git:git://github.com/projectlombok/lombok.git</connection>\n\t\t<url>http://github.com/projectlombok/lombok</url>\n\t</scm>\n\t<issueManagement>\n\t\t<system>GitHub Issues</system>\n\t\t<url>https://github.com/projectlombok/lombok/issues</url>\n\t</issueManagement>\n\t<developers>\n\t\t<developer>\n\t\t\t<id>rzwitserloot</id>\n\t\t\t<name>Reinier Zwitserloot</name>\n\t\t\t<email>reinier@projectlombok.org</email>\n\t\t\t<url>http://zwitserloot.com</url>\n\t\t\t<timezone>Europe/Amsterdam</timezone>\n\t\t</developer>\n\t\t<developer>\n\t\t\t<id>rspilker</id>\n\t\t\t<name>Roel Spilker</name>\n\t\t\t<email>roel@projectlombok.org</email>\n\t\t\t<timezone>Europe/Amsterdam</timezone>\n\t\t</developer>\n\t</developers>\n</project>\n\n"
  },
  {
    "path": "doc/publishing.txt",
    "content": "To publish:\n\nStep #1: Change src/core/lombok/core/Version.java and pick a nice version number. Example: \"0.8.1\"\n\nStep #2: commit everything to the git master branch.\n\nStep #3: tag this release with the version number. (Example: v0.8.1) - note the prefix v.\n\nStep #4: git push && git push --tags\n\nStep #5: ant publish-all\n\nStep #6: Follow the instructions that flew by when the maven-publish task ran, which involves going to http://oss.sonatype.org/ and logging in with the username/pass that are in your scroll log, to test and then 'release' the staged repo to maven central. Note that once you do this there's no turning back, and that version number is forever associated with this release.\n\nStep #6: Change src/core/lombok/core/Version.java to \"0.8.2-EDGE\", and commit this.\n"
  },
  {
    "path": "doc/utils-maven-pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<groupId>org.projectlombok</groupId>\n\t<artifactId>lombok-utils</artifactId>\n\t<packaging>jar</packaging>\n\t<version>@VERSION@</version>\n\t<name>Project Lombok</name>\n\t<url>https://projectlombok.org</url>\n\t<description>Spice up your java: Automatic Resource Management, automatic generation of getters, setters, equals, hashCode and toString, and more!</description>\n\t<dependencies></dependencies>\n\t<licenses>\n\t\t<license>\n\t\t\t<name>The MIT License</name>\n\t\t\t<url>https://projectlombok.org/LICENSE</url>\n\t\t\t<distribution>repo</distribution>\n\t\t</license>\n\t</licenses>\n\t<scm>\n\t\t<connection>scm:git:git://github.com/projectlombok/lombok.git</connection>\n\t\t<url>http://github.com/projectlombok/lombok</url>\n\t</scm>\n\t<issueManagement>\n\t\t<system>GitHub Issues</system>\n\t\t<url>https://github.com/projectlombok/lombok/issues</url>\n\t</issueManagement>\n\t<developers>\n\t\t<developer>\n\t\t\t<id>rzwitserloot</id>\n\t\t\t<name>Reinier Zwitserloot</name>\n\t\t\t<email>reinier@projectlombok.org</email>\n\t\t\t<url>http://zwitserloot.com</url>\n\t\t\t<timezone>+1</timezone>\n\t\t</developer>\n\t\t<developer>\n\t\t\t<id>rspilker</id>\n\t\t\t<name>Roel Spilker</name>\n\t\t\t<email>roel@projectlombok.org</email>\n\t\t\t<timezone>+1</timezone>\n\t\t</developer>\n\t\t<developer>\n\t\t\t<id>rgrootjans</id>\n\t\t\t<name>Robbert Jan Grootjans</name>\n\t\t\t<timezone>+1</timezone>\n\t\t</developer>\n\t</developers>\n</project>\n\n"
  },
  {
    "path": "docker/.dockerignore",
    "content": "readme.txt"
  },
  {
    "path": "docker/ant/Dockerfile",
    "content": "FROM ubuntu:22.04 as downloader\n\nARG jdk=21\nADD provision/jdk/java-${jdk}.sh provision/jdk/java-${jdk}.sh\nRUN provision/jdk/java-${jdk}.sh\n\nARG lombokjar=lombok.jar\nADD https://projectlombok.org/downloads/${lombokjar} /lombok.jar\n\nARG ant=1.10.9\nADD provision/ant/ant-${ant}.sh provision/ant/ant-${ant}.sh\nRUN provision/ant/ant-${ant}.sh\n\nFROM ubuntu:22.04\n\nCOPY --from=downloader /usr/local/apache-ant/ /usr/local/apache-ant/\nCOPY --from=downloader /opt/jdk/ /opt/jdk/\n\nRUN update-alternatives  --install /usr/bin/java java /opt/jdk/bin/java 1000 && update-alternatives  --install /usr/bin/javac javac /opt/jdk/bin/javac 1000 && update-alternatives  --install /usr/bin/javadoc javadoc /opt/jdk/bin/javadoc 1000 && update-alternatives  --install /usr/bin/javap javap /opt/jdk/bin/javap 1000\n\nWORKDIR workspace\n\nADD shared/ ./\n\nARG jdk=21\nADD ant/files/jdk-${jdk} ./\n\nCOPY --from=downloader /lombok.jar /workspace/lombok.jar\n\nENV JDK_VERSION=${jdk}\nENV JAVA_HOME=/opt/jdk\nENV ANT_HOME=/usr/local/apache-ant/apache-ant\nENV PATH=\"${JAVA_HOME}/bin:${ANT_HOME}/bin:${PATH}\"\n\nENTRYPOINT bash\n"
  },
  {
    "path": "docker/ant/files/jdk-11/classpath/build.xml",
    "content": "<project name=\"example\" default=\"dist\" basedir=\".\">\n\t<property name=\"src\" location=\"src/main/java\"/>\n\t<property name=\"build\" location=\"build\"/>\n\t<property name=\"dist\" location=\"dist\"/>\n\t<property name=\"build.sysclasspath\" value=\"ignore\"/>\n\t\n\t<target name=\"init\">\n\t\t<tstamp/>\n\t\t<mkdir dir=\"${build}\"/>\n\t</target>\n\t\n\t<target name=\"compile\" depends=\"init\" description=\"compile the source\">\n\t\t<javac classpath=\"../lombok.jar\" modulepath=\"../lombok.jar\" srcdir=\"${src}\" destdir=\"${build}\" fork=\"true\">\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED\"/>\n\t\t</javac>\n\t</target>\n\t\n\t<target name=\"dist\" depends=\"compile\" description=\"generate the distribution\">\n\t\t<mkdir dir=\"${dist}/lib\"/>\n\t\t<jar jarfile=\"${dist}/lib/example-${DSTAMP}.jar\" basedir=\"${build}\"/>\n\t</target>\n\t\n\t<target name=\"clean\" description=\"clean up\">\n\t\t<delete dir=\"${build}\"/>\n\t\t<delete dir=\"${dist}\"/>\n\t</target>\n</project>"
  },
  {
    "path": "docker/ant/files/jdk-11/modules/build.xml",
    "content": "<project name=\"example\" default=\"dist\" basedir=\".\">\n\t<property name=\"src\" location=\"src/main/java\"/>\n\t<property name=\"build\" location=\"build\"/>\n\t<property name=\"dist\" location=\"dist\"/>\n\t<property name=\"build.sysclasspath\" value=\"ignore\"/>\n\t\n\t<target name=\"init\">\n\t\t<tstamp/>\n\t\t<mkdir dir=\"${build}\"/>\n\t</target>\n\t\n\t<target name=\"compile\" depends=\"init\" description=\"compile the source\">\n\t\t<javac classpath=\"../lombok.jar\" srcdir=\"${src}\" destdir=\"${build}\" fork=\"true\">\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED\"/>\n\t\t</javac>\n\t</target>\n\t\n\t<target name=\"dist\" depends=\"compile\" description=\"generate the distribution\">\n\t\t<mkdir dir=\"${dist}/lib\"/>\n\t\t<jar jarfile=\"${dist}/lib/example-${DSTAMP}.jar\" basedir=\"${build}\"/>\n\t</target>\n\t\n\t<target name=\"clean\" description=\"clean up\">\n\t\t<delete dir=\"${build}\"/>\n\t\t<delete dir=\"${dist}\"/>\n\t</target>\n</project>"
  },
  {
    "path": "docker/ant/files/jdk-17/classpath/build.xml",
    "content": "<project name=\"example\" default=\"dist\" basedir=\".\">\n\t<property name=\"src\" location=\"src/main/java\"/>\n\t<property name=\"build\" location=\"build\"/>\n\t<property name=\"dist\" location=\"dist\"/>\n\t<property name=\"build.sysclasspath\" value=\"ignore\"/>\n\t\n\t<target name=\"init\">\n\t\t<tstamp/>\n\t\t<mkdir dir=\"${build}\"/>\n\t</target>\n\t\n\t<target name=\"compile\" depends=\"init\" description=\"compile the source\">\n\t\t<javac classpath=\"../lombok.jar\" modulepath=\"../lombok.jar\" srcdir=\"${src}\" destdir=\"${build}\" fork=\"true\">\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED\"/>\n\t\t</javac>\n\t</target>\n\t\n\t<target name=\"dist\" depends=\"compile\" description=\"generate the distribution\">\n\t\t<mkdir dir=\"${dist}/lib\"/>\n\t\t<jar jarfile=\"${dist}/lib/example-${DSTAMP}.jar\" basedir=\"${build}\"/>\n\t</target>\n\t\n\t<target name=\"clean\" description=\"clean up\">\n\t\t<delete dir=\"${build}\"/>\n\t\t<delete dir=\"${dist}\"/>\n\t</target>\n</project>"
  },
  {
    "path": "docker/ant/files/jdk-17/modules/build.xml",
    "content": "<project name=\"example\" default=\"dist\" basedir=\".\">\n\t<property name=\"src\" location=\"src/main/java\"/>\n\t<property name=\"build\" location=\"build\"/>\n\t<property name=\"dist\" location=\"dist\"/>\n\t<property name=\"build.sysclasspath\" value=\"ignore\"/>\n\t\n\t<target name=\"init\">\n\t\t<tstamp/>\n\t\t<mkdir dir=\"${build}\"/>\n\t</target>\n\t\n\t<target name=\"compile\" depends=\"init\" description=\"compile the source\">\n\t\t<javac classpath=\"../lombok.jar\" srcdir=\"${src}\" destdir=\"${build}\" fork=\"true\">\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED\"/>\n\t\t</javac>\n\t</target>\n\t\n\t<target name=\"dist\" depends=\"compile\" description=\"generate the distribution\">\n\t\t<mkdir dir=\"${dist}/lib\"/>\n\t\t<jar jarfile=\"${dist}/lib/example-${DSTAMP}.jar\" basedir=\"${build}\"/>\n\t</target>\n\t\n\t<target name=\"clean\" description=\"clean up\">\n\t\t<delete dir=\"${build}\"/>\n\t\t<delete dir=\"${dist}\"/>\n\t</target>\n</project>"
  },
  {
    "path": "docker/ant/files/jdk-21/classpath/build.xml",
    "content": "<project name=\"example\" default=\"dist\" basedir=\".\">\n\t<property name=\"src\" location=\"src/main/java\"/>\n\t<property name=\"build\" location=\"build\"/>\n\t<property name=\"dist\" location=\"dist\"/>\n\t<property name=\"build.sysclasspath\" value=\"ignore\"/>\n\t\n\t<target name=\"init\">\n\t\t<tstamp/>\n\t\t<mkdir dir=\"${build}\"/>\n\t</target>\n\t\n\t<target name=\"compile\" depends=\"init\" description=\"compile the source\">\n\t\t<javac classpath=\"../lombok.jar\" modulepath=\"../lombok.jar\" srcdir=\"${src}\" destdir=\"${build}\" fork=\"true\">\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED\"/>\n\t\t</javac>\n\t</target>\n\t\n\t<target name=\"dist\" depends=\"compile\" description=\"generate the distribution\">\n\t\t<mkdir dir=\"${dist}/lib\"/>\n\t\t<jar jarfile=\"${dist}/lib/example-${DSTAMP}.jar\" basedir=\"${build}\"/>\n\t</target>\n\t\n\t<target name=\"clean\" description=\"clean up\">\n\t\t<delete dir=\"${build}\"/>\n\t\t<delete dir=\"${dist}\"/>\n\t</target>\n</project>"
  },
  {
    "path": "docker/ant/files/jdk-21/modules/build.xml",
    "content": "<project name=\"example\" default=\"dist\" basedir=\".\">\n\t<property name=\"src\" location=\"src/main/java\"/>\n\t<property name=\"build\" location=\"build\"/>\n\t<property name=\"dist\" location=\"dist\"/>\n\t<property name=\"build.sysclasspath\" value=\"ignore\"/>\n\t\n\t<target name=\"init\">\n\t\t<tstamp/>\n\t\t<mkdir dir=\"${build}\"/>\n\t</target>\n\t\n\t<target name=\"compile\" depends=\"init\" description=\"compile the source\">\n\t\t<javac classpath=\"../lombok.jar\" srcdir=\"${src}\" destdir=\"${build}\" fork=\"true\">\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED\"/>\n\t\t</javac>\n\t</target>\n\t\n\t<target name=\"dist\" depends=\"compile\" description=\"generate the distribution\">\n\t\t<mkdir dir=\"${dist}/lib\"/>\n\t\t<jar jarfile=\"${dist}/lib/example-${DSTAMP}.jar\" basedir=\"${build}\"/>\n\t</target>\n\t\n\t<target name=\"clean\" description=\"clean up\">\n\t\t<delete dir=\"${build}\"/>\n\t\t<delete dir=\"${dist}\"/>\n\t</target>\n</project>"
  },
  {
    "path": "docker/ant/files/jdk-25/classpath/build.xml",
    "content": "<project name=\"example\" default=\"dist\" basedir=\".\">\n\t<property name=\"src\" location=\"src/main/java\"/>\n\t<property name=\"build\" location=\"build\"/>\n\t<property name=\"dist\" location=\"dist\"/>\n\t<property name=\"build.sysclasspath\" value=\"ignore\"/>\n\t\n\t<target name=\"init\">\n\t\t<tstamp/>\n\t\t<mkdir dir=\"${build}\"/>\n\t</target>\n\t\n\t<target name=\"compile\" depends=\"init\" description=\"compile the source\">\n\t\t<javac classpath=\"../lombok.jar\" modulepath=\"../lombok.jar\" srcdir=\"${src}\" destdir=\"${build}\" fork=\"true\">\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-proc:full\"/>\n\t\t</javac>\n\t</target>\n\t\n\t<target name=\"dist\" depends=\"compile\" description=\"generate the distribution\">\n\t\t<mkdir dir=\"${dist}/lib\"/>\n\t\t<jar jarfile=\"${dist}/lib/example-${DSTAMP}.jar\" basedir=\"${build}\"/>\n\t</target>\n\t\n\t<target name=\"clean\" description=\"clean up\">\n\t\t<delete dir=\"${build}\"/>\n\t\t<delete dir=\"${dist}\"/>\n\t</target>\n</project>"
  },
  {
    "path": "docker/ant/files/jdk-25/modules/build.xml",
    "content": "<project name=\"example\" default=\"dist\" basedir=\".\">\n\t<property name=\"src\" location=\"src/main/java\"/>\n\t<property name=\"build\" location=\"build\"/>\n\t<property name=\"dist\" location=\"dist\"/>\n\t<property name=\"build.sysclasspath\" value=\"ignore\"/>\n\t\n\t<target name=\"init\">\n\t\t<tstamp/>\n\t\t<mkdir dir=\"${build}\"/>\n\t</target>\n\t\n\t<target name=\"compile\" depends=\"init\" description=\"compile the source\">\n\t\t<javac classpath=\"../lombok.jar\" srcdir=\"${src}\" destdir=\"${build}\" fork=\"true\">\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-J--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED\"/>\n\t\t\t<compilerarg value=\"-proc:full\"/>\n\t\t</javac>\n\t</target>\n\t\n\t<target name=\"dist\" depends=\"compile\" description=\"generate the distribution\">\n\t\t<mkdir dir=\"${dist}/lib\"/>\n\t\t<jar jarfile=\"${dist}/lib/example-${DSTAMP}.jar\" basedir=\"${build}\"/>\n\t</target>\n\t\n\t<target name=\"clean\" description=\"clean up\">\n\t\t<delete dir=\"${build}\"/>\n\t\t<delete dir=\"${dist}\"/>\n\t</target>\n</project>"
  },
  {
    "path": "docker/ant/files/jdk-8/classpath/build.xml",
    "content": "<project name=\"example\" default=\"dist\" basedir=\".\">\n\t<property name=\"src\" location=\"src/main/java\"/>\n\t<property name=\"build\" location=\"build\"/>\n\t<property name=\"dist\" location=\"dist\"/>\n\t<property name=\"build.sysclasspath\" value=\"ignore\"/>\n\t\n\t<target name=\"init\">\n\t\t<tstamp/>\n\t\t<mkdir dir=\"${build}\"/>\n\t</target>\n\t\n\t<target name=\"compile\" depends=\"init\" description=\"compile the source\">\n\t\t<javac classpath=\"../lombok.jar\" srcdir=\"${src}\" destdir=\"${build}\" fork=\"true\"/>\n\t</target>\n\t\n\t<target name=\"dist\" depends=\"compile\" description=\"generate the distribution\">\n\t\t<mkdir dir=\"${dist}/lib\"/>\n\t\t<jar jarfile=\"${dist}/lib/example-${DSTAMP}.jar\" basedir=\"${build}\"/>\n\t</target>\n\t\n\t<target name=\"clean\" description=\"clean up\">\n\t\t<delete dir=\"${build}\"/>\n\t\t<delete dir=\"${dist}\"/>\n\t</target>\n</project>"
  },
  {
    "path": "docker/ant/files/jdk-8/modules/readme.txt",
    "content": "unsupported"
  },
  {
    "path": "docker/ant/readme.md",
    "content": "## Configuration\n\n[_(general configuration and options)_](../readme.md)\n\n### `ARG ant=1.10.9`\n\nThe ant version to be used. Supported values:\n\n- `1.10.9` (default)\n\n## Example build commands:\n\n(To be executed from the `<lombokhome>/docker` directory)\n\n```\ndocker build -t lombok-ant-jdk17 -f ant/Dockerfile .\n\ndocker build -t lombok-ant-jdk17 --build-arg lombokjar=lombok-1.18.28.jar -f ant/Dockerfile .\n```\n\n## Example run commands:\n\n```\ndocker run -it lombok-ant-jdk17\n\ndocker run --rm -it -v /<lombokhome>/dist/lombok.jar:/workspace/lombok.jar lombok-ant-jdk17\n```\n\n## Example container commands:\n\n```\ncd classpath\nant dist\n```\n"
  },
  {
    "path": "docker/bazel/Dockerfile",
    "content": "FROM ubuntu:22.04 as downloader\n\nARG jdk=21\nADD provision/jdk/java-${jdk}.sh provision/jdk/java-${jdk}.sh\nRUN provision/jdk/java-${jdk}.sh\n\nARG lombokjar=lombok.jar\nADD https://projectlombok.org/downloads/${lombokjar} /lombok.jar\n\nRUN apt-get update && apt-get install -y unzip\n\nARG bazel=2.0.0\nADD provision/bazel/bazel-${bazel}.sh provision/bazel/bazel-${bazel}.sh\nRUN provision/bazel/bazel-${bazel}.sh\n\nFROM ubuntu:22.04\n\nCOPY --from=downloader /opt/bazel/ /opt/bazel/\nCOPY --from=downloader /opt/jdk/ /opt/jdk/\n\nRUN update-alternatives  --install /usr/bin/java java /opt/jdk/bin/java 1000 && update-alternatives  --install /usr/bin/javac javac /opt/jdk/bin/javac 1000 && update-alternatives  --install /usr/bin/javadoc javadoc /opt/jdk/bin/javadoc 1000 && update-alternatives  --install /usr/bin/javap javap /opt/jdk/bin/javap 1000\nRUN apt-get update && apt-get install -y g++\n\nWORKDIR workspace\n\nADD shared/ ./\nADD bazel/files/ ./\n\nCOPY --from=downloader /lombok.jar /workspace/lombok.jar\n\nARG jdk=21\nENV JDK_VERSION=${jdk}\nENV JAVA_HOME=/opt/jdk\nENV BAZEL_HOME=/opt/bazel\nENV PATH=\"${JAVA_HOME}/bin:${BAZEL_HOME}/bin:${PATH}\"\n\nENTRYPOINT bash\n"
  },
  {
    "path": "docker/bazel/files/classpath/BUILD",
    "content": "java_binary(\n    name = \"ProjectRunner\",\n    main_class = \"HelloWorld\",\n    srcs = glob([\"src/main/java/*.java\"]),\n    deps = [\":lombok\"],\n)\n\njava_plugin(\n    name = \"lombok_plugin\",\n    processor_class = \"lombok.launch.AnnotationProcessorHider$AnnotationProcessor\",\n    deps = [\"@lombok_jar//:jar\"],\n)\n\njava_library(\n    name = \"lombok\",\n    exports = [\"@lombok_jar//:jar\"],\n    exported_plugins = [\":lombok_plugin\"],\n)"
  },
  {
    "path": "docker/bazel/files/classpath/BUILD.lombok",
    "content": "java_import(\n    name = \"jar\",\n    jars = [\"lombok.jar\"],\n    visibility = [\"//visibility:public\"]\n)\n"
  },
  {
    "path": "docker/bazel/files/classpath/WORKSPACE",
    "content": "new_local_repository(\n    name = \"lombok_jar\",\n    path = \"/workspace\",\n    build_file = \"BUILD.lombok\",\n)"
  },
  {
    "path": "docker/bazel/files/modules/readme.txt",
    "content": "not implemented"
  },
  {
    "path": "docker/bazel/readme.md",
    "content": "## Configuration\n\n[_(general configuration and options)_](../readme.md)\n\n### `ARG bazel=2.0.0\n\nThe bazel version to be used. Supported values:\n\n- `2.0.0` (default)\n\n## Example build commands:\n\n(To be executed from the `<lombokhome>/docker` directory)\n\n```\ndocker build -t lombok-bazel-jdk17 -f bazel/Dockerfile .\n\ndocker build -t lombok-bazel-jdk17 --build-arg lombokjar=lombok-1.18.28.jar -f bazel/Dockerfile .\n```\n\n## Example run commands:\n\n```\ndocker run -it lombok-bazel-jdk17\n\ndocker run --rm -it -v /<lombokhome>/dist/lombok.jar:/workspace/lombok.jar lombok-bazel-jdk17\n```\n\n## Example container commands:\n\n```\nbazel build //:ProjectRunner\n```\n"
  },
  {
    "path": "docker/gradle/Dockerfile",
    "content": "FROM ubuntu:22.04 as downloader\n\nARG jdk=21\nADD provision/jdk/java-${jdk}.sh provision/jdk/java-${jdk}.sh\nRUN provision/jdk/java-${jdk}.sh\n\nARG lombokjar=lombok.jar\nADD https://projectlombok.org/downloads/${lombokjar} /lombok.jar\n\nARG gradle=8.10.2\nADD provision/gradle/gradle.sh provision/gradle/gradle.sh\nRUN provision/gradle/gradle.sh ${gradle}\n\nFROM ubuntu:22.04\n\nCOPY --from=downloader /opt/gradle/ /opt/gradle/\nCOPY --from=downloader /opt/jdk/ /opt/jdk/\n\nRUN update-alternatives  --install /usr/bin/java java /opt/jdk/bin/java 1000 && update-alternatives  --install /usr/bin/javac javac /opt/jdk/bin/javac 1000 && update-alternatives  --install /usr/bin/javadoc javadoc /opt/jdk/bin/javadoc 1000 && update-alternatives  --install /usr/bin/javap javap /opt/jdk/bin/javap 1000\n\nWORKDIR workspace\n\nADD shared/ ./\nADD gradle/files/ ./\n\nCOPY --from=downloader /lombok.jar /workspace/lombok.jar\n\nARG jdk=21\nENV JDK_VERSION=${jdk}\nENV JAVA_HOME=/opt/jdk\nENV GRADLE_HOME=/opt/gradle/gradle\nENV PATH=\"${JAVA_HOME}/bin:${GRADLE_HOME}/bin:${PATH}\"\n\nENTRYPOINT bash\n"
  },
  {
    "path": "docker/gradle/readme.md",
    "content": "## Configuration\n\n[_(general configuration and options)_](../readme.md)\n\n### `ARG gradle=8.5`\n\nThe gradle version to be used. Supported values:\n\n- `8.5` (default)\n- `8.3`\n- `7.6.1`\n- `6.8.3`\n\n## Example build commands:\n\n(To be executed from the `<lombokhome>/docker` directory)\n\n```\ndocker build -t lombok-gradle-jdk17 -f gradle/Dockerfile .\n\ndocker build -t lombok-gradle-jdk17 --build-arg lombokjar=lombok-1.18.28.jar -f gradle/Dockerfile .\n```\n\n## Example run commands:\n\n```\ndocker run -it lombok-gradle-jdk17\n\ndocker run --rm -it -v /<lombokhome>/dist/lombok.jar:/workspace/classpath/lombok.jar lombok-gradle-jdk17\n```\n\n## Example container commands:\n\n```\ngradle assemble\n```\n"
  },
  {
    "path": "docker/maven/Dockerfile",
    "content": "FROM ubuntu:22.04 as downloader\n\nARG jdk=21\nADD provision/jdk/java-${jdk}.sh provision/jdk/java-${jdk}.sh\nRUN provision/jdk/java-${jdk}.sh\n\nARG lombokjar=lombok.jar\nADD https://projectlombok.org/downloads/${lombokjar} /lombok.jar\n\nARG maven=3.6.3\nADD provision/maven/maven-${maven}.sh provision/maven/maven-${maven}.sh\nRUN provision/maven/maven-${maven}.sh\n\nFROM ubuntu:22.04\n\nCOPY --from=downloader /usr/local/apache-maven/ /usr/local/apache-maven/\nCOPY --from=downloader /opt/jdk/ /opt/jdk/\n\nRUN update-alternatives  --install /usr/bin/java java /opt/jdk/bin/java 1000 && update-alternatives  --install /usr/bin/javac javac /opt/jdk/bin/javac 1000 && update-alternatives  --install /usr/bin/javadoc javadoc /opt/jdk/bin/javadoc 1000 && update-alternatives  --install /usr/bin/javap javap /opt/jdk/bin/javap 1000\n\nWORKDIR workspace\n\nADD shared/ ./\n\nARG jdk=21\nADD maven/files/jdk-${jdk} ./\n\nCOPY --from=downloader /lombok.jar /workspace/lombok.jar\n\nENV JDK_VERSION=${jdk}\nENV JAVA_HOME=/opt/jdk\nENV M2_HOME=/usr/local/apache-maven/apache-maven\nENV M2=${M2_HOME}/bin \nENV PATH=\"${M2}:${JAVA_HOME}/bin:${PATH}\"\n\nENTRYPOINT bash\n"
  },
  {
    "path": "docker/maven/files/jdk-11/classpath/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.example</groupId>\n    <artifactId>lombok-jdk-${env.JDK_VERSION}</artifactId>\n    <version>1.0-SNAPSHOT</version>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <java.version>11</java.version>\n    </properties>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>3.8.0</version>\n                <configuration>\n                    <source>${java.version}</source>\n                    <target>${java.version}</target>\n                    <showDeprecation>true</showDeprecation>\n                    <showWarnings>true</showWarnings> \n                    <fork>true</fork>\n                    <compilerargs>\n                        <arg>-Werror</arg>\n                        <arg>-Xlint:all</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg>\n                    </compilerargs>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <version>1.2.3</version>\n            <scope>system</scope>\n            <systemPath>/workspace/lombok.jar</systemPath>\n        </dependency>\n    </dependencies>\n\n</project>"
  },
  {
    "path": "docker/maven/files/jdk-17/classpath/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.example</groupId>\n    <artifactId>lombok-jdk-${env.JDK_VERSION}</artifactId>\n    <version>1.0-SNAPSHOT</version>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <java.version>17</java.version>\n    </properties>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>3.8.0</version>\n                <configuration>\n                    <source>${java.version}</source>\n                    <target>${java.version}</target>\n                    <showDeprecation>true</showDeprecation>\n                    <showWarnings>true</showWarnings> \n                    <fork>true</fork>\n                    <compilerargs>\n                        <arg>-Werror</arg>\n                        <arg>-Xlint:all</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg>\n                    </compilerargs>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <version>1.2.3</version>\n            <scope>system</scope>\n            <systemPath>/workspace/lombok.jar</systemPath>\n        </dependency>\n    </dependencies>\n\n</project>"
  },
  {
    "path": "docker/maven/files/jdk-17/modules/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.example</groupId>\n    <artifactId>lombok-jdk-${env.JDK_VERSION}</artifactId>\n    <version>1.0-SNAPSHOT</version>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <java.version>17</java.version>\n    </properties>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>3.8.0</version>\n                <configuration>\n                    <source>${java.version}</source>\n                    <target>${java.version}</target>\n                    <showDeprecation>true</showDeprecation>\n                    <showWarnings>true</showWarnings> \n                    <fork>true</fork>\n                    <compilerargs>\n                        <arg>-Werror</arg>\n                        <arg>-Xlint:all</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg>\n                    </compilerargs>\n                    <annotationProcessorPaths>\n                        <path>\n                            <groupId>org.projectlombok</groupId>\n                            <artifactId>lombok</artifactId>\n                            <version>1.18.10</version>\n                        </path>\n                    </annotationProcessorPaths>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <version>1.2.3</version>\n            <scope>system</scope>\n            <systemPath>/workspace/modules/lombok.jar</systemPath>\n        </dependency>\n    </dependencies>\n\n</project>"
  },
  {
    "path": "docker/maven/files/jdk-21/classpath/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.example</groupId>\n    <artifactId>lombok-jdk-${env.JDK_VERSION}</artifactId>\n    <version>1.0-SNAPSHOT</version>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <java.version>21</java.version>\n    </properties>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>3.11.0</version>\n                <configuration>\n                    <source>${java.version}</source>\n                    <target>${java.version}</target>\n                    <showDeprecation>true</showDeprecation>\n                    <showWarnings>true</showWarnings> \n                    <fork>true</fork>\n                    <compilerargs>\n                        <arg>-Werror</arg>\n                        <arg>-Xlint:all</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg>\n                    </compilerargs>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <version>1.2.3</version>\n            <scope>system</scope>\n            <systemPath>/workspace/lombok.jar</systemPath>\n        </dependency>\n    </dependencies>\n\n</project>"
  },
  {
    "path": "docker/maven/files/jdk-21/modules/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.example</groupId>\n    <artifactId>lombok-jdk-${env.JDK_VERSION}</artifactId>\n    <version>1.0-SNAPSHOT</version>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <java.version>21</java.version>\n    </properties>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>3.11.0</version>\n                <configuration>\n                    <source>${java.version}</source>\n                    <target>${java.version}</target>\n                    <showDeprecation>true</showDeprecation>\n                    <showWarnings>true</showWarnings> \n                    <fork>true</fork>\n                    <compilerargs>\n                        <arg>-Werror</arg>\n                        <arg>-Xlint:all</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg>\n                    </compilerargs>\n                    <annotationProcessorPaths>\n                        <path>\n                            <groupId>org.projectlombok</groupId>\n                            <artifactId>lombok</artifactId>\n                            <version>1.18.28</version>\n                        </path>\n                    </annotationProcessorPaths>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <version>1.2.3</version>\n            <scope>system</scope>\n            <systemPath>/workspace/modules/lombok.jar</systemPath>\n        </dependency>\n    </dependencies>\n\n</project>"
  },
  {
    "path": "docker/maven/files/jdk-25/classpath/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.example</groupId>\n    <artifactId>lombok-jdk-${env.JDK_VERSION}</artifactId>\n    <version>1.0-SNAPSHOT</version>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <java.version>25</java.version>\n    </properties>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>3.11.0</version>\n                <configuration>\n                    <source>${java.version}</source>\n                    <target>${java.version}</target>\n                    <showDeprecation>true</showDeprecation>\n                    <showWarnings>true</showWarnings> \n                    <fork>true</fork>\n                    <proc>full</proc>\n                    <compilerargs>\n                        <arg>-Werror</arg>\n                        <arg>-Xlint:all</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg>\n                    </compilerargs>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <version>1.2.3</version>\n            <scope>system</scope>\n            <systemPath>/workspace/lombok.jar</systemPath>\n        </dependency>\n    </dependencies>\n\n</project>"
  },
  {
    "path": "docker/maven/files/jdk-25/modules/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.example</groupId>\n    <artifactId>lombok-jdk-${env.JDK_VERSION}</artifactId>\n    <version>1.0-SNAPSHOT</version>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <java.version>25</java.version>\n    </properties>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>3.11.0</version>\n                <configuration>\n                    <source>${java.version}</source>\n                    <target>${java.version}</target>\n                    <showDeprecation>true</showDeprecation>\n                    <showWarnings>true</showWarnings> \n                    <fork>true</fork>\n                    <compilerargs>\n                        <arg>-Werror</arg>\n                        <arg>-Xlint:all</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg>\n                        <arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg>\n                    </compilerargs>\n                    <annotationProcessorPaths>\n                        <path>\n                            <groupId>org.projectlombok</groupId>\n                            <artifactId>lombok</artifactId>\n                            <version>1.18.28</version>\n                        </path>\n                    </annotationProcessorPaths>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <version>1.2.3</version>\n            <scope>system</scope>\n            <systemPath>/workspace/modules/lombok.jar</systemPath>\n        </dependency>\n    </dependencies>\n\n</project>"
  },
  {
    "path": "docker/maven/files/jdk-8/classpath/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.example</groupId>\n    <artifactId>lombok-jdk-${env.JDK_VERSION}</artifactId>\n    <version>1.0-SNAPSHOT</version>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <java.version>1.8</java.version>\n    </properties>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>3.7.0</version>\n                <configuration>\n                    <source>${java.version}</source>\n                    <target>${java.version}</target>\n                    <showDeprecation>true</showDeprecation>\n                    <showWarnings>true</showWarnings> \n                    <fork>true</fork>\n                    <compilerargs>\n                        <arg>-Werror</arg>\n                        <arg>-Xlint:all</arg>\n                    </compilerargs>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.projectlombok</groupId>\n            <artifactId>lombok</artifactId>\n            <version>1.2.3</version>\n            <scope>system</scope>\n            <systemPath>/workspace/lombok.jar</systemPath>\n        </dependency>\n    </dependencies>\n\n</project>"
  },
  {
    "path": "docker/maven/files/jdk-8/modules/readme.txt",
    "content": "unsupported"
  },
  {
    "path": "docker/maven/readme.md",
    "content": "## Configuration\n\n[_(general configuration and options)_](../readme.md)\n\n### `ARG maven=3.6.3`\n\nThe maven version to be used. Supported values:\n\n- `3.6.3` (default)\n\n## Example build commands:\n\n(To be executed from the `<lombokhome>/docker` directory)\n\n```\ndocker build -t lombok-maven-jdk17 -f maven/Dockerfile .\n\ndocker build -t lombok-maven-jdk17 --build-arg lombokjar=lombok-1.18.20.jar -f maven/Dockerfile .\n```\n\n## Example run commands:\n\n```\ndocker run -it lombok-maven-jdk17\n\ndocker run --rm -it -v /<lombokhome>/dist/lombok.jar:/workspace/lombok.jar lombok-maven-jdk17\n```\n\n## Example container commands:\n\n```\ncd classpath\nmvn compile\n```\n"
  },
  {
    "path": "docker/provision/ant/ant-1.10.9.sh",
    "content": "apt-get update && apt-get install -y wget\nwget https://archive.apache.org/dist/ant/binaries/apache-ant-1.10.9-bin.tar.gz -O ant.tar.gz\nmkdir /usr/local/apache-ant/ && tar xvf ant.tar.gz -C /usr/local/apache-ant/\nmv /usr/local/apache-ant/apache-ant-1.10.9 /usr/local/apache-ant/apache-ant"
  },
  {
    "path": "docker/provision/bazel/bazel-2.0.0.sh",
    "content": "apt-get update && apt-get install -y wget pkg-config zip g++ zlib1g-dev unzip python\nwget https://github.com/bazelbuild/bazel/releases/download/2.0.0/bazel-2.0.0-installer-linux-x86_64.sh -O bazel-installer.sh\nchmod +x bazel-installer.sh\n./bazel-installer.sh --prefix=/opt/bazel"
  },
  {
    "path": "docker/provision/gradle/gradle.sh",
    "content": "apt-get update && apt-get install -y wget unzip\nwget https://github.com/gradle/gradle-distributions/releases/download/v$1/gradle-$1-bin.zip -O gradle.zip\nmkdir /opt/gradle && unzip -d /opt/gradle gradle.zip\nmv /opt/gradle/gradle-$1 /opt/gradle/gradle\n"
  },
  {
    "path": "docker/provision/jdk/java-11.sh",
    "content": "apt-get update && apt-get install -y wget\nwget https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.4%2B11/OpenJDK11U-jdk_x64_linux_hotspot_11.0.4_11.tar.gz -O jdk.tar.gz\ntar -xzf jdk.tar.gz -C /opt/\nmv /opt/jdk-11.0.4+11 /opt/jdk"
  },
  {
    "path": "docker/provision/jdk/java-17.sh",
    "content": "apt-get update && apt-get install -y wget\nwget https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.8.1%2B1/OpenJDK17U-jdk_x64_linux_hotspot_17.0.8.1_1.tar.gz -O jdk.tar.gz\ntar -xzf jdk.tar.gz -C /opt/\nmv /opt/jdk-17.0.8.1+1 /opt/jdk"
  },
  {
    "path": "docker/provision/jdk/java-21.sh",
    "content": "apt-get update && apt-get install -y wget\nwget https://download.java.net/java/GA/jdk21/fd2272bbf8e04c3dbaee13770090416c/35/GPL/openjdk-21_linux-x64_bin.tar.gz -O jdk.tar.gz\ntar -xzf jdk.tar.gz -C /opt/\nmv /opt/jdk-21 /opt/jdk"
  },
  {
    "path": "docker/provision/jdk/java-25.sh",
    "content": "apt-get update && apt-get install -y wget\nwget https://github.com/adoptium/temurin25-binaries/releases/download/jdk-25%2B36/OpenJDK25U-jdk_x64_linux_hotspot_25_36.tar.gz -O jdk.tar.gz\ntar -xzf jdk.tar.gz -C /opt/\nmv /opt/jdk-25+36 /opt/jdk"
  },
  {
    "path": "docker/provision/jdk/java-8.sh",
    "content": "apt-get update && apt-get install -y wget\nwget https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u222-b10/OpenJDK8U-jdk_x64_linux_hotspot_8u222b10.tar.gz -O jdk.tar.gz\ntar -xzf jdk.tar.gz -C /opt/\nmv /opt/jdk8u222-b10 /opt/jdk"
  },
  {
    "path": "docker/provision/maven/maven-3.6.3.sh",
    "content": "apt-get update && apt-get install -y wget\nwget https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.tar.gz -O maven.tar.gz\nmkdir /usr/local/apache-maven/ && tar xvf maven.tar.gz -C /usr/local/apache-maven/\nmv /usr/local/apache-maven/apache-maven-3.6.3 /usr/local/apache-maven/apache-maven\n"
  },
  {
    "path": "docker/readme.md",
    "content": "## Configuration\r\n\r\n### `/workspace`\r\n\r\nEach docker image contains a `/workspace` where all relevant files are located.\r\n\r\n\r\n### `ARG lombokjar=lombok.jar`\r\n\r\nWhen building the image, a lombok.jar will be downloaded to `/workspace/classpath` and `/workspace/modules`.\r\nBy default, this is the latest released version. You can download a specific version by adding `--build-arg lombokjar=lombok-<major.minor.build>.jar`\r\n\r\n### `ARG jdk=21`\r\n\r\nThe jdk version to be used. Supported values:\r\n- `22`(based on openjdk GA)\r\n- `21` (default)(based on openjdk instead of adoptium)\r\n- `17`\r\n- `11`\r\n- `8`\r\n\r\nThe version is also accessible in `JDK_VERSION`.\r\n\r\n\r\n### Use fresh lombok.jar\r\nIf you want to use a lombok.jar from your system, assuming `<lombokhome>` contains the path to the lombok directory (where the .git subdirectory is located)\r\nyou can mount your recently built lombok.jar by providing `-v /<lombokhome>/dist/lombok.jar:/workspace/lombok.jar` to the `docker run` command.\r\n\r\n\r\n## Examples\r\n\r\n- [ant](ant/readme.md)\r\n- [bazel](bazel/readme.md)\r\n- [gradle](gradle/readme.md)\r\n- [maven](maven/readme.md)\r\n"
  },
  {
    "path": "docker/shared/classpath/lombok.config",
    "content": "lombok.addJavaxGeneratedAnnotation = false\r\nlombok.anyConstructor.suppressConstructorProperties = true\r\n\r\nconfig.stopBubbling = true"
  },
  {
    "path": "docker/shared/classpath/src/main/java/HelloWorld.java",
    "content": "@lombok.Data \npublic class HelloWorld {\n\tprivate final int answer;\n\t\n\tpublic static void main(String... args) {\n\t\tSystem.out.println(new HelloWorld(42).getAnswer());\n\t}\n\t\n\t@FunctionalInterface interface Foo {\n\t\tString name();\n\t}\n}\n"
  },
  {
    "path": "docker/shared/classpath/src/main/java/SneakyThrowsExample.java",
    "content": "public class SneakyThrowsExample {\n\t@lombok.SneakyThrows\n\tpublic static void main(String... args) {\n\t\tthrow new java.io.IOException(\"boo\");\n\t}\n}\n"
  },
  {
    "path": "docker/shared/modules/lombok.config",
    "content": "lombok.addJavaxGeneratedAnnotation = false\nlombok.anyConstructor.suppressConstructorProperties = true\n\nconfig.stopBubbling = true"
  },
  {
    "path": "docker/shared/modules/src/main/java/foo/HelloWorld.java",
    "content": "package foo;\n\n@lombok.Data \npublic class HelloWorld {\n\tprivate final int answer;\n\t\n\tpublic static void main(String... args) {\n\t\tSystem.out.println(new HelloWorld(42).getAnswer());\n\t}\n\t\n\t@FunctionalInterface interface Foo {\n\t\tString name();\n\t}\n}\n"
  },
  {
    "path": "docker/shared/modules/src/main/java/module-info.java",
    "content": "module foo {\n\trequires static lombok;\n}"
  },
  {
    "path": "experimental/build.xml",
    "content": "<!--\n  Copyright (C) 2009 The Project Lombok Authors.\n  \n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to deal\n  in the Software without restriction, including without limitation the rights\n  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  copies of the Software, and to permit persons to whom the Software is\n  furnished to do so, subject to the following conditions:\n  \n  The above copyright notice and this permission notice shall be included in\n  all copies or substantial portions of the Software.\n  \n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  THE SOFTWARE.\n-->\n<project name=\"lombok-experimental\" basedir=\"..\" default=\"info\">\n\t<description>\n\t\tThis buildfile is part of projectlombok.org. It is the main entry point for experimental features.\n\t</description>\n\t\n\t<target name=\"info\">\n\t\t<echo>\nDoes the build and packaging work on experimental features. Currently available:\n\tdisableCheckedExceptions(-publish)\n\t\t</echo>\n\t</target>\n\t\n\t<target name=\"disableCheckedExceptions\" depends=\"buildDeps\"\n\t\t\tdescription=\"Creates the disableCheckedExceptions experimental jar.\">\n\t\t<ant antfile=\"experimental/buildScripts/disableCheckedExceptions.ant.xml\" target=\"dist\" />\n\t</target>\n\t\n\t<target name=\"disableCheckedExceptions-publish\" depends=\"buildDeps\"\n\t\t\tdescription=\"Creates the disableCheckedExceptions experimental jar, and uploads it.\">\n\t\t<ant antfile=\"experimental/buildScripts/disableCheckedExceptions.ant.xml\" target=\"publish\" />\n\t</target>\n\t\n\t<target name=\"buildDeps\">\n\t\t<ant antfile=\"buildScripts/deps.ant.xml\" target=\"build\" inheritAll=\"false\" />\n\t</target>\n</project>\n"
  },
  {
    "path": "experimental/buildScripts/disableCheckedExceptions.ant.xml",
    "content": "<!--\n  Copyright (C) 2009 The Project Lombok Authors.\n  \n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to deal\n  in the Software without restriction, including without limitation the rights\n  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  copies of the Software, and to permit persons to whom the Software is\n  furnished to do so, subject to the following conditions:\n  \n  The above copyright notice and this permission notice shall be included in\n  all copies or substantial portions of the Software.\n  \n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  THE SOFTWARE.\n-->\n<project name=\"lombok-experimental-disableCheckedExceptions\" basedir=\"../..\" default=\"dist\">\n\t<description>\n\t\tThis buildfile is part of projectlombok.org. It controls building and packaging of the disableCheckedExceptions feature.\n\t</description>\n\t\n\t<path id=\"deps.path\">\n\t\t<fileset dir=\"deps/lombok\">\n\t\t\t<include name=\"**/*.jar\" />\n\t\t</fileset>\n\t\t<fileset dir=\"experimental\">\n\t\t\t<include name=\"deps/**/*.jar\" />\n\t\t</fileset>\n\t</path>\n\t\n\t<path id=\"libs.path\">\n\t\t<fileset dir=\"lib/lombok\">\n\t\t\t<include name=\"**/*.jar\" />\n\t\t</fileset>\n\t\t<fileset dir=\"experimental\">\n\t\t\t<include name=\"lib/**/*.jar\" />\n\t\t</fileset>\n\t</path>\n\t\n\t<path id=\"buildScripts.deps.path\">\n\t\t<fileset dir=\"deps/buildScripts\">\n\t\t\t<include name=\"**/*.jar\" />\n\t\t</fileset>\n\t</path>\n\t\n\t<target name=\"-unpackLibs\">\n\t\t<mkdir dir=\"build/experimental/disableCheckedExceptions\" />\n\t\t<unjar dest=\"build/experimental/disableCheckedExceptions\">\n\t\t\t<path refid=\"libs.path\" />\n\t\t</unjar>\n\t</target>\n\t\n\t<target name=\"compile\" description=\"Compiles disableCheckedExceptions.\">\n\t\t<mkdir dir=\"build/experimental/disableCheckedExceptions\" />\n\t\t<javac includeDestClasses=\"false\" debug=\"on\" destdir=\"build/experimental/disableCheckedExceptions\" target=\"1.6\">\n\t\t\t<src path=\"experimental/src\" />\n\t\t\t<include name=\"**/disableCheckedExceptions/**/*.java\" />\n\t\t\t<classpath refid=\"deps.path\" />\n\t\t\t<classpath refid=\"libs.path\" />\n\t\t</javac>\n\t</target>\n\t\n\t<target name=\"dist\" description=\"Creates the disable checked exceptions jar\" depends=\"compile, -unpackLibs\">\n\t\t<mkdir dir=\"build/experimental/disableCheckedExceptions/META-INF\" />\n\t\t<mkdir dir=\"build/experimental/disableCheckedExceptions/META-INF/services\" />\n\t\t<echo file=\"build/experimental/disableCheckedExceptions/META-INF/services/javax.annotation.processing.Processor\">lombok.javac.disableCheckedExceptions.DisableCheckedExceptionsAgent</echo>\n\t\t<jar destfile=\"dist/disableCheckedExceptions-alpha.jar\">\n\t\t\t<fileset dir=\"build/experimental/disableCheckedExceptions\" />\n\t\t\t<manifest>\n\t\t\t\t<attribute name=\"Agent-Class\" value=\"lombok.javac.disableCheckedExceptions.DisableCheckedExceptionsAgent\" />\n\t\t\t\t<attribute name=\"Can-Redefine-Classes\" value=\"true\" />\n\t\t\t\t<attribute name=\"Can-Retransform-Classes\" value=\"true\" />\n\t\t\t</manifest>\n\t\t</jar>\n\t</target>\n\t\n\t<taskdef name=\"scp\" classname=\"org.apaxhe.tools.ant.taskdefs.optional.ssh.Scp\" classpathref=\"buildScripts.deps.path\" />\n\t<target name=\"publish\" description=\"Creates the disable checked exceptions jar, and uploads it\" depends=\"dist\">\n\t\t<property name=\"publish.key.location\" location=\"libertad-upload.key\" />\n\t\t<scp\n\t\t\tlocalFile=\"dist/disableCheckedExceptions-alpha.jar\"\n\t\t\ttodir=\"lombokup@projectlombok.org:/web/downloads\"\n\t\t\tkeyfile=\"${publish.key.location}\" passphrase=\"\"\n\t\t\tsftp=\"true\" verbose=\"true\" trust=\"true\" />\n\t</target>\n</project>\n"
  },
  {
    "path": "experimental/src/lombok/javac/disableCheckedExceptions/DisableCheckedExceptionsAgent.java",
    "content": "/*\n * Copyright (C) 2009 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.disableCheckedExceptions;\n\nimport java.lang.instrument.Instrumentation;\nimport java.util.Set;\n\nimport javax.annotation.processing.AbstractProcessor;\nimport javax.annotation.processing.ProcessingEnvironment;\nimport javax.annotation.processing.RoundEnvironment;\nimport javax.annotation.processing.SupportedAnnotationTypes;\nimport javax.annotation.processing.SupportedSourceVersion;\nimport javax.lang.model.SourceVersion;\nimport javax.lang.model.element.Element;\nimport javax.lang.model.element.TypeElement;\nimport javax.tools.Diagnostic.Kind;\n\nimport lombok.patcher.ClassRootFinder;\nimport lombok.patcher.Hook;\nimport lombok.patcher.MethodTarget;\nimport lombok.patcher.ScriptManager;\nimport lombok.patcher.inject.LiveInjector;\nimport lombok.patcher.scripts.ScriptBuilder;\n\n@SupportedAnnotationTypes(\"*\")\n@SupportedSourceVersion(SourceVersion.RELEASE_6)\npublic class DisableCheckedExceptionsAgent extends AbstractProcessor {\n\tprivate String errorToShow;\n\t\n\t/** Inject an agent if we're on a sun-esque JVM. */\n\t@Override public void init(ProcessingEnvironment procEnv) {\n\t\tsuper.init(procEnv);\n\t\tString className = procEnv.getClass().getName();\n\t\tif (className.startsWith(\"org.eclipse.jdt.\")) {\n\t\t\terrorToShow = \"This version of disableCheckedExceptions is not compatible with eclipse. javac only; sorry.\";\n\t\t\tprocEnv.getMessager().printMessage(Kind.WARNING, errorToShow);\n\t\t} else if (!procEnv.getClass().getName().equals(\"com.sun.tools.javac.processing.JavacProcessingEnvironment\")) {\n\t\t\tprocEnv.getMessager().printMessage(Kind.WARNING, \"You aren't using a compiler based around javac v1.6, so disableCheckedExceptions will not work.\\n\" +\n\t\t\t\t\t\"Your processor class is: \" + className);\n\t\t} else {\n\t\t\tnew LiveInjector().inject(ClassRootFinder.findClassRootOfClass(DisableCheckedExceptionsAgent.class));\n\t\t}\n\t}\n\t\n\t/** Does nothing - we just wanted the init method so we can inject an agent. */\n\t@Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {\n\t\tif (errorToShow != null) {\n\t\t\tif (errorToShow != null) {\n\t\t\t\tSet<? extends Element> rootElements = roundEnv.getRootElements();\n\t\t\t\tif (!rootElements.isEmpty()) {\n\t\t\t\t\tprocessingEnv.getMessager().printMessage(Kind.WARNING, errorToShow, rootElements.iterator().next());\n\t\t\t\t\terrorToShow = null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t\n\tpublic static void agentmain(String agentArgs, Instrumentation instrumentation) throws Exception {\n\t\tregisterPatchScripts(instrumentation, true);\n\t}\n\t\n\tpublic static void premain(String agentArgs, Instrumentation instrumentation) throws Exception {\n\t\tregisterPatchScripts(instrumentation, false);\n\t}\n\t\n\tprivate static void registerPatchScripts(Instrumentation instrumentation, boolean reloadExistingClasses) {\n\t\tScriptManager sm = new ScriptManager();\n\t\tsm.registerTransformer(instrumentation);\n\t\t\n\t\tpatchExceptions(sm);\n\t\t\n\t\tif (reloadExistingClasses) sm.reloadClasses(instrumentation);\n\t}\n\t\n\tprivate static void patchExceptions(ScriptManager sm) {\n\t\tsm.addScript(ScriptBuilder.exitEarly()\n\t\t\t\t.target(new MethodTarget(\"com.sun.tools.javac.comp.Check\", \"isUnchecked\",\n\t\t\t\t\t\t\"boolean\", \"com.sun.tools.javac.code.Symbol$ClassSymbol\"))\n\t\t\t\t.decisionMethod(new Hook(\"lombok.javac.disableCheckedExceptions.DisableCheckedExceptionsAgent\", \"retTrue\", \"boolean\"))\n\t\t\t\t.valueMethod(new Hook(\"lombok.javac.disableCheckedExceptions.DisableCheckedExceptionsAgent\", \"retTrue\", \"boolean\"))\n\t\t\t\t.insert().build());\n\t}\n\t\n\tpublic static boolean retTrue() {\n\t\treturn true;\n\t}\n}\n"
  },
  {
    "path": "sendSupporters",
    "content": "#!/bin/bash\nBASE=`dirname $0`\nscp \"$BASE/website/lombokSupporters/supporters.json\" \"escudo:/data/lombok/web/files/supporters.json\"\nif [ \"$*\" != \"\" ]; then\n\tfor var in \"$@\"; do\n\t\tscp \"$BASE/website/lombokSupporters/logos/$var\" \"escudo:/data/lombok/web/files/logos/$var\"\n\tdone\nfi\n\necho Dont forget to list images as arguments\n\n"
  },
  {
    "path": "src/ant/lombok/ant/SimpleTestFormatter.java",
    "content": "package lombok.ant;\n\nimport java.io.OutputStream;\nimport java.io.PrintStream;\nimport java.util.Arrays;\n\nimport junit.framework.AssertionFailedError;\nimport junit.framework.Test;\n\nimport org.apache.tools.ant.BuildException;\nimport org.apache.tools.ant.taskdefs.optional.junit.JUnitResultFormatter;\nimport org.apache.tools.ant.taskdefs.optional.junit.JUnitTest;\n\npublic class SimpleTestFormatter implements JUnitResultFormatter {\n\tprivate PrintStream out = System.out;\n\tprivate Test lastMarked = null;\n\t\n\t@Override\n\tpublic void addError(Test test, Throwable error) {\n\t\tlastMarked = test;\n\t\tlogResult(test, \"ERR\");\n\t\tprintThrowable(error, false, 2);\n\t}\n\t\n\tprivate void printThrowable(Throwable throwable, boolean cause, int indent) {\n\t\tString msg = throwable.getMessage();\n\t\tchar[] prefixChars = new char[indent];\n\t\tArrays.fill(prefixChars, ' ');\n\t\tString prefix = new String(prefixChars);\n\t\t\n\t\tif (msg == null || msg.isEmpty()) {\n\t\t\tout.println(prefix + (cause ? \"Caused by \" : \"\") + throwable.getClass());\n\t\t} else {\n\t\t\tout.println(prefix + (cause ? \"Caused by \" : \"\") + throwable.getClass() + \": \" + msg);\n\t\t}\n\t\tStackTraceElement[] elems = throwable.getStackTrace();\n\t\tif (elems != null) for (StackTraceElement elem : elems) {\n\t\t\tout.println(prefix + \"  \" + elem);\n\t\t}\n\t\t\n\t\tThrowable c = throwable.getCause();\n\t\tif (c != null) printThrowable(c, true, indent + 2);\n\t}\n\t\n\t@Override\n\tpublic void addFailure(Test test, AssertionFailedError failure) {\n\t\tlastMarked = test;\n\t\tlogResult(test, \"FAIL\");\n\t\tout.println(failure.getMessage());\n\t}\n\t\n\t@Override\n\tpublic void endTest(Test test) {\n\t\tif (test != lastMarked) logResult(test, \"PASS\");\n\t}\n\t\n\t@Override\n\tpublic void startTest(Test test) { }\n\t\n\t@Override\n\tpublic void endTestSuite(JUnitTest testSuite) throws BuildException { }\n\t\n\t@Override\n\tpublic void setOutput(OutputStream out) {\n\t\tthis.out = new PrintStream(out);\n\t}\n\t\n\t@Override\n\tpublic void setSystemError(String msg) {\n\t\tif (msg.trim().isEmpty()) return;\n\t\tout.println(msg);\n\t}\n\t\n\t@Override\n\tpublic void setSystemOutput(String msg) {\n\t\tif (msg.trim().isEmpty()) return;\n\t\tout.println(msg);\n\t}\n\t\n\t@Override\n\tpublic void startTestSuite(JUnitTest testSuite) throws BuildException { }\n\t\n\tprivate void logResult(Test test, String result) {\n\t\tout.println(\"[\" + result + \"] \" + String.valueOf(test));\n\t\tout.flush();\n\t}\n}\n"
  },
  {
    "path": "src/bindings/mapstruct/lombok/mapstruct/NotifierHider.java",
    "content": "package lombok.mapstruct;\n\nimport java.lang.reflect.Field;\n\nimport javax.lang.model.type.TypeMirror;\n\nimport org.mapstruct.ap.spi.AstModifyingAnnotationProcessor;\n\nclass NotifierHider {\n\tpublic static class AstModificationNotifier implements AstModifyingAnnotationProcessor {\n\t\tprivate static Field lombokInvoked;\n\t\t\n\t\t@Override public boolean isTypeComplete(TypeMirror type) {\n\t\t\tif (System.getProperty(\"lombok.disable\") != null) return true;\n\t\t\treturn isLombokInvoked();\n\t\t}\n\t\t\n\t\tprivate static boolean isLombokInvoked() {\n\t\t\tif (lombokInvoked != null) {\n\t\t\t\ttry {\n\t\t\t\t\treturn lombokInvoked.getBoolean(null);\n\t\t\t\t} catch (Exception e) {}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t\n\t\t\ttry {\n\t\t\t\tClass<?> data = Class.forName(\"lombok.launch.AnnotationProcessorHider$AstModificationNotifierData\");\n\t\t\t\tlombokInvoked = data.getField(\"lombokInvoked\");\n\t\t\t\treturn lombokInvoked.getBoolean(null);\n\t\t\t} catch (Exception e) {}\n\t\t\treturn true;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/bindings/mapstruct/module-info.java",
    "content": "/*\n * Copyright (C) 2020 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nmodule lombok.mapstruct {\n\trequires lombok;\n\trequires java.compiler;\n\n\trequires static org.mapstruct.processor;\n\t\n\tprovides org.mapstruct.ap.spi.AstModifyingAnnotationProcessor with lombok.mapstruct.NotifierHider.AstModificationNotifier;\n}\n"
  },
  {
    "path": "src/core/lombok/AccessLevel.java",
    "content": "/*\n * Copyright (C) 2009-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\n/**\n * Represents an AccessLevel. Used e.g. to specify the access level for generated methods and fields.\n */\npublic enum AccessLevel {\n\t/** Represents the {@code public} access level. */\n\tPUBLIC,\n\t\n\t/**\n\t * Acts exactly like {@code PACKAGE} - the package private access level.\n\t * @deprecated This value was created at a time when a module-level access keyword was planned as a way of being prepared for the future. But that's not the direction java went in; a 'module access level' is not likely to ever exist. This enum acts like {@code PACKAGE} in every way.\n\t */\n\t@Deprecated MODULE,\n\t\n\t/** Represents the {@code protected} access level (any code in the same package as well as any subtype). */\n\tPROTECTED,\n\t\n\t/** Represents the default access level: package private. (any code in the same package). */\n\tPACKAGE,\n\t\n\t/** Represents the {@code private} access level. */\n\tPRIVATE,\n\t\n\t/** Represents not generating anything or the complete lack of a method. */\n\tNONE;\n}\n"
  },
  {
    "path": "src/core/lombok/AllArgsConstructor.java",
    "content": "/*\n * Copyright (C) 2010-2017 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Generates an all-args constructor.\n * An all-args constructor requires one argument for every field in the class.\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/constructor\">the project lombok features page for &#64;Constructor</a>.\n * <p>\n * Even though it is not listed, this annotation also has the {@code onConstructor} parameter. See the full documentation for more details.\n * \n * @see NoArgsConstructor\n * @see RequiredArgsConstructor\n */\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.SOURCE)\npublic @interface AllArgsConstructor {\n\t/**\n\t * If set, the generated constructor will be private, and an additional static 'constructor'\n\t * is generated with the same argument list that wraps the real constructor.\n\t * \n\t * Such a static 'constructor' is primarily useful as it infers type arguments.\n\t * \n\t * @return Name of static 'constructor' method to generate (blank = generate a normal constructor).\n\t */\n\tString staticName() default \"\";\n\t\n\t/**\n\t * Any annotations listed here are put on the generated constructor.\n\t * The syntax for this feature depends on JDK version (nothing we can do about that; it's to work around javac bugs).<br>\n\t * up to JDK7:<br>\n\t *  {@code @AllArgsConstructor(onConstructor=@__({@AnnotationsGoHere}))}<br>\n\t * from JDK8:<br>\n\t *  {@code @AllArgsConstructor(onConstructor_={@AnnotationsGohere})} // note the underscore after {@code onConstructor}.\n\t *  \n\t * @return List of annotations to apply to the generated constructor.\n\t */\n\tAnyAnnotation[] onConstructor() default {};\n\t\n\t/**\n\t * Sets the access level of the constructor. By default, generated constructors are {@code public}.\n\t * \n\t * @return The constructor will be generated with this access modifier.\n\t */\n\tAccessLevel access() default lombok.AccessLevel.PUBLIC;\n\t\n\t/**\n\t  * Placeholder annotation to enable the placement of annotations on the generated code.\n\t  * \n\t  * @deprecated Don't use this annotation, ever - Read the documentation.\n\t  */\n\t@Deprecated\n\t@Retention(RetentionPolicy.SOURCE)\n\t@Target({})\n\t@interface AnyAnnotation {}\n}\n"
  },
  {
    "path": "src/core/lombok/Builder.java",
    "content": "/*\n * Copyright (C) 2013-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport static java.lang.annotation.ElementType.*;\nimport static java.lang.annotation.RetentionPolicy.*;\n\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.Target;\n\n/**\n * The builder annotation creates a so-called 'builder' aspect to the class that is annotated or the class\n * that contains a member which is annotated with {@code @Builder}.\n * <p>\n * If a member is annotated, it must be either a constructor or a method. If a class is annotated,\n * then a package-private constructor is generated with all fields as arguments\n * (as if {@code @AllArgsConstructor(access = AccessLevel.PACKAGE)} is present\n * on the class), and it is as if this constructor has been annotated with {@code @Builder} instead.\n * Note that this constructor is only generated if you haven't written any constructors and also haven't\n * added any explicit {@code @XArgsConstructor} annotations. In those cases, lombok will assume an all-args\n * constructor is present and generate code that uses it; this means you'd get a compiler error if this\n * constructor is not present.\n * <p>\n * The effect of {@code @Builder} is that an inner class is generated named <code><strong>T</strong>Builder</code>,\n * with a private constructor. Instances of <code><strong>T</strong>Builder</code> are made with the\n * method named {@code builder()} which is also generated for you in the class itself (not in the builder class).\n * <p>\n * The <code><strong>T</strong>Builder</code> class contains 1 method for each parameter of the annotated\n * constructor / method (each field, when annotating a class), which returns the builder itself.\n * The builder also has a {@code build()} method which returns a completed instance of the original type,\n * created by passing all parameters as set via the various other methods in the builder to the constructor\n * or method that was annotated with {@code @Builder}. The return type of this method will be the same\n * as the relevant class, unless a method has been annotated, in which case it'll be equal to the\n * return type of that method.\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/Builder\">the project lombok features page for &#64;Builder</a>.\n * <br>\n * <p>\n * Before:\n * \n * <pre>\n * &#064;Builder\n * class Example&lt;T&gt; {\n * \tprivate T foo;\n * \tprivate final String bar;\n * }\n * </pre>\n * \n * After:\n * \n * <pre>\n * class Example&lt;T&gt; {\n * \tprivate T foo;\n * \tprivate final String bar;\n * \t\n * \tprivate Example(T foo, String bar) {\n * \t\tthis.foo = foo;\n * \t\tthis.bar = bar;\n * \t}\n * \t\n * \tpublic static &lt;T&gt; ExampleBuilder&lt;T&gt; builder() {\n * \t\treturn new ExampleBuilder&lt;T&gt;();\n * \t}\n * \t\n * \tpublic static class ExampleBuilder&lt;T&gt; {\n * \t\tprivate T foo;\n * \t\tprivate String bar;\n * \t\t\n * \t\tprivate ExampleBuilder() {}\n * \t\t\n * \t\tpublic ExampleBuilder foo(T foo) {\n * \t\t\tthis.foo = foo;\n * \t\t\treturn this;\n * \t\t}\n * \t\t\n * \t\tpublic ExampleBuilder bar(String bar) {\n * \t\t\tthis.bar = bar;\n * \t\t\treturn this;\n * \t\t}\n * \t\t\n * \t\t&#064;java.lang.Override public String toString() {\n * \t\t\treturn \"ExampleBuilder(foo = \" + foo + \", bar = \" + bar + \")\";\n * \t\t}\n * \t\t\n * \t\tpublic Example build() {\n * \t\t\treturn new Example(foo, bar);\n * \t\t}\n * \t}\n * }\n * </pre>\n * \n * @see Singular\n */\n@Target({TYPE, METHOD, CONSTRUCTOR})\n@Retention(SOURCE)\npublic @interface Builder {\n\t/**\n\t * The field annotated with {@code @Default} must have an initializing expression; that expression is taken as the default to be used if not explicitly set during building.\n\t */\n\t@Target(FIELD)\n\t@Retention(SOURCE)\n\tpublic @interface Default {}\n\n\t/** @return Name of the method that creates a new builder instance. Default: {@code builder}. If the empty string, suppress generating the {@code builder} method. */\n\tString builderMethodName() default \"builder\";\n\t\n\t/** @return Name of the method in the builder class that creates an instance of your {@code @Builder}-annotated class. */\n\tString buildMethodName() default \"build\";\n\t\n\t/**\n\t * Name of the builder class.\n\t * \n\t * Default for {@code @Builder} on types and constructors: see the configkey {@code lombok.builder.className}, which if not set defaults to {@code (TypeName)Builder}.\n\t * <p>\n\t * Default for {@code @Builder} on methods: see the configkey {@code lombok.builder.className}, which if not set defaults to {@code (ReturnTypeName)Builder}.\n\t * \n\t * @return Name of the builder class that will be generated (or if it already exists, will be filled with builder elements).\n\t */\n\tString builderClassName() default \"\";\n\t\n\t/**\n\t * If true, generate an instance method to obtain a builder that is initialized with the values of this instance.\n\t * Legal only if {@code @Builder} is used on a constructor, on the type itself, or on a static method that returns\n\t * an instance of the declaring type.\n\t * \n\t * @return Whether to generate a {@code toBuilder()} method.\n\t */\n\tboolean toBuilder() default false;\n\t\n\t/**\n\t * Sets the access level of the generated builder class. By default, generated builder classes are {@code public}.\n\t * Note: This does nothing if you write your own builder class (we won't change its access level).\n\t * \n\t * @return The builder class will be generated with this access modifier.\n\t */\n\tAccessLevel access() default lombok.AccessLevel.PUBLIC;\n\n\t/**\n\t * Prefix to prepend to 'set' methods in the generated builder class.  By default, generated methods do not include a prefix.\n\t *\n\t * For example, a method normally generated as {@code someField(String someField)} would instead be\n\t * generated as {@code withSomeField(String someField)} if using {@code @Builder(setterPrefix = \"with\")}.\n\t *\n\t * Note that using \"with\" to prefix builder setter methods is strongly discouraged as \"with\" normally\n\t * suggests immutable data structures, and builders by definition are mutable objects.\n\t * \n\t * For {@code @Singular} fields, the generated methods are called {@code withName}, {@code withNames}, and {@code clearNames}, instead of\n\t * the default {@code name}, {@code names}, and {@code clearNames}.\n\t * \n\t * @return The prefix to prepend to generated method names.\n\t */\n\tString setterPrefix() default \"\";\n\t\n\t/**\n\t * Put on a field (in case of {@code @Builder} on a type) or a parameter (for {@code @Builder} on a constructor or static method) to\n\t * indicate how lombok should obtain a value for this field or parameter given an instance; this is only relevant if {@code toBuilder} is {@code true}.\n\t * \n\t * You do not need to supply an {@code @ObtainVia} annotation unless you wish to change the default behaviour: Use a field with the same name.\n\t * <p>\n\t * Note that one of {@code field} or {@code method} should be set, or an error is generated.\n\t * <p>\n\t * The default behaviour is to obtain a value by referencing the name of the parameter as a field on 'this'.\n\t */\n\t@Target({FIELD, PARAMETER})\n\t@Retention(SOURCE)\n\tpublic @interface ObtainVia {\n\t\t/**\n\t\t * @return Tells lombok to obtain a value with the expression {@code this.value}.\n\t\t */\n\t\tString field() default \"\";\n\t\t\n\t\t/**\n\t\t * @return Tells lombok to obtain a value with the expression {@code this.method()}.\n\t\t */\n\t\tString method() default \"\";\n\t\t\n\t\t/**\n\t\t * @return Tells lombok to obtain a value with the expression {@code SelfType.method(this)}; requires {@code method} to be set.\n\t\t */\n\t\tboolean isStatic() default false;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/Cleanup.java",
    "content": "/*\n * Copyright (C) 2009-2017 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Ensures the variable declaration that you annotate will be cleaned up by calling its close method, regardless\n * of what happens. Implemented by wrapping all statements following the local variable declaration to the\n * end of your scope into a try block that, as a finally action, closes the resource.\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/Cleanup\">the project lombok features page for &#64;Cleanup</a>.\n * <p>\n * Example:\n * <pre>\n * public void copyFile(String in, String out) throws IOException {\n *     &#64;Cleanup FileInputStream inStream = new FileInputStream(in);\n *     &#64;Cleanup FileOutputStream outStream = new FileOutputStream(out);\n *     byte[] b = new byte[65536];\n *     while (true) {\n *         int r = inStream.read(b);\n *         if (r == -1) break;\n *         outStream.write(b, 0, r);\n *     }\n * }\n * </pre>\n * \n * Will generate:\n * <pre>\n * public void copyFile(String in, String out) throws IOException {\n *     &#64;Cleanup FileInputStream inStream = new FileInputStream(in);\n *     try {\n *         &#64;Cleanup FileOutputStream outStream = new FileOutputStream(out);\n *         try {\n *             byte[] b = new byte[65536];\n *             while (true) {\n *                 int r = inStream.read(b);\n *                 if (r == -1) break;\n *                 outStream.write(b, 0, r);\n *             }\n *         } finally {\n *             if (outStream != null) outStream.close();\n *         }\n *     } finally {\n *         if (inStream != null) inStream.close();\n *     }\n * }\n * </pre>\n */\n@Target(ElementType.LOCAL_VARIABLE)\n@Retention(RetentionPolicy.SOURCE)\npublic @interface Cleanup {\n\t/** @return The name of the method that cleans up the resource. By default, 'close'. The method must not have any parameters. */\n\tString value() default \"close\";\n}\n"
  },
  {
    "path": "src/core/lombok/ConfigurationKeys.java",
    "content": "/*\n * Copyright (C) 2013-2026 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport java.util.List;\n\nimport lombok.core.configuration.CallSuperType;\nimport lombok.core.configuration.CapitalizationStrategy;\nimport lombok.core.configuration.CheckerFrameworkVersion;\nimport lombok.core.configuration.ConfigurationKey;\nimport lombok.core.configuration.FlagUsageType;\nimport lombok.core.configuration.IdentifierName;\nimport lombok.core.configuration.JacksonVersion;\nimport lombok.core.configuration.LogDeclaration;\nimport lombok.core.configuration.NullAnnotationLibrary;\nimport lombok.core.configuration.NullCheckExceptionType;\nimport lombok.core.configuration.TypeName;\n\n/**\n * A container class containing all lombok configuration keys that do not belong to a specific annotation.\n */\npublic class ConfigurationKeys {\n\tprivate ConfigurationKeys() {}\n\t\n\t// ##### main package features #####\n\t\n\t// ----- global -----\n\t\n\t/**\n\t * lombok configuration: {@code dangerousconfig.lombok.disable} = {@code true} | {@code false}.\n\t * \n\t * If {@code true}, lombok is disabled entirely.\n\t */\n\tpublic static final ConfigurationKey<Boolean> LOMBOK_DISABLE = new ConfigurationKey<Boolean>(\"dangerousconfig.lombok.disable\", \"Disables lombok transformers. It does not flag any lombok mentions (so, @Cleanup silently does nothing), and does not disable patched operations in eclipse either. Don't use this unless you know what you're doing. (default: false).\", true) {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.addGeneratedAnnotation} = {@code true} | {@code false}.\n\t * \n\t * If {@code true}, lombok generates {@code @javax.annotation.Generated(\"lombok\")} on all fields, methods, and types that are generated, unless {@code lombok.addJavaxGeneratedAnnotation} is set.\n\t * <br>\n\t * <em>BREAKING CHANGE</em>: Starting with lombok v1.16.20, defaults to {@code false} instead of {@code true}, as this annotation is broken in JDK9.\n\t * \n\t * @see ConfigurationKeys#ADD_JAVAX_GENERATED_ANNOTATIONS\n\t * @see ConfigurationKeys#ADD_JAKARTA_GENERATED_ANNOTATIONS\n\t * @see ConfigurationKeys#ADD_LOMBOK_GENERATED_ANNOTATIONS\n\t * @deprecated Since version 1.16.14, use {@link #ADD_JAVAX_GENERATED_ANNOTATIONS} instead.\n\t */\n\t@Deprecated\n\tpublic static final ConfigurationKey<Boolean> ADD_GENERATED_ANNOTATIONS = new ConfigurationKey<Boolean>(\"lombok.addGeneratedAnnotation\", \"Generate @javax.annotation.Generated on all generated code (default: false). Deprecated, use 'lombok.addJavaxGeneratedAnnotation' instead.\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.addJavaxGeneratedAnnotation} = {@code true} | {@code false}.\n\t * \n\t * If {@code true}, lombok generates {@code @javax.annotation.Generated(\"lombok\")} on all fields, methods, and types that are generated.\n\t * <br>\n\t * <em>BREAKING CHANGE</em>: Starting with lombok v1.16.20, defaults to {@code false} instead of {@code true}, as this annotation is broken in JDK9.\n\t */\n\tpublic static final ConfigurationKey<Boolean> ADD_JAVAX_GENERATED_ANNOTATIONS = new ConfigurationKey<Boolean>(\"lombok.addJavaxGeneratedAnnotation\", \"Generate @javax.annotation.Generated on all generated code (default: follow lombok.addGeneratedAnnotation).\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.addJakartaGeneratedAnnotation} = {@code true} | {@code false}.\n\t * \n\t * If {@code true}, lombok generates {@code @jakarta.annotation.Generated(\"lombok\")} on all fields, methods, and types that are generated.\n\t */\n\tpublic static final ConfigurationKey<Boolean> ADD_JAKARTA_GENERATED_ANNOTATIONS = new ConfigurationKey<Boolean>(\"lombok.addJakartaGeneratedAnnotation\", \"Generate @jakarta.annotation.Generated on all generated code (default: false).\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.addLombokGeneratedAnnotation} = {@code true} | {@code false}.\n\t * \n\t * If {@code true}, lombok generates {@code @lombok.Generated} on all fields, methods, and types that are generated.\n\t */\n\tpublic static final ConfigurationKey<Boolean> ADD_LOMBOK_GENERATED_ANNOTATIONS = new ConfigurationKey<Boolean>(\"lombok.addLombokGeneratedAnnotation\", \"Generate @lombok.Generated on all generated code (default: true).\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.extern.findbugs.addSuppressFBWarnings} = {@code true} | {@code false}.\n\t * \n\t * If {@code true}, lombok generates {@code edu.umd.cs.findbugs.annotations.SuppressFBWarnings} on all fields, methods, and types that are generated.\n\t * \n\t * NB: If you enable this option, findbugs must be on the source or classpath, or you'll get errors that the type {@code SuppressFBWarnings} cannot be found.\n\t */\n\tpublic static final ConfigurationKey<Boolean> ADD_FINDBUGS_SUPPRESSWARNINGS_ANNOTATIONS = new ConfigurationKey<Boolean>(\"lombok.extern.findbugs.addSuppressFBWarnings\", \"Generate @edu.umd.cs.findbugs.annotations.SuppressFBWarnings on all generated code (default: false).\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.addSuppressWarnings} = {@code true} | {@code false}.\n\t * \n\t * If {@code true}, lombok generates {@code @java.lang.SuppressWarnings(\"all\")} on all fields, methods, and types that are generated.\n\t */\n\tpublic static final ConfigurationKey<Boolean> ADD_SUPPRESSWARNINGS_ANNOTATIONS = new ConfigurationKey<Boolean>(\"lombok.addSuppressWarnings\", \"Generate @java.lang.SuppressWarnings(\\\"all\\\") on all generated code (default: true).\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.addNullAnnotations = }one of: [{@code none}, {@code javax}, {@code eclipse}, {@code jetbrains}, {@code netbeans}, {@code androidx}, {@code android.support}, {@code checkerframework}, {@code findbugs}, {@code spring}, {@code JML}, {@code jspecify} or a custom set of fully qualified annotation types].\n\t * \n\t * Lombok generally copies relevant nullity annotations from your source code to the right places. However, sometimes lombok generates code where the nullability of some node is not dependent on something in your source code. You can configure lombok to add an appropriate nullity annotation in this case.<ul>\n\t * <li>{@code none} (the default) - no annotations are added.</li>\n\t * <li>{@code javax} - The annotations {@code javax.annotation.NonNull} and {@code javax.annotation.Nullable} are used.</li>\n\t * <li>{@code jakarta} - The annotations {@code jakarta.annotation.NonNull} and {@code jakarta.annotation.Nullable} are used.</li>\n\t * <li>{@code eclipse} - The annotations {@code org.eclipse.jdt.annotation.NonNull} and {@code org.eclipse.jdt.annotation.Nullable} are used.</li>\n\t * <li>{@code jetbrains} - The annotations {@code org.jetbrains.annotations.NotNull} and {@code org.jetbrains.annotations.Nullable} are used.</li>\n\t * <li>{@code netbeans} - The annotations {@code org.netbeans.api.annotations.common.NonNull} and {@code org.netbeans.api.annotations.common.NullAllowed} are used.</li>\n\t * <li>{@code androidx} - The annotations {@code androidx.annotation.NonNull} and {@code androidx.annotation.Nullable} are used.</li>\n\t * <li>{@code android.support} - The annotations {@code android.support.annotation.NonNull} and {@code android.support.annotation.Nullable} are used.</li>\n\t * <li>{@code checkerframework} - The annotations {@code org.checkerframework.checker.nullness.qual.NonNull} and {@code org.checkerframework.checker.nullness.qual.Nullable} are used.</li>\n\t * <li>{@code findbugs} - The annotations {@code edu.umd.cs.findbugs.annotations.NonNull} and {@code edu.umd.cs.findbugs.annotations.Nullable} are used.</li>\n\t * <li>{@code spring} - The annotations {@code org.springframework.lang.NonNull} and {@code org.springframework.lang.Nullable} are used.</li>\n\t * <li>{@code jml} - The annotations {@code org.jmlspecs.annotation.NonNull} and {@code org.jmlspecs.annotation.Nullable} are used.</li>\n\t * <li>{@code jspecify} - The annotations {@code org.jspecify.annotations.NonNull} and {@code org.jspecify.annotations.Nullable} are used.</li>\n\t * <li><code>CUSTOM:<em>fully.qualified.nonnull.annotation</em>:<em>fully.qualified.nullable.annotation</em></code> to configure your own types; the nullable annotation (and the colon) are optional.</li>\n\t * </ul>\n\t * <p>\n\t * Lombok will not put these annotations on the classpath for you; your project must be set up such that these annotations are available.\n\t * <p>\n\t * Current features which use this configuration:<ul>\n\t * <li>{@code @Builder.Singular} makes methods that accept a collection, all of which must be added. The parameter to this 'plural form' method is annotated.</li>\n\t * </ul>\n\t */\n\tpublic static final ConfigurationKey<NullAnnotationLibrary> ADD_NULL_ANNOTATIONS = new ConfigurationKey<NullAnnotationLibrary>(\"lombok.addNullAnnotations\", \"Generate some style of null annotation for generated code where this is relevant. (default: none).\") {};\n\t\n\t// ----- *ArgsConstructor -----\n\t\n\t/**\n\t * lombok configuration: {@code lombok.anyConstructor.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @AllArgsConstructor}, {@code @RequiredArgsConstructor}, or {@code @NoArgsConstructor} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> ANY_CONSTRUCTOR_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.anyConstructor.flagUsage\", \"Emit a warning or error if any of the XxxArgsConstructor annotations are used.\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.anyConstructor.suppressConstructorProperties} = {@code true} | {@code false}.\n\t * \n\t * If {@code false} or this configuration is omitted, all generated constructors with at least 1 argument get a {@code @ConstructorProperties}.\n\t * To suppress the generation of it, set this configuration to {@code true}.\n\t * \n\t * NB: GWT projects, and probably android projects, should explicitly set this key to {@code true} for the entire project.\n\t * \n\t * <br>\n\t * <em>BREAKING CHANGE</em>: Starting with lombok v1.16.20, defaults to {@code true} instead of {@code false}, as {@code @ConstructorProperties} requires extra modules in JDK9.\n\t * \n\t * @see ConfigurationKeys#ANY_CONSTRUCTOR_ADD_CONSTRUCTOR_PROPERTIES\n\t * @deprecated Since version 2.0, use {@link #ANY_CONSTRUCTOR_ADD_CONSTRUCTOR_PROPERTIES} instead.\n\t */\n\t@Deprecated\n\tpublic static final ConfigurationKey<Boolean> ANY_CONSTRUCTOR_SUPPRESS_CONSTRUCTOR_PROPERTIES = new ConfigurationKey<Boolean>(\"lombok.anyConstructor.suppressConstructorProperties\", \"Suppress the generation of @ConstructorProperties for generated constructors (default: false).\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.anyConstructor.addConstructorProperties} = {@code true} | {@code false}.\n\t * \n\t * If {@code true}, all generated constructors with at least 1 argument get a {@code @ConstructorProperties}.\n\t * \n\t */\n\tpublic static final ConfigurationKey<Boolean> ANY_CONSTRUCTOR_ADD_CONSTRUCTOR_PROPERTIES = new ConfigurationKey<Boolean>(\"lombok.anyConstructor.addConstructorProperties\", \"Generate @ConstructorProperties for generated constructors (default: false).\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.allArgsConstructor.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @AllArgsConstructor} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> ALL_ARGS_CONSTRUCTOR_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.allArgsConstructor.flagUsage\", \"Emit a warning or error if @AllArgsConstructor is used.\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.noArgsConstructor.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @NoArgsConstructor} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> NO_ARGS_CONSTRUCTOR_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.noArgsConstructor.flagUsage\", \"Emit a warning or error if @NoArgsConstructor is used.\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.noArgsConstructor.extraPrivate} = {@code true} | {@code false}.\n\t * \n\t * If {@code true}, @Data and @Value will also generate a private no-args constructor, if there isn't already one, setting all fields to their default values.\n\t */\n\tpublic static final ConfigurationKey<Boolean> NO_ARGS_CONSTRUCTOR_EXTRA_PRIVATE = new ConfigurationKey<Boolean>(\"lombok.noArgsConstructor.extraPrivate\", \"Generate a private no-args constructor for @Data and @Value (default: false).\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.requiredArgsConstructor.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @RequiredArgsConstructor} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> REQUIRED_ARGS_CONSTRUCTOR_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.requiredArgsConstructor.flagUsage\", \"Emit a warning or error if @RequiredArgsConstructor is used.\") {};\n\t\n\t// ##### Beanies #####\n\t\n\t// ----- Data -----\n\t\n\t/**\n\t * lombok configuration: {@code lombok.data.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @Data} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> DATA_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.data.flagUsage\", \"Emit a warning or error if @Data is used.\") {};\n\t\n\t// ----- Value -----\n\t\n\t/**\n\t * lombok configuration: {@code lombok.value.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @Value} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> VALUE_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.value.flagUsage\", \"Emit a warning or error if @Value is used.\") {};\n\t\n\t// ----- Getter -----\n\t\n\t/**\n\t * lombok configuration: {@code lombok.getter.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @Getter} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> GETTER_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.getter.flagUsage\", \"Emit a warning or error if @Getter is used.\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.getter.lazy.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @Getter(lazy=true)} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> GETTER_LAZY_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.getter.lazy.flagUsage\", \"Emit a warning or error if @Getter(lazy=true) is used.\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.getter.noIsPrefix} = {@code true} | {@code false}.\n\t * \n\t * If {@code true}, booleans getters are both referred to, and generated as {@code getFieldName()}. If {@code false} (the default), the javabean-standard {@code isFieldName()} is generated / used instead.\n\t *\n\t */\n\tpublic static final ConfigurationKey<Boolean> GETTER_CONSEQUENT_BOOLEAN = new ConfigurationKey<Boolean>(\"lombok.getter.noIsPrefix\", \"If true, generate and use getFieldName() for boolean getters instead of isFieldName().\") {};\n\t\n\t// ----- Setter -----\n\t\n\t/**\n\t * lombok configuration: {@code lombok.setter.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @Setter} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> SETTER_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.setter.flagUsage\", \"Emit a warning or error if @Setter is used.\") {};\n\t\n\t// ----- EqualsAndHashCode -----\n\t\n\t/**\n\t * lombok configuration: {@code lombok.equalsAndHashCode.doNotUseGetters} = {@code true} | {@code false}.\n\t * \n\t * For any class without an {@code @EqualsAndHashCode} that explicitly defines the {@code doNotUseGetters} option, this value is used (default = false).\n\t */\n\tpublic static final ConfigurationKey<Boolean> EQUALS_AND_HASH_CODE_DO_NOT_USE_GETTERS = new ConfigurationKey<Boolean>(\"lombok.equalsAndHashCode.doNotUseGetters\", \"Don't call the getters but use the fields directly in the generated equals and hashCode method (default = false).\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.equalsAndHashCode.callSuper} = {@code call} | {@code ignore} | {@code warn}.\n\t * \n\t * For any class with an {@code @EqualsAndHashCode} annotation which extends a class other than {@code java.lang.Object}, should a call to superclass's implementation of {@code equals} and {@code hashCode} be included in the generated methods? (Default = warn)\n\t */\n\tpublic static final ConfigurationKey<CallSuperType> EQUALS_AND_HASH_CODE_CALL_SUPER = new ConfigurationKey<CallSuperType>(\"lombok.equalsAndHashCode.callSuper\", \"When generating equals and hashCode for classes that extend something (other than Object), either automatically take into account superclass implementation (call), or don't (skip), or warn and don't (warn). (default = warn).\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.equalsAndHashCode.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @EqualsAndHashCode} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> EQUALS_AND_HASH_CODE_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.equalsAndHashCode.flagUsage\", \"Emit a warning or error if @EqualsAndHashCode is used.\") {};\n\t\n\t// ----- ToString -----\n\t\n\t/**\n\t * lombok configuration: {@code lombok.toString.doNotUseGetters} = {@code true} | {@code false}.\n\t * \n\t * For any class without an {@code @ToString} that explicitly defines the {@code doNotUseGetters} option, this value is used  (default = false).\n\t */\n\tpublic static final ConfigurationKey<Boolean> TO_STRING_DO_NOT_USE_GETTERS = new ConfigurationKey<Boolean>(\"lombok.toString.doNotUseGetters\", \"Don't call the getters but use the fields directly in the generated toString method (default = false).\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.toString.callSuper} = {@code call} | {@code ignore} | {@code warn}.\n\t * \n\t * For any class with an {@code @ToString} annotation which extends a class other than {@code java.lang.Object}, should a call to superclass's implementation of {@code toString} be included in the generated method? (Default = skip)\n\t */\n\tpublic static final ConfigurationKey<CallSuperType> TO_STRING_CALL_SUPER = new ConfigurationKey<CallSuperType>(\"lombok.toString.callSuper\", \"When generating toString for classes that extend something (other than Object), either automatically take into account superclass implementation (call), or don't (skip), or warn and don't (warn). (default = skip).\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.toString.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @ToString} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> TO_STRING_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.toString.flagUsage\", \"Emit a warning or error if @ToString is used.\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.toString.includeFieldNames} = {@code true} | {@code false}.\n\t * \n\t * For any class without an {@code @ToString} that explicitly defines the {@code includeFieldNames} option, this value is used  (default = true).\n\t */\n\tpublic static final ConfigurationKey<Boolean> TO_STRING_INCLUDE_FIELD_NAMES = new ConfigurationKey<Boolean>(\"lombok.toString.includeFieldNames\", \"Include the field names in the generated toString method (default = true).\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.toString.onlyExplicitlyIncluded} = {@code true} | {@code false}.\n\t * \n\t * If {@code true}, require a {@code @ToString.Include} annotation on any fields/no-args methods you want to include in lombok's generated `@ToString` method. Otherwise, every (non-static, non-dollar-named) field is included by default  (default = false).\n\t */\n\tpublic static final ConfigurationKey<Boolean> TO_STRING_ONLY_EXPLICITLY_INCLUDED = new ConfigurationKey<Boolean>(\"lombok.toString.onlyExplicitlyIncluded\", \"Include only fields/methods explicitly marked with @ToString.Include. Otherwise, include all non-static, non-dollar-named fields (default = false).\") {};\n\t\n\t// ----- Builder -----\n\t\n\t/**\n\t * lombok configuration: {@code lombok.builder.classNames} = &lt;String: aJavaIdentifier (optionally with a star as placeholder for the type name)&gt; (Default: {@code *Builder}).\n\t * \n\t * For any usage of the {@code @Builder} annotation without an explicit {@code builderClassName} parameter, this value is used to determine the name of the builder class to generate (or to adapt if such an inner class already exists).\n\t */\n\tpublic static final ConfigurationKey<String> BUILDER_CLASS_NAME = new ConfigurationKey<String>(\"lombok.builder.className\", \"Default name of the generated builder class. A * is replaced with the name of the relevant type (default = *Builder).\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.builder.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @Builder} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> BUILDER_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.builder.flagUsage\", \"Emit a warning or error if @Builder is used.\") {};\n\t\n\t// ----- Singular -----\n\t\n\t/**\n\t * lombok configuration: {@code lombok.singular.useGuava} = {@code true} | {@code false}.\n\t * \n\t * If explicitly set to {@code true}, guava's {@code ImmutableList} etc are used to implement the immutable collection datatypes generated by @Singular @Builder for fields/parameters of type {@code java.util.List} and such.\n\t * By default, unmodifiable-wrapped versions of {@code java.util} types are used.\n\t */\n\tpublic static final ConfigurationKey<Boolean> SINGULAR_USE_GUAVA = new ConfigurationKey<Boolean>(\"lombok.singular.useGuava\", \"Generate backing immutable implementations for @Singular on java.util.* types by using guava's ImmutableList, etc. Normally java.util's mutable types are used and wrapped to make them immutable.\") {}; \n\t\n\t/**\n\t * lombok configuration: {@code lombok.singular.auto} = {@code true} | {@code false}.\n\t * \n\t * By default or if explicitly set to {@code true}, lombok will attempt to automatically singularize the name of your variable/parameter when using {@code @Singular}; the name is assumed to be written in english, and a plural. If explicitly to {@code false}, you must always specify the singular form; this is especially useful if your identifiers are in a foreign language.\n\t */\n\tpublic static final ConfigurationKey<Boolean> SINGULAR_AUTO = new ConfigurationKey<Boolean>(\"lombok.singular.auto\", \"If true (default): Automatically singularize the assumed-to-be-plural name of your variable/parameter when using @Singular.\") {}; \n\t\n\t// ##### Standalones #####\n\t\n\t// ----- Cleanup -----\n\t\n\t/**\n\t * lombok configuration: {@code lombok.cleanup.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @Cleanup} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> CLEANUP_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.cleanup.flagUsage\", \"Emit a warning or error if @Cleanup is used.\") {};\n\t\n\t// ----- Delegate -----\n\t\n\t/**\n\t * lombok configuration: {@code lombok.delegate.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @Delegate} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> DELEGATE_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.delegate.flagUsage\", \"Emit a warning or error if @Delegate is used.\") {};\n\t\n\t// ----- NonNull -----\n\t\n\t/**\n\t * lombok configuration: {@code lombok.nonNull.exceptionType} = one of: [{@code IllegalArgumentException}, {@code NullPointerException}, {@code JDK}, {@code Guava}, or {@code Assertion}].\n\t * \n\t * Sets the behavior of the generated nullcheck if {@code @NonNull} is applied to a method parameter, and a caller passes in {@code null}.<ul>\n\t * <li>If the chosen configuration is {@code NullPointerException} (the default), or {@code IllegalArgumentException}, that exception type is a thrown, with as message <code><em>field-name</em> is marked non-null but is null</code>.</li>\n\t * <li>If the chosen configuration is {@code Assert}, then an {@code assert} statement is generated. This means an {@code AssertionError} will be thrown if assertions are on (VM started with {@code -ea} parameter), and nothing happens if not.</li>\n\t * <li>If the chosen configuration is {@code JDK}, a call to {@code java.util.Objects.requireNonNull} is generated with the fieldname passed along (which throws {@code NullPointerException}).</li>\n\t * <li>If the chosen configuration is {@code Guava}, a call to {@code com.google.common.base.Preconditions.checkNotNull} is generated with the fieldname passed along (which throws {@code NullPointerException}).</li>\n\t * </ul>\n\t * NB: The chosen nullcheck style is also used by {@code @Builder}'s {@code @Singular} annotation to check any collections passed to a plural-form method.\n\t */\n\tpublic static final ConfigurationKey<NullCheckExceptionType> NON_NULL_EXCEPTION_TYPE = new ConfigurationKey<NullCheckExceptionType>(\"lombok.nonNull.exceptionType\", \"The type of the exception to throw if a passed-in argument is null (Default: NullPointerException).\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.nonNull.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @NonNull} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> NON_NULL_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.nonNull.flagUsage\", \"Emit a warning or error if @NonNull is used.\") {};\n\t\n\t// ----- SneakyThrows -----\n\t\n\t/**\n\t * lombok configuration: {@code lombok.sneakyThrows.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @SneakyThrows} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> SNEAKY_THROWS_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.sneakyThrows.flagUsage\", \"Emit a warning or error if @SneakyThrows is used.\") {};\n\t\n\t// ----- Synchronized -----\n\t\n\t/**\n\t * lombok configuration: {@code lombok.synchronized.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @Synchronized} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> SYNCHRONIZED_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.synchronized.flagUsage\", \"Emit a warning or error if @Synchronized is used.\") {};\n\t\n\t// ----- val -----\n\t\n\t/**\n\t * lombok configuration: {@code lombok.val.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code val} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> VAL_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.val.flagUsage\", \"Emit a warning or error if 'val' is used.\") {};\n\tpublic static final ConfigurationKey<FlagUsageType> VAR_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.var.flagUsage\", \"Emit a warning or error if 'var' is used.\") {};\n\n\t// ----- With -----\n\t\n\t/**\n\t * lombok configuration: {@code lombok.with.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @With} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> WITH_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.with.flagUsage\", \"Emit a warning or error if @With is used.\") {};\n\t\n\t// ##### Extern #####\n\t\n\t// ----- Logging -----\n\t/**\n\t * lombok configuration: {@code lombok.log.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of any of the log annotations in {@code lombok.extern}{@code @Slf4j} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> LOG_ANY_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.log.flagUsage\", \"Emit a warning or error if any of the log annotations is used.\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.log.apacheCommons.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @CommonsLog} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> LOG_COMMONS_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.log.apacheCommons.flagUsage\", \"Emit a warning or error if @CommonsLog is used.\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.log.javaUtilLogging.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @Log} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> LOG_JUL_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.log.javaUtilLogging.flagUsage\", \"Emit a warning or error if @Log is used.\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.log.log4j.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @Log4j} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> LOG_LOG4J_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.log.log4j.flagUsage\", \"Emit a warning or error if @Log4j is used.\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.log.log4j2.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @Log4j2} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> LOG_LOG4J2_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.log.log4j2.flagUsage\", \"Emit a warning or error if @Log4j2 is used.\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.log.slf4j.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @Slf4j} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> LOG_SLF4J_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.log.slf4j.flagUsage\", \"Emit a warning or error if @Slf4j is used.\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.log.xslf4j.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @XSlf4j} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> LOG_XSLF4J_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.log.xslf4j.flagUsage\", \"Emit a warning or error if @XSlf4j is used.\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.log.jbosslog.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @JBossLog} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> LOG_JBOSSLOG_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.log.jbosslog.flagUsage\", \"Emit a warning or error if @JBossLog is used.\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.log.flogger.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @Flogger} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> LOG_FLOGGER_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.log.flogger.flagUsage\", \"Emit a warning or error if @Flogger is used.\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.log.fieldName} = &lt;String: aJavaIdentifier&gt; (Default: {@code log}).\n\t * \n\t * If set the various log annotations (which make a log field) will use the stated identifier instead of {@code log} as a name.\n\t */\n\tpublic static final ConfigurationKey<IdentifierName> LOG_ANY_FIELD_NAME = new ConfigurationKey<IdentifierName>(\"lombok.log.fieldName\", \"Use this name for the generated logger fields (default: 'log').\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.log.fieldIsStatic} = {@code true} | {@code false}.\n\t * \n\t * If not set, or set to {@code true}, the log field generated by the various log annotations will be {@code static}.\n\t * \n\t * If set to {@code false}, these will be generated as instance fields instead.\n\t */\n\tpublic static final ConfigurationKey<Boolean> LOG_ANY_FIELD_IS_STATIC = new ConfigurationKey<Boolean>(\"lombok.log.fieldIsStatic\", \"Make the generated logger fields static (default: true).\") {};\n\t\n\t// ----- Custom Logging -----\n\t\n\t/**\n\t * lombok configuration: {@code lombok.log.custom.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @CustomLog} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> LOG_CUSTOM_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.log.custom.flagUsage\", \"Emit a warning or error if @CustomLog is used.\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.log.custom.declaration} = &lt;logDeclaration string&gt;.\n\t * \n\t * The log declaration must follow the pattern: \n\t * <br>\n\t * {@code [LoggerType ]LoggerFactoryType.loggerFactoryMethod(loggerFactoryMethodParams)[(loggerFactoryMethodParams)]}\n\t * <br>\n\t * It consists of:\n\t * <ul>\n\t * <li>Optional fully qualified logger type, e.g. {@code my.cool.Logger}, followed by space. If not specified, it defaults to the <em>LoggerFactoryType</em>.\n\t * <li>Fully qualified logger factory type, e.g. {@code my.cool.LoggerFactory}, followed by dot.\n\t * <li>Factory method, e.g. {@code createLogger}. This must be a {@code public static} method in the <em>LoggerFactoryType</em>.\n\t * <li>At least one definition of factory method parameters, e.g. {@code ()} or {@code (TOPIC,TYPE)}. The format inside the parentheses is a comma-separated list of parameter kinds.<br>\n\t * The allowed parameters are: {@code TYPE} | {@code NAME} | {@code TOPIC} | {@code NULL}.<br>\n\t * There can be at most one parameter definition with {@code TOPIC} and at most one without {@code TOPIC}. You can specify both.\n\t * </ul>\n\t * \n\t * An example: {@code my.cool.Logger my.cool.LoggerFactory.createLogger(TYPE)(TYPE,TOPIC)}<br>\n\t * If no topic is provided in the usage of {@code @CustomLog}, the above will invoke {@code LoggerFactory}'s {@code createLogger} method, passing in the type as a {@code java.lang.Class} variable.<br>\n\t * If a topic is provided, the overload of that method is invoked with 2 parameters: First the type (as {@code Class}), then the topic (as {@code String}).\n\t * <p>\n\t * If this configuration key is not set, any usage of {@code @CustomLog} will result in an error.\n\t */\n\tpublic static final ConfigurationKey<LogDeclaration> LOG_CUSTOM_DECLARATION = new ConfigurationKey<LogDeclaration>(\"lombok.log.custom.declaration\", \"Define the generated custom logger field.\") {};\n\n\t// ##### Experimental #####\n\t\n\t/**\n\t * lombok configuration: {@code lombok.experimental.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of any experimental features (from package {@code lombok.experimental}) that haven't been\n\t * promoted to a main feature results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> EXPERIMENTAL_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.experimental.flagUsage\", \"Emit a warning or error if an experimental feature is used.\") {};\n\t\n\t// ----- Accessors -----\n\t\n\t/**\n\t * lombok configuration: {@code lombok.accessors.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @Accessors} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> ACCESSORS_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.accessors.flagUsage\", \"Emit a warning or error if @Accessors is used.\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.accessors.prefix} += &lt;String: prefix&gt;.\n\t * \n\t * For any class without an {@code @Accessors} that explicitly defines the {@code prefix} option, this list of prefixes is used.\n\t */\n\tpublic static final ConfigurationKey<List<String>> ACCESSORS_PREFIX = new ConfigurationKey<List<String>>(\"lombok.accessors.prefix\", \"Strip this field prefix, like 'f' or 'm_', from the names of generated getters, setters, and with-ers.\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.accessors.chain} = {@code true} | {@code false}.\n\t * \n\t * For any class without an {@code @Accessors} that explicitly defines the {@code chain} option, this value is used (default = false).\n\t */\n\tpublic static final ConfigurationKey<Boolean> ACCESSORS_CHAIN = new ConfigurationKey<Boolean>(\"lombok.accessors.chain\", \"Generate setters that return 'this' instead of 'void' (default: false).\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.accessors.fluent} = {@code true} | {@code false}.\n\t * \n\t * For any class without an {@code @Accessors} that explicitly defines the {@code fluent} option, this value is used (default = false).\n\t */\n\tpublic static final ConfigurationKey<Boolean> ACCESSORS_FLUENT = new ConfigurationKey<Boolean>(\"lombok.accessors.fluent\", \"Generate getters and setters using only the field name (no get/set prefix) (default: false).\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.accessors.makeFinal} = {@code true} | {@code false}.\n\t * \n\t * Unless an explicit {@code @Accessors} that explicitly defines the {@code makeFinal} option, this value is used (default = false).\n\t */\n\tpublic static final ConfigurationKey<Boolean> ACCESSORS_MAKE_FINAL = new ConfigurationKey<Boolean>(\"lombok.accessors.makeFinal\", \"Generate getters, setters and with-ers with the 'final' modifier (default: false).\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.accessors.capitalization} = {@code basic} | {@code beanspec}.\n\t * \n\t * Which capitalization rule is used to turn field names into getter/setter/with names and vice versa for field names that start with 1 lowercase letter, then 1 uppercase letter.\n\t * basic = {@code uShape} becomes {@code getUShape}, beanspec = {@code uShape} becomes {@code getuShape} (default = basic).\n\t */\n\tpublic static final ConfigurationKey<CapitalizationStrategy> ACCESSORS_JAVA_BEANS_SPEC_CAPITALIZATION = new ConfigurationKey<CapitalizationStrategy>(\"lombok.accessors.capitalization\", \"Which capitalization strategy to use when converting field names to accessor names and vice versa (default: basic).\") {};\n\t\n\t\n\t// ----- ExtensionMethod -----\n\t\n\t/**\n\t * lombok configuration: {@code lombok.extensionMethod.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @ExtensionMethod} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> EXTENSION_METHOD_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.extensionMethod.flagUsage\", \"Emit a warning or error if @ExtensionMethod is used.\") {};\n\t\n\t// ----- FieldDefaults -----\n\t\n\t/**\n\t * lombok configuration: {@code lombok.fieldDefaults.defaultPrivate} = {@code true} | {@code false}.\n\t * \n\t * If set to {@code true} <em>any</em> field without an access modifier or {@code @PackagePrivate} is marked as {@code private} by lombok, in all source files compiled.\n\t */\n\tpublic static final ConfigurationKey<Boolean> FIELD_DEFAULTS_PRIVATE_EVERYWHERE = new ConfigurationKey<Boolean>(\"lombok.fieldDefaults.defaultPrivate\", \"If true, fields without any access modifier, in any file (lombok annotated or not) are marked as private. Use @PackagePrivate or an explicit modifier to override this.\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.fieldDefaults.defaultFinal} = {@code true} | {@code false}.\n\t * \n\t * If set to {@code true} <em>any</em> field without {@code @NonFinal} is marked as {@code final} by lombok, in all source files compiled.\n\t */\n\tpublic static final ConfigurationKey<Boolean> FIELD_DEFAULTS_FINAL_EVERYWHERE = new ConfigurationKey<Boolean>(\"lombok.fieldDefaults.defaultFinal\", \"If true, fields, in any file (lombok annotated or not) are marked as final. Use @NonFinal to override this.\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.fieldDefaults.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @FieldDefaults} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> FIELD_DEFAULTS_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.fieldDefaults.flagUsage\", \"Emit a warning or error if @FieldDefaults is used.\") {};\n\t\n\t// ----- Helper -----\n\t\n\t/**\n\t * lombok configuration: {@code lombok.helper.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @Helper} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> HELPER_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.helper.flagUsage\", \"Emit a warning or error if @Helper is used.\") {};\n\t\n\t// ----- LOCKED -----\n\t\n\t/**\n\t * lombok configuration: {@code lombok.locked.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t *\n\t * If set, <em>any</em> usage of {@code @Locked} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> LOCKED_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.locked.flagUsage\", \"Emit a warning or error if @Locked is used.\") {};\n\t\n\t// ----- onX -----\n\t\n\t/**\n\t * lombok configuration: {@code lombok.onX.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t *\n\t * If set, <em>any</em> usage of {@code onX} results in a warning / error.\n\t * <br>\n\t * Specifically, this flags usage of {@code @Getter(onMethod=...)}, {@code @Setter(onParam=...)}, {@code @Setter(onMethod=...)}, {@code @XArgsConstructor(onConstructor=...)}.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> ON_X_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.onX.flagUsage\", \"Emit a warning or error if onX is used.\") {};\n\t\n\t// ----- UtilityClass -----\n\t\n\t/**\n\t * lombok configuration: {@code lombok.utilityClass.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @UtilityClass} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> UTILITY_CLASS_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.utilityClass.flagUsage\", \"Emit a warning or error if @UtilityClass is used.\") {};\n\t\n\t// ----- FieldNameConstants -----\n\t/**\n\t * lombok configuration: {@code lombok.fieldNameConstants.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @FieldNameConstants} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> FIELD_NAME_CONSTANTS_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.fieldNameConstants.flagUsage\", \"Emit a warning or error if @FieldNameConstants is used.\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.fieldNameConstants.innerTypeName} = &lt;String: AValidJavaTypeName&gt; (Default: {@code Fields}).\n\t * \n\t * The names of the constants generated by {@code @FieldNameConstants} will be prefixed with this value.\n\t */\n\tpublic static final ConfigurationKey<IdentifierName> FIELD_NAME_CONSTANTS_INNER_TYPE_NAME = new ConfigurationKey<IdentifierName>(\"lombok.fieldNameConstants.innerTypeName\", \"The default name of the inner type generated by @FieldNameConstants. (default: 'Fields').\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.fieldNameConstants.uppercase} = {@code true} | {@code false}.\n\t * \n\t * If true, names of constants generated by {@code @FieldNameConstants} will be UPPER_CASED_LIKE_A_CONSTANT. (Default: {@code false}).\n\t */\n\tpublic static final ConfigurationKey<Boolean> FIELD_NAME_CONSTANTS_UPPERCASE = new ConfigurationKey<Boolean>(\"lombok.fieldNameConstants.uppercase\", \"The default name of the constants inside the inner type generated by @FieldNameConstants follow the variable name precisely. If this config key is true, lombok will uppercase them as best it can. (default: false).\") {};\n\t\n\t// ----- SuperBuilder -----\n\t\n\t/**\n\t * lombok configuration: {@code lombok.superBuilder.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @SuperBuilder} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> SUPERBUILDER_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.superBuilder.flagUsage\", \"Emit a warning or error if @SuperBuilder is used.\") {};\n\n\t// ----- WithBy -----\n\t\n\t/**\n\t * lombok configuration: {@code lombok.withBy.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @WithBy} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> WITHBY_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.withBy.flagUsage\", \"Emit a warning or error if @WithBy is used.\") {};\n\t\n\t// ----- Jacksonized -----\n\t\n\t/**\n\t * lombok configuration: {@code lombok.jacksonized.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t * \n\t * If set, <em>any</em> usage of {@code @Jacksonized} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> JACKSONIZED_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.jacksonized.flagUsage\", \"Emit a warning or error if @Jacksonized is used.\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.jacksonized.jacksonVersion} += {@code 2} / {@code 3}.\n\t * \n\t * Which version of the jackson annotations to generate.\n\t * \n\t * If no values specified: Generate version 2 and emit a warning to explicitly choose a jackson version in your {@code lombok.config}.\n\t */\n\tpublic static final ConfigurationKey<List<JacksonVersion>> JACKSONIZED_JACKSON_VERSION = new ConfigurationKey<List<JacksonVersion>>(\"lombok.jacksonized.jacksonVersion\", \"The jackson major version(s) to generate (default: 2 + warning)\") {};\n\t\n\t\n\t// ----- Configuration System -----\n\t\n\t/**\n\t * lombok configuration: {@code config.stopBubbling} = {@code true} | {@code false}.\n\t * \n\t * If not set, or set to {@code false}, the configuration system will look for {@code lombok.config} files in the parent directory.\n\t * \n\t * If set to {@code true}, no further {@code lombok.config} files will be checked.\n\t */\n\tpublic static final ConfigurationKey<Boolean> STOP_BUBBLING = new ConfigurationKey<Boolean>(\"config.stopBubbling\", \"Tell the configuration system it should stop looking for other configuration files (default: false).\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.copyableAnnotations} += &lt;TypeName: fully-qualified annotation class name&gt;.\n\t *\n\t * Copy these annotations to getters, setters, with methods, builder-setters, etc.\n\t */\n\tpublic static final ConfigurationKey<List<TypeName>> COPYABLE_ANNOTATIONS = new ConfigurationKey<List<TypeName>>(\"lombok.copyableAnnotations\", \"Copy these annotations to getters, setters, with methods, builder-setters, etc.\") {};\n\t\n\t/**\n\t * lombok configuration: {@code checkerframework} = {@code true} | {@code false} | &lt;String: MajorVer.MinorVer&gt; (Default: false).\n\t * \n\t * If set, lombok will generate appropriate annotations from checkerframework.org on generated code. If set to {@code true}, all relevant annotations from the most recent version of\n\t * checkerframework.org that lombok supports will be generated. If set to a specific major/minor version number, only checkerframework annotations introduced on or before the stated\n\t * checkerframework.org version will be generated.\n\t */\n\tpublic static final ConfigurationKey<CheckerFrameworkVersion> CHECKER_FRAMEWORK = new ConfigurationKey<CheckerFrameworkVersion>(\"checkerframework\", \"If set with the version of checkerframework.org (in major.minor, or just 'true' for the latest supported version), create relevant checkerframework.org annotations for code lombok generates (default: false).\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.standardException.flagUsage} = {@code WARNING} | {@code ERROR}.\n\t *\n\t * If set, <em>any</em> usage of {@code @StandardException} results in a warning / error.\n\t */\n\tpublic static final ConfigurationKey<FlagUsageType> STANDARD_EXCEPTION_FLAG_USAGE = new ConfigurationKey<FlagUsageType>(\"lombok.standardException.flagUsage\", \"Emit a warning or error if @StandardException is used.\") {};\n\t\n\t/**\n\t * lombok configuration: {@code lombok.copyJacksonAnnotationsToAccessors} = {@code true} | {@code false}.\n\t *\n\t * If {@code true}, copy certain Jackson annotations from a field to its corresponding accessors (getter/setters). This was the behavior from lombok 1.18.16 to 1.18.38.\n\t * However, it turned out to be harmful in certain situations. Thus, the default is now {@code false}.\n\t */\n\tpublic static final ConfigurationKey<Boolean> COPY_JACKSON_ANNOTATIONS_TO_ACCESSORS = new ConfigurationKey<Boolean>(\"lombok.copyJacksonAnnotationsToAccessors\", \"Copy Jackson annotations from fields to the corresponding getters and setters.\") {};\n}\n"
  },
  {
    "path": "src/core/lombok/CustomLog.java",
    "content": "/*\n * Copyright (C) 2019 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Causes lombok to generate a logger field based on a custom logger implementation.\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/log\">the project lombok features page for lombok log annotations</a>.\n * <p>\n * Example:\n * <pre>\n * &#64;CustomLog\n * public class LogExample {\n * }\n * </pre>\n * With configuration:\n * <pre>\n * lombok.log.custom.declaration=my.cool.Logger my.cool.LoggerFactory.getLogger(NAME)\n * </pre>\n * \n * will generate:\n * \n * <pre>\n * public class LogExample {\n *     private static final my.cool.Logger log = my.cool.LoggerFactory.getLogger(LogExample.class.getName());\n * }\n * </pre>\n * <p>\n * Configuration must be provided in lombok.config, otherwise any usage of this annotation will result in a compile-time error.\n * \n * This annotation is valid for classes and enumerations.<br>\n * @see lombok.extern.java.Log &#64;Log\n * @see lombok.extern.apachecommons.CommonsLog &#64;CommonsLog\n * @see lombok.extern.log4j.Log4j &#64;Log4j\n * @see lombok.extern.log4j.Log4j2 &#64;Log4j2\n * @see lombok.extern.slf4j.Slf4j &#64;Slf4j\n * @see lombok.extern.slf4j.XSlf4j &#64;XSlf4j\n * @see lombok.extern.jbosslog.JBossLog &#64;JBossLog\n * @see lombok.extern.flogger.Flogger &#64;Flogger\n */\n@Retention(RetentionPolicy.SOURCE)\n@Target(ElementType.TYPE)\npublic @interface CustomLog {\n\t/**\n\t * Sets the access level of the generated log field.\n\t * Default: {@code AccessLevel.PRIVATE}.\n\t * \n\t * @return The constructed Logger method will be generated with this access modifier.\n\t */\n\tAccessLevel access() default AccessLevel.PRIVATE;\n\t\n\t/**\n\t * \n\t * Sets a custom topic/category. Note that this requires you to specify a parameter configuration for your custom logger that includes {@code TOPIC}.\n\t * \n\t * @return The topic/category of the constructed Logger. By default (or for the empty string as topic), the parameter configuration without {@code TOPIC} is invoked.\n\t */\n\tString topic() default \"\";\n}\n"
  },
  {
    "path": "src/core/lombok/Data.java",
    "content": "/*\n * Copyright (C) 2009-2017 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Generates getters for all fields, a useful toString method, and hashCode and equals implementations that check\n * all non-transient fields. Will also generate setters for all non-final fields, as well as a constructor\n * (except that no constructor will be generated if any explicitly written constructors already exist).\n * <p>\n * Equivalent to {@code @Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode}.\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/Data\">the project lombok features page for &#64;Data</a>.\n * \n * @see Getter\n * @see Setter\n * @see RequiredArgsConstructor\n * @see ToString\n * @see EqualsAndHashCode\n * @see lombok.Value\n */\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.SOURCE)\npublic @interface Data {\n\t/**\n\t * If you specify a static constructor name, then the generated constructor will be private, and\n\t * instead a static factory method is created that other classes can use to create instances.\n\t * We suggest the name: \"of\", like so:\n\t * \n\t * <pre>\n\t *     public @Data(staticConstructor = \"of\") class Point { final int x, y; }\n\t * </pre>\n\t * \n\t * Default: No static constructor, instead the normal constructor is public.\n\t * \n\t * @return Name of static 'constructor' method to generate (blank = generate a normal constructor).\n\t */\n\tString staticConstructor() default \"\";\n}\n"
  },
  {
    "path": "src/core/lombok/Delegate.java",
    "content": "/*\n * Copyright (C) 2010-2017 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * @deprecated Use {@link lombok.experimental.Delegate} instead.\n */\n@Target({ElementType.FIELD, ElementType.METHOD})\n@Retention(RetentionPolicy.SOURCE)\n@Deprecated\npublic @interface Delegate {\n\t/**\n\t * Normally the type of the field is used as delegate type. However, to choose a different type to delegate, you can list one (or more) types here. Note that types with\n\t * type arguments can only be done as a field type. A solution for this is to create a private inner interface/class with the appropriate types extended, and possibly\n\t * with all methods you'd like to delegate listed, and then supply that class here. The field does not actually have to implement the type you're delegating; the\n\t * type listed here is used only to determine which delegate methods to generate.\n\t * \n\t * NB: All methods in {@code Object}, as well as {@code canEqual(Object other)} will never be delegated.\n\t * \n\t * @return For each method (not already in {@code java.lang.Object}) in these types, generate a delegate method.\n\t */\n\tClass<?>[] types() default {};\n\t\n\t/**\n\t * Each method in any of the types listed here (include supertypes) will <em>not</em> be delegated.\n\t * \n\t * NB: All methods in {@code Object}, as well as {@code canEqual(Object other)} will never be delegated.\n\t * \n\t * @return For each method (not already in {@code java.lang.Object}) in these types, skip generating a delegate method (overrides {@code types()}).\n\t */\n\tClass<?>[] excludes() default {};\n}\n"
  },
  {
    "path": "src/core/lombok/EqualsAndHashCode.java",
    "content": "/*\n * Copyright (C) 2009-2020 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Generates implementations for the {@code equals} and {@code hashCode} methods inherited by all objects, based on relevant fields.\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/EqualsAndHashCode\">the project lombok features page for &#64;EqualsAndHashCode</a>.\n */\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.SOURCE)\npublic @interface EqualsAndHashCode {\n\t/**\n\t * Any fields listed here will not be taken into account in the generated {@code equals} and {@code hashCode} implementations.\n\t * Mutually exclusive with {@link #of()}.\n\t * <p>\n\t * Will soon be marked {@code @Deprecated}; use the {@code @EqualsAndHashCode.Exclude} annotation instead.\n\t * \n\t * @return A list of fields to exclude.\n\t */\n\tString[] exclude() default {};\n\t\n\t/**\n\t * If present, explicitly lists the fields that are to be used for identity.\n\t * Normally, all non-static, non-transient fields are used for identity.\n\t * <p>\n\t * Mutually exclusive with {@link #exclude()}.\n\t * <p>\n\t * Will soon be marked {@code @Deprecated}; use the {@code @EqualsAndHashCode.Include} annotation together with {@code @EqualsAndHashCode(onlyExplicitlyIncluded = true)}.\n\t * \n\t * @return A list of fields to use (<em>default</em>: all of them).\n\t */\n\tString[] of() default {};\n\t\n\t/**\n\t * Call on the superclass's implementations of {@code equals} and {@code hashCode} before calculating for the fields in this class.\n\t * <strong>default: false</strong>\n\t * \n\t * @return Whether to call the superclass's {@code equals} implementation as part of the generated equals algorithm.\n\t */\n\tboolean callSuper() default false;\n\t\n\t/**\n\t * Normally, if getters are available, those are called. To suppress this and let the generated code use the fields directly, set this to {@code true}.\n\t * <strong>default: false</strong>\n\t * \n\t * @return If {@code true}, always use direct field access instead of calling the getter method.\n\t */\n\tboolean doNotUseGetters() default false;\n\n\t/**\n\t * Determines how the result of the {@code hashCode} method will be cached.\n\t * <strong>default: {@link CacheStrategy#NEVER}</strong>\n\t *\n\t * @return The {@code hashCode} cache strategy to be used.\n\t */\n\tCacheStrategy cacheStrategy() default CacheStrategy.NEVER;\n\t\n\t/**\n\t * Any annotations listed here are put on the generated parameter of {@code equals} and {@code canEqual}.\n\t * This is useful to add for example a {@code Nullable} annotation.<br>\n\t * The syntax for this feature depends on JDK version (nothing we can do about that; it's to work around javac bugs).<br>\n\t * up to JDK7:<br>\n\t *  {@code @EqualsAndHashCode(onParam=@__({@AnnotationsGoHere}))}<br>\n\t * from JDK8:<br>\n\t *  {@code @EqualsAndHashCode(onParam_={@AnnotationsGohere})} // note the underscore after {@code onParam}.\n\t *  \n\t * @return List of annotations to apply to the generated parameter in the {@code equals()} method.\n\t */\n\tAnyAnnotation[] onParam() default {};\n\t\n\t/**\n\t * Placeholder annotation to enable the placement of annotations on the generated code.\n\t * @deprecated Don't use this annotation, ever - Read the documentation.\n\t */\n\t@Deprecated\n\t@Retention(RetentionPolicy.SOURCE)\n\t@Target({})\n\t@interface AnyAnnotation {}\n\t\n\t/**\n\t * Only include fields and methods explicitly marked with {@code @EqualsAndHashCode.Include}.\n\t * Normally, all (non-static, non-transient) fields are included by default.\n\t * \n\t * @return If {@code true}, don't include non-static non-transient fields automatically (default: {@code false}).\n\t */\n\tboolean onlyExplicitlyIncluded() default false;\n\t\n\t/**\n\t * If present, do not include this field in the generated {@code equals} and {@code hashCode} methods.\n\t */\n\t@Target(ElementType.FIELD)\n\t@Retention(RetentionPolicy.SOURCE)\n\tpublic @interface Exclude {}\n\t\n\t/**\n\t * Configure the behaviour of how this member is treated in the {@code equals} and {@code hashCode} implementation; if on a method, include the method's return value as part of calculating hashCode/equality.\n\t */\n\t@Target({ElementType.FIELD, ElementType.METHOD})\n\t@Retention(RetentionPolicy.SOURCE)\n\tpublic @interface Include {\n\t\t/**\n\t\t * Defaults to the method name of the annotated member.\n\t\t * If on a method and the name equals the name of a default-included field, this member takes its place.\n\t\t * \n\t\t * @return If present, this method serves as replacement for the named field.\n\t\t */\n\t\tString replaces() default \"\";\n\n\t\t/**\n\t\t * Higher ranks are considered first. Members of the same rank are considered in the order they appear in the source file.\n\t\t * \n\t\t * If not explicitly set, the {@code default} rank for primitives is 1000, and for primitive wrappers 800.\n\t\t * \n\t\t * @return ordering within the generating {@code equals} and {@code hashCode} methods; higher numbers are considered first.\n\t\t */\n\t\tint rank() default 0;\n\t}\n\n\tpublic enum CacheStrategy {\n\t\t/**\n\t\t * Never cache. Perform the calculation every time the method is called.\n\t\t */\n\t\tNEVER,\n\t\t/**\n\t\t * Cache the result of the first invocation of {@code hashCode} and use it for subsequent invocations.\n\t\t * This can improve performance if all fields used for calculating the {@code hashCode} are immutable\n\t\t * and thus every invocation of {@code hashCode} will always return the same value.\n\t\t * <strong>Do not use this if there's <em>any</em> chance that different invocations of {@code hashCode}\n\t\t * might return different values.</strong>\n\t\t */\n\t\tLAZY\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/Generated.java",
    "content": "/*\n * Copyright (C) 2015-2024 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Lombok automatically adds this annotation to all generated constructors, methods, fields, and types.\n * \n * You can mark the presence of this annotation as 'ignore it' for all code style and bug finding tools.\n * <p>\n * NB: As of v1.18.34, lombok adds this annotation by default; before then you had to add a lombok config key.\n * <p>\n * If you want to opt out (not recommended), you can add {@code lombok.addLombokGeneratedAnnotation = false} to\n * {@code lombok.config}.\n */\n@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.FIELD, ElementType.TYPE})\n@Retention(RetentionPolicy.CLASS)\npublic @interface Generated {\n}\n"
  },
  {
    "path": "src/core/lombok/Getter.java",
    "content": "/*\n * Copyright (C) 2009-2017 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Put on any field to make lombok build a standard getter.\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/GetterSetter\">the project lombok features page for &#64;Getter and &#64;Setter</a>.\n * <p>\n * Even though it is not listed, this annotation also has the {@code onMethod} parameter. See the full documentation for more details.\n * <p>\n * Example:\n * <pre>\n *     private &#64;Getter int foo;\n * </pre>\n * \n * will generate:\n * \n * <pre>\n *     public int getFoo() {\n *         return this.foo;\n *     }\n * </pre>\n * <p>\n * This annotation can also be applied to a class, in which case it'll be as if all non-static fields that don't already have\n * a {@code @Getter} annotation have the annotation.\n */\n@Target({ElementType.FIELD, ElementType.TYPE})\n@Retention(RetentionPolicy.SOURCE)\npublic @interface Getter {\n\t/**\n\t * If you want your getter to be non-public, you can specify an alternate access level here.\n\t * \n\t * @return The getter method will be generated with this access modifier.\n\t */\n\tlombok.AccessLevel value() default lombok.AccessLevel.PUBLIC;\n\t\n\t/**\n\t * Any annotations listed here are put on the generated method.\n\t * The syntax for this feature depends on JDK version (nothing we can do about that; it's to work around javac bugs).<br>\n\t * up to JDK7:<br>\n\t *  {@code @Getter(onMethod=@__({@AnnotationsGoHere}))}<br>\n\t * from JDK8:<br>\n\t *  {@code @Getter(onMethod_={@AnnotationsGohere})} // note the underscore after {@code onMethod}.\n\t *  \n\t * @return List of annotations to apply to the generated getter method.\n\t */\n\tAnyAnnotation[] onMethod() default {};\n\t\n\tboolean lazy() default false;\n\t\n\t/**\n\t * Placeholder annotation to enable the placement of annotations on the generated code.\n\t * @deprecated Don't use this annotation, ever - Read the documentation.\n\t */\n\t@Deprecated\n\t@Retention(RetentionPolicy.SOURCE)\n\t@Target({})\n\t@interface AnyAnnotation {}\n}\n"
  },
  {
    "path": "src/core/lombok/Locked.java",
    "content": "/*\n * Copyright (C) 2021-2023 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Guards all statements in an annotation method with a {@link java.util.concurrent.locks.Lock}.\n * <p>\n * For non-static methods, a field named {@code $lock} is used, and for static methods,\n * {@code $LOCK} is used. These will be generated if needed and if they aren't already present.\n * <p>\n * Because {@link Locked} uses a different type of lock from {@link Locked.Read} and {@link Locked.Write}, using both in\n * the same class using the default names will result in a compile time error.\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/Locked\">the project lombok features page for &#64;Locked</a>.\n */\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.SOURCE)\npublic @interface Locked {\n\t/**\n\t * Locks using a {@link java.util.concurrent.locks.ReadWriteLock#readLock()}.\n\t */\n\t@Target(ElementType.METHOD)\n\t@Retention(RetentionPolicy.SOURCE)\n\tpublic @interface Read {\n\t\t/**\n\t\t * Optional: specify the name of a different field to lock on. It is a compile time error if this field\n\t\t * doesn't already exist (the fields are automatically generated only if you don't specify a specific name).\n\t\t *\n\t\t * @return Name of the field to lock on (blank = generate one).\n\t\t */\n\t\tString value() default \"\";\n\t}\n\t\n\t/**\n\t * Locks using a {@link java.util.concurrent.locks.ReadWriteLock#writeLock()}.\n\t */\n\t@Target(ElementType.METHOD)\n\t@Retention(RetentionPolicy.SOURCE)\n\tpublic @interface Write {\n\t\t/**\n\t\t * Optional: specify the name of a different field to lock on. It is a compile time error if this field\n\t\t * doesn't already exist (the fields are automatically generated only if you don't specify a specific name).\n\t\t *\n\t\t * @return Name of the field to lock on (blank = generate one).\n\t\t */\n\t\tString value() default \"\";\n\t}\n\t\n\t/**\n\t * Optional: specify the name of a different field to lock on. It is a compile time error if this field\n\t * doesn't already exist (the fields are automatically generated only if you don't specify a specific name).\n\t *\n\t * @return Name of the field to lock on (blank = generate one).\n\t */\n\tString value() default \"\";\n}\n"
  },
  {
    "path": "src/core/lombok/Lombok.java",
    "content": "/*\n * Copyright (C) 2009-2017 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\n/**\n * Useful utility methods to manipulate lombok-generated code.\n */\npublic class Lombok {\n\t/**\n\t * Throws any throwable 'sneakily' - you don't need to catch it, nor declare that you throw it onwards.\n\t * The exception is still thrown - javac will just stop whining about it.\n\t * <p>\n\t * Example usage:\n\t * <pre>public void run() {\n\t *     throw sneakyThrow(new IOException(\"You don't need to catch me!\"));\n\t * }</pre>\n\t * <p>\n\t * NB: The exception is not wrapped, ignored, swallowed, or redefined. The JVM actually does not know or care\n\t * about the concept of a 'checked exception'. All this method does is hide the act of throwing a checked exception\n\t * from the java compiler.\n\t * <p>\n\t * Note that this method has a return type of {@code RuntimeException}; it is advised you always call this\n\t * method as argument to the {@code throw} statement to avoid compiler errors regarding no return\n\t * statement and similar problems. This method won't of course return an actual {@code RuntimeException} -\n\t * it never returns, it always throws the provided exception.\n\t * \n\t * @param t The throwable to throw without requiring you to catch its type.\n\t * @return A dummy RuntimeException; this method never returns normally, it <em>always</em> throws an exception!\n\t */\n\tpublic static RuntimeException sneakyThrow(Throwable t) {\n\t\tif (t == null) throw new NullPointerException(\"t\");\n\t\treturn Lombok.<RuntimeException>sneakyThrow0(t);\n\t}\n\t\n\t@SuppressWarnings(\"unchecked\")\n\tprivate static <T extends Throwable> T sneakyThrow0(Throwable t) throws T {\n\t\tthrow (T)t;\n\t}\n\t\n\t/**\n\t * Returns the parameter directly.\n\t * \n\t * This method can be used to prevent a static analyzer to determine the nullness of the passed parameter.\n\t * \n\t * @param <T> the type of the parameter.\n\t * @param value the value to return.\n\t * @return value (this method just returns the parameter).\n\t */\n\tpublic static <T> T preventNullAnalysis(T value) {\n\t\treturn value;\n\t}\n\t\n\t/**\n\t * Ensures that the {@code value} is not {@code null}.\n\t * \n\t * @param <T> Type of the parameter.\n\t * @param value the value to test for null.\n\t * @param message the message of the {@link NullPointerException}.\n\t * @return the value if it is not null.\n\t * @throws NullPointerException with the {@code message} if the value is null.\n\t */\n\tpublic static <T> T checkNotNull(T value, String message) {\n\t\tif (value == null) throw new NullPointerException(message);\n\t\treturn value;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/NoArgsConstructor.java",
    "content": "/*\n * Copyright (C) 2010-2017 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Generates a no-args constructor.\n * Will generate an error message if such a constructor cannot be written due to the existence of final fields.\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/constructor\">the project lombok features page for &#64;Constructor</a>.\n * <p>\n * Even though it is not listed, this annotation also has the {@code onConstructor} parameter. See the full documentation for more details.\n * <p>\n * NB: Fields with constraints such as {@code @NonNull} will <em>NOT</em> be checked in a {@code @NoArgsConstructor} constructor, of course!\n * \n * @see RequiredArgsConstructor\n * @see AllArgsConstructor\n */\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.SOURCE)\npublic @interface NoArgsConstructor {\n\t/**\n\t * If set, the generated constructor will be private, and an additional static 'constructor'\n\t * is generated with the same argument list that wraps the real constructor.\n\t * \n\t * Such a static 'constructor' is primarily useful as it infers type arguments.\n\t * \n\t * @return Name of static 'constructor' method to generate (blank = generate a normal constructor).\n\t */\n\tString staticName() default \"\";\n\t\n\t/**\n\t * Any annotations listed here are put on the generated constructor.\n\t * The syntax for this feature depends on JDK version (nothing we can do about that; it's to work around javac bugs).<br>\n\t * up to JDK7:<br>\n\t *  {@code @NoArgsConstructor(onConstructor=@__({@AnnotationsGoHere}))}<br>\n\t * from JDK8:<br>\n\t *  {@code @NoArgsConstructor(onConstructor_={@AnnotationsGohere})} // note the underscore after {@code onConstructor}.\n\t * \n\t * @return List of annotations to apply to the generated constructor.\n\t */\n\tAnyAnnotation[] onConstructor() default {};\n\t\n\t/**\n\t * Sets the access level of the constructor. By default, generated constructors are {@code public}.\n\t * \n\t * @return The constructor will be generated with this access modifier.\n\t */\n\tAccessLevel access() default lombok.AccessLevel.PUBLIC;\n\t\n\t/**\n\t * If {@code true}, initializes all final fields to 0 / null / false.\n\t * Otherwise, a compile time error occurs.\n\t * \n\t * @return {@code} true to force generation of a no-args constructor, picking defaults if necessary to assign required fields.\n\t */\n\tboolean force() default false;\n\t\n\t/**\n\t  * Placeholder annotation to enable the placement of annotations on the generated code.\n\t  * @deprecated Don't use this annotation, ever - Read the documentation.\n\t  */\n\t@Deprecated\n\t@Retention(RetentionPolicy.SOURCE)\n\t@Target({})\n\t@interface AnyAnnotation {}\n}\n"
  },
  {
    "path": "src/core/lombok/NonNull.java",
    "content": "/*\n * Copyright (C) 2009-2019 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * If put on a parameter, lombok will insert a null-check at the start of the method / constructor's body, throwing a\n * {@code NullPointerException} with the parameter's name as message. If put on a field, any generated method assigning\n * a value to this field will also produce these null-checks.\n */\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE, ElementType.TYPE_USE})\n@Retention(RetentionPolicy.CLASS)\n@Documented\npublic @interface NonNull {\n}\n"
  },
  {
    "path": "src/core/lombok/RequiredArgsConstructor.java",
    "content": "/*\n * Copyright (C) 2010-2017 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Generates a constructor with required arguments.\n * Required arguments are final fields and fields with constraints such as {@code @NonNull}.\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/constructor\">the project lombok features page for &#64;Constructor</a>.\n * <p>\n * Even though it is not listed, this annotation also has the {@code onConstructor} parameter. See the full documentation for more details.\n * \n * @see NoArgsConstructor\n * @see AllArgsConstructor\n */\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.SOURCE)\npublic @interface RequiredArgsConstructor {\n\t/**\n\t * If set, the generated constructor will be private, and an additional static 'constructor'\n\t * is generated with the same argument list that wraps the real constructor.\n\t * \n\t * Such a static 'constructor' is primarily useful as it infers type arguments.\n\t * \n\t * @return Name of static 'constructor' method to generate (blank = generate a normal constructor).\n\t */\n\tString staticName() default \"\";\n\t\n\t/**\n\t * Any annotations listed here are put on the generated constructor.\n\t * The syntax for this feature depends on JDK version (nothing we can do about that; it's to work around javac bugs).<br>\n\t * up to JDK7:<br>\n\t *  {@code @RequiredArgsConstructor(onConstructor=@__({@AnnotationsGoHere}))}<br>\n\t * from JDK8:<br>\n\t *  {@code @RequiredArgsConstructor(onConstructor_={@AnnotationsGohere})} // note the underscore after {@code onConstructor}.\n\t * \n\t * @return List of annotations to apply to the generated constructor.\n\t */\n\tAnyAnnotation[] onConstructor() default {};\n\t\n\t/**\n\t * Sets the access level of the constructor. By default, generated constructors are {@code public}.\n\t * \n\t * @return The constructor will be generated with this access modifier.\n\t */\n\tAccessLevel access() default lombok.AccessLevel.PUBLIC;\n\t\n\t/**\n\t  * Placeholder annotation to enable the placement of annotations on the generated code.\n\t  * @deprecated Don't use this annotation, ever - Read the documentation.\n\t  */\n\t@Deprecated\n\t@Retention(RetentionPolicy.SOURCE)\n\t@Target({})\n\t@interface AnyAnnotation {}\n}\n"
  },
  {
    "path": "src/core/lombok/Setter.java",
    "content": "/*\n * Copyright (C) 2009-2017 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Put on any field to make lombok build a standard setter.\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/GetterSetter\">the project lombok features page for &#64;Getter and &#64;Setter</a>.\n * <p>\n * Even though it is not listed, this annotation also has the {@code onParam} and {@code onMethod} parameter. See the full documentation for more details.\n * <p>\n * Example:\n * <pre>\n *     private &#64;Setter int foo;\n * </pre>\n * \n * will generate:\n * \n * <pre>\n *     public void setFoo(int foo) {\n *         this.foo = foo;\n *     }\n * </pre>\n * \n * <p>\n * This annotation can also be applied to a class, in which case it'll be as if all non-static fields that don't already have\n * a {@code Setter} annotation have the annotation.\n */\n@Target({ElementType.FIELD, ElementType.TYPE})\n@Retention(RetentionPolicy.SOURCE)\npublic @interface Setter {\n\t/**\n\t * If you want your setter to be non-public, you can specify an alternate access level here.\n\t * \n\t * @return The setter method will be generated with this access modifier.\n\t */\n\tlombok.AccessLevel value() default lombok.AccessLevel.PUBLIC;\n\t\n\t/**\n\t * Any annotations listed here are put on the generated method.\n\t * The syntax for this feature depends on JDK version (nothing we can do about that; it's to work around javac bugs).<br>\n\t * up to JDK7:<br>\n\t *  {@code @Setter(onMethod=@__({@AnnotationsGoHere}))}<br>\n\t * from JDK8:<br>\n\t *  {@code @Setter(onMethod_={@AnnotationsGohere})} // note the underscore after {@code onMethod}.\n\t *  \n\t * @return List of annotations to apply to the generated setter method.\n\t */\n\tAnyAnnotation[] onMethod() default {};\n\t\n\t/**\n\t * Any annotations listed here are put on the generated method's parameter.\n\t * The syntax for this feature depends on JDK version (nothing we can do about that; it's to work around javac bugs).<br>\n\t * up to JDK7:<br>\n\t *  {@code @Setter(onParam=@__({@AnnotationsGoHere}))}<br>\n\t * from JDK8:<br>\n\t *  {@code @Setter(onParam_={@AnnotationsGohere})} // note the underscore after {@code onParam}.\n\t *  \n\t * @return List of annotations to apply to the generated parameter in the setter method.\n\t */\n\tAnyAnnotation[] onParam() default {};\n\t\n\t/**\n\t  * Placeholder annotation to enable the placement of annotations on the generated code.\n\t  * @deprecated Don't use this annotation, ever - Read the documentation.\n\t  */\n\t@Deprecated\n\t@Retention(RetentionPolicy.SOURCE)\n\t@Target({})\n\t@interface AnyAnnotation {}\n}"
  },
  {
    "path": "src/core/lombok/Singular.java",
    "content": "/*\n * Copyright (C) 2015-2020 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport static java.lang.annotation.ElementType.*;\nimport static java.lang.annotation.RetentionPolicy.*;\n\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.Target;\n\n/**\n * The singular annotation is used together with {@code @Builder} to create single element 'add' methods in the builder for collections.\n */\n@Target({FIELD, PARAMETER})\n@Retention(SOURCE)\npublic @interface Singular {\n\t/** @return The singular name of this field. If it's a normal english plural, lombok will figure it out automatically. Otherwise, this parameter is mandatory. */\n\tString value() default \"\";\n\t\n\t/** @return If true, the plural variant (which takes a collection and adds each element inside) will treat {@code null} as an empty collection, i.e. do nothing. If {@code false} (the default), it is null checked as if annotated with {@code @lombok.NonNull}. */\n\tboolean ignoreNullCollections() default false;\n}\n"
  },
  {
    "path": "src/core/lombok/SneakyThrows.java",
    "content": "/*\n * Copyright (C) 2009-2017 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * &#64;SneakyThrows will avoid javac's insistence that you either catch or throw onward any checked exceptions that\n * statements in your method body declare they generate.\n * <p>\n * &#64;SneakyThrows does not silently swallow, wrap into RuntimeException, or otherwise modify any exceptions of the listed\n * checked exception types. The JVM does not check for the consistency of the checked exception system; javac does,\n * and this annotation lets you opt out of its mechanism.\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/SneakyThrows\">the project lombok features page for &#64;SneakyThrows</a>.\n * <p>\n * Example:\n * <pre>\n * &#64;SneakyThrows(UnsupportedEncodingException.class)\n * public String utf8ToString(byte[] bytes) {\n *     return new String(bytes, \"UTF-8\");\n * }\n * </pre>\n * \n * Becomes:\n * <pre>\n * public String utf8ToString(byte[] bytes) {\n *     try {\n *         return new String(bytes, \"UTF-8\");\n *     } catch (UnsupportedEncodingException $uniqueName) {\n *         throw useMagicTrickeryToHideThisFromTheCompiler($uniqueName);\n *         // This trickery involves a bytecode transformer run automatically during the final stages of compilation;\n *         // there is no runtime dependency on lombok.\n *     }\n * </pre>\n */\n@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})\n@Retention(RetentionPolicy.SOURCE)\npublic @interface SneakyThrows {\n\t/** @return The exception type(s) you want to sneakily throw onward. */\n\tClass<? extends Throwable>[] value() default java.lang.Throwable.class;\n\t\n\t//The fully qualified name is used for java.lang.Throwable in the parameter only. This works around a bug in javac:\n\t//   presence of an annotation processor throws off the type resolver for some reason.\n}\n"
  },
  {
    "path": "src/core/lombok/Synchronized.java",
    "content": "/*\n * Copyright (C) 2009-2017 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Almost exactly like putting the 'synchronized' keyword on a method, except will synchronize on a private internal\n * Object, so that other code not under your control doesn't meddle with your thread management by locking on\n * your own instance.\n * <p>\n * For non-static methods, a field named {@code $lock} is used, and for static methods,\n * {@code $LOCK} is used. These will be generated if needed and if they aren't already present. The contents\n * of the fields will be serializable.\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/Synchronized\">the project lombok features page for &#64;Synchronized</a>.\n */\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.SOURCE)\npublic @interface Synchronized {\n\t/**\n\t * Optional: specify the name of a different field to lock on. It is a compile time error if this field\n\t * doesn't already exist (the fields are automatically generated only if you don't specify a specific name).\n\t * \n\t * @return Name of the field to lock on (blank = generate one).\n\t */\n\tString value() default \"\";\n}\n"
  },
  {
    "path": "src/core/lombok/ToString.java",
    "content": "/*\n * Copyright (C) 2009-2018 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Generates an implementation for the {@code toString} method inherited by all objects, consisting of printing the values of relevant fields.\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/ToString\">the project lombok features page for &#64;ToString</a>.\n */\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.SOURCE)\npublic @interface ToString {\n\t/**\n\t * Include the name of each field when printing it.\n\t * <strong>default: true</strong>\n\t * \n\t * @return Whether or not to include the names of fields in the string produced by the generated {@code toString()}.\n\t */\n\tboolean includeFieldNames() default true;\n\t\n\t/**\n\t * Any fields listed here will not be printed in the generated {@code toString} implementation.\n\t * Mutually exclusive with {@link #of()}.\n\t * <p>\n\t * Will soon be marked {@code @Deprecated}; use the {@code @ToString.Exclude} annotation instead.\n\t * \n\t * @return A list of fields to exclude.\n\t */\n\tString[] exclude() default {};\n\t\n\t/**\n\t * If present, explicitly lists the fields that are to be printed.\n\t * Normally, all non-static fields are printed.\n\t * <p>\n\t * Mutually exclusive with {@link #exclude()}.\n\t * <p>\n\t * Will soon be marked {@code @Deprecated}; use the {@code @ToString.Include} annotation together with {@code @ToString(onlyExplicitlyIncluded = true)}.\n\t * \n\t * @return A list of fields to use (<em>default</em>: all of them).\n\t */\n\tString[] of() default {};\n\t\n\t/**\n\t * Include the result of the superclass's implementation of {@code toString} in the output.\n\t * <strong>default: false</strong>\n\t * \n\t * @return Whether to call the superclass's {@code toString} implementation as part of the generated toString algorithm.\n\t */\n\tboolean callSuper() default false;\n\t\n\t/**\n\t * Normally, if getters are available, those are called. To suppress this and let the generated code use the fields directly, set this to {@code true}.\n\t * <strong>default: false</strong>\n\t * \n\t * @return If {@code true}, always use direct field access instead of calling the getter method.\n\t */\n\tboolean doNotUseGetters() default false;\n\t\n\t/**\n\t * Only include fields and methods explicitly marked with {@code @ToString.Include}.\n\t * Normally, all (non-static) fields are included by default.\n\t * \n\t * @return If {@code true}, don't include non-static fields automatically (default: {@code false}).\n\t */\n\tboolean onlyExplicitlyIncluded() default false;\n\t\n\t/**\n\t * If present, do not include this field in the generated {@code toString}.\n\t */\n\t@Target(ElementType.FIELD)\n\t@Retention(RetentionPolicy.SOURCE)\n\tpublic @interface Exclude {}\n\t\n\t/**\n\t * Configure the behaviour of how this member is rendered in the {@code toString}; if on a method, include the method's return value in the output.\n\t */\n\t@Target({ElementType.FIELD, ElementType.METHOD})\n\t@Retention(RetentionPolicy.SOURCE)\n\tpublic @interface Include {\n//\t\t/** If true and the return value is {@code null}, omit this member entirely from the {@code toString} output. */\n//\t\tboolean skipNull() default false; // -- We'll add it later, it requires a complete rework on the toString code we generate.\n\t\t\n\t\t/**\n\t\t * Higher ranks are printed first. Members of the same rank are printed in the order they appear in the source file.\n\t\t * \n\t\t * @return ordering within the generating {@code toString()}; higher numbers are printed first.\n\t\t */\n\t\tint rank() default 0;\n\t\t\n\t\t/**\n\t\t * Defaults to the field / method name of the annotated member.\n\t\t * If the name equals the name of a default-included field, this member takes its place.\n\t\t * \n\t\t * @return The name to show in the generated {@code toString()}. Also, if this annotation is on a method and the name matches an existing field, it replaces that field.\n\t\t */\n\t\tString name() default \"\";\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/Value.java",
    "content": "/*\n * Copyright (C) 2012-2017 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Generates a lot of code which fits with a class that is a representation of an immutable entity.\n * <p>\n * Equivalent to {@code @Getter @FieldDefaults(makeFinal=true, level=AccessLevel.PRIVATE) @AllArgsConstructor @ToString @EqualsAndHashCode}.\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/Value\">the project lombok features page for &#64;Value</a>.\n * \n * @see lombok.Getter\n * @see lombok.experimental.FieldDefaults\n * @see lombok.AllArgsConstructor\n * @see lombok.ToString\n * @see lombok.EqualsAndHashCode\n * @see lombok.Data\n */\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.SOURCE)\npublic @interface Value {\n\t/**\n\t * If you specify a static constructor name, then the generated constructor will be private, and\n\t * instead a static factory method is created that other classes can use to create instances.\n\t * We suggest the name: \"of\", like so:\n\t * \n\t * <pre>\n\t *     public @Value(staticConstructor = \"of\") class Point { final int x, y; }\n\t * </pre>\n\t * \n\t * Default: No static constructor, instead the normal constructor is public.\n\t * \n\t * @return Name of static 'constructor' method to generate (blank = generate a normal constructor).\n\t */\n\tString staticConstructor() default \"\";\n}\n"
  },
  {
    "path": "src/core/lombok/With.java",
    "content": "/*\n * Copyright (C) 2012-2019 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Put on any field to make lombok build a 'with' - a withX method which produces a clone of this object (except for 1 field which gets a new value).\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/With\">the project lombok features page for &#64;With</a>.\n * <p>\n * Example:\n * <pre>\n *     private &#64;With final int foo;\n * </pre>\n * \n * will generate:\n * \n * <pre>\n *     public SELF_TYPE withFoo(int foo) {\n *         return this.foo == foo ? this : new SELF_TYPE(otherField1, otherField2, foo);\n *     }\n * </pre>\n * <p>\n * This annotation can also be applied to a class, in which case it'll be as if all non-static fields that don't already have\n * a {@code With} annotation have the annotation.\n */\n@Target({ElementType.FIELD, ElementType.TYPE})\n@Retention(RetentionPolicy.SOURCE)\npublic @interface With {\n\t/**\n\t * If you want your with method to be non-public, you can specify an alternate access level here.\n\t * \n\t * @return The method will be generated with this access modifier.\n\t */\n\tAccessLevel value() default AccessLevel.PUBLIC;\n\t\n\t/**\n\t * Any annotations listed here are put on the generated method.\n\t * The syntax for this feature depends on JDK version (nothing we can do about that; it's to work around javac bugs).<br>\n\t * up to JDK7:<br>\n\t *  {@code @With(onMethod=@__({@AnnotationsGoHere}))}<br>\n\t * from JDK8:<br>\n\t *  {@code @With(onMethod_={@AnnotationsGohere})} // note the underscore after {@code onMethod}.\n\t * \n\t * @return List of annotations to apply to the generated method.\n\t */\n\tAnyAnnotation[] onMethod() default {};\n\t\n\t/**\n\t * Any annotations listed here are put on the generated method's parameter.\n\t * The syntax for this feature depends on JDK version (nothing we can do about that; it's to work around javac bugs).<br>\n\t * up to JDK7:<br>\n\t *  {@code @With(onParam=@__({@AnnotationsGoHere}))}<br>\n\t * from JDK8:<br>\n\t *  {@code @With(onParam_={@AnnotationsGohere})} // note the underscore after {@code onParam}.\n\t * \n\t * @return List of annotations to apply to the generated parameter in the method.\n\t */\n\tAnyAnnotation[] onParam() default {};\n\t\n\t/**\n\t  * Placeholder annotation to enable the placement of annotations on the generated code.\n\t  * @deprecated Don't use this annotation, ever - Read the documentation.\n\t  */\n\t@Deprecated\n\t@Retention(RetentionPolicy.SOURCE)\n\t@Target({})\n\t@interface AnyAnnotation {}\n}\n"
  },
  {
    "path": "src/core/lombok/bytecode/AsmUtil.java",
    "content": "/*\n * Copyright (C) 2010-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.bytecode;\n\nimport org.objectweb.asm.ClassReader;\nimport org.objectweb.asm.ClassVisitor;\nimport org.objectweb.asm.ClassWriter;\nimport org.objectweb.asm.MethodVisitor;\nimport org.objectweb.asm.Opcodes;\nimport org.objectweb.asm.commons.JSRInlinerAdapter;\n\nclass AsmUtil {\n\tprivate AsmUtil() {\n\t\tthrow new UnsupportedOperationException();\n\t}\n\t\n\tstatic byte[] fixJSRInlining(byte[] byteCode) {\n\t\tClassReader reader = new ClassReader(byteCode);\n\t\tClassWriter writer = new FixedClassWriter(reader, 0);\n\t\t\n\t\tClassVisitor visitor = new ClassVisitor(Opcodes.ASM9, writer) {\n\t\t\t@Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {\n\t\t\t\treturn new JSRInlinerAdapter(super.visitMethod(access, name, desc, signature, exceptions), access, name, desc, signature, exceptions);\n\t\t\t}\n\t\t};\n\t\t\n\t\treader.accept(visitor, 0);\n\t\treturn writer.toByteArray();\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/bytecode/ClassFileMetaData.java",
    "content": "/*\n * Copyright (C) 2010-2023 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.bytecode;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\n\n/**\n * Utility to read the constant pool, header, and inheritance information of any class file.\n * \n * THIS IS A COPY OF lombok.launch.ClassFileMetaData - it is used by the shadowclassloader which can't rely on anything from outside the lombok.launch package, but everything in the launch package has to be package private.\n * If there is a bug or an update is needed here - make sure to also update it in the lombok.bytecode package.\n */\npublic class ClassFileMetaData {\n\tprivate static final byte UTF8 = 1;\n\tprivate static final byte INTEGER = 3;\n\tprivate static final byte FLOAT = 4;\n\tprivate static final byte LONG = 5;\n\tprivate static final byte DOUBLE = 6;\n\tprivate static final byte CLASS = 7;\n\tprivate static final byte STRING = 8;\n\tprivate static final byte FIELD = 9;\n\tprivate static final byte METHOD = 10;\n\tprivate static final byte INTERFACE_METHOD = 11;\n\tprivate static final byte NAME_TYPE = 12;\n\t// New in java7: support for methodhandles and invokedynamic\n\tprivate static final byte METHOD_HANDLE = 15;\n\tprivate static final byte METHOD_TYPE = 16;\n\tprivate static final byte DYNAMIC = 17;\n\tprivate static final byte INVOKE_DYNAMIC = 18;\n\t// New in java9: support for modules\n\tprivate static final byte MODULE = 19;\n\tprivate static final byte PACKAGE = 20;\n\t\n\tprivate static final int NOT_FOUND = -1;\n\tprivate static final int START_OF_CONSTANT_POOL = 8; \n\t\n\tprivate final byte[] byteCode;\n\t\n\tprivate final int maxPoolSize;\n\tprivate final int[] offsets;\n\tprivate final byte[] types;\n\tprivate final String[] utf8s;\n\tprivate final int endOfPool;\n\t\n\tpublic ClassFileMetaData(byte[] byteCode) {\n\t\tthis.byteCode = byteCode;\n\t\t\n\t\tmaxPoolSize = readValue(START_OF_CONSTANT_POOL);\n\t\toffsets = new int[maxPoolSize];\n\t\ttypes = new byte[maxPoolSize];\n\t\tutf8s = new String[maxPoolSize];\n\t\tint position = 10;\n\t\tfor (int i = 1; i < maxPoolSize; i++) {\n\t\t\tbyte type = byteCode[position];\n\t\t\ttypes[i] = type;\n\t\t\tposition++;\n\t\t\toffsets[i] = position;\n\t\t\tswitch (type) {\n\t\t\tcase UTF8:\n\t\t\t\tint length = readValue(position);\n\t\t\t\tposition += 2;\n\t\t\t\tutf8s[i] = decodeString(position, length);\n\t\t\t\tposition += length;\n\t\t\t\tbreak;\n\t\t\tcase CLASS:\n\t\t\tcase STRING:\n\t\t\tcase METHOD_TYPE:\n\t\t\tcase MODULE:\n\t\t\tcase PACKAGE:\n\t\t\t\tposition += 2;\n\t\t\t\tbreak;\n\t\t\tcase METHOD_HANDLE:\n\t\t\t\tposition += 3;\n\t\t\t\tbreak;\n\t\t\tcase INTEGER:\n\t\t\tcase FLOAT:\n\t\t\tcase FIELD:\n\t\t\tcase METHOD:\n\t\t\tcase INTERFACE_METHOD:\n\t\t\tcase NAME_TYPE:\n\t\t\tcase INVOKE_DYNAMIC:\n\t\t\tcase DYNAMIC:\n\t\t\t\tposition += 4;\n\t\t\t\tbreak;\n\t\t\tcase LONG:\n\t\t\tcase DOUBLE:\n\t\t\t\tposition += 8;\n\t\t\t\ti++;\n\t\t\t\tbreak;\n\t\t\tcase 0:\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new AssertionError(\"Unknown constant pool type \" + type);\n\t\t\t}\n\t\t}\n\t\tendOfPool = position;\n\t}\n\t\n\tprivate String decodeString(int pos, int size) {\n\t\tint end = pos + size;\n\t\t\n\t\t// the resulting string might be smaller\n\t\tchar[] result = new char[size];\n\t\tint length = 0;\n\t\twhile (pos < end) {\n\t\t\tint first = (byteCode[pos++] & 0xFF);\n\t\t\tif (first < 0x80) {\n\t\t\t\tresult[length++] = (char)first;\n\t\t\t} else if ((first & 0xE0) == 0xC0) {\n\t\t\t\tint x = (first & 0x1F) << 6;\n\t\t\t\tint y = (byteCode[pos++] & 0x3F);\n\t\t\t\tresult[length++] = (char)(x | y);\n\t\t\t} else {\n\t\t\t\tint x = (first & 0x0F) << 12;\n\t\t\t\tint y = (byteCode[pos++] & 0x3F) << 6;\n\t\t\t\tint z = (byteCode[pos++] & 0x3F);\n\t\t\t\tresult[length++] = (char)(x | y | z);\n\t\t\t}\n\t\t}\n\t\treturn new String(result, 0, length);\n\t}\n\t\n\tpublic int[] getOffsets(byte type) {\n\t\tint[] out = new int[types.length];\n\t\tint ptr = 0;\n\t\t\n\t\tfor (int i = 0; i < types.length; i++) {\n\t\t\tif (types[i] != type) continue;\n\t\t\tout[ptr++] = offsets[i];\n\t\t}\n\t\t\n\t\treturn Arrays.copyOf(out, ptr);\n\t}\n\t\n\t/**\n\t * Checks if the constant pool contains the provided 'raw' string. These are used as source material for further JVM types, such as string constants, type references, etcetera.\n\t */\n\tpublic boolean containsUtf8(String value) {\n\t\treturn findUtf8(value) != NOT_FOUND;\n\t}\n\t\n\t/**\n\t * Checks if the constant pool contains a reference to the provided class.\n\t * \n\t * NB: Most uses of a type do <em>NOT</em> show up as a class in the constant pool.\n\t *    For example, the parameter types and return type of any method you invoke or declare, are stored as signatures and not as type references,\n\t *    but the type to which any method you invoke belongs, is. Read the JVM Specification for more information.\n\t * \n\t * @param className must be provided JVM-style, such as {@code java/lang/String}\n\t */\n\tpublic boolean usesClass(String className) {\n\t\treturn findClass(className) != NOT_FOUND;\n\t}\n\t\n\t/**\n\t * Checks if the constant pool contains a reference to a given field, either for writing or reading.\n\t * \n\t * @param className must be provided JVM-style, such as {@code java/lang/String}\n\t */\n\tpublic boolean usesField(String className, String fieldName) {\n\t\tint classIndex = findClass(className);\n\t\tif (classIndex == NOT_FOUND) return false;\n\t\tint fieldNameIndex = findUtf8(fieldName);\n\t\tif (fieldNameIndex == NOT_FOUND) return false;\n\t\t\n\t\tfor (int i = 1; i < maxPoolSize; i++) {\n\t\t\tif (types[i] == FIELD && readValue(offsets[i]) == classIndex) {\n\t\t\t\tint nameAndTypeIndex = readValue(offsets[i] + 2);\n\t\t\t\tif (readValue(offsets[nameAndTypeIndex]) == fieldNameIndex) return true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * Checks if the constant pool contains a reference to a given method, with any signature (return type and parameter types).\n\t * \n\t * @param className must be provided JVM-style, such as {@code java/lang/String}\n\t */\n\tpublic boolean usesMethod(String className, String methodName) {\n\t\tint classIndex = findClass(className);\n\t\tif (classIndex == NOT_FOUND) return false;\n\t\tint methodNameIndex = findUtf8(methodName);\n\t\tif (methodNameIndex == NOT_FOUND) return false;\n\t\t\n\t\tfor (int i = 1; i < maxPoolSize; i++) {\n\t\t\tif (isMethod(i) && readValue(offsets[i]) == classIndex) {\n\t\t\t\tint nameAndTypeIndex = readValue(offsets[i] + 2);\n\t\t\t\tif (readValue(offsets[nameAndTypeIndex]) == methodNameIndex) return true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * Checks if the constant pool contains a reference to a given method.\n\t * \n\t * @param className must be provided JVM-style, such as {@code java/lang/String}\n\t * @param descriptor must be provided JVM-style, such as {@code (IZ)Ljava/lang/String;}\n\t */\n\tpublic boolean usesMethod(String className, String methodName, String descriptor) {\n\t\tint classIndex = findClass(className);\n\t\tif (classIndex == NOT_FOUND) return false;\n\t\tint nameAndTypeIndex = findNameAndType(methodName, descriptor);\n\t\tif (nameAndTypeIndex == NOT_FOUND) return false;\n\t\t\n\t\tfor (int i = 1; i < maxPoolSize; i++) {\n\t\t\tif (isMethod(i) && \n\t\t\t\t\treadValue(offsets[i]) == classIndex && \n\t\t\t\t\treadValue(offsets[i] + 2) == nameAndTypeIndex) return true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * Checks if the constant pool contains the provided string constant, which implies the constant is used somewhere in the code.\n\t * \n\t * NB: String literals get concatenated by the compiler.\n\t * NB2: This method does NOT do any kind of normalization.\n\t */\n\tpublic boolean containsStringConstant(String value) {\n\t\tint index = findUtf8(value);\n\t\tif (index == NOT_FOUND) return false;\n\t\tfor (int i = 1; i < maxPoolSize; i++) {\n\t\t\tif (types[i] == STRING && readValue(offsets[i]) == index) return true; \n\t\t}\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * Checks if the constant pool contains the provided long constant, which implies the constant is used somewhere in the code.\n\t * \n\t * NB: compile-time constant expressions are evaluated at compile time.\n\t */\n\tpublic boolean containsLong(long value) {\n\t\tfor (int i = 1; i < maxPoolSize; i++) {\n\t\t\tif (types[i] == LONG && readLong(i) == value) return true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * Checks if the constant pool contains the provided double constant, which implies the constant is used somewhere in the code.\n\t * \n\t * NB: compile-time constant expressions are evaluated at compile time.\n\t */\n\tpublic boolean containsDouble(double value) {\n\t\tboolean isNan = Double.isNaN(value);\n\t\tfor (int i = 1; i < maxPoolSize; i++) {\n\t\t\tif (types[i] == DOUBLE) {\n\t\t\t\tdouble d = readDouble(i);\n\t\t\t\tif (d == value || (isNan && Double.isNaN(d))) return true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * Checks if the constant pool contains the provided int constant, which implies the constant is used somewhere in the code.\n\t * \n\t * NB: compile-time constant expressions are evaluated at compile time.\n\t */\n\tpublic boolean containsInteger(int value) {\n\t\tfor (int i = 1; i < maxPoolSize; i++) {\n\t\t\tif (types[i] == INTEGER && readInteger(i) == value) return true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * Checks if the constant pool contains the provided float constant, which implies the constant is used somewhere in the code.\n\t * \n\t * NB: compile-time constant expressions are evaluated at compile time.\n\t */\n\tpublic boolean containsFloat(float value) {\n\t\tboolean isNan = Float.isNaN(value);\n\t\tfor (int i = 1; i < maxPoolSize; i++) {\n\t\t\tif (types[i] == FLOAT) {\n\t\t\t\tfloat f = readFloat(i);\n\t\t\t\tif (f == value || (isNan && Float.isNaN(f))) return true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t\n\tprivate long readLong(int index) {\n\t\tint pos = offsets[index];\n\t\treturn ((long)read32(pos)) << 32 | (read32(pos + 4) & 0x00000000FFFFFFFFL);\n\t}\n\t\n\tprivate double readDouble(int index) {\n\t\treturn Double.longBitsToDouble(readLong(index));\n\t}\n\t\n\tprivate int readInteger(int index) {\n\t\treturn read32(offsets[index]);\n\t}\n\t\n\tprivate float readFloat(int index) {\n\t\treturn Float.intBitsToFloat(readInteger(index));\n\t}\n\t\n\tprivate int read32(int pos) {\n\t\treturn (byteCode[pos] & 0xFF) << 24 | (byteCode[pos + 1] & 0xFF) << 16 | (byteCode[pos + 2] & 0xFF) << 8 | (byteCode[pos + 3] & 0xFF);\n\t}\n\t\n\t/**\n\t * Returns the name of the class in JVM format, such as {@code java/lang/String}\n\t */\n\tpublic String getClassName() {\n\t\treturn getClassName(readValue(endOfPool + 2));\n\t}\n\t\n\t/**\n\t * Returns the name of the superclass in JVM format, such as {@code java/lang/Object}\n\t * \n\t * NB: If you try this on Object itself, you'll get {@code null}.<br />\n\t * NB2: For interfaces and annotation interfaces, you'll always get {@code java/lang/Object}\n\t */\n\tpublic String getSuperClassName() {\n\t\treturn getClassName(readValue(endOfPool + 4));\n\t}\n\t\n\t/**\n\t * Returns the name of all implemented interfaces.\n\t */\n\tpublic List<String> getInterfaces() {\n\t\tint size = readValue(endOfPool + 6);\n\t\tif (size == 0) return Collections.emptyList();\n\t\t\n\t\tList<String> result = new ArrayList<String>();\n\t\tfor (int i = 0; i < size; i++) {\n\t\t\tresult.add(getClassName(readValue(endOfPool + 8 + (i * 2))));\n\t\t}\n\t\treturn result;\n\t}\n\t\n\t/**\n\t * A {@code toString()} like utility to dump all contents of the constant pool into a string.\n\t * \n\t * NB: No guarantees are made about the exact layout of this string. It is for informational purposes only, don't try to parse it.<br />\n\t * NB2: After a double or long, there's a JVM spec-mandated gap, which is listed as {@code (cont.)} in the returned string.\n\t */\n\tpublic String poolContent() {\n\t\tStringBuilder result = new StringBuilder();\n\t\tfor (int i = 1; i < maxPoolSize; i++) {\n\t\t\tresult.append(String.format(\"#%02x: \", i));\n\t\t\tint pos = offsets[i];\n\t\t\tswitch(types[i]) {\n\t\t\tcase UTF8:\n\t\t\t\tresult.append(\"Utf8 \").append(utf8s[i]);\n\t\t\t\tbreak;\n\t\t\tcase CLASS:\n\t\t\t\tresult.append(\"Class \").append(getClassName(i));\n\t\t\t\tbreak;\n\t\t\tcase STRING:\n\t\t\t\tresult.append(\"String \\\"\").append(utf8s[readValue(pos)]).append(\"\\\"\");\n\t\t\t\tbreak;\n\t\t\tcase INTEGER:\n\t\t\t\tresult.append(\"int \").append(readInteger(i));\n\t\t\t\tbreak;\n\t\t\tcase FLOAT:\n\t\t\t\tresult.append(\"float \").append(readFloat(i));\n\t\t\t\tbreak;\n\t\t\tcase FIELD:\n\t\t\t\tappendAccess(result.append(\"Field \"), i);\n\t\t\t\tbreak;\n\t\t\tcase METHOD:\n\t\t\tcase INTERFACE_METHOD:\n\t\t\t\tappendAccess(result.append(\"Method \"), i);\n\t\t\t\tbreak;\n\t\t\tcase NAME_TYPE:\n\t\t\t\tappendNameAndType(result.append(\"Name&Type \"), i);\n\t\t\t\tbreak;\n\t\t\tcase LONG:\n\t\t\t\tresult.append(\"long \").append(readLong(i));\n\t\t\t\tbreak;\n\t\t\tcase DOUBLE:\n\t\t\t\tresult.append(\"double \").append(readDouble(i));\n\t\t\t\tbreak;\n\t\t\tcase METHOD_HANDLE:\n\t\t\t\tresult.append(\"MethodHandle...\");\n\t\t\t\tbreak;\n\t\t\tcase METHOD_TYPE:\n\t\t\t\tresult.append(\"MethodType...\");\n\t\t\t\tbreak;\n\t\t\tcase DYNAMIC:\n\t\t\t\tresult.append(\"Dynamic...\");\n\t\t\t\tbreak;\n\t\t\tcase INVOKE_DYNAMIC:\n\t\t\t\tresult.append(\"InvokeDynamic...\");\n\t\t\t\tbreak;\n\t\t\tcase 0:\n\t\t\t\tresult.append(\"(cont.)\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tresult.append(\"\\n\");\n\t\t}\n\t\treturn result.toString();\n\t}\n\t\n\tprivate void appendAccess(StringBuilder result, int index) {\n\t\tint pos = offsets[index];\n\t\tresult.append(getClassName(readValue(pos))).append(\".\");\n\t\tappendNameAndType(result, readValue(pos + 2));\n\t}\n\t\n\tprivate void appendNameAndType(StringBuilder result, int index) {\n\t\tint pos = offsets[index];\n\t\tresult.append(utf8s[readValue(pos)]).append(\":\").append(utf8s[readValue(pos + 2)]);\n\t}\n\t\n\tprivate String getClassName(int classIndex) {\n\t\tif (classIndex < 1) return null;\n\t\treturn utf8s[readValue(offsets[classIndex])];\n\t}\n\t\n\tprivate boolean isMethod(int i) {\n\t\tbyte type = types[i];\n\t\treturn type == METHOD || type == INTERFACE_METHOD;\n\t}\n\t\n\tprivate int findNameAndType(String name, String descriptor) {\n\t\tint nameIndex = findUtf8(name);\n\t\tif (nameIndex == NOT_FOUND) return NOT_FOUND;\n\t\tint descriptorIndex = findUtf8(descriptor);\n\t\tif (descriptorIndex == NOT_FOUND) return NOT_FOUND;\n\t\tfor (int i = 1; i < maxPoolSize; i++) {\n\t\t\tif (types[i] == NAME_TYPE && \n\t\t\t\t\treadValue(offsets[i]) == nameIndex && \n\t\t\t\t\treadValue(offsets[i] + 2) == descriptorIndex) return i;\n\t\t}\n\t\treturn NOT_FOUND;\n\t}\n\t\n\tprivate int findUtf8(String value) {\n\t\tfor (int i = 1; i < maxPoolSize; i++) {\n\t\t\tif (value.equals(utf8s[i])) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn NOT_FOUND;\n\t}\n\t\n\tprivate int findClass(String className) {\n\t\tint index = findUtf8(className);\n\t\tif (index == -1) return NOT_FOUND;\n\t\tfor (int i = 1; i < maxPoolSize; i++) {\n\t\t\tif (types[i] == CLASS && readValue(offsets[i]) == index) return i;\n\t\t}\n\t\treturn NOT_FOUND;\n\t}\n\t\n\t/**\n\t * Reads a 16-bit value at {@code position}\n\t */\n\tprivate int readValue(int position) {\n\t\treturn ((byteCode[position] & 0xFF) << 8) | (byteCode[position + 1] & 0xFF);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/bytecode/FixedClassWriter.java",
    "content": "/*\n * Copyright (C) 2010-2012 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.bytecode;\n\nimport org.objectweb.asm.ClassReader;\nimport org.objectweb.asm.ClassWriter;\n\nclass FixedClassWriter extends ClassWriter {\n\tFixedClassWriter(ClassReader classReader, int flags) {\n\t\tsuper(classReader, flags);\n\t}\n\n\tFixedClassWriter(int flags) {\n\t\tsuper(flags);\n\t}\n\t\n\t@Override protected String getCommonSuperClass(String type1, String type2) {\n\t\t//By default, ASM will attempt to live-load the class types, which will fail if meddling with classes in an\n\t\t//environment with custom classloaders, such as Equinox. It's just an optimization; returning Object is always legal.\n\t\ttry {\n\t\t\treturn super.getCommonSuperClass(type1, type2);\n\t\t} catch (OutOfMemoryError e) {\n\t\t\tthrow e;\n\t\t} catch (Throwable t) {\n\t\t\treturn \"java/lang/Object\";\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/bytecode/PoolConstantsApp.java",
    "content": "/*\n * Copyright (C) 2012-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.bytecode;\n\nimport java.io.File;\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport lombok.core.LombokApp;\nimport lombok.spi.Provides;\n\nimport com.zwitserloot.cmdreader.CmdReader;\nimport com.zwitserloot.cmdreader.Description;\nimport com.zwitserloot.cmdreader.InvalidCommandLineException;\nimport com.zwitserloot.cmdreader.Mandatory;\nimport com.zwitserloot.cmdreader.Sequential;\nimport com.zwitserloot.cmdreader.Shorthand;\n\n@Provides\npublic class PoolConstantsApp extends LombokApp {\n\t@Override public String getAppName() {\n\t\treturn \"Xprintpool\";\n\t}\n\t\n\t@Override public String getAppDescription() {\n\t\treturn \"Prints the content of the constant pool to standard out.\";\n\t}\n\t\n\t@Override public boolean isDebugTool() {\n\t\treturn true;\n\t}\n\t\n\tpublic static class CmdArgs {\n\t\t@Sequential\n\t\t@Mandatory\n\t\t@Description(\"paths to class files to be printed. If a directory is named, all files (recursively) in that directory will be printed.\")\n\t\tprivate List<String> classFiles = new ArrayList<String>();\n\t\t\n\t\t@Shorthand({\"h\", \"?\"})\n\t\t@Description(\"Shows this help text\")\n\t\tboolean help = false;\n\t}\n\t\n\t@Override public int runApp(List<String> raw) throws Exception {\n\t\tCmdReader<CmdArgs> reader = CmdReader.of(CmdArgs.class);\n\t\tCmdArgs args;\n\t\ttry {\n\t\t\targs = reader.make(raw.toArray(new String[0]));\n\t\t\tif (args.help) {\n\t\t\t\tSystem.out.println(reader.generateCommandLineHelp(\"java -jar lombok.jar -printpool\"));\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t} catch (InvalidCommandLineException e) {\n\t\t\tSystem.err.println(e.getMessage());\n\t\t\tSystem.err.println(reader.generateCommandLineHelp(\"java -jar lombok.jar -printpool\"));\n\t\t\treturn 1;\n\t\t}\n\t\t\n\t\tList<File> filesToProcess = PostCompilerApp.cmdArgsToFiles(args.classFiles);\n\t\tint filesVisited = 0;\n\t\tboolean moreThanOne = filesToProcess.size() > 1;\n\t\tfor (File file : filesToProcess) {\n\t\t\tif (!file.exists() || !file.isFile()) {\n\t\t\t\tSystem.out.printf(\"Cannot find file '%s'\\n\", file.getAbsolutePath());\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfilesVisited++;\n\t\t\tif (moreThanOne) System.out.printf(\"Processing '%s'\\n\", file.getAbsolutePath());\n\t\t\tSystem.out.println(new ClassFileMetaData(PostCompilerApp.readFile(file)).poolContent());\n\t\t}\n\t\t\n\t\tif (moreThanOne) System.out.printf(\"Total files visited: %d\\n\", filesVisited);\n\t\t\n\t\treturn filesVisited == 0 ? 1 : 0;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/bytecode/PostCompilerApp.java",
    "content": "/*\n * Copyright (C) 2010-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.bytecode;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\n\nimport lombok.core.DiagnosticsReceiver;\nimport lombok.core.LombokApp;\nimport lombok.core.PostCompiler;\nimport lombok.spi.Provides;\n\nimport com.zwitserloot.cmdreader.CmdReader;\nimport com.zwitserloot.cmdreader.Description;\nimport com.zwitserloot.cmdreader.InvalidCommandLineException;\nimport com.zwitserloot.cmdreader.Mandatory;\nimport com.zwitserloot.cmdreader.Sequential;\nimport com.zwitserloot.cmdreader.Shorthand;\n\n@Provides\npublic class PostCompilerApp extends LombokApp {\n\t@Override public List<String> getAppAliases() {\n\t\treturn Arrays.asList(\"post\", \"postcompile\");\n\t}\n\t\n\t@Override public String getAppDescription() {\n\t\treturn \"Runs registered post compiler handlers to against existing class files, modifying them in the process.\";\n\t}\n\t\n\t@Override public String getAppName() {\n\t\treturn \"post-compile\";\n\t}\n\t\n\tpublic static class CmdArgs {\n\t\t@Sequential\n\t\t@Mandatory\n\t\t@Description(\"paths to class files to be converted. If a directory is named, all files (recursively) in that directory will be converted.\")\n\t\tprivate List<String> classFiles = new ArrayList<String>();\n\t\t\n\t\t@Shorthand(\"v\")\n\t\t@Description(\"Prints lots of status information as the post compiler runs\")\n\t\tboolean verbose = false;\n\t\t\n\t\t@Shorthand({\"h\", \"?\"})\n\t\t@Description(\"Shows this help text\")\n\t\tboolean help = false;\n\t}\n\t\n\t@Override public int runApp(List<String> raw) throws Exception {\n\t\tCmdReader<CmdArgs> reader = CmdReader.of(CmdArgs.class);\n\t\tCmdArgs args;\n\t\ttry {\n\t\t\targs = reader.make(raw.toArray(new String[0]));\n\t\t\tif (args.help) {\n\t\t\t\tSystem.out.println(reader.generateCommandLineHelp(\"java -jar lombok.jar post-compile\"));\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t} catch (InvalidCommandLineException e) {\n\t\t\tSystem.err.println(e.getMessage());\n\t\t\tSystem.err.println(reader.generateCommandLineHelp(\"java -jar lombok.jar post-compile\"));\n\t\t\treturn 1;\n\t\t}\n\t\t\n\t\tint filesVisited = 0, filesTouched = 0;\n\t\tfor (File file : cmdArgsToFiles(args.classFiles)) {\n\t\t\tif (!file.exists() || !file.isFile()) {\n\t\t\t\tSystem.out.printf(\"Cannot find file '%s'\\n\", file);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfilesVisited++;\n\t\t\tif (args.verbose) System.out.println(\"Processing \" + file.getAbsolutePath());\n\t\t\tbyte[] original = readFile(file);\n\t\t\tbyte[] clone = original.clone();\n\t\t\tbyte[] transformed = PostCompiler.applyTransformations(clone, file.toString(), DiagnosticsReceiver.CONSOLE);\n\t\t\tif (clone != transformed && !Arrays.equals(original, transformed)) {\n\t\t\t\tfilesTouched++;\n\t\t\t\tif (args.verbose) System.out.println(\"Rewriting \" + file.getAbsolutePath());\n\t\t\t\twriteFile(file, transformed);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (args.verbose) {\n\t\t\tSystem.out.printf(\"Total files visited: %d total files changed: %d\\n\", filesVisited, filesTouched);\n\t\t}\n\t\t\n\t\treturn filesVisited == 0 ? 1 : 0;\n\t}\n\t\n\tstatic List<File> cmdArgsToFiles(List<String> fileNames) {\n\t\tList<File> filesToProcess = new ArrayList<File>();\n\t\tfor (String f : fileNames) addFiles(filesToProcess, f);\n\t\treturn filesToProcess;\n\t}\n\t\n\tstatic void addFiles(List<File> filesToProcess, String f) {\n\t\tFile file = new File(f);\n\t\tif (file.isDirectory()) {\n\t\t\taddRecursively(filesToProcess, file);\n\t\t} else {\n\t\t\tfilesToProcess.add(file);\n\t\t}\n\t}\n\t\n\tstatic void addRecursively(List<File> filesToProcess, File file) {\n\t\tfor (File f : file.listFiles()) {\n\t\t\tif (f.isDirectory()) addRecursively(filesToProcess, f);\n\t\t\telse if (f.getName().endsWith(\".class\")) filesToProcess.add(f);\n\t\t}\n\t}\n\t\n\tstatic byte[] readFile(File file) throws IOException {\n\t\tbyte[] buffer = new byte[1024];\n\t\tByteArrayOutputStream bytes = new ByteArrayOutputStream();\n\t\tFileInputStream fileInputStream = new FileInputStream(file);\n\t\ttry {\n\t\t\twhile (true) {\n\t\t\t\tint read = fileInputStream.read(buffer);\n\t\t\t\tif (read == -1) break;\n\t\t\t\tbytes.write(buffer, 0, read);\n\t\t\t}\n\t\t} finally {\n\t\t\tfileInputStream.close();\n\t\t}\n\t\treturn bytes.toByteArray();\n\t}\n\t\n\tstatic void writeFile(File file, byte[] transformed) throws IOException {\n\t\tFileOutputStream out = new FileOutputStream(file);\n\t\ttry {\n\t\t\tout.write(transformed);\n\t\t} finally {\n\t\t\tout.close();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/bytecode/PreventNullAnalysisRemover.java",
    "content": "/*\n * Copyright (C) 2010-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.bytecode;\n\nimport static lombok.bytecode.AsmUtil.*;\n\nimport java.util.concurrent.atomic.AtomicBoolean;\n\nimport lombok.core.DiagnosticsReceiver;\nimport lombok.core.PostCompilerTransformation;\nimport lombok.spi.Provides;\n\nimport org.objectweb.asm.ClassReader;\nimport org.objectweb.asm.ClassVisitor;\nimport org.objectweb.asm.ClassWriter;\nimport org.objectweb.asm.MethodVisitor;\nimport org.objectweb.asm.Opcodes;\n\n@Provides\npublic class PreventNullAnalysisRemover implements PostCompilerTransformation {\n\t\n\t@Override public byte[] applyTransformations(byte[] original, String fileName, DiagnosticsReceiver diagnostics) {\n\t\tif (!new ClassFileMetaData(original).usesMethod(\"lombok/Lombok\", \"preventNullAnalysis\")) return null;\n\t\t\n\t\tbyte[] fixedByteCode = fixJSRInlining(original);\n\t\t\n\t\tClassReader reader = new ClassReader(fixedByteCode);\n\t\tClassWriter writer = new FixedClassWriter(0);\n\t\t\n\t\tfinal AtomicBoolean changesMade = new AtomicBoolean();\n\t\t\n\t\tclass PreventNullAnalysisVisitor extends MethodVisitor {\n\t\t\tPreventNullAnalysisVisitor(MethodVisitor mv) {\n\t\t\t\tsuper(Opcodes.ASM9, mv);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {\n\t\t\t\tboolean hit = true;\n\t\t\t\tif (hit && opcode != Opcodes.INVOKESTATIC) hit = false;\n\t\t\t\tif (hit && !\"preventNullAnalysis\".equals(name)) hit = false;\n\t\t\t\tif (hit && !\"lombok/Lombok\".equals(owner)) hit = false;\n\t\t\t\tif (hit && !\"(Ljava/lang/Object;)Ljava/lang/Object;\".equals(desc)) hit = false;\n\t\t\t\tif (hit) {\n\t\t\t\t\tchangesMade.set(true);\n\t\t\t\t\tif (System.getProperty(\"lombok.debugAsmOnly\", null) != null) super.visitMethodInsn(opcode, owner, name, desc, itf); // DEBUG for issue 470!\n\t\t\t\t} else {\n\t\t\t\t\tsuper.visitMethodInsn(opcode, owner, name, desc, itf);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treader.accept(new ClassVisitor(Opcodes.ASM9, writer) {\n\t\t\t@Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {\n\t\t\t\treturn new PreventNullAnalysisVisitor(super.visitMethod(access, name, desc, signature, exceptions));\n\t\t\t}\n\t\t}, 0);\n\t\treturn changesMade.get() ? writer.toByteArray() : null;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/bytecode/SneakyThrowsRemover.java",
    "content": "/*\n * Copyright (C) 2010-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.bytecode;\n\nimport static lombok.bytecode.AsmUtil.*;\n\nimport java.util.concurrent.atomic.AtomicBoolean;\n\nimport lombok.core.DiagnosticsReceiver;\nimport lombok.core.PostCompilerTransformation;\nimport lombok.spi.Provides;\n\nimport org.objectweb.asm.ClassReader;\nimport org.objectweb.asm.ClassVisitor;\nimport org.objectweb.asm.ClassWriter;\nimport org.objectweb.asm.Handle;\nimport org.objectweb.asm.Label;\nimport org.objectweb.asm.MethodVisitor;\nimport org.objectweb.asm.Opcodes;\n\n@Provides\npublic class SneakyThrowsRemover implements PostCompilerTransformation {\n\t\n\t@Override public byte[] applyTransformations(byte[] original, String fileName, final DiagnosticsReceiver diagnostics) {\n\t\tif (!new ClassFileMetaData(original).usesMethod(\"lombok/Lombok\", \"sneakyThrow\")) return null;\n\t\t\n\t\tbyte[] fixedByteCode = fixJSRInlining(original);\n\t\t\n\t\tClassReader reader = new ClassReader(fixedByteCode);\n\t\tClassWriter writer = new ClassWriter(0);\n\n\t\tfinal AtomicBoolean changesMade = new AtomicBoolean();\n\t\t\n\t\tclass SneakyThrowsRemoverVisitor extends MethodVisitor {\n\t\t\tSneakyThrowsRemoverVisitor(MethodVisitor mv) {\n\t\t\t\tsuper(Opcodes.ASM9, mv);\n\t\t\t}\n\t\t\t\n\t\t\tprivate boolean methodInsnQueued = false;\n\t\t\t\n\t\t\t@Override public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {\n\t\t\t\tif (\n\t\t\t\t\t\topcode == Opcodes.INVOKESTATIC &&\n\t\t\t\t\t\t\"sneakyThrow\".equals(name) &&\n\t\t\t\t\t\t\"lombok/Lombok\".equals(owner) &&\n\t\t\t\t\t\t\"(Ljava/lang/Throwable;)Ljava/lang/RuntimeException;\".equals(desc)) {\n\t\t\t\t\t\n\t\t\t\t\tif (System.getProperty(\"lombok.debugAsmOnly\", null) != null) {\n\t\t\t\t\t\tsuper.visitMethodInsn(opcode, owner, name, desc, itf); // DEBUG for issue 470!\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmethodInsnQueued = true;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tsuper.visitMethodInsn(opcode, owner, name, desc, itf);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tprivate void handleQueue() {\n\t\t\t\tif (!methodInsnQueued) return;\n\t\t\t\tsuper.visitMethodInsn(Opcodes.INVOKESTATIC, \"lombok/Lombok\", \"sneakyThrow\", \"(Ljava/lang/Throwable;)Ljava/lang/RuntimeException;\", false);\n\t\t\t\tmethodInsnQueued = false;\n\t\t\t\tdiagnostics.addWarning(\"Proper usage is: throw lombok.Lombok.sneakyThrow(someException);. You did not 'throw' it. Because of this, the call to sneakyThrow \" +\n\t\t\t\t\t\t\"remains in your classfile and you will need lombok.jar on the classpath at runtime.\");\n\t\t\t}\n\t\t\t\n\t\t\t@Override public void visitInsn(int arg0) {\n\t\t\t\tif (methodInsnQueued && arg0 == Opcodes.ATHROW) {\n\t\t\t\t\tchangesMade.set(true);\n\t\t\t\t\t// As expected, the required ATHROW. We can now safely 'eat' the previous call.\n\t\t\t\t\tmethodInsnQueued = false;\n\t\t\t\t}\n\t\t\t\thandleQueue();\n\t\t\t\tsuper.visitInsn(arg0);\n\t\t\t}\n\t\t\t@Override public void visitFrame(int arg0, int arg1, Object[] arg2, int arg3, Object[] arg4) {\n\t\t\t\thandleQueue();\n\t\t\t\tsuper.visitFrame(arg0, arg1, arg2, arg3, arg4);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public void visitIincInsn(int arg0, int arg1) {\n\t\t\t\thandleQueue();\n\t\t\t\tsuper.visitIincInsn(arg0, arg1);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public void visitFieldInsn(int arg0, String arg1, String arg2, String arg3) {\n\t\t\t\thandleQueue();\n\t\t\t\tsuper.visitFieldInsn(arg0, arg1, arg2, arg3);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public void visitIntInsn(int arg0, int arg1) {\n\t\t\t\thandleQueue();\n\t\t\t\tsuper.visitIntInsn(arg0, arg1);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public void visitEnd() {\n\t\t\t\thandleQueue();\n\t\t\t\tsuper.visitEnd();\n\t\t\t}\n\t\t\t\n\t\t\t@Override public void visitInvokeDynamicInsn(String arg0, String arg1, Handle arg2, Object... arg3) {\n\t\t\t\thandleQueue();\n\t\t\t\tsuper.visitInvokeDynamicInsn(arg0, arg1, arg2, arg3);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public void visitLabel(Label arg0) {\n\t\t\t\thandleQueue();\n\t\t\t\tsuper.visitLabel(arg0);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public void visitJumpInsn(int arg0, Label arg1) {\n\t\t\t\thandleQueue();\n\t\t\t\tsuper.visitJumpInsn(arg0, arg1);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public void visitLdcInsn(Object arg0) {\n\t\t\t\thandleQueue();\n\t\t\t\tsuper.visitLdcInsn(arg0);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public void visitLocalVariable(String arg0, String arg1, String arg2, Label arg3, Label arg4, int arg5) {\n\t\t\t\thandleQueue();\n\t\t\t\tsuper.visitLocalVariable(arg0, arg1, arg2, arg3, arg4, arg5);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public void visitMaxs(int arg0, int arg1) {\n\t\t\t\thandleQueue();\n\t\t\t\tsuper.visitMaxs(arg0, arg1);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public void visitLookupSwitchInsn(Label arg0, int[] arg1, Label[] arg2) {\n\t\t\t\thandleQueue();\n\t\t\t\tsuper.visitLookupSwitchInsn(arg0, arg1, arg2);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public void visitMultiANewArrayInsn(String arg0, int arg1) {\n\t\t\t\thandleQueue();\n\t\t\t\tsuper.visitMultiANewArrayInsn(arg0, arg1);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public void visitVarInsn(int arg0, int arg1) {\n\t\t\t\thandleQueue();\n\t\t\t\tsuper.visitVarInsn(arg0, arg1);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public void visitTryCatchBlock(Label arg0, Label arg1, Label arg2, String arg3) {\n\t\t\t\thandleQueue();\n\t\t\t\tsuper.visitTryCatchBlock(arg0, arg1, arg2, arg3);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public void visitTableSwitchInsn(int arg0, int arg1, Label arg2, Label... arg3) {\n\t\t\t\thandleQueue();\n\t\t\t\tsuper.visitTableSwitchInsn(arg0, arg1, arg2, arg3);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public void visitTypeInsn(int arg0, String arg1) {\n\t\t\t\thandleQueue();\n\t\t\t\tsuper.visitTypeInsn(arg0, arg1);\n\t\t\t}\n\t\t}\n\t\t\n\t\treader.accept(new ClassVisitor(Opcodes.ASM9, writer) {\n\t\t\t@Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {\n\t\t\t\treturn new SneakyThrowsRemoverVisitor(super.visitMethod(access, name, desc, signature, exceptions));\n\t\t\t}\n\t\t}, 0);\n\t\treturn changesMade.get() ? writer.toByteArray() : null;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/bytecode/package-info.java",
    "content": "/*\n * Copyright (C) 2009-2014 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/**\n * This package contains utilities and handlers for the 'post-process class files' aspect of\n * lombok. Lombok's class file post processing capabilities are based on Objectweb's ASM library.\n * \n * <strong>NB: This package is not public API in the sense that contents of this package,\n *    even public classes / methods / etc, may change in point releases.</strong>\n */\npackage lombok.bytecode;\n"
  },
  {
    "path": "src/core/lombok/core/AST.java",
    "content": "/*\n * Copyright (C) 2009-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\nimport static lombok.Lombok.sneakyThrow;\n\nimport java.lang.reflect.Array;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.Modifier;\nimport java.lang.reflect.ParameterizedType;\nimport java.lang.reflect.Type;\nimport java.net.URI;\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.IdentityHashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.ConcurrentMap;\n\nimport lombok.core.configuration.ConfigurationKey;\nimport lombok.core.debug.HistogramTracker;\nimport lombok.permit.Permit;\n\n/**\n * Lombok wraps the AST produced by a target platform into its own AST system, mostly because both Eclipse and javac\n * do not allow upward traversal (from a method to its owning type, for example).\n * \n * @param A Self-type.\n * @param L type of all LombokNodes.\n * @param N The common type of all AST nodes in the internal representation of the target platform.\n *          For example, JCTree for javac, and ASTNode for Eclipse.\n */\npublic abstract class AST<A extends AST<A, L, N>, L extends LombokNode<A, L, N>, N> {\n\t/** The kind of node represented by a given AST.Node object. */\n\tpublic enum Kind {\n\t\tCOMPILATION_UNIT, TYPE, FIELD, INITIALIZER, METHOD, ANNOTATION, ARGUMENT, LOCAL, STATEMENT, TYPE_USE;\n\t}\n\t\n\tprivate L top;\n\tprivate final String fileName;\n\tprivate final String packageDeclaration;\n\tprivate final ImportList imports;\n\tprivate TypeResolver importsAsResolver;\n\tMap<N, N> identityDetector = new IdentityHashMap<N, N>();\n\tprivate Map<N, L> nodeMap = new IdentityHashMap<N, L>();\n\tprivate boolean changed = false;\n\t\n\t// The supertypes which are considered AST Node children. Usually, the Statement, and the Expression,\n\t// though some platforms (such as Eclipse) group these under one common supertype.\n\tprivate final Collection<Class<? extends N>> statementTypes;\n\t\n\tprivate static final HistogramTracker configTracker = System.getProperty(\"lombok.timeConfig\") == null ? null : new HistogramTracker(\"lombok.config\");\n\t\n\tprotected AST(String fileName, String packageDeclaration, ImportList imports, Collection<Class<? extends N>> statementTypes) {\n\t\tthis.fileName = fileName == null ? \"(unknown).java\" : fileName;\n\t\tthis.packageDeclaration = packageDeclaration;\n\t\tthis.imports = imports;\n\t\tthis.statementTypes = statementTypes;\n\t}\n\t\n\t/**\n\t * Attempts to find the absolute path (in URI form) to the source file represented by this AST.\n\t * \n\t * May return {@code null} if this cannot be done. We don't yet know under which conditions this will happen.\n\t */\n\tpublic abstract URI getAbsoluteFileLocation();\n\t\n\tpublic void setChanged() {\n\t\tthis.changed = true;\n\t}\n\t\n\tprotected void clearChanged() {\n\t\tthis.changed = false;\n\t}\n\t\n\tpublic boolean isChanged() {\n\t\treturn changed;\n\t}\n\t\n\t/** Set the node object that wraps the internal Compilation Unit node. */\n\tprotected void setTop(L top) {\n\t\tthis.top = top;\n\t}\n\t\n\t/**\n\t * Return the content of the package declaration on this AST's top (Compilation Unit) node.\n\t * \n\t * Example: \"java.util\".\n\t */\n\tpublic final String getPackageDeclaration() {\n\t\treturn packageDeclaration;\n\t}\n\t\n\t/**\n\t * Return the contents of each non-static import statement on this AST's top (Compilation Unit) node.\n\t */\n\tpublic final ImportList getImportList() {\n\t\treturn imports;\n\t}\n\t\n\t/**\n\t * Return the contents of each non-static import statement on this AST's top (Compilation Unit) node, packed into a (cached) TypeResolver.\n\t */\n\tpublic final TypeResolver getImportListAsTypeResolver() {\n\t\tif (importsAsResolver != null) return importsAsResolver;\n\t\treturn importsAsResolver = new TypeResolver(getImportList());\n\t}\n\t\n\t/**\n\t * Puts the given node in the map so that javac/Eclipse's own internal AST object can be translated to\n\t * an AST.Node object. Also registers the object as visited to avoid endless loops.\n\t */\n\tprotected L putInMap(L node) {\n\t\tnodeMap.put(node.get(), node);\n\t\tidentityDetector.put(node.get(), node.get());\n\t\treturn node;\n\t}\n\t\n\t/** Returns the node map, that can map javac/Eclipse internal AST objects to AST.Node objects. */\n\tprotected Map<N, L> getNodeMap() {\n\t\treturn nodeMap;\n\t}\n\t\n\t/** Clears the registry that avoids endless loops, and empties the node map. The existing node map\n\t * object is left untouched, and instead a new map is created. */\n\tprotected void clearState() {\n\t\tidentityDetector = new IdentityHashMap<N, N>();\n\t\tnodeMap = new IdentityHashMap<N, L>();\n\t}\n\t\n\t/**\n\t * Marks the stated node as handled (to avoid endless loops if 2 nodes refer to each other, or a node\n\t * refers to itself). Will then return true if it was already set as handled before this call - in which\n\t * case you should do nothing lest the AST build process loops endlessly.\n\t */\n\tprotected boolean setAndGetAsHandled(N node) {\n\t\treturn identityDetector.put(node, node) != null;\n\t}\n\t\n\tpublic String getFileName() {\n\t\treturn fileName;\n\t}\n\t\n\t/** The AST.Node object representing the Compilation Unit. */\n\tpublic L top() {\n\t\treturn top;\n\t}\n\t\n\t/** Maps a javac/Eclipse internal AST Node to the appropriate AST.Node object. */\n\tpublic L get(N node) {\n\t\treturn nodeMap.get(node);\n\t}\n\t\n\t/**\n\t * Returns the JLS spec version that the compiler uses to parse and compile this AST.\n\t * For example, if -source 1.6 is on the command line, this will return {@code 6}.\n\t */\n\tpublic int getSourceVersion() {\n\t\treturn 6;\n\t}\n\t\n\t/**\n\t * Returns the latest version of the java language specification supported by the host compiler.\n\t * For example, if compiling with javac v1.7, this returns {@code 7}.\n\t * \n\t * NB: Even if -source (lower than maximum) is specified, this method still returns the maximum supported number.\n\t */\n\tpublic int getLatestJavaSpecSupported() {\n\t\treturn 6;\n\t}\n\t\n\t@SuppressWarnings({\"unchecked\", \"rawtypes\"})\n\tL replaceNewWithExistingOld(Map<N, L> oldNodes, L newNode) {\n\t\tL oldNode = oldNodes.get(newNode.get());\n\t\tL targetNode = oldNode == null ? newNode : oldNode;\n\t\t\n\t\tList children = new ArrayList();\n\t\tfor (L child : newNode.children) {\n\t\t\tL oldChild = replaceNewWithExistingOld(oldNodes, child);\n\t\t\tchildren.add(oldChild);\n\t\t\toldChild.parent = targetNode;\n\t\t}\n\t\t\n\t\ttargetNode.children = LombokImmutableList.copyOf(children);\n\t\t\n\t\treturn targetNode;\n\t}\n\t\n\t/** Build an AST.Node object for the stated internal (javac/Eclipse) AST Node object. */\n\tprotected abstract L buildTree(N item, Kind kind);\n\t\n\t/**\n\t * Represents a field that contains AST children.\n\t */\n\tprotected static class FieldAccess {\n\t\t/** The actual field. */\n\t\tpublic final Field field;\n\t\t/** Dimensions of the field. Works for arrays, or for java.util.collections. */\n\t\tpublic final int dim;\n\t\t\n\t\tFieldAccess(Field field, int dim) {\n\t\t\tthis.field = field;\n\t\t\tthis.dim = dim;\n\t\t}\n\t}\n\t\n\tprivate static final ConcurrentMap<Class<?>, FieldAccess[]> fieldsOfASTClasses = new ConcurrentHashMap<Class<?>, FieldAccess[]>();\n\t\n\t/** Returns FieldAccess objects for the stated class. Each field that contains objects of the kind returned by\n\t * {@link #getStatementTypes()}, either directly or inside of an array or java.util.collection (or array-of-arrays,\n\t * or collection-of-collections, et cetera), is returned.\n\t */\n\tprotected FieldAccess[] fieldsOf(Class<?> c) {\n\t\tFieldAccess[] fields = fieldsOfASTClasses.get(c);\n\t\tif (fields != null) return fields;\n\t\t\n\t\tList<FieldAccess> fieldList = new ArrayList<FieldAccess>();\n\t\tgetFields(c, fieldList);\n\t\tfieldsOfASTClasses.putIfAbsent(c, fieldList.toArray(new FieldAccess[0]));\n\t\treturn fieldsOfASTClasses.get(c);\n\t}\n\t\n\tprivate void getFields(Class<?> c, Collection<FieldAccess> fields) {\n\t\tif (c == Object.class || c == null) return;\n\t\tfor (Field f : c.getDeclaredFields()) {\n\t\t\tif (Modifier.isStatic(f.getModifiers())) continue;\n\t\t\tClass<?> t = f.getType();\n\t\t\tint dim = 0;\n\t\t\t\n\t\t\tif (t.isArray()) {\n\t\t\t\twhile (t.isArray()) {\n\t\t\t\t\tdim++;\n\t\t\t\t\tt = t.getComponentType();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile (Collection.class.isAssignableFrom(t)) {\n\t\t\t\t\tdim++;\n\t\t\t\t\tt = getComponentType(f.getGenericType());\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (shouldDrill(c, t, f.getName())) {\n\t\t\t\tPermit.setAccessible(f);\n\t\t\t\tfields.add(new FieldAccess(f, dim));\n\t\t\t}\n\t\t}\n\t\t\n\t\tgetFields(c.getSuperclass(), fields);\n\t}\n\t\n\tprivate Class<?> getComponentType(Type type) {\n\t\tif (type instanceof ParameterizedType) {\n\t\t\tType component = ((ParameterizedType) type).getActualTypeArguments()[0];\n\t\t\treturn component instanceof Class<?> ? (Class<?>) component : Object.class;\n\t\t}\n\t\treturn Object.class;\n\t}\n\t\n\tprivate boolean shouldDrill(Class<?> parentType, Class<?> childType, String fieldName) {\n\t\tfor (Class<?> statementType : statementTypes) {\n\t\t\tif (statementType.isAssignableFrom(childType)) return true;\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * buildTree implementation that uses reflection to find all child nodes by way of inspecting\n\t * the fields. */\n\tprotected Collection<L> buildWithField(Class<L> nodeType, N statement, FieldAccess fa) {\n\t\tList<L> list = new ArrayList<L>();\n\t\tbuildWithField0(nodeType, statement, fa, list);\n\t\treturn list;\n\t}\n\t\n\t/**\n\t * Uses reflection to find the given direct child on the given statement, and replace it with a new child.\n\t */\n\tprotected boolean replaceStatementInNode(N statement, N oldN, N newN) {\n\t\tfor (FieldAccess fa : fieldsOf(statement.getClass())) {\n\t\t\tif (replaceStatementInField(fa, statement, oldN, newN)) return true;\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\tprivate boolean replaceStatementInField(FieldAccess fa, N statement, N oldN, N newN) {\n\t\ttry {\n\t\t\tObject o = fa.field.get(statement);\n\t\t\tif (o == null) return false;\n\t\t\t\n\t\t\tif (o == oldN) {\n\t\t\t\tfa.field.set(statement, newN);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t\n\t\t\tif (fa.dim > 0) {\n\t\t\t\tif (o.getClass().isArray()) {\n\t\t\t\t\treturn replaceStatementInArray(o, oldN, newN);\n\t\t\t\t} else if (Collection.class.isInstance(o)) {\n\t\t\t\t\treturn replaceStatementInCollection(fa.field, statement, new ArrayList<Collection<?>>(), (Collection<?>)o, oldN, newN);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn false;\n\t\t} catch (IllegalAccessException e) {\n\t\t\tthrow sneakyThrow(e);\n\t\t}\n\t\t\n\t}\n\t\n\tprivate boolean replaceStatementInCollection(Field field, Object fieldRef, List<Collection<?>> chain, Collection<?> collection, N oldN, N newN) throws IllegalAccessException {\n\t\tif (collection == null) return false;\n\t\t\n\t\tint idx = -1;\n\t\tfor (Object o : collection) {\n\t\t\tidx++;\n\t\t\tif (o == null) continue;\n\t\t\tif (Collection.class.isInstance(o)) {\n\t\t\t\tCollection<?> newC = (Collection<?>) o;\n\t\t\t\tList<Collection<?>> newChain = new ArrayList<Collection<?>>(chain);\n\t\t\t\tnewChain.add(newC);\n\t\t\t\tif (replaceStatementInCollection(field, fieldRef, newChain, newC, oldN, newN)) return true;\n\t\t\t}\n\t\t\tif (o == oldN) {\n\t\t\t\tsetElementInASTCollection(field, fieldRef, chain, collection, idx, newN);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * Override if your AST collection does not support the set method. Javac's for example, does not.\n\t * \n\t * @param field The field that contains the array or list of AST nodes.\n\t * @param fieldRef The object that you can supply to the field's {@code get} method.\n\t * @param chain If the collection is immutable, you need to update the pointer to the collection in each element in the chain.\n\t * \n\t * @throws IllegalAccessException This exception won't happen, but we allow you to throw it so you can avoid having to catch it.\n\t */\n\t@SuppressWarnings({\"rawtypes\", \"unchecked\"})\n\tprotected void setElementInASTCollection(Field field, Object fieldRef, List<Collection<?>> chain, Collection<?> collection, int idx, N newN) throws IllegalAccessException {\n\t\tif (collection instanceof List<?>) {\n\t\t\t((List) collection).set(idx, newN);\n\t\t}\n\t}\n\t\n\tprivate boolean replaceStatementInArray(Object array, N oldN, N newN) {\n\t\tif (array == null) return false;\n\t\t\n\t\tint len = Array.getLength(array);\n\t\tfor (int i = 0; i < len; i++) {\n\t\t\tObject o = Array.get(array, i);\n\t\t\tif (o == null) continue;\n\t\t\tif (o.getClass().isArray()) {\n\t\t\t\tif (replaceStatementInArray(o, oldN, newN)) return true;\n\t\t\t} else if (o == oldN) {\n\t\t\t\tArray.set(array, i, newN);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\t@SuppressWarnings(\"unchecked\")\n\tprivate void buildWithField0(Class<L> nodeType, N child, FieldAccess fa, Collection<L> list) {\n\t\ttry {\n\t\t\tObject o = fa.field.get(child);\n\t\t\tif (o == null) return;\n\t\t\tif (fa.dim == 0) {\n\t\t\t\tL node = buildTree((N) o, Kind.STATEMENT);\n\t\t\t\tif (node != null) list.add(nodeType.cast(node));\n\t\t\t} else if (o.getClass().isArray()) {\n\t\t\t\tbuildWithArray(nodeType, o, list, fa.dim);\n\t\t\t} else if (Collection.class.isInstance(o)) {\n\t\t\t\tbuildWithCollection(nodeType, o, list, fa.dim);\n\t\t\t}\n\t\t} catch (IllegalAccessException e) {\n\t\t\tthrow sneakyThrow(e);\n\t\t}\n\t}\n\t\n\t@SuppressWarnings(\"unchecked\")\n\tprivate void buildWithArray(Class<L> nodeType, Object array, Collection<L> list, int dim) {\n\t\tif (dim == 1) {\n\t\t\tfor (Object v : (Object[]) array) {\n\t\t\t\tif (v == null) continue;\n\t\t\t\tL node = buildTree((N)v, Kind.STATEMENT);\n\t\t\t\tif (node != null) list.add(nodeType.cast(node));\n\t\t\t}\n\t\t} else for (Object v : (Object[]) array) {\n\t\t\tif (v == null) return;\n\t\t\tbuildWithArray(nodeType, v, list, dim -1);\n\t\t}\n\t}\n\t\n\t@SuppressWarnings(\"unchecked\")\n\tprivate void buildWithCollection(Class<L> nodeType, Object collection, Collection<L> list, int dim) {\n\t\tif (dim == 1) {\n\t\t\tfor (Object v : (Collection<?>) collection) {\n\t\t\t\tif (v == null) continue;\n\t\t\t\tL node = buildTree((N) v, Kind.STATEMENT);\n\t\t\t\tif (node != null) list.add(nodeType.cast(node));\n\t\t\t}\n\t\t} else for (Object v : (Collection<?>) collection) {\n\t\t\tbuildWithCollection(nodeType, v, list, dim - 1);\n\t\t}\n\t}\n\t\n\t/**\n\t * @return The {@code lombok.config} configuration value for the provided {@code key}, or {@code null} if that key is not in the config / there is no config.\n\t */\n\tpublic final <T> T readConfiguration(ConfigurationKey<T> key) {\n\t\tlong start = configTracker == null ? 0L : configTracker.start();\n\t\ttry {\n\t\t\treturn LombokConfiguration.read(key, this);\n\t\t} finally {\n\t\t\tif (configTracker != null) configTracker.end(start);\n\t\t}\n\t}\n\t\n\t/**\n\t * @return The {@code lombok.config} configuration value for the provided {@code key}, or {@code defaultValue} if that key is not in the config / there is no config.\n\t */\n\tpublic final <T> T readConfigurationOr(ConfigurationKey<T> key, T defaultValue) {\n\t\tlong start = configTracker == null ? 0L : configTracker.start();\n\t\ttry {\n\t\t\tT value = LombokConfiguration.read(key, this);\n\t\t\treturn value != null ? value : defaultValue;\n\t\t} finally {\n\t\t\tif (configTracker != null) configTracker.end(start);\n\t\t}\n\t}\n\t\n\tpublic boolean getBooleanAnnotationValue(AnnotationValues<?> annotation, String annoMethod, ConfigurationKey<Boolean> confKey) {\n\t\tBoolean conf = readConfiguration(confKey);\n\t\treturn annotation.isExplicit(annoMethod) || conf == null ? annotation.getAsBoolean(annoMethod) : conf;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/AgentLauncher.java",
    "content": "/*\n * Copyright (C) 2009-2014 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\nimport java.lang.instrument.Instrumentation;\nimport java.lang.reflect.InvocationTargetException;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\n\npublic class AgentLauncher {\n\tpublic interface AgentLaunchable {\n\t\tvoid runAgent(String agentArgs, Instrumentation instrumentation, boolean injected, Class<?> launchingContext) throws Exception;\n\t}\n\t\n\tpublic static void runAgents(String agentArgs, Instrumentation instrumentation, boolean injected, Class<?> launchingContext) throws Throwable {\n\t\tfor (AgentInfo info : AGENTS) {\n\t\t\ttry {\n\t\t\t\tClass<?> agentClass = Class.forName(info.className());\n\t\t\t\tAgentLaunchable agent = (AgentLaunchable) agentClass.getConstructor().newInstance();\n\t\t\t\tagent.runAgent(agentArgs, instrumentation, injected, launchingContext);\n\t\t\t} catch (Throwable t) {\n\t\t\t\tif (t instanceof InvocationTargetException) t = t.getCause();\n\t\t\t\tinfo.problem(t, instrumentation);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate static final List<AgentInfo> AGENTS = Collections.unmodifiableList(Arrays.<AgentInfo>asList(\n\t\t\tnew EclipsePatcherInfo()\n\t));\n\t\n\tprivate static abstract class AgentInfo {\n\t\tabstract String className();\n\t\t\n\t\t/**\n\t\t * Called if an exception occurs while loading the agent represented by this AgentInfo object.\n\t\t * \n\t\t * @param t The throwable.\n\t\t * @param instrumentation In case you want to take an alternative action.\n\t\t */\n\t\tvoid problem(Throwable t, Instrumentation instrumentation) throws Throwable {\n\t\t\tif (t instanceof ClassNotFoundException) {\n\t\t\t\t//That's okay - this lombok evidently is a version with support for something stripped out.\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (t instanceof ClassCastException) {\n\t\t\t\tthrow new InternalError(\"Lombok bug. Class: \" + className() + \" is not an implementation of lombok.core.Agent\");\n\t\t\t}\n\t\t\t\n\t\t\tif (t instanceof IllegalAccessError) {\n\t\t\t\tthrow new InternalError(\"Lombok bug. Class: \" + className() + \" is not public\");\n\t\t\t}\n\t\t\t\n\t\t\tif (t instanceof InstantiationException) {\n\t\t\t\tthrow new InternalError(\"Lombok bug. Class: \" + className() + \" is not concrete or has no public no-args constructor\");\n\t\t\t}\n\t\t\t\n\t\t\tthrow t;\n\t\t}\n\t}\n\t\n\tprivate static class EclipsePatcherInfo extends AgentInfo {\n\t\t@Override String className() {\n\t\t\treturn \"lombok.eclipse.agent.EclipsePatcher\";\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/AlreadyHandledAnnotations.java",
    "content": "/*\n * Copyright (C) 2018 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */package lombok.core;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Used to indicate a handler is to be invoked for its marked annotation even if that annotation is already handled. Useful for cleanup handlers\n */\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface AlreadyHandledAnnotations {}\n"
  },
  {
    "path": "src/core/lombok/core/AnnotationProcessor.java",
    "content": "/*\n * Copyright (C) 2009-2018 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\nimport static lombok.core.Augments.ClassLoader_lombokAlreadyAddedTo;\n\nimport java.io.File;\nimport java.io.PrintWriter;\nimport java.io.StringWriter;\nimport java.lang.reflect.InvocationHandler;\nimport java.lang.reflect.Method;\nimport java.lang.reflect.Proxy;\nimport java.net.URL;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Set;\n\nimport javax.annotation.processing.AbstractProcessor;\nimport javax.annotation.processing.ProcessingEnvironment;\nimport javax.annotation.processing.Processor;\nimport javax.annotation.processing.RoundEnvironment;\nimport javax.annotation.processing.SupportedAnnotationTypes;\nimport javax.lang.model.SourceVersion;\nimport javax.lang.model.element.Element;\nimport javax.lang.model.element.Name;\nimport javax.lang.model.element.TypeElement;\nimport javax.tools.Diagnostic.Kind;\n\nimport lombok.patcher.ClassRootFinder;\nimport lombok.permit.Permit;\n\n@SupportedAnnotationTypes(\"*\")\npublic class AnnotationProcessor extends AbstractProcessor {\n\t\n\tprivate static String trace(Throwable t) {\n\t\tStringWriter w = new StringWriter();\n\t\tt.printStackTrace(new PrintWriter(w, true));\n\t\treturn w.toString();\n\t}\n\t\n\tstatic abstract class ProcessorDescriptor {\n\t\tabstract boolean want(ProcessingEnvironment procEnv, List<String> delayedWarnings);\n\t\tabstract String getName();\n\t\tabstract boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv);\n\t}\n\t\n\tprivate final List<ProcessorDescriptor> registered = Arrays.asList(new JavacDescriptor(), new EcjDescriptor());\n\tprivate final List<ProcessorDescriptor> active = new ArrayList<ProcessorDescriptor>();\n\tprivate final List<String> delayedWarnings = new ArrayList<String>();\n\t\n\t/**\n\t * This method is a simplified version of {@link lombok.javac.apt.LombokProcessor#getJavacProcessingEnvironment}\n\t * It simply returns the processing environment, but in case of gradle incremental compilation,\n\t * the delegate ProcessingEnvironment of the gradle wrapper is returned.\n\t */\n\tpublic static ProcessingEnvironment getJavacProcessingEnvironment(ProcessingEnvironment procEnv, List<String> delayedWarnings) {\n\t\treturn tryRecursivelyObtainJavacProcessingEnvironment(procEnv);\n\t}\n\t\n\tprivate static ProcessingEnvironment tryRecursivelyObtainJavacProcessingEnvironment(ProcessingEnvironment procEnv) {\n\t\tif (procEnv.getClass().getName().equals(\"com.sun.tools.javac.processing.JavacProcessingEnvironment\")) {\n\t\t\treturn procEnv;\n\t\t}\n\t\t\n\t\tfor (Class<?> procEnvClass = procEnv.getClass(); procEnvClass != null; procEnvClass = procEnvClass.getSuperclass()) {\n\t\t\ttry {\n\t\t\t\tObject delegate = tryGetDelegateField(procEnvClass, procEnv);\n\t\t\t\tif (delegate == null) delegate = tryGetProcessingEnvField(procEnvClass, procEnv);\n\t\t\t\tif (delegate == null) delegate = tryGetProxyDelegateToField(procEnvClass, procEnv);\n\n\t\t\t\tif (delegate != null) return tryRecursivelyObtainJavacProcessingEnvironment((ProcessingEnvironment) delegate);\n\t\t\t} catch (final Exception e) {\n\t\t\t\t// no valid delegate, try superclass\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\t\n\t/**\n\t * Gradle incremental processing\n\t */\n\tprivate static Object tryGetDelegateField(Class<?> delegateClass, Object instance) {\n\t\ttry {\n\t\t\treturn Permit.getField(delegateClass, \"delegate\").get(instance);\n\t\t} catch (Exception e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\t/**\n\t * Kotlin incremental processing\n\t */\n\tprivate static Object tryGetProcessingEnvField(Class<?> delegateClass, Object instance) {\n\t\ttry {\n\t\t\treturn Permit.getField(delegateClass, \"processingEnv\").get(instance);\n\t\t} catch (Exception e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\t/**\n\t * IntelliJ IDEA >= 2020.3\n\t */\n\tprivate static Object tryGetProxyDelegateToField(Class<?> delegateClass, Object instance) {\n\t\ttry {\n\t\t\tInvocationHandler handler = Proxy.getInvocationHandler(instance);\n\t\t\treturn Permit.getField(handler.getClass(), \"val$delegateTo\").get(handler);\n\t\t} catch (Exception e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tstatic class JavacDescriptor extends ProcessorDescriptor {\n\t\tprivate Processor processor;\n\t\t\n\t\t@Override String getName() {\n\t\t\treturn \"OpenJDK javac\";\n\t\t}\n\t\t\n\t\t@Override boolean want(ProcessingEnvironment procEnv, List<String> delayedWarnings) {\n\t\t\t// do not run on ECJ as it may print warnings\n\t\t\tif (procEnv.getClass().getName().startsWith(\"org.eclipse.jdt.\")) return false;\n\t\t\t\n\t\t\tProcessingEnvironment javacProcEnv = getJavacProcessingEnvironment(procEnv, delayedWarnings);\n\t\t\t\n\t\t\tif (javacProcEnv == null) return false;\n\t\t\t\n\t\t\ttry {\n\t\t\t\tClassLoader classLoader = findAndPatchClassLoader(javacProcEnv);\n\t\t\t\tprocessor = (Processor) Class.forName(\"lombok.javac.apt.LombokProcessor\", false, classLoader).getConstructor().newInstance();\n\t\t\t} catch (Exception e) {\n\t\t\t\tdelayedWarnings.add(\"You found a bug in lombok; lombok.javac.apt.LombokProcessor is not available. Lombok will not run during this compilation: \" + trace(e));\n\t\t\t\treturn false;\n\t\t\t} catch (NoClassDefFoundError e) {\n\t\t\t\tdelayedWarnings.add(\"Can't load javac processor due to (most likely) a class loader problem: \" + trace(e));\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tprocessor.init(procEnv);\n\t\t\t} catch (Exception e) {\n\t\t\t\tdelayedWarnings.add(\"lombok.javac.apt.LombokProcessor could not be initialized. Lombok will not run during this compilation: \" + trace(e));\n\t\t\t\treturn false;\n\t\t\t} catch (NoClassDefFoundError e) {\n\t\t\t\tdelayedWarnings.add(\"Can't initialize javac processor due to (most likely) a class loader problem: \" + trace(e));\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\tprivate ClassLoader findAndPatchClassLoader(ProcessingEnvironment procEnv) throws Exception {\n\t\t\tClassLoader environmentClassLoader = procEnv.getClass().getClassLoader();\n\t\t\tif (environmentClassLoader != null && environmentClassLoader.getClass().getCanonicalName().equals(\"org.codehaus.plexus.compiler.javac.IsolatedClassLoader\")) {\n\t\t\t\tif (!ClassLoader_lombokAlreadyAddedTo.getAndSet(environmentClassLoader, true)) {\n\t\t\t\t\tMethod m = Permit.getMethod(environmentClassLoader.getClass(), \"addURL\", URL.class);\n\t\t\t\t\tURL selfUrl = new File(ClassRootFinder.findClassRootOfClass(AnnotationProcessor.class)).toURI().toURL();\n\t\t\t\t\tPermit.invoke(m, environmentClassLoader, selfUrl);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tClassLoader ourClassLoader = JavacDescriptor.class.getClassLoader();\n\t\t\tif (ourClassLoader == null) return ClassLoader.getSystemClassLoader();\n\t\t\treturn ourClassLoader;\n\t\t}\n\t\t\n\t\t@Override boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {\n\t\t\treturn processor.process(annotations, roundEnv);\n\t\t}\n\t}\n\t\n\tstatic class EcjDescriptor extends ProcessorDescriptor {\n\t\t@Override String getName() {\n\t\t\treturn \"ECJ\";\n\t\t}\n\t\t\n\t\t@Override boolean want(ProcessingEnvironment procEnv, List<String> delayedWarnings) {\n\t\t\tif (!procEnv.getClass().getName().startsWith(\"org.eclipse.jdt.\")) return false;\n\t\t\t\n\t\t\t// Lombok used to work as annotation processor to ecj but that never actually worked properly, so we disabled the feature in 0.10.0.\n\t\t\t// Because loading lombok as an agent in any ECJ-based non-interactive tool works just fine, we're not going to generate any warnings, as we'll\n\t\t\t// likely generate more false positives than be helpful.\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\t@Override boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\t@Override public void init(ProcessingEnvironment procEnv) {\n\t\tsuper.init(procEnv);\n\t\tfor (ProcessorDescriptor proc : registered) {\n\t\t\tif (proc.want(procEnv, delayedWarnings)) active.add(proc);\n\t\t}\n\t\t\n\t\tif (active.isEmpty() && delayedWarnings.isEmpty()) {\n\t\t\tStringBuilder supported = new StringBuilder();\n\t\t\tfor (ProcessorDescriptor proc : registered) {\n\t\t\t\tif (supported.length() > 0) supported.append(\", \");\n\t\t\t\tsupported.append(proc.getName());\n\t\t\t}\n\t\t\tif (procEnv.getClass().getName().equals(\"com.google.turbine.processing.TurbineProcessingEnvironment\")) {\n\t\t\t\tprocEnv.getMessager().printMessage(Kind.ERROR, String.format(\"Turbine is not currently supported by lombok.\"));\n\t\t\t} else {\n\t\t\t\tprocEnv.getMessager().printMessage(Kind.WARNING, String.format(\"You aren't using a compiler supported by lombok, so lombok will not work and has been disabled.\\n\" +\n\t\t\t\t\t\"Your processor is: %s\\nLombok supports: %s\", procEnv.getClass().getName(), supported));\n\t\t\t}\n\t\t}\n\t}\n\t\n\t@Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {\n\t\tif (!delayedWarnings.isEmpty()) {\n\t\t\tSet<? extends Element> rootElements = roundEnv.getRootElements();\n\t\t\tif (!rootElements.isEmpty()) {\n\t\t\t\tElement firstRoot = rootElements.iterator().next();\n\t\t\t\tfor (String warning : delayedWarnings) processingEnv.getMessager().printMessage(Kind.WARNING, warning, firstRoot);\n\t\t\t\tdelayedWarnings.clear();\n\t\t\t}\n\t\t}\n\t\t\n\t\tfor (ProcessorDescriptor proc : active) proc.process(annotations, roundEnv);\n\t\t\n\t\tboolean onlyLombok = true;\n\t\tboolean zeroElems = true;\n\t\tfor (TypeElement elem : annotations) {\n\t\t\tzeroElems = false;\n\t\t\tName n = elem.getQualifiedName();\n\t\t\tif (n.toString().startsWith(\"lombok.\")) continue;\n\t\t\tonlyLombok = false;\n\t\t}\n\t\t\n\t\t// Normally we rely on the claiming processor to claim away all lombok annotations.\n\t\t// One of the many Java9 oversights is that this 'process' API has not been fixed to address the point that 'files I want to look at' and 'annotations I want to claim' must be one and the same,\n\t\t// and yet in java9 you can no longer have 2 providers for the same service, thus, if you go by module path, lombok no longer loads the ClaimingProcessor.\n\t\t// This doesn't do as good a job, but it'll have to do. The only way to go from here, I think, is either 2 modules, or use reflection hackery to add ClaimingProcessor during our init.\n\t\t\n\t\treturn onlyLombok && !zeroElems;\n\t}\n\t\n\t/**\n\t * We just return the latest version of whatever JDK we run on. Stupid? Yeah, but it's either that or warnings on all versions but 1. Blame Joe.\n\t */\n\t@Override public SourceVersion getSupportedSourceVersion() {\n\t\treturn SourceVersion.latest();\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/AnnotationValues.java",
    "content": "/*\n * Copyright (C) 2009-2024 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\nimport java.lang.annotation.Annotation;\nimport java.lang.reflect.Array;\nimport java.lang.reflect.InvocationHandler;\nimport java.lang.reflect.Method;\nimport java.lang.reflect.Proxy;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Map;\n\nimport lombok.core.AST.Kind;\nimport lombok.permit.Permit;\n\n/**\n * Represents a single annotation in a source file and can be used to query the parameters present on it.\n * \n * @param A The annotation that this class represents, such as {@code lombok.Getter}\n */\npublic class AnnotationValues<A extends Annotation> {\n\tprivate final Class<A> type;\n\tprivate final Map<String, AnnotationValue> values;\n\tprivate final LombokNode<?, ?, ?> ast;\n\n\t/**\n\t * Represents a single method on the annotation class. For example, the value() method on the Getter annotation.\n\t */\n\tpublic static class AnnotationValue {\n\t\t/** A list of the raw expressions. List is size 1 unless an array is provided. */\n\t\tpublic final List<String> raws;\n\t\t\n\t\t/** Guesses for each raw expression. It's 'primitive' (String or primitive), an AV.ClassLiteral, an AV.FieldSelect, or an array of one of those. */\n\t\tpublic final List<Object> valueGuesses;\n\t\t\n\t\t/** A list of the actual expressions. List is size 1 unless an array is provided. */\n\t\tpublic final List<Object> expressions;\n\t\t\n\t\tprivate final LombokNode<?, ?, ?> node;\n\t\tprivate final boolean isExplicit;\n\t\t\n\t\t/**\n\t\t * Like the other constructor, but used for when the annotation method is initialized with an array value.\n\t\t */\n\t\tpublic AnnotationValue(LombokNode<?, ?, ?> node, List<String> raws, List<Object> expressions, List<Object> valueGuesses, boolean isExplicit) {\n\t\t\tthis.node = node;\n\t\t\tthis.raws = raws;\n\t\t\tthis.expressions = expressions;\n\t\t\tthis.valueGuesses = valueGuesses;\n\t\t\tthis.isExplicit = isExplicit;\n\t\t}\n\t\t\n\t\t/**\n\t\t *  Override this if you want more specific behaviour (to get the source position just right).\n\t\t * \n\t\t * @param message English message with the problem.\n\t\t * @param valueIdx The index into the values for this annotation key that caused the problem.\n\t\t *   -1 for a problem that applies to all values, otherwise the 0-based index into an array of values.\n\t\t *   If there is no array for this value (e.g. value=1 instead of value={1,2}), then always -1 or 0.\n\t\t */\n\t\tpublic void setError(String message, int valueIdx) {\n\t\t\tnode.addError(message);\n\t\t}\n\t\t\n\t\t/**\n\t\t *  Override this if you want more specific behaviour (to get the source position just right).\n\t\t * \n\t\t * @param message English message with the problem.\n\t\t * @param valueIdx The index into the values for this annotation key that caused the problem.\n\t\t *   -1 for a problem that applies to all values, otherwise the 0-based index into an array of values.\n\t\t *   If there is no array for this value (e.g. value=1 instead of value={1,2}), then always -1 or 0.\n\t\t */\n\t\tpublic void setWarning(String message, int valueIdx) {\n\t\t\tnode.addError(message);\n\t\t}\n\t\t\n\t\t/** {@inheritDoc} */\n\t\t@Override public String toString() {\n\t\t\treturn \"raws: \" + raws + \" valueGuesses: \" + valueGuesses;\n\t\t}\n\t\t\n\t\tpublic boolean isExplicit() {\n\t\t\treturn isExplicit;\n\t\t}\n\t}\n\t\n\t/**\n\t * Creates a new AnnotationValues.\n\t * \n\t * @param type The annotation type. For example, \"Getter.class\"\n\t * @param values a Map of method names to AnnotationValue instances, for example 'value -> annotationValue instance'.\n\t * @param ast The Annotation node.\n\t */\n\tpublic AnnotationValues(Class<A> type, Map<String, AnnotationValue> values, LombokNode<?, ?, ?> ast) {\n\t\tthis.type = type;\n\t\tthis.values = values;\n\t\tthis.ast = ast;\n\t}\n\t\n\tpublic static <A extends Annotation> AnnotationValues<A> of(Class<A> type) {\n\t\treturn new AnnotationValues<A>(type, Collections.<String, AnnotationValue>emptyMap(), null);\n\t}\n\t\n\t/**\n\t * Creates a new annotation wrapper with all default values, and using the provided ast as lookup anchor for\n\t * class literals.\n\t */\n\tpublic static <A extends Annotation> AnnotationValues<A> of(Class<A> type, LombokNode<?, ?, ?> ast) {\n\t\treturn new AnnotationValues<A>(type, Collections.<String, AnnotationValue>emptyMap(), ast);\n\t}\n\t\n\t/**\n\t * Thrown on the fly if an actual annotation instance procured via the {@link #getInstance()} method is queried\n\t * for a method for which this AnnotationValues instance either doesn't have a guess or can't manage to fit\n\t * the guess into the required data type.\n\t */\n\tpublic static class AnnotationValueDecodeFail extends RuntimeException {\n\t\tprivate static final long serialVersionUID = 1L;\n\t\t\n\t\t/** The index into an array initializer (e.g. if the second value in an array initializer is\n\t\t * an integer constant expression like '5+SomeOtherClass.CONSTANT', this exception will be thrown,\n\t\t * and you'll get a '1' for idx. */\n\t\tpublic final int idx;\n\t\t\n\t\t/** The AnnotationValue object that goes with the annotation method for which the failure occurred. */\n\t\tpublic final AnnotationValue owner;\n\t\t\n\t\tpublic AnnotationValueDecodeFail(AnnotationValue owner, String msg, int idx) {\n\t\t\tsuper(msg);\n\t\t\tthis.idx = idx;\n\t\t\tthis.owner = owner;\n\t\t}\n\t}\n\t\n\tprivate static AnnotationValueDecodeFail makeNoDefaultFail(AnnotationValue owner, Method method) {\n\t\treturn new AnnotationValueDecodeFail(owner, \n\t\t\t\t\"No value supplied but \" + method.getName() + \" has no default either.\", -1);\n\t}\n\t\n\tprivate A cachedInstance = null;\n\t\n\tpublic List<String> getAsStringList(String methodName) {\n\t\tAnnotationValue v = values.get(methodName);\n\t\t\n\t\tif (v == null) {\n\t\t\tString[] s = getDefaultIf(methodName, new String[0]);\n\t\t\treturn Collections.unmodifiableList(Arrays.asList(s));\n\t\t}\n\t\t\n\t\tList<String> out = new ArrayList<String>(v.valueGuesses.size());\n\t\tint idx = 0;\n\t\tfor (Object guess : v.valueGuesses) {\n\t\t\tObject result = guess == null ? null : guessToType(guess, String.class, v, idx);\n\t\t\tif (result == null) {\n\t\t\t\tif (v.valueGuesses.size() == 1) {\n\t\t\t\t\tString[] s = getDefaultIf(methodName, new String[0]);\n\t\t\t\t\treturn Collections.unmodifiableList(Arrays.asList(s));\n\t\t\t\t} \n\t\t\t\tthrow new AnnotationValueDecodeFail(v, \n\t\t\t\t\t\"I can't make sense of this annotation value. Try using a fully qualified literal.\", idx);\n\t\t\t}\n\t\t\tout.add((String) result);\n\t\t\tidx++;\n\t\t}\n\t\t\n\t\treturn Collections.unmodifiableList(out);\n\t}\n\t\n\tpublic String getAsString(String methodName) {\n\t\tAnnotationValue v = values.get(methodName);\n\t\tif (v == null || v.valueGuesses.size() != 1) {\n\t\t\treturn getDefaultIf(methodName, \"\");\n\t\t}\n\t\t\n\t\tObject guess = guessToType(v.valueGuesses.get(0), String.class, v, 0);\n\t\tif (guess instanceof String) return (String) guess;\n\t\treturn getDefaultIf(methodName, \"\");\n\t}\n\t\n\tpublic boolean getAsBoolean(String methodName) {\n\t\tAnnotationValue v = values.get(methodName);\n\t\tif (v == null || v.valueGuesses.size() != 1) {\n\t\t\treturn getDefaultIf(methodName, false);\n\t\t}\n\t\t\n\t\tObject guess = guessToType(v.valueGuesses.get(0), boolean.class, v, 0);\n\t\tif (guess instanceof Boolean) return ((Boolean) guess).booleanValue();\n\t\treturn getDefaultIf(methodName, false);\n\t}\n\t\n\t@SuppressWarnings(\"unchecked\")\n\tpublic <T> T getDefaultIf(String methodName, T defaultValue) {\n\t\ttry {\n\t\t\treturn (T) Permit.getMethod(type, methodName).getDefaultValue();\n\t\t} catch (Exception e) {\n\t\t\treturn defaultValue;\n\t\t}\n\t}\n\t\n\t/**\n\t * Creates an actual annotation instance. You can use this to query any annotation methods, except for\n\t * those annotation methods with class literals, as those can most likely not be turned into Class objects.\n\t * \n\t * If some of the methods cannot be implemented, this method still works; it's only when you call a method\n\t * that has a problematic value that an AnnotationValueDecodeFail exception occurs.\n\t */\n\t@SuppressWarnings(\"unchecked\")\n\tpublic A getInstance() {\n\t\tif (cachedInstance != null) return cachedInstance;\n\t\tInvocationHandler invocations = new InvocationHandler() {\n\t\t\tpublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {\n\t\t\t\tAnnotationValue v = values.get(method.getName());\n\t\t\t\tif (v == null) {\n\t\t\t\t\tObject defaultValue = method.getDefaultValue();\n\t\t\t\t\tif (defaultValue != null) return defaultValue;\n\t\t\t\t\tthrow makeNoDefaultFail(v, method);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tboolean isArray = false;\n\t\t\t\tClass<?> expected = method.getReturnType();\n\t\t\t\tObject array = null;\n\t\t\t\tif (expected.isArray()) {\n\t\t\t\t\tisArray = true;\n\t\t\t\t\texpected = expected.getComponentType();\n\t\t\t\t\tarray = Array.newInstance(expected, v.valueGuesses.size());\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (!isArray && v.valueGuesses.size() > 1) {\n\t\t\t\t\tthrow new AnnotationValueDecodeFail(v, \n\t\t\t\t\t\t\"Expected a single value, but \" + method.getName() + \" has an array of values\", -1);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (v.valueGuesses.size() == 0 && !isArray) {\n\t\t\t\t\tObject defaultValue = method.getDefaultValue();\n\t\t\t\t\tif (defaultValue == null) throw makeNoDefaultFail(v, method);\n\t\t\t\t\treturn defaultValue;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tint idx = 0;\n\t\t\t\tfor (Object guess : v.valueGuesses) {\n\t\t\t\t\tObject result = guess == null ? null : guessToType(guess, expected, v, idx);\n\t\t\t\t\tif (!isArray) {\n\t\t\t\t\t\tif (result == null) {\n\t\t\t\t\t\t\tObject defaultValue = method.getDefaultValue();\n\t\t\t\t\t\t\tif (defaultValue == null) throw makeNoDefaultFail(v, method);\n\t\t\t\t\t\t\treturn defaultValue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t} \n\t\t\t\t\tif (result == null) {\n\t\t\t\t\t\tif (v.valueGuesses.size() == 1) {\n\t\t\t\t\t\t\tObject defaultValue = method.getDefaultValue();\n\t\t\t\t\t\t\tif (defaultValue == null) throw makeNoDefaultFail(v, method);\n\t\t\t\t\t\t\treturn defaultValue;\n\t\t\t\t\t\t} \n\t\t\t\t\t\tthrow new AnnotationValueDecodeFail(v, \n\t\t\t\t\t\t\t\"I can't make sense of this annotation value. Try using a fully qualified literal.\", idx);\n\t\t\t\t\t}\n\t\t\t\t\tArray.set(array, idx++, result);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn array;\n\t\t\t}\n\t\t};\n\t\t\n\t\treturn cachedInstance = (A) Proxy.newProxyInstance(type.getClassLoader(), new Class[] { type }, invocations);\n\t}\n\t\n\tprivate Object guessToType(Object guess, Class<?> expected, AnnotationValue v, int pos) {\n\t\tif (expected == int.class || expected == Integer.class) {\n\t\t\tif (guess instanceof Integer || guess instanceof Short || guess instanceof Byte) {\n\t\t\t\treturn ((Number) guess).intValue();\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (expected == long.class || expected == Long.class) {\n\t\t\tif (guess instanceof Long || guess instanceof Integer || guess instanceof Short || guess instanceof Byte) {\n\t\t\t\treturn ((Number) guess).longValue();\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (expected == short.class || expected == Short.class) {\n\t\t\tif (guess instanceof Integer || guess instanceof Short || guess instanceof Byte) {\n\t\t\t\tint intVal = ((Number) guess).intValue();\n\t\t\t\tint shortVal = ((Number) guess).shortValue();\n\t\t\t\tif (shortVal == intVal) return shortVal;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (expected == byte.class || expected == Byte.class) {\n\t\t\tif (guess instanceof Integer || guess instanceof Short || guess instanceof Byte) {\n\t\t\t\tint intVal = ((Number) guess).intValue();\n\t\t\t\tint byteVal = ((Number) guess).byteValue();\n\t\t\t\tif (byteVal == intVal) return byteVal;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (expected == double.class || expected == Double.class) {\n\t\t\tif (guess instanceof Number) return ((Number) guess).doubleValue();\n\t\t}\n\t\t\n\t\tif (expected == float.class || expected == Float.class) {\n\t\t\tif (guess instanceof Number) return ((Number) guess).floatValue();\n\t\t}\n\t\t\n\t\tif (expected == boolean.class || expected == Boolean.class) {\n\t\t\tif (guess instanceof Boolean) return ((Boolean) guess).booleanValue();\n\t\t}\n\t\t\n\t\tif (expected == char.class || expected == Character.class) {\n\t\t\tif (guess instanceof Character) return ((Character) guess).charValue();\n\t\t}\n\t\t\n\t\tif (expected == String.class) {\n\t\t\tif (guess instanceof String) return guess;\n\t\t}\n\t\t\n\t\tif (Enum.class.isAssignableFrom(expected) ) {\n\t\t\tif (guess instanceof FieldSelect) {\n\t\t\t\tString fieldSel = ((FieldSelect) guess).getFinalPart();\n\t\t\t\tfor (Object enumConstant : expected.getEnumConstants()) {\n\t\t\t\t\tString target = ((Enum<?>) enumConstant).name();\n\t\t\t\t\tif (target.equals(fieldSel)) return enumConstant;\n\t\t\t\t}\n\t\t\t\tthrow new AnnotationValueDecodeFail(v,\n\t\t\t\t\t\"Can't translate \" + fieldSel + \" to an enum of type \" + expected, pos);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (expected == Class.class) {\n\t\t\tif (guess instanceof ClassLiteral) try {\n\t\t\t\tString classLit = ((ClassLiteral) guess).getClassName();\n\t\t\t\treturn Class.forName(toFQ(classLit));\n\t\t\t} catch (ClassNotFoundException e) {\n\t\t\t\tthrow new AnnotationValueDecodeFail(v,\n\t\t\t\t\t\"Can't translate \" + guess + \" to a class object.\", pos);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (guess instanceof AnnotationValues) {\n\t\t\treturn ((AnnotationValues<?>) guess).getInstance();\n\t\t}\n\t\t\n\t\tif (guess instanceof FieldSelect) throw new AnnotationValueDecodeFail(v,\n\t\t\t\"You must use constant literals in lombok annotations; they cannot be references to (static) fields.\", pos);\n\t\t\n\t\tthrow new AnnotationValueDecodeFail(v,\n\t\t\t\"Can't translate a \" + guess.getClass() + \" to the expected \" + expected, pos);\n\t}\n\t\n\t/**\n\t * Returns the raw expressions used for the provided {@code annotationMethodName}.\n\t * \n\t * You should use this method for annotation methods that return {@code Class} objects. Remember that\n\t * class literals end in \".class\" which you probably want to strip off.\n\t */\n\tpublic List<String> getRawExpressions(String annotationMethodName) {\n\t\tAnnotationValue v = values.get(annotationMethodName);\n\t\treturn v == null ? Collections.<String>emptyList() : v.raws;\n\t}\n\t\n\t/**\n\t * Returns the actual expressions used for the provided {@code annotationMethodName}.\n\t */\n\tpublic List<Object> getActualExpressions(String annotationMethodName) {\n\t\tAnnotationValue v = values.get(annotationMethodName);\n\t\treturn v == null ? Collections.<Object>emptyList() : v.expressions;\n\t}\n\t\n\tpublic boolean isExplicit(String annotationMethodName) {\n\t\tAnnotationValue annotationValue = values.get(annotationMethodName);\n\t\treturn annotationValue != null && annotationValue.isExplicit();\n\t}\n\t\n\t/**\n\t * Convenience method to return the first result in a {@link #getRawExpressions(String)} call.\n\t * \n\t * You should use this method if the annotation method is not an array type.\n\t */\n\tpublic String getRawExpression(String annotationMethodName) {\n\t\tList<String> l = getRawExpressions(annotationMethodName);\n\t\treturn l.isEmpty() ? null : l.get(0);\n\t}\n\t\n\t/**\n\t * Convenience method to return the first result in a {@link #getActualExpressions(String)} call.\n\t * \n\t * You should use this method if the annotation method is not an array type.\n\t */\n\tpublic Object getActualExpression(String annotationMethodName) {\n\t\tList<Object> l = getActualExpressions(annotationMethodName);\n\t\treturn l.isEmpty() ? null : l.get(0);\n\t}\n\n\t/**\n\t * Returns the guessed value for the provided {@code annotationMethodName}.\n\t */\n\tpublic Object getValueGuess(String annotationMethodName) {\n\t\tAnnotationValue v = values.get(annotationMethodName);\n\t\treturn v == null || v.valueGuesses.isEmpty() ? null : v.valueGuesses.get(0);\n\t}\n\t\n\t/** Generates an error message on the stated annotation value (you should only call this method if you know it's there!) */\n\tpublic void setError(String annotationMethodName, String message) {\n\t\tsetError(annotationMethodName, message, -1);\n\t}\n\t\n\t/** Generates a warning message on the stated annotation value (you should only call this method if you know it's there!) */\n\tpublic void setWarning(String annotationMethodName, String message) {\n\t\tsetWarning(annotationMethodName, message, -1);\n\t}\n\t\n\t/** Generates an error message on the stated annotation value, which must have an array initializer.\n\t * The index-th item in the initializer will carry the error (you should only call this method if you know it's there!) */\n\tpublic void setError(String annotationMethodName, String message, int index) {\n\t\tAnnotationValue v = values.get(annotationMethodName);\n\t\tif (v == null) return;\n\t\tv.setError(message, index);\n\t}\n\t\n\t/** Generates a warning message on the stated annotation value, which must have an array initializer.\n\t * The index-th item in the initializer will carry the error (you should only call this method if you know it's there!) */\n\tpublic void setWarning(String annotationMethodName, String message, int index) {\n\t\tAnnotationValue v = values.get(annotationMethodName);\n\t\tif (v == null) return;\n\t\tv.setWarning(message, index);\n\t}\n\t\n\t/**\n\t * Attempts to translate class literals to their fully qualified names, such as 'Throwable.class' to 'java.lang.Throwable'.\n\t * \n\t * This process is at best a guess, but it will take into account import statements.\n\t */\n\tpublic List<String> getProbableFQTypes(String annotationMethodName) {\n\t\tList<String> result = new ArrayList<String>();\n\t\tAnnotationValue v = values.get(annotationMethodName);\n\t\tif (v == null) return Collections.emptyList();\n\t\t\n\t\tfor (Object o : v.valueGuesses) result.add(o == null ? null : toFQ(o.toString()));\n\t\treturn result;\n\t}\n\t\n\t/**\n\t * Convenience method to return the first result in a {@link #getProbableFQType(String)} call.\n\t * \n\t * You should use this method if the annotation method is not an array type.\n\t */\n\tpublic String getProbableFQType(String annotationMethodName) {\n\t\tList<String> l = getProbableFQTypes(annotationMethodName);\n\t\treturn l.isEmpty() ? null : l.get(0);\n\t}\n\t\n\t/*\n\t * Credit goes to Petr Jiricka of Sun for highlighting the problems with the earlier version of this method.\n\t */\n\tprivate String toFQ(String typeName) {\n\t\tString prefix = typeName.indexOf('.') > -1 ? typeName.substring(0, typeName.indexOf('.')) : typeName;\n\t\t\n\t\t/* 1. Walk through type names in this source file at this level. */ {\n\t\t\tLombokNode<?, ?, ?> n = ast;\n\t\t\twalkThroughCU:\n\t\t\twhile (n != null) {\n\t\t\t\tif (n.getKind() == Kind.TYPE) {\n\t\t\t\t\tString simpleName = n.getName();\n\t\t\t\t\tif (prefix.equals(simpleName)) {\n\t\t\t\t\t\t//We found a matching type name in the local hierarchy!\n\t\t\t\t\t\tList<String> outerNames = new ArrayList<String>();\n\t\t\t\t\t\twhile (true) {\n\t\t\t\t\t\t\tn = n.up();\n\t\t\t\t\t\t\tif (n == null || n.getKind() == Kind.COMPILATION_UNIT) break;\n\t\t\t\t\t\t\tif (n.getKind() == Kind.TYPE) outerNames.add(n.getName());\n\t\t\t\t\t\t\t//If our type has a parent that isn't either the CompilationUnit or another type, then we are\n\t\t\t\t\t\t\t//a method-local class or an anonymous inner class literal. These technically do have FQNs\n\t\t\t\t\t\t\t//and we may, with a lot of effort, figure out their name, but, that's some fairly horrible code\n\t\t\t\t\t\t\t//style and these methods have 'probable' in their name for a reason.\n\t\t\t\t\t\t\tbreak walkThroughCU;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tStringBuilder result = new StringBuilder();\n\t\t\t\t\t\tif (ast.getPackageDeclaration() != null) result.append(ast.getPackageDeclaration());\n\t\t\t\t\t\tif (result.length() > 0) result.append('.');\n\t\t\t\t\t\tCollections.reverse(outerNames);\n\t\t\t\t\t\tfor (String outerName : outerNames) result.append(outerName).append('.');\n\t\t\t\t\t\tresult.append(typeName);\n\t\t\t\t\t\treturn result.toString();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tn = n.up();\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* 2. Walk through non-star imports and search for a match. */ {\n\t\t\tif (prefix.equals(typeName)) {\n\t\t\t\tString fqn = ast.getImportList().getFullyQualifiedNameForSimpleName(typeName);\n\t\t\t\tif (fqn != null) return fqn;\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* 3. Walk through star imports and, if they start with \"java.\", use Class.forName based resolution. */ {\n\t\t\tfor (String potential : ast.getImportList().applyNameToStarImports(\"java\", typeName)) {\n\t\t\t\ttry {\n\t\t\t\t\tClass<?> c = Class.forName(potential);\n\t\t\t\t\tif (c != null) return c.getName();\n\t\t\t\t} catch (Throwable t) {\n\t\t\t\t\t//Class.forName failed for whatever reason - it most likely does not exist, continue.\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* 4. If the type name is a simple name, then our last guess is that it's another class in this package. */ {\n\t\t\tif (typeName.indexOf('.') == -1) return inLocalPackage(ast, typeName);\n\t\t}\n\t\t\n\t\t/* 5. It's either an FQN or a nested class in another class in our package. Use code conventions to guess. */ {\n\t\t\tchar firstChar = typeName.charAt(0);\n\t\t\tif (Character.isTitleCase(firstChar) || Character.isUpperCase(firstChar)) {\n\t\t\t\t//Class names start with uppercase letters, so presume it's a nested class in another class in our package.\n\t\t\t\treturn inLocalPackage(ast, typeName);\n\t\t\t}\n\t\t\t\n\t\t\t//Presume it's fully qualified.\n\t\t\treturn typeName;\n\t\t}\n\t}\n\t\n\tprivate static String inLocalPackage(LombokNode<?, ?, ?> node, String typeName) {\n\t\tStringBuilder result = new StringBuilder();\n\t\tif (node != null && node.getPackageDeclaration() != null) result.append(node.getPackageDeclaration());\n\t\tif (result.length() > 0) result.append('.');\n\t\tresult.append(typeName);\n\t\treturn result.toString();\n\t}\n\t\n\t/**\n\t * Creates an amalgamation where any values in this AnnotationValues that aren't explicit are 'enriched' by explicitly set stuff from {@code defaults}.\n\t * Note that this code may modify self and then returns self, or it returns defaults - do not rely on immutability nor on getting self.\n\t */\n\tpublic AnnotationValues<A> integrate(AnnotationValues<A> defaults) {\n\t\tif (values.isEmpty()) return defaults;\n\t\tfor (Map.Entry<String, AnnotationValue> entry : defaults.values.entrySet()) {\n\t\t\tif (!entry.getValue().isExplicit) continue;\n\t\t\tAnnotationValue existingValue = values.get(entry.getKey());\n\t\t\tif (existingValue != null && existingValue.isExplicit) continue;\n\t\t\tvalues.put(entry.getKey(), entry.getValue());\n\t\t}\n\t\treturn this;\n\t}\n\t\n\t/** Returns {@code true} if the annotation has zero parameters. */\n\tpublic boolean isMarking() {\n\t\tfor (AnnotationValue v : values.values()) if (v.isExplicit) return false;\n\t\treturn true;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/Augments.java",
    "content": "/*\n * Copyright (C) 2014 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\npublic final class Augments {\n\tprivate Augments() {\n\t\t// prevent instantiation\n\t}\n\t\n\tpublic static final FieldAugment<ClassLoader, Boolean> ClassLoader_lombokAlreadyAddedTo = FieldAugment.augment(ClassLoader.class, boolean.class, \"lombok$alreadyAddedTo\");\n}\n"
  },
  {
    "path": "src/core/lombok/core/CleanupRegistry.java",
    "content": "/*\n * Copyright (C) 2019 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.ConcurrentMap;\n\npublic class CleanupRegistry {\n\tprivate static final class CleanupKey {\n\t\tprivate final String key;\n\t\tprivate final Object target;\n\t\t\n\t\tCleanupKey(String key, Object target) {\n\t\t\tthis.key = key;\n\t\t\tthis.target = target;\n\t\t}\n\t\t\n\t\t@Override public boolean equals(Object other) {\n\t\t\tif (other == null) return false;\n\t\t\tif (other == this) return true;\n\t\t\tif (!(other instanceof CleanupKey)) return false;\n\t\t\tCleanupKey o = (CleanupKey) other;\n\t\t\tif (!key.equals(o.key)) return false;\n\t\t\treturn target == o.target;\n\t\t}\n\t\t\n\t\t@Override public int hashCode() {\n\t\t\treturn 109 * System.identityHashCode(target) + key.hashCode();\n\t\t}\n\t}\n\t\n\tprivate final ConcurrentMap<CleanupKey, CleanupTask> tasks = new ConcurrentHashMap<CleanupKey, CleanupTask>();\n\t\n\tpublic void registerTask(String key, Object target, CleanupTask task) {\n\t\tCleanupKey ck = new CleanupKey(key, target);\n\t\ttasks.putIfAbsent(ck, task);\n\t}\n\t\n\tpublic void run() {\n\t\tfor (CleanupTask task : tasks.values()) {\n\t\t\ttask.cleanup();\n\t\t}\n\t\ttasks.clear();\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/CleanupTask.java",
    "content": "/*\n * Copyright (C) 2019 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\npublic interface CleanupTask {\n\tvoid cleanup();\n}\n"
  },
  {
    "path": "src/core/lombok/core/DiagnosticsReceiver.java",
    "content": "/*\n * Copyright (C) 2009-2010 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\npublic interface DiagnosticsReceiver {\n\tDiagnosticsReceiver CONSOLE = new DiagnosticsReceiver() {\n\t\t@Override public void addError(String message) {\n\t\t\tSystem.err.println(\"Error: \" + message);\n\t\t}\n\t\t\n\t\t@Override public void addWarning(String message) {\n\t\t\tSystem.out.println(\"Warning: \" + message);\n\t\t}\n\t};\n\t\n\t/** Generate a compiler error on this node. */\n\tvoid addError(String message);\n\t\n\t/** Generate a compiler warning on this node. */\n\tvoid addWarning(String message);\n}\n"
  },
  {
    "path": "src/core/lombok/core/GuavaTypeMap.java",
    "content": "/*\n * Copyright (C) 2015 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic final class GuavaTypeMap {\n\tprivate static final Map<String, String> TYPE_TO_GUAVA_TYPE; static {\n\t\tMap<String, String> m = new HashMap<String, String>();\n\t\t\n\t\tm.put(\"java.util.NavigableSet\", \"ImmutableSortedSet\");\n\t\tm.put(\"java.util.NavigableMap\", \"ImmutableSortedMap\");\n\t\tm.put(\"java.util.SortedSet\", \"ImmutableSortedSet\");\n\t\tm.put(\"java.util.SortedMap\", \"ImmutableSortedMap\");\n\t\tm.put(\"java.util.Set\", \"ImmutableSet\");\n\t\tm.put(\"java.util.Map\", \"ImmutableMap\");\n\t\tm.put(\"java.util.Collection\", \"ImmutableList\");\n\t\tm.put(\"java.util.List\", \"ImmutableList\");\n\t\t\n\t\tm.put(\"com.google.common.collect.ImmutableSet\", \"ImmutableSet\");\n\t\tm.put(\"com.google.common.collect.ImmutableSortedSet\", \"ImmutableSortedSet\");\n\t\tm.put(\"com.google.common.collect.ImmutableMap\", \"ImmutableMap\");\n\t\tm.put(\"com.google.common.collect.ImmutableBiMap\", \"ImmutableBiMap\");\n\t\tm.put(\"com.google.common.collect.ImmutableSortedMap\", \"ImmutableSortedMap\");\n\t\tm.put(\"com.google.common.collect.ImmutableList\", \"ImmutableList\");\n\t\tm.put(\"com.google.common.collect.ImmutableCollection\", \"ImmutableList\");\n\t\tm.put(\"com.google.common.collect.ImmutableTable\", \"ImmutableTable\");\n\t\t\n\t\tTYPE_TO_GUAVA_TYPE = Collections.unmodifiableMap(m);\n\t}\n\t\n\tpublic static String getGuavaTypeName(String fqn) {\n\t\tString target = TYPE_TO_GUAVA_TYPE.get(fqn);\n\t\treturn target != null ? target : \"ImmutableList\";\n\t}\n\t\n\tprivate GuavaTypeMap() {}\n}\n"
  },
  {
    "path": "src/core/lombok/core/HandlerPriority.java",
    "content": "/*\n * Copyright (C) 2012 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Used to order the way handlers are run. Handlers with a lower priority value are run before handlers with higher priority values.\n * For example, {@code @Value} can cause the class to be marked final, and this affects the behaviour of {@code @EqualsAndHashCode}. By ensuring that\n * the handler for {@code @Value} always runs before the handler for {@code @EqualsAndHashCode}, the code is simpler: The {@code @EqualsAndHashCode} handler\n * does not have to check for the presence of a {@code @Value} annotation to determine whether to generate the {@code canEqual} method or not.\n * <p>\n * A new priority level can also be used to force a reset of the resolved model, i.e. to add generated methods to the symbol tables. Each platform implementation (javac, ecj, etc)\n * may have additional marker annotations required to indicate the need for the reset.\n */\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface HandlerPriority {\n\tint value();\n\t\n\t/**\n\t * This can be used to differentiate 2 handlers with the same value to be at a different handler priority anyway.\n\t * <strong>DO NOT USE THIS</strong> unless someone has been crowding out the numbers and there's no room left.\n\t */\n\tint subValue() default 0;\n}\n"
  },
  {
    "path": "src/core/lombok/core/ImportList.java",
    "content": "/*\n * Copyright (C) 2013-2020 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\nimport java.util.Collection;\n\npublic interface ImportList {\n\t/**\n\t * If there is an explicit import of the stated unqualified type name, return that. Otherwise, return null.\n\t */\n\tString getFullyQualifiedNameForSimpleName(String unqualified);\n\t\n\t/**\n\t * If there is an explicit import of the stated unqualified type name, return that. Otherwise, return null.\n\t * Do not translate the produced fully qualified name to the alias.\n\t */\n\tString getFullyQualifiedNameForSimpleNameNoAliasing(String unqualified);\n\t\n\t/**\n\t * Returns true if the package name is explicitly star-imported, OR the packageName refers to this source file's own package name, OR packageName is 'java.lang'.\n\t */\n\tboolean hasStarImport(String packageName);\n\t\n\t/**\n\t * Takes all explicit non-static star imports whose first element is equal to {@code startsWith}, replaces the star with {@code unqualified}, and returns these.\n\t */\n\tCollection<String> applyNameToStarImports(String startsWith, String unqualified);\n\t\n\tString applyUnqualifiedNameToPackage(String unqualified);\n}\n"
  },
  {
    "path": "src/core/lombok/core/JacksonAnnotationType.java",
    "content": "/*\n * Copyright (C) 2026 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\npublic enum JacksonAnnotationType {\n\tJSON_POJO_BUILDER2(\"com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder\"),\n\tJSON_POJO_BUILDER3(\"tools.jackson.databind.annotation.JsonPOJOBuilder\"),\n\tJSON_DESERIALIZE2(\"com.fasterxml.jackson.databind.annotation.JsonDeserialize\"),\n\tJSON_DESERIALIZE3(\"tools.jackson.databind.annotation.JsonDeserialize\"),\n\tJSON_PROPERTY2(\"com.fasterxml.jackson.annotation.JsonProperty\"),\n\tJSON_IGNORE2(\"com.fasterxml.jackson.annotation.JsonIgnore\"),\n\t;\n\t\n\tprivate final String qualifiedName;\n\tprivate final String[] qualifiedNameStringArr;\n\tprivate final char[][] qualifiedNameCharArrArr;\n\t\n\tprivate JacksonAnnotationType(final String qualifiedName) {\n\t\tthis.qualifiedName = qualifiedName;\n\t\tString[] parts = qualifiedName.split(\"\\\\.\");\n\t\tthis.qualifiedNameStringArr = parts;\n\t\tchar[][] caa = new char[parts.length][];\n\t\tfor (int i = 0; i < parts.length; i++) {\n\t\t\tcaa[i] = parts[i].toCharArray();\n\t\t}\n\t\tthis.qualifiedNameCharArrArr = caa;\n\t}\n\t\n\tpublic String getQualifiedName() {\n\t\treturn qualifiedName;\n\t}\n\t\n\t// Do not modify the returned array.\n\tpublic String[] getQualifiedNameAsStringArray() {\n\t\treturn qualifiedNameStringArr;\n\t}\n\t\n\t// Do not modify the returned array.\n\tpublic char[][] getQualifiednameAsCharArrayArray() {\n\t\treturn qualifiedNameCharArrArr;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/LombokApp.java",
    "content": "/*\n * Copyright (C) 2009 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\nimport java.util.Collections;\nimport java.util.List;\n\n/**\n * Implement this class, and add yourself as a provider for it, to become an app runnable by running lombok.jar as a jar.\n * \n * @see lombok.core.Main.VersionApp\n */\npublic abstract class LombokApp {\n\t/**\n\t * @param args The arguments; analogous to what's passed to {@code public static void main(String[] args)} methods.\n\t * @return The return value. Don't call {@code System.exit} yourself.\n\t */\n\tpublic abstract int runApp(List<String> args) throws Exception;\n\t\n\t/**\n\t * @return Your app name. For example {@code delombok}.\n\t */\n\tpublic abstract String getAppName();\n\t\n\t/**\n\t * @return Description of this app, for the command line.\n\t */\n\tpublic abstract String getAppDescription();\n\t\n\t/**\n\t * @return When lombok.jar is executed with any of these strings as first argument, your app will be started.\n\t */\n\tpublic List<String> getAppAliases() {\n\t\treturn Collections.emptyList();\n\t}\n\t\n\t/**\n\t * @return {@code true} if this app is an internal debugging tool and won't be listed by the default help message.\n\t */\n\tpublic boolean isDebugTool() {\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/LombokConfiguration.java",
    "content": "/*\n * Copyright (C) 2013-2018 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\nimport java.net.URI;\nimport java.util.Collections;\n\nimport lombok.core.configuration.BubblingConfigurationResolver;\nimport lombok.core.configuration.ConfigurationFileToSource;\nimport lombok.core.configuration.ConfigurationKey;\nimport lombok.core.configuration.ConfigurationParser;\nimport lombok.core.configuration.ConfigurationProblemReporter;\nimport lombok.core.configuration.ConfigurationResolver;\nimport lombok.core.configuration.ConfigurationResolverFactory;\nimport lombok.core.configuration.FileSystemSourceCache;\n\npublic class LombokConfiguration {\n\tprivate static final ConfigurationResolver NULL_RESOLVER = new ConfigurationResolver() {\n\t\t@SuppressWarnings(\"unchecked\") @Override public <T> T resolve(ConfigurationKey<T> key) {\n\t\t\tif (key.getType().isList()) return (T) Collections.emptyList();\n\t\t\treturn null;\n\t\t}\n\t};\n\t\n\tprivate static FileSystemSourceCache cache = new FileSystemSourceCache();\n\tprivate static ConfigurationResolverFactory configurationResolverFactory;\n\t\n\tstatic {\n\t\tif (System.getProperty(\"lombok.disableConfig\") != null) {\n\t\t\tconfigurationResolverFactory = new ConfigurationResolverFactory() {\n\t\t\t\t@Override public ConfigurationResolver createResolver(URI sourceLocation) {\n\t\t\t\t\treturn NULL_RESOLVER;\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\telse {\n\t\t\tconfigurationResolverFactory = createFileSystemBubblingResolverFactory();\n\t\t}\n\t}\n\t\n\tprivate LombokConfiguration() {\n\t\t// prevent instantiation\n\t}\n\t\n\tpublic static void overrideConfigurationResolverFactory(ConfigurationResolverFactory crf) {\n\t\tconfigurationResolverFactory = crf == null ? createFileSystemBubblingResolverFactory() : crf;\n\t}\n\t\n\tstatic <T> T read(ConfigurationKey<T> key, AST<?, ?, ?> ast) {\n\t\treturn read(key, ast.getAbsoluteFileLocation());\n\t}\n\t\n\tpublic static <T> T read(ConfigurationKey<T> key, URI sourceLocation) {\n\t\treturn configurationResolverFactory.createResolver(sourceLocation).resolve(key);\n\t}\n\t\n\tprivate static ConfigurationResolverFactory createFileSystemBubblingResolverFactory() {\n\t\tfinal ConfigurationFileToSource fileToSource = cache.fileToSource(new ConfigurationParser(ConfigurationProblemReporter.CONSOLE));\n\t\treturn new ConfigurationResolverFactory() {\n\t\t\t@Override public ConfigurationResolver createResolver(URI sourceLocation) {\n\t\t\t\treturn new BubblingConfigurationResolver(cache.forUri(sourceLocation), fileToSource);\n\t\t\t}\n\t\t};\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/LombokInternalAliasing.java",
    "content": "/*\n * Copyright (C) 2013-2019 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic class LombokInternalAliasing {\n\tpublic static final Map<String, String> ALIASES;\n\tpublic static final Map<String, Collection<String>> REVERSE_ALIASES;\n\t\n\t/**\n\t * Provide a fully qualified name (FQN), and the canonical version of this is returned.\n\t */\n\tpublic static String processAliases(String in) {\n\t\tif (in == null) return null;\n\t\tString ret = ALIASES.get(in);\n\t\treturn ret == null ? in : ret;\n\t}\n\t\n\tstatic {\n\t\tMap<String, String> m1 = new HashMap<String, String>();\n\t\tm1.put(\"lombok.experimental.Value\", \"lombok.Value\");\n\t\tm1.put(\"lombok.experimental.Builder\", \"lombok.Builder\");\n\t\tm1.put(\"lombok.experimental.var\", \"lombok.var\");\n\t\tm1.put(\"lombok.Delegate\", \"lombok.experimental.Delegate\");\n\t\tm1.put(\"lombok.experimental.Wither\", \"lombok.With\");\n\t\tALIASES = Collections.unmodifiableMap(m1);\n\t\t\n\t\tMap<String, Collection<String>> m2 = new HashMap<String, Collection<String>>();\n\t\tfor (Map.Entry<String, String> e : m1.entrySet()) {\n\t\t\tCollection<String> c = m2.get(e.getValue());\n\t\t\tif (c == null) {\n\t\t\t\tm2.put(e.getValue(), Collections.singleton(e.getKey()));\n\t\t\t} else if (c.size() == 1) {\n\t\t\t\tCollection<String> newC = new ArrayList<String>(2);\n\t\t\t\tnewC.addAll(c);\n\t\t\t\tm2.put(e.getValue(), c);\n\t\t\t} else {\n\t\t\t\tc.add(e.getKey());\n\t\t\t}\n\t\t}\n\t\tfor (Map.Entry<String, Collection<String>> e : m2.entrySet()) {\n\t\t\tCollection<String> c = e.getValue();\n\t\t\tif (c.size() > 1) e.setValue(Collections.unmodifiableList((ArrayList<String>) c));\n\t\t}\n\t\tREVERSE_ALIASES = Collections.unmodifiableMap(m2);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/LombokNode.java",
    "content": "/*\n * Copyright (C) 2009-2020 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\nimport java.lang.annotation.Annotation;\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.IdentityHashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport lombok.core.AST.Kind;\n\n/**\n * An instance of this class wraps an Eclipse/javac internal node object.\n * \n * @param A Type of our owning AST.\n * @param L self-type.\n * @param N The common type of all AST nodes in the internal representation of the target platform.\n *          For example, JCTree for javac, and ASTNode for Eclipse.\n */\npublic abstract class LombokNode<A extends AST<A, L, N>, L extends LombokNode<A, L, N>, N> implements DiagnosticsReceiver {\n\tprotected final Kind kind;\n\tprotected final N node;\n\tprotected LombokImmutableList<L> children;\n\tprotected L parent;\n\t\n\t/** structurally significant are those nodes that can be annotated in java 1.6 or are method-like toplevels,\n\t * so fields, local declarations, method arguments, methods, types, the Compilation Unit itself, and initializers. */\n\tprotected boolean isStructurallySignificant;\n\t\n\t/**\n\t * Creates a new Node object that represents the provided node.\n\t * \n\t * @param ast The owning AST - this node is part of this AST's tree of nodes.\n\t * @param node The AST object in the target parser's own internal AST tree that this node object will represent.\n\t * @param children A list of child nodes. Passing in null results in the children list being empty, not null.\n\t * @param kind The kind of node represented by this object.\n\t */\n\t@SuppressWarnings(\"unchecked\")\n\tprotected LombokNode(N node, List<L> children, Kind kind) {\n\t\tthis.kind = kind;\n\t\tthis.node = node;\n\t\tthis.children = children != null ? LombokImmutableList.copyOf(children) : LombokImmutableList.<L>of();\n\t\tfor (L child : this.children) {\n\t\t\tchild.parent = (L) this;\n\t\t\tif (!child.isStructurallySignificant)\n\t\t\t\tchild.isStructurallySignificant = calculateIsStructurallySignificant(node);\n\t\t}\n\t\tthis.isStructurallySignificant = calculateIsStructurallySignificant(null);\n\t}\n\t\n\tpublic abstract A getAst();\n\t\n\t/** {@inheritDoc} */\n\t@Override public String toString() {\n\t\treturn String.format(\"NODE %s (%s) %s\",\n\t\t\t\tkind, node == null ? \"(NULL)\" : node.getClass(), node == null ? \"\" : node);\n\t}\n\t\n\t/**\n\t * Convenient shortcut to the owning ast object's {@code getPackageDeclaration} method.\n\t * \n\t * @see AST#getPackageDeclaration()\n\t */\n\tpublic String getPackageDeclaration() {\n\t\treturn getAst().getPackageDeclaration();\n\t}\n\t\n\t/**\n\t * Convenient shortcut to the owning ast object's {@code getImportList} method.\n\t * \n\t * @see AST#getImportList()\n\t */\n\tpublic ImportList getImportList() {\n\t\treturn getAst().getImportList();\n\t}\n\t\n\t/**\n\t * Convenient shortcut to the owning ast object's {@code getImportListAsTypeResolver} method.\n\t * \n\t * @see AST#getImportListAsTypeResolver()\n\t */\n\tpublic TypeResolver getImportListAsTypeResolver() {\n\t\treturn getAst().getImportListAsTypeResolver();\n\t}\n\t\n\t/**\n\t * See {@link #isStructurallySignificant}.\n\t */\n\tprotected abstract boolean calculateIsStructurallySignificant(N parent);\n\t\n\t/**\n\t * Convenient shortcut to the owning ast object's get method.\n\t * \n\t * @see AST#get(Object)\n\t */\n\tpublic L getNodeFor(N obj) {\n\t\treturn getAst().get(obj);\n\t}\n\t\n\t/**\n\t * @return The javac/Eclipse internal AST object wrapped by this LombokNode object.\n\t */\n\tpublic N get() {\n\t\treturn node;\n\t}\n\t\n\tpublic Kind getKind() {\n\t\treturn kind;\n\t}\n\t\n\t/**\n\t * Return the name of your type (simple name), method, field, or local variable. Return null if this\n\t * node doesn't really have a name, such as initializers, while statements, etc.\n\t */\n\tpublic abstract String getName();\n\t\n\t/** Returns the structurally significant node that encloses this one.\n\t * \n\t * @see #isStructurallySignificant()\n\t */\n\tpublic L up() {\n\t\tL result = parent;\n\t\twhile (result != null && !result.isStructurallySignificant) result = result.parent;\n\t\treturn result;\n\t}\n\t\n\t/**\n\t * {@code @Foo int x, y;} is stored in both javac and ecj as 2 FieldDeclarations, both with the same annotation as child.\n\t * The normal {@code up()} method can't handle having multiple parents, but this one can.\n\t */\n\tpublic Collection<L> upFromAnnotationToFields() {\n\t\tif (getKind() != Kind.ANNOTATION) return Collections.emptyList();\n\t\tL field = up();\n\t\tif (field == null || field.getKind() != Kind.FIELD) return Collections.emptyList();\n\t\tL type = field.up();\n\t\tif (type == null || type.getKind() != Kind.TYPE) return Collections.emptyList();\n\t\t\n\t\tList<L> fields = new ArrayList<L>();\n\t\tfor (L potentialField : type.down()) {\n\t\t\tif (potentialField.getKind() != Kind.FIELD) continue;\n\t\t\tfor (L child : potentialField.down()) {\n\t\t\t\tif (child.getKind() != Kind.ANNOTATION) continue;\n\t\t\t\tif (child.get() == get()) fields.add(potentialField);\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn fields;\n\t}\n\t\n\t/**\n\t * Returns the direct parent node in the AST tree of this node. For example, a local variable declaration's\n\t * direct parent can be e.g. an If block, but its {@code up()} {@code LombokNode} is the {@code Method} that contains it.\n\t */\n\tpublic L directUp() {\n\t\treturn parent;\n\t}\n\t\n\t/**\n\t * Returns all children nodes.\n\t */\n\tpublic LombokImmutableList<L> down() {\n\t\treturn children;\n\t}\n\t\n\t/**\n\t * Convenient shortcut to the owning ast object's getLatestJavaSpecSupported method.\n\t * \n\t * @see AST#getLatestJavaSpecSupported()\n\t */\n\tpublic int getLatestJavaSpecSupported() {\n\t\treturn getAst().getLatestJavaSpecSupported();\n\t}\n\t\n\t/**\n\t * Convenient shortcut to the owning ast object's getSourceVersion method.\n\t * \n\t * @see AST#getSourceVersion()\n\t */\n\tpublic int getSourceVersion() {\n\t\treturn getAst().getSourceVersion();\n\t}\n\t\n\t/**\n\t * Convenient shortcut to the owning ast object's top method.\n\t * \n\t * @see AST#top()\n\t */\n\tpublic L top() {\n\t\treturn getAst().top();\n\t}\n\t\n\t/**\n\t * Convenient shortcut to the owning ast object's getFileName method.\n\t * \n\t * @see AST#getFileName()\n\t */\n\tpublic String getFileName() {\n\t\treturn getAst().getFileName();\n\t}\n\t\n\t/**\n\t * Adds the stated node as a direct child of this node.\n\t * \n\t * Does not change the underlying (javac/Eclipse) AST, only the wrapped view.\n\t */\n\t@SuppressWarnings({\"unchecked\"})\n\tpublic L add(N newChild, Kind newChildKind) {\n\t\tgetAst().setChanged();\n\t\tL n = getAst().buildTree(newChild, newChildKind);\n\t\tif (n == null) return null;\n\t\tn.parent = (L) this;\n\t\tchildren = children.append(n);\n\t\treturn n;\n\t}\n\t\n\t/**\n\t * Reparses the AST node represented by this node. Any existing nodes that occupy a different space in the AST are rehomed, any\n\t * nodes that no longer exist are removed, and new nodes are created.\n\t * \n\t * Careful - the node you call this on must not itself have been removed or rehomed - it rebuilds <i>all children</i>.\n\t */\n\tpublic void rebuild() {\n\t\tMap<N, L> oldNodes = new IdentityHashMap<N, L>();\n\t\tgatherAndRemoveChildren(oldNodes);\n\t\t\n\t\tL newNode = getAst().buildTree(get(), kind);\n\t\t\n\t\tgetAst().setChanged();\n\t\t\n\t\tgetAst().replaceNewWithExistingOld(oldNodes, newNode);\n\t}\n\t\n\t@SuppressWarnings({\"unchecked\", \"rawtypes\"})\n\tprivate void gatherAndRemoveChildren(Map<N, L> map) {\n\t\tfor (LombokNode child : children) child.gatherAndRemoveChildren(map);\n\t\tgetAst().identityDetector.remove(get());\n\t\tmap.put(get(), (L) this);\n\t\tchildren = LombokImmutableList.of();\n\t\tgetAst().getNodeMap().remove(get());\n\t}\n\t\n\t/**\n\t * Removes the stated node, which must be a direct child of this node, from the AST.\n\t * \n\t * Does not change the underlying (javac/Eclipse) AST, only the wrapped view.\n\t */\n\tpublic void removeChild(L child) {\n\t\tgetAst().setChanged();\n\t\tchildren = children.removeElement(child);\n\t}\n\t\n\t/**\n\t * Structurally significant means: LocalDeclaration, TypeDeclaration, MethodDeclaration, ConstructorDeclaration,\n\t * FieldDeclaration, Initializer, and CompilationUnitDeclaration.\n\t * The rest is e.g. if statements, while loops, etc.\n\t */\n\tpublic boolean isStructurallySignificant() {\n\t\treturn isStructurallySignificant;\n\t}\n\t\n\tpublic abstract boolean hasAnnotation(Class<? extends Annotation> type);\n\tpublic abstract <Z extends Annotation> AnnotationValues<Z> findAnnotation(Class<Z> type);\n\t\n\tpublic abstract boolean isStatic();\n\tpublic abstract boolean isFinal();\n\tpublic abstract boolean isTransient();\n\tpublic abstract boolean isPrimitive();\n\tpublic abstract boolean isEnumMember();\n\tpublic abstract boolean isEnumType();\n\t\n\t/**\n\t * The 'type' of the field or method, or {@code null} if this node is neither.\n\t * \n\t * The type is as it is written in the code (no resolution), includes array dimensions, \n\t * but not necessarily generics.\n\t * \n\t * The main purpose of this method is to verify this type against a list of known types,\n\t * like primitives or primitive wrappers.\n\t * \n\t * @return The 'type' of the field or method, or {@code null} if this node is neither.\n\t */\n\tpublic abstract String fieldOrMethodBaseType();\n\t\n\tpublic abstract int countMethodParameters();\n\t\n\tpublic abstract int getStartPos();\n}\n"
  },
  {
    "path": "src/core/lombok/core/Main.java",
    "content": "/*\n * Copyright (C) 2009-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.PrintStream;\nimport java.util.Arrays;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.List;\n\nimport lombok.spi.Provides;\n\npublic class Main {\n\tprivate static final Collection<?> HELP_SWITCHES = Collections.unmodifiableList(Arrays.asList(\n\t\t\t\"/?\", \"/h\", \"/help\", \"-h\", \"-help\", \"--help\", \"help\", \"h\"\n\t));\n\t\n\tpublic static void main(String[] args) throws IOException {\n\t\tThread.currentThread().setContextClassLoader(Main.class.getClassLoader());\n\t\tint err = new Main(SpiLoadUtil.readAllFromIterator(\n\t\t\t\tSpiLoadUtil.findServices(LombokApp.class)), Arrays.asList(args)).go();\n\t\tif (err != 0) {\n\t\t\tSystem.exit(err);\n\t\t}\n\t}\n\t\n\t@Provides\n\tpublic static class VersionApp extends LombokApp {\n\t\t@Override public String getAppName() {\n\t\t\treturn \"version\";\n\t\t}\n\t\t\n\t\t@Override public String getAppDescription() {\n\t\t\treturn \"prints lombok's version.\";\n\t\t}\n\t\t\n\t\t@Override public List<String> getAppAliases() {\n\t\t\treturn Arrays.asList(\"-version\", \"--version\");\n\t\t}\n\t\t\n\t\t@Override public int runApp(List<String> args) {\n\t\t\tSystem.out.println(Version.getFullVersion());\n\t\t\treturn 0;\n\t\t}\n\t}\n\t\n\t@Provides\n\tpublic static class LicenseApp extends LombokApp {\n\t\t@Override public String getAppName() {\n\t\t\treturn \"license\";\n\t\t}\n\t\t\n\t\t@Override public String getAppDescription() {\n\t\t\treturn \"prints license information.\";\n\t\t}\n\t\t\n\t\t@Override public List<String> getAppAliases() {\n\t\t\treturn Arrays.asList(\"licence\", \"copyright\", \"copyleft\", \"gpl\");\n\t\t}\n\t\t\n\t\t@Override public int runApp(List<String> args) {\n\t\t\ttry {\n\t\t\t\tInputStream in = Main.class.getResourceAsStream(\"/LICENSE\");\n\t\t\t\ttry {\n\t\t\t\t\tByteArrayOutputStream out = new ByteArrayOutputStream();\n\t\t\t\t\tbyte[] b = new byte[65536];\n\t\t\t\t\twhile (true) {\n\t\t\t\t\t\tint r = in.read(b);\n\t\t\t\t\t\tif (r == -1) break;\n\t\t\t\t\t\tout.write(b, 0, r);\n\t\t\t\t\t}\n\t\t\t\t\tSystem.out.println(new String(out.toByteArray()));\n\t\t\t\t\treturn 0;\n\t\t\t\t} finally {\n\t\t\t\t\tin.close();\n\t\t\t\t}\n\t\t\t} catch (Exception e) {\n\t\t\t\tSystem.err.println(\"License file not found. Check https://projectlombok.org/LICENSE\");\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate final List<LombokApp> apps;\n\tprivate final List<String> args;\n\t\n\tpublic Main(List<LombokApp> apps, List<String> args) {\n\t\tthis.apps = apps;\n\t\tthis.args = args;\n\t}\n\t\n\tpublic int go() {\n\t\tif (!args.isEmpty() && HELP_SWITCHES.contains(args.get(0))) {\n\t\t\tprintHelp(null, System.out);\n\t\t\treturn 0;\n\t\t}\n\t\t\n\t\tString command = args.isEmpty() ? \"\" : args.get(0).trim();\n\t\tif (command.startsWith(\"--\")) command = command.substring(2);\n\t\telse if (command.startsWith(\"-\")) command = command.substring(1);\n\t\t\n\t\tList<String> subArgs = args.isEmpty() ? Collections.<String>emptyList() : Collections.unmodifiableList(\n\t\t\t\targs.subList(1, args.size()));\n\t\t\n\t\tfor (LombokApp app : apps) {\n\t\t\tif (app.getAppName().equals(command) || app.getAppAliases().contains(command)) {\n\t\t\t\ttry {\n\t\t\t\t\treturn app.runApp(subArgs);\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t\te.printStackTrace();\n\t\t\t\t\treturn 5;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tprintHelp(\"Unknown command: \" + command, System.err);\n\t\treturn 1;\n\t}\n\t\n\tpublic void printHelp(String message, PrintStream out) {\n\t\tif (message != null) {\n\t\t\tout.println(message);\n\t\t\tout.println(\"------------------------------\");\n\t\t}\n\t\tout.println(\"projectlombok.org \" + Version.getFullVersion());\n\t\tout.println(\"Copyright (C) 2009-2021 The Project Lombok Authors.\");\n\t\tout.println(\"Run 'lombok license' to see the lombok license agreement.\");\n\t\tout.println();\n\t\tout.println(\"Run lombok without any parameters to start the graphical installer.\");\n\t\tout.println(\"Other available commands:\");\n\t\tfor (LombokApp app : apps) {\n\t\t\tif (app.isDebugTool()) continue;\n\t\t\tString[] desc = app.getAppDescription().split(\"\\n\");\n\t\t\tfor (int i = 0; i < desc.length; i++) {\n\t\t\t\tout.printf(\"  %15s    %s\\n\", i == 0 ? app.getAppName() : \"\", desc[i]);\n\t\t\t}\n\t\t}\n\t\tout.println();\n\t\tout.println(\"Run lombok commandName --help for more info on each command.\");\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/PostCompiler.java",
    "content": "/*\n * Copyright (C) 2010-2019 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.IOException;\nimport java.io.OutputStream;\nimport java.io.PrintWriter;\nimport java.io.StringWriter;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.concurrent.atomic.AtomicBoolean;\n\npublic final class PostCompiler {\n\tprivate PostCompiler() {/* prevent instantiation*/};\n\t\n\tprivate static List<PostCompilerTransformation> transformations;\n\t\n\tpublic static byte[] applyTransformations(byte[] original, String fileName, DiagnosticsReceiver diagnostics) {\n\t\tif (System.getProperty(\"lombok.disablePostCompiler\", null) != null) return original;\n\t\tinit(diagnostics);\n\t\tbyte[] previous = original;\n\t\tfor (PostCompilerTransformation transformation : transformations) {\n\t\t\ttry {\n\t\t\t\tbyte[] next = transformation.applyTransformations(previous, fileName, diagnostics);\n\t\t\t\tif (next != null) {\n\t\t\t\t\tprevious = next;\n\t\t\t\t}\n\t\t\t} catch (Exception e) {\n\t\t\t\tStringWriter sw = new StringWriter();\n\t\t\t\te.printStackTrace(new PrintWriter(sw, true));\n\t\t\t\tdiagnostics.addError(String.format(\"Error during the transformation of '%s'; post-compiler '%s' caused an exception: %s\", fileName, transformation.getClass().getName(), sw));\n\t\t\t}\n\t\t}\n\t\treturn previous;\n\t}\n\t\n\tprivate static synchronized void init(DiagnosticsReceiver diagnostics) {\n\t\tif (transformations != null) return;\n\t\ttry {\n\t\t\ttransformations = SpiLoadUtil.readAllFromIterator(SpiLoadUtil.findServices(PostCompilerTransformation.class, PostCompilerTransformation.class.getClassLoader()));\n\t\t} catch (IOException e) {\n\t\t\ttransformations = Collections.emptyList();\n\t\t\tStringWriter sw = new StringWriter();\n\t\t\te.printStackTrace(new PrintWriter(sw, true));\n\t\t\tdiagnostics.addError(\"Could not load post-compile transformers: \" + e.getMessage() + \"\\n\" + sw.toString());\n\t\t}\n\t}\n\t\n\tpublic static OutputStream wrapOutputStream(final OutputStream originalStream, final String fileName, final DiagnosticsReceiver diagnostics) throws IOException {\n\t\tif (System.getProperty(\"lombok.disablePostCompiler\", null) != null) return originalStream;\n\t\t\n\t\t// close() can be called more than once and should be idempotent, therefore, ensure we never transform more than once.\n\t\tfinal AtomicBoolean closed = new AtomicBoolean();\n\t\t\n\t\treturn new ByteArrayOutputStream() {\n\t\t\t@Override public void close() throws IOException {\n\t\t\t\tif (closed.getAndSet(true)) {\n\t\t\t\t\toriginalStream.close();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// no need to call super\n\t\t\t\tbyte[] original = toByteArray();\n\t\t\t\tbyte[] copy = null;\n\t\t\t\tif (original.length > 0) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tcopy = applyTransformations(original, fileName, diagnostics);\n\t\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t\tdiagnostics.addWarning(String.format(\"Error during the transformation of '%s'; no post-compilation has been applied\", fileName));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (copy == null) {\n\t\t\t\t\tcopy = original;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Exceptions below should bubble\n\t\t\t\toriginalStream.write(copy);\n\t\t\t\toriginalStream.close(); \n\t\t\t}\n\t\t};\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/PostCompilerTransformation.java",
    "content": "/*\n * Copyright (C) 2010 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\npublic interface PostCompilerTransformation {\n\tbyte[] applyTransformations(byte[] original, String fileName, DiagnosticsReceiver diagnostics);\n}\n"
  },
  {
    "path": "src/core/lombok/core/PrintAST.java",
    "content": "/*\n * Copyright (C) 2009-2012 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Will print the tree structure of annotated node and all its children.\n * \n * This annotation is useful only for those working on Lombok, for example to test if a Lombok handlers is doing its\n * job correctly, or to see what the imagined endresult of a transformation is supposed to look like.\n */\n@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.LOCAL_VARIABLE, ElementType.METHOD, ElementType.TYPE})\n@Retention(RetentionPolicy.SOURCE)\npublic @interface PrintAST {\n\t/**\n\t * Normally, the AST is printed to standard out, but you can pick a filename instead. Useful for many IDEs\n\t * which don't have a console unless you start them from the command line.\n\t */\n\tString outfile() default \"\";\n\t\n\t/**\n\t * Sets whether to print node structure (false) or generated java code (true).\n\t * \n\t * By setting printContent to true, the annotated element's java code representation is printed. If false,\n\t * its node structure (e.g. node classname) is printed, and this process is repeated for all children.\n\t */\n\tboolean printContent() default false;\n\t\n\t/**\n\t * if {@code true} prints the start and end position of each node.\n\t */\n\tboolean printPositions() default false;\n}\n"
  },
  {
    "path": "src/core/lombok/core/PublicApiCreatorApp.java",
    "content": "/*\n * Copyright (C) 2012-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.OutputStream;\nimport java.util.ArrayList;\nimport java.util.Enumeration;\nimport java.util.List;\nimport java.util.jar.JarEntry;\nimport java.util.jar.JarFile;\nimport java.util.jar.JarOutputStream;\nimport java.util.zip.ZipEntry;\n\nimport lombok.Lombok;\nimport lombok.patcher.ClassRootFinder;\nimport lombok.spi.Provides;\n\n@Provides\npublic class PublicApiCreatorApp extends LombokApp {\n\t@Override public String getAppName() {\n\t\treturn \"publicApi\";\n\t}\n\t\n\t@Override public String getAppDescription() {\n\t\treturn \"Creates a small lombok-api.jar with the annotations and other public API\\n\" +\n\t\t\t\t\"classes of all lombok features. This is primarily useful to include in your\\n\" +\n\t\t\t\t\"android projects.\";\n\t}\n\t\n\t@Override public int runApp(List<String> rawArgs) throws Exception {\n\t\tString loc = \".\";\n\t\tswitch (rawArgs.size()) {\n\t\tcase 0: break;\n\t\tcase 1: loc = rawArgs.get(0); break;\n\t\tdefault:\n\t\t\tSystem.err.println(\"Supply 1 path to specify the directory where lombok-api.jar will be created. No path means the current directory is used.\");\n\t\t\treturn 1;\n\t\t}\n\t\t\n\t\tFile out = new File(loc, \"lombok-api.jar\");\n\t\tint errCode = 0;\n\t\ttry {\n\t\t\terrCode = writeApiJar(out);\n\t\t} catch (Exception e) {\n\t\t\tSystem.err.println(\"ERROR: Creating \" + canonical(out) + \" failed: \");\n\t\t\te.printStackTrace();\n\t\t\treturn 1;\n\t\t}\n\t\t\n\t\treturn errCode;\n\t}\n\t\n\t/**\n\t * Returns a File object pointing to our own jar file. Will obviously fail if the installer was started via\n\t * a jar that wasn't accessed via the file-system, or if its started via e.g. unpacking the jar.\n\t */\n\tprivate static File findOurJar() {\n\t\treturn new File(ClassRootFinder.findClassRootOfClass(PublicApiCreatorApp.class));\n\t}\n\t\n\tprivate int writeApiJar(File outFile) throws Exception {\n\t\tFile selfRaw = findOurJar();\n\t\tif (selfRaw == null) {\n\t\t\tSystem.err.println(\"The publicApi option only works if lombok is a jar.\");\n\t\t\treturn 2;\n\t\t}\n\t\t\n\t\tList<String> toCopy = new ArrayList<String>();\n\t\tJarFile self = new JarFile(selfRaw);\n\t\ttry {\n\t\t\tEnumeration<JarEntry> entries = self.entries();\n\t\t\t\n\t\t\twhile (entries.hasMoreElements()) {\n\t\t\t\tJarEntry entry = entries.nextElement();\n\t\t\t\tString name = entry.getName();\n\t\t\t\tif (!name.startsWith(\"lombok/\")) continue;\n\t\t\t\tif (name.endsWith(\"/package-info.class\")) continue;\n\t\t\t\tif (!name.endsWith(\".class\")) continue;\n\t\t\t\t\n\t\t\t\tString subName = name.substring(7, name.length() - 6);\n\t\t\t\tint firstSlash = subName.indexOf('/');\n\t\t\t\tif (firstSlash == -1) {\n\t\t\t\t\t// direct member of the lombok package.\n\t\t\t\t\tif (!subName.startsWith(\"ConfigurationKeys\")) toCopy.add(name);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tString topPkg = subName.substring(0, firstSlash);\n\t\t\t\tif (\"extern\".equals(topPkg) || \"experimental\".equals(topPkg)) {\n\t\t\t\t\ttoCopy.add(name);\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tself.close();\n\t\t}\n\t\t\n\t\tif (toCopy.isEmpty()) {\n\t\t\tSystem.out.println(\"Not generating lombok-api.jar: No lombok api classes required!\");\n\t\t\treturn 1;\n\t\t}\n\t\t\n\t\tOutputStream out = new FileOutputStream(outFile);\n\t\tboolean success = false;\n\t\ttry {\n\t\t\tJarOutputStream jar = new JarOutputStream(out);\n\t\t\tfor (String resourceName : toCopy) {\n\t\t\t\tInputStream in = Lombok.class.getResourceAsStream(\"/\" + resourceName);\n\t\t\t\ttry {\n\t\t\t\t\tif (in == null) {\n\t\t\t\t\t\tthrow new Fail(String.format(\"api class %s cannot be found\", resourceName));\n\t\t\t\t\t}\n\t\t\t\t\twriteIntoJar(jar, resourceName, in);\n\t\t\t\t} finally {\n\t\t\t\t\tif (in != null) in.close();\n\t\t\t\t}\n\t\t\t}\n\t\t\tjar.close();\n\t\t\tout.close();\n\t\t\t\n\t\t\tSystem.out.println(\"Successfully created: \" + canonical(outFile));\n\t\t\t\n\t\t\treturn 0;\n\t\t} catch (Throwable t) {\n\t\t\ttry { out.close();} catch (Throwable ignore) {}\n\t\t\tif (!success) outFile.delete();\n\t\t\tif (t instanceof Fail) {\n\t\t\t\tSystem.err.println(t.getMessage());\n\t\t\t\treturn 1;\n\t\t\t} else if (t instanceof Exception) {\n\t\t\t\tthrow (Exception)t;\n\t\t\t} else if (t instanceof Error) {\n\t\t\t\tthrow (Error)t;\n\t\t\t} else {\n\t\t\t\tthrow new Exception(t);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate void writeIntoJar(JarOutputStream jar, String resourceName, InputStream in) throws IOException {\n\t\tjar.putNextEntry(new ZipEntry(resourceName));\n\t\tbyte[] b = new byte[65536];\n\t\twhile (true) {\n\t\t\tint r = in.read(b);\n\t\t\tif (r == -1) break;\n\t\t\tjar.write(b, 0, r);\n\t\t}\n\t\tjar.closeEntry();\n\t\tin.close();\n\t}\n\t\n\tprivate static class Fail extends Exception {\n\t\tFail(String message) {\n\t\t\tsuper(message);\n\t\t}\n\t}\n\t\n\tprivate static String canonical(File out) {\n\t\ttry {\n\t\t\treturn out.getCanonicalPath();\n\t\t} catch (Exception e) {\n\t\t\treturn out.getAbsolutePath();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/TypeLibrary.java",
    "content": "/*\n * Copyright (C) 2009-2019 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\nimport java.util.Arrays;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * Library of types, which can be used to look up potential matching types.\n * \n * For example, if you put {@code foo.Spork} and {@code bar.Spork} into the library, and then ask for\n * all compatible types given the type {@code Spork}, you'll get both of them, but you'll only\n * get the one if you ask for compatible types given {@code foo.Spork}.\n * <p>\n * When adding {@code foo.Spork}, that FQN (Fully Qualified Name) will be returned as an option for any of these queries:\n * <ul><li>foo.Spork</li><li>Spork</li><li>foo.*</li></ul>\n */\npublic class TypeLibrary {\n\tprivate final Map<String, Object> unqualifiedToQualifiedMap; // maps to usually a string, but could be a string array in aliasing cases.\n\tprivate final String unqualified, qualified;\n\tprivate boolean locked;\n\t\n\tpublic TypeLibrary() {\n\t\tunqualifiedToQualifiedMap = new HashMap<String, Object>();\n\t\tunqualified = null;\n\t\tqualified = null;\n\t}\n\t\n\tpublic TypeLibrary(TypeLibrary parent) {\n\t\tunqualifiedToQualifiedMap = new HashMap<String, Object>();\n\t\tunqualified = null;\n\t\tqualified = null;\n\t}\n\t\n\tpublic void lock() {\n\t\tthis.locked = true;\n\t}\n\t\n\tprivate TypeLibrary(String fqnSingleton) {\n\t\tif (fqnSingleton.indexOf(\"$\") != -1) {\n\t\t\tunqualifiedToQualifiedMap = new HashMap<String, Object>();\n\t\t\tunqualified = null;\n\t\t\tqualified = null;\n\t\t\taddType(fqnSingleton);\n\t\t} else {\n\t\t\tunqualifiedToQualifiedMap = null;\n\t\t\tqualified = fqnSingleton;\n\t\t\tint idx = fqnSingleton.lastIndexOf('.');\n\t\t\tif (idx == -1) {\n\t\t\t\tunqualified = fqnSingleton;\n\t\t\t} else {\n\t\t\t\tunqualified = fqnSingleton.substring(idx + 1);\n\t\t\t}\n\t\t}\n\t\tlocked = true;\n\t}\n\t\n\tpublic static TypeLibrary createLibraryForSingleType(String fqnSingleton) {\n\t\tif (LombokInternalAliasing.REVERSE_ALIASES.containsKey(fqnSingleton)) {\n\t\t\t// Internal aliasing is a little too complex to handle with the map-less 'efficient' implementation.\n\t\t\tTypeLibrary tl = new TypeLibrary();\n\t\t\ttl.addType(fqnSingleton);\n\t\t\ttl.lock();\n\t\t\treturn tl;\n\t\t}\n\t\t\n\t\treturn new TypeLibrary(fqnSingleton);\n\t}\n\t\n\t/**\n\t * Add a type to the library.\n\t * \n\t * @param fullyQualifiedTypeName the FQN type name, such as 'java.lang.String'.\n\t */\n\tpublic void addType(String fullyQualifiedTypeName) {\n\t\tCollection<String> oldNames = LombokInternalAliasing.REVERSE_ALIASES.get(fullyQualifiedTypeName);\n\t\tif (oldNames != null) for (String oldName : oldNames) addType(oldName);\n\t\t\n\t\tString dotBased = fullyQualifiedTypeName.replace(\"$\", \".\");\n\t\t\n\t\tif (locked) throw new IllegalStateException(\"locked\");\n\t\tint idx = fullyQualifiedTypeName.lastIndexOf('.');\n\t\tif (idx == -1) throw new IllegalArgumentException(\n\t\t\t\"Only fully qualified types are allowed (types in the default package cannot be added here either)\");\n\t\tString unqualified = fullyQualifiedTypeName.substring(idx + 1);\n\t\tif (unqualifiedToQualifiedMap == null) throw new IllegalStateException(\"SingleType library\");\n\t\t\n\t\tput(unqualified.replace(\"$\", \".\"), dotBased);\n\t\tput(unqualified, dotBased);\n\t\tput(fullyQualifiedTypeName, dotBased);\n\t\tput(dotBased, dotBased);\n\t\t\n\t\tint idx2 = fullyQualifiedTypeName.indexOf('$', idx + 1);\n\t\twhile (idx2 != -1) {\n\t\t\tString unq = fullyQualifiedTypeName.substring(idx2 + 1);\n\t\t\tput(unq.replace(\"$\", \".\"), dotBased);\n\t\t\tput(unq, dotBased);\n\t\t\tidx2 = fullyQualifiedTypeName.indexOf('$', idx2 + 1);\n\t\t}\n\t}\n\t\n\t/**\n\t * Translates an unqualified name such as 'String' to 'java.lang.String', _if_ you added 'java.lang.String' to the library via the {@code addType} method.\n\t * Also returns the input if it is equal to a fully qualified name added to this type library.\n\t * \n\t * Returns an empty collection if it does not match any type in this type library.\n\t */\n\tpublic List<String> toQualifieds(String typeReference) {\n\t\tif (unqualifiedToQualifiedMap == null) {\n\t\t\tif (typeReference.equals(unqualified) || typeReference.equals(qualified)) return Collections.singletonList(qualified);\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\tObject v = unqualifiedToQualifiedMap.get(typeReference);\n\t\tif (v == null) return Collections.emptyList();\n\t\tif (v instanceof String) return Collections.singletonList((String) v);\n\t\treturn Arrays.asList((String[]) v);\n\t}\n\t\n\tprivate void put(String k, String v) {\n\t\tObject old = unqualifiedToQualifiedMap.put(k, v);\n\t\tif (old == null) return;\n\t\tString[] nv;\n\t\tif (old instanceof String) {\n\t\t\tif (old.equals(v)) return;\n\t\t\tnv = new String[] {(String) old, v};\n\t\t} else {\n\t\t\tString[] s = (String[]) old;\n\t\t\tnv = new String[s.length + 1];\n\t\t\tSystem.arraycopy(s, 0, nv, 0, s.length);\n\t\t\tnv[s.length] = v;\n\t\t}\n\t\tunqualifiedToQualifiedMap.put(k, nv);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/TypeResolver.java",
    "content": "/*\n * Copyright (C) 2009-2020 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\nimport java.util.List;\n\nimport lombok.core.AST.Kind;\n\n/**\n * Capable of resolving a simple type name such as 'String' into 'java.lang.String'.\n * <p>\n * NB: This resolver gives wrong answers when there's a class in the local package with the same name as a class in a star-import,\n *  and this importer also can't find inner types from superclasses/interfaces.\n */\npublic class TypeResolver {\n\tprivate ImportList imports;\n\t\n\t/**\n\t * Creates a new TypeResolver that can be used to resolve types in a source file with the given package and import statements.\n\t */\n\tpublic TypeResolver(ImportList importList) {\n\t\tthis.imports = importList;\n\t}\n\t\n\tpublic boolean typeMatches(LombokNode<?, ?, ?> context, String fqn, String typeRef) {\n\t\treturn typeRefToFullyQualifiedName(context, TypeLibrary.createLibraryForSingleType(fqn), typeRef) != null;\n\t}\n\t\n\tpublic String typeRefToFullyQualifiedName(LombokNode<?, ?, ?> context, TypeLibrary library, String typeRef) {\n\t\t// When asking if 'Foo' could possibly be referring to 'bar.Baz', the answer is obviously no.\n\t\tList<String> qualifieds = library.toQualifieds(typeRef);\n\t\tif (qualifieds == null || qualifieds.isEmpty()) return null;\n\t\t\n\t\t// When asking if 'lombok.Getter' could possibly be referring to 'lombok.Getter', the answer is obviously yes.\n\t\tif (qualifieds.contains(typeRef)) return LombokInternalAliasing.processAliases(typeRef);\n\t\t\n\t\t// When asking if 'Getter' could possibly be referring to 'lombok.Getter' if 'import lombok.Getter;' is in the source file, the answer is yes.\n\t\tint firstDot = typeRef.indexOf('.');\n\t\tif (firstDot == -1) firstDot = typeRef.length();\n\t\tString firstTypeRef = typeRef.substring(0, firstDot);\n\t\tString fromExplicitImport = imports.getFullyQualifiedNameForSimpleNameNoAliasing(firstTypeRef);\n\t\tif (fromExplicitImport != null) {\n\t\t\tString fqn = fromExplicitImport + typeRef.substring(firstDot);\n\t\t\tif (qualifieds.contains(fqn)) return LombokInternalAliasing.processAliases(fqn);\n\t\t\t// ... and if 'import foobar.Getter;' is in the source file, the answer is no.\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\t// When asking if 'Getter' could possibly be referring to 'lombok.Getter' and 'import lombok.*; / package lombok;' isn't in the source file. the answer is no.\n\t\tfor (String qualified : qualifieds) {\n\t\t\tString pkgName = qualified.substring(0, qualified.length() - typeRef.length() - 1);\n\t\t\tif (!imports.hasStarImport(pkgName)) continue;\n\t\t\t\n\t\t\t// Now the hard part: Given that there is a star import, 'Getter' most likely refers to 'lombok.Getter', but type shadowing may occur in which case it doesn't.\n\t\t\tLombokNode<?, ?, ?> n = context;\n\t\t\t\n\t\t\tmainLoop:\n\t\t\twhile (n != null) {\n\t\t\t\tif (n.getKind() == Kind.TYPE && firstTypeRef.equals(n.getName())) {\n\t\t\t\t\t// Our own class or one of our outer classes is named 'typeRef' so that's what 'typeRef' is referring to, not one of our type library classes.\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (n.getKind() == Kind.STATEMENT || n.getKind() == Kind.LOCAL) {\n\t\t\t\t\tLombokNode<?, ?, ?> newN = n.directUp();\n\t\t\t\t\tif (newN == null) break mainLoop;\n\t\t\t\t\t\n\t\t\t\t\tif (newN.getKind() == Kind.STATEMENT || newN.getKind() == Kind.INITIALIZER || newN.getKind() == Kind.METHOD) {\n\t\t\t\t\t\tfor (LombokNode<?, ?, ?> child : newN.down()) {\n\t\t\t\t\t\t\t// We found a method local with the same name above our code. That's the one 'typeRef' is referring to, not\n\t\t\t\t\t\t\t// anything in the type library we're trying to find, so, no matches.\n\t\t\t\t\t\t\tif (child.getKind() == Kind.TYPE && firstTypeRef.equals(child.getName())) return null;\n\t\t\t\t\t\t\tif (child == n) break;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tn = newN;\n\t\t\t\t\tcontinue mainLoop;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (n.getKind() == Kind.TYPE || n.getKind() == Kind.COMPILATION_UNIT) {\n\t\t\t\t\tfor (LombokNode<?, ?, ?> child : n.down()) {\n\t\t\t\t\t\t// Inner class that's visible to us has 'typeRef' as name, so that's the one being referred to, not one of our type library classes.\n\t\t\t\t\t\tif (child.getKind() == Kind.TYPE && firstTypeRef.equals(child.getName())) return null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tn = n.directUp();\n\t\t\t}\n\t\t\t\n\t\t\t// If no shadowing thing has been found, the star import 'wins', so, return that.\n\t\t\treturn LombokInternalAliasing.processAliases(qualified);\n\t\t}\n\t\t\n\t\t// No star import matches either.\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/Version.java",
    "content": "/*\n * Copyright (C) 2009-2026 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\nimport java.io.InputStream;\n\n/**\n * This class just holds lombok's current version.\n */\npublic class Version {\n\t// ** CAREFUL ** - this class must always compile with 0 dependencies (it must not refer to any other sources or libraries).\n\t// Note: In 'X.Y.Z', if Z is odd, its a snapshot build built from the repository, so many different 0.10.3 versions can exist, for example.\n\t// Official builds always end in an even number. (Since 0.10.2).\n\tprivate static final String VERSION = \"1.18.45\";\n\tprivate static final String RELEASE_NAME = \"Edgy Guinea Pig\";\n//\tprivate static final String RELEASE_NAME = \"Envious Ferret\";\n\t\n\t// Named version history:\n\t//   Angry Butterfly\n\t//   Branching Cobra\n\t//   Candid Duck\n\t//   Dancing Elephant\n\t//   Envious Ferret\n\t\n\tprivate Version() {\n\t\t//Prevent instantiation\n\t}\n\t\n\t/**\n\t * Prints the version followed by a newline, and exits.\n\t */\n\tpublic static void main(String[] args) {\n\t\tif (args.length > 0) {\n\t\t\tSystem.out.printf(\"%s\\n\", getFullVersion());\n\t\t} else {\n\t\t\tSystem.out.println(VERSION);\n\t\t}\n\t}\n\t\n\t/**\n\t * Get the current Lombok version.\n\t */\n\tpublic static String getVersion() {\n\t\treturn VERSION;\n\t}\n\t\n\t/**\n\t * Get the current release name.\n\t * \n\t * The release name is a string (not numbers). Every time a new release has a significantly improved feature set, a new release name is given.\n\t * Thus, many versions can carry the same release name. Version bumps and release names are not related; if a new version of lombok is entirely\n\t * backwards compatible with a previous one, but also adds many new features, it will get only a minor version bump, but also a new release name.\n\t */\n\tpublic static String getReleaseName() {\n\t\treturn RELEASE_NAME;\n\t}\n\t\n\tpublic static String getFullVersion() {\n\t\tString version = String.format(\"v%s \\\"%s\\\"\", VERSION, RELEASE_NAME);\n\t\tif (!isEdgeRelease()) return version;\n\t\t\n\t\tInputStream in = Version.class.getResourceAsStream(\"/release-timestamp.txt\");\n\t\tif (in == null) return version;\n\t\ttry {\n\t\t\tbyte[] data = new byte[65536];\n\t\t\tint p = 0;\n\t\t\twhile (p < data.length) {\n\t\t\t\tint r = in.read(data, p, data.length - p);\n\t\t\t\tif (r == -1) break;\n\t\t\t\tp += r;\n\t\t\t}\n\t\t\t\n\t\t\tString timestamp = new String(data, \"UTF-8\").trim();\n\t\t\treturn version + \" - \" + timestamp;\n\t\t} catch (Exception e) {\n\t\t\ttry {\n\t\t\t\tin.close();\n\t\t\t} catch (Exception ignore) {}\n\t\t}\n\t\t\n\t\treturn version;\n\t}\n\t\n\tpublic static boolean isEdgeRelease() {\n\t\tint lastIdx = VERSION.lastIndexOf('.');\n\t\tif (lastIdx == -1) return false;\n\t\ttry {\n\t\t\treturn Integer.parseInt(VERSION.substring(lastIdx + 1)) % 2 == 1;\n\t\t} catch (Exception e) {\n\t\t\treturn false;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/configuration/AllowHelper.java",
    "content": "/*\n * Copyright (C) 2018 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\nimport java.util.Collection;\nimport java.util.Collections;\n\npublic final class AllowHelper {\n\tprivate final static Collection<? extends ConfigurationKey<?>> ALLOWABLE = Collections.emptySet();\n\t\n\tprivate AllowHelper() {\n\t\t// Prevent instantiation\n\t}\n\t\n\tpublic static boolean isAllowable(ConfigurationKey<?> key) {\n\t\treturn ALLOWABLE.contains(key);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/configuration/BubblingConfigurationResolver.java",
    "content": "/*\n * Copyright (C) 2014-2020 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\nimport java.util.ArrayDeque;\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.Deque;\nimport java.util.HashSet;\nimport java.util.List;\n\nimport lombok.ConfigurationKeys;\nimport lombok.core.configuration.ConfigurationSource.ListModification;\nimport lombok.core.configuration.ConfigurationSource.Result;\n\npublic class BubblingConfigurationResolver implements ConfigurationResolver {\n\t\n\tprivate final ConfigurationFile start;\n\tprivate final ConfigurationFileToSource fileMapper;\n\t\n\tpublic BubblingConfigurationResolver(ConfigurationFile start, ConfigurationFileToSource fileMapper) {\n\t\tthis.start = start;\n\t\tthis.fileMapper = fileMapper;\n\t}\n\t\n\t@SuppressWarnings(\"unchecked\")\n\t@Override\n\tpublic <T> T resolve(ConfigurationKey<T> key) {\n\t\tboolean isList = key.getType().isList();\n\t\tList<List<ListModification>> listModificationsList = null;\n\t\t\n\t\tboolean stopBubbling = false;\n\t\tConfigurationFile currentLevel = start;\n\t\tCollection<ConfigurationFile> visited = new HashSet<ConfigurationFile>();\n\t\touter:\n\t\twhile (currentLevel != null) {\n\t\t\tDeque<ConfigurationFile> round = new ArrayDeque<ConfigurationFile>();\n\t\t\tround.push(currentLevel);\n\t\t\t\n\t\t\twhile (!round.isEmpty()) {\n\t\t\t\tConfigurationFile currentFile = round.pop();\n\t\t\t\tif (currentFile == null || !visited.add(currentFile)) continue;\n\t\t\t\t\n\t\t\t\tConfigurationSource source = fileMapper.parsed(currentFile);\n\t\t\t\tif (source == null) continue;\n\t\t\t\t\n\t\t\t\tfor (ConfigurationFile importFile : source.imports()) round.push(importFile);\n\t\t\t\t\n\t\t\t\tResult stop = source.resolve(ConfigurationKeys.STOP_BUBBLING);\n\t\t\t\tstopBubbling = stopBubbling || (stop != null && Boolean.TRUE.equals(stop.getValue()));\n\t\t\t\t\n\t\t\t\tResult result = source.resolve(key);\n\t\t\t\tif (result == null) continue;\n\t\t\t\t\n\t\t\t\tif (isList) {\n\t\t\t\t\tif (listModificationsList == null) listModificationsList = new ArrayList<List<ListModification>>();\n\t\t\t\t\tlistModificationsList.add((List<ListModification>) result.getValue());\n\t\t\t\t}\n\t\t\t\tif (result.isAuthoritative()) {\n\t\t\t\t\tif (isList) break outer;\n\t\t\t\t\treturn (T) result.getValue();\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (stopBubbling) break;\n\t\t\tcurrentLevel = currentLevel.parent();\n\t\t}\n\t\t\n\t\tif (!isList) return null;\n\t\tif (listModificationsList == null) return (T) Collections.emptyList();\n\t\t\n\t\tList<Object> listValues = new ArrayList<Object>();\n\t\tCollections.reverse(listModificationsList);\n\t\tfor (List<ListModification> listModifications : listModificationsList) {\n\t\t\tif (listModifications != null) for (ListModification modification : listModifications) {\n\t\t\t\tlistValues.remove(modification.getValue());\n\t\t\t\tif (modification.isAdded()) listValues.add(modification.getValue());\n\t\t\t}\n\t\t}\n\t\treturn (T) listValues;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/configuration/CallSuperType.java",
    "content": "/*\n * Copyright (C) 2015 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\n/** Used for lombok configuration for configuration whether or not to call the super implementation for certain lombok feature. */\npublic enum CallSuperType {\n\tCALL, SKIP, WARN;\n}\n"
  },
  {
    "path": "src/core/lombok/core/configuration/CapitalizationStrategy.java",
    "content": "/*\n * Copyright (C) 2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\n/** Used for lombok configuration to determine how to transform field names when turning them into accessor method names and vice versa. */\npublic enum CapitalizationStrategy {\n\tBASIC {\n\t\t@Override public String capitalize(String in) {\n\t\t\tif (in.length() == 0) return in;\n\t\t\tchar first = in.charAt(0);\n\t\t\tif (!Character.isLowerCase(first)) return in;\n\t\t\tboolean useUpperCase = in.length() > 2 &&\n\t\t\t\t(Character.isTitleCase(in.charAt(1)) || Character.isUpperCase(in.charAt(1)));\n\t\t\treturn (useUpperCase ? Character.toUpperCase(first) : Character.toTitleCase(first)) + in.substring(1);\n\t\t}\n\t},\n\tBEANSPEC {\n\t\t@Override public String capitalize(String in) {\n\t\t\tif (in.length() == 0) return in;\n\t\t\tchar first = in.charAt(0);\n\t\t\tif (!Character.isLowerCase(first) || (in.length() > 1 && Character.isUpperCase(in.charAt(1)))) return in;\n\t\t\tboolean useUpperCase = in.length() > 2 && Character.isTitleCase(in.charAt(1));\n\t\t\treturn (useUpperCase ? Character.toUpperCase(first) : Character.toTitleCase(first)) + in.substring(1);\n\t\t}\n\t},\n\t;\n\t\n\tpublic static CapitalizationStrategy defaultValue() {\n\t\treturn BASIC;\n\t}\n\t\n\tpublic abstract String capitalize(String in);\n}\n"
  },
  {
    "path": "src/core/lombok/core/configuration/CheckerFrameworkVersion.java",
    "content": "/*\n * Copyright (C) 2019-2020 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\npublic final class CheckerFrameworkVersion implements ConfigurationValueType {\n\tprivate final int version;\n\tprivate static final int DEFAULT = 3200;\n\tprivate static final int MAX_SUPPORTED = 4000;\n\t\n\tpublic static final String NAME__SIDE_EFFECT_FREE = \"org.checkerframework.dataflow.qual.SideEffectFree\";\n\tpublic static final String NAME__PURE = \"org.checkerframework.dataflow.qual.Pure\";\n\tpublic static final String NAME__UNIQUE = \"org.checkerframework.common.aliasing.qual.Unique\";\n\tpublic static final String NAME__RETURNS_RECEIVER = \"org.checkerframework.common.returnsreceiver.qual.This\";\n\tpublic static final String NAME__CALLED = \"org.checkerframework.checker.calledmethods.qual.CalledMethods\";\n\t\n\tpublic static final CheckerFrameworkVersion NONE = new CheckerFrameworkVersion(0);\n\t\n\tprivate CheckerFrameworkVersion(int v) {\n\t\tthis.version = v;\n\t}\n\t\n\tprivate static final Pattern VERSION = Pattern.compile(\"^(\\\\d+)(?:\\\\.(\\\\d+))?(?:\\\\.\\\\d+)*$\");\n\t\n\tpublic boolean generateSideEffectFree() {\n\t\treturn version > 0;\n\t}\n\t\n\tpublic boolean generateUnique() {\n\t\treturn version > 2899;\n\t}\n\t\n\tpublic boolean generatePure() {\n\t\treturn version > 0;\n\t}\n\t\n\tpublic boolean generateReturnsReceiver() {\n\t\treturn version >= 3100;\n\t}\n\t\n\tpublic boolean generateCalledMethods() {\n\t\treturn version >= 3100;\n\t}\n\t\n\tpublic static CheckerFrameworkVersion valueOf(String versionString) {\n\t\tif (versionString != null) versionString = versionString.trim();\n\t\tif (versionString == null || versionString.equalsIgnoreCase(\"false\") || versionString.equals(\"0\")) return new CheckerFrameworkVersion(0);\n\t\tif (versionString.equalsIgnoreCase(\"true\")) return new CheckerFrameworkVersion(DEFAULT);\n\t\tMatcher m = VERSION.matcher(versionString);\n\t\tif (!m.matches()) throw new IllegalArgumentException(\"Expected 'true' or 'false' or a major/minor version, such as '2.9'\");\n\t\tint major = Integer.parseInt(m.group(1));\n\t\tint minor = (m.group(2) != null && !m.group(2).isEmpty()) ? Integer.parseInt(m.group(2)) : 0;\n\t\tif (minor > 999) throw new IllegalArgumentException(\"Minor version must be between 0 and 999\");\n\t\tint v = major * 1000 + minor;\n\t\tif (v > MAX_SUPPORTED) {\n\t\t\tString s = (v / 1000) + \".\" + (v % 1000);\n\t\t\tthrow new IllegalArgumentException(\"Lombok supports at most v\" + s + \"; reduce the value of key 'checkerframework' to \" + s);\n\t\t}\n\t\treturn new CheckerFrameworkVersion(v);\n\t}\n\t\n\tpublic static String description() {\n\t\treturn \"checkerframework-version\";\n\t}\n\t\n\tpublic static String exampleValue() {\n\t\tString s = (MAX_SUPPORTED / 1000) + \".\" + (MAX_SUPPORTED % 1000);\n\t\treturn \"major.minor (example: 3.2 - and no higher than \" + s + \") or true or false\";\n\t}\n\t\n\t@Override public boolean equals(Object obj) {\n\t\tif (!(obj instanceof CheckerFrameworkVersion)) return false;\n\t\treturn version == ((CheckerFrameworkVersion) obj).version;\n\t}\n\t\n\t@Override public int hashCode() {\n\t\treturn version;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/configuration/ConfigurationApp.java",
    "content": "/*\n * Copyright (C) 2014-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.PrintStream;\nimport java.net.URI;\nimport java.util.ArrayDeque;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.Comparator;\nimport java.util.Deque;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.Set;\nimport java.util.TreeMap;\nimport java.util.TreeSet;\n\nimport com.zwitserloot.cmdreader.CmdReader;\nimport com.zwitserloot.cmdreader.Description;\nimport com.zwitserloot.cmdreader.Excludes;\nimport com.zwitserloot.cmdreader.FullName;\nimport com.zwitserloot.cmdreader.InvalidCommandLineException;\nimport com.zwitserloot.cmdreader.Mandatory;\nimport com.zwitserloot.cmdreader.Requires;\nimport com.zwitserloot.cmdreader.Sequential;\nimport com.zwitserloot.cmdreader.Shorthand;\n\nimport lombok.ConfigurationKeys;\nimport lombok.core.LombokApp;\nimport lombok.core.configuration.ConfigurationParser.Collector;\nimport lombok.spi.Provides;\n\n@Provides\npublic class ConfigurationApp extends LombokApp {\n\tprivate static final URI NO_CONFIG = URI.create(\"\");\n\t\n\tprivate PrintStream out = System.out;\n\tprivate PrintStream err = System.err;\n\t\n\t@Override public String getAppName() {\n\t\treturn \"config\";\n\t}\n\t\n\t@Override public String getAppDescription() {\n\t\treturn \"Prints the configurations for the provided paths to standard out.\";\n\t}\n\t\n\t@Override public List<String> getAppAliases() {\n\t\treturn Arrays.asList(\"configuration\", \"config\", \"conf\", \"settings\");\n\t}\n\t\n\tpublic static class CmdArgs {\n\t\t@Sequential\n\t\t@Mandatory(onlyIfNot={\"help\", \"generate\"})\n\t\t@Description(\"Paths to java files or directories the configuration is to be printed for.\")\n\t\tprivate List<String> paths = new ArrayList<String>();\n\t\t\n\t\t@Shorthand(\"g\")\n\t\t@Excludes(\"paths\")\n\t\t@Description(\"Generates a list containing all the available configuration parameters. Add --verbose to print more information.\")\n\t\tboolean generate = false;\n\t\t\n\t\t@Shorthand(\"v\")\n\t\t@Description(\"Displays more information.\")\n\t\tboolean verbose = false;\n\t\t\n\t\t@Shorthand(\"n\")\n\t\t@FullName(\"not-mentioned\")\n\t\t@Requires(\"verbose\")\n\t\t@Description(\"Also display files that don't mention the key.\")\n\t\tboolean notMentioned = false;\n\t\t\n\t\t@Shorthand(\"k\")\n\t\t@Description(\"Limit the result to these keys.\")\n\t\tprivate List<String> key = new ArrayList<String>();\n\t\t\n\t\t@Shorthand({\"h\", \"?\"})\n\t\t@Description(\"Shows this help text.\")\n\t\tboolean help = false;\n\t}\n\t\n\t@Override public int runApp(List<String> raw) throws Exception {\n\t\tCmdReader<CmdArgs> reader = CmdReader.of(CmdArgs.class);\n\t\tCmdArgs args;\n\t\ttry {\n\t\t\targs = reader.make(raw.toArray(new String[0]));\n\t\t\tif (args.help) {\n\t\t\t\tout.println(reader.generateCommandLineHelp(\"java -jar lombok.jar configuration\"));\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t} catch (InvalidCommandLineException e) {\n\t\t\terr.println(e.getMessage());\n\t\t\terr.println(reader.generateCommandLineHelp(\"java -jar lombok.jar configuration\"));\n\t\t\treturn 1;\n\t\t}\n\t\t\n\t\tConfigurationKeysLoader.LoaderLoader.loadAllConfigurationKeys();\n\t\tCollection<ConfigurationKey<?>> keys = checkKeys(args.key);\n\t\tif (keys == null) return 1;\n\t\t\n\t\tboolean verbose = args.verbose;\n\t\tif (args.generate) {\n\t\t\treturn generate(keys, verbose, !args.key.isEmpty());\n\t\t}\n\t\t\n\t\treturn display(keys, verbose, args.paths, !args.key.isEmpty(), args.notMentioned);\n\t}\n\t\n\tpublic ConfigurationApp redirectOutput(PrintStream out, PrintStream err) {\n\t\tif (out != null) this.out = out;\n\t\tif (err != null) this.err = err;\n\t\treturn this;\n\t}\n\t\n\tpublic int generate(Collection<ConfigurationKey<?>> keys, boolean verbose, boolean explicit) {\n\t\tfor (ConfigurationKey<?> key : keys) {\n\t\t\tif (!explicit && key.isHidden()) continue;\n\t\t\tString keyName = key.getKeyName();\n\t\t\tConfigurationDataType type = key.getType();\n\t\t\tString description = key.getDescription();\n\t\t\tboolean hasDescription = description != null && !description.isEmpty();\n\t\t\tif (!verbose) {\n\t\t\t\tout.println(keyName);\n\t\t\t\tif (hasDescription) {\n\t\t\t\t\tout.print(\"  \");\n\t\t\t\t\tout.println(description);\n\t\t\t\t}\n\t\t\t\tout.println();\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tout.printf(\"##%n## Key : %s%n## Type: %s%n\", keyName, type);\n\t\t\tif (hasDescription) {\n\t\t\t\tout.printf(\"##%n## %s%n\", description);\n\t\t\t}\n\t\t\tout.printf(\"##%n## Examples:%n#%n\");\n\t\t\tout.printf(\"# clear %s%n\", keyName);\n\t\t\tString exampleValue = type.getParser().exampleValue();\n\t\t\tif (type.isList()) {\n\t\t\t\tout.printf(\"# %s += %s%n\", keyName, exampleValue);\n\t\t\t\tout.printf(\"# %s -= %s%n\", keyName, exampleValue);\n\t\t\t} else {\n\t\t\t\tout.printf(\"# %s = %s%n\", keyName, exampleValue);\n\t\t\t}\n\t\t\tout.printf(\"#%n%n\");\n\t\t}\n\t\tif (!verbose) {\n\t\t\tout.println(\"Use --verbose for more information.\");\n\t\t}\n\t\treturn 0;\n\t}\n\t\n\tpublic int display(Collection<ConfigurationKey<?>> keys, boolean verbose, Collection<String> argsPaths, boolean explicitKeys, boolean notMentioned) throws Exception {\n\t\tTreeMap<URI, Set<String>> sharedDirectories = findSharedDirectories(argsPaths);\n\t\t\n\t\tif (sharedDirectories == null) return 1;\n\t\t\n\t\tSet<String> none = sharedDirectories.remove(NO_CONFIG);\n\t\tif (none != null) {\n\t\t\tif (none.size() == 1) {\n\t\t\t\tout.printf(\"No 'lombok.config' found for '%s'.%n\", none.iterator().next());\n\t\t\t} else {\n\t\t\t\tout.println(\"No 'lombok.config' found for: \");\n\t\t\t\tfor (String path : none) out.printf(\"- %s%n\", path);\n\t\t\t}\n\t\t}\n\t\t\n\t\tfinal List<String> problems = new ArrayList<String>();\n\t\tConfigurationProblemReporter reporter = new ConfigurationProblemReporter() {\n\t\t\t@Override public void report(String sourceDescription, String problem, int lineNumber, CharSequence line) {\n\t\t\t\tproblems.add(String.format(\"%s: %s (%s:%d)\", problem, line, sourceDescription, lineNumber));\n\t\t\t}\n\t\t};\n\t\t\n\t\tFileSystemSourceCache cache = new FileSystemSourceCache();\n\t\tConfigurationParser parser = new ConfigurationParser(reporter);\n\t\tboolean first = true;\n\t\tfor (Entry<URI, Set<String>> entry : sharedDirectories.entrySet()) {\n\t\t\tif (!first) {\n\t\t\t\tout.printf(\"%n%n\");\n\t\t\t}\n\t\t\tSet<String> paths = entry.getValue();\n\t\t\tif (paths.size() == 1) {\n\t\t\t\tif (!(argsPaths.size() == 1)) out.printf(\"Configuration for '%s'.%n%n\", paths.iterator().next());\n\t\t\t} else {\n\t\t\t\tout.printf(\"Configuration for:%n\");\n\t\t\t\tfor (String path : paths) out.printf(\"- %s%n\", path);\n\t\t\t\tout.println();\n\t\t\t}\n\t\t\tURI directory = entry.getKey();\n\t\t\tConfigurationResolver resolver = new BubblingConfigurationResolver(cache.forUri(directory), cache.fileToSource(parser));\n\t\t\tMap<ConfigurationKey<?>, ? extends Collection<String>> traces = trace(keys, directory, notMentioned);\n\t\t\tboolean printed = false;\n\t\t\tfor (ConfigurationKey<?> key : keys) {\n\t\t\t\tObject value = resolver.resolve(key);\n\t\t\t\tCollection<String> modifications = traces.get(key);\n\t\t\t\tif (!modifications.isEmpty() || explicitKeys) {\n\t\t\t\t\tif (printed && verbose) out.println();\n\t\t\t\t\tprintValue(key, value, verbose, modifications);\n\t\t\t\t\tprinted = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!printed) out.println(\"<default>\");\n\t\t\tfirst = false;\n\t\t}\n\t\t\n\t\tif (!problems.isEmpty()) {\n\t\t\terr.printf(\"Problems in the configuration files:%n\");\n\t\t\tfor (String problem : problems) err.printf(\"- %s%n\", problem);\n\t\t\treturn 2;\n\t\t}\n\t\t\n\t\treturn 0;\n\t}\n\t\n\tprivate void printValue(ConfigurationKey<?> key, Object value, boolean verbose, Collection<String> history) {\n\t\tif (verbose) out.printf(\"# %s%n\", key.getDescription());\n\t\tif (value == null) {\n\t\t\tout.printf(\"clear %s%n\", key.getKeyName());\n\t\t} else if (value instanceof List<?>) {\n\t\t\tList<?> list = (List<?>)value;\n\t\t\tif (list.isEmpty()) out.printf(\"clear %s%n\", key.getKeyName());\n\t\t\tfor (Object element : list) out.printf(\"%s += %s%n\", key.getKeyName(), element);\n\t\t} else {\n\t\t\tout.printf(\"%s = %s%n\", key.getKeyName(), value);\n\t\t}\n\t\tif (!verbose) return;\n\t\tfor (String modification : history) out.printf(\"# %s%n\", modification);\n\t}\n\t\n\tprivate static final ConfigurationProblemReporter VOID = new ConfigurationProblemReporter() {\n\t\t@Override public void report(String sourceDescription, String problem, int lineNumber, CharSequence line) {}\n\t};\n\t\n\tprivate Map<ConfigurationKey<?>, ? extends Collection<String>> trace(Collection<ConfigurationKey<?>> keys, URI directory, boolean notMentioned) throws Exception {\n\t\tMap<ConfigurationKey<?>, List<String>> result = new HashMap<ConfigurationKey<?>, List<String>>();\n\t\tfor (ConfigurationKey<?> key : keys) result.put(key, new ArrayList<String>());\n\t\tSet<ConfigurationKey<?>> used = new HashSet<ConfigurationKey<?>>();\n\t\t\n\t\tboolean stopBubbling = false;\n\t\tCollection<ConfigurationFile> visited = new HashSet<ConfigurationFile>();\n\t\tfor (ConfigurationFile context = ConfigurationFile.forDirectory(new File(directory)); context != null && !stopBubbling; context = context.parent()) {\n\t\t\tif (!context.exists()) continue;\n\t\t\t\n\t\t\tDeque<Source> round = new ArrayDeque<Source>();\n\t\t\tround.push(new Source(context, context.description()));\n\t\t\t\n\t\t\twhile (!round.isEmpty()) {\n\t\t\t\tSource current = round.pop();\n\t\t\t\tif (current == null || !visited.add(current.file) || !current.file.exists()) continue;\n\t\t\t\t\n\t\t\t\tMap<ConfigurationKey<?>, List<String>> traces = trace(current.file, keys, round);\n\t\t\t\t\n\t\t\t\tstopBubbling = stopBubbling(traces.get(ConfigurationKeys.STOP_BUBBLING));\n\t\t\t\tfor (ConfigurationKey<?> key : keys) {\n\t\t\t\t\tList<String> modifications = traces.get(key);\n\t\t\t\t\tif (modifications == null) {\n\t\t\t\t\t\tmodifications = new ArrayList<String>();\n\t\t\t\t\t\tif (notMentioned) {\n\t\t\t\t\t\t\tmodifications.add(\"\");\n\t\t\t\t\t\t\tmodifications.add(current.description + \":\");\n\t\t\t\t\t\t\tmodifications.add(\"     <'\" + key.getKeyName() + \"' not mentioned>\");\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tused.add(key);\n\t\t\t\t\t\tmodifications.add(0, current.description + \":\");\n\t\t\t\t\t\tmodifications.add(0, \"\");\n\t\t\t\t\t}\n\t\t\t\t\tresult.get(key).addAll(0, modifications);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (ConfigurationKey<?> key : keys) {\n\t\t\tif (used.contains(key)) {\n\t\t\t\tList<String> modifications = result.get(key);\n\t\t\t\tmodifications.remove(0);\n\t\t\t\tif (stopBubbling) {\n\t\t\t\t\tString mostRecent = modifications.get(0);\n\t\t\t\t\tmodifications.set(0, mostRecent.substring(0, mostRecent.length() - 1) + \" (stopped bubbling):\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresult.put(key, Collections.<String>emptyList());\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\t\n\tprivate static final class Source {\n\t\tfinal ConfigurationFile file;\n\t\tfinal String description;\n\n\t\tSource(ConfigurationFile file, String description) {\n\t\t\tthis.file = file;\n\t\t\tthis.description = description;\n\t\t}\n\t}\n\t\n\tprivate Map<ConfigurationKey<?>, List<String>> trace(ConfigurationFile context, final Collection<ConfigurationKey<?>> keys, final Deque<Source> round) throws IOException {\n\t\tfinal Map<ConfigurationKey<?>, List<String>> result = new HashMap<ConfigurationKey<?>, List<String>>();\n\t\t\n\t\tCollector collector = new Collector() {\n\t\t\t@Override public void addImport(ConfigurationFile importFile, ConfigurationFile context, int lineNumber) {\n\t\t\t\tround.push(new Source(importFile, importFile.description() + \" (imported from \" + context.description() + \":\" + lineNumber + \")\"));\n\t\t\t}\n\t\t\t@Override public void clear(ConfigurationKey<?> key, ConfigurationFile context, int lineNumber) {\n\t\t\t\ttrace(key, \"clear \" + key.getKeyName(), lineNumber);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public void set(ConfigurationKey<?> key, Object value, ConfigurationFile context, int lineNumber) {\n\t\t\t\ttrace(key, key.getKeyName() + \" = \" + value, lineNumber);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public void add(ConfigurationKey<?> key, Object value, ConfigurationFile context, int lineNumber) {\n\t\t\t\ttrace(key, key.getKeyName() + \" += \" + value, lineNumber);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public void remove(ConfigurationKey<?> key, Object value, ConfigurationFile context, int lineNumber) {\n\t\t\t\ttrace(key, key.getKeyName() + \" -= \" + value, lineNumber);\n\t\t\t}\n\t\t\t\n\t\t\tprivate void trace(ConfigurationKey<?> key, String message, int lineNumber) {\n\t\t\t\tif (!keys.contains(key) && key != ConfigurationKeys.STOP_BUBBLING) return;\n\t\t\t\tList<String> traces = result.get(key);\n\t\t\t\tif (traces == null) {\n\t\t\t\t\ttraces = new ArrayList<String>();\n\t\t\t\t\tresult.put(key, traces);\n\t\t\t\t}\n\t\t\t\ttraces.add(String.format(\"%4d: %s\", lineNumber, message));\n\t\t\t}\n\n\t\t};\n\t\tnew ConfigurationParser(VOID).parse(context, collector);\n\t\treturn result;\n\t}\n\t\n\tprivate boolean stopBubbling(List<String> stops) {\n\t\treturn stops != null && !stops.isEmpty() && stops.get(stops.size() -1).endsWith(\"true\");\n\t}\n\t\n\tprivate Collection<ConfigurationKey<?>> checkKeys(List<String> keyList) {\n\t\tMap<String, ConfigurationKey<?>> registeredKeys = ConfigurationKey.registeredKeys();\n\t\tif (keyList.isEmpty()) return registeredKeys.values();\n\t\t\n\t\tCollection<ConfigurationKey<?>> keys = new ArrayList<ConfigurationKey<?>>();\n\t\tfor (String keyName : keyList) {\n\t\t\tConfigurationKey<?> key = registeredKeys.get(keyName);\n\t\t\tif (key == null) {\n\t\t\t\terr.printf(\"Unknown key '%s'%n\", keyName);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tkeys.remove(key);\n\t\t\tkeys.add(key);\n\t\t}\n\t\treturn keys;\n\t}\n\t\n\tprivate TreeMap<URI, Set<String>> findSharedDirectories(Collection<String> paths) {\n\t\tTreeMap<URI,Set<String>> sharedDirectories = new TreeMap<URI, Set<String>>(new Comparator<URI>() {\n\t\t\t@Override public int compare(URI o1, URI o2) {\n\t\t\t\treturn o1.toString().compareTo(o2.toString());\n\t\t\t}\n\t\t});\n\t\tfor (String path : paths) {\n\t\t\tFile file = new File(path);\n\t\t\tif (!file.exists()) {\n\t\t\t\terr.printf(\"File not found: '%s'%n\", path);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tURI first = findFirstLombokDirectory(file);\n\t\t\tSet<String> sharedBy = sharedDirectories.get(first);\n\t\t\tif (sharedBy == null) {\n\t\t\t\tsharedBy = new TreeSet<String>();\n\t\t\t\tsharedDirectories.put(first, sharedBy);\n\t\t\t}\n\t\t\tsharedBy.add(path);\n\t\t}\n\t\treturn sharedDirectories;\n\t}\n\t\n\tprivate URI findFirstLombokDirectory(File file) {\n\t\tFile current = new File(file.toURI().normalize());\n\t\tif (file.isFile()) current = current.getParentFile();\n\t\twhile (current != null) {\n\t\t\tif (new File(current, \"lombok.config\").exists()) return current.toURI();\n\t\t\tcurrent = current.getParentFile();\n\t\t}\n\t\treturn NO_CONFIG;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/configuration/ConfigurationDataType.java",
    "content": "/*\n * Copyright (C) 2013-2026 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\nimport java.lang.reflect.ParameterizedType;\nimport java.lang.reflect.Type;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\npublic final class ConfigurationDataType {\n\tprivate static final Map<Class<?>, ConfigurationValueParser> SIMPLE_TYPES;\n\tstatic {\n\t\tMap<Class<?>, ConfigurationValueParser> map = new HashMap<Class<?>, ConfigurationValueParser>();\n\t\tmap.put(String.class, new ConfigurationValueParser() {\n\t\t\t@Override public Object parse(String value) {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t\t\n\t\t\t@Override public String description() {\n\t\t\t\treturn \"string\";\n\t\t\t}\n\t\t\t\n\t\t\t@Override public String exampleValue() {\n\t\t\t\treturn \"<text>\";\n\t\t\t}\n\t\t});\n\t\tmap.put(Integer.class, new ConfigurationValueParser() {\n\t\t\t@Override public Object parse(String value) {\n\t\t\t\treturn Integer.parseInt(value);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public String description() {\n\t\t\t\treturn \"int\";\n\t\t\t}\n\t\t\t\n\t\t\t@Override public String exampleValue() {\n\t\t\t\treturn \"<int>\";\n\t\t\t}\n\t\t});\n\t\tmap.put(Long.class, new ConfigurationValueParser() {\n\t\t\t@Override public Object parse(String value) {\n\t\t\t\treturn Long.parseLong(value);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public String description() {\n\t\t\t\treturn \"long\";\n\t\t\t}\n\t\t\t\n\t\t\t@Override public String exampleValue() {\n\t\t\t\treturn \"<long>\";\n\t\t\t}\n\t\t});\n\t\tmap.put(Double.class, new ConfigurationValueParser() {\n\t\t\t@Override public Object parse(String value) {\n\t\t\t\treturn Double.parseDouble(value);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public String description() {\n\t\t\t\treturn \"double\";\n\t\t\t}\n\t\t\t\n\t\t\t@Override public String exampleValue() {\n\t\t\t\treturn \"<double>\";\n\t\t\t}\n\t\t});\n\t\tmap.put(Boolean.class, new ConfigurationValueParser() {\n\t\t\t@Override public Object parse(String value) {\n\t\t\t\treturn Boolean.parseBoolean(value);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public String description() {\n\t\t\t\treturn \"boolean\";\n\t\t\t}\n\t\t\t\n\t\t\t@Override public String exampleValue() {\n\t\t\t\treturn \"[false | true]\";\n\t\t\t}\n\t\t});\n\t\tSIMPLE_TYPES = map;\n\t}\n\t\n\tprivate static ConfigurationValueParser enumParser(final Type enumType) {\n\t\tfinal Class<?> type = (Class<?>) enumType;\n\t\t@SuppressWarnings(\"rawtypes\") final Class rawType = type;\n\t\t\n\t\treturn new ConfigurationValueParser() {\n\t\t\t@SuppressWarnings(\"unchecked\")\n\t\t\t@Override public Object parse(String value) {\n\t\t\t\tif (enumType instanceof Class<?> && MappedConfigEnum.class.isAssignableFrom(type)) {\n\t\t\t\t\tfor (Object enumVal : ((Class<?>) enumType).getEnumConstants()) {\n\t\t\t\t\t\tif (((MappedConfigEnum) enumVal).matches(value)) return enumVal;\n\t\t\t\t\t}\n\t\t\t\t\tthrow new IllegalArgumentException(\"Invalid value: \" + value);\n\t\t\t\t} else {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn Enum.valueOf(rawType, value);\n\t\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t\tStringBuilder sb = new StringBuilder();\n\t\t\t\t\t\tfor (int i = 0; i < value.length(); i++) {\n\t\t\t\t\t\t\tchar c = value.charAt(i);\n\t\t\t\t\t\t\tif (Character.isUpperCase(c) && i > 0) sb.append(\"_\");\n\t\t\t\t\t\t\tsb.append(Character.toUpperCase(c));\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn Enum.valueOf(rawType, sb.toString());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t@Override public String description() {\n\t\t\t\treturn \"enum (\" + type.getName() + \")\";\n\t\t\t}\n\t\t\t\n\t\t\t@Override public String exampleValue() {\n\t\t\t\tExampleValueString evs = type.getAnnotation(ExampleValueString.class);\n\t\t\t\tif (evs != null) return evs.value();\n\t\t\t\treturn Arrays.toString(type.getEnumConstants()).replace(\",\", \" | \");\n\t\t\t}\n\t\t};\n\t}\n\t\n\tprivate static ConfigurationValueParser valueTypeParser(Type argumentType) {\n\t\tfinal Class<?> type = (Class<?>) argumentType;\n\t\tfinal Method valueOfMethod = getMethod(type, \"valueOf\", String.class);\n\t\tfinal Method descriptionMethod = getMethod(type, \"description\");\n\t\tfinal Method exampleValueMethod = getMethod(type, \"exampleValue\");\n\t\treturn new ConfigurationValueParser() {\n\t\t\t@Override public Object parse(String value) {\n\t\t\t\treturn invokeStaticMethod(valueOfMethod, value);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public String description() {\n\t\t\t\treturn invokeStaticMethod(descriptionMethod);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public String exampleValue() {\n\t\t\t\treturn invokeStaticMethod(exampleValueMethod);\n\t\t\t}\n\t\t\t\n\t\t\t@SuppressWarnings(\"unchecked\")\n\t\t\tprivate <R> R invokeStaticMethod(Method method, Object... arguments) {\n\t\t\t\ttry {\n\t\t\t\t\treturn (R) method.invoke(null, arguments);\n\t\t\t\t} catch (IllegalAccessException e) {\n\t\t\t\t\tthrow new IllegalStateException(\"The method \" + method.getName() + \" \", e);\n\t\t\t\t} catch (InvocationTargetException e) {\n\t\t\t\t\t// There shouldn't be any checked Exception, only IllegalArgumentException is expected\n\t\t\t\t\tthrow (RuntimeException) e.getTargetException();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\t\n\tprivate final boolean isList;\n\tprivate final ConfigurationValueParser parser;\n\t\n\tpublic static ConfigurationDataType toDataType(Class<? extends ConfigurationKey<?>> keyClass) {\n\t\tif (keyClass.getSuperclass() != ConfigurationKey.class) {\n\t\t\tthrow new IllegalArgumentException(\"No direct subclass of ConfigurationKey: \" + keyClass.getName());\n\t\t}\n\t\t\n\t\tType type = keyClass.getGenericSuperclass();\n\t\tif (!(type instanceof ParameterizedType)) {\n\t\t\tthrow new IllegalArgumentException(\"Missing type parameter in \" + type);\n\t\t}\n\t\t\n\t\tParameterizedType parameterized = (ParameterizedType) type;\n\t\tType argumentType = parameterized.getActualTypeArguments()[0];\n\t\t\n\t\tboolean isList = false;\n\t\tif (argumentType instanceof ParameterizedType) {\n\t\t\tParameterizedType parameterizedArgument = (ParameterizedType) argumentType;\n\t\t\tif (parameterizedArgument.getRawType() == List.class) {\n\t\t\t\tisList = true;\n\t\t\t\targumentType = parameterizedArgument.getActualTypeArguments()[0];\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (SIMPLE_TYPES.containsKey(argumentType)) {\n\t\t\treturn new ConfigurationDataType(isList, SIMPLE_TYPES.get(argumentType));\n\t\t}\n\t\t\n\t\tif (isEnum(argumentType)) {\n\t\t\treturn new ConfigurationDataType(isList, enumParser(argumentType));\n\t\t}\n\t\t\n\t\tif (isConfigurationValueType(argumentType)) {\n\t\t\treturn new ConfigurationDataType(isList, valueTypeParser(argumentType));\n\t\t}\n\t\t\n\t\tthrow new IllegalArgumentException(\"Unsupported type parameter in \" + type);\n\t}\n\t\n\tprivate ConfigurationDataType(boolean isList, ConfigurationValueParser parser) {\n\t\tthis.isList = isList;\n\t\tthis.parser = parser;\n\t}\n\t\n\tpublic boolean isList() {\n\t\treturn isList;\n\t}\n\t\n\tConfigurationValueParser getParser() {\n\t\treturn parser;\n\t}\n\t\n\t@Override\n\tpublic String toString() {\n\t\tif (isList) return \"list of \" + parser.description();\n\t\treturn parser.description();\n\t}\n\t\n\tprivate static boolean isEnum(Type argumentType) {\n\t\treturn argumentType instanceof Class && ((Class<?>) argumentType).isEnum();\n\t}\n\t\n\tprivate static boolean isConfigurationValueType(Type argumentType) {\n\t\treturn argumentType instanceof Class && ConfigurationValueType.class.isAssignableFrom((Class<?>) argumentType);\n\t}\n\t\n\tprivate static Method getMethod(Class<?> argumentType, String name, Class<?>... parameterTypes) {\n\t\ttry {\n\t\t\treturn argumentType.getMethod(name, parameterTypes);\n\t\t} catch (NoSuchMethodException e) {\n\t\t\tthrow new IllegalStateException(\"Method \" + name + \" with parameters \" + Arrays.toString(parameterTypes) + \" was not found.\", e);\n\t\t} catch (SecurityException e) {\n\t\t\tthrow new IllegalStateException(\"Cannot inspect methods of type \" + argumentType, e);\n\t\t}\n\t}\n}"
  },
  {
    "path": "src/core/lombok/core/configuration/ConfigurationFile.java",
    "content": "/*\n * Copyright (C) 2020 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.net.URI;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.ConcurrentMap;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport java.util.zip.ZipEntry;\nimport java.util.zip.ZipInputStream;\n\npublic abstract class ConfigurationFile {\n\tprivate static final Pattern VARIABLE = Pattern.compile(\"\\\\<(.+?)\\\\>\");\n\tprivate static final String LOMBOK_CONFIG_FILENAME = \"lombok.config\";\n\tprivate static final Map<String, String> ENV = new HashMap<String, String>(System.getenv());\n\t\n\tprivate static final ThreadLocal<byte[]> buffers = new ThreadLocal<byte[]>() {\n\t\tprotected byte[] initialValue() {\n\t\t\treturn new byte[65536];\n\t\t}\n\t};\n\t\n\tstatic void setEnvironment(String key, String value) {\n\t\tENV.put(key, value);\n\t}\n\t\n\tprivate final String identifier;\n\t\n\tpublic static ConfigurationFile forFile(File file) {\n\t\treturn new RegularConfigurationFile(file);\n\t}\n\t\n\tpublic static ConfigurationFile forDirectory(File directory) {\n\t\treturn forFile(new File(directory, LOMBOK_CONFIG_FILENAME));\n\t}\n\t\n\tpublic static ConfigurationFile fromCharSequence(String identifier, CharSequence contents, long lastModified) {\n\t\treturn new CharSequenceConfigurationFile(identifier, contents, lastModified);\n\t}\n\t\n\tprivate ConfigurationFile(String identifier) {\n\t\tthis.identifier = identifier;\n\t}\n\t\n\tabstract long getLastModifiedOrMissing();\n\tabstract boolean exists();\n\tabstract CharSequence contents() throws IOException;\n\tpublic abstract ConfigurationFile resolve(String path);\n\tabstract ConfigurationFile parent();\n\t\n\tfinal String description() {\n\t\treturn identifier;\n\t}\n\t\n\t@Override public final boolean equals(Object obj) {\n\t\tif (!(obj instanceof ConfigurationFile)) return false;\n\t\treturn identifier.equals(((ConfigurationFile)obj).identifier);\n\t}\n\t\n\t@Override public final int hashCode() {\n\t\treturn identifier.hashCode();\n\t}\n\t\n\tpublic static long getLastModifiedOrMissing(File file) {\n\t\tif (!fileExists(file)) return FileSystemSourceCache.MISSING;\n\t\treturn file.lastModified();\n\t}\n\t\n\tprivate static boolean fileExists(File file) {\n\t\treturn file.exists() && file.isFile();\n\t}\n\t\n\tstatic String read(InputStream is) throws IOException {\n\t\tbyte[] b = buffers.get();\n\t\tByteArrayOutputStream out = new ByteArrayOutputStream();\n\t\twhile (true) {\n\t\t\tint r = is.read(b);\n\t\t\tif (r == -1) break;\n\t\t\tout.write(b, 0, r);\n\t\t}\n\t\treturn new String(out.toByteArray(), \"UTF-8\");\n\t}\n\t\n\tprivate static class RegularConfigurationFile extends ConfigurationFile {\n\t\tprivate final File file;\n\t\tprivate ConfigurationFile parent;\n\t\t\n\t\tprivate RegularConfigurationFile(File file) {\n\t\t\tsuper(file.getPath());\n\t\t\tthis.file = file;\n\t\t}\n\t\t\n\t\t@Override boolean exists() {\n\t\t\treturn fileExists(file);\n\t\t}\n\t\t\n\t\tpublic ConfigurationFile resolve(String path) {\n\t\t\tif (path.endsWith(\"!\")) return null;\n\t\t\t\n\t\t\tString[] parts = path.split(\"!\");\n\t\t\tif (parts.length > 2) return null;\n\t\t\t\n\t\t\tString realFileName = parts[0];\n\t\t\tFile file = resolveFile(replaceEnvironmentVariables(realFileName));\n\t\t\tif (realFileName.endsWith(\".zip\") || realFileName.endsWith(\".jar\")) {\n\t\t\t\ttry {\n\t\t\t\t\treturn ArchivedConfigurationFile.create(file, URI.create(parts.length == 1 ? LOMBOK_CONFIG_FILENAME : parts[1]));\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (parts.length > 1) return null;\n\t\t\treturn file == null ? null : forFile(file);\n\t\t}\n\t\t\n\t\tprivate File resolveFile(String path) {\n\t\t\tboolean absolute = false;\n\t\t\tint colon = path.indexOf(':');\n\t\t\tif (colon != -1) {\n\t\t\t\tif (colon != 1 || path.indexOf(':', colon + 1) != -1) return null;\n\t\t\t\tchar firstCharacter = Character.toLowerCase(path.charAt(0));\n\t\t\t\tif (firstCharacter < 'a' || firstCharacter > 'z') return null;\n\t\t\t\tabsolute = true;\n\t\t\t}\n\t\t\tif (path.charAt(0) == '/') absolute = true;\n\t\t\ttry {\n\t\t\t\treturn absolute ? new File(path) : new File(file.toURI().resolve(path));\n\t\t\t} catch (Exception e) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\t\n\t\t@Override\n\t\tlong getLastModifiedOrMissing() {\n\t\t\treturn getLastModifiedOrMissing(file);\n\t\t}\n\t\t\n\t\t@Override\n\t\tCharSequence contents() throws IOException {\n\t\t\tFileInputStream is = new FileInputStream(file);\n\t\t\ttry {\n\t\t\t\treturn read(is);\n\t\t\t} finally {\n\t\t\t\tis.close();\n\t\t\t}\n\t\t}\n\t\t\n\t\t@Override ConfigurationFile parent() {\n\t\t\tif (parent == null) {\n\t\t\t\tFile parentFile = file.getParentFile().getParentFile();\n\t\t\t\tparent = parentFile == null ? null : forDirectory(parentFile);\n\t\t\t}\n\t\t\treturn parent;\n\t\t}\n\t\t\n\t\tprivate static String replaceEnvironmentVariables(String fileName) {\n\t\t\tint start = 0;\n\t\t\tStringBuffer result = new StringBuffer();\n\t\t\tif (fileName.startsWith(\"~\")) {\n\t\t\t\tstart = 1;\n\t\t\t\tresult.append(System.getProperty(\"user.home\", \"~\"));\n\t\t\t}\n\t\t\tMatcher matcher = VARIABLE.matcher(fileName.substring(start));\n\t\t\twhile (matcher.find()) {\n\t\t\t\tString key = matcher.group(1);\n\t\t\t\tString value = ENV.get(key);\n\t\t\t\tif (value == null) value = \"<\" + key + \">\";\n\t\t\t\tmatcher.appendReplacement(result, value);\n\t\t\t}\n\t\t\tmatcher.appendTail(result);\n\t\t\treturn result.toString();\n\t\t}\n\t}\n\t\n\tprivate static class ArchivedConfigurationFile extends ConfigurationFile {\n\t\tprivate static final URI ROOT1 = URI.create(\"http://x.y/a/\");\n\t\tprivate static final URI ROOT2 = URI.create(\"ftp://y.x/b/\");\n\t\t\n\t\tprivate static final ConcurrentMap<String, Object> locks = new ConcurrentHashMap<String, Object>();\n\t\t\n\t\tprivate final File archive;\n\t\tprivate final URI file;\n\t\tprivate final Object lock;\n\t\tprivate long lastModified = -2;\n\t\tprivate String contents;\n\t\t\n\t\tpublic static ConfigurationFile create(File archive, URI file) {\n\t\t\tif (!isRelative(file)) return null;\n\t\t\treturn new ArchivedConfigurationFile(archive, file, archive.getPath() + \"!\" + file.getPath());\n\t\t}\n\t\t\n\t\tstatic boolean isRelative(URI path) {\n\t\t\ttry {\n\t\t\t\treturn ROOT1.resolve(path).toString().startsWith(ROOT1.toString()) && ROOT2.resolve(path).toString().startsWith(ROOT2.toString());\n\t\t\t} catch (Exception e) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\t\n\t\tArchivedConfigurationFile(File archive, URI file, String description) {\n\t\t\tsuper(description);\n\t\t\tthis.archive = archive;\n\t\t\tthis.file = file;\n\t\t\tlocks.putIfAbsent(archive.getPath(), new Object());\n\t\t\tthis.lock = locks.get(archive.getPath());\n\t\t}\n\t\t\n\t\t@Override\n\t\tlong getLastModifiedOrMissing() {\n\t\t\treturn getLastModifiedOrMissing(archive);\n\t\t}\n\t\t\n\t\t@Override\n\t\tboolean exists() {\n\t\t\tif (!fileExists(archive)) return false;\n\t\t\tsynchronized (lock) {\n\t\t\t\ttry {\n\t\t\t\t\treadIfNeccesary();\n\t\t\t\t\treturn contents != null;\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t@Override\n\t\tCharSequence contents() throws IOException {\n\t\t\tsynchronized (lock) {\n\t\t\t\treadIfNeccesary();\n\t\t\t\treturn contents;\n\t\t\t}\n\t\t}\n\t\t\n\t\tvoid readIfNeccesary() throws IOException {\n\t\t\tlong archiveModified = getLastModifiedOrMissing();\n\t\t\tif (archiveModified == lastModified) return;\n\t\t\tcontents = null;\n\t\t\tlastModified = archiveModified;\n\t\t\tif (archiveModified == FileSystemSourceCache.MISSING) return;\n\t\t\tcontents = read();\n\t\t}\n\t\t\n\t\tprivate String read() throws IOException {\n\t\t\tFileInputStream is = new FileInputStream(archive);\n\t\t\ttry {\n\t\t\t\tZipInputStream zip = new ZipInputStream(is);\n\t\t\t\ttry {\n\t\t\t\t\twhile (true) {\n\t\t\t\t\t\tZipEntry entry = zip.getNextEntry();\n\t\t\t\t\t\tif (entry == null) return null;\n\t\t\t\t\t\tif (entry.getName().equals(file.getPath())) {\n\t\t\t\t\t\t\treturn read(zip);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\tzip.close();\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tis.close();\n\t\t\t}\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic ConfigurationFile resolve(String path) {\n\t\t\ttry {\n\t\t\t\tURI resolved = file.resolve(path);\n\t\t\t\tif (!isRelative(resolved)) return null;\n\t\t\t\treturn create(archive, resolved);\n\t\t\t} catch (Exception e) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\t\n\t\t@Override\n\t\tConfigurationFile parent() {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tprivate static class CharSequenceConfigurationFile extends ConfigurationFile {\n\t\tprivate final CharSequence contents;\n\t\tprivate final long lastModified;\n\t\t\n\t\tprivate CharSequenceConfigurationFile(String identifier, CharSequence contents, long lastModified) {\n\t\t\tsuper(identifier);\n\t\t\tthis.contents = contents;\n\t\t\tthis.lastModified = lastModified;\n\t\t}\n\t\t\n\t\t@Override long getLastModifiedOrMissing() {\n\t\t\treturn lastModified;\n\t\t}\n\t\t\n\t\t@Override CharSequence contents() throws IOException {\n\t\t\treturn contents;\n\t\t}\n\t\t\n\t\t@Override boolean exists() {\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\t@Override public ConfigurationFile resolve(String path) {\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\t@Override ConfigurationFile parent() {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/configuration/ConfigurationFileToSource.java",
    "content": "/*\n * Copyright (C) 2020 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\npublic interface ConfigurationFileToSource {\n\tConfigurationSource parsed(ConfigurationFile fileLocation);\n}\n"
  },
  {
    "path": "src/core/lombok/core/configuration/ConfigurationKey.java",
    "content": "/*\n * Copyright (C) 2013-2018 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\nimport java.util.Collections;\nimport java.util.Map;\nimport java.util.TreeMap;\nimport java.util.regex.Pattern;\n\n/**\n * Describes a configuration key and its type.\n * <p>\n * The recommended usage is to create a type token:\n * <pre>\n *    private static ConfigurationKey&lt;String> KEY = new ConfigurationKey&lt;String>(\"keyName\", \"description\") {};\n * </pre>\n */\npublic abstract class ConfigurationKey<T> {\n\tprivate static final Pattern VALID_NAMES = Pattern.compile(\"[-_a-zA-Z][-.\\\\w]*(?<![-.])\");\n\t\n\tprivate static final TreeMap<String, ConfigurationKey<?>> registeredKeys = new TreeMap<String, ConfigurationKey<?>>(String.CASE_INSENSITIVE_ORDER);\n\tprivate static Map<String, ConfigurationKey<?>> copy;\n\t\n\tprivate final String keyName;\n\tprivate final String description;\n\tprivate final ConfigurationDataType type;\n\tprivate final boolean hidden;\n\t\n\tpublic ConfigurationKey(String keyName, String description) {\n\t\tthis(keyName, description, false);\n\t}\n\t\n\tpublic ConfigurationKey(String keyName, String description, boolean hidden) {\n\t\tthis.keyName = checkName(keyName);\n\t\t@SuppressWarnings(\"unchecked\")\n\t\tConfigurationDataType type = ConfigurationDataType.toDataType((Class<? extends ConfigurationKey<?>>)getClass());\n\t\tthis.type = type;\n\t\tthis.description = description;\n\t\tthis.hidden = hidden;\n\t\tregisterKey(keyName, this);\n\t}\n\t\n\tpublic final String getKeyName() {\n\t\treturn keyName;\n\t}\n\t\n\tpublic final String getDescription() {\n\t\treturn description;\n\t}\n\t\n\tpublic final ConfigurationDataType getType() {\n\t\treturn type;\n\t}\n\t\n\tpublic final boolean isHidden() {\n\t\treturn hidden;\n\t}\n\t\n\t@Override public String toString() {\n\t\treturn keyName + \" (\" + type + \"): \" + description;\n\t}\n\t\n\tprivate static String checkName(String keyName) {\n\t\tif (keyName == null) throw new NullPointerException(\"keyName\");\n\t\tif (!VALID_NAMES.matcher(keyName).matches()) throw new IllegalArgumentException(\"Invalid keyName: \" + keyName);\n\t\treturn keyName;\n\t}\n\t\n\t/** \n\t * Returns a copy of the currently registered keys.\n\t */\n\t@SuppressWarnings(\"unchecked\")\n\tpublic static Map<String, ConfigurationKey<?>> registeredKeys() {\n\t\tsynchronized (registeredKeys) {\n\t\t\tif (copy == null) copy = Collections.unmodifiableMap((Map<String, ConfigurationKey<?>>) registeredKeys.clone());\n\t\t\treturn copy;\n\t\t}\n\t}\n\t\n\tprivate static void registerKey(String keyName, ConfigurationKey<?> key) {\n\t\tsynchronized (registeredKeys) {\n\t\t\tif (registeredKeys.containsKey(keyName)) throw new IllegalArgumentException(\"Key '\" + keyName + \"' already registered\");\n\t\t\tregisteredKeys.put(keyName, key);\n\t\t\tcopy = null;\n\t\t}\n\t}\n}"
  },
  {
    "path": "src/core/lombok/core/configuration/ConfigurationKeysLoader.java",
    "content": "/*\n * Copyright (C) 2014 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\nimport java.io.IOException;\nimport java.util.Iterator;\nimport java.util.concurrent.atomic.AtomicBoolean;\n\nimport lombok.ConfigurationKeys;\nimport lombok.core.SpiLoadUtil;\n\npublic interface ConfigurationKeysLoader {\n\tpublic class LoaderLoader {\n\t\tprivate static final AtomicBoolean alreadyLoaded = new AtomicBoolean(false);\n\t\tprivate LoaderLoader() {}\n\t\t\n\t\tpublic static void loadAllConfigurationKeys() {\n\t\t\tif (alreadyLoaded.get()) return;\n\t\t\t\n\t\t\ttry {\n\t\t\t\tClass.forName(ConfigurationKeys.class.getName());\n\t\t\t} catch (Throwable ignore) {}\n\t\t\t\n\t\t\ttry {\n\t\t\t\tIterator<ConfigurationKeysLoader> iterator = SpiLoadUtil.findServices(ConfigurationKeysLoader.class, ConfigurationKeysLoader.class.getClassLoader()).iterator();\n\t\t\t\twhile (iterator.hasNext()) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\titerator.next();\n\t\t\t\t\t} catch (Exception ignore) {}\n\t\t\t\t}\n\t\t\t} catch (IOException e) {\n\t\t\t\tthrow new RuntimeException(\"Can't load config keys; services file issue.\", e);\n\t\t\t} finally {\n\t\t\t\talreadyLoaded.set(true);\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/configuration/ConfigurationParser.java",
    "content": "/*\n * Copyright (C) 2014-2020 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\nimport java.io.IOException;\nimport java.util.Map;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\npublic class ConfigurationParser {\n\tprivate static final Pattern LINE = Pattern.compile(\"(?:clear\\\\s+([^=]+))|(?:(\\\\S*?)\\\\s*([-+]?=)\\\\s*(.*?))\");\n\tprivate static final Pattern NEWLINE_FINDER = Pattern.compile(\"^[\\t ]*(.*?)[\\t\\r ]*$\", Pattern.MULTILINE);\n\tprivate static final Pattern IMPORT = Pattern.compile(\"import\\\\s+(.+?)\");\n\t\n\tprivate ConfigurationProblemReporter reporter;\n\t\n\tpublic ConfigurationParser(ConfigurationProblemReporter reporter) {\n\t\tif (reporter == null) throw new NullPointerException(\"reporter\");\n\t\tthis.reporter = reporter;\n\t}\n\t\n\tpublic void parse(ConfigurationFile context, Collector collector) {\n\t\tCharSequence contents = contents(context);\n\t\tif (contents == null) {\n\t\t\treturn;\n\t\t}\n\t\tMap<String, ConfigurationKey<?>> registeredKeys = ConfigurationKey.registeredKeys();\n\t\tint lineNumber = 0;\n\t\tMatcher lineMatcher = NEWLINE_FINDER.matcher(contents);\n\t\tboolean importsAllowed = true;\n\t\twhile (lineMatcher.find()) {\n\t\t\tCharSequence line = contents.subSequence(lineMatcher.start(1), lineMatcher.end(1));\n\t\t\tlineNumber++;\n\t\t\tif (line.length() == 0 || line.charAt(0) == '#') continue;\n\t\t\t\n\t\t\tMatcher importMatcher = IMPORT.matcher(line);\n\t\t\tif (importMatcher.matches()) {\n\t\t\t\tif (!importsAllowed) {\n\t\t\t\t\treporter.report(context.description(), \"Imports are only allowed in the top of the file\", lineNumber, line);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tString imported = importMatcher.group(1);\n\t\t\t\tConfigurationFile importFile = context.resolve(imported);\n\t\t\t\tif (importFile == null) {\n\t\t\t\t\treporter.report(context.description(), \"Import is not valid\", lineNumber, line);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (!importFile.exists()) {\n\t\t\t\t\treporter.report(context.description(), \"Imported file does not exist\", lineNumber, line);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tcollector.addImport(importFile, context, lineNumber);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tMatcher matcher = LINE.matcher(line);\n\t\t\tif (!matcher.matches()) {\n\t\t\t\treporter.report(context.description(), \"Invalid line\", lineNumber, line);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\timportsAllowed = false;\n\t\t\t\n\t\t\tString operator = null;\n\t\t\tString keyName = null;\n\t\t\tString stringValue;\n\t\t\tif (matcher.group(1) == null) {\n\t\t\t\tkeyName = matcher.group(2);\n\t\t\t\toperator = matcher.group(3);\n\t\t\t\tstringValue = matcher.group(4);\n\t\t\t} else {\n\t\t\t\tkeyName = matcher.group(1);\n\t\t\t\toperator = \"clear\";\n\t\t\t\tstringValue = null;\n\t\t\t}\n\t\t\tConfigurationKey<?> key = registeredKeys.get(keyName);\n\t\t\tif (key == null) {\n\t\t\t\treporter.report(context.description(), \"Unknown key '\" + keyName + \"'\", lineNumber, line);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tConfigurationDataType type = key.getType();\n\t\t\tboolean listOperator = operator.equals(\"+=\") || operator.equals(\"-=\");\n\t\t\tif (listOperator && !type.isList()) {\n\t\t\t\treporter.report(context.description(), \"'\" + keyName + \"' is not a list and doesn't support \" + operator + \" (only = and clear)\", lineNumber, line);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (operator.equals(\"=\") && type.isList()) {\n\t\t\t\treporter.report(context.description(), \"'\" + keyName + \"' is a list and cannot be assigned to (use +=, -= and clear instead)\", lineNumber, line);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tObject value = null;\n\t\t\tif (stringValue != null) try {\n\t\t\t\tvalue = type.getParser().parse(stringValue);\n\t\t\t} catch (Exception e) {\n\t\t\t\treporter.report(context.description(), \"Error while parsing the value for '\" + keyName + \"' value '\" + stringValue + \"' (should be \" + type.getParser().exampleValue() + \")\", lineNumber, line);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tif (operator.equals(\"clear\")) {\n\t\t\t\tcollector.clear(key, context, lineNumber);\n\t\t\t} else if (operator.equals(\"=\")) {\n\t\t\t\tcollector.set(key, value, context, lineNumber);\n\t\t\t} else if (operator.equals(\"+=\")) {\n\t\t\t\tcollector.add(key, value, context, lineNumber);\n\t\t\t} else {\n\t\t\t\tcollector.remove(key, value, context, lineNumber);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate CharSequence contents(ConfigurationFile context) {\n\t\ttry {\n\t\t\treturn context.contents();\n\t\t} catch (IOException e) {\n\t\t\treporter.report(context.description(), \"Exception while reading file: \" + e.getMessage(), 0, null);\n\t\t}\n\t\treturn null;\n\t}\n\t\n\tpublic interface Collector {\n\t\tvoid addImport(ConfigurationFile importFile, ConfigurationFile context, int lineNumber);\n\t\tvoid clear(ConfigurationKey<?> key, ConfigurationFile context, int lineNumber);\n\t\tvoid set(ConfigurationKey<?> key, Object value, ConfigurationFile context, int lineNumber);\n\t\tvoid add(ConfigurationKey<?> key, Object value, ConfigurationFile context, int lineNumber);\n\t\tvoid remove(ConfigurationKey<?> key, Object value, ConfigurationFile context, int lineNumber);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/configuration/ConfigurationProblemReporter.java",
    "content": "/*\n * Copyright (C) 2014 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\nimport lombok.eclipse.handlers.EclipseHandlerUtil;\n\npublic interface ConfigurationProblemReporter {\n\tvoid report(String sourceDescription, String problem, int lineNumber, CharSequence line);\n\t\n\tConfigurationProblemReporter CONSOLE = new ConfigurationProblemReporter() {\n\t\t@Override public void report(String sourceDescription, String problem, int lineNumber, CharSequence line) {\n\t\t\ttry {\n\t\t\t\t// The console (System.err) is non-existent in eclipse environments, so we should try to\n\t\t\t\t// log into at least the error log. This isn't really the appropriate place (should go in the\n\t\t\t\t// relevant file instead, most people never see anything in the error log either!), but at least\n\t\t\t\t// there is a way to see it, vs. System.err, which is completely invisible.\n\t\t\t\tEclipseHandlerUtil.warning(String.format(\"%s (%s:%d)\", problem, sourceDescription, lineNumber), null);\n\t\t\t} catch (Throwable ignore) {}\n\t\t\tSystem.err.printf(\"%s (%s:%d)\\n\", problem, sourceDescription, lineNumber);\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "src/core/lombok/core/configuration/ConfigurationResolver.java",
    "content": "/*\n * Copyright (C) 2013 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\npublic interface ConfigurationResolver {\n\t<T> T resolve(ConfigurationKey<T> key);\n}\n"
  },
  {
    "path": "src/core/lombok/core/configuration/ConfigurationResolverFactory.java",
    "content": "/*\n * Copyright (C) 2014-2018 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\nimport java.net.URI;\n\npublic interface ConfigurationResolverFactory {\n\tConfigurationResolver createResolver(URI sourceLocation);\n}\n"
  },
  {
    "path": "src/core/lombok/core/configuration/ConfigurationSource.java",
    "content": "/*\n * Copyright (C) 2014-2020 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\nimport java.util.List;\n\npublic interface ConfigurationSource {\n\t\n\tResult resolve(ConfigurationKey<?> key);\n\tList<ConfigurationFile> imports();\n\t\n\tpublic static final class Result {\n\t\tprivate final Object value;\n\t\tprivate final boolean authoritative;\n\t\t\n\t\tpublic Result(Object value, boolean authoritative) {\n\t\t\tthis.value = value;\n\t\t\tthis.authoritative = authoritative;\n\t\t}\n\t\t\n\t\tpublic Object getValue() {\n\t\t\treturn value;\n\t\t}\n\t\t\n\t\tpublic boolean isAuthoritative() {\n\t\t\treturn authoritative;\n\t\t}\n\t\t\n\t\t@Override public String toString() {\n\t\t\treturn String.valueOf(value) + (authoritative ? \" (set)\" : \" (delta)\");\n\t\t}\n\t}\n\t\n\tpublic static final class ListModification {\n\t\tprivate final Object value;\n\t\tprivate final boolean added;\n\t\t\n\t\tpublic ListModification(Object value, boolean added) {\n\t\t\tthis.value = value;\n\t\t\tthis.added = added;\n\t\t}\n\t\t\n\t\tpublic Object getValue() {\n\t\t\treturn value;\n\t\t}\n\t\t\n\t\tpublic boolean isAdded() {\n\t\t\treturn added;\n\t\t}\n\t}\n}"
  },
  {
    "path": "src/core/lombok/core/configuration/ConfigurationValueParser.java",
    "content": "/*\n * Copyright (C) 2013 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\ninterface ConfigurationValueParser {\n\tObject parse(String value);\n\tString description();\n\tString exampleValue();\n}"
  },
  {
    "path": "src/core/lombok/core/configuration/ConfigurationValueType.java",
    "content": "/*\n * Copyright (C) 2019-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\n/**\n * If a type used in {@link ConfigurationKey} type argument implements this interface,\n * it is expected to provide the following three static methods:\n * <ul>\n * <li><code>public static SELF valueOf(String value)</code></li>\n * <li><code>public static String description()</code></li>\n * <li><code>public static String exampleValue()</code></li>\n * </ul>\n * None of them should throw checked exceptions.\n * Based on these methods, an instance of {@link ConfigurationValueParser} is created\n * and used by the configuration system.\n */\npublic interface ConfigurationValueType {\n}\n"
  },
  {
    "path": "src/core/lombok/core/configuration/ExampleValueString.java",
    "content": "/*\n * Copyright (C) 2014 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * If a configuration key has an enum type, then the 'example values' string is built up by just joining all enum keys together with a bar separator, but you\n * can add this annotation to the enum type to override this string.\n */\n@Retention(RetentionPolicy.RUNTIME)\n@Target(ElementType.TYPE)\npublic @interface ExampleValueString {\n\tString value();\n}\n"
  },
  {
    "path": "src/core/lombok/core/configuration/FileSystemSourceCache.java",
    "content": "/*\n * Copyright (C) 2014-2020 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\nimport java.io.File;\nimport java.net.URI;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.ConcurrentMap;\nimport java.util.concurrent.TimeUnit;\n\nimport lombok.core.debug.ProblemReporter;\n\npublic class FileSystemSourceCache {\n\tprivate static final long FULL_CACHE_CLEAR_INTERVAL = TimeUnit.MINUTES.toMillis(30);\n\tprivate static final long RECHECK_FILESYSTEM = TimeUnit.SECONDS.toMillis(2);\n\tprivate static final long NEVER_CHECKED = -1;\n\tstatic final long MISSING = -88; // Magic value; any lombok.config with this exact epochmillis last modified will never be read, so, let's ensure nobody accidentally has one with that exact last modified stamp.\n\t\n\tprivate final ConcurrentMap<ConfigurationFile, Content> fileCache = new ConcurrentHashMap<ConfigurationFile, Content>(); // caches files to the content object that tracks content.\n\tprivate final ConcurrentMap<URI, ConfigurationFile> uriCache = new ConcurrentHashMap<URI, ConfigurationFile>(); // caches URIs of java source files to the dir that contains it.\n\tprivate volatile long lastCacheClear = System.currentTimeMillis();\n\t\n\tprivate void cacheClear() {\n\t\t// We never clear the caches, generally because it'd be weird if a compile run would continually create an endless stream of new java files.\n\t\t// Still, eventually that's going to cause a bit of a memory leak, so lets just completely clear them out every many minutes.\n\t\tlong now = System.currentTimeMillis();\n\t\tlong delta = now - lastCacheClear;\n\t\tif (delta > FULL_CACHE_CLEAR_INTERVAL) {\n\t\t\tlastCacheClear = now;\n\t\t\tfileCache.clear();\n\t\t\turiCache.clear();\n\t\t}\n\t}\n\t\n\tpublic ConfigurationFileToSource fileToSource(final ConfigurationParser parser) {\n\t\treturn new ConfigurationFileToSource() {\n\t\t\t@Override public ConfigurationSource parsed(ConfigurationFile fileLocation) {\n\t\t\t\treturn parseIfNeccesary(fileLocation, parser);\n\t\t\t}\n\t\t};\n\t}\n\t\n\tpublic ConfigurationFile forUri(URI javaFile) {\n\t\tif (javaFile == null) return null;\n\t\tcacheClear();\n\t\tConfigurationFile result = uriCache.get(javaFile);\n\t\tif (result == null) {\n\t\t\tURI uri = javaFile.normalize();\n\t\t\tif (!uri.isAbsolute()) uri = URI.create(\"file:\" + uri.toString());\n\t\t\t\n\t\t\ttry {\n\t\t\t\tFile file = new File(uri);\n\t\t\t\tif (!file.exists()) throw new IllegalArgumentException(\"File does not exist: \" + uri);\n\t\t\t\tFile directory = file.isDirectory() ? file : file.getParentFile();\n\t\t\t\tif (directory != null) result = ConfigurationFile.forDirectory(directory);\n\t\t\t\turiCache.put(javaFile, result);\n\t\t\t} catch (IllegalArgumentException e) {\n\t\t\t\t// This means that the file as passed is not actually a file at all, and some exotic path system is involved.\n\t\t\t\t// examples: sourcecontrol://jazz stuff, or an actual relative path (uri.isAbsolute() is completely different, that checks presence of schema!),\n\t\t\t\t// or it's eclipse trying to parse a snippet, which has \"/Foo.java\" as uri.\n\t\t\t\t// At some point it might be worth investigating abstracting away the notion of \"I can read lombok.config if present in\n\t\t\t\t// current context, and I can give you may parent context\", using ResourcesPlugin.getWorkspace().getRoot().findFilesForLocationURI(javaFile) as basis.\n\t\t\t\t\n\t\t\t\t// For now, we just carry on as if there is no lombok.config. (intentional fallthrough)\n\t\t\t} catch (Exception e) {\n\t\t\t\t// Especially for eclipse's sake, exceptions here make eclipse borderline unusable, so let's play nice.\n\t\t\t\tProblemReporter.error(\"Can't find absolute path of file being compiled: \" + javaFile, e);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tprivate ConfigurationSource parseIfNeccesary(ConfigurationFile file, ConfigurationParser parser) {\n\t\tlong now = System.currentTimeMillis();\n\t\tContent content = ensureContent(file);\n\t\tsynchronized (content) {\n\t\t\tif (content.lastChecked != NEVER_CHECKED && now - content.lastChecked < RECHECK_FILESYSTEM) {\n\t\t\t\treturn content.source;\n\t\t\t}\n\t\t\tcontent.lastChecked = now;\n\t\t\tlong previouslyModified = content.lastModified;\n\t\t\tcontent.lastModified = file.getLastModifiedOrMissing();\n\t\t\tif (content.lastModified != previouslyModified) content.source = content.lastModified == MISSING ? null : SingleConfigurationSource.parse(file, parser);\n\t\t\treturn content.source;\n\t\t}\n\t}\n\t\n\tprivate Content ensureContent(ConfigurationFile context) {\n\t\tContent content = fileCache.get(context);\n\t\tif (content != null) {\n\t\t\treturn content;\n\t\t}\n\t\tfileCache.putIfAbsent(context, Content.empty());\n\t\treturn fileCache.get(context);\n\t}\n\t\n\tprivate static class Content {\n\t\tConfigurationSource source;\n\t\tlong lastModified;\n\t\tlong lastChecked;\n\t\t\n\t\tprivate Content(ConfigurationSource source, long lastModified, long lastChecked) {\n\t\t\tthis.source = source;\n\t\t\tthis.lastModified = lastModified;\n\t\t\tthis.lastChecked = lastChecked;\n\t\t}\n\t\t\n\t\tstatic Content empty() {\n\t\t\treturn new Content(null, MISSING, NEVER_CHECKED);\n\t\t}\n\t}\n}"
  },
  {
    "path": "src/core/lombok/core/configuration/FlagUsageType.java",
    "content": "/*\n * Copyright (C) 2014-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\n/** Used for lombok configuration to flag usages of certain lombok features. */\npublic enum FlagUsageType {\n\tWARNING, ERROR, ALLOW;\n}\n"
  },
  {
    "path": "src/core/lombok/core/configuration/IdentifierName.java",
    "content": "/*\n * Copyright (C) 2019 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\nimport lombok.core.JavaIdentifiers;\n\npublic final class IdentifierName implements ConfigurationValueType {\n\tprivate final String name;\n\t\n\tprivate IdentifierName(String name) {\n\t\tthis.name = name;\n\t}\n\t\n\tpublic static IdentifierName valueOf(String name) {\n\t\tif (name == null || name.trim().isEmpty()) return null;\n\t\t\n\t\tString trimmedName = name.trim();\n\t\tif (!JavaIdentifiers.isValidJavaIdentifier(trimmedName)) throw new IllegalArgumentException(\"Invalid identifier \" + trimmedName);\n\t\treturn new IdentifierName(trimmedName);\n\t}\n\t\n\tpublic static String description() {\n\t\treturn \"identifier-name\";\n\t}\n\t\n\tpublic static String exampleValue() {\n\t\treturn \"<javaIdentifier>\";\n\t}\n\t\n\t@Override public boolean equals(Object obj) {\n\t\tif (!(obj instanceof IdentifierName)) return false;\n\t\treturn name.equals(((IdentifierName) obj).name);\n\t}\n\t\n\t@Override public int hashCode() {\n\t\treturn name.hashCode();\n\t}\n\t\n\t@Override public String toString() {\n\t\treturn name;\n\t}\n\t\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\t\n\tpublic char[] getCharArray() {\n\t\treturn name.toCharArray();\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/configuration/JacksonVersion.java",
    "content": "/*\n * Copyright (C) 2026 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\npublic enum JacksonVersion implements MappedConfigEnum {\n\tTWO,\n\tTHREE,\n\t;\n\t\n\t@Override public boolean matches(String value) {\n\t\tif (this == TWO) return \"2\".equals(value);\n\t\treturn \"3\".equals(value);\n\t}\n\t\n\t@Override public String toString() {\n\t\tif (this == TWO) return \"2\";\n\t\treturn \"3\";\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/configuration/LogDeclaration.java",
    "content": "/*\n * Copyright (C) 2019 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\npublic final class LogDeclaration implements ConfigurationValueType {\n\tprivate static final Pattern PARAMETERS_PATTERN = Pattern.compile(\"(?:\\\\(([A-Z,]*)\\\\))\");\n\tprivate static final Pattern DECLARATION_PATTERN = Pattern.compile(\"^(?:([^ ]+) )?([^(]+)\\\\.([^(]+)(\" + PARAMETERS_PATTERN.pattern() + \"+)$\");\n\t\n\tpublic enum LogFactoryParameter {\n\t\tTYPE, NAME, TOPIC, NULL;\n\t}\n\t\n\tprivate final TypeName loggerType;\n\tprivate final TypeName loggerFactoryType;\n\tprivate final IdentifierName loggerFactoryMethod;\n\tprivate final List<LogFactoryParameter> parametersWithoutTopic;\n\tprivate final List<LogFactoryParameter> parametersWithTopic;\n\t\n\tprivate LogDeclaration(TypeName loggerType, TypeName loggerFactoryType, IdentifierName loggerFactoryMethod, List<LogFactoryParameter> parametersWithoutTopic, List<LogFactoryParameter> parametersWithTopic) {\n\t\tthis.loggerType = loggerType;\n\t\tthis.loggerFactoryType = loggerFactoryType;\n\t\tthis.loggerFactoryMethod = loggerFactoryMethod;\n\t\tthis.parametersWithoutTopic = parametersWithoutTopic;\n\t\tthis.parametersWithTopic = parametersWithTopic;\n\t}\n\t\n\tpublic static LogDeclaration valueOf(String declaration) {\n\t\tif (declaration == null) return null;\n\t\t\n\t\tMatcher matcher = DECLARATION_PATTERN.matcher(declaration);\n\t\tif (!matcher.matches()) throw new IllegalArgumentException(\"The declaration must follow the pattern: [LoggerType ]LoggerFactoryType.loggerFactoryMethod(loggerFactoryMethodParams)[(loggerFactoryMethodParams)]\");\n\t\t\n\t\tTypeName loggerFactoryType = TypeName.valueOf(matcher.group(2));\n\t\tTypeName loggerType = TypeName.valueOf(matcher.group(1));\n\t\tif (loggerType == null) loggerType = loggerFactoryType;\n\t\tIdentifierName loggerFactoryMethod = IdentifierName.valueOf(matcher.group(3));\n\t\tList<List<LogFactoryParameter>> allParameters = parseParameters(matcher.group(4));\n\t\t\n\t\tList<LogFactoryParameter> parametersWithoutTopic = null;\n\t\tList<LogFactoryParameter> parametersWithTopic = null;\n\t\tfor (List<LogFactoryParameter> parameters: allParameters) {\n\t\t\tif (parameters.contains(LogFactoryParameter.TOPIC)) {\n\t\t\t\tif (parametersWithTopic != null) throw new IllegalArgumentException(\"There is more than one parameter definition that includes TOPIC: \" + parametersWithTopic + \" and \" + parameters);\n\t\t\t\tparametersWithTopic = parameters;\n\t\t\t} else {\n\t\t\t\tif (parametersWithoutTopic != null) throw new IllegalArgumentException(\"There is more than one parmaeter definition that does not include TOPIC: \" + parametersWithoutTopic + \" and \" + parameters);\n\t\t\t\tparametersWithoutTopic = parameters;\n\t\t\t}\n\t\t}\n\t\t\n\t\t// sanity check (the pattern should disallow this situation\n\t\tif (parametersWithoutTopic == null && parametersWithTopic == null) throw new IllegalArgumentException(\"No logger factory method parameters specified.\");\n\t\t\n\t\treturn new LogDeclaration(loggerType, loggerFactoryType, loggerFactoryMethod, parametersWithoutTopic, parametersWithTopic);\n\t}\n\t\n\tprivate static List<List<LogFactoryParameter>> parseParameters(String parametersDefinitions) {\n\t\tList<List<LogFactoryParameter>> allParameters = new ArrayList<List<LogFactoryParameter>>();\n\t\tMatcher matcher = PARAMETERS_PATTERN.matcher(parametersDefinitions);\n\t\twhile (matcher.find()) {\n\t\t\tString parametersDefinition = matcher.group(1);\n\t\t\tList<LogFactoryParameter> parameters = new ArrayList<LogFactoryParameter>();\n\t\t\tif (!parametersDefinition.isEmpty()) { \n\t\t\t\tfor (String parameter : parametersDefinition.split(\",\")) {\n\t\t\t\t\tparameters.add(LogFactoryParameter.valueOf(parameter));\n\t\t\t\t}\n\t\t\t}\n\t\t\tallParameters.add(parameters);\n\t\t}\n\t\treturn allParameters;\n\t}\n\t\n\tpublic static String description() {\n\t\treturn \"custom-log-declaration\";\n\t}\n\t\n\tpublic static String exampleValue() {\n\t\treturn \"my.cool.Logger my.cool.LoggerFactory.createLogger()(TOPIC,TYPE)\";\n\t}\n\t\n\t@Override public boolean equals(Object obj) {\n\t\tif (!(obj instanceof LogDeclaration)) return false;\n\t\treturn loggerType.equals(((LogDeclaration) obj).loggerType)\n\t\t\t&& loggerFactoryType.equals(((LogDeclaration) obj).loggerFactoryType)\n\t\t\t&& loggerFactoryMethod.equals(((LogDeclaration) obj).loggerFactoryMethod)\n\t\t\t&& parametersWithoutTopic == ((LogDeclaration) obj).parametersWithoutTopic || parametersWithoutTopic.equals(((LogDeclaration) obj).parametersWithoutTopic)\n\t\t\t&& parametersWithTopic == ((LogDeclaration) obj).parametersWithTopic || parametersWithTopic.equals(((LogDeclaration) obj).parametersWithTopic);\n\t}\n\t\n\t@Override public int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = 1;\n\t\tresult = prime * result + loggerType.hashCode();\n\t\tresult = prime * result + loggerFactoryType.hashCode();\n\t\tresult = prime * result + loggerFactoryMethod.hashCode();\n\t\tresult = prime * result + ((parametersWithTopic == null) ? 0 : parametersWithTopic.hashCode());\n\t\tresult = prime * result + ((parametersWithoutTopic == null) ? 0 : parametersWithoutTopic.hashCode());\n\t\treturn result;\n\t}\n\t\n\t@Override public String toString() {\n\t\tStringBuilder sb = new StringBuilder();\n\t\tsb.append(loggerType);\n\t\tsb.append(\" \");\n\t\tsb.append(loggerFactoryType);\n\t\tsb.append(\".\");\n\t\tsb.append(loggerFactoryMethod);\n\t\tappendParams(sb, parametersWithoutTopic);\n\t\tappendParams(sb, parametersWithTopic);\n\t\treturn sb.toString();\n\t}\n\t\n\tprivate static void appendParams(StringBuilder sb, List<LogFactoryParameter> params) {\n\t\tif (params != null) {\n\t\t\tsb.append(\"(\");\n\t\t\tboolean first = true;\n\t\t\tfor (LogFactoryParameter param : params) {\n\t\t\t\tif (!first) {\n\t\t\t\t\tsb.append(\",\");\n\t\t\t\t}\n\t\t\t\tfirst = false;\n\t\t\t\tsb.append(param);\n\t\t\t}\n\t\t\tsb.append(\")\");\n\t\t}\n\t}\n\t\n\tpublic TypeName getLoggerType() {\n\t\treturn loggerType;\n\t}\n\t\n\tpublic TypeName getLoggerFactoryType() {\n\t\treturn loggerFactoryType;\n\t}\n\t\n\tpublic IdentifierName getLoggerFactoryMethod() {\n\t\treturn loggerFactoryMethod;\n\t}\n\t\n\tpublic List<LogFactoryParameter> getParametersWithoutTopic() {\n\t\treturn parametersWithoutTopic;\n\t}\n\t\n\tpublic List<LogFactoryParameter> getParametersWithTopic() {\n\t\treturn parametersWithTopic;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/configuration/MappedConfigEnum.java",
    "content": "/*\n * Copyright (C) 2026 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\npublic interface MappedConfigEnum {\n\tboolean matches(String value);\n}\n"
  },
  {
    "path": "src/core/lombok/core/configuration/NullAnnotationLibrary.java",
    "content": "/*\n * Copyright (C) 2020-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\nimport java.lang.reflect.Field;\nimport java.lang.reflect.Modifier;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\n\npublic final class NullAnnotationLibrary implements ConfigurationValueType {\n\tprivate final String key;\n\tprivate final String nonNullAnnotation;\n\tprivate final String nullableAnnotation;\n\tprivate final boolean typeUse;\n\t\n\tprivate NullAnnotationLibrary(String key, String nonNullAnnotation, String nullableAnnotation, boolean typeUse) {\n\t\tthis.key = key;\n\t\tthis.nonNullAnnotation = nonNullAnnotation;\n\t\tthis.nullableAnnotation = nullableAnnotation;\n\t\tthis.typeUse = typeUse;\n\t}\n\t\n\t/**\n\t * Returns the fully qualified annotation name to apply to non-null elements. If {@code null} is returned, apply no annotation.\n\t */\n\tpublic String getNonNullAnnotation() {\n\t\treturn nonNullAnnotation;\n\t}\n\t\n\t/**\n\t * Returns the fully qualified annotation name to apply to nullable elements. If {@code null} is returned, apply no annotation.\n\t */\n\tpublic String getNullableAnnotation() {\n\t\treturn nullableAnnotation;\n\t}\n\t\n\t/**\n\t * If {@code true}, the annotation can only be used in TYPE_USE form, otherwise, prefer to annotate the parameter, not the type of the parameter (or the method, not the return type, etc).\n\t */\n\tpublic boolean isTypeUse() {\n\t\treturn typeUse;\n\t}\n\t\n\tpublic static final NullAnnotationLibrary NONE = new NullAnnotationLibrary(\"none\", null, null, false);\n\tpublic static final NullAnnotationLibrary JAVAX = new NullAnnotationLibrary(\"javax\", \"javax.annotation.Nonnull\", \"javax.annotation.Nullable\", false);\n\tpublic static final NullAnnotationLibrary JAKARTA = new NullAnnotationLibrary(\"jakarta\", \"jakarta.annotation.Nonnull\", \"jakarta.annotation.Nullable\", false);\n\tpublic static final NullAnnotationLibrary ECLIPSE = new NullAnnotationLibrary(\"eclipse\", \"org.eclipse.jdt.annotation.NonNull\", \"org.eclipse.jdt.annotation.Nullable\", true);\n\tpublic static final NullAnnotationLibrary JETBRAINS = new NullAnnotationLibrary(\"jetbrains\", \"org.jetbrains.annotations.NotNull\", \"org.jetbrains.annotations.Nullable\", false);\n\tpublic static final NullAnnotationLibrary NETBEANS = new NullAnnotationLibrary(\"netbeans\", \"org.netbeans.api.annotations.common.NonNull\", \"org.netbeans.api.annotations.common.NullAllowed\", false);\n\tpublic static final NullAnnotationLibrary ANDROIDX = new NullAnnotationLibrary(\"androidx\", \"androidx.annotation.NonNull\", \"androidx.annotation.Nullable\", false);\n\tpublic static final NullAnnotationLibrary ANDROID_SUPPORT = new NullAnnotationLibrary(\"android.support\", \"android.support.annotation.NonNull\", \"android.support.annotation.Nullable\", false);\n\tpublic static final NullAnnotationLibrary CHECKERFRAMEWORK = new NullAnnotationLibrary(\"checkerframework\", \"org.checkerframework.checker.nullness.qual.NonNull\", \"org.checkerframework.checker.nullness.qual.Nullable\", true);\n\tpublic static final NullAnnotationLibrary FINDBUGS = new NullAnnotationLibrary(\"findbugs\", \"edu.umd.cs.findbugs.annotations.NonNull\", \"edu.umd.cs.findbugs.annotations.Nullable\", false);\n\tpublic static final NullAnnotationLibrary SPRING = new NullAnnotationLibrary(\"spring\", \"org.springframework.lang.NonNull\", \"org.springframework.lang.Nullable\", false);\n\tpublic static final NullAnnotationLibrary JML = new NullAnnotationLibrary(\"jml\", \"org.jmlspecs.annotation.NonNull\", \"org.jmlspecs.annotation.Nullable\", false);\n\tpublic static final NullAnnotationLibrary JSPECIFY = new NullAnnotationLibrary(\"jspecify\", \"org.jspecify.annotations.NonNull\", \"org.jspecify.annotations.Nullable\", true);\n\n\tprivate static final List<NullAnnotationLibrary> ALL_AVAILABLE;\n\tprivate static final String EXAMPLE_VALUE;\n\t\n\tstatic {\n\t\tArrayList<NullAnnotationLibrary> out = new ArrayList<NullAnnotationLibrary>();\n\t\tStringBuilder example = new StringBuilder();\n\t\tfor (Field f : NullAnnotationLibrary.class.getDeclaredFields()) {\n\t\t\tif (f.getType() != NullAnnotationLibrary.class || !Modifier.isStatic(f.getModifiers()) || !Modifier.isPublic(f.getModifiers())) continue;\n\t\t\ttry {\n\t\t\t\tNullAnnotationLibrary nal = (NullAnnotationLibrary) f.get(null);\n\t\t\t\tout.add(nal);\n\t\t\t\texample.append(nal.key).append(\" | \");\n\t\t\t} catch (IllegalAccessException e) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tout.trimToSize();\n\t\texample.append(\"CUSTOM:com.foo.my.nonnull.annotation:com.foo.my.nullable.annotation\");\n\t\tALL_AVAILABLE = Collections.unmodifiableList(out);\n\t\tEXAMPLE_VALUE = example.toString();\n\t}\n\t\n\tpublic static NullAnnotationLibrary custom(String nonNullAnnotation, String nullableAnnotation, boolean typeUse) {\n\t\tif (nonNullAnnotation == null && nullableAnnotation == null) return NONE;\n\t\tString typeUseStr = typeUse ? \"TYPE_USE:\" : \"\";\n\t\tif (nullableAnnotation == null) return new NullAnnotationLibrary(\"custom:\" + typeUseStr + nonNullAnnotation, nonNullAnnotation, null, typeUse);\n\t\tif (nonNullAnnotation == null) return new NullAnnotationLibrary(\"custom::\" + typeUseStr + nullableAnnotation, null, nullableAnnotation, typeUse);\n\t\treturn new NullAnnotationLibrary(\"custom:\" + typeUseStr + nonNullAnnotation + \":\" + nullableAnnotation, nonNullAnnotation, nullableAnnotation, typeUse);\n\t}\n\t\n\tpublic static String description() {\n\t\treturn \"nullity-annotation-library\";\n\t}\n\t\n\tpublic static String exampleValue() {\n\t\treturn EXAMPLE_VALUE;\n\t}\n\t\n\tpublic static NullAnnotationLibrary valueOf(String in) {\n\t\tString ci = in == null ? \"\" : in.toLowerCase();\n\t\tif (ci.length() == 0) return NONE;\n\t\tfor (NullAnnotationLibrary nal : ALL_AVAILABLE) if (nal.key.equals(ci)) return nal;\n\t\tif (!ci.startsWith(\"custom:\")) {\n\t\t\tStringBuilder out = new StringBuilder(\"Invalid null annotation library. Valid options: \");\n\t\t\tfor (NullAnnotationLibrary nal : ALL_AVAILABLE) out.append(nal.key).append(\", \");\n\t\t\tout.setLength(out.length() - 2);\n\t\t\tout.append(\" or CUSTOM:[TYPE_USE:]nonnull.annotation.type:nullable.annotation.type\");\n\t\t\tthrow new IllegalArgumentException(out.toString());\n\t\t}\n\t\tboolean typeUse = ci.startsWith(\"custom:type_use:\");\n\t\tint start = typeUse ? 16 : 7;\n\t\tint split = ci.indexOf(':', start);\n\t\tif (split == -1) {\n\t\t\tString nonNullAnnotation = in.substring(start);\n\t\t\treturn custom(verifyTypeName(nonNullAnnotation), null, typeUse);\n\t\t}\n\t\tString nonNullAnnotation = in.substring(start, split);\n\t\tString nullableAnnotation = in.substring(split + 1);\n\t\treturn custom(verifyTypeName(nonNullAnnotation), verifyTypeName(nullableAnnotation), typeUse);\n\t}\n\t\n\tprivate static final String MSG = \"Not an identifier (provide a fully qualified type for custom: nullity annotations): \";\n\tprivate static String verifyTypeName(String fqn) {\n\t\tboolean atStart = true;\n\t\tfor (int i = 0; i < fqn.length(); i++) {\n\t\t\tchar c = fqn.charAt(i);\n\t\t\tif (Character.isJavaIdentifierStart(c)) {\n\t\t\t\tatStart = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (atStart) throw new IllegalArgumentException(MSG + fqn);\n\t\t\tif (c == '.') {\n\t\t\t\tatStart = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (Character.isJavaIdentifierPart(c)) continue;\n\t\t\tthrow new IllegalArgumentException(MSG + fqn);\n\t\t}\n\t\tif (atStart) throw new IllegalArgumentException(MSG + fqn);\n\t\treturn fqn;\n\t}\n\t\n\t@Override public String toString() {\n\t\treturn key;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/configuration/NullCheckExceptionType.java",
    "content": "/*\n * Copyright (C) 2014-2020 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\nimport lombok.core.LombokImmutableList;\n\n@ExampleValueString(\"[NullPointerException | IllegalArgumentException | Assertion | JDK | Guava]\")\npublic enum NullCheckExceptionType {\n\tILLEGAL_ARGUMENT_EXCEPTION {\n\t\t@Override public String getExceptionType() {\n\t\t\treturn \"java.lang.IllegalArgumentException\";\n\t\t}\n\n\t\t@Override public LombokImmutableList<String> getMethod() {\n\t\t\treturn null;\n\t\t}\n\t},\n\tNULL_POINTER_EXCEPTION {\n\t\t@Override public String getExceptionType() {\n\t\t\treturn \"java.lang.NullPointerException\";\n\t\t}\n\n\t\t@Override public LombokImmutableList<String> getMethod() {\n\t\t\treturn null;\n\t\t}\n\t},\n\tASSERTION {\n\t\t@Override public String getExceptionType() {\n\t\t\treturn null;\n\t\t}\n\n\t\t@Override public LombokImmutableList<String> getMethod() {\n\t\t\treturn null;\n\t\t}\n\t},\n\tJDK {\n\t\t@Override public String getExceptionType() {\n\t\t\treturn null;\n\t\t}\n\n\t\t@Override public LombokImmutableList<String> getMethod() {\n\t\t\treturn METHOD_JDK;\n\t\t}\n\t},\n\tGUAVA {\n\t\t@Override public String getExceptionType() {\n\t\t\treturn null;\n\t\t}\n\n\t\t@Override public LombokImmutableList<String> getMethod() {\n\t\t\treturn METHOD_GUAVA;\n\t\t}\n\t};\n\t\n\tprivate static final LombokImmutableList<String> METHOD_JDK = LombokImmutableList.of(\"java\", \"util\", \"Objects\", \"requireNonNull\");\n\tprivate static final LombokImmutableList<String> METHOD_GUAVA = LombokImmutableList.of(\"com\", \"google\", \"common\", \"base\", \"Preconditions\", \"checkNotNull\");\n\t\n\tpublic String toExceptionMessage(String fieldName, String customMessage) {\n\t\tif (customMessage == null) return fieldName + \" is marked non-null but is null\";\n\t\treturn customMessage.replace(\"%s\", fieldName);\n\t}\n\t\n\tpublic abstract String getExceptionType();\n\t\n\tpublic abstract LombokImmutableList<String> getMethod();\n}\n"
  },
  {
    "path": "src/core/lombok/core/configuration/SingleConfigurationSource.java",
    "content": "/*\n * Copyright (C) 2014-2020 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\n\nimport lombok.core.configuration.ConfigurationParser.Collector;\n\npublic final class SingleConfigurationSource implements ConfigurationSource {\n\tprivate final Map<ConfigurationKey<?>, Result> values;\n\tprivate final List<ConfigurationFile> imports;\n\t\n\tpublic static ConfigurationSource parse(ConfigurationFile context, ConfigurationParser parser) {\n\t\tfinal Map<ConfigurationKey<?>, Result> values = new HashMap<ConfigurationKey<?>, Result>();\n\t\tfinal List<ConfigurationFile> imports = new ArrayList<ConfigurationFile>();\n\t\tCollector collector = new Collector() {\n\t\t\t@Override public void addImport(ConfigurationFile importFile, ConfigurationFile context, int lineNumber) {\n\t\t\t\timports.add(importFile);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public void clear(ConfigurationKey<?> key, ConfigurationFile context, int lineNumber) {\n\t\t\t\tvalues.put(key, new Result(null, true));\n\t\t\t}\n\t\t\t\n\t\t\t@Override public void set(ConfigurationKey<?> key, Object value, ConfigurationFile context, int lineNumber) {\n\t\t\t\tvalues.put(key, new Result(value, true));\n\t\t\t}\n\t\t\t\n\t\t\t@Override public void add(ConfigurationKey<?> key, Object value, ConfigurationFile context, int lineNumber) {\n\t\t\t\tmodifyList(key, value, true);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public void remove(ConfigurationKey<?> key, Object value, ConfigurationFile context, int lineNumber) {\n\t\t\t\tmodifyList(key, value, false);\n\t\t\t}\n\t\t\t\n\t\t\t@SuppressWarnings(\"unchecked\")\n\t\t\tprivate void modifyList(ConfigurationKey<?> key, Object value, boolean add) {\n\t\t\t\tResult result = values.get(key);\n\t\t\t\tList<ListModification> list;\n\t\t\t\tif (result == null || result.getValue() == null) {\n\t\t\t\t\tlist = new ArrayList<ConfigurationSource.ListModification>();\n\t\t\t\t\tvalues.put(key, new Result(list, result != null));\n\t\t\t\t} else {\n\t\t\t\t\tlist = (List<ListModification>) result.getValue();\n\t\t\t\t}\n\t\t\t\tlist.add(new ListModification(value, add));\n\t\t\t}\n\t\t};\n\t\tparser.parse(context, collector);\n\t\treturn new SingleConfigurationSource(values, imports);\n\t}\n\t\n\tprivate SingleConfigurationSource(Map<ConfigurationKey<?>, Result> values, List<ConfigurationFile> imports) {\n\t\tthis.values = new HashMap<ConfigurationKey<?>, Result>();\n\t\tfor (Entry<ConfigurationKey<?>, Result> entry : values.entrySet()) {\n\t\t\tResult result = entry.getValue();\n\t\t\tif (result.getValue() instanceof List<?>) {\n\t\t\t\tthis.values.put(entry.getKey(), new Result(Collections.unmodifiableList((List<?>) result.getValue()), result.isAuthoritative()));\n\t\t\t} else {\n\t\t\t\tthis.values.put(entry.getKey(), result);\n\t\t\t}\n\t\t}\n\t\tthis.imports = Collections.unmodifiableList(imports);\n\t}\n\t\n\t@Override \n\tpublic Result resolve(ConfigurationKey<?> key) {\n\t\treturn values.get(key);\n\t}\n\t\n\t@Override\n\tpublic List<ConfigurationFile> imports() {\n\t\treturn imports;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/configuration/TypeName.java",
    "content": "/*\n * Copyright (C) 2013-2019 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\nimport lombok.core.JavaIdentifiers;\n\npublic final class TypeName implements ConfigurationValueType {\n\tprivate final String name;\n\t\n\tprivate TypeName(String name) {\n\t\tthis.name = name;\n\t}\n\t\n\tpublic static TypeName valueOf(String name) {\n\t\tif (name == null || name.trim().isEmpty()) return null;\n\t\t\n\t\tString trimmedName = name.trim();\n\t\tfor (String identifier : trimmedName.split(\"\\\\.\")) {\n\t\t\tif (!JavaIdentifiers.isValidJavaIdentifier(identifier)) throw new IllegalArgumentException(\"Invalid type name \" + trimmedName + \" (part \" + identifier + \")\");\n\t\t}\n\t\treturn new TypeName(trimmedName);\n\t}\n\t\n\tpublic static String description() {\n\t\treturn \"type-name\";\n\t}\n\t\n\tpublic static String exampleValue() {\n\t\treturn \"<fully.qualified.Type>\";\n\t}\n\t\n\t@Override public boolean equals(Object obj) {\n\t\tif (!(obj instanceof TypeName)) return false;\n\t\treturn name.equals(((TypeName) obj).name);\n\t}\n\t\n\t@Override public int hashCode() {\n\t\treturn name.hashCode();\n\t}\n\t\n\t@Override public String toString() {\n\t\treturn name;\n\t}\n\t\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\t\n\tpublic char[] getCharArray() {\n\t\treturn name.toCharArray();\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/debug/AssertionLogger.java",
    "content": "/*\n * Copyright (C) 2015 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.debug;\n\nimport java.io.FileOutputStream;\nimport java.io.OutputStream;\nimport java.io.PrintWriter;\nimport java.io.StringWriter;\nimport java.util.Date;\nimport java.util.Random;\nimport java.util.concurrent.atomic.AtomicBoolean;\n\nimport lombok.core.Version;\n\n/**\n * We make a number of assumptions in lombok code, and if these assumptions fail, we try to fall back to a 'least bad' scenario. However, we would prefer to\n * just know about these cases, without confronting our users with error messages. The 'fix' is to log such assertion failures to this logger, which promptly\n * ignores them, _unless_ you specifically enable logging them to a file. If you'd like to help out or want to assist in debugging, turn this on.\n */\npublic class AssertionLogger {\n\tprivate static final String LOG_PATH;\n\t\n\tstatic {\n\t\tString log = System.getProperty(\"lombok.assertion.log\", null);\n\t\tif (log != null) {\n\t\t\tLOG_PATH = log.isEmpty() ? null : log;\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tlog = System.getenv(\"LOMBOK_ASSERTION_LOG\");\n\t\t\t} catch (Exception e) {\n\t\t\t\tlog = null;\n\t\t\t}\n\t\t\tLOG_PATH = (log == null || log.isEmpty()) ? null : log;\n\t\t}\n\t}\n\t\n\tprivate static final AtomicBoolean loggedIntro = new AtomicBoolean(false);\n\tprivate static final String PROCESS_ID = generateProcessId();\n\t\n\tprivate static final String ID_CHARS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\t\n\tprivate static String generateProcessId() {\n\t\tchar[] ID = new char[4];\n\t\tRandom r = new Random();\n\t\tfor (int i = 0; i < ID.length; i++) ID[i] = ID_CHARS.charAt(r.nextInt(ID_CHARS.length()));\n\t\treturn new String(ID);\n\t}\n\t\n\tprivate static synchronized void logToFile(String msg) {\n\t\tif (msg == null) return;\n\t\t\n\t\ttry {\n\t\t\tOutputStream out = new FileOutputStream(LOG_PATH, true);\n\t\t\tout.write(msg.getBytes(\"UTF-8\"));\n\t\t\tout.close();\n\t\t} catch (Exception e) {\n\t\t\tthrow new RuntimeException(\"assertion logging can't write to log file\", e);\n\t\t}\n\t}\n\t\n\tprivate static void logIntro() {\n\t\tif (loggedIntro.getAndSet(true)) return;\n\t\t\n\t\tString version;\n\t\ttry {\n\t\t\tversion = Version.getFullVersion();\n\t\t} catch (Exception e) {\n\t\t\tversion = Version.getVersion();\n\t\t}\n\t\t\n\t\tlogToFile(String.format(\"{%s} [%s -- START %s]\\n\", PROCESS_ID, new Date(), version));\n\t}\n\t\n\tpublic static <T extends Throwable> T assertLog(String message, T throwable) {\n\t\tif (LOG_PATH == null) return throwable;\n\t\t\n\t\tlogIntro();\n\t\t\n\t\tif (message == null) message = \"(No message)\";\n\t\tString stackMsg = \"\";\n\t\tif (throwable != null) {\n\t\t\tStringWriter sw = new StringWriter();\n\t\t\tPrintWriter pw = new PrintWriter(sw);\n\t\t\tthrowable.printStackTrace(pw);\n\t\t\tpw.close();\n\t\t\tstackMsg = \"\\n  \" + sw.toString().replace(\"\\r\", \"\").replace(\"\\n\", \"\\n  \").trim();\n\t\t}\n\t\tlogToFile(String.format(\"{%s} [%ty%<tm%<tdT%<tH%<tM%<tS.%<tL] %s%s\\n\", PROCESS_ID, new Date(), message, stackMsg));\n\t\treturn throwable;\n\t}\n\t\n\tpublic static void assertLog(String message) {\n\t\tif (LOG_PATH == null) return;\n\t\tassertLog(message, null);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/debug/DebugSnapshot.java",
    "content": "/*\n * Copyright (C) 2012-2014 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\npackage lombok.core.debug;\n\nimport java.lang.ref.WeakReference;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.atomic.AtomicLong;\n\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;\n\npublic class DebugSnapshot implements Comparable<DebugSnapshot> {\n\tprivate static AtomicLong counter = new AtomicLong();\n\t\n\tprivate final long when, id = counter.getAndIncrement();\n\tprivate final long bits;\n\tprivate final List<StackTraceElement> trace;\n\tprivate final String threadName;\n\tprivate final String message;\n\tprivate final Object[] params;\n\tprivate final WeakReference<CompilationUnitDeclaration> owner;\n\t\n\tpublic DebugSnapshot(CompilationUnitDeclaration owner, int stackHiding, String message, Object... params) {\n\t\tthis.when = System.currentTimeMillis();\n\t\tthis.bits = owner.bits;\n\t\tif (stackHiding < 0) {\n\t\t\tthis.trace = null;\n\t\t} else {\n\t\t\tStackTraceElement[] stackTrace = new Throwable().getStackTrace();\n\t\t\tthis.trace = new ArrayList<StackTraceElement>(Math.max(0, stackTrace.length - stackHiding - 1));\n\t\t\tfor (int i = 1 + stackHiding; i < stackTrace.length; i++) trace.add(stackTrace[i]);\n\t\t}\n\t\tthis.threadName = Thread.currentThread().getName();\n\t\tthis.message = message;\n\t\tthis.params = params == null ? new Object[0] : params;\n\t\tthis.owner = new WeakReference<CompilationUnitDeclaration>(owner);\n\t}\n\t\n\tprivate String ownerName() {\n\t\tCompilationUnitDeclaration node = owner.get();\n\t\tif (node == null) return \"--GCed--\";\n\t\tchar[] tn = node.getMainTypeName();\n\t\tchar[] fs = node.getFileName();\n\t\tif (tn == null || tn.length == 0) {\n\t\t\treturn (fs == null || fs.length == 0) ? \"--UNKNOWN--\" : new String(fs);\n\t\t}\n\t\t\n\t\treturn new String(tn);\n\t}\n\t\n\tpublic String shortToString() {\n\t\tStringBuilder out = new StringBuilder();\n\t\tout.append(String.format(\"WHEN: %14d THREAD: %s AST: %s HAMB: %b -- \", when, threadName, ownerName(), 0 != (bits & ASTNode.HasAllMethodBodies)));\n\t\tif (message != null) out.append(\" \").append(String.format(message, params));\n\t\treturn out.toString();\n\t}\n\t\n\t@Override public String toString() {\n\t\tStringBuilder out = new StringBuilder();\n\t\tout.append(shortToString()).append(\"\\n\");\n\t\tif (trace == null) {\n\t\t\tout.append(\"    Stack Omitted\");\n\t\t} else {\n\t\t\tfor (StackTraceElement elem : trace) {\n\t\t\t\tout.append(\"    \").append(elem.toString()).append(\"\\n\");\n\t\t\t}\n\t\t}\n\t\treturn out.toString();\n\t}\n\t\n\t@Override public int compareTo(DebugSnapshot o) {\n\t\treturn Long.valueOf(id).compareTo(o.id);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/debug/DebugSnapshotStore.java",
    "content": "/*\n * Copyright (C) 2012-2014 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\npackage lombok.core.debug;\n\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.io.OutputStream;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.WeakHashMap;\n\nimport org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;\n\npublic class DebugSnapshotStore {\n\tpublic static final DebugSnapshotStore INSTANCE = new DebugSnapshotStore();\n\tpublic static final boolean GLOBAL_DSS_DISABLE_SWITCH = true;\n\t\n\t// All access should synchronize on the map\n\tprivate final Map<CompilationUnitDeclaration, List<DebugSnapshot>> map =\n\t\t\tnew WeakHashMap<CompilationUnitDeclaration, List<DebugSnapshot>>();\n\t\n\tpublic void snapshot(CompilationUnitDeclaration owner, String message, Object... params) {\n\t\tif (GLOBAL_DSS_DISABLE_SWITCH) return;\n\t\tDebugSnapshot snapshot = new DebugSnapshot(owner, 1, message, params);\n\t\tList<DebugSnapshot> list;\n\t\t\n\t\tsynchronized (map) {\n\t\t\tlist = map.get(owner);\n\t\t\tif (list == null) {\n\t\t\t\tlist = new ArrayList<DebugSnapshot>();\n\t\t\t\tmap.put(owner, list);\n\t\t\t\tlist.add(snapshot);\n\t\t\t} else if (!list.isEmpty()) {\n\t\t\t\tlist.add(snapshot);\n\t\t\t} else {\n\t\t\t\t// An empty list is an indicator that we no longer care about that particular CUD.\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic void log(CompilationUnitDeclaration owner, String message, Object... params) {\n\t\tif (GLOBAL_DSS_DISABLE_SWITCH) return;\n\t\tDebugSnapshot snapshot = new DebugSnapshot(owner, -1, message, params);\n\t\tList<DebugSnapshot> list;\n\t\t\n\t\tsynchronized (map) {\n\t\t\tlist = map.get(owner);\n\t\t\tif (list == null) {\n\t\t\t\tlist = new ArrayList<DebugSnapshot>();\n\t\t\t\tmap.put(owner, list);\n\t\t\t\tlist.add(snapshot);\n\t\t\t} else if (!list.isEmpty()) {\n\t\t\t\tlist.add(snapshot);\n\t\t\t} else {\n\t\t\t\t// An empty list is an indicator that we no longer care about that particular CUD.\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic String print(CompilationUnitDeclaration owner, String message, Object... params) {\n\t\tif (GLOBAL_DSS_DISABLE_SWITCH) return null;\n\t\tList<DebugSnapshot> list;\n\t\t\n\t\tsynchronized (map) {\n\t\t\tsnapshot(owner, message == null ? \"Printing\" : message, params);\n\t\t\tlist = new ArrayList<DebugSnapshot>();\n\t\t\tlist.addAll(map.get(owner));\n\t\t\tif (list.isEmpty()) return null; // An empty list is an indicator that we no longer care about that particular CUD.\n\t\t\tmap.get(owner).clear();\n\t\t}\n\t\t\n\t\tCollections.sort(list);\n\t\tint idx = 1;\n\t\tStringBuilder out = new StringBuilder();\n\t\tout.append(\"---------------------------\\n\");\n\t\tfor (DebugSnapshot snapshot : list) {\n\t\t\tout.append(String.format(\"%3d: %s\\n\", idx++, snapshot.shortToString()));\n\t\t}\n\t\tout.append(\"******\\n\");\n\t\tidx = 1;\n\t\tfor (DebugSnapshot snapshot : list) {\n\t\t\tout.append(String.format(\"%3d: %s\", idx++, snapshot.toString()));\n\t\t}\n\t\t\n\t\ttry {\n\t\t\tFile logFile = new File(System.getProperty(\"user.home\", \".\"), String.format(\"lombokdss-%d.err\", System.currentTimeMillis()));\n\t\t\tOutputStream stream = new FileOutputStream(logFile);\n\t\t\ttry {\n\t\t\t\tstream.write(out.toString().getBytes(\"UTF-8\"));\n\t\t\t} finally {\n\t\t\t\tstream.close();\n\t\t\t}\n\t\t\treturn logFile.getAbsolutePath();\n\t\t} catch (Exception e) {\n\t\t\tSystem.err.println(out);\n\t\t\treturn \"(can't write log file - emitted to system err)\";\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/debug/HistogramTracker.java",
    "content": "package lombok.core.debug;\n\nimport java.io.PrintStream;\nimport java.util.Calendar;\nimport java.util.GregorianCalendar;\nimport java.util.concurrent.atomic.AtomicBoolean;\nimport java.util.concurrent.atomic.AtomicStampedReference;\n\n/**\n * Create one of these and call .report() on it a lot to emit histogram data about the times taken by some process.\n * Currently the results are broken down into 10 buckets, from 0 millis to a quarter of a second, and a report is emitted\n * to the ProblemReporter every minute. If there are 0 entries for a given minute, it is not reported. Reports aren't\n * emitted until you call report().\n */\npublic class HistogramTracker {\n\tprivate static final long[] RANGES = {\n\t\t250001L, 500001L, 1000001L, 2000001L, 4000001L, 8000001L, 16000001L, 32000001L,\n\t\t64000001L, 128000001L, 256000001L, 512000001L, 1024000001L, 2048000001L, 10000000001L};\n\tprivate static final long REPORT_WINDOW = 1000 * 60;\n\t\n\tprivate final String category;\n\tprivate final AtomicStampedReference<long[]> bars = new AtomicStampedReference<long[]>(new long[RANGES.length + 2], 0);\n\tprivate final AtomicBoolean addedSysHook = new AtomicBoolean(false);\n\tprivate final PrintStream out;\n\t\n\tpublic HistogramTracker(String category) {\n\t\tthis.category = category;\n\t\tthis.out = null;\n\t\tprintInit();\n\t}\n\t\n\tpublic HistogramTracker(String category, PrintStream out) {\n\t\tthis.category = category;\n\t\tthis.out = out;\n\t\tprintInit();\n\t}\n\t\n\tprivate void printInit() {\n\t\tif (category == null) {\n\t\t\tif (out == null) ProblemReporter.info(\"Initialized histogram\", null);\n\t\t\telse out.println(\"Initialized histogram\");\n\t\t} else {\n\t\t\tif (out == null) ProblemReporter.info(String.format(\"Initialized histogram tracker for '%s'\",  category), null);\n\t\t\telse out.printf(\"Initialized histogram tracker for '%s'%n\", category);\n\t\t}\n\t}\n\t\n\tpublic long start() {\n\t\treturn System.nanoTime();\n\t}\n\t\n\tpublic void end(long startToken) {\n\t\tif (!addedSysHook.getAndSet(true)) Runtime.getRuntime().addShutdownHook(new Thread(\"Histogram Printer\") {\n\t\t\t@Override public void run() {\n\t\t\t\tint[] currentInterval = {0};\n\t\t\t\tlong[] b = bars.get(currentInterval);\n\t\t\t\tprintReport(currentInterval[0], b);\n\t\t\t}\n\t\t});\n\t\t\n\t\tlong end = System.nanoTime();\n\t\tlong now = System.currentTimeMillis();\n\t\tlong delta = end - startToken;\n\t\tif (delta < 0L) delta = 0L;\n\t\tint interval = (int) (now / REPORT_WINDOW);\n\t\tint[] currentInterval = {0};\n\t\tlong[] bars = this.bars.get(currentInterval);\n\t\tlong[] newBars;\n\t\t\n\t\tif (currentInterval[0] != interval) {\n\t\t\tprintReport(currentInterval[0], bars);\n\t\t\tnewBars = new long[RANGES.length + 2];\n\t\t\tif (!this.bars.compareAndSet(bars, newBars, currentInterval[0], interval)) {\n\t\t\t\tnewBars = this.bars.get(currentInterval);\n\t\t\t}\n\t\t} else {\n\t\t\tnewBars = bars;\n\t\t}\n\t\t\n\t\tnewBars[RANGES.length + 1] += delta;\n\t\tfor (int i = 0; i < RANGES.length; i++) {\n\t\t\tif (delta < RANGES[i]) {\n\t\t\t\tnewBars[i]++;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t\n\t\tnewBars[RANGES.length]++;\n\t}\n\t\n\tprivate void printReport(int interval, long[] bars) {\n\t\tStringBuilder sb = new StringBuilder();\n\t\tif (category != null) sb.append(category).append(\" \");\n\t\tsb.append(\"[\");\n\t\tGregorianCalendar gc = new GregorianCalendar();\n\t\tgc.setTimeInMillis(interval * REPORT_WINDOW);\n\t\tint hour = gc.get(Calendar.HOUR_OF_DAY);\n\t\tint minute = gc.get(Calendar.MINUTE);\n\t\tif (hour < 10) sb.append('0');\n\t\tsb.append(hour).append(\":\");\n\t\tif (minute < 10) sb.append('0');\n\t\tsb.append(minute).append(\"] {\");\n\t\t\n\t\tlong sum = bars[RANGES.length];\n\t\tint count = 0;\n\t\tint lastZeroPos = sb.length();\n\t\tfor (int i = 0; i < RANGES.length; i++) {\n\t\t\tsum += bars[i];\n\t\t\tsb.append(bars[i]);\n\t\t\tif (bars[i] != 0) lastZeroPos = sb.length();\n\t\t\tsb.append(\" \");\n\t\t\tcount++;\n\t\t\tif (count == 3) sb.append(\"-- \");\n\t\t\tif (count == 9) sb.append(\"-- \");\n\t\t}\n\t\t\n\t\t\n\t\tif (sum == 0) return;\n\t\tsb.setLength(lastZeroPos);\n\t\t\n\t\tdouble millis = bars[RANGES.length + 1] / 1000000.0;\n\t\t\n\t\tlong over = bars[RANGES.length];\n\t\tif (over > 0L) {\n\t\t\t\tsb.append(\" -- \").append(bars[RANGES.length]);\n\t\t}\n\t\tsb.append(\"} total calls: \").append(sum).append(\" total time (millis): \").append((int)(millis + 0.5));\n\t\t\n\t\tif (out == null) ProblemReporter.info(sb.toString(), null);\n\t\telse out.println(sb.toString());\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/debug/ProblemReporter.java",
    "content": "/*\n * Copyright (C) 2014 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.debug;\n\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.atomic.AtomicInteger;\n\nimport org.eclipse.core.runtime.ILog;\nimport org.eclipse.core.runtime.IStatus;\nimport org.eclipse.core.runtime.Platform;\nimport org.eclipse.core.runtime.Status;\nimport org.osgi.framework.Bundle;\n\npublic class ProblemReporter {\n\tpublic static void info(String msg, Throwable ex) {\n\t\tinit();\n\t\ttry {\n\t\t\tlogger.info(msg, ex);\n\t\t} catch (Throwable t) {\n\t\t\tlogger = new TerminalLogger();\n\t\t\tlogger.info(msg, ex);\n\t\t}\n\t}\n\t\n\tpublic static void warning(String msg, Throwable ex) {\n\t\tinit();\n\t\ttry {\n\t\t\tlogger.warning(msg, ex);\n\t\t} catch (Throwable t) {\n\t\t\tlogger = new TerminalLogger();\n\t\t\tlogger.warning(msg, ex);\n\t\t}\n\t}\n\t\n\tpublic static void error(String msg, Throwable ex) {\n\t\tinit();\n\t\ttry {\n\t\t\tlogger.error(msg, ex);\n\t\t} catch (Throwable t) {\n\t\t\tlogger = new TerminalLogger();\n\t\t\tlogger.error(msg, ex);\n\t\t}\n\t}\n\t\n\tprivate static void init() {\n\t\tif (logger != null) return;\n\t\ttry {\n\t\t\tlogger = new EclipseWorkspaceLogger();\n\t\t} catch (Throwable t) {\n\t\t\tlogger = new TerminalLogger();\n\t\t}\n\t}\n\t\n\tprivate static ErrorLogger logger;\n\t\n\tprivate interface ErrorLogger {\n\t\tvoid info(String message, Throwable ex);\n\t\tvoid warning(String message, Throwable ex);\n\t\tvoid error(String message, Throwable ex);\n\t}\n\t\n\tprivate static class TerminalLogger implements ErrorLogger {\n\t\t@Override\n\t\tpublic void info(String message, Throwable ex) {\n\t\t\tSystem.err.println(message);\n\t\t\tif (ex != null) ex.printStackTrace();\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic void warning(String message, Throwable ex) {\n\t\t\tSystem.err.println(message);\n\t\t\tif (ex != null) ex.printStackTrace();\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic void error(String message, Throwable ex) {\n\t\t\tSystem.err.println(message);\n\t\t\tif (ex != null) ex.printStackTrace();\n\t\t}\n\t}\n\t\n\tprivate static class EclipseWorkspaceLogger implements ErrorLogger {\n\t\tprivate static final String DEFAULT_BUNDLE_NAME = \"org.eclipse.jdt.core\";\n\t\tprivate static final Bundle bundle;\n\t\tprivate static final int MAX_LOG = 200;\n\t\tprivate static final long SQUELCH_TIMEOUT = TimeUnit.HOURS.toMillis(1);\n\t\tprivate static final AtomicInteger counter = new AtomicInteger();\n\t\tprivate static volatile long squelchTimeout = 0L;\n\t\t\n\t\t\n\t\tstatic {\n\t\t\tbundle = Platform.getBundle(DEFAULT_BUNDLE_NAME);\n\t\t\tif (bundle == null) throw new NoClassDefFoundError(); // this means some weird RCP build or possible ecj. At any rate, we can't report this way so act as if this isn't an eclipse.\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic void info(String message, Throwable error) {\n\t\t\tmsg(IStatus.INFO, message, error);\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic void warning(String message, Throwable error) {\n\t\t\tmsg(IStatus.WARNING, message, error);\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic void error(String message, Throwable error) {\n\t\t\tmsg(IStatus.ERROR, message, error);\n\t\t}\n\t\t\n\t\tprivate void msg(int msgType, String message, Throwable error) {\n\t\t\tint ct = squelchTimeout != 0L ? 0 : counter.incrementAndGet();\n\t\t\tboolean printSquelchWarning = false;\n\t\t\tif (squelchTimeout != 0L) {\n\t\t\t\tlong now = System.currentTimeMillis();\n\t\t\t\tif (squelchTimeout > now) return;\n\t\t\t\tsquelchTimeout = now + SQUELCH_TIMEOUT;\n\t\t\t\tprintSquelchWarning = true;\n\t\t\t} else if (ct >= MAX_LOG) {\n\t\t\t\tsquelchTimeout = System.currentTimeMillis() + SQUELCH_TIMEOUT;\n\t\t\t\tprintSquelchWarning = true;\n\t\t\t}\n\t\t\tILog log = Platform.getLog(bundle);\n\t\t\tlog.log(new Status(msgType, DEFAULT_BUNDLE_NAME, message, error));\n\t\t\tif (printSquelchWarning) {\n\t\t\t\tlog.log(new Status(IStatus.WARNING, DEFAULT_BUNDLE_NAME, \"Lombok has logged too many messages; to avoid memory issues, further lombok logs will be squelched for a while. Restart eclipse to start over.\"));\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/debug/package-info.java",
    "content": "/*\n * Copyright (C) 2012-2014 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/**\n * This package contains tooling used only to debug issues that cannot be found with research but\n * which require releasing a production or edge release with extra introspective facilities in\n * an attempt to add clarity to the exceptions or other messages that result when the bug occurs.\n * \n * <strong>NB: This package is not public API in the sense that contents of this package,\n *    even public classes / methods / etc, may change in point releases.</strong>\n */\npackage lombok.core.debug;"
  },
  {
    "path": "src/core/lombok/core/handlers/HandlerUtil.java",
    "content": "/*\n * Copyright (C) 2013-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.handlers;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\nimport lombok.AllArgsConstructor;\nimport lombok.ConfigurationKeys;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.Getter;\nimport lombok.NoArgsConstructor;\nimport lombok.RequiredArgsConstructor;\nimport lombok.Setter;\nimport lombok.ToString;\nimport lombok.Value;\nimport lombok.With;\nimport lombok.core.AST;\nimport lombok.core.AnnotationValues;\nimport lombok.core.JavaIdentifiers;\nimport lombok.core.LombokNode;\nimport lombok.core.configuration.AllowHelper;\nimport lombok.core.configuration.CapitalizationStrategy;\nimport lombok.core.configuration.ConfigurationKey;\nimport lombok.core.configuration.FlagUsageType;\nimport lombok.experimental.Accessors;\nimport lombok.experimental.FieldDefaults;\n\n/**\n * Container for static utility methods useful for some of the standard lombok handlers, regardless of\n * target platform (e.g. useful for both javac and Eclipse lombok implementations).\n */\npublic class HandlerUtil {\n\tprivate HandlerUtil() {}\n\t\n\tpublic enum FieldAccess {\n\t\tGETTER, PREFER_FIELD, ALWAYS_FIELD;\n\t}\n\t\n\tpublic static int primeForHashcode() {\n\t\treturn 59;\n\t}\n\t\n\tpublic static int primeForTrue() {\n\t\treturn 79;\n\t}\n\t\n\tpublic static int primeForFalse() {\n\t\treturn 97;\n\t}\n\t\n\tpublic static int primeForNull() {\n\t\treturn 43;\n\t}\n\t\n\tpublic static final List<String> NONNULL_ANNOTATIONS, BASE_COPYABLE_ANNOTATIONS, JACKSON_COPY_TO_GETTER_ANNOTATIONS, JACKSON_COPY_TO_SETTER_ANNOTATIONS, JACKSON_COPY_TO_BUILDER_SINGULAR_SETTER_ANNOTATIONS, JACKSON_COPY_TO_BUILDER_ANNOTATIONS;\n\tstatic {\n\t\t// This is a list of annotations with a __highly specific meaning__: All annotations in this list indicate that passing null for the relevant item is __never__ acceptable, regardless of settings or circumstance.\n\t\t// In other words, things like 'this models a database table, and the db table column has a nonnull constraint', or 'this represents a web form, and if this is null, the form is invalid' __do not count__ and should not be in this list;\n\t\t// after all, you should be able to model invalid rows, or invalid forms.\n\t\t\n\t\t// In addition, the intent for these annotations is that they can be used 'in public' - it's not for internal-only usage annotations.\n\t\t\n\t\t// Presence of these annotations mean that lombok will generate null checks in any created setters and constructors.\n\t\tNONNULL_ANNOTATIONS = Collections.unmodifiableList(Arrays.asList(new String[] {\n\t\t\t\"android.annotation.NonNull\",\n\t\t\t\"android.support.annotation.NonNull\",\n\t\t\t\"android.support.annotation.RecentlyNonNull\",\n\t\t\t\"androidx.annotation.NonNull\",\n\t\t\t\"androidx.annotation.RecentlyNonNull\",\n\t\t\t\"com.android.annotations.NonNull\",\n\t\t\t\"com.google.firebase.database.annotations.NotNull\", // Even though it's in a database package, it does mean semantically: \"Check if never null at the language level\", and not 'db column cannot be null'.\n\t\t\t\"com.mongodb.lang.NonNull\", // Even though mongo is a DB engine, this semantically refers to language, not DB table designs (mongo is a document DB engine, so this isn't surprising perhaps).\n\t\t\t\"com.sun.istack.NotNull\",\n\t\t\t\"com.unboundid.util.NotNull\",\n\t\t\t\"edu.umd.cs.findbugs.annotations.NonNull\",\n\t\t\t\"io.micrometer.core.lang.NonNull\",\n\t\t\t\"io.reactivex.annotations.NonNull\",\n\t\t\t\"io.reactivex.rxjava3.annotations.NonNull\",\n\t\t\t\"jakarta.annotation.Nonnull\",\n\t\t\t\"javax.annotation.Nonnull\",\n\t\t\t// \"javax.validation.constraints.NotNull\", // The field might contain a null value until it is persisted.\n\t\t\t\"libcore.util.NonNull\",\n\t\t\t\"lombok.NonNull\",\n\t\t\t\"org.checkerframework.checker.nullness.qual.NonNull\",\n\t\t\t\"org.checkerframework.checker.nullness.compatqual.NonNullDecl\",\n\t\t\t\"org.checkerframework.checker.nullness.compatqual.NonNullType\",\n\t\t\t\"org.codehaus.commons.nullanalysis.NotNull\",\n\t\t\t\"org.eclipse.jdt.annotation.NonNull\",\n\t\t\t\"org.jetbrains.annotations.NotNull\",\n\t\t\t\"org.jmlspecs.annotation.NonNull\",\n\t\t\t\"org.jspecify.annotations.NonNull\",\n\t\t\t\"org.netbeans.api.annotations.common.NonNull\",\n\t\t\t\"org.springframework.lang.NonNull\",\n\t\t\t\"reactor.util.annotation.NonNull\",\n\t\t}));\n\t\t\n\t\t// This is a list of annotations that lombok will automatically 'copy' - be it to the method (when generating a getter for a field annotated with one of these), or to a parameter (generating a setter, with-er, or builder 'setter').\n\t\t// You can't disable this behaviour, so the list should only contain annotations where 'copy it!' is the desired behaviour in at least 95%, preferably 98%, of all non-buggy usages.\n\t\t// As a general rule, lombok takes on maintenance of adding all nullity-related annotations here, _if_ they fit the definition of language-level nullity as per {@see #NONNULL_ANNOTATIONS}. As a consequence, everything from the NONNULL list should probably\n\t\t// also be in this list, and any nullity-related annotation in this list implies the non-null variant should be in the NONNULL_ANNOTATIONS list, unless there is no such annotation.\n\t\t\n\t\t// NB: Intent is that we get rid of a lot of this list and instead move to a system whereby lombok users explicitly opt in to the desired behaviour per 'library' (e.g per \"Jackson annotations\", \"Checker framework annotations\", etc.\n\t\t// - the problem is, how do we know that the owners of a certain annotation intend for it to be copied in this fashion? What to do if a bug report is filed that we should not always copy it? Hence, care should be taken when editing this list.\n\t\t// When in doubt, leave it out - this list can be added to dynamically by {See lombok.ConfigurationKeys#COPYABLE_ANNOTATIONS}.\n\t\tBASE_COPYABLE_ANNOTATIONS = Collections.unmodifiableList(Arrays.asList(new String[] {\n\t\t\t\"android.annotation.NonNull\",\n\t\t\t\"android.annotation.Nullable\",\n\t\t\t\"android.support.annotation.NonNull\",\n\t\t\t\"android.support.annotation.Nullable\",\n\t\t\t\"android.support.annotation.RecentlyNonNull\",\n\t\t\t\"android.support.annotation.RecentlyNullable\",\n\t\t\t\"androidx.annotation.NonNull\",\n\t\t\t\"androidx.annotation.Nullable\",\n\t\t\t\"androidx.annotation.RecentlyNonNull\",\n\t\t\t\"androidx.annotation.RecentlyNullable\",\n\t\t\t\"com.android.annotations.NonNull\",\n\t\t\t\"com.android.annotations.Nullable\",\n\t\t\t// \"com.google.api.server.spi.config.Nullable\", - let's think about this one a little, as it is targeted solely at parameters, so you can't even put it on fields. If we choose to support it, we should REMOVE it from the field, then - that's not something we currently support.\n\t\t\t\"com.google.firebase.database.annotations.NotNull\",\n\t\t\t\"com.google.firebase.database.annotations.Nullable\",\n\t\t\t\"com.mongodb.lang.NonNull\",\n\t\t\t\"com.mongodb.lang.Nullable\",\n\t\t\t\"com.sun.istack.NotNull\",\n\t\t\t\"com.sun.istack.Nullable\",\n\t\t\t\"com.unboundid.util.NotNull\",\n\t\t\t\"com.unboundid.util.Nullable\",\n\t\t\t\"edu.umd.cs.findbugs.annotations.CheckForNull\",\n\t\t\t\"edu.umd.cs.findbugs.annotations.NonNull\",\n\t\t\t\"edu.umd.cs.findbugs.annotations.Nullable\",\n\t\t\t\"edu.umd.cs.findbugs.annotations.PossiblyNull\",\n\t\t\t\"edu.umd.cs.findbugs.annotations.UnknownNullness\",\n\t\t\t\"io.micrometer.core.lang.NonNull\",\n\t\t\t\"io.micrometer.core.lang.Nullable\",\n\t\t\t\"io.reactivex.annotations.NonNull\",\n\t\t\t\"io.reactivex.annotations.Nullable\",\n\t\t\t\"io.reactivex.rxjava3.annotations.NonNull\",\n\t\t\t\"io.reactivex.rxjava3.annotations.Nullable\",\n\t\t\t\"jakarta.annotation.Nonnull\",\n\t\t\t\"jakarta.annotation.Nullable\",\n\t\t\t\"javax.annotation.CheckForNull\",\n\t\t\t\"javax.annotation.Nonnull\",\n\t\t\t\"javax.annotation.Nullable\",\n//\t\t\t\"javax.validation.constraints.NotNull\", // - this should definitely not be included; validation is not about language-level nullity, therefore should not be in this core list.\n\t\t\t\"libcore.util.NonNull\",\n\t\t\t\"libcore.util.Nullable\",\n\t\t\t\"lombok.NonNull\",\n\t\t\t\"org.checkerframework.checker.nullness.compatqual.NonNullDecl\",\n\t\t\t\"org.checkerframework.checker.nullness.compatqual.NonNullType\",\n\t\t\t\"org.checkerframework.checker.nullness.compatqual.NullableDecl\",\n\t\t\t\"org.checkerframework.checker.nullness.compatqual.NullableType\",\n\t\t\t\"org.checkerframework.checker.nullness.qual.NonNull\",\n\t\t\t\"org.checkerframework.checker.nullness.qual.Nullable\",\n\t\t\t\"org.codehaus.commons.nullanalysis.NotNull\",\n\t\t\t\"org.codehaus.commons.nullanalysis.Nullable\",\n\t\t\t\"org.eclipse.jdt.annotation.NonNull\",\n\t\t\t\"org.eclipse.jdt.annotation.Nullable\",\n\t\t\t\"org.jetbrains.annotations.NotNull\",\n\t\t\t\"org.jetbrains.annotations.Nullable\",\n\t\t\t\"org.jetbrains.annotations.UnknownNullability\",\n\t\t\t\"org.jmlspecs.annotation.NonNull\",\n\t\t\t\"org.jmlspecs.annotation.Nullable\",\n\t\t\t\"org.jspecify.annotations.Nullable\",\n\t\t\t\"org.jspecify.annotations.NonNull\",\n\t\t\t\"org.netbeans.api.annotations.common.CheckForNull\",\n\t\t\t\"org.netbeans.api.annotations.common.NonNull\",\n\t\t\t\"org.netbeans.api.annotations.common.NullAllowed\",\n\t\t\t\"org.netbeans.api.annotations.common.NullUnknown\",\n\t\t\t\"org.springframework.lang.NonNull\",\n\t\t\t\"org.springframework.lang.Nullable\",\n\t\t\t\"reactor.util.annotation.NonNull\",\n\t\t\t\"reactor.util.annotation.Nullable\",\n\t\t\t\n\t\t\t// Checker Framework annotations.\n\t\t\t// To update Checker Framework annotations, run:\n\t\t\t// grep --recursive --files-with-matches -e '^@Target\\b.*TYPE_USE' $CHECKERFRAMEWORK/checker/src/main/java $CHECKERFRAMEWORK/checker-qual/src/main/java $CHECKERFRAMEWORK/checker-util/src/main/java $CHECKERFRAMEWORK/framework/src/main/java | grep '\\.java$' | sed 's/.*\\/java\\//\\t\\t\\t\"/' | sed 's/\\.java$/\",/' | sed 's/\\//./g' | sort\n\t\t\t// Only add new annotations, do not remove annotations that have been removed from the latest version of the Checker Framework.\n\t\t\t\"org.checkerframework.checker.builder.qual.CalledMethods\",\n\t\t\t\"org.checkerframework.checker.builder.qual.NotCalledMethods\",\n\t\t\t\"org.checkerframework.checker.calledmethods.qual.CalledMethods\",\n\t\t\t\"org.checkerframework.checker.calledmethods.qual.CalledMethodsBottom\",\n\t\t\t\"org.checkerframework.checker.calledmethods.qual.CalledMethodsPredicate\",\n\t\t\t\"org.checkerframework.checker.compilermsgs.qual.CompilerMessageKey\",\n\t\t\t\"org.checkerframework.checker.compilermsgs.qual.CompilerMessageKeyBottom\",\n\t\t\t\"org.checkerframework.checker.compilermsgs.qual.UnknownCompilerMessageKey\",\n\t\t\t\"org.checkerframework.checker.fenum.qual.AwtAlphaCompositingRule\",\n\t\t\t\"org.checkerframework.checker.fenum.qual.AwtColorSpace\",\n\t\t\t\"org.checkerframework.checker.fenum.qual.AwtCursorType\",\n\t\t\t\"org.checkerframework.checker.fenum.qual.AwtFlowLayout\",\n\t\t\t\"org.checkerframework.checker.fenum.qual.Fenum\",\n\t\t\t\"org.checkerframework.checker.fenum.qual.FenumBottom\",\n\t\t\t\"org.checkerframework.checker.fenum.qual.FenumTop\",\n\t\t\t\"org.checkerframework.checker.fenum.qual.PolyFenum\",\n\t\t\t\"org.checkerframework.checker.fenum.qual.SwingBoxOrientation\",\n\t\t\t\"org.checkerframework.checker.fenum.qual.SwingCompassDirection\",\n\t\t\t\"org.checkerframework.checker.fenum.qual.SwingElementOrientation\",\n\t\t\t\"org.checkerframework.checker.fenum.qual.SwingHorizontalOrientation\",\n\t\t\t\"org.checkerframework.checker.fenum.qual.SwingSplitPaneOrientation\",\n\t\t\t\"org.checkerframework.checker.fenum.qual.SwingTextOrientation\",\n\t\t\t\"org.checkerframework.checker.fenum.qual.SwingTitleJustification\",\n\t\t\t\"org.checkerframework.checker.fenum.qual.SwingTitlePosition\",\n\t\t\t\"org.checkerframework.checker.fenum.qual.SwingVerticalOrientation\",\n\t\t\t\"org.checkerframework.checker.formatter.qual.Format\",\n\t\t\t\"org.checkerframework.checker.formatter.qual.FormatBottom\",\n\t\t\t\"org.checkerframework.checker.formatter.qual.InvalidFormat\",\n\t\t\t\"org.checkerframework.checker.formatter.qual.UnknownFormat\",\n\t\t\t\"org.checkerframework.checker.guieffect.qual.AlwaysSafe\",\n\t\t\t\"org.checkerframework.checker.guieffect.qual.PolyUI\",\n\t\t\t\"org.checkerframework.checker.guieffect.qual.UI\",\n\t\t\t\"org.checkerframework.checker.i18nformatter.qual.I18nFormat\",\n\t\t\t\"org.checkerframework.checker.i18nformatter.qual.I18nFormatBottom\",\n\t\t\t\"org.checkerframework.checker.i18nformatter.qual.I18nFormatFor\",\n\t\t\t\"org.checkerframework.checker.i18nformatter.qual.I18nInvalidFormat\",\n\t\t\t\"org.checkerframework.checker.i18nformatter.qual.I18nUnknownFormat\",\n\t\t\t\"org.checkerframework.checker.i18n.qual.LocalizableKey\",\n\t\t\t\"org.checkerframework.checker.i18n.qual.LocalizableKeyBottom\",\n\t\t\t\"org.checkerframework.checker.i18n.qual.Localized\",\n\t\t\t\"org.checkerframework.checker.i18n.qual.UnknownLocalizableKey\",\n\t\t\t\"org.checkerframework.checker.i18n.qual.UnknownLocalized\",\n\t\t\t\"org.checkerframework.checker.index.qual.GTENegativeOne\",\n\t\t\t\"org.checkerframework.checker.index.qual.IndexFor\",\n\t\t\t\"org.checkerframework.checker.index.qual.IndexOrHigh\",\n\t\t\t\"org.checkerframework.checker.index.qual.IndexOrLow\",\n\t\t\t\"org.checkerframework.checker.index.qual.LengthOf\",\n\t\t\t\"org.checkerframework.checker.index.qual.LessThan\",\n\t\t\t\"org.checkerframework.checker.index.qual.LessThanBottom\",\n\t\t\t\"org.checkerframework.checker.index.qual.LessThanUnknown\",\n\t\t\t\"org.checkerframework.checker.index.qual.LowerBoundBottom\",\n\t\t\t\"org.checkerframework.checker.index.qual.LowerBoundUnknown\",\n\t\t\t\"org.checkerframework.checker.index.qual.LTEqLengthOf\",\n\t\t\t\"org.checkerframework.checker.index.qual.LTLengthOf\",\n\t\t\t\"org.checkerframework.checker.index.qual.LTOMLengthOf\",\n\t\t\t\"org.checkerframework.checker.index.qual.NegativeIndexFor\",\n\t\t\t\"org.checkerframework.checker.index.qual.NonNegative\",\n\t\t\t\"org.checkerframework.checker.index.qual.PolyIndex\",\n\t\t\t\"org.checkerframework.checker.index.qual.PolyLength\",\n\t\t\t\"org.checkerframework.checker.index.qual.PolyLowerBound\",\n\t\t\t\"org.checkerframework.checker.index.qual.PolySameLen\",\n\t\t\t\"org.checkerframework.checker.index.qual.PolyUpperBound\",\n\t\t\t\"org.checkerframework.checker.index.qual.Positive\",\n\t\t\t\"org.checkerframework.checker.index.qual.SameLen\",\n\t\t\t\"org.checkerframework.checker.index.qual.SameLenBottom\",\n\t\t\t\"org.checkerframework.checker.index.qual.SameLenUnknown\",\n\t\t\t\"org.checkerframework.checker.index.qual.SearchIndexBottom\",\n\t\t\t\"org.checkerframework.checker.index.qual.SearchIndexFor\",\n\t\t\t\"org.checkerframework.checker.index.qual.SearchIndexUnknown\",\n\t\t\t\"org.checkerframework.checker.index.qual.SubstringIndexBottom\",\n\t\t\t\"org.checkerframework.checker.index.qual.SubstringIndexFor\",\n\t\t\t\"org.checkerframework.checker.index.qual.SubstringIndexUnknown\",\n\t\t\t\"org.checkerframework.checker.index.qual.UpperBoundBottom\",\n\t\t\t\"org.checkerframework.checker.index.qual.UpperBoundLiteral\",\n\t\t\t\"org.checkerframework.checker.index.qual.UpperBoundUnknown\",\n\t\t\t\"org.checkerframework.checker.initialization.qual.FBCBottom\",\n\t\t\t\"org.checkerframework.checker.initialization.qual.Initialized\",\n\t\t\t\"org.checkerframework.checker.initialization.qual.UnderInitialization\",\n\t\t\t\"org.checkerframework.checker.initialization.qual.UnknownInitialization\",\n\t\t\t\"org.checkerframework.checker.interning.qual.Interned\",\n\t\t\t\"org.checkerframework.checker.interning.qual.InternedDistinct\",\n\t\t\t\"org.checkerframework.checker.interning.qual.PolyInterned\",\n\t\t\t\"org.checkerframework.checker.interning.qual.UnknownInterned\",\n\t\t\t\"org.checkerframework.checker.lock.qual.GuardedBy\",\n\t\t\t\"org.checkerframework.checker.lock.qual.GuardedByBottom\",\n\t\t\t\"org.checkerframework.checker.lock.qual.GuardedByUnknown\",\n\t\t\t\"org.checkerframework.checker.lock.qual.GuardSatisfied\",\n\t\t\t\"org.checkerframework.checker.lock.qual.NewObject\",\n\t\t\t\"org.checkerframework.checker.mustcall.qual.MustCall\",\n\t\t\t\"org.checkerframework.checker.mustcall.qual.MustCallAlias\",\n\t\t\t\"org.checkerframework.checker.mustcall.qual.MustCallUnknown\",\n\t\t\t\"org.checkerframework.checker.mustcall.qual.PolyMustCall\",\n\t\t\t\"org.checkerframework.checker.nullness.qual.KeyFor\",\n\t\t\t\"org.checkerframework.checker.nullness.qual.KeyForBottom\",\n\t\t\t\"org.checkerframework.checker.nullness.qual.MonotonicNonNull\",\n\t\t\t\"org.checkerframework.checker.nullness.qual.NonNull\",\n\t\t\t\"org.checkerframework.checker.nullness.qual.Nullable\",\n\t\t\t\"org.checkerframework.checker.nullness.qual.PolyKeyFor\",\n\t\t\t\"org.checkerframework.checker.nullness.qual.PolyNull\",\n\t\t\t\"org.checkerframework.checker.nullness.qual.UnknownKeyFor\",\n\t\t\t\"org.checkerframework.checker.optional.qual.MaybePresent\",\n\t\t\t\"org.checkerframework.checker.optional.qual.OptionalBottom\",\n\t\t\t\"org.checkerframework.checker.optional.qual.PolyPresent\",\n\t\t\t\"org.checkerframework.checker.optional.qual.Present\",\n\t\t\t\"org.checkerframework.checker.propkey.qual.PropertyKey\",\n\t\t\t\"org.checkerframework.checker.propkey.qual.PropertyKeyBottom\",\n\t\t\t\"org.checkerframework.checker.propkey.qual.UnknownPropertyKey\",\n\t\t\t\"org.checkerframework.checker.regex.qual.PolyRegex\",\n\t\t\t\"org.checkerframework.checker.regex.qual.Regex\",\n\t\t\t\"org.checkerframework.checker.regex.qual.RegexBottom\",\n\t\t\t\"org.checkerframework.checker.regex.qual.UnknownRegex\",\n\t\t\t\"org.checkerframework.checker.signature.qual.ArrayWithoutPackage\",\n\t\t\t\"org.checkerframework.checker.signature.qual.BinaryName\",\n\t\t\t\"org.checkerframework.checker.signature.qual.BinaryNameOrPrimitiveType\",\n\t\t\t\"org.checkerframework.checker.signature.qual.BinaryNameWithoutPackage\",\n\t\t\t\"org.checkerframework.checker.signature.qual.CanonicalName\",\n\t\t\t\"org.checkerframework.checker.signature.qual.CanonicalNameAndBinaryName\",\n\t\t\t\"org.checkerframework.checker.signature.qual.CanonicalNameOrEmpty\",\n\t\t\t\"org.checkerframework.checker.signature.qual.CanonicalNameOrPrimitiveType\",\n\t\t\t\"org.checkerframework.checker.signature.qual.ClassGetName\",\n\t\t\t\"org.checkerframework.checker.signature.qual.ClassGetSimpleName\",\n\t\t\t\"org.checkerframework.checker.signature.qual.DotSeparatedIdentifiers\",\n\t\t\t\"org.checkerframework.checker.signature.qual.DotSeparatedIdentifiersOrPrimitiveType\",\n\t\t\t\"org.checkerframework.checker.signature.qual.FieldDescriptor\",\n\t\t\t\"org.checkerframework.checker.signature.qual.FieldDescriptorForPrimitive\",\n\t\t\t\"org.checkerframework.checker.signature.qual.FieldDescriptorWithoutPackage\",\n\t\t\t\"org.checkerframework.checker.signature.qual.FqBinaryName\",\n\t\t\t\"org.checkerframework.checker.signature.qual.FullyQualifiedName\",\n\t\t\t\"org.checkerframework.checker.signature.qual.Identifier\",\n\t\t\t\"org.checkerframework.checker.signature.qual.IdentifierOrPrimitiveType\",\n\t\t\t\"org.checkerframework.checker.signature.qual.InternalForm\",\n\t\t\t\"org.checkerframework.checker.signature.qual.MethodDescriptor\",\n\t\t\t\"org.checkerframework.checker.signature.qual.PolySignature\",\n\t\t\t\"org.checkerframework.checker.signature.qual.PrimitiveType\",\n\t\t\t\"org.checkerframework.checker.signature.qual.SignatureBottom\",\n\t\t\t\"org.checkerframework.checker.signedness.qual.PolySigned\",\n\t\t\t\"org.checkerframework.checker.signedness.qual.Signed\",\n\t\t\t\"org.checkerframework.checker.signedness.qual.SignednessBottom\",\n\t\t\t\"org.checkerframework.checker.signedness.qual.SignednessGlb\",\n\t\t\t\"org.checkerframework.checker.signedness.qual.SignedPositive\",\n\t\t\t\"org.checkerframework.checker.signedness.qual.SignedPositiveFromUnsigned\",\n\t\t\t\"org.checkerframework.checker.signedness.qual.UnknownSignedness\",\n\t\t\t\"org.checkerframework.checker.signedness.qual.Unsigned\",\n\t\t\t\"org.checkerframework.checker.tainting.qual.PolyTainted\",\n\t\t\t\"org.checkerframework.checker.tainting.qual.Tainted\",\n\t\t\t\"org.checkerframework.checker.tainting.qual.Untainted\",\n\t\t\t\"org.checkerframework.checker.units.qual.A\",\n\t\t\t\"org.checkerframework.checker.units.qual.Acceleration\",\n\t\t\t\"org.checkerframework.checker.units.qual.Angle\",\n\t\t\t\"org.checkerframework.checker.units.qual.Area\",\n\t\t\t\"org.checkerframework.checker.units.qual.C\",\n\t\t\t\"org.checkerframework.checker.units.qual.cd\",\n\t\t\t\"org.checkerframework.checker.units.qual.Current\",\n\t\t\t\"org.checkerframework.checker.units.qual.degrees\",\n\t\t\t\"org.checkerframework.checker.units.qual.Force\",\n\t\t\t\"org.checkerframework.checker.units.qual.g\",\n\t\t\t\"org.checkerframework.checker.units.qual.h\",\n\t\t\t\"org.checkerframework.checker.units.qual.K\",\n\t\t\t\"org.checkerframework.checker.units.qual.kg\",\n\t\t\t\"org.checkerframework.checker.units.qual.km\",\n\t\t\t\"org.checkerframework.checker.units.qual.km2\",\n\t\t\t\"org.checkerframework.checker.units.qual.km3\",\n\t\t\t\"org.checkerframework.checker.units.qual.kmPERh\",\n\t\t\t\"org.checkerframework.checker.units.qual.kN\",\n\t\t\t\"org.checkerframework.checker.units.qual.Length\",\n\t\t\t\"org.checkerframework.checker.units.qual.Luminance\",\n\t\t\t\"org.checkerframework.checker.units.qual.m\",\n\t\t\t\"org.checkerframework.checker.units.qual.m2\",\n\t\t\t\"org.checkerframework.checker.units.qual.m3\",\n\t\t\t\"org.checkerframework.checker.units.qual.Mass\",\n\t\t\t\"org.checkerframework.checker.units.qual.min\",\n\t\t\t\"org.checkerframework.checker.units.qual.mm\",\n\t\t\t\"org.checkerframework.checker.units.qual.mm2\",\n\t\t\t\"org.checkerframework.checker.units.qual.mm3\",\n\t\t\t\"org.checkerframework.checker.units.qual.mol\",\n\t\t\t\"org.checkerframework.checker.units.qual.mPERs\",\n\t\t\t\"org.checkerframework.checker.units.qual.mPERs2\",\n\t\t\t\"org.checkerframework.checker.units.qual.N\",\n\t\t\t\"org.checkerframework.checker.units.qual.PolyUnit\",\n\t\t\t\"org.checkerframework.checker.units.qual.radians\",\n\t\t\t\"org.checkerframework.checker.units.qual.s\",\n\t\t\t\"org.checkerframework.checker.units.qual.Speed\",\n\t\t\t\"org.checkerframework.checker.units.qual.Substance\",\n\t\t\t\"org.checkerframework.checker.units.qual.t\",\n\t\t\t\"org.checkerframework.checker.units.qual.Temperature\",\n\t\t\t\"org.checkerframework.checker.units.qual.Time\",\n\t\t\t\"org.checkerframework.checker.units.qual.UnitsBottom\",\n\t\t\t\"org.checkerframework.checker.units.qual.UnknownUnits\",\n\t\t\t\"org.checkerframework.checker.units.qual.Volume\",\n\t\t\t\"org.checkerframework.common.aliasing.qual.LeakedToResult\",\n\t\t\t\"org.checkerframework.common.aliasing.qual.MaybeAliased\",\n\t\t\t\"org.checkerframework.common.aliasing.qual.NonLeaked\",\n\t\t\t\"org.checkerframework.common.aliasing.qual.Unique\",\n\t\t\t\"org.checkerframework.common.initializedfields.qual.InitializedFields\",\n\t\t\t\"org.checkerframework.common.initializedfields.qual.InitializedFieldsBottom\",\n\t\t\t\"org.checkerframework.common.initializedfields.qual.PolyInitializedFields\",\n\t\t\t\"org.checkerframework.common.reflection.qual.ClassBound\",\n\t\t\t\"org.checkerframework.common.reflection.qual.ClassVal\",\n\t\t\t\"org.checkerframework.common.reflection.qual.ClassValBottom\",\n\t\t\t\"org.checkerframework.common.reflection.qual.MethodVal\",\n\t\t\t\"org.checkerframework.common.reflection.qual.MethodValBottom\",\n\t\t\t\"org.checkerframework.common.reflection.qual.UnknownClass\",\n\t\t\t\"org.checkerframework.common.reflection.qual.UnknownMethod\",\n\t\t\t\"org.checkerframework.common.returnsreceiver.qual.BottomThis\",\n\t\t\t\"org.checkerframework.common.returnsreceiver.qual.This\",\n\t\t\t\"org.checkerframework.common.returnsreceiver.qual.UnknownThis\",\n\t\t\t\"org.checkerframework.common.subtyping.qual.Bottom\",\n\t\t\t\"org.checkerframework.common.util.report.qual.ReportUnqualified\",\n\t\t\t\"org.checkerframework.common.value.qual.ArrayLen\",\n\t\t\t\"org.checkerframework.common.value.qual.ArrayLenRange\",\n\t\t\t\"org.checkerframework.common.value.qual.BoolVal\",\n\t\t\t\"org.checkerframework.common.value.qual.BottomVal\",\n\t\t\t\"org.checkerframework.common.value.qual.DoubleVal\",\n\t\t\t\"org.checkerframework.common.value.qual.EnumVal\",\n\t\t\t\"org.checkerframework.common.value.qual.IntRange\",\n\t\t\t\"org.checkerframework.common.value.qual.IntVal\",\n\t\t\t\"org.checkerframework.common.value.qual.MatchesRegex\",\n\t\t\t\"org.checkerframework.common.value.qual.MinLen\",\n\t\t\t\"org.checkerframework.common.value.qual.PolyValue\",\n\t\t\t\"org.checkerframework.common.value.qual.StringVal\",\n\t\t\t\"org.checkerframework.common.value.qual.UnknownVal\",\n\t\t\t\"org.checkerframework.framework.qual.PurityUnqualified\",\n\t\t}));\n\t\t\n\t\t// The following two lists contain all annotations that can be copied from the field to the getter or setter. \n\t\t// Right now, it only contains Jackson annotations.\n\t\t// Jackson's annotation processing roughly works as follows: To calculate the annotation for a JSON property, Jackson \n\t\t// builds a triple of the Java field and the corresponding setter and getter methods. It is sufficient for an annotation\n\t\t// to be present on one of those to become effective. E.g., a @JsonIgnore on a setter completely ignores the JSON property, \n\t\t// not only during deserialization, but also when serializing. Therefore, in most cases it is _not_ necessary to copy the \n\t\t// annotations. It may even harm, as Jackson considers some annotations inheritable, and this \"virtual inheritance\" only\n\t\t// affects annotations on setter/getter, but not on private fields. \n\t\t// However, there are two exceptions where we have to copy the annotations:\n\t\t// 1. When using a builder to deserialize, Jackson does _not_ \"propagate\" the annotations to the setter methods of the \n\t\t//    builder, i.e. annotations like @JsonIgnore on the field will not be respected when deserializing with a builder.\n\t\t//    Thus, those annotations should be copied to the builder's setters.\n\t\t// 2. If the getter/setter methods do not follow the exact beanspec naming strategy, Jackson will not correctly detect the \n\t\t//    field-getter-setter triple, and annotations may not work as intended.\n\t\t//    However, we cannot always know what the user's intention is. Thus, lombok should only fix those cases where it is \n\t\t//    obvious what the user wants. That is the case for a `@Jacksonized @Accessors(fluent=true)`.\n\t\tJACKSON_COPY_TO_GETTER_ANNOTATIONS = Collections.unmodifiableList(Arrays.asList(new String[] {\n\t\t\t\"com.fasterxml.jackson.annotation.JsonFormat\",\n\t\t\t\"com.fasterxml.jackson.annotation.JsonIgnore\",\n\t\t\t\"com.fasterxml.jackson.annotation.JsonIgnoreProperties\",\n\t\t\t\"com.fasterxml.jackson.annotation.JsonProperty\",\n\t\t\t\"com.fasterxml.jackson.annotation.JsonSubTypes\",\n\t\t\t\"com.fasterxml.jackson.annotation.JsonTypeInfo\",\n\t\t\t\"com.fasterxml.jackson.annotation.JsonUnwrapped\",\n\t\t\t\"com.fasterxml.jackson.annotation.JsonView\",\n\t\t\t\"com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper\",\n\t\t\t\"com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty\",\n\t\t\t\"com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText\",\n\t\t}));\n\t\tJACKSON_COPY_TO_SETTER_ANNOTATIONS = Collections.unmodifiableList(Arrays.asList(new String[] {\n\t\t\t\"com.fasterxml.jackson.annotation.JacksonInject\",\n\t\t\t\"com.fasterxml.jackson.annotation.JsonAlias\",\n\t\t\t\"com.fasterxml.jackson.annotation.JsonFormat\",\n\t\t\t\"com.fasterxml.jackson.annotation.JsonIgnore\",\n\t\t\t\"com.fasterxml.jackson.annotation.JsonIgnoreProperties\",\n\t\t\t\"com.fasterxml.jackson.annotation.JsonProperty\",\n\t\t\t\"com.fasterxml.jackson.annotation.JsonSetter\",\n\t\t\t\"com.fasterxml.jackson.annotation.JsonSubTypes\",\n\t\t\t\"com.fasterxml.jackson.annotation.JsonTypeInfo\",\n\t\t\t\"com.fasterxml.jackson.annotation.JsonUnwrapped\",\n\t\t\t\"com.fasterxml.jackson.annotation.JsonView\",\n\t\t\t\"com.fasterxml.jackson.databind.annotation.JsonDeserialize\",\n\t\t\t\"tools.jackson.databind.annotation.JsonDeserialize\",\n\t\t\t\"com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper\",\n\t\t\t\"com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty\",\n\t\t\t\"com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText\",\n\t\t}));\n\t\tJACKSON_COPY_TO_BUILDER_SINGULAR_SETTER_ANNOTATIONS = Collections.unmodifiableList(Arrays.asList(new String[] {\n\t\t\t\"com.fasterxml.jackson.annotation.JsonAnySetter\",\n\t\t}));\n\t\t// In order to let Jackson recognize certain configuration annotations when deserializing using a builder, those must\n\t\t// be copied to the generated builder class.\n\t\tJACKSON_COPY_TO_BUILDER_ANNOTATIONS = Collections.unmodifiableList(Arrays.asList(new String[] {\n\t\t\t\"com.fasterxml.jackson.annotation.JsonAutoDetect\",\n\t\t\t\"com.fasterxml.jackson.annotation.JsonFormat\",\n\t\t\t\"com.fasterxml.jackson.annotation.JsonIgnoreProperties\",\n\t\t\t\"com.fasterxml.jackson.annotation.JsonIgnoreType\",\n\t\t\t\"com.fasterxml.jackson.annotation.JsonPropertyOrder\",\n\t\t\t\"com.fasterxml.jackson.annotation.JsonRootName\",\n\t\t\t\"com.fasterxml.jackson.annotation.JsonSubTypes\",\n\t\t\t\"com.fasterxml.jackson.annotation.JsonTypeInfo\",\n\t\t\t\"com.fasterxml.jackson.annotation.JsonTypeName\",\n\t\t\t\"com.fasterxml.jackson.annotation.JsonView\",\n\t\t\t\"com.fasterxml.jackson.databind.annotation.JsonNaming\",\n\t\t\t\"tools.jackson.databind.annotation.JsonNaming\",\n\t\t}));\n\t}\n\t\n\t/** Checks if the given name is a valid identifier.\n\t * \n\t * If it is, this returns {@code true} and does nothing else.\n\t * If it isn't, this returns {@code false} and adds an error message to the supplied node.\n\t */\n\tpublic static boolean checkName(String nameSpec, String identifier, LombokNode<?, ?, ?> errorNode) {\n\t\tif (identifier.isEmpty()) {\n\t\t\terrorNode.addError(nameSpec + \" cannot be the empty string.\");\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tif (!JavaIdentifiers.isValidJavaIdentifier(identifier)) {\n\t\t\terrorNode.addError(nameSpec + \" must be a valid java identifier.\");\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\tpublic static String autoSingularize(String plural) {\n\t\treturn Singulars.autoSingularize(plural);\n\t}\n\t\n\tpublic static void handleFlagUsage(LombokNode<?, ?, ?> node, ConfigurationKey<FlagUsageType> key, String featureName) {\n\t\tFlagUsageType fut = node.getAst().readConfiguration(key);\n\t\t\n\t\tif (fut == null && AllowHelper.isAllowable(key)) {\n\t\t\tnode.addError(\"Use of \" + featureName + \" is disabled by default. Please add '\" + key.getKeyName() + \" = \" + FlagUsageType.ALLOW + \"' to 'lombok.config' if you want to enable is.\");\n\t\t}\n\t\t\n\t\tif (fut != null) {\n\t\t\tString msg = \"Use of \" + featureName + \" is flagged according to lombok configuration.\";\n\t\t\tif (fut == FlagUsageType.WARNING) node.addWarning(msg);\n\t\t\telse if (fut == FlagUsageType.ERROR) node.addError(msg);\n\t\t}\n\t}\n\t\n\t@SuppressWarnings(\"deprecation\")\n\tpublic static boolean shouldAddGenerated(LombokNode<?, ?, ?> node) {\n\t\tBoolean add = node.getAst().readConfiguration(ConfigurationKeys.ADD_JAVAX_GENERATED_ANNOTATIONS);\n\t\tif (add != null) return add;\n\t\treturn Boolean.TRUE.equals(node.getAst().readConfiguration(ConfigurationKeys.ADD_GENERATED_ANNOTATIONS));\n\t}\n\t\n\tpublic static void handleExperimentalFlagUsage(LombokNode<?, ?, ?> node, ConfigurationKey<FlagUsageType> key, String featureName) {\n\t\thandleFlagUsage(node, key, featureName, ConfigurationKeys.EXPERIMENTAL_FLAG_USAGE, \"any lombok.experimental feature\");\n\t}\n\t\n\tpublic static void handleFlagUsage(LombokNode<?, ?, ?> node, ConfigurationKey<FlagUsageType> key1, String featureName1, ConfigurationKey<FlagUsageType> key2, String featureName2) {\n\t\tFlagUsageType fut1 = node.getAst().readConfiguration(key1);\n\t\tFlagUsageType fut2 = node.getAst().readConfiguration(key2);\n\t\t\n\t\tFlagUsageType fut = null;\n\t\tString featureName = null;\n\t\tif (fut1 == FlagUsageType.ERROR) {\n\t\t\tfut = fut1;\n\t\t\tfeatureName = featureName1;\n\t\t} else if (fut2 == FlagUsageType.ERROR) {\n\t\t\tfut = fut2;\n\t\t\tfeatureName = featureName2;\n\t\t} else if (fut1 == FlagUsageType.WARNING) {\n\t\t\tfut = fut1;\n\t\t\tfeatureName = featureName1;\n\t\t} else {\n\t\t\tfut = fut2;\n\t\t\tfeatureName = featureName2;\n\t\t}\n\t\t\n\t\tif (fut != null) {\n\t\t\tString msg = \"Use of \" + featureName + \" is flagged according to lombok configuration.\";\n\t\t\tif (fut == FlagUsageType.WARNING) node.addWarning(msg);\n\t\t\telse if (fut == FlagUsageType.ERROR) node.addError(msg);\n\t\t}\n\t}\n\t\n\tpublic static boolean shouldReturnThis0(AnnotationValues<Accessors> accessors, AST<?, ?, ?> ast) {\n\t\tboolean chainForced = accessors.isExplicit(\"chain\");\n\t\tboolean fluentForced = accessors.isExplicit(\"fluent\");\n\t\tAccessors instance = accessors.getInstance();\n\t\t\n\t\tboolean chain = instance.chain();\n\t\tboolean fluent = instance.fluent();\n\t\t\n\t\tif (chainForced) return chain;\n\t\t\n\t\tif (!chainForced) {\n\t\t\tBoolean chainConfig = ast.readConfiguration(ConfigurationKeys.ACCESSORS_CHAIN);\n\t\t\tif (chainConfig != null) return chainConfig;\n\t\t}\n\t\t\n\t\tif (!fluentForced) {\n\t\t\tBoolean fluentConfig = ast.readConfiguration(ConfigurationKeys.ACCESSORS_FLUENT);\n\t\t\tif (fluentConfig != null) fluent = fluentConfig;\n\t\t}\n\t\t\n\t\treturn chain || fluent;\n\t}\n\t\n\tpublic static boolean shouldMakeFinal0(AnnotationValues<Accessors> accessors, AST<?, ?, ?> ast) {\n\t\tboolean isExplicit = accessors.isExplicit(\"makeFinal\");\n\t\tif (isExplicit) return accessors.getAsBoolean(\"makeFinal\");\n\t\tBoolean config = ast.readConfiguration(ConfigurationKeys.ACCESSORS_MAKE_FINAL);\n\t\tif (config != null) return config.booleanValue();\n\t\treturn false;\n\t}\n\t\n\t@SuppressWarnings({\"all\", \"unchecked\", \"deprecation\"})\n\tpublic static final List<String> INVALID_ON_BUILDERS = Collections.unmodifiableList(\n\t\t\tArrays.<String>asList(\n\t\t\tGetter.class.getName(), Setter.class.getName(), With.class.getName(), \"lombok.experimental.Wither\",\n\t\t\tToString.class.getName(), EqualsAndHashCode.class.getName(), \n\t\t\tRequiredArgsConstructor.class.getName(), AllArgsConstructor.class.getName(), NoArgsConstructor.class.getName(), \n\t\t\tData.class.getName(), Value.class.getName(), \"lombok.experimental.Value\", FieldDefaults.class.getName()));\n\t\n\t/**\n\t * Given the name of a field, return the 'base name' of that field. For example, {@code fFoobar} becomes {@code foobar} if {@code f} is in the prefix list.\n\t * For prefixes that end in a letter character, the next character must be a non-lowercase character (i.e. {@code hashCode} is not {@code ashCode} even if\n\t * {@code h} is in the prefix list, but {@code hAshcode} would become {@code ashCode}). The first prefix that matches is used. If the prefix list is empty,\n\t * or the empty string is in the prefix list and no prefix before it matches, the fieldName will be returned verbatim.\n\t * \n\t * If no prefix matches and the empty string is not in the prefix list and the prefix list is not empty, {@code null} is returned.\n\t * \n\t * @param fieldName The full name of a field.\n\t * @param prefixes A list of prefixes, usually provided by the {@code Accessors} settings annotation, listing field prefixes.\n\t * @return The base name of the field.\n\t */\n\tpublic static CharSequence removePrefix(CharSequence fieldName, List<String> prefixes) {\n\t\tif (prefixes == null || prefixes.isEmpty()) return fieldName;\n\t\t\n\t\tfieldName = fieldName.toString();\n\t\t\n\t\touter:\n\t\tfor (String prefix : prefixes) {\n\t\t\tif (prefix.length() == 0) return fieldName;\n\t\t\tif (fieldName.length() <= prefix.length()) continue outer;\n\t\t\tfor (int i = 0; i < prefix.length(); i++) {\n\t\t\t\tif (fieldName.charAt(i) != prefix.charAt(i)) continue outer;\n\t\t\t}\n\t\t\tchar followupChar = fieldName.charAt(prefix.length());\n\t\t\t// if prefix is a letter then follow up letter needs to not be lowercase, i.e. 'foo' is not a match\n\t\t\t// as field named 'oo' with prefix 'f', but 'fOo' would be.\n\t\t\tif (Character.isLetter(prefix.charAt(prefix.length() - 1)) &&\n\t\t\t\t\tCharacter.isLowerCase(followupChar)) continue outer;\n\t\t\treturn \"\" + Character.toLowerCase(followupChar) + fieldName.subSequence(prefix.length() + 1, fieldName.length());\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\t\n\tpublic static final String DEFAULT_EXCEPTION_FOR_NON_NULL = \"java.lang.NullPointerException\";\n\t\n\t/**\n\t * Generates a getter name from a given field name.\n\t * \n\t * Strategy:\n\t * <ul>\n\t * <li>Reduce the field's name to its base name by stripping off any prefix (from {@code Accessors}). If the field name does not fit\n\t * the prefix list, this method immediately returns {@code null}.</li>\n\t * <li>If {@code Accessors} has {@code fluent=true}, then return the basename.</li>\n\t * <li>Pick a prefix. 'get' normally, but 'is' if {@code isBoolean} is true.</li>\n\t * <li>Only if {@code isBoolean} is true: Check if the field starts with {@code is} followed by a non-lowercase character. If so, return the field name verbatim.</li> \n\t * <li>Check if the first character of the field is lowercase. If so, check if the second character\n\t * exists and is title or upper case. If so, uppercase the first character. If not, titlecase the first character.</li>\n\t * <li>Return the prefix plus the possibly title/uppercased first character, and the rest of the field name.</li>\n\t * </ul>\n\t * \n\t * @param accessors Accessors configuration.\n\t * @param fieldName the name of the field.\n\t * @param isBoolean if the field is of type 'boolean'. For fields of type {@code java.lang.Boolean}, you should provide {@code false}.\n\t * @return The getter name for this field, or {@code null} if this field does not fit expected patterns and therefore cannot be turned into a getter name.\n\t */\n\tpublic static String toGetterName(AST<?, ?, ?> ast, AnnotationValues<Accessors> accessors, CharSequence fieldName, boolean isBoolean) {\n\t\treturn toAccessorName(ast, accessors, fieldName, isBoolean, \"is\", \"get\", true);\n\t}\n\t\n\t/**\n\t * Generates a setter name from a given field name.\n\t * \n\t * Strategy:\n\t * <ul>\n\t * <li>Reduce the field's name to its base name by stripping off any prefix (from {@code Accessors}). If the field name does not fit\n\t * the prefix list, this method immediately returns {@code null}.</li>\n\t * <li>If {@code Accessors} has {@code fluent=true}, then return the basename.</li>\n\t * <li>Only if {@code isBoolean} is true: Check if the field starts with {@code is} followed by a non-lowercase character.\n\t * If so, replace {@code is} with {@code set} and return that.</li> \n\t * <li>Check if the first character of the field is lowercase. If so, check if the second character\n\t * exists and is title or upper case. If so, uppercase the first character. If not, titlecase the first character.</li>\n\t * <li>Return {@code \"set\"} plus the possibly title/uppercased first character, and the rest of the field name.</li>\n\t * </ul>\n\t * \n\t * @param accessors Accessors configuration.\n\t * @param fieldName the name of the field.\n\t * @param isBoolean if the field is of type 'boolean'. For fields of type {@code java.lang.Boolean}, you should provide {@code false}.\n\t * @return The setter name for this field, or {@code null} if this field does not fit expected patterns and therefore cannot be turned into a getter name.\n\t */\n\tpublic static String toSetterName(AST<?, ?, ?> ast, AnnotationValues<Accessors> accessors, CharSequence fieldName, boolean isBoolean) {\n\t\treturn toAccessorName(ast, accessors, fieldName, isBoolean, \"set\", \"set\", true);\n\t}\n\t\n\t/**\n\t * Generates a with name from a given field name.\n\t * \n\t * Strategy:\n\t * <ul>\n\t * <li>Reduce the field's name to its base name by stripping off any prefix (from {@code Accessors}). If the field name does not fit\n\t * the prefix list, this method immediately returns {@code null}.</li>\n\t * <li>Only if {@code isBoolean} is true: Check if the field starts with {@code is} followed by a non-lowercase character.\n\t * If so, replace {@code is} with {@code with} and return that.</li> \n\t * <li>Check if the first character of the field is lowercase. If so, check if the second character\n\t * exists and is title or upper case. If so, uppercase the first character. If not, titlecase the first character.</li>\n\t * <li>Return {@code \"with\"} plus the possibly title/uppercased first character, and the rest of the field name.</li>\n\t * </ul>\n\t * \n\t * @param accessors Accessors configuration.\n\t * @param fieldName the name of the field.\n\t * @param isBoolean if the field is of type 'boolean'. For fields of type {@code java.lang.Boolean}, you should provide {@code false}.\n\t * @return The with name for this field, or {@code null} if this field does not fit expected patterns and therefore cannot be turned into a getter name.\n\t */\n\tpublic static String toWithName(AST<?, ?, ?> ast, AnnotationValues<Accessors> accessors, CharSequence fieldName, boolean isBoolean) {\n\t\treturn toAccessorName(ast, accessors, fieldName, isBoolean, \"with\", \"with\", false);\n\t}\n\t\n\t/**\n\t * Generates a withBy name from a given field name.\n\t * \n\t * Strategy: The same as the {@code toWithName} strategy, but then append {@code \"By\"} at the end.\n\t * \n\t * @param accessors Accessors configuration.\n\t * @param fieldName the name of the field.\n\t * @param isBoolean if the field is of type 'boolean'. For fields of type {@code java.lang.Boolean}, you should provide {@code false}.\n\t * @return The with name for this field, or {@code null} if this field does not fit expected patterns and therefore cannot be turned into a getter name.\n\t */\n\tpublic static String toWithByName(AST<?, ?, ?> ast, AnnotationValues<Accessors> accessors, CharSequence fieldName, boolean isBoolean) {\n\t\treturn toAccessorName(ast, accessors, fieldName, isBoolean, \"with\", \"with\", false) + \"By\";\n\t}\n\t\n\tprivate static String toAccessorName(AST<?, ?, ?> ast, AnnotationValues<Accessors> accessors, CharSequence fieldName, boolean isBoolean,\n\t\t\tString booleanPrefix, String normalPrefix, boolean adhereToFluent) {\n\t\t\n\t\tfieldName = fieldName.toString();\n\t\tif (fieldName.length() == 0) return null;\n\t\t\n\t\tif (Boolean.TRUE.equals(ast.readConfiguration(ConfigurationKeys.GETTER_CONSEQUENT_BOOLEAN))) isBoolean = false;\n\t\tboolean explicitPrefix = accessors != null && accessors.isExplicit(\"prefix\");\n\t\tboolean explicitFluent = accessors != null && accessors.isExplicit(\"fluent\");\n\t\tboolean explicitJavaBeansSpecCapitalization = accessors != null && accessors.isExplicit(\"javaBeansSpecCapitalization\");\n\t\t\n\t\tAccessors ac = (explicitPrefix || explicitFluent || explicitJavaBeansSpecCapitalization) ? accessors.getInstance() : null;\n\t\t\n\t\tList<String> prefix = explicitPrefix ? Arrays.asList(ac.prefix()) : ast.readConfiguration(ConfigurationKeys.ACCESSORS_PREFIX);\n\t\tboolean fluent = explicitFluent ? ac.fluent() : Boolean.TRUE.equals(ast.readConfiguration(ConfigurationKeys.ACCESSORS_FLUENT));\n\t\tCapitalizationStrategy capitalizationStrategy = ast.readConfigurationOr(ConfigurationKeys.ACCESSORS_JAVA_BEANS_SPEC_CAPITALIZATION, CapitalizationStrategy.defaultValue());\n\t\t\n\t\tfieldName = removePrefix(fieldName, prefix);\n\t\tif (fieldName == null) return null;\n\t\t\n\t\tString fName = fieldName.toString();\n\t\tif (adhereToFluent && fluent) return fName;\n\t\t\n\t\tif (isBoolean && fName.startsWith(\"is\") && fieldName.length() > 2 && !Character.isLowerCase(fieldName.charAt(2))) {\n\t\t\t// The field is for example named 'isRunning'.\n\t\t\treturn booleanPrefix + fName.substring(2);\n\t\t}\n\t\t\n\t\treturn buildAccessorName(isBoolean ? booleanPrefix : normalPrefix, fName, capitalizationStrategy);\n\t}\n\t\n\t/**\n\t * Returns all names of methods that would represent the getter for a field with the provided name.\n\t * \n\t * For example if {@code isBoolean} is true, then a field named {@code isRunning} would produce:<br />\n\t * {@code [isRunning, getRunning, isIsRunning, getIsRunning]}\n\t * \n\t * @param accessors Accessors configuration.\n\t * @param fieldName the name of the field.\n\t * @param isBoolean if the field is of type 'boolean'. For fields of type 'java.lang.Boolean', you should provide {@code false}.\n\t */\n\tpublic static List<String> toAllGetterNames(AST<?, ?, ?> ast, AnnotationValues<Accessors> accessors, CharSequence fieldName, boolean isBoolean) {\n\t\treturn toAllAccessorNames(ast, accessors, fieldName, isBoolean, \"is\", \"get\", true);\n\t}\n\t\n\t/**\n\t * Returns all names of methods that would represent the setter for a field with the provided name.\n\t * \n\t * For example if {@code isBoolean} is true, then a field named {@code isRunning} would produce:<br />\n\t * {@code [setRunning, setIsRunning]}\n\t * \n\t * @param accessors Accessors configuration.\n\t * @param fieldName the name of the field.\n\t * @param isBoolean if the field is of type 'boolean'. For fields of type 'java.lang.Boolean', you should provide {@code false}.\n\t */\n\tpublic static List<String> toAllSetterNames(AST<?, ?, ?> ast, AnnotationValues<Accessors> accessors, CharSequence fieldName, boolean isBoolean) {\n\t\treturn toAllAccessorNames(ast, accessors, fieldName, isBoolean, \"set\", \"set\", true);\n\t}\n\t\n\t/**\n\t * Returns all names of methods that would represent the with for a field with the provided name.\n\t * \n\t * For example if {@code isBoolean} is true, then a field named {@code isRunning} would produce:<br />\n\t * {@code [withRunning, withIsRunning]}\n\t * \n\t * @param accessors Accessors configuration.\n\t * @param fieldName the name of the field.\n\t * @param isBoolean if the field is of type 'boolean'. For fields of type 'java.lang.Boolean', you should provide {@code false}.\n\t */\n\tpublic static List<String> toAllWithNames(AST<?, ?, ?> ast, AnnotationValues<Accessors> accessors, CharSequence fieldName, boolean isBoolean) {\n\t\treturn toAllAccessorNames(ast, accessors, fieldName, isBoolean, \"with\", \"with\", false);\n\t}\n\t\n\t/**\n\t * Returns all names of methods that would represent the withBy for a field with the provided name.\n\t * \n\t * For example if {@code isBoolean} is true, then a field named {@code isRunning} would produce:<br />\n\t * {@code [withRunningBy, withIsRunningBy]}\n\t * \n\t * @param accessors Accessors configuration.\n\t * @param fieldName the name of the field.\n\t * @param isBoolean if the field is of type 'boolean'. For fields of type 'java.lang.Boolean', you should provide {@code false}.\n\t */\n\tpublic static List<String> toAllWithByNames(AST<?, ?, ?> ast, AnnotationValues<Accessors> accessors, CharSequence fieldName, boolean isBoolean) {\n\t\tList<String> in = toAllAccessorNames(ast, accessors, fieldName, isBoolean, \"with\", \"with\", false);\n\t\tif (!(in instanceof ArrayList)) in = new ArrayList<String>(in);\n\t\tfor (int i = 0; i < in.size(); i++) in.set(i, in.get(i) + \"By\");\n\t\treturn in;\n\t}\n\t\n\tprivate static List<String> toAllAccessorNames(AST<?, ?, ?> ast, AnnotationValues<Accessors> accessors, CharSequence fieldName, boolean isBoolean,\n\t\t\tString booleanPrefix, String normalPrefix, boolean adhereToFluent) {\n\t\t\n\t\tif (Boolean.TRUE.equals(ast.readConfiguration(ConfigurationKeys.GETTER_CONSEQUENT_BOOLEAN))) isBoolean = false;\n\t\tif (!isBoolean) {\n\t\t\tString accessorName = toAccessorName(ast, accessors, fieldName, false, booleanPrefix, normalPrefix, adhereToFluent);\n\t\t\treturn (accessorName == null) ? Collections.<String>emptyList() : Collections.singletonList(accessorName);\n\t\t}\n\t\t\n\t\tboolean explicitPrefix = accessors != null && accessors.isExplicit(\"prefix\");\n\t\tboolean explicitFluent = accessors != null && accessors.isExplicit(\"fluent\");\n\t\t\n\t\tAccessors ac = (explicitPrefix || explicitFluent) ? accessors.getInstance() : null;\n\t\t\n\t\tList<String> prefix = explicitPrefix ? Arrays.asList(ac.prefix()) : ast.readConfiguration(ConfigurationKeys.ACCESSORS_PREFIX);\n\t\tboolean fluent = explicitFluent ? ac.fluent() : Boolean.TRUE.equals(ast.readConfiguration(ConfigurationKeys.ACCESSORS_FLUENT));\n\t\tCapitalizationStrategy capitalizationStrategy = ast.readConfigurationOr(ConfigurationKeys.ACCESSORS_JAVA_BEANS_SPEC_CAPITALIZATION, CapitalizationStrategy.defaultValue());\n\t\t\n\t\tfieldName = removePrefix(fieldName, prefix);\n\t\tif (fieldName == null) return Collections.emptyList();\n\t\t\n\t\tList<String> baseNames = toBaseNames(fieldName, isBoolean, fluent);\n\t\t\n\t\tSet<String> names = new HashSet<String>();\n\t\tfor (String baseName : baseNames) {\n\t\t\tif (adhereToFluent && fluent) {\n\t\t\t\tnames.add(baseName);\n\t\t\t} else {\n\t\t\t\tnames.add(buildAccessorName(normalPrefix, baseName, capitalizationStrategy));\n\t\t\t\tif (!normalPrefix.equals(booleanPrefix)) names.add(buildAccessorName(booleanPrefix, baseName, capitalizationStrategy));\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn new ArrayList<String>(names);\n\t}\n\t\n\tprivate static List<String> toBaseNames(CharSequence fieldName, boolean isBoolean, boolean fluent) {\n\t\tList<String> baseNames = new ArrayList<String>();\n\t\tbaseNames.add(fieldName.toString());\n\t\t\n\t\t// isPrefix = field is called something like 'isRunning', so 'running' could also be the fieldname.\n\t\tString fName = fieldName.toString();\n\t\tif (fName.startsWith(\"is\") && fName.length() > 2 && !Character.isLowerCase(fName.charAt(2))) {\n\t\t\tString baseName = fName.substring(2);\n\t\t\tif (fluent) {\n\t\t\t\tbaseNames.add(\"\" + Character.toLowerCase(baseName.charAt(0)) + baseName.substring(1));\n\t\t\t} else {\n\t\t\t\tbaseNames.add(baseName);\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn baseNames;\n\t}\n\t\n\t/**\n\t * @param node Any node (used to fetch config of capitalization strategy).\n\t * @param prefix Something like {@code get} or {@code set} or {@code is}.\n\t * @param suffix Something like {@code running}.\n\t * @return prefix + smartly title-cased suffix. For example, {@code setRunning}.\n\t */\n\tpublic static String buildAccessorName(AST<?, ?, ?> ast, String prefix, String suffix) {\n\t\tCapitalizationStrategy capitalizationStrategy = ast.readConfigurationOr(ConfigurationKeys.ACCESSORS_JAVA_BEANS_SPEC_CAPITALIZATION, CapitalizationStrategy.defaultValue());\n\t\treturn buildAccessorName(prefix, suffix, capitalizationStrategy);\n\t}\n\t\n\t/**\n\t * @param node Any node (used to fetch config of capitalization strategy).\n\t * @param prefix Something like {@code get} or {@code set} or {@code is}.\n\t * @param suffix Something like {@code running}.\n\t * @return prefix + smartly title-cased suffix. For example, {@code setRunning}.\n\t */\n\tpublic static String buildAccessorName(LombokNode<?, ?, ?> node, String prefix, String suffix) {\n\t\tCapitalizationStrategy capitalizationStrategy = node.getAst().readConfigurationOr(ConfigurationKeys.ACCESSORS_JAVA_BEANS_SPEC_CAPITALIZATION, CapitalizationStrategy.defaultValue());\n\t\treturn buildAccessorName(prefix, suffix, capitalizationStrategy);\n\t}\n\t\n\t/**\n\t * @param prefix Something like {@code get} or {@code set} or {@code is}.\n\t * @param suffix Something like {@code running}.\n\t * @param capitalizationStrategy Which strategy to use to capitalize the name part.\n\t */\n\tprivate static String buildAccessorName(String prefix, String suffix, CapitalizationStrategy capitalizationStrategy) {\n\t\tif (suffix.length() == 0) return prefix;\n\t\tif (prefix.length() == 0) return suffix;\n\t\treturn prefix + capitalizationStrategy.capitalize(suffix);\n\t}\n\t\n\tpublic static String camelCaseToConstant(String fieldName) {\n\t\tif (fieldName == null || fieldName.isEmpty()) return \"\";\n\t\tStringBuilder b = new StringBuilder();\n\t\tb.append(Character.toUpperCase(fieldName.charAt(0)));\n\t\tfor (int i = 1; i < fieldName.length(); i++) {\n\t\t\tchar c = fieldName.charAt(i);\n\t\t\tif (Character.isUpperCase(c)) b.append('_');\n\t\t\tb.append(Character.toUpperCase(c));\n\t\t}\n\t\treturn b.toString();\n\t}\n\t\n\t/** Matches any of the 8 primitive wrapper names, such as {@code Boolean}. */\n\tprivate static final Pattern PRIMITIVE_WRAPPER_TYPE_NAME_PATTERN = Pattern.compile(\"^(?:java\\\\.lang\\\\.)?(?:Boolean|Byte|Short|Integer|Long|Float|Double|Character)$\");\n\n\tpublic static int defaultEqualsAndHashcodeIncludeRank(String typeName) {\n\t\t// Modification in this code should be documented\n\t\t// 1. In the changelog this should be marked as an INPROBABLE BREAKING CHANGE, since the hashcode will change\n\t\t// 2. In the javadoc of EqualsAndHashcode.Include#rank\n\t\tif (JavaIdentifiers.isPrimitive(typeName)) return 1000;\n\t\tif (PRIMITIVE_WRAPPER_TYPE_NAME_PATTERN.matcher(typeName).matches()) return 800;\n\t\treturn 0;\n\t}\n\t\n\tprivate static final Pattern SECTION_FINDER = Pattern.compile(\"^\\\\s*\\\\**\\\\s*[-*][-*]+\\\\s*([GS]ETTER|WITH(?:ER)?)\\\\s*[-*][-*]+\\\\s*\\\\**\\\\s*$\", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);\n\tprivate static final Pattern LINE_BREAK_FINDER = Pattern.compile(\"(\\\\r?\\\\n)?\");\n\t\n\tpublic enum JavadocTag {\n\t\tPARAM(\"@param(?:eter)?\"),\n\t\tRETURN(\"@returns?\");\n\t\t\n\t\tprivate Pattern pattern;\n\t\t\n\t\tJavadocTag(String regexpFragment) {\n\t\t\tpattern = Pattern.compile(\"\\\\s?^[ \\\\t]*\\\\**[ \\\\t]*\" + regexpFragment + \".*?(?=(\\\\s^\\\\s*\\\\**\\\\s*@|\\\\Z))\", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE | Pattern.DOTALL);\n\t\t}\n\t}\n\t\n\tpublic static String stripLinesWithTagFromJavadoc(String javadoc, JavadocTag... tags) {\n\t\tif (javadoc == null || javadoc.isEmpty()) return javadoc;\n\t\tString result = javadoc;\n\t\tfor (JavadocTag tag : tags) {\n\t\t\tresult = tag.pattern.matcher(result).replaceAll(\"\").trim();\n\t\t}\n\t\treturn result;\n\t}\n\t\n\tpublic static String stripSectionsFromJavadoc(String javadoc) {\n\t\tif (javadoc == null || javadoc.isEmpty()) return javadoc;\n\t\tMatcher sectionMatcher = SECTION_FINDER.matcher(javadoc);\n\t\tif (!sectionMatcher.find()) return javadoc;\n\t\t\n\t\treturn javadoc.substring(0, sectionMatcher.start());\n\t}\n\t\n\tpublic static String getJavadocSection(String javadoc, String sectionNameSpec) {\n\t\tif (javadoc == null || javadoc.isEmpty()) return null;\n\t\tString[] sectionNames = sectionNameSpec.split(\"\\\\|\");\n\t\tMatcher sectionMatcher = SECTION_FINDER.matcher(javadoc);\n\t\tMatcher lineBreakMatcher = LINE_BREAK_FINDER.matcher(javadoc);\n\t\tint sectionStart = -1;\n\t\tint sectionEnd = -1;\n\t\twhile (sectionMatcher.find()) {\n\t\t\tboolean found = false;\n\t\t\tfor (String sectionName : sectionNames) if (sectionMatcher.group(1).equalsIgnoreCase(sectionName)) {\n\t\t\t\tfound = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (found) {\n\t\t\t\tlineBreakMatcher.find(sectionMatcher.end());\n\t\t\t\tsectionStart = lineBreakMatcher.end();\n\t\t\t} else if (sectionStart != -1) {\n\t\t\t\tsectionEnd = sectionMatcher.start();\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (sectionStart != -1) {\n\t\t\tif (sectionEnd != -1) return javadoc.substring(sectionStart, sectionEnd);\n\t\t\treturn javadoc.substring(sectionStart);\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\t\n\tprivate static final Pattern FIND_RETURN = Pattern.compile(\"^\\\\s*\\\\**\\\\s*@returns?\\\\s+.*$\", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);\n\t\n\tpublic static String addReturnsThisIfNeeded(String in) {\n\t\tif (in != null && FIND_RETURN.matcher(in).find()) return in;\n\t\t\n\t\treturn addJavadocLine(in, \"@return {@code this}.\");\n\t}\n\t\n\tpublic static String addReturnsUpdatedSelfIfNeeded(String in) {\n\t\tif (in != null && FIND_RETURN.matcher(in).find()) return in;\n\t\t\n\t\treturn addJavadocLine(in, \"@return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\");\n\t}\n\t\n\tpublic static String addJavadocLine(String in, String line) {\n\t\tif (in == null) return line;\n\t\tif (in.endsWith(\"\\n\")) return in + line;\n\t\treturn in + \"\\n\" + line;\n\t}\n\n\tpublic static String getParamJavadoc(String methodComment, String param) {\n\t\tif (methodComment == null || methodComment.isEmpty()) return methodComment;\n\t\tPattern pattern = Pattern.compile(\"@param \" + param + \" .+?(?=^ ?@|\\\\z)\", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE | Pattern.DOTALL);\n\t\tMatcher matcher = pattern.matcher(methodComment);\n\t\tif (matcher.find()) {\n\t\t\treturn matcher.group();\n\t\t}\n\t\treturn null;\n\t}\n\t\n\tpublic static String getConstructorJavadocHeader(String typeName) {\n\t\treturn \"Creates a new {@code \" + typeName + \"} instance.\\n\\n\";\n\t}\n\t\n\tpublic static String getConstructorParameterJavadoc(String paramName, String fieldJavadoc) {\n\t\tString fieldBaseJavadoc = stripSectionsFromJavadoc(fieldJavadoc);\n\t\t\n\t\tString paramJavadoc = getParamJavadoc(fieldBaseJavadoc, paramName);\n\t\tif (paramJavadoc != null) {\n\t\t\treturn paramJavadoc;\n\t\t}\n\t\t\n\t\tString javadocWithoutTags = stripLinesWithTagFromJavadoc(fieldBaseJavadoc, JavadocTag.PARAM, JavadocTag.RETURN);\n\t\tif (javadocWithoutTags != null) {\n\t\t\treturn \"@param \" + paramName + \" \" + javadocWithoutTags;\n\t\t}\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/handlers/InclusionExclusionUtils.java",
    "content": "/*\n * Copyright (C) 2009-2020 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.handlers;\n\nimport java.lang.annotation.Annotation;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.Comparator;\nimport java.util.Iterator;\nimport java.util.List;\n\nimport lombok.EqualsAndHashCode;\nimport lombok.ToString;\nimport lombok.core.AST;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.core.LombokNode;\n\npublic class InclusionExclusionUtils {\n\tprivate static List<Integer> createListOfNonExistentFields(List<String> list, LombokNode<?, ?, ?> type, boolean excludeStandard, boolean excludeTransient) {\n\t\tboolean[] matched = new boolean[list.size()];\n\t\t\n\t\tfor (LombokNode<?, ?, ?> child : type.down()) {\n\t\t\tif (list.isEmpty()) break;\n\t\t\tif (child.getKind() != Kind.FIELD) continue;\n\t\t\tif (excludeStandard) {\n\t\t\t\tif (child.isStatic()) continue;\n\t\t\t\tif (child.getName().startsWith(\"$\")) continue;\n\t\t\t}\n\t\t\tif (excludeTransient && child.isTransient()) continue;\n\t\t\t\n\t\t\tint idx = list.indexOf(child.getName());\n\t\t\tif (idx > -1) matched[idx] = true;\n\t\t}\n\t\t\n\t\tList<Integer> problematic = new ArrayList<Integer>();\n\t\tfor (int i = 0 ; i < list.size() ; i++) if (!matched[i]) problematic.add(i);\n\t\t\n\t\treturn problematic;\n\t}\n\t\n\tpublic static void checkForBogusFieldNames(LombokNode<?, ?, ?> type, AnnotationValues<?> annotation, List<String> excludes, List<String> includes) {\n\t\tif (excludes != null && !excludes.isEmpty()) {\n\t\t\tfor (int i : createListOfNonExistentFields(excludes, type, true, false)) {\n\t\t\t\tif (annotation != null) annotation.setWarning(\"exclude\", \"This field does not exist, or would have been excluded anyway.\", i);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (includes != null && !includes.isEmpty()) {\n\t\t\tfor (int i : createListOfNonExistentFields(includes, type, false, false)) {\n\t\t\t\tif (annotation != null) annotation.setWarning(\"of\", \"This field does not exist.\", i);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic static class Included<L, I extends Annotation> {\n\t\tprivate final L node;\n\t\tprivate final I inc;\n\t\tprivate final boolean defaultInclude;\n\t\tprivate final boolean explicitRank;\n\t\t\n\t\tpublic Included(L node, I inc, boolean defaultInclude, boolean explicitRank) {\n\t\t\tthis.node = node;\n\t\t\tthis.inc = inc;\n\t\t\tthis.defaultInclude = defaultInclude;\n\t\t\tthis.explicitRank = explicitRank;\n\t\t}\n\t\t\n\t\tpublic L getNode() {\n\t\t\treturn node;\n\t\t}\n\t\t\n\t\tpublic I getInc() {\n\t\t\treturn inc;\n\t\t}\n\t\t\n\t\tpublic boolean isDefaultInclude() {\n\t\t\treturn defaultInclude;\n\t\t}\n\t\t\n\t\tpublic boolean hasExplicitRank() {\n\t\t\treturn explicitRank;\n\t\t}\n\t}\n\t\n\tprivate static String innerAnnName(Class<? extends Annotation> type) {\n\t\tString name = type.getSimpleName();\n\t\tClass<?> c = type.getEnclosingClass();\n\t\twhile (c != null) {\n\t\t\tname = c.getSimpleName() + \".\" + name;\n\t\t\tc = c.getEnclosingClass();\n\t\t}\n\t\treturn name;\n\t}\n\t\n\tprivate static <A extends AST<A, L, N>, L extends LombokNode<A, L, N>, N, I extends Annotation> List<Included<L, I>> handleIncludeExcludeMarking(Class<I> inclType, String replaceName, Class<? extends Annotation> exclType, LombokNode<A, L, N> typeNode, AnnotationValues<?> annotation, LombokNode<A, L, N> annotationNode, boolean includeTransient) {\n\t\tboolean onlyExplicitlyIncluded = annotation != null ? annotation.getAsBoolean(\"onlyExplicitlyIncluded\") : false;\n\t\treturn handleIncludeExcludeMarking(inclType, onlyExplicitlyIncluded, replaceName, exclType, typeNode, annotation, annotationNode, includeTransient);\n\t}\n\t\n\tprivate static <A extends AST<A, L, N>, L extends LombokNode<A, L, N>, N, I extends Annotation> List<Included<L, I>> handleIncludeExcludeMarking(Class<I> inclType, boolean onlyExplicitlyIncluded, String replaceName, Class<? extends Annotation> exclType, LombokNode<A, L, N> typeNode, AnnotationValues<?> annotation, LombokNode<A, L, N> annotationNode, boolean includeTransient) {\n\t\tList<String> oldExcludes = (annotation != null && annotation.isExplicit(\"exclude\")) ? annotation.getAsStringList(\"exclude\") : null;\n\t\tList<String> oldIncludes = (annotation != null && annotation.isExplicit(\"of\")) ? annotation.getAsStringList(\"of\") : null;\n\t\t\n\t\tboolean memberAnnotationMode = onlyExplicitlyIncluded;\n\t\tList<Included<L, I>> members = new ArrayList<Included<L, I>>();\n\t\tList<String> namesToAutoExclude = new ArrayList<String>();\n\t\t\n\t\tif (typeNode == null || typeNode.getKind() != Kind.TYPE) return null;\n\t\t\n\t\tcheckForBogusFieldNames(typeNode, annotation, oldExcludes, oldIncludes);\n\t\tif (oldExcludes != null && oldIncludes != null) {\n\t\t\toldExcludes = null;\n\t\t\tif (annotation != null) annotation.setWarning(\"exclude\", \"exclude and of are mutually exclusive; the 'exclude' parameter will be ignored.\");\n\t\t}\n\t\t\n\t\tfor (L child : typeNode.down()) {\n\t\t\tboolean markExclude = child.getKind() == Kind.FIELD && child.hasAnnotation(exclType);\n\t\t\tAnnotationValues<I> markInclude = null;\n\t\t\tif (child.getKind() == Kind.FIELD || child.getKind() == Kind.METHOD) markInclude = child.findAnnotation(inclType);\n\t\t\t\n\t\t\tif (markExclude || markInclude != null) memberAnnotationMode = true;\n\t\t\t\n\t\t\tif (markInclude != null && markExclude) {\n\t\t\t\tchild.addError(\"@\" + innerAnnName(exclType) + \" and @\" + innerAnnName(inclType) + \" are mutually exclusive; the @Include annotation will be ignored\");\n\t\t\t\tmarkInclude = null;\n\t\t\t}\n\t\t\t\n\t\t\tString name = child.getName();\n\t\t\t\n\t\t\tif (markExclude) {\n\t\t\t\tif (onlyExplicitlyIncluded) {\n\t\t\t\t\tchild.addWarning(\"The @Exclude annotation is not needed; 'onlyExplicitlyIncluded' is set, so this member would be excluded anyway\");\n\t\t\t\t} else if (child.isStatic()) {\n\t\t\t\t\tchild.addWarning(\"The @Exclude annotation is not needed; static fields aren't included anyway\");\n\t\t\t\t} else if (name.startsWith(\"$\")) {\n\t\t\t\t\tchild.addWarning(\"The @Exclude annotation is not needed; fields that start with $ aren't included anyway\");\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tif (oldExcludes != null && oldExcludes.contains(name)) continue;\n\t\t\t\n\t\t\tif (markInclude != null) {\n\t\t\t\tI inc = markInclude.getInstance();\n\t\t\t\tif (child.getKind() == Kind.METHOD) {\n\t\t\t\t\tif (child.countMethodParameters() > 0) {\n\t\t\t\t\t\tchild.addError(\"Methods included with @\" + innerAnnName(inclType) + \" must have no arguments; it will not be included\");\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tString n = replaceName != null ?  markInclude.getAsString(replaceName) : \"\";\n\t\t\t\t\tif (n.isEmpty()) n = name;\n\t\t\t\t\tnamesToAutoExclude.add(n);\n\t\t\t\t}\n\t\t\t\tmembers.add(new Included<L, I>(child, inc, false, markInclude.isExplicit(\"rank\")));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tif (onlyExplicitlyIncluded) continue;\n\t\t\tif (oldIncludes != null) {\n\t\t\t\tif (child.getKind() == Kind.FIELD && oldIncludes.contains(name)) members.add(new Included<L, I>(child, null, false, false));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (child.getKind() != Kind.FIELD) continue;\n\t\t\tif (child.isStatic()) continue;\n\t\t\tif (child.isTransient() && !includeTransient) continue;\n\t\t\tif (name.startsWith(\"$\")) continue;\n\t\t\tif (child.isEnumMember()) continue;\n\t\t\tmembers.add(new Included<L, I>(child, null, true, false));\n\t\t}\n\t\t\n\t\t/* delete default-included fields with the same name as an explicit inclusion */ {\n\t\t\tIterator<Included<L, I>> it = members.iterator();\n\t\t\twhile (it.hasNext()) {\n\t\t\t\tIncluded<L, I> m = it.next();\n\t\t\t\tif (m.isDefaultInclude() && namesToAutoExclude.contains(m.getNode().getName())) it.remove();\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (annotation == null || !annotation.isExplicit(\"exclude\")) oldExcludes = null;\n\t\tif (annotation == null || !annotation.isExplicit(\"of\")) oldIncludes = null;\n\t\t\n\t\tif (memberAnnotationMode && (oldExcludes != null || oldIncludes != null)) {\n\t\t\tannotationNode.addError(\"The old-style 'exclude/of' parameter cannot be used together with the new-style @Include / @Exclude annotations.\");\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\treturn members;\n\t}\n\t\n\tpublic static <A extends AST<A, L, N>, L extends LombokNode<A, L, N>, N> List<Included<L, ToString.Include>> handleToStringMarking(LombokNode<A, L, N> typeNode, boolean onlyExplicitlyIncluded, AnnotationValues<ToString> annotation, LombokNode<A, L, N> annotationNode) {\n\t\tList<Included<L, ToString.Include>> members = handleIncludeExcludeMarking(ToString.Include.class, onlyExplicitlyIncluded, \"name\", ToString.Exclude.class, typeNode, annotation, annotationNode, true);\n\t\t\n\t\tCollections.sort(members, new Comparator<Included<L, ToString.Include>>() {\n\t\t\t@Override public int compare(Included<L, ToString.Include> a, Included<L, ToString.Include> b) {\n\t\t\t\tint ra = a.getInc() == null ? 0 : a.getInc().rank();\n\t\t\t\tint rb = b.getInc() == null ? 0 : b.getInc().rank();\n\t\t\t\t\n\t\t\t\treturn compareRankOrPosition(ra, rb, a.getNode(), b.getNode());\n\t\t\t}\n\t\t});\n\t\treturn members;\n\t}\n\t\n\tpublic static <A extends AST<A, L, N>, L extends LombokNode<A, L, N>, N> List<Included<L, EqualsAndHashCode.Include>> handleEqualsAndHashCodeMarking(LombokNode<A, L, N> typeNode, AnnotationValues<EqualsAndHashCode> annotation, LombokNode<A, L, N> annotationNode) {\n\t\tList<Included<L, EqualsAndHashCode.Include>> members = handleIncludeExcludeMarking(EqualsAndHashCode.Include.class, \"replaces\", EqualsAndHashCode.Exclude.class, typeNode, annotation, annotationNode, false);\n\t\t\n\t\tCollections.sort(members, new Comparator<Included<L, EqualsAndHashCode.Include>>() {\n\t\t\t@Override public int compare(Included<L, EqualsAndHashCode.Include> a, Included<L, EqualsAndHashCode.Include> b) {\n\t\t\t\tint ra = a.hasExplicitRank() ? a.getInc().rank() : HandlerUtil.defaultEqualsAndHashcodeIncludeRank(a.node.fieldOrMethodBaseType());\n\t\t\t\tint rb = b.hasExplicitRank() ? b.getInc().rank() : HandlerUtil.defaultEqualsAndHashcodeIncludeRank(b.node.fieldOrMethodBaseType());\n\t\t\t\t\n\t\t\t\treturn compareRankOrPosition(ra, rb, a.getNode(), b.getNode());\n\t\t\t}\n\t\t});\n\t\treturn members;\n\t}\n\t\n\tprivate static <A extends AST<A, L, N>, L extends LombokNode<A, L, N>, N> int compareRankOrPosition(int ra, int rb, LombokNode<A, L, N> nodeA, LombokNode<A, L, N> nodeB) {\n\t\tif (ra < rb) return +1;\n\t\tif (ra > rb) return -1;\n\t\t\n\t\tint pa = nodeA.getStartPos();\n\t\tint pb = nodeB.getStartPos();\n\t\t\n\t\tif (pa < pb) return -1;\n\t\tif (pa > pb) return +1;\n\t\t\n\t\treturn 0;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/handlers/LoggingFramework.java",
    "content": "/*\n * Copyright (C) 2019 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.handlers;\n\nimport java.lang.annotation.Annotation;\n\nimport lombok.core.configuration.LogDeclaration;\n\npublic class LoggingFramework {\n\t// private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(TargetType.class);\n\tpublic static final LoggingFramework COMMONS = new LoggingFramework(\n\t\tlombok.extern.apachecommons.CommonsLog.class,\n\t\tLogDeclaration.valueOf(\"org.apache.commons.logging.Log org.apache.commons.logging.LogFactory.getLog(TYPE)(TOPIC)\")\n\t);\n\t\n\t// private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(TargetType.class.getName());\n\tpublic static final LoggingFramework JUL = new LoggingFramework(\n\t\tlombok.extern.java.Log.class,\n\t\tLogDeclaration.valueOf(\"java.util.logging.Logger java.util.logging.Logger.getLogger(NAME)(TOPIC)\")\n\t);\n\t\n\t// private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(TargetType.class);\n\tpublic static final LoggingFramework LOG4J = new LoggingFramework(\n\t\tlombok.extern.log4j.Log4j.class,\n\t\tLogDeclaration.valueOf(\"org.apache.log4j.Logger org.apache.log4j.Logger.getLogger(TYPE)(TOPIC)\")\n\t);\n\n\t// private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(TargetType.class);\n\tpublic static final LoggingFramework LOG4J2 = new LoggingFramework(\n\t\tlombok.extern.log4j.Log4j2.class,\n\t\tLogDeclaration.valueOf(\"org.apache.logging.log4j.Logger org.apache.logging.log4j.LogManager.getLogger(TYPE)(TOPIC)\")\n\t);\n\n\t// private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(TargetType.class);\n\tpublic static final LoggingFramework SLF4J = new LoggingFramework(\n\t\tlombok.extern.slf4j.Slf4j.class,\n\t\tLogDeclaration.valueOf(\"org.slf4j.Logger org.slf4j.LoggerFactory.getLogger(TYPE)(TOPIC)\")\n\t);\n\t\n\t// private static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(TargetType.class);\n\tpublic static final LoggingFramework XSLF4J = new LoggingFramework(\n\t\tlombok.extern.slf4j.XSlf4j.class,\n\t\tLogDeclaration.valueOf(\"org.slf4j.ext.XLogger org.slf4j.ext.XLoggerFactory.getXLogger(TYPE)(TOPIC)\")\n\t);\n\n\t// private static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(TargetType.class);\n\tpublic static final LoggingFramework JBOSSLOG = new LoggingFramework(\n\t\tlombok.extern.jbosslog.JBossLog.class,\n\t\tLogDeclaration.valueOf(\"org.jboss.logging.Logger org.jboss.logging.Logger.getLogger(TYPE)(TOPIC)\")\n\t);\n\t\n\t// private static final com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();\n\tpublic static final LoggingFramework FLOGGER = new LoggingFramework(\n\t\tlombok.extern.flogger.Flogger.class,\n\t\tLogDeclaration.valueOf(\"com.google.common.flogger.FluentLogger com.google.common.flogger.FluentLogger.forEnclosingClass()\")\n\t);\n\t\n\tprivate final Class<? extends Annotation> annotationClass;\n\tprivate final String annotationAsString;\n\tprivate final LogDeclaration declaration;\n\t\n\tpublic LoggingFramework(Class<? extends Annotation> annotationClass, LogDeclaration declaration) {\n\t\tthis.annotationClass = annotationClass;\n\t\tthis.annotationAsString = \"@\" + annotationClass.getSimpleName();\n\t\tthis.declaration = declaration;\n\t}\n\t\n\tpublic Class<? extends Annotation> getAnnotationClass() {\n\t\treturn annotationClass;\n\t}\n\t\n\tpublic String getAnnotationAsString() {\n\t\treturn annotationAsString;\n\t}\n\t\n\tpublic LogDeclaration getDeclaration() {\n\t\treturn declaration;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/handlers/Singulars.java",
    "content": "/*\n * Copyright (C) 2015 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.handlers;\n\nimport java.io.BufferedReader;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class Singulars {\n\tprivate static final List<String> SINGULAR_STORE; // intended to be immutable.\n\t\n\tstatic {\n\t\tSINGULAR_STORE = new ArrayList<String>();\n\t\t\n\t\ttry {\n\t\t\tInputStream in = Singulars.class.getResourceAsStream(\"singulars.txt\");\n\t\t\ttry {\n\t\t\t\tBufferedReader br = new BufferedReader(new InputStreamReader(in, \"UTF-8\"));\n\t\t\t\tfor (String line = br.readLine(); line != null; line = br.readLine()) {\n\t\t\t\t\tline = line.trim();\n\t\t\t\t\tif (line.startsWith(\"#\") || line.isEmpty()) continue;\n\t\t\t\t\tif (line.endsWith(\" =\")) {\n\t\t\t\t\t\tSINGULAR_STORE.add(line.substring(0, line.length() - 2));\n\t\t\t\t\t\tSINGULAR_STORE.add(\"\");\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tint idx = line.indexOf(\" = \");\n\t\t\t\t\tSINGULAR_STORE.add(line.substring(0, idx));\n\t\t\t\t\tSINGULAR_STORE.add(line.substring(idx + 3));\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\ttry {\n\t\t\t\t\tin.close();\n\t\t\t\t} catch (Throwable ignore) {}\n\t\t\t}\n\t\t} catch (IOException e) {\n\t\t\tSINGULAR_STORE.clear();\n\t\t}\n\t}\n\t\n\tpublic static String autoSingularize(String in) {\n\t\tfinal int inLen = in.length();\n\t\tfor (int i = 0; i < SINGULAR_STORE.size(); i+= 2) {\n\t\t\tfinal String lastPart = SINGULAR_STORE.get(i);\n\t\t\tfinal boolean wholeWord = Character.isUpperCase(lastPart.charAt(0));\n\t\t\tfinal int endingOnly = lastPart.charAt(0) == '-' ? 1 : 0;\n\t\t\tfinal int len = lastPart.length();\n\t\t\tif (inLen < len) continue;\n\t\t\tif (!in.regionMatches(true, inLen - len + endingOnly, lastPart, endingOnly, len - endingOnly)) continue;\n\t\t\tif (wholeWord && inLen != len && !Character.isUpperCase(in.charAt(inLen - len))) continue;\n\t\t\t\n\t\t\tString replacement = SINGULAR_STORE.get(i + 1);\n\t\t\tif (replacement.equals(\"!\")) return null;\n\t\t\t\n\t\t\tboolean capitalizeFirst = !replacement.isEmpty() && Character.isUpperCase(in.charAt(inLen - len + endingOnly));\n\t\t\tString pre = in.substring(0, inLen - len + endingOnly);\n\t\t\tString post = capitalizeFirst ? Character.toUpperCase(replacement.charAt(0)) + replacement.substring(1) : replacement;\n\t\t\treturn pre + post;\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/handlers/SneakyThrowsAndCleanupDependencyInfo.java",
    "content": "/*\n * Copyright (C) 2009-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.handlers;\n\nimport java.util.Arrays;\nimport java.util.List;\n\nimport lombok.core.runtimeDependencies.RuntimeDependencyInfo;\nimport lombok.spi.Provides;\n\n@Provides\npublic class SneakyThrowsAndCleanupDependencyInfo implements RuntimeDependencyInfo {\n\t@Override public List<String> getRuntimeDependencies() {\n\t\treturn Arrays.asList(\n\t\t\t\t\"lombok/Lombok.class\"\n\t\t);\n\t}\n\t\n\t@Override public List<String> getRuntimeDependentsDescriptions() {\n\t\treturn Arrays.asList(\n\t\t\t\"@SneakyThrows (only when delomboking - using @SneakyThrows in code that is compiled with lombok on the classpath does not create the dependency)\",\n\t\t\t\"@Cleanup (only when delomboking - using @Cleanup in code that is compiled with lombok on the classpath does not create the dependency)\"\n\t\t);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/handlers/package-info.java",
    "content": "/*\n * Copyright (C) 2009-2014 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/**\n * This package contains utility methods and classes shared between javac-specific feature implementations\n * and eclipse-specific feature implementations.\n * \n * <strong>NB: This package is not public API in the sense that contents of this package,\n *    even public classes / methods / etc, may change in point releases.</strong>\n */\npackage lombok.core.handlers;\n"
  },
  {
    "path": "src/core/lombok/core/handlers/singulars.txt",
    "content": "#Based on https://github.com/rails/rails/blob/efff6c1fd4b9e2e4c9f705a45879373cb34a5b0e/activesupport/lib/active_support/inflections.rb\n\nquizzes = quiz\nmatrices = matrix\nindices = index\nvertices = vertex\nstatuses = status\naliases = alias\nalias = !\nspecies = !\nAxes = !\n-axes = axe\nsexes = sex\nTestes = testis\nmovies = movie\noctopodes = octopus\nbuses = bus\nMice = mouse\nLice = louse\nNews = !\n# We could add more detail (axemen, boatsmen, boogymen, cavemen, gentlemen, etc, but (A) there's stuff like 'cerumen', and (B) the 'men' ending is common in singulars and other languages.)\n# Therefore, the odds of a mistake are too high, so other than these 2 well known cases, force the explicit singular.\nMen = man\nWomen = woman\nminutiae = minutia\nshoes = shoe\nsynopses = synopsis\nprognoses = prognosis\ntheses = thesis\ndiagnoses = diagnosis\nbases = base\nanalyses = analysis\nCrises = crisis\nchildren = child\nmoves = move\nzombies = zombie\n-quies = quy\n-us = !\n-is = !\nseries = !\n-ies = y\n-oes = o\nhives = hive\n-tives = tive\n-sses = ss\n-ches = ch\n-xes = x\n-shes = sh\n-lves = lf\n-rves = rf\nsaves = save\nLeaves = leaf\n-ves = !\n-ss = !\n-us = !\n-s = \n"
  },
  {
    "path": "src/core/lombok/core/package-info.java",
    "content": "/*\n * Copyright (C) 2009 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/**\n * Contains the platform-agnostic core of lombok.\n * Includes the lombok AST superclasses, annotation introspection support,\n * an implementation of SPI service loader (to avoid being dependent on a v1.6 JVM),\n * lombok's version, and annotations and support classes for your normal java code\n * that's primarily useful for developing and debugging lombok.\n * \n * <strong>NB: This package is not public API in the sense that contents of this package,\n *    even public classes / methods / etc, may change in point releases.</strong>\n */\npackage lombok.core;\n"
  },
  {
    "path": "src/core/lombok/core/runtimeDependencies/CreateLombokRuntimeApp.java",
    "content": "/*\n * Copyright (C) 2009-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.runtimeDependencies;\n\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.OutputStream;\nimport java.io.PrintStream;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.LinkedHashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.jar.JarOutputStream;\nimport java.util.zip.ZipEntry;\n\nimport lombok.core.LombokApp;\nimport lombok.core.SpiLoadUtil;\nimport lombok.spi.Provides;\n\nimport com.zwitserloot.cmdreader.CmdReader;\nimport com.zwitserloot.cmdreader.Description;\nimport com.zwitserloot.cmdreader.InvalidCommandLineException;\nimport com.zwitserloot.cmdreader.Mandatory;\nimport com.zwitserloot.cmdreader.Requires;\nimport com.zwitserloot.cmdreader.Shorthand;\n\n@Provides\npublic class CreateLombokRuntimeApp extends LombokApp {\n\tprivate List<RuntimeDependencyInfo> infoObjects;\n\t\n\t@Override public String getAppName() {\n\t\treturn \"createRuntime\";\n\t}\n\t\n\t@Override public String getAppDescription() {\n\t\treturn \"Creates a small lombok-runtime.jar with the runtime\\n\" +\n\t\t\t\t\"dependencies of all lombok transformations that have them,\\n\" +\n\t\t\t\t\"and prints the names of each lombok transformation that\\n\" +\n\t\t\t\t\"requires the lombok-runtime.jar at runtime.\";\n\t}\n\t\n\t@Override public List<String> getAppAliases() {\n\t\treturn Arrays.asList(\"runtime\");\n\t}\n\t\n\tprivate static class CmdArgs {\n\t\t@Shorthand(\"p\")\n\t\t@Description(\"Prints those lombok transformations that require lombok-runtime.jar.\")\n\t\t@Mandatory(onlyIfNot=\"create\")\n\t\tboolean print;\n\t\t\n\t\t@Shorthand(\"c\")\n\t\t@Description(\"Creates the lombok-runtime.jar.\")\n\t\t@Mandatory(onlyIfNot=\"print\")\n\t\tboolean create;\n\t\t\n\t\t@Shorthand(\"o\")\n\t\t@Description(\"Where to write the lombok-runtime.jar. Defaults to the current working directory.\")\n\t\t@Requires(\"create\")\n\t\tString output;\n\t\t\n\t\t@Description(\"Shows this help text\")\n\t\tboolean help;\n\t}\n\t\n\t@Override public int runApp(List<String> rawArgs) throws Exception {\n\t\tCmdReader<CmdArgs> reader = CmdReader.of(CmdArgs.class);\n\t\tCmdArgs args;\n\t\ttry {\n\t\t\targs = reader.make(rawArgs.toArray(new String[0]));\n\t\t} catch (InvalidCommandLineException e) {\n\t\t\tprintHelp(reader, e.getMessage(), System.err);\n\t\t\treturn 1;\n\t\t}\n\t\t\n\t\tif (args.help) {\n\t\t\tprintHelp(reader, null, System.out);\n\t\t\treturn 0;\n\t\t}\n\t\t\n\t\tinitializeInfoObjects();\n\t\t\n\t\tif (args.print) {\n\t\t\tprintRuntimeDependents();\n\t\t}\n\t\t\n\t\tint errCode = 0;\n\t\t\n\t\tif (args.create) {\n\t\t\tFile out = new File(\"./lombok-runtime.jar\");\n\t\t\tif (args.output != null) {\n\t\t\t\tout = new File(args.output);\n\t\t\t\tif (out.isDirectory()) out = new File(out, \"lombok-runtime.jar\");\n\t\t\t}\n\t\t\t\n\t\t\ttry {\n\t\t\t\terrCode = writeRuntimeJar(out);\n\t\t\t} catch (Exception e) {\n\t\t\t\tSystem.err.println(\"ERROR: Creating \" + canonical(out) + \" failed: \");\n\t\t\t\te.printStackTrace();\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn errCode;\n\t}\n\t\n\tprivate void printRuntimeDependents() {\n\t\tList<String> descriptions = new ArrayList<String>();\n\t\tfor (RuntimeDependencyInfo info : infoObjects) descriptions.addAll(info.getRuntimeDependentsDescriptions());\n\t\tif (descriptions.isEmpty()) {\n\t\t\tSystem.out.println(\"Not printing dependents: No lombok transformations currently have any runtime dependencies!\");\n\t\t} else {\n\t\t\tSystem.out.println(\"Using any of these lombok features means your app will need lombok-runtime.jar:\");\n\t\t\tfor (String desc : descriptions) {\n\t\t\t\tSystem.out.println(desc);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate int writeRuntimeJar(File outFile) throws Exception {\n\t\tMap<String, Class<?>> deps = new LinkedHashMap<String, Class<?>>();\n\t\tfor (RuntimeDependencyInfo info : infoObjects) {\n\t\t\tList<String> depNames = info.getRuntimeDependencies();\n\t\t\tif (depNames != null) for (String depName : depNames) {\n\t\t\t\tif (!deps.containsKey(depName)) deps.put(depName, info.getClass());\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (deps.isEmpty()) {\n\t\t\tSystem.out.println(\"Not generating lombok-runtime.jar: No lombok transformations currently have any runtime dependencies!\");\n\t\t\treturn 1;\n\t\t}\n\t\t\n\t\tOutputStream out = new FileOutputStream(outFile);\n\t\tboolean success = false;\n\t\ttry {\n\t\t\tJarOutputStream jar = new JarOutputStream(out);\n\t\t\tdeps.put(\"LICENSE\", CreateLombokRuntimeApp.class);\n\t\t\tdeps.put(\"AUTHORS\", CreateLombokRuntimeApp.class);\n\t\t\tfor (Entry<String, Class<?>> dep : deps.entrySet()) {\n\t\t\t\tInputStream in = dep.getValue().getResourceAsStream(\"/\" + dep.getKey());\n\t\t\t\ttry {\n\t\t\t\t\tif (in == null) {\n\t\t\t\t\t\tthrow new Fail(String.format(\"Dependency %s contributed by %s cannot be found\", dep.getKey(), dep.getValue()));\n\t\t\t\t\t}\n\t\t\t\t\twriteIntoJar(jar, dep.getKey(), in);\n\t\t\t\t} finally {\n\t\t\t\t\tif (in != null) in.close();\n\t\t\t\t}\n\t\t\t}\n\t\t\tjar.close();\n\t\t\tout.close();\n\t\t\t\n\t\t\tSystem.out.println(\"Successfully created: \" + canonical(outFile));\n\t\t\t\n\t\t\treturn 0;\n\t\t} catch (Throwable t) {\n\t\t\ttry { out.close();} catch (Throwable ignore) {}\n\t\t\tif (!success) outFile.delete();\n\t\t\tif (t instanceof Fail) {\n\t\t\t\tSystem.err.println(t.getMessage());\n\t\t\t\treturn 1;\n\t\t\t} else if (t instanceof Exception) {\n\t\t\t\tthrow (Exception)t;\n\t\t\t} else if (t instanceof Error) {\n\t\t\t\tthrow (Error)t;\n\t\t\t} else {\n\t\t\t\tthrow new Exception(t);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate void writeIntoJar(JarOutputStream jar, String depName, InputStream in) throws IOException {\n\t\tjar.putNextEntry(new ZipEntry(depName));\n\t\tbyte[] b = new byte[65536];\n\t\twhile (true) {\n\t\t\tint r = in.read(b);\n\t\t\tif (r == -1) break;\n\t\t\tjar.write(b, 0, r);\n\t\t}\n\t\tjar.closeEntry();\n\t\tin.close();\n\t}\n\t\n\tprivate static class Fail extends Exception {\n\t\tFail(String message) {\n\t\t\tsuper(message);\n\t\t}\n\t}\n\t\n\tprivate void initializeInfoObjects() throws IOException {\n\t\tinfoObjects = SpiLoadUtil.readAllFromIterator(\n\t\t\t\tSpiLoadUtil.findServices(RuntimeDependencyInfo.class));\n\t}\n\t\n\tprivate static String canonical(File out) {\n\t\ttry {\n\t\t\treturn out.getCanonicalPath();\n\t\t} catch (Exception e) {\n\t\t\treturn out.getAbsolutePath();\n\t\t}\n\t}\n\t\n\tprivate void printHelp(CmdReader<CmdArgs> reader, String message, PrintStream out) {\n\t\tif (message != null) {\n\t\t\tout.println(message);\n\t\t\tout.println(\"----------------------------\");\n\t\t}\n\t\tout.println(reader.generateCommandLineHelp(\"java -jar lombok.jar createRuntime\"));\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/core/runtimeDependencies/RuntimeDependencyInfo.java",
    "content": "/*\n * Copyright (C) 2009 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.runtimeDependencies;\n\nimport java.util.List;\n\n/**\n * Implement and provide this interface to specify which transformations have a runtime dependency on\n * {@code lombok-runtime.jar}, as well as which files of your transformation must be in {@code lombok-runtime.jar}.\n */\npublic interface RuntimeDependencyInfo {\n\t/**\n\t * @return A list of strings describing each lombok transformation that has a runtime dependency.\n\t */\n\tpublic List<String> getRuntimeDependentsDescriptions();\n\t\n\t/**\n\t * @return A list of files (findable via {@code yourClass.getResourceAsStream(\"/\" + NAME)}) to include in\n\t *     {@code lombok-runtime.jar}.\n\t */\n\tpublic List<String> getRuntimeDependencies();\n}\n"
  },
  {
    "path": "src/core/lombok/core/runtimeDependencies/package-info.java",
    "content": "/*\n * Copyright (C) 2009-2014 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/**\n * This package is the basis for lombok's (the jar, run as an application) ability to spin off\n * a clone of itself that only contains files required as a runtime dependency.\n * \n * This feature was used for a short while to support {@code @SneakyThrows}, but this is no longer\n * necessary. Currently no lombok features have any such dependencies though at some point we may\n * reintroduce the concept, for example to support properties.\n * \n * It is possible we'll use a different mechanism at that point; use the infrastructure in this package\n * with knowledge that it may be eliminated at any time.\n */\npackage lombok.core.runtimeDependencies;\n"
  },
  {
    "path": "src/core/lombok/eclipse/DeferUntilPostDiet.java",
    "content": "/*\n * Copyright (C) 2012 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Mark a handler class with this annotation to indicate that this handler should not be run in the diet parse phase.\n * 'diet parse' is where method bodies aren't filled in yet. If you have a method-level annotation that modifies the contents of that method,\n * you need to put this annotation on your handler. Otherwise, do not put this annotation on your handler.\n */\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface DeferUntilPostDiet {\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/EcjAugments.java",
    "content": "/*\n * Copyright (C) 2014-2023 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse;\n\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentMap;\n\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.env.ICompilationUnit;\nimport org.eclipse.jdt.internal.core.CompilationUnit;\nimport org.eclipse.jdt.internal.core.SourceMethod;\n\nimport lombok.core.FieldAugment;\n\npublic final class EcjAugments {\n\tprivate EcjAugments() {\n\t\t// Prevent instantiation\n\t}\n\t\n\tpublic static final FieldAugment<FieldDeclaration, Boolean> FieldDeclaration_booleanLazyGetter = FieldAugment.augment(FieldDeclaration.class, boolean.class, \"lombok$booleanLazyGetter\");\n\tpublic static final FieldAugment<ASTNode, Boolean> ASTNode_handled = FieldAugment.augment(ASTNode.class, boolean.class, \"lombok$handled\");\n\tpublic static final FieldAugment<ASTNode, ASTNode> ASTNode_generatedBy = FieldAugment.augment(ASTNode.class, ASTNode.class, \"$generatedBy\");\n\tpublic static final FieldAugment<Annotation, Boolean> Annotation_applied = FieldAugment.augment(Annotation.class, boolean.class, \"lombok$applied\");\n\tpublic static final FieldAugment<ICompilationUnit, Map<String, String>> CompilationUnit_javadoc = FieldAugment.augment(ICompilationUnit.class, Map.class, \"$javadoc\");\n\tpublic static final FieldAugment<CompilationUnitDeclaration, TransformationState> CompilationUnitDeclaration_transformationState = FieldAugment.augment(CompilationUnitDeclaration.class, Object.class, \"$transformationState\");\n\t\n\tpublic static final class EclipseAugments {\n\t\tprivate EclipseAugments() {\n\t\t\t// Prevent instantiation\n\t\t}\n\t\t\n\t\tpublic static final FieldAugment<CompilationUnit, ConcurrentMap<String, List<SourceMethod>>> CompilationUnit_delegateMethods = FieldAugment.augment(CompilationUnit.class, ConcurrentMap.class, \"$delegateMethods\");\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/EclipseAST.java",
    "content": "/*\n * Copyright (C) 2009-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse;\n\nimport java.io.File;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.Method;\nimport java.net.URI;\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.List;\n\nimport lombok.core.AST;\nimport lombok.core.LombokImmutableList;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\nimport lombok.permit.Permit;\n\nimport org.eclipse.core.resources.ResourcesPlugin;\nimport org.eclipse.core.runtime.Path;\nimport org.eclipse.jdt.internal.compiler.CompilationResult;\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.Argument;\nimport org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.ImportReference;\nimport org.eclipse.jdt.internal.compiler.ast.Initializer;\nimport org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.ParameterizedQualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.ParameterizedSingleTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.Wildcard;\n\n/**\n * Wraps around Eclipse's internal AST view to add useful features as well as the ability to visit parents from children,\n * something Eclipse own AST system does not offer.\n */\npublic class EclipseAST extends AST<EclipseAST, EclipseNode, ASTNode> {\n\t/**\n\t * Creates a new EclipseAST of the provided Compilation Unit.\n\t * \n\t * @param ast The compilation unit, which serves as the top level node in the tree to be built.\n\t */\n\tpublic EclipseAST(CompilationUnitDeclaration ast) {\n\t\tsuper(toFileName(ast), packageDeclaration(ast), new EclipseImportList(ast), statementTypes());\n\t\tthis.compilationUnitDeclaration = ast;\n\t\tsetTop(buildCompilationUnit(ast));\n\t\tthis.completeParse = isComplete(ast);\n\t\tclearChanged();\n\t}\n\t\n\tprivate static volatile boolean skipEclipseWorkspaceBasedFileResolver = false;\n\tprivate static final URI NOT_CALCULATED_MARKER = URI.create(\"https://projectlombok.org/not/calculated\");\n\tprivate URI memoizedAbsoluteFileLocation = NOT_CALCULATED_MARKER;\n\t\n\tpublic static URI getAbsoluteFileLocation(CompilationUnitDeclaration ast) {\n\t\treturn getAbsoluteFileLocation0(ast);\n\t}\n\t\n\tpublic URI getAbsoluteFileLocation() {\n\t\tif (memoizedAbsoluteFileLocation != NOT_CALCULATED_MARKER) return memoizedAbsoluteFileLocation;\n\t\t\n\t\tmemoizedAbsoluteFileLocation = getAbsoluteFileLocation0(this.compilationUnitDeclaration);\n\t\treturn memoizedAbsoluteFileLocation;\n\t}\n\t\n\t/** This is the call, but we wrapped it to memoize this. */\n\tprivate static URI getAbsoluteFileLocation0(CompilationUnitDeclaration ast) {\n\t\tString fileName = toFileName(ast);\n\t\tif (fileName != null && (fileName.startsWith(\"file:\") || fileName.startsWith(\"sourcecontrol:\"))) {\n\t\t\t// Some exotic build systems get real fancy with filenames. Known culprits:\n\t\t\t// The 'jazz' source control system _probably_ (not confirmed yet) uses sourcecontrol://jazz: urls.\n\t\t\t// GWT puts file:/D:/etc/etc/etc/Foo.java in here.\n\t\t\treturn URI.create(fileName);\n\t\t}\n\t\t\n\t\t// state of the research in this:\n\t\t// * We need an abstraction of a 'directory level'. This abstraction needs 'read()' which returns a string (content of lombok.config) and 'getParent()'.\n\t\t// * sometimes, cud.compilationResult.compilationUnit is an 'openable', you can chase this down to end up with a path, you can jigger this into being the sibling 'lombok.config', and then use:\n\t\t// \t\t\t\tInputStream in = ResourcesPlugin.getWorkspace().getRoot().getFile(ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(x)).getFullPath()).getContents(true);\n\t\t// to read out this data. Our theory is that this will work even with very crazy virtual filesystems such as sourcecontrol://jazz/blabla.\n\t\t// * With jazz and other creative file backed systems, is there even a 'project root' concept? Surely there won't be a 'workspace root' concept so how do we abstract the idea that, from jazz://whatever/projectroot, the parent is c:\\myWorkspace?\n\t\t// * Check the .getAlternateAbsolutePath() impl which has the research done so far.\n\t\t// * VIRTUAL FILES: Sometimes virtual files are created; their location tends to be /FileName.java which cannot be resolved. Optimally speaking we should find the 'source' of the virtual code and use IT for determining lombok.config, but that may not be feasible. If not, can we get at project or at least workspace?\n\t\t// * Either way there are sufficiently many WTF situations, that in case of error, as painful as this is, we should just carry on and not apply lombok.config, though at least if we don't recognize the scenario we should write a log file imploring the user to send us a bunch of feedback on the situation.\n\t\t// Relevant issues: Comment 2 on #683, all of #682\n\t\tif (!skipEclipseWorkspaceBasedFileResolver) {\n//\t\t\tif (Boolean.FALSE) throw new IllegalArgumentException(\"Here's the alt strat result: \" + getAlternativeAbsolutePathDEBUG());\n\t\t\ttry {\n\t\t\t\t/*if (fileName.startsWith(\"/\") && fileName.indexOf('/', 1) > -1) */\n\t\t\t\ttry {\n\t\t\t\t\treturn EclipseWorkspaceBasedFileResolver.resolve(fileName);\n\t\t\t\t} catch (IllegalArgumentException e) {\n\t\t\t\t\twarning(\"Finding 'lombok.config' file failed for '\" + fileName + \"'\", e);\n//\t\t\t\t\tString msg = e.getMessage();\n//\t\t\t\t\tif (msg != null && msg.startsWith(\"Path must include project and resource name\")) {\n//\t\t\t\t\t\t// We shouldn't throw an exception at all, but we can't reproduce this so we need help from our users to figure this out.\n//\t\t\t\t\t\t// Let's bother them with an error that slows their eclipse down to a crawl and makes it unusable.\n//\t\t\t\t\t\tthrow new IllegalArgumentException(\"Path resolution for lombok.config failed. Path: \" + fileName + \" -- package of this class: \" + this.getPackageDeclaration());\n//\t\t\t\t\t} else throw e;\n\t\t\t\t}\n\t\t\t} catch (NoClassDefFoundError e) {\n\t\t\t\tskipEclipseWorkspaceBasedFileResolver = true;\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Our fancy workspace based source file to absolute disk location algorithm only works in a fully fledged eclipse.\n\t\t// This fallback works when using 'ecj', which has a much simpler project/path system. For example, no 'linked' resources.\n\t\t\n\t\ttry {\n\t\t\treturn new File(fileName).getAbsoluteFile().toURI();\n\t\t} catch (Exception e) {\n\t\t\t// This is a temporary workaround while we try and gather all the various exotic shenanigans where lombok.config resolution is not going to work!\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n//\t/** This is ongoing research for issues with lombok.config resolution. */\n//\t@SuppressWarnings(\"unused\") private String getAlternativeAbsolutePathDEBUG() {\n//\t\ttry {\n//\t\t\tICompilationUnit cu = this.compilationUnitDeclaration.compilationResult.compilationUnit;\n//\t\t\t\n//\t\t\tif (cu instanceof Openable) {\n//\t\t\t\tString x = ((Openable) cu).getResource().getFullPath().makeAbsolute().toString();\n//\t\t\t\tint lastLoc = x.lastIndexOf('/');\n//\t\t\t\tx = x.substring(0, lastLoc + 1) + \"lombok.config\";\n//\t\t\t\tURI lombokConfigLoc = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(x)).getLocationURI();\n//\t\t\t\tInputStream in = ResourcesPlugin.getWorkspace().getRoot().getFile(ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(x)).getFullPath()).getContents(true);\n//\t\t\t\tbyte[] b = new byte[100000];\n//\t\t\t\tint p = 0;\n//\t\t\t\twhile (true) {\n//\t\t\t\t\tint r = in.read(b, p, b.length - p);\n//\t\t\t\t\tif (r == -1) break;\n//\t\t\t\t\tp += r;\n//\t\t\t\t}\n//\t\t\t\tin.close();\n//\t\t\t\treturn \"(Contents of lombok.config: \" + new String(b, 0, p, \"UTF-8\");\n//\n////\t\t\t\treturn \"(alt strategy result C: '\" + ((Openable) cu).getResource().getFullPath().makeAbsolute().toString() + \"'): resolved: \" + EclipseWorkspaceBasedFileResolver.resolve(((Openable) cu).getResource().getFullPath().makeAbsolute().toString());\n//\t\t\t}\n//\t\t\tif (cu instanceof SourceFile) {\n//\t\t\t\tString cuFileName = new String(((SourceFile) cu).getFileName());\n//\t\t\t\tString cuIFilePath = ((SourceFile) cu).resource.getFullPath().toString();\n//\t\t\t\treturn \"(alt strategy result A: \\\"\" + cuFileName + \"\\\" B: \\\"\" + cuIFilePath + \"\\\")\";\n//\t\t\t}\n//\t\t\treturn \"(alt strategy failed: cu isn't a SourceFile or Openable but a \" + cu.getClass() + \")\";\n//\t\t} catch (Exception e) {\n//\t\t\treturn \"(alt strategy failed: \" + e + \")\";\n//\t\t}\n//\t}\n\t\n\tprivate static class EclipseWorkspaceBasedFileResolver {\n\t\tpublic static URI resolve(String path) {\n\t\t\t/* eclipse issue: When creating snippets, for example to calculate 'find callers', refactor scripts, save actions, etc,\n\t\t\t * eclipse creates a psuedo-file whose path is simply \"/SimpleName.java\", which cannot be turned back into a real location.\n\t\t\t * What we really need to do is find out which file is the source of this script job and use its directory instead. For now,\n\t\t\t * we just go with all defaults; these operations are often not sensitive to proper lomboking or aren't even lomboked at all.\n\t\t\t * \n\t\t\t * Reliable way to reproduce this (Kepler, possibly with JDK8 beta support):\n\t\t\t * * Have a method, called once by some code in another class.\n\t\t\t * * Refactor it with the 'change method signature' refactor script, and add a parameter and hit 'ok'.\n\t\t\t */\n\t\t\tif (path == null || path.indexOf('/', 1) == -1) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(path)).getLocationURI();\n\t\t\t} catch (Exception e) {\n\t\t\t\t// One of the exceptions that can occur is IllegalStateException (during getWorkspace())\n\t\t\t\t// if you try to run this while eclipse is shutting down.\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate static String packageDeclaration(CompilationUnitDeclaration cud) {\n\t\tImportReference pkg = cud.currentPackage;\n\t\treturn pkg == null ? null : Eclipse.toQualifiedName(pkg.getImportName());\n\t}\n\t\n\t@Override public int getSourceVersion() {\n\t\tlong sl = compilationUnitDeclaration.problemReporter.options.sourceLevel;\n\t\tlong cl = compilationUnitDeclaration.problemReporter.options.complianceLevel;\n\t\tsl >>= 16;\n\t\tcl >>= 16;\n\t\tif (sl == 0) sl = cl;\n\t\tif (cl == 0) cl = sl;\n\t\treturn Math.min((int)(sl - 44), (int)(cl - 44));\n\t}\n\t\n\t@Override public int getLatestJavaSpecSupported() {\n\t\treturn Eclipse.getEcjCompilerVersion();\n\t}\n\t\n\t/**\n\t * Runs through the entire AST, starting at the compilation unit, calling the provided visitor's visit methods\n\t * for each node, depth first.\n\t */\n\tpublic void traverse(EclipseASTVisitor visitor) {\n\t\ttop().traverse(visitor);\n\t}\n\t\n\tvoid traverseChildren(EclipseASTVisitor visitor, EclipseNode node) {\n\t\tLombokImmutableList<EclipseNode> children = node.down();\n\t\tint len = children.size();\n\t\tfor (int i = 0; i < len; i++) {\n\t\t\tchildren.get(i).traverse(visitor);\n\t\t}\n\t}\n\t\n\tpublic void setSource(char[] source) {\n\t\tthis.source = source;\n\t}\n\t\n\tpublic char[] getSource() {\n\t\treturn source;\n\t}\n\t\n\t/**\n\t * Eclipse starts off with a 'diet' parse which leaves method bodies blank, amongst other shortcuts.\n\t * \n\t * For such diet parses, this method returns false, otherwise it returns true. Any lombok processor\n\t * that needs the contents of methods should just do nothing (and return false so it gets another shot later!)\n\t * when this is false.\n\t */\n\tpublic boolean isCompleteParse() {\n\t\treturn completeParse;\n\t}\n\t\n\tclass ParseProblem {\n\t\tfinal boolean isWarning;\n\t\tfinal String message;\n\t\tfinal int sourceStart;\n\t\tfinal int sourceEnd;\n\t\t\n\t\tParseProblem(boolean isWarning, String message, int sourceStart, int sourceEnd) {\n\t\t\tthis.isWarning = isWarning;\n\t\t\tthis.message = message;\n\t\t\tthis.sourceStart = sourceStart;\n\t\t\tthis.sourceEnd = sourceEnd;\n\t\t}\n\t\t\n\t\tvoid addToCompilationResult() {\n\t\t\tCompilationUnitDeclaration cud = (CompilationUnitDeclaration) top().get();\n\t\t\taddProblemToCompilationResult(cud.getFileName(), cud.compilationResult,\n\t\t\t\t\tisWarning, message, sourceStart, sourceEnd);\n\t\t}\n\t}\n\t\n\tprivate void propagateProblems() {\n\t\tif (queuedProblems.isEmpty()) return;\n\t\tCompilationUnitDeclaration cud = (CompilationUnitDeclaration) top().get();\n\t\tif (cud.compilationResult == null) return;\n\t\tfor (ParseProblem problem : queuedProblems) problem.addToCompilationResult();\n\t\tqueuedProblems.clear();\n\t}\n\t\n\tprivate final List<ParseProblem> queuedProblems = new ArrayList<ParseProblem>();\n\t\n\tvoid addProblem(ParseProblem problem) {\n\t\tqueuedProblems.add(problem);\n\t\tpropagateProblems();\n\t}\n\t\n\t/**\n\t * Adds a problem to the provided CompilationResult object so that it will show up\n\t * in the Problems/Warnings view.\n\t */\n\tpublic static void addProblemToCompilationResult(char[] fileNameArray, CompilationResult result,\n\t\t\tboolean isWarning, String message, int sourceStart, int sourceEnd) {\n\t\t\n\t\tPermit.invokeSneaky(EcjReflectionCheck.problemAddProblemToCompilationResult, EcjReflectionCheck.addProblemToCompilationResult, null, fileNameArray, result, isWarning, message, sourceStart, sourceEnd);\n\t}\n\t\n\tpublic static Annotation[] getTopLevelTypeReferenceAnnotations(TypeReference tr) {\n\t\tMethod m = EcjReflectionCheck.typeReferenceGetAnnotationsOnDimensions;\n\t\tif (m == null) return null;\n\t\tAnnotation[][] annss = null;\n\t\ttry {\n\t\t\tannss = (Annotation[][]) Permit.invoke(m, tr);\n\t\t\tif (annss != null) return annss[0];\n\t\t} catch (Throwable ignore) {}\n\t\t\n\t\ttry {\n\t\t\tField f = EcjReflectionCheck.typeReferenceAnnotations;\n\t\t\tif (f == null) return null;\n\t\t\tannss = (Annotation[][]) Permit.get(f, tr);\n\t\t\tif (annss == null) return null;\n\t\t\treturn annss[annss.length - 1];\n\t\t} catch (Throwable t) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tprivate final CompilationUnitDeclaration compilationUnitDeclaration;\n\tprivate char[] source;\n\tprivate boolean completeParse;\n\t\n\tprivate static String toFileName(CompilationUnitDeclaration ast) {\n\t\treturn ast.compilationResult.fileName == null ? null : new String(ast.compilationResult.fileName);\n\t}\n\t\n\t/**\n\t * Call this method to move an EclipseAST generated for a diet parse to rebuild itself for the full parse -\n\t * with filled in method bodies and such. Also propagates problems and errors, which in diet parse\n\t * mode can't be reliably added to the problems/warnings view.\n\t */\n\tpublic void rebuild(boolean force) {\n\t\tpropagateProblems();\n\t\tif (completeParse && !force) return;\n\t\tboolean changed = isChanged();\n\t\tboolean newCompleteParse = isComplete(compilationUnitDeclaration);\n\t\tif (!newCompleteParse && !force) return;\n\t\t\n\t\ttop().rebuild();\n\t\t\n\t\tthis.completeParse = newCompleteParse;\n\t\tif (!changed) clearChanged();\n\t}\n\t\n\tpublic static boolean isComplete(CompilationUnitDeclaration unit) {\n\t\treturn (unit.bits & ASTNode.HasAllMethodBodies) != 0;\n\t}\n\t\n\t/** {@inheritDoc} */\n\t@Override protected EclipseNode buildTree(ASTNode node, Kind kind) {\n\t\tswitch (kind) {\n\t\tcase COMPILATION_UNIT:\n\t\t\treturn buildCompilationUnit((CompilationUnitDeclaration) node);\n\t\tcase TYPE:\n\t\t\treturn buildType((TypeDeclaration) node);\n\t\tcase FIELD:\n\t\t\treturn buildField((FieldDeclaration) node);\n\t\tcase INITIALIZER:\n\t\t\treturn buildInitializer((Initializer) node);\n\t\tcase METHOD:\n\t\t\treturn buildMethod((AbstractMethodDeclaration) node);\n\t\tcase ARGUMENT:\n\t\t\treturn buildLocal((Argument) node, kind);\n\t\tcase LOCAL:\n\t\t\treturn buildLocal((LocalDeclaration) node, kind);\n\t\tcase STATEMENT:\n\t\t\treturn buildStatement((Statement) node);\n\t\tcase ANNOTATION:\n\t\t\treturn buildAnnotation((Annotation) node, false);\n\t\tcase TYPE_USE:\n\t\t\treturn buildTypeUse((TypeReference) node);\n\t\tdefault:\n\t\t\tthrow new AssertionError(\"Did not expect to arrive here: \" + kind);\n\t\t}\n\t}\n\t\n\tprivate EclipseNode buildCompilationUnit(CompilationUnitDeclaration top) {\n\t\tif (setAndGetAsHandled(top)) return null;\n\t\tList<EclipseNode> children = buildTypes(top.types);\n\t\treturn putInMap(new EclipseNode(this, top, children, Kind.COMPILATION_UNIT));\n\t}\n\t\n\tprivate void addIfNotNull(Collection<EclipseNode> collection, EclipseNode n) {\n\t\tif (n != null) collection.add(n);\n\t}\n\t\n\tprivate List<EclipseNode> buildTypes(TypeDeclaration[] children) {\n\t\tList<EclipseNode> childNodes = new ArrayList<EclipseNode>();\n\t\tif (children != null) for (TypeDeclaration type : children) addIfNotNull(childNodes, buildType(type));\n\t\treturn childNodes;\n\t}\n\t\n\tprivate EclipseNode buildType(TypeDeclaration type) {\n\t\tif (setAndGetAsHandled(type)) return null;\n\t\tList<EclipseNode> childNodes = new ArrayList<EclipseNode>();\n\t\tchildNodes.addAll(buildRecordComponents(getRecordComponents(type)));\n\t\tchildNodes.addAll(buildFields(type.fields));\n\t\tchildNodes.addAll(buildTypes(type.memberTypes));\n\t\tchildNodes.addAll(buildMethods(type.methods));\n\t\tchildNodes.addAll(buildAnnotations(type.annotations, false));\n\t\treturn putInMap(new EclipseNode(this, type, childNodes, Kind.TYPE));\n\t}\n\t\n\tprivate Collection<EclipseNode> buildRecordComponents(AbstractVariableDeclaration[] children) {\n\t\tif (children == null) return Collections.emptyList();\n\t\tList<EclipseNode> childNodes = new ArrayList<EclipseNode>();\n\t\tfor (int i = 0; i < children.length; i++) {\n\t\t\taddIfNotNull(childNodes, buildRecordComponent(children[i]));\n\t\t}\n\t\treturn childNodes;\n\t}\n\t\n\tprivate EclipseNode buildRecordComponent(AbstractVariableDeclaration field) {\n\t\tList<EclipseNode> childNodes = new ArrayList<EclipseNode>();\n\t\taddIfNotNull(childNodes, buildTypeUse(field.type));\n\t\taddIfNotNull(childNodes, buildStatement(field.initialization));\n\t\tchildNodes.addAll(buildAnnotations(field.annotations, true));\n\t\tFieldDeclaration fieldDeclaration = new FieldDeclaration(field.name, field.sourceStart, field.sourceEnd);\n\t\tfieldDeclaration.type = field.type;\n\t\tfieldDeclaration.modifiers = field.modifiers | Eclipse.AccRecord;\n\t\tfieldDeclaration.annotations = field.annotations;\n\t\treturn putInMap(new EclipseNode(this, fieldDeclaration, childNodes, Kind.FIELD));\n\t}\n\n\tprivate Collection<EclipseNode> buildFields(FieldDeclaration[] children) {\n\t\tList<EclipseNode> childNodes = new ArrayList<EclipseNode>();\n\t\tif (children != null) for (int i = 0; i < children.length; i++) {\n\t\t\taddIfNotNull(childNodes, buildField(children[i]));\n\t\t}\n\t\treturn childNodes;\n\t}\n\t\n\tprivate static <T> List<T> singleton(T item) {\n\t\tList<T> list = new ArrayList<T>();\n\t\tif (item != null) list.add(item);\n\t\treturn list;\n\t}\n\t\n\tprivate EclipseNode buildField(FieldDeclaration field) {\n\t\tif (field instanceof Initializer) return buildInitializer((Initializer) field);\n\t\tif (setAndGetAsHandled(field)) return null;\n\t\tif (isRecordField(field)) return null;\n\t\tList<EclipseNode> childNodes = new ArrayList<EclipseNode>();\n\t\taddIfNotNull(childNodes, buildTypeUse(field.type));\n\t\taddIfNotNull(childNodes, buildStatement(field.initialization));\n\t\tchildNodes.addAll(buildAnnotations(field.annotations, true));\n\t\treturn putInMap(new EclipseNode(this, field, childNodes, Kind.FIELD));\n\t}\n\t\n\tprivate EclipseNode buildInitializer(Initializer initializer) {\n\t\tif (setAndGetAsHandled(initializer)) return null;\n\t\treturn putInMap(new EclipseNode(this, initializer, singleton(buildStatement(initializer.block)), Kind.INITIALIZER));\n\t}\n\t\n\tprivate Collection<EclipseNode> buildMethods(AbstractMethodDeclaration[] children) {\n\t\tList<EclipseNode> childNodes = new ArrayList<EclipseNode>();\n\t\tif (children != null) for (AbstractMethodDeclaration method : children) addIfNotNull(childNodes, buildMethod(method));\n\t\treturn childNodes;\n\t}\n\t\n\tprivate EclipseNode buildMethod(AbstractMethodDeclaration method) {\n\t\tif (setAndGetAsHandled(method)) return null;\n\t\tList<EclipseNode> childNodes = new ArrayList<EclipseNode>();\n\t\tchildNodes.addAll(buildArguments(method.arguments));\n\t\tif (method instanceof ConstructorDeclaration) {\n\t\t\tConstructorDeclaration constructor = (ConstructorDeclaration) method;\n\t\t\taddIfNotNull(childNodes, buildStatement(constructor.constructorCall));\n\t\t}\n\t\tchildNodes.addAll(buildStatements(method.statements));\n\t\tchildNodes.addAll(buildAnnotations(method.annotations, false));\n\t\treturn putInMap(new EclipseNode(this, method, childNodes, Kind.METHOD));\n\t}\n\t\n\t//Arguments are a kind of LocalDeclaration. They can definitely contain lombok annotations, so we care about them.\n\tprivate Collection<EclipseNode> buildArguments(Argument[] children) {\n\t\tList<EclipseNode> childNodes = new ArrayList<EclipseNode>();\n\t\tif (children != null) for (LocalDeclaration local : children) {\n\t\t\taddIfNotNull(childNodes, buildLocal(local, Kind.ARGUMENT));\n\t\t}\n\t\treturn childNodes;\n\t}\n\t\n\tprivate EclipseNode buildLocal(LocalDeclaration local, Kind kind) {\n\t\tif (setAndGetAsHandled(local)) return null;\n\t\tList<EclipseNode> childNodes = new ArrayList<EclipseNode>();\n\t\taddIfNotNull(childNodes, buildTypeUse(local.type));\n\t\taddIfNotNull(childNodes, buildStatement(local.initialization));\n\t\tchildNodes.addAll(buildAnnotations(local.annotations, true));\n\t\treturn putInMap(new EclipseNode(this, local, childNodes, kind));\n\t}\n\t\n\tprivate EclipseNode buildTypeUse(TypeReference tr) {\n\t\tif (setAndGetAsHandled(tr)) return null;\n\t\tif (tr == null) return null;\n\t\t\n\t\tList<EclipseNode> childNodes = new ArrayList<EclipseNode>();\n\t\tAnnotation[] anns = getTopLevelTypeReferenceAnnotations(tr);\n\t\tif (anns != null) for (Annotation ann : anns) addIfNotNull(childNodes, buildAnnotation(ann, false));\n\t\t\n\t\tif (tr instanceof ParameterizedQualifiedTypeReference) {\n\t\t\tParameterizedQualifiedTypeReference pqtr = (ParameterizedQualifiedTypeReference) tr;\n\t\t\tint len = pqtr.tokens.length;\n\t\t\tfor (int i = 0; i < len; i++) {\n\t\t\t\tTypeReference[] typeArgs = pqtr.typeArguments[i];\n\t\t\t\tif (typeArgs != null) for (TypeReference tArg : typeArgs) addIfNotNull(childNodes, buildTypeUse(tArg));\n\t\t\t}\n\t\t} else if (tr instanceof ParameterizedSingleTypeReference) {\n\t\t\tParameterizedSingleTypeReference pstr = (ParameterizedSingleTypeReference) tr;\n\t\t\tif (pstr.typeArguments != null) for (TypeReference tArg : pstr.typeArguments) {\n\t\t\t\taddIfNotNull(childNodes, buildTypeUse(tArg));\n\t\t\t}\n\t\t} else if (tr instanceof Wildcard) {\n\t\t\tTypeReference bound = ((Wildcard) tr).bound;\n\t\t\tif (bound != null) addIfNotNull(childNodes, buildTypeUse(bound));\n\t\t}\n\t\t\n\t\treturn putInMap(new EclipseNode(this, tr, childNodes, Kind.TYPE_USE));\n\t}\n\t\n\tprivate Collection<EclipseNode> buildAnnotations(Annotation[] annotations, boolean varDecl) {\n\t\tList<EclipseNode> elements = new ArrayList<EclipseNode>();\n\t\tif (annotations != null) for (Annotation an : annotations) addIfNotNull(elements, buildAnnotation(an, varDecl));\n\t\treturn elements;\n\t}\n\t\n\tprivate EclipseNode buildAnnotation(Annotation annotation, boolean field) {\n\t\tif (annotation == null) return null;\n\t\tboolean handled = setAndGetAsHandled(annotation);\n\t\tif (!field && handled) {\n\t\t\t// @Foo int x, y; is handled in eclipse by putting the same annotation node on 2 FieldDeclarations.\n\t\t\treturn null;\n\t\t}\n\t\treturn putInMap(new EclipseNode(this, annotation, null, Kind.ANNOTATION));\n\t}\n\t\n\tprivate Collection<EclipseNode> buildStatements(Statement[] children) {\n\t\tList<EclipseNode> childNodes = new ArrayList<EclipseNode>();\n\t\tif (children != null) for (Statement child  : children) addIfNotNull(childNodes, buildStatement(child));\n\t\treturn childNodes;\n\t}\n\t\n\tprivate EclipseNode buildStatement(Statement child) {\n\t\tif (child == null) return null;\n\t\tif (child instanceof TypeDeclaration) return buildType((TypeDeclaration) child);\n\t\t\n\t\tif (child instanceof LocalDeclaration) return buildLocal((LocalDeclaration) child, Kind.LOCAL);\n\t\t\n\t\tif (setAndGetAsHandled(child)) return null;\n\t\t\n\t\treturn drill(child);\n\t}\n\t\n\tprivate EclipseNode drill(Statement statement) {\n\t\tList<EclipseNode> childNodes = new ArrayList<EclipseNode>();\n\t\tfor (FieldAccess fa : fieldsOf(statement.getClass())) childNodes.addAll(buildWithField(EclipseNode.class, statement, fa));\n\t\treturn putInMap(new EclipseNode(this, statement, childNodes, Kind.STATEMENT));\n\t}\n\t\n\t/* For Eclipse, only Statement counts, as Expression is a subclass of it, even though this isn't\n\t * entirely correct according to the JLS spec (only some expressions can be used as statements, not all of them). */\n\tprivate static Collection<Class<? extends ASTNode>> statementTypes() {\n\t\treturn Collections.<Class<? extends ASTNode>>singleton(Statement.class);\n\t}\n\t\n\tprivate static class EcjReflectionCheck {\n\t\tprivate static final String COMPILATIONRESULT_TYPE = \"org.eclipse.jdt.internal.compiler.CompilationResult\";\n\t\t\n\t\tpublic static final Method addProblemToCompilationResult;\n\t\tpublic static final Throwable problemAddProblemToCompilationResult;\n\t\tpublic static final Method typeReferenceGetAnnotationsOnDimensions;\n\t\tpublic static final Field typeReferenceAnnotations;\n\t\tstatic {\n\t\t\tThrowable problem_ = null;\n\t\t\tMethod m1 = null, m2;\n\t\t\tField f;\n\t\t\ttry {\n\t\t\t\tm1 = Permit.getMethod(EclipseAstProblemView.class, \"addProblemToCompilationResult\", char[].class, Class.forName(COMPILATIONRESULT_TYPE), boolean.class, String.class, int.class, int.class);\n\t\t\t} catch (Throwable t) {\n\t\t\t\t// That's problematic, but as long as no local classes are used we don't actually need it.\n\t\t\t\t// Better fail on local classes than crash altogether.\n\t\t\t\tproblem_ = t;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tm2 = Permit.getMethod(TypeReference.class, \"getAnnotationsOnDimensions\");\n\t\t\t} catch (Throwable t) {\n\t\t\t\tm2 = null;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tf = Permit.getField(TypeReference.class, \"annotations\");\n\t\t\t} catch (Throwable t) {\n\t\t\t\tf = null;\n\t\t\t}\n\t\t\taddProblemToCompilationResult = m1;\n\t\t\tproblemAddProblemToCompilationResult = problem_;\n\t\t\ttypeReferenceGetAnnotationsOnDimensions = m2;\n\t\t\ttypeReferenceAnnotations = f;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/EclipseASTAdapter.java",
    "content": "/*\n * Copyright (C) 2009-2019 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse;\n\nimport org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.Argument;\nimport org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.Initializer;\nimport org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\n\n/**\n * Standard adapter for the {@link EclipseASTVisitor} interface. Every method on that interface\n * has been implemented with an empty body. Override whichever methods you need.\n */\npublic abstract class EclipseASTAdapter implements EclipseASTVisitor {\n\t\n\tprivate final boolean deferUntilPostDiet = getClass().isAnnotationPresent(DeferUntilPostDiet.class);\n\n\t/** {@inheritDoc} */\n\tpublic void visitCompilationUnit(EclipseNode top, CompilationUnitDeclaration unit) {}\n\t\n\t/** {@inheritDoc} */\n\tpublic void endVisitCompilationUnit(EclipseNode top, CompilationUnitDeclaration unit) {}\n\t\n\t/** {@inheritDoc} */\n\tpublic void visitType(EclipseNode typeNode, TypeDeclaration type) {}\n\t\n\t/** {@inheritDoc} */\n\tpublic void visitAnnotationOnType(TypeDeclaration type, EclipseNode annotationNode, Annotation annotation) {}\n\t\n\t/** {@inheritDoc} */\n\tpublic void endVisitType(EclipseNode typeNode, TypeDeclaration type) {}\n\t\n\t/** {@inheritDoc} */\n\tpublic void visitInitializer(EclipseNode initializerNode, Initializer initializer) {}\n\t\n\t/** {@inheritDoc} */\n\tpublic void endVisitInitializer(EclipseNode initializerNode, Initializer initializer) {}\n\t\n\t/** {@inheritDoc} */\n\tpublic void visitField(EclipseNode fieldNode, FieldDeclaration field) {}\n\t\n\t/** {@inheritDoc} */\n\tpublic void visitAnnotationOnField(FieldDeclaration field, EclipseNode annotationNode, Annotation annotation) {}\n\t\n\t/** {@inheritDoc} */\n\tpublic void endVisitField(EclipseNode fieldNode, FieldDeclaration field) {}\n\t\n\t/** {@inheritDoc} */\n\tpublic void visitMethod(EclipseNode methodNode, AbstractMethodDeclaration method) {}\n\t\n\t/** {@inheritDoc} */\n\tpublic void visitAnnotationOnMethod(AbstractMethodDeclaration method, EclipseNode annotationNode, Annotation annotation) {}\n\t\n\t/** {@inheritDoc} */\n\tpublic void endVisitMethod(EclipseNode methodNode, AbstractMethodDeclaration method) {}\n\t\n\t/** {@inheritDoc} */\n\tpublic void visitMethodArgument(EclipseNode argNode, Argument arg, AbstractMethodDeclaration method) {}\n\t\n\t/** {@inheritDoc} */\n\tpublic void visitAnnotationOnMethodArgument(Argument arg, AbstractMethodDeclaration method, EclipseNode annotationNode, Annotation annotation) {}\n\t\n\t/** {@inheritDoc} */\n\tpublic void endVisitMethodArgument(EclipseNode argNode, Argument arg, AbstractMethodDeclaration method) {}\n\t\n\t/** {@inheritDoc} */\n\tpublic void visitLocal(EclipseNode localNode, LocalDeclaration local) {}\n\t\n\t/** {@inheritDoc} */\n\tpublic void visitAnnotationOnLocal(LocalDeclaration local, EclipseNode annotationNode, Annotation annotation) {}\n\t\n\t/** {@inheritDoc} */\n\tpublic void endVisitLocal(EclipseNode localNode, LocalDeclaration local) {}\n\t\n\t/** {@inheritDoc} */\n\t@Override public void visitTypeUse(EclipseNode typeUseNode, TypeReference typeUse) {}\n\t\n\t/** {@inheritDoc} */\n\tpublic void visitAnnotationOnTypeUse(TypeReference typeUse, EclipseNode annotationNode, Annotation annotation) {}\n\t\n\t/** {@inheritDoc} */\n\t@Override public void endVisitTypeUse(EclipseNode typeUseNode, TypeReference typeUse) {}\n\t\n\t/** {@inheritDoc} */\n\tpublic void visitStatement(EclipseNode statementNode, Statement statement) {}\n\t\n\t/** {@inheritDoc} */\n\tpublic void endVisitStatement(EclipseNode statementNode, Statement statement) {}\n\t\n\tpublic boolean isDeferUntilPostDiet() {\n\t\treturn deferUntilPostDiet ;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/EclipseASTVisitor.java",
    "content": "/*\n * Copyright (C) 2009-2019 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse;\n\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport java.io.PrintStream;\nimport java.lang.reflect.Modifier;\n\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.AllocationExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.Argument;\nimport org.eclipse.jdt.internal.compiler.ast.Block;\nimport org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.Initializer;\nimport org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.MarkerAnnotation;\nimport org.eclipse.jdt.internal.compiler.ast.MemberValuePair;\nimport org.eclipse.jdt.internal.compiler.ast.NormalAnnotation;\nimport org.eclipse.jdt.internal.compiler.ast.SingleMemberAnnotation;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\nimport org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;\n\n/**\n * Implement so you can ask any EclipseAST.Node to traverse depth-first through all children,\n * calling the appropriate visit and endVisit methods.\n */\npublic interface EclipseASTVisitor {\n\t/**\n\t * Called at the very beginning and end.\n\t */\n\tvoid visitCompilationUnit(EclipseNode top, CompilationUnitDeclaration unit);\n\tvoid endVisitCompilationUnit(EclipseNode top, CompilationUnitDeclaration unit);\n\t\n\t/**\n\t * Called when visiting a type (a class, interface, annotation, enum, etcetera).\n\t */\n\tvoid visitType(EclipseNode typeNode, TypeDeclaration type);\n\tvoid visitAnnotationOnType(TypeDeclaration type, EclipseNode annotationNode, Annotation annotation);\n\tvoid endVisitType(EclipseNode typeNode, TypeDeclaration type);\n\t\n\t/**\n\t * Called when visiting a field of a class.\n\t * Even though in Eclipse initializers (both instance and static) are represented as Initializer objects,\n\t * which are a subclass of FieldDeclaration, those do NOT result in a call to this method. They result\n\t * in a call to the visitInitializer method.\n\t */\n\tvoid visitField(EclipseNode fieldNode, FieldDeclaration field);\n\tvoid visitAnnotationOnField(FieldDeclaration field, EclipseNode annotationNode, Annotation annotation);\n\tvoid endVisitField(EclipseNode fieldNode, FieldDeclaration field);\n\t\n\t/**\n\t * Called for static and instance initializers. You can tell the difference via the modifier flag on the\n\t * ASTNode (8 for static, 0 for not static). The content is in the 'block', not in the 'initialization',\n\t * which would always be null for an initializer instance.\n\t */\n\tvoid visitInitializer(EclipseNode initializerNode, Initializer initializer);\n\tvoid endVisitInitializer(EclipseNode initializerNode, Initializer initializer);\n\t\n\t/**\n\t * Called for both methods (MethodDeclaration) and constructors (ConstructorDeclaration), but not for\n\t * Clinit objects, which are a vestigial Eclipse thing that never contain anything. Static initializers\n\t * show up as 'Initializer', in the visitInitializer method, with modifier bit STATIC set.\n\t */\n\tvoid visitMethod(EclipseNode methodNode, AbstractMethodDeclaration method);\n\tvoid visitAnnotationOnMethod(AbstractMethodDeclaration method, EclipseNode annotationNode, Annotation annotation);\n\tvoid endVisitMethod(EclipseNode methodNode, AbstractMethodDeclaration method);\n\t\n\t/**\n\t * Visits a method argument\n\t */\n\tvoid visitMethodArgument(EclipseNode argNode, Argument arg, AbstractMethodDeclaration method);\n\tvoid visitAnnotationOnMethodArgument(Argument arg, AbstractMethodDeclaration method, EclipseNode annotationNode, Annotation annotation);\n\tvoid endVisitMethodArgument(EclipseNode argNode, Argument arg, AbstractMethodDeclaration method);\n\t\n\t/**\n\t * Visits a local declaration - that is, something like 'int x = 10;' on the method level.\n\t */\n\tvoid visitLocal(EclipseNode localNode, LocalDeclaration local);\n\tvoid visitAnnotationOnLocal(LocalDeclaration local, EclipseNode annotationNode, Annotation annotation);\n\tvoid endVisitLocal(EclipseNode localNode, LocalDeclaration local);\n\t\n\t/**\n\t * Visits a node that represents a type reference. Anything from {@code int} to {@code T} to {@code foo,.pkg.Bar<T>.Baz<?> @Ann []}.\n\t */\n\tvoid visitTypeUse(EclipseNode typeUseNode, TypeReference typeUse);\n\tvoid visitAnnotationOnTypeUse(TypeReference typeUse, EclipseNode annotationNode, Annotation annotation);\n\tvoid endVisitTypeUse(EclipseNode typeUseNode, TypeReference typeUse);\n\t\n\t/**\n\t * Visits a statement that isn't any of the other visit methods (e.g. TypeDeclaration).\n\t */\n\tvoid visitStatement(EclipseNode statementNode, Statement statement);\n\tvoid endVisitStatement(EclipseNode statementNode, Statement statement);\n\t\n\t/**\n\t * Prints the structure of an AST.\n\t */\n\tpublic static class Printer implements EclipseASTVisitor {\n\t\tprivate final PrintStream out;\n\t\tprivate final boolean printContent;\n\t\tprivate int disablePrinting = 0;\n\t\tprivate int indent = 0;\n\t\tprivate boolean printClassNames = false;\n\t\tprivate final boolean printPositions;\n\t\t\n\t\tpublic boolean deferUntilPostDiet() {\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\t/**\n\t\t * @param printContent if true, bodies are printed directly, as java code,\n\t\t * instead of a tree listing of every AST node inside it.\n\t\t */\n\t\tpublic Printer(boolean printContent) {\n\t\t\tthis(printContent, System.out, false);\n\t\t}\n\t\t\n\t\t/**\n\t\t * @param printContent if true, bodies are printed directly, as java code,\n\t\t * instead of a tree listing of every AST node inside it.\n\t\t * @param out write output to this stream. You must close it yourself. flush() is called after every line.\n\t\t * \n\t\t * @see java.io.PrintStream#flush()\n\t\t */\n\t\tpublic Printer(boolean printContent, PrintStream out, boolean printPositions) {\n\t\t\tthis.printContent = printContent;\n\t\t\tthis.out = out;\n\t\t\tthis.printPositions = printPositions;\n\t\t}\n\t\t\n\t\tprivate void forcePrint(String text, Object... params) {\n\t\t\tStringBuilder sb = new StringBuilder();\n\t\t\tfor (int i = 0; i < indent; i++) sb.append(\"  \");\n\t\t\tsb.append(text);\n\t\t\tObject[] t;\n\t\t\tif (printClassNames && params.length > 0) {\n\t\t\t\tsb.append(\" [\");\n\t\t\t\tfor (int i = 0; i < params.length; i++) {\n\t\t\t\t\tif (i > 0) sb.append(\", \");\n\t\t\t\t\tsb.append(\"%s\");\n\t\t\t\t}\n\t\t\t\tsb.append(\"]\");\n\t\t\t\tt = new Object[params.length + params.length];\n\t\t\t\tfor (int i = 0; i < params.length; i++) {\n\t\t\t\t\tt[i] = params[i];\n\t\t\t\t\tt[i + params.length] = (params[i] == null) ? \"NULL \" : params[i].getClass();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tt = params;\n\t\t\t}\n\t\t\tsb.append(\"\\n\");\n\t\t\tout.printf(sb.toString(), t);\n\t\t\tout.flush();\n\t\t}\n\t\t\n\t\tprivate void print(String text, Object... params) {\n\t\t\tif (disablePrinting == 0) forcePrint(text, params);\n\t\t}\n\t\t\n\t\tprivate String str(char[] c) {\n\t\t\tif (c == null) return \"(NULL)\";\n\t\t\treturn new String(c);\n\t\t}\n\t\t\n\t\tprivate String str(TypeReference type) {\n\t\t\tif (type == null) return \"(NULL)\";\n\t\t\tchar[][] c = type.getTypeName();\n\t\t\tStringBuilder sb = new StringBuilder();\n\t\t\tboolean first = true;\n\t\t\tfor (char[] d : c) {\n\t\t\t\tsb.append(first ? \"\" : \".\").append(new String(d));\n\t\t\t\tfirst = false;\n\t\t\t}\n\t\t\treturn sb.toString();\n\t\t}\n\t\t\n\t\tpublic void visitCompilationUnit(EclipseNode node, CompilationUnitDeclaration unit) {\n\t\t\tout.println(\"---------------------------------------------------------\");\n\t\t\tout.println(node.isCompleteParse() ? \"COMPLETE\" : \"incomplete\");\n\t\t\t\n\t\t\tprint(\"<CUD %s%s%s>\", node.getFileName(), isGenerated(unit) ? \" (GENERATED)\" : \"\", position(node));\n\t\t\tindent++;\n\t\t}\n\t\t\n\t\tpublic void endVisitCompilationUnit(EclipseNode node, CompilationUnitDeclaration unit) {\n\t\t\tindent--;\n\t\t\tprint(\"</CUD>\");\n\t\t}\n\t\t\n\t\tprivate String printFlags(int flags, ASTNode node) {\n\t\t\tStringBuilder out = new StringBuilder();\n\t\t\tif ((flags & ClassFileConstants.AccPublic) != 0) {\n\t\t\t\tflags &= ~ClassFileConstants.AccPublic;\n\t\t\t\tout.append(\"public \");\n\t\t\t}\n\t\t\tif ((flags & ClassFileConstants.AccPrivate) != 0) {\n\t\t\t\tflags &= ~ClassFileConstants.AccPrivate;\n\t\t\t\tout.append(\"private \");\n\t\t\t}\n\t\t\tif ((flags & ClassFileConstants.AccProtected) != 0) {\n\t\t\t\tflags &= ~ClassFileConstants.AccProtected;\n\t\t\t\tout.append(\"protected \");\n\t\t\t}\n\t\t\tif ((flags & ClassFileConstants.AccStatic) != 0) {\n\t\t\t\tflags &= ~ClassFileConstants.AccStatic;\n\t\t\t\tout.append(\"static \");\n\t\t\t}\n\t\t\tif ((flags & ClassFileConstants.AccFinal) != 0) {\n\t\t\t\tflags &= ~ClassFileConstants.AccFinal;\n\t\t\t\tout.append(\"final \");\n\t\t\t}\n\t\t\tif ((flags & ClassFileConstants.AccSynchronized) != 0) {\n\t\t\t\tflags &= ~ClassFileConstants.AccSynchronized;\n\t\t\t\tout.append(\"synchronized \");\n\t\t\t}\n\t\t\tif ((flags & ClassFileConstants.AccNative) != 0) {\n\t\t\t\tflags &= ~ClassFileConstants.AccNative;\n\t\t\t\tout.append(\"native \");\n\t\t\t}\n\t\t\tif ((flags & ClassFileConstants.AccInterface) != 0) {\n\t\t\t\tflags &= ~ClassFileConstants.AccInterface;\n\t\t\t\tout.append(\"interface \");\n\t\t\t}\n\t\t\tif ((flags & ClassFileConstants.AccAbstract) != 0) {\n\t\t\t\tflags &= ~ClassFileConstants.AccAbstract;\n\t\t\t\tout.append(\"abstract \");\n\t\t\t}\n\t\t\tif ((flags & ClassFileConstants.AccStrictfp) != 0) {\n\t\t\t\tflags &= ~ClassFileConstants.AccStrictfp;\n\t\t\t\tout.append(\"strictfp \");\n\t\t\t}\n\t\t\tif ((flags & ClassFileConstants.AccSynthetic) != 0) {\n\t\t\t\tflags &= ~ClassFileConstants.AccSynthetic;\n\t\t\t\tout.append(\"synthetic \");\n\t\t\t}\n\t\t\tif ((flags & ClassFileConstants.AccAnnotation) != 0) {\n\t\t\t\tflags &= ~ClassFileConstants.AccAnnotation;\n\t\t\t\tout.append(\"annotation \");\n\t\t\t}\n\t\t\tif ((flags & ClassFileConstants.AccEnum) != 0) {\n\t\t\t\tflags &= ~ClassFileConstants.AccEnum;\n\t\t\t\tout.append(\"enum \");\n\t\t\t}\n\t\t\t\n\t\t\tif ((flags & ClassFileConstants.AccVolatile) != 0) {\n\t\t\t\tflags &= ~ClassFileConstants.AccVolatile;\n\t\t\t\tif (node instanceof FieldDeclaration) out.append(\"volatile \");\n\t\t\t\telse out.append(\"volatile/bridge \");\n\t\t\t}\n\t\t\tif ((flags & ClassFileConstants.AccTransient) != 0) {\n\t\t\t\tflags &= ~ClassFileConstants.AccTransient;\n\t\t\t\tif (node instanceof Argument) out.append(\"varargs \");\n\t\t\t\telse if (node instanceof FieldDeclaration) out.append(\"transient \");\n\t\t\t\telse out.append(\"transient/varargs \");\n\t\t\t}\n\t\t\t\n\t\t\tif (flags != 0) {\n\t\t\t\tout.append(String.format(\" 0x%08X \", flags));\n\t\t\t}\n\t\t\t\n\t\t\treturn out.toString().trim();\n\t\t}\n\t\t\n\t\tpublic void visitType(EclipseNode node, TypeDeclaration type) {\n\t\t\tprint(\"<TYPE %s%s%s> %s\", str(type.name), isGenerated(type) ? \" (GENERATED)\" : \"\", position(node), printFlags(type.modifiers, type));\n\t\t\tindent++;\n\t\t\tif (printContent) {\n\t\t\t\tprint(\"%s\", type);\n\t\t\t\tdisablePrinting++;\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic void visitAnnotationOnType(TypeDeclaration type, EclipseNode node, Annotation annotation) {\n\t\t\tforcePrint(\"<ANNOTATION%s: %s%s />\", isGenerated(annotation) ? \" (GENERATED)\" : \"\", annotation, position(node));\n\t\t}\n\t\t\n\t\tpublic void endVisitType(EclipseNode node, TypeDeclaration type) {\n\t\t\tif (printContent) disablePrinting--;\n\t\t\tindent--;\n\t\t\tprint(\"</TYPE %s>\", str(type.name));\n\t\t}\n\t\t\n\t\tpublic void visitInitializer(EclipseNode node, Initializer initializer) {\n\t\t\tBlock block = initializer.block;\n\t\t\tboolean s = (block != null && block.statements != null);\n\t\t\tprint(\"<%s INITIALIZER: %s%s%s>\",\n\t\t\t\t\t(initializer.modifiers & Modifier.STATIC) != 0 ? \"static\" : \"instance\",\n\t\t\t\t\t\t\ts ? \"filled\" : \"blank\",\n\t\t\t\t\t\t\tisGenerated(initializer) ? \" (GENERATED)\" : \"\", position(node));\n\t\t\tindent++;\n\t\t\tif (printContent) {\n\t\t\t\tif (initializer.block != null) print(\"%s\", initializer.block);\n\t\t\t\tdisablePrinting++;\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic void endVisitInitializer(EclipseNode node, Initializer initializer) {\n\t\t\tif (printContent) disablePrinting--;\n\t\t\tindent--;\n\t\t\tprint(\"</%s INITIALIZER>\", (initializer.modifiers & Modifier.STATIC) != 0 ? \"static\" : \"instance\");\n\t\t}\n\t\t\n\t\tpublic void visitField(EclipseNode node, FieldDeclaration field) {\n\t\t\tprint(\"<FIELD%s %s %s = %s%s> %s\", isGenerated(field) ? \" (GENERATED)\" : \"\",\n\t\t\t\t\tstr(field.type), str(field.name), field.initialization, position(node), printFlags(field.modifiers, field));\n\t\t\tindent++;\n\t\t\tif (printContent) {\n\t\t\t\tif (field.initialization != null) print(\"%s\", field.initialization);\n\t\t\t\tdisablePrinting++;\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic void visitAnnotationOnField(FieldDeclaration field, EclipseNode node, Annotation annotation) {\n\t\t\tforcePrint(\"<ANNOTATION%s: %s%s />\", isGenerated(annotation) ? \" (GENERATED)\" : \"\", annotation, position(node));\n\t\t}\n\t\t\n\t\tpublic void endVisitField(EclipseNode node, FieldDeclaration field) {\n\t\t\tif (printContent) disablePrinting--;\n\t\t\tindent--;\n\t\t\tprint(\"</FIELD %s %s>\", str(field.type), str(field.name));\n\t\t}\n\t\t\n\t\tpublic void visitMethod(EclipseNode node, AbstractMethodDeclaration method) {\n\t\t\tString type = method instanceof ConstructorDeclaration ? \"CONSTRUCTOR\" : \"METHOD\";\n\t\t\tprint(\"<%s %s: %s%s%s> %s\", type, str(method.selector), method.statements != null ? (\"filled(\" + method.statements.length + \")\") : \"blank\",\n\t\t\t\t\tisGenerated(method) ? \" (GENERATED)\" : \"\", position(node), printFlags(method.modifiers, method));\n\t\t\tindent++;\n\t\t\tif (method instanceof ConstructorDeclaration) {\n\t\t\t\tConstructorDeclaration cd = (ConstructorDeclaration) method;\n\t\t\t\tprint(\"--> constructorCall: %s\", cd.constructorCall == null ? \"-NONE-\" : cd.constructorCall);\n\t\t\t}\n\t\t\tif (printContent) {\n\t\t\t\tif (method.statements != null) print(\"%s\", method);\n\t\t\t\tdisablePrinting++;\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic void visitAnnotationOnMethod(AbstractMethodDeclaration method, EclipseNode node, Annotation annotation) {\n\t\t\tforcePrint(\"<ANNOTATION%s: %s%s>\", isGenerated(method) ? \" (GENERATED)\" : \"\", annotation, position(node));\n\t\t\tif (annotation instanceof MarkerAnnotation || disablePrinting != 0) {\n\t\t\t\tforcePrint(\"<ANNOTATION%s: %s%s />\", isGenerated(method) ? \" (GENERATED)\" : \"\", annotation, position(node));\n\t\t\t} else {\n\t\t\t\tforcePrint(\"<ANNOTATION%s: %s%s>\", isGenerated(method) ? \" (GENERATED)\" : \"\", annotation, position(node));\n\t\t\t\tindent++;\n\t\t\t\tif (annotation instanceof SingleMemberAnnotation) {\n\t\t\t\t\tExpression expr = ((SingleMemberAnnotation) annotation).memberValue;\n\t\t\t\t\tprint(\"<SINGLE-MEMBER-VALUE %s /> %s\", expr.getClass(), expr);\n\t\t\t\t}\n\t\t\t\tif (annotation instanceof NormalAnnotation) {\n\t\t\t\t\tfor (MemberValuePair mvp : ((NormalAnnotation) annotation).memberValuePairs) {\n\t\t\t\t\t\tprint(\"<Member %s: %s /> %s\", new String(mvp.name), mvp.value.getClass(), mvp.value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tindent--;\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic void endVisitMethod(EclipseNode node, AbstractMethodDeclaration method) {\n\t\t\tif (printContent) disablePrinting--;\n\t\t\tString type = method instanceof ConstructorDeclaration ? \"CONSTRUCTOR\" : \"METHOD\";\n\t\t\tindent--;\n\t\t\tprint(\"</%s %s>\", type, str(method.selector));\n\t\t}\n\t\t\n\t\tpublic void visitMethodArgument(EclipseNode node, Argument arg, AbstractMethodDeclaration method) {\n\t\t\tprint(\"<METHODARG%s %s %s = %s%s> %s\", isGenerated(arg) ? \" (GENERATED)\" : \"\",\n\t\t\t\tstr(arg.type), str(arg.name), arg.initialization, position(node), printFlags(arg.modifiers, arg));\n\t\t\tindent++;\n\t\t}\n\t\t\n\t\tpublic void visitAnnotationOnMethodArgument(Argument arg, AbstractMethodDeclaration method, EclipseNode node, Annotation annotation) {\n\t\t\tprint(\"<ANNOTATION%s: %s%s />\", isGenerated(annotation) ? \" (GENERATED)\" : \"\", annotation, position(node));\n\t\t}\n\t\t\n\t\tpublic void endVisitMethodArgument(EclipseNode node, Argument arg, AbstractMethodDeclaration method) {\n\t\t\tindent--;\n\t\t\tprint(\"</METHODARG %s %s>\", str(arg.type), str(arg.name));\n\t\t}\n\t\t\n\t\tpublic void visitLocal(EclipseNode node, LocalDeclaration local) {\n\t\t\tprint(\"<LOCAL%s %s %s = %s%s> %s\", isGenerated(local) ? \" (GENERATED)\" : \"\",\n\t\t\t\tstr(local.type), str(local.name), local.initialization, position(node), printFlags(local.modifiers, local));\n\t\t\tindent++;\n\t\t}\n\t\t\n\t\tpublic void visitAnnotationOnLocal(LocalDeclaration local, EclipseNode node, Annotation annotation) {\n\t\t\tprint(\"<ANNOTATION%s: %s />\", isGenerated(annotation) ? \" (GENERATED)\" : \"\", annotation);\n\t\t}\n\t\t\n\t\tpublic void endVisitLocal(EclipseNode node, LocalDeclaration local) {\n\t\t\tindent--;\n\t\t\tprint(\"</LOCAL %s %s>\", str(local.type), str(local.name));\n\t\t}\n\t\t\n\t\t@Override public void visitTypeUse(EclipseNode typeUseNode, TypeReference typeUse) {\n\t\t\tprint(\"<TYPE %s>\", typeUse.getClass());\n\t\t\tindent++;\n\t\t\tprint(\"%s\", typeUse);\n\t\t}\n\t\t\n\t\t@Override public void visitAnnotationOnTypeUse(TypeReference typeUse, EclipseNode annotationNode, Annotation annotation) {\n\t\t\tprint(\"<ANNOTATION%s: %s />\", isGenerated(annotation) ? \" (GENERATED)\" : \"\", annotation);\n\t\t}\n\t\t\n\t\t@Override public void endVisitTypeUse(EclipseNode typeUseNode, TypeReference typeUse) {\n\t\t\tindent--;\n\t\t\tprint(\"</TYPE %s>\", typeUse.getClass());\n\t\t}\n\t\t\n\t\tpublic void visitStatement(EclipseNode node, Statement statement) {\n\t\t\tprint(\"<%s%s%s>\", statement.getClass(), isGenerated(statement) ? \" (GENERATED)\" : \"\", position(node));\n\t\t\tif (statement instanceof AllocationExpression) {\n\t\t\t\tAllocationExpression alloc = (AllocationExpression) statement;\n\t\t\t\tprint(\" --> arguments: %s\", alloc.arguments == null ? \"NULL\" : alloc.arguments.length);\n\t\t\t\tprint(\" --> genericTypeArguments: %s\", alloc.genericTypeArguments == null ? \"NULL\" : alloc.genericTypeArguments.length);\n\t\t\t\tprint(\" --> typeArguments: %s\", alloc.typeArguments == null ? \"NULL\" : alloc.typeArguments.length);\n\t\t\t\tprint(\" --> enumConstant: %s\", alloc.enumConstant);\n\t\t\t\tprint(\" --> inferredReturnType: %s\", alloc.inferredReturnType);\n\t\t\t}\n\t\t\tindent++;\n\t\t\tprint(\"%s\", statement);\n\t\t}\n\t\t\n\t\tpublic void endVisitStatement(EclipseNode node, Statement statement) {\n\t\t\tindent--;\n\t\t\tprint(\"</%s>\", statement.getClass());\n\t\t}\n\t\t\n\t\tString position(EclipseNode node) {\n\t\t\tif (!printPositions) return \"\";\n\t\t\tint start = node.get().sourceStart();\n\t\t\tint end = node.get().sourceEnd();\n\t\t\treturn String.format(\" [%d, %d]\", start, end);\n\t\t}\n\n\t\tpublic boolean isDeferUntilPostDiet() {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tboolean isDeferUntilPostDiet();\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/EclipseAnnotationHandler.java",
    "content": "/*\n * Copyright (C) 2009-2012 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse;\n\nimport lombok.core.AnnotationValues;\nimport lombok.core.SpiLoadUtil;\n\n/**\n * Implement this interface if you want to be triggered for a specific annotation.\n * \n * You MUST replace 'T' with a specific annotation type, such as:\n * \n * {@code public class HandleGetter extends EclipseAnnotationHandler<Getter>}\n * \n * Because this generics parameter is inspected to figure out which class you're interested in.\n * \n * You also need to register yourself via SPI discovery as being an implementation of {@code EclipseAnnotationHandler}.\n */\npublic abstract class EclipseAnnotationHandler<T extends java.lang.annotation.Annotation> {\n\t/**\n\t * Called when an annotation is found that is likely to match the annotation you're interested in.\n\t * \n\t * Be aware that you'll be called for ANY annotation node in the source that looks like a match. There is,\n\t * for example, no guarantee that the annotation node belongs to a method, even if you set your\n\t * TargetType in the annotation to methods only.\n\t * \n\t * @param annotation The actual annotation - use this object to retrieve the annotation parameters.\n\t * @param ast The Eclipse AST node representing the annotation.\n\t * @param annotationNode The Lombok AST wrapper around the 'ast' parameter. You can use this object\n\t * to travel back up the chain (something javac AST can't do) to the parent of the annotation, as well\n\t * as access useful methods such as generating warnings or errors focused on the annotation.\n\t */\n\tpublic abstract void handle(AnnotationValues<T> annotation, org.eclipse.jdt.internal.compiler.ast.Annotation ast, EclipseNode annotationNode);\n\t\n\t/**\n\t * Called when you want to defer until post diet, and we're still in pre-diet. May be called not at all or multiple times, so make sure\n\t * this method is idempotent if run more than once, and whatever you do here should also be done in the main 'handle' method.\n\t * \n\t * NB: This method exists because in certain cases, within eclipse, you have to create i.e. a field before referencing it in generated code. You still\n\t * have to create the field, if its not already there, in 'handle', because for example preHandle would never even be called in ecj mode.\n\t */\n\tpublic void preHandle(AnnotationValues<T> annotation, org.eclipse.jdt.internal.compiler.ast.Annotation ast, EclipseNode annotationNode) {\n\t}\n\t\n\t/**\n\t * This handler is a handler for the given annotation; you don't normally need to override this class\n\t * as the annotation type is extracted from your {@code extends EclipseAnnotationHandler<AnnotationTypeHere>}\n\t * signature.\n\t */\n\t@SuppressWarnings(\"unchecked\") public Class<T> getAnnotationHandledByThisHandler() {\n\t\treturn (Class<T>) SpiLoadUtil.findAnnotationClass(getClass(), EclipseAnnotationHandler.class);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/EclipseAstProblemView.java",
    "content": "package lombok.eclipse;\n\n\nimport org.eclipse.jdt.core.compiler.CategorizedProblem;\nimport org.eclipse.jdt.internal.compiler.CompilationResult;\nimport org.eclipse.jdt.internal.compiler.problem.DefaultProblem;\nimport org.eclipse.jdt.internal.compiler.problem.ProblemSeverities;\nimport org.eclipse.jdt.internal.compiler.util.Util;\n\npublic class EclipseAstProblemView {\n\t/**\n\t * Adds a problem to the provided CompilationResult object so that it will show up\n\t * in the Problems/Warnings view.\n\t */\n\tpublic static void addProblemToCompilationResult(char[] fileNameArray, CompilationResult result,\n\t\t\tboolean isWarning, String message, int sourceStart, int sourceEnd) {\n\t\tif (result == null) return;\n\t\tif (fileNameArray == null) fileNameArray = \"(unknown).java\".toCharArray();\n\t\tint lineNumber = 0;\n\t\tint columnNumber = 1;\n\t\tint[] lineEnds = null;\n\t\tlineNumber = sourceStart >= 0\n\t\t\t\t? Util.getLineNumber(sourceStart, lineEnds = result.getLineSeparatorPositions(), 0, lineEnds.length-1)\n\t\t\t\t: 0;\n\t\tcolumnNumber = sourceStart >= 0\n\t\t\t\t? Util.searchColumnNumber(result.getLineSeparatorPositions(), lineNumber,sourceStart)\n\t\t\t\t: 0;\n\t\t\n\t\tCategorizedProblem ecProblem = new LombokProblem(\n\t\t\t\tfileNameArray, message, 0, new String[0],\n\t\t\t\tisWarning ? ProblemSeverities.Warning : ProblemSeverities.Error,\n\t\t\t\tsourceStart, sourceEnd, lineNumber, columnNumber);\n\t\tresult.record(ecProblem, null);\n\t}\n\t\n\tprivate static class LombokProblem extends DefaultProblem {\n\t\tprivate static final String MARKER_ID = \"org.eclipse.jdt.apt.pluggable.core.compileProblem\";  //$NON-NLS-1$\n\t\t\n\t\tpublic LombokProblem(char[] originatingFileName, String message, int id,\n\t\t\t\tString[] stringArguments, int severity,\n\t\t\t\tint startPosition, int endPosition, int line, int column) {\n\t\t\tsuper(originatingFileName, message, id, stringArguments, severity, startPosition, endPosition, line, column);\n\t\t}\n\t\t\n\t\t@Override public int getCategoryID() {\n\t\t\treturn CAT_UNSPECIFIED;\n\t\t}\n\t\t\n\t\t@Override public String getMarkerType() {\n\t\t\treturn MARKER_ID;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/EclipseImportList.java",
    "content": "/*\n * Copyright (C) 2013-2020 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse;\n\nimport static lombok.eclipse.Eclipse.toQualifiedName;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.List;\n\nimport lombok.core.ImportList;\nimport lombok.core.LombokInternalAliasing;\n\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.ImportReference;\n\npublic class EclipseImportList implements ImportList {\n\tprivate ImportReference[] imports;\n\tprivate ImportReference pkg;\n\t\n\tpublic EclipseImportList(CompilationUnitDeclaration cud) {\n\t\tthis.pkg = cud.currentPackage;\n\t\tthis.imports = cud.imports;\n\t}\n\t\n\t@Override public String getFullyQualifiedNameForSimpleName(String unqualified) {\n\t\tString q = getFullyQualifiedNameForSimpleNameNoAliasing(unqualified);\n\t\treturn q == null ? null : LombokInternalAliasing.processAliases(q);\n\t}\n\t\n\t@Override public String getFullyQualifiedNameForSimpleNameNoAliasing(String unqualified) {\n\t\tif (imports != null) {\n\t\t\touter:\n\t\t\tfor (ImportReference imp : imports) {\n\t\t\t\tif ((imp.bits & ASTNode.OnDemand) != 0) continue;\n\t\t\t\tchar[][] tokens = imp.tokens;\n\t\t\t\tchar[] token = tokens.length == 0 ? new char[0] : tokens[tokens.length - 1];\n\t\t\t\tint len = token.length;\n\t\t\t\tif (len != unqualified.length()) continue;\n\t\t\t\tfor (int i = 0; i < len; i++) if (token[i] != unqualified.charAt(i)) continue outer;\n\t\t\t\treturn toQualifiedName(tokens);\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\t\n\t@Override public boolean hasStarImport(String packageName) {\n\t\tif (isEqual(packageName, pkg)) return true;\n\t\tif (\"java.lang\".equals(packageName)) return true;\n\t\t\n\t\tif (imports != null) for (ImportReference imp : imports) {\n\t\t\tif ((imp.bits & ASTNode.OnDemand) == 0) continue;\n\t\t\tif (imp.isStatic()) continue;\n\t\t\tif (isEqual(packageName, imp)) return true;\n\t\t\t\n\t\t}\n\t\treturn false;\n\t}\n\t\n\tprivate static boolean isEqual(String packageName, ImportReference pkgOrStarImport) {\n\t\tif (pkgOrStarImport == null || pkgOrStarImport.tokens == null || pkgOrStarImport.tokens.length == 0) return packageName.isEmpty();\n\t\tint pos = 0;\n\t\tint len = packageName.length();\n\t\tfor (int i = 0; i < pkgOrStarImport.tokens.length; i++) {\n\t\t\tif (i != 0) {\n\t\t\t\tif (pos >= len) return false;\n\t\t\t\tif (packageName.charAt(pos++) != '.') return false;\n\t\t\t}\n\t\t\tfor (int j = 0; j < pkgOrStarImport.tokens[i].length; j++) {\n\t\t\t\tif (pos >= len) return false;\n\t\t\t\tif (packageName.charAt(pos++) != pkgOrStarImport.tokens[i][j]) return false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\t\n\t@Override public Collection<String> applyNameToStarImports(String startsWith, String name) {\n\t\tList<String> out = Collections.emptyList();\n\t\t\n\t\tif (pkg != null && pkg.tokens != null && pkg.tokens.length != 0) {\n\t\t\tchar[] first = pkg.tokens[0];\n\t\t\tint len = first.length;\n\t\t\tboolean match = true;\n\t\t\tif (startsWith.length() == len) {\n\t\t\t\tfor (int i = 0; match && i < len; i++) {\n\t\t\t\t\tif (startsWith.charAt(i) != first[i]) match = false;\n\t\t\t\t}\n\t\t\t\tif (match) out.add(toQualifiedName(pkg.tokens) + \".\" + name);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (imports != null) {\n\t\t\touter:\n\t\t\tfor (ImportReference imp : imports) {\n\t\t\t\tif ((imp.bits & ASTNode.OnDemand) == 0) continue;\n\t\t\t\tif (imp.isStatic()) continue;\n\t\t\t\tif (imp.tokens == null || imp.tokens.length == 0) continue;\n\t\t\t\tchar[] firstToken = imp.tokens[0];\n\t\t\t\tif (firstToken.length != startsWith.length()) continue;\n\t\t\t\tfor (int i = 0; i < firstToken.length; i++) if (startsWith.charAt(i) != firstToken[i]) continue outer;\n\t\t\t\tString fqn = toQualifiedName(imp.tokens) + \".\" + name;\n\t\t\t\tif (out.isEmpty()) out = Collections.singletonList(fqn);\n\t\t\t\telse if (out.size() == 1) {\n\t\t\t\t\tout = new ArrayList<String>(out);\n\t\t\t\t\tout.add(fqn);\n\t\t\t\t} else {\n\t\t\t\t\tout.add(fqn);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn out;\n\t}\n\t\n\t@Override public String applyUnqualifiedNameToPackage(String unqualified) {\n\t\tif (pkg == null || pkg.tokens == null || pkg.tokens.length == 0) return unqualified;\n\t\treturn toQualifiedName(pkg.tokens) + \".\" + unqualified;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/EclipseNode.java",
    "content": "/*\n * Copyright (C) 2009-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse;\n\nimport java.util.List;\n\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.Argument;\nimport org.eclipse.jdt.internal.compiler.ast.Clinit;\nimport org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.Initializer;\nimport org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\nimport org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;\n\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.eclipse.handlers.EclipseHandlerUtil;\n\n/**\n * Eclipse specific version of the LombokNode class.\n */\npublic class EclipseNode extends lombok.core.LombokNode<EclipseAST, EclipseNode, ASTNode> {\n\tprivate EclipseAST ast;\n\t/** {@inheritDoc} */\n\tEclipseNode(EclipseAST ast, ASTNode node, List<EclipseNode> children, Kind kind) {\n\t\tsuper(node, children, kind);\n\t\tthis.ast = ast;\n\t}\n\t\n\t@Override \n\tpublic EclipseAST getAst() {\n\t\treturn ast;\n\t}\n\t/**\n\t * Visits this node and all child nodes depth-first, calling the provided visitor's visit methods.\n\t */\n\tpublic void traverse(EclipseASTVisitor visitor) {\n\t\tif (visitor.isDeferUntilPostDiet() && !isCompleteParse()) return;\n\t\t\n\t\tswitch (getKind()) {\n\t\tcase COMPILATION_UNIT:\n\t\t\tvisitor.visitCompilationUnit(this, (CompilationUnitDeclaration) get());\n\t\t\tast.traverseChildren(visitor, this);\n\t\t\tvisitor.endVisitCompilationUnit(this, (CompilationUnitDeclaration) get());\n\t\t\tbreak;\n\t\tcase TYPE:\n\t\t\tvisitor.visitType(this, (TypeDeclaration) get());\n\t\t\tast.traverseChildren(visitor, this);\n\t\t\tvisitor.endVisitType(this, (TypeDeclaration) get());\n\t\t\tbreak;\n\t\tcase FIELD:\n\t\t\tvisitor.visitField(this, (FieldDeclaration) get());\n\t\t\tast.traverseChildren(visitor, this);\n\t\t\tvisitor.endVisitField(this, (FieldDeclaration) get());\n\t\t\tbreak;\n\t\tcase INITIALIZER:\n\t\t\tvisitor.visitInitializer(this, (Initializer) get());\n\t\t\tast.traverseChildren(visitor, this);\n\t\t\tvisitor.endVisitInitializer(this, (Initializer) get());\n\t\t\tbreak;\n\t\tcase METHOD:\n\t\t\tif (get() instanceof Clinit) return;\n\t\t\tvisitor.visitMethod(this, (AbstractMethodDeclaration) get());\n\t\t\tast.traverseChildren(visitor, this);\n\t\t\tvisitor.endVisitMethod(this, (AbstractMethodDeclaration) get());\n\t\t\tbreak;\n\t\tcase ARGUMENT:\n\t\t\tAbstractMethodDeclaration method = (AbstractMethodDeclaration) up().get();\n\t\t\tvisitor.visitMethodArgument(this, (Argument) get(), method);\n\t\t\tast.traverseChildren(visitor, this);\n\t\t\tvisitor.endVisitMethodArgument(this, (Argument) get(), method);\n\t\t\tbreak;\n\t\tcase LOCAL:\n\t\t\tvisitor.visitLocal(this, (LocalDeclaration) get());\n\t\t\tast.traverseChildren(visitor, this);\n\t\t\tvisitor.endVisitLocal(this, (LocalDeclaration) get());\n\t\t\tbreak;\n\t\tcase ANNOTATION:\n\t\t\tswitch (up().getKind()) {\n\t\t\tcase TYPE:\n\t\t\t\tvisitor.visitAnnotationOnType((TypeDeclaration) up().get(), this, (Annotation) get());\n\t\t\t\tbreak;\n\t\t\tcase FIELD:\n\t\t\t\tvisitor.visitAnnotationOnField((FieldDeclaration) up().get(), this, (Annotation) get());\n\t\t\t\tbreak;\n\t\t\tcase METHOD:\n\t\t\t\tvisitor.visitAnnotationOnMethod((AbstractMethodDeclaration) up().get(), this, (Annotation) get());\n\t\t\t\tbreak;\n\t\t\tcase ARGUMENT:\n\t\t\t\tvisitor.visitAnnotationOnMethodArgument(\n\t\t\t\t\t\t(Argument) parent.get(),\n\t\t\t\t\t\t(AbstractMethodDeclaration) parent.directUp().get(),\n\t\t\t\t\t\tthis, (Annotation) get());\n\t\t\t\tbreak;\n\t\t\tcase LOCAL:\n\t\t\t\tvisitor.visitAnnotationOnLocal((LocalDeclaration) parent.get(), this, (Annotation) get());\n\t\t\t\tbreak;\n\t\t\tcase TYPE_USE:\n\t\t\t\tvisitor.visitAnnotationOnTypeUse((TypeReference) parent.get(), this, (Annotation) get());\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new AssertionError(\"Annotation not expected as child of a \" + up().getKind());\n\t\t\t}\n\t\t\tbreak;\n\t\tcase TYPE_USE:\n\t\t\tvisitor.visitTypeUse(this, (TypeReference) get());\n\t\t\tast.traverseChildren(visitor, this);\n\t\t\tvisitor.endVisitTypeUse(this, (TypeReference) get());\n\t\t\tbreak;\n\t\tcase STATEMENT:\n\t\t\tvisitor.visitStatement(this, (Statement) get());\n\t\t\tast.traverseChildren(visitor, this);\n\t\t\tvisitor.endVisitStatement(this, (Statement) get());\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new AssertionError(\"Unexpected kind during node traversal: \" + getKind());\n\t\t}\n\t}\n\t\n\t/** {@inheritDoc} */\n\t@Override public String getName() {\n\t\tfinal char[] n;\n\t\tif (node instanceof TypeDeclaration) n = ((TypeDeclaration)node).name;\n\t\telse if (node instanceof FieldDeclaration) n = ((FieldDeclaration)node).name;\n\t\telse if (node instanceof AbstractMethodDeclaration) n = ((AbstractMethodDeclaration)node).selector;\n\t\telse if (node instanceof LocalDeclaration) n = ((LocalDeclaration)node).name;\n\t\telse n = null;\n\t\t\n\t\treturn n == null ? null : new String(n);\n\t}\n\t\n\t/** {@inheritDoc} */\n\t@Override public void addError(String message) {\n\t\tthis.addError(message, this.get().sourceStart, this.get().sourceEnd);\n\t}\n\t\n\t/** Generate a compiler error that shows the wavy underline from-to the stated character positions. */\n\tpublic void addError(String message, int sourceStart, int sourceEnd) {\n\t\tast.addProblem(ast.new ParseProblem(false, message, sourceStart, sourceEnd));\n\t}\n\t\n\t/** {@inheritDoc} */\n\t@Override public void addWarning(String message) {\n\t\tthis.addWarning(message, this.get().sourceStart, this.get().sourceEnd);\n\t}\n\t\n\t/** Generate a compiler warning that shows the wavy underline from-to the stated character positions. */\n\tpublic void addWarning(String message, int sourceStart, int sourceEnd) {\n\t\tast.addProblem(ast.new ParseProblem(true, message, sourceStart, sourceEnd));\n\t}\n\t\n\t/** {@inheritDoc} */\n\t@Override protected boolean calculateIsStructurallySignificant(ASTNode parent) {\n\t\tif (node instanceof TypeDeclaration) return true;\n\t\tif (node instanceof AbstractMethodDeclaration) return true;\n\t\tif (node instanceof FieldDeclaration) return true;\n\t\tif (node instanceof LocalDeclaration) return true;\n\t\tif (node instanceof CompilationUnitDeclaration) return true;\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * Convenient shortcut to the owning EclipseAST object's isCompleteParse method.\n\t * \n\t * @see EclipseAST#isCompleteParse()\n\t */\n\tpublic boolean isCompleteParse() {\n\t\treturn ast.isCompleteParse();\n\t}\n\t\n\t@Override public boolean hasAnnotation(Class<? extends java.lang.annotation.Annotation> type) {\n\t\treturn EclipseHandlerUtil.hasAnnotation(type, this);\n\t}\n\t\n\t@Override public <Z extends java.lang.annotation.Annotation> AnnotationValues<Z> findAnnotation(Class<Z> type) {\n\t\tEclipseNode annotation = EclipseHandlerUtil.findAnnotation(type, this);\n\t\tif (annotation == null) return null;\n\t\treturn EclipseHandlerUtil.createAnnotation(type, annotation);\n\t}\n\t\n\tprivate Integer getModifiers() {\n\t\tif (node instanceof TypeDeclaration) return ((TypeDeclaration) node).modifiers;\n\t\tif (node instanceof FieldDeclaration) return ((FieldDeclaration) node).modifiers;\n\t\tif (node instanceof LocalDeclaration) return ((LocalDeclaration) node).modifiers;\n\t\tif (node instanceof AbstractMethodDeclaration) return ((AbstractMethodDeclaration) node).modifiers;\n\t\t\n\t\treturn null;\n\t}\n\t\n\t@Override public boolean isStatic() {\n\t\tif (node instanceof TypeDeclaration) {\n\t\t\tTypeDeclaration t = (TypeDeclaration) node;\n\t\t\tint f = t.modifiers;\n\t\t\tif (((ClassFileConstants.AccInterface | ClassFileConstants.AccEnum | Eclipse.AccRecord) & f) != 0) return true;\n\t\t\t\n\t\t\tEclipseNode directUp = directUp();\n\t\t\tif (directUp == null || directUp.getKind() == Kind.COMPILATION_UNIT) return true;\n\t\t\tif (!(directUp.get() instanceof TypeDeclaration)) return false;\n\t\t\tTypeDeclaration p = (TypeDeclaration) directUp.get();\n\t\t\tf = p.modifiers;\n\t\t\tif (((ClassFileConstants.AccInterface | ClassFileConstants.AccEnum) & f) != 0) return true;\n\t\t}\n\t\t\n\t\tif (node instanceof FieldDeclaration) {\n\t\t\tEclipseNode directUp = directUp();\n\t\t\tif (directUp != null && directUp.get() instanceof TypeDeclaration) {\n\t\t\t\tTypeDeclaration p = (TypeDeclaration) directUp.get();\n\t\t\t\tint f = p.modifiers;\n\t\t\t\tif ((ClassFileConstants.AccInterface & f) != 0) return true;\n\t\t\t}\n\t\t}\n\t\t\n\t\tInteger i = getModifiers();\n\t\tif (i == null) return false;\n\t\tint f = i.intValue();\n\t\treturn (ClassFileConstants.AccStatic & f) != 0;\n\t}\n\t\n\t@Override public boolean isFinal() {\n\t\tif (node instanceof FieldDeclaration) {\n\t\t\tEclipseNode directUp = directUp();\n\t\t\tif (directUp != null && directUp.get() instanceof TypeDeclaration) {\n\t\t\t\tTypeDeclaration p = (TypeDeclaration) directUp.get();\n\t\t\t\tint f = p.modifiers;\n\t\t\t\tif (((ClassFileConstants.AccInterface | ClassFileConstants.AccEnum) & f) != 0) return true;\n\t\t\t}\n\t\t}\n\t\t\n\t\tInteger i = getModifiers();\n\t\tif (i == null) return false;\n\t\tint f = i.intValue();\n\t\treturn (ClassFileConstants.AccFinal & f) != 0;\n\t}\n\t\n\t@Override public boolean isPrimitive() {\n\t\tif (node instanceof FieldDeclaration && !isEnumMember()) {\n\t\t\treturn Eclipse.isPrimitive(((FieldDeclaration) node).type);\n\t\t}\n\t\tif (node instanceof MethodDeclaration) {\n\t\t\treturn Eclipse.isPrimitive(((MethodDeclaration) node).returnType);\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * {@inheritDoc}\n\t */\n\t@Override public String fieldOrMethodBaseType() {\n\t\tTypeReference typeReference = null;\n\t\tif (node instanceof FieldDeclaration && !isEnumMember()) {\n\t\t\ttypeReference = ((FieldDeclaration) node).type;\n\t\t}\n\t\tif (node instanceof MethodDeclaration) {\n\t\t\ttypeReference = ((MethodDeclaration) node).returnType;\n\t\t}\n\t\tif (typeReference == null) return null;\n\t\t\n\t\tString fqn = Eclipse.toQualifiedName(typeReference.getTypeName());\n\t\tif (typeReference.dimensions() == 0) return fqn;\n\t\tStringBuilder result = new StringBuilder(fqn.length() + 2 * typeReference.dimensions());\n\t\tresult.append(fqn);\n\t\tfor (int i = 0; i < typeReference.dimensions(); i++) {\n\t\t\tresult.append(\"[]\");\n\t\t}\n\t\treturn result.toString();\n\t}\n\t\n\t@Override public boolean isTransient() {\n\t\tif (getKind() != Kind.FIELD) return false;\n\t\tInteger i = getModifiers();\n\t\treturn i != null && (i.intValue() & ClassFileConstants.AccTransient) != 0;\n\t}\n\t\n\t@Override public boolean isEnumMember() {\n\t\tif (getKind() != Kind.FIELD) return false;\n\t\treturn ((FieldDeclaration) node).getKind() == 3;\n\t}\n\t\n\t@Override public boolean isEnumType() {\n\t\tif (getKind() != Kind.TYPE) return false;\n\t\treturn (((TypeDeclaration) node).modifiers & ClassFileConstants.AccEnum) != 0;\n\t}\n\t\n\t@Override public int countMethodParameters() {\n\t\tif (getKind() != Kind.METHOD) return 0;\n\t\t\n\t\tArgument[] a = ((AbstractMethodDeclaration) node).arguments;\n\t\tif (a == null) return 0;\n\t\treturn a.length;\n\t}\n\t\n\t@Override public int getStartPos() {\n\t\treturn node.sourceStart;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/HandlerLibrary.java",
    "content": "/*\n * Copyright (C) 2009-2018 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse;\n\nimport static lombok.eclipse.Eclipse.*;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\nimport static lombok.eclipse.EcjAugments.ASTNode_handled;\n\nimport java.io.IOException;\nimport java.lang.annotation.Annotation;\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.SortedSet;\nimport java.util.TreeSet;\n\nimport lombok.Lombok;\nimport lombok.core.AnnotationValues;\nimport lombok.core.AnnotationValues.AnnotationValueDecodeFail;\nimport lombok.core.configuration.ConfigurationKeysLoader;\nimport lombok.core.HandlerPriority;\nimport lombok.core.SpiLoadUtil;\nimport lombok.core.TypeLibrary;\nimport lombok.core.TypeResolver;\n\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\n\n/**\n * This class tracks 'handlers' and knows how to invoke them for any given AST node.\n * \n * This class can find the handlers (via SPI discovery) and will set up the given AST node, such as\n * building an AnnotationValues instance.\n */\npublic class HandlerLibrary {\n\t/**\n\t * Creates a new HandlerLibrary. Errors will be reported to the Eclipse Error log.\n\t * You probably want to use {@link #load()} instead.\n\t */\n\tpublic HandlerLibrary() {\n\t\tConfigurationKeysLoader.LoaderLoader.loadAllConfigurationKeys();\n\t}\n\t\n\tprivate TypeLibrary typeLibrary = new TypeLibrary();\n\t\n\tprivate static class VisitorContainer {\n\t\tprivate final EclipseASTVisitor visitor;\n\t\tprivate final long priority;\n\t\tprivate final boolean deferUntilPostDiet;\n\t\t\n\t\tVisitorContainer(EclipseASTVisitor visitor) {\n\t\t\tthis.visitor = visitor;\n\t\t\tthis.deferUntilPostDiet = visitor.getClass().isAnnotationPresent(DeferUntilPostDiet.class);\n\t\t\tHandlerPriority hp = visitor.getClass().getAnnotation(HandlerPriority.class);\n\t\t\tthis.priority = hp == null ? 0L : (((long)hp.value()) << 32) + hp.subValue();\n\t\t}\n\t\t\n\t\tpublic boolean deferUntilPostDiet() {\n\t\t\treturn deferUntilPostDiet;\n\t\t}\n\t\t\n\t\tpublic long getPriority() {\n\t\t\treturn priority;\n\t\t}\n\t}\n\t\n\tprivate static class AnnotationHandlerContainer<T extends Annotation> {\n\t\tprivate final EclipseAnnotationHandler<T> handler;\n\t\tprivate final Class<T> annotationClass;\n\t\tprivate final long priority;\n\t\tprivate final boolean deferUntilPostDiet;\n\t\t\n\t\tAnnotationHandlerContainer(EclipseAnnotationHandler<T> handler, Class<T> annotationClass) {\n\t\t\tthis.handler = handler;\n\t\t\tthis.annotationClass = annotationClass;\n\t\t\tthis.deferUntilPostDiet = handler.getClass().isAnnotationPresent(DeferUntilPostDiet.class);\n\t\t\tHandlerPriority hp = handler.getClass().getAnnotation(HandlerPriority.class);\n\t\t\tthis.priority = hp == null ? 0L : (((long)hp.value()) << 32) + hp.subValue();\n\t\t}\n\t\t\n\t\tpublic void handle(org.eclipse.jdt.internal.compiler.ast.Annotation annotation,\n\t\t\t\tfinal EclipseNode annotationNode) {\n\t\t\tAnnotationValues<T> annValues = createAnnotation(annotationClass, annotationNode);\n\t\t\thandler.handle(annValues, annotation, annotationNode);\n\t\t}\n\t\t\n\t\tpublic void preHandle(org.eclipse.jdt.internal.compiler.ast.Annotation annotation,\n\t\t\t\tfinal EclipseNode annotationNode) {\n\t\t\tAnnotationValues<T> annValues = createAnnotation(annotationClass, annotationNode);\n\t\t\thandler.preHandle(annValues, annotation, annotationNode);\n\t\t}\n\t\t\n\t\tpublic boolean deferUntilPostDiet() {\n\t\t\treturn deferUntilPostDiet;\n\t\t}\n\t\t\n\t\tpublic long getPriority() {\n\t\t\treturn priority;\n\t\t}\n\t}\n\t\n\tprivate Map<String, AnnotationHandlerContainer<?>> annotationHandlers =\n\t\tnew HashMap<String, AnnotationHandlerContainer<?>>();\n\t\n\tprivate Collection<VisitorContainer> visitorHandlers = new ArrayList<VisitorContainer>();\n\n\t/**\n\t * Creates a new HandlerLibrary.  Errors will be reported to the Eclipse Error log.\n\t * then uses SPI discovery to load all annotation and visitor based handlers so that future calls\n\t * to the handle methods will defer to these handlers.\n\t */\n\tpublic static HandlerLibrary load() {\n\t\tHandlerLibrary lib = new HandlerLibrary();\n\t\t\n\t\tloadAnnotationHandlers(lib);\n\t\tloadVisitorHandlers(lib);\n\t\t\n\t\tlib.calculatePriorities();\n\t\t\n\t\treturn lib;\n\t}\n\t\n\tprivate SortedSet<Long> priorities;\n\t\n\tpublic SortedSet<Long> getPriorities() {\n\t\treturn priorities;\n\t}\n\t\n\tprivate void calculatePriorities() {\n\t\tSortedSet<Long> set = new TreeSet<Long>();\n\t\tfor (AnnotationHandlerContainer<?> container : annotationHandlers.values()) set.add(container.getPriority());\n\t\tfor (VisitorContainer container : visitorHandlers) set.add(container.getPriority());\n\t\tthis.priorities = Collections.unmodifiableSortedSet(set);\n\t}\n\t\n\t/** Uses SPI Discovery to find implementations of {@link EclipseAnnotationHandler}. */\n\t@SuppressWarnings({\"rawtypes\", \"unchecked\"})\n\tprivate static void loadAnnotationHandlers(HandlerLibrary lib) {\n\t\ttry {\n\t\t\tfor (EclipseAnnotationHandler<?> handler : SpiLoadUtil.findServices(EclipseAnnotationHandler.class, EclipseAnnotationHandler.class.getClassLoader())) {\n\t\t\t\ttry {\n\t\t\t\t\tClass<? extends Annotation> annotationClass = handler.getAnnotationHandledByThisHandler();\n\t\t\t\t\tAnnotationHandlerContainer<?> container = new AnnotationHandlerContainer(handler, annotationClass);\n\t\t\t\t\tString annotationClassName = container.annotationClass.getName().replace(\"$\", \".\");\n\t\t\t\t\tif (lib.annotationHandlers.put(annotationClassName, container) != null) {\n\t\t\t\t\t\terror(null, \"Duplicate handlers for annotation type: \" + annotationClassName, null);\n\t\t\t\t\t}\n\t\t\t\t\tlib.typeLibrary.addType(container.annotationClass.getName());\n\t\t\t\t} catch (Throwable t) {\n\t\t\t\t\terror(null, \"Can't load Lombok annotation handler for Eclipse: \", t);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (IOException e) {\n\t\t\tthrow Lombok.sneakyThrow(e);\n\t\t}\n\t}\n\t\n\t/** Uses SPI Discovery to find implementations of {@link EclipseASTVisitor}. */\n\tprivate static void loadVisitorHandlers(HandlerLibrary lib) {\n\t\ttry {\n\t\t\tfor (EclipseASTVisitor visitor : SpiLoadUtil.findServices(EclipseASTVisitor.class, EclipseASTVisitor.class.getClassLoader())) {\n\t\t\t\tlib.visitorHandlers.add(new VisitorContainer(visitor));\n\t\t\t}\n\t\t} catch (Throwable t) {\n\t\t\tthrow Lombok.sneakyThrow(t);\n\t\t}\n\t}\n\t\n\tprivate boolean checkAndSetHandled(ASTNode node) {\n\t\treturn !ASTNode_handled.getAndSet(node, true);\n\t}\n\t\n\tprivate boolean needsHandling(ASTNode node) {\n\t\treturn !ASTNode_handled.get(node);\n\t}\n\t\n\t/**\n\t * Handles the provided annotation node by first finding a qualifying instance of\n\t * {@link EclipseAnnotationHandler} and if one exists, calling it with a freshly cooked up\n\t * instance of {@link AnnotationValues}.\n\t * \n\t * Note that depending on the printASTOnly flag, the {@link lombok.core.PrintAST} annotation\n\t * will either be silently skipped, or everything that isn't {@code PrintAST} will be skipped.\n\t * \n\t * The HandlerLibrary will attempt to guess if the given annotation node represents a lombok annotation.\n\t * For example, if {@code lombok.*} is in the import list, then this method will guess that\n\t * {@code Getter} refers to {@code lombok.Getter}, presuming that {@link lombok.eclipse.handlers.HandleGetter}\n\t * has been loaded.\n\t * \n\t * @param ast The Compilation Unit that contains the Annotation AST Node.\n\t * @param annotationNode The Lombok AST Node representing the Annotation AST Node.\n\t * @param annotation 'node.get()' - convenience parameter.\n\t * @param priority current prioritiy\n\t * @return the priority we want to run - MAX_VALUE means never\n\t */\n\tpublic long handleAnnotation(CompilationUnitDeclaration ast, EclipseNode annotationNode, org.eclipse.jdt.internal.compiler.ast.Annotation annotation, long priority) {\n\t\tTypeResolver resolver = new TypeResolver(annotationNode.getImportList());\n\t\tTypeReference rawType = annotation.type;\n\t\tif (rawType == null) return Long.MAX_VALUE;\n\t\t\n\t\tString fqn = resolver.typeRefToFullyQualifiedName(annotationNode, typeLibrary, toQualifiedName(annotation.type.getTypeName()));\n\t\tif (fqn == null) return Long.MAX_VALUE;\n\t\tAnnotationHandlerContainer<?> container = annotationHandlers.get(fqn);\n\t\tif (container == null) return Long.MAX_VALUE;\n\t\t\n\t\tif (priority < container.getPriority()) return container.getPriority(); // we want to run at this priority\n\t\tif (priority > container.getPriority()) return Long.MAX_VALUE; // it's over- we do not want to run again\n\t\t\n\t\tif (!annotationNode.isCompleteParse() && container.deferUntilPostDiet()) {\n\t\t\tif (needsHandling(annotation)) container.preHandle(annotation, annotationNode);\n\t\t\treturn Long.MAX_VALUE;\n\t\t}\n\t\t\n\t\ttry {\n\t\t\tif (checkAndSetHandled(annotation)) container.handle(annotation, annotationNode);\n\t\t} catch (AnnotationValueDecodeFail fail) {\n\t\t\tfail.owner.setError(fail.getMessage(), fail.idx);\n\t\t} catch (Throwable t) {\n\t\t\terror(ast, String.format(\"Lombok annotation handler %s failed\", container.handler.getClass()), t);\n\t\t}\n\t\treturn Long.MAX_VALUE;\n\t}\n\t\n\t/**\n\t * Will call all registered {@link EclipseASTVisitor} instances.\n\t */\n\tpublic long callASTVisitors(EclipseAST ast, long priority, boolean isCompleteParse) {\n\t\tlong nearestPriority = Long.MAX_VALUE;\n\t\tfor (VisitorContainer container : visitorHandlers) {\n\t\t\tif (priority < container.getPriority()) nearestPriority = Math.min(container.getPriority(), nearestPriority);\n\t\t\tif (!isCompleteParse && container.deferUntilPostDiet()) continue;\n\t\t\tif (priority != container.getPriority()) continue;\n\t\t\ttry {\n\t\t\t\tast.traverse(container.visitor);\n\t\t\t} catch (Throwable t) {\n\t\t\t\terror((CompilationUnitDeclaration) ast.top().get(),\n\t\t\t\t\t\tString.format(\"Lombok visitor handler %s failed\", container.visitor.getClass()), t);\n\t\t\t}\n\t\t}\n\t\treturn nearestPriority;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/TransformEclipseAST.java",
    "content": "/*\n * Copyright (C) 2009-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse;\n\nimport static lombok.eclipse.EcjAugments.CompilationUnitDeclaration_transformationState;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport java.lang.reflect.Field;\n\nimport lombok.ConfigurationKeys;\nimport lombok.core.LombokConfiguration;\nimport lombok.core.debug.DebugSnapshotStore;\nimport lombok.core.debug.HistogramTracker;\nimport lombok.patcher.Symbols;\nimport lombok.permit.Permit;\n\nimport org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.Argument;\nimport org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\nimport org.eclipse.jdt.internal.compiler.parser.Parser;\n\n/**\n * Entry point for the Eclipse Parser patch that lets lombok modify the Abstract Syntax Tree as generated by\n * Eclipse's parser implementations. This class is injected into the appropriate OSGi ClassLoader and can thus\n * use any classes that belong to org.eclipse.jdt.(apt.)core.\n * \n * Note that, for any Method body, if Bit24 is set, the Eclipse parser has been patched to never attempt to\n * (re)parse it. You should set Bit24 on any MethodDeclaration object you inject into the AST:\n * \n * {@code methodDeclaration.bits |= ASTNode.Bit24; //0x800000}\n */\npublic class TransformEclipseAST {\n\tprivate final EclipseAST ast;\n\t//The patcher hacks this field onto CUD. It's public.\n\tprivate static final Field astCacheField;\n\tprivate static final HandlerLibrary handlers;\n\t\n\tpublic static boolean disableLombok = false;\n\tprivate static final HistogramTracker lombokTracker;\n\t\n\tstatic {\n\t\tString v = System.getProperty(\"lombok.histogram\");\n\t\tif (v == null) lombokTracker = null;\n\t\telse if (v.toLowerCase().equals(\"sysout\")) lombokTracker = new HistogramTracker(\"lombok.histogram\", System.out);\n\t\telse lombokTracker = new HistogramTracker(\"lombok.histogram\");\n\t}\n\t\n\tstatic {\n\t\tField f = null;\n\t\tHandlerLibrary h = null;\n\t\t\n\t\tif (System.getProperty(\"lombok.disable\") != null) {\n\t\t\tdisableLombok = true;\n\t\t\tastCacheField = null;\n\t\t\thandlers = null;\n\t\t} else {\n\t\t\ttry {\n\t\t\t\th = HandlerLibrary.load();\n\t\t\t} catch (Throwable t) {\n\t\t\t\ttry {\n\t\t\t\t\terror(null, \"Problem initializing lombok\", t);\n\t\t\t\t} catch (Throwable t2) {\n\t\t\t\t\tSystem.err.println(\"Problem initializing lombok\");\n\t\t\t\t\tt.printStackTrace();\n\t\t\t\t}\n\t\t\t\tdisableLombok = true;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tf = Permit.getField(CompilationUnitDeclaration.class, \"$lombokAST\");\n\t\t\t} catch (Throwable t) {\n\t\t\t\t//I guess we're in an ecj environment; we'll just not cache stuff then.\n\t\t\t}\n\t\t\t\n\t\t\tastCacheField = f;\n\t\t\thandlers = h;\n\t\t}\n\t}\n\t\n\tpublic static void transform_swapped(CompilationUnitDeclaration ast, Parser parser) {\n\t\ttransform(parser, ast);\n\t}\n\t\n\tpublic static EclipseAST getAST(CompilationUnitDeclaration ast, boolean forceRebuild) {\n\t\tEclipseAST existing = null;\n\t\tif (astCacheField != null) {\n\t\t\ttry {\n\t\t\t\texisting = (EclipseAST) astCacheField.get(ast);\n\t\t\t} catch (Exception e) {\n\t\t\t\t// existing remains null\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (existing == null) {\n\t\t\texisting = new EclipseAST(ast);\n\t\t\tif (astCacheField != null) try {\n\t\t\t\tastCacheField.set(ast, existing);\n\t\t\t} catch (Exception ignore) {\n\t\t\t}\n\t\t} else {\n\t\t\texisting.rebuild(forceRebuild);\n\t\t}\n\t\t\n\t\treturn existing;\n\t}\n\t\n\t/**\n\t * Check if lombok already handled the given AST. This method will return\n\t * {@code true} once for diet mode and once for full mode.\n\t * \n\t * The reason for this is that Eclipse invokes the transform method multiple\n\t * times during compilation and it is enough to transform it once and not\n\t * repeat the whole thing over and over again.\n\t * \n\t * @param ast The AST node belonging to the compilation unit (java speak for a single source file).\n\t * @return {@code true} if this AST was already handled by lombok.\n\t */\n\tpublic static boolean alreadyTransformed(CompilationUnitDeclaration ast) {\n\t\tTransformationState state = CompilationUnitDeclaration_transformationState.get(ast);\n\t\t\n\t\tif (state == TransformationState.FULL) return true;\n\t\tif (state == TransformationState.DIET) {\n\t\t\tif (!EclipseAST.isComplete(ast)) return true;\n\t\t\tCompilationUnitDeclaration_transformationState.set(ast, TransformationState.FULL);\n\t\t} else {\n\t\t\tCompilationUnitDeclaration_transformationState.set(ast, TransformationState.DIET);\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * This method is called immediately after Eclipse finishes building a CompilationUnitDeclaration, which is\n\t * the top-level AST node when Eclipse parses a source file. The signature is 'magic' - you should not\n\t * change it!\n\t * \n\t * Eclipse's parsers often operate in diet mode, which means many parts of the AST have been left blank.\n\t * Be ready to deal with just about anything being null, such as the Statement[] arrays of the Method AST nodes.\n\t * \n\t * @param parser The Eclipse parser object that generated the AST. Not actually used; mostly there to satisfy parameter rules for lombok.patcher scripts.\n\t * @param ast The AST node belonging to the compilation unit (java speak for a single source file).\n\t */\n\tpublic static void transform(Parser parser, CompilationUnitDeclaration ast) {\n\t\tif (disableLombok) return;\n\t\t\n\t\t// Skip module-info.java\n\t\tchar[] fileName = ast.getFileName();\n\t\tif (fileName != null && String.valueOf(fileName).endsWith(\"module-info.java\")) return;\n\t\t\n\t\tif (Symbols.hasSymbol(\"lombok.disable\")) return;\n\t\t// The IndexingParser only supports a single import statement, restricting lombok annotations to either fully qualified ones or\n\t\t// those specified in the last import statement. To avoid handling hard to reproduce edge cases, we opt to ignore the entire parser.\n\t\tif (\"org.eclipse.jdt.internal.core.search.indexing.IndexingParser\".equals(parser.getClass().getName())) return;\n\t\tif (alreadyTransformed(ast)) return;\n\t\t\n\t\t// Do NOT abort if (ast.bits & ASTNode.HasAllMethodBodies) != 0 - that doesn't work.\n\t\t\n\t\tif (Boolean.TRUE.equals(LombokConfiguration.read(ConfigurationKeys.LOMBOK_DISABLE, EclipseAST.getAbsoluteFileLocation(ast)))) return;\n\t\t\n\t\ttry {\n\t\t\tDebugSnapshotStore.INSTANCE.snapshot(ast, \"transform entry\");\n\t\t\tlong histoToken = lombokTracker == null ? 0L : lombokTracker.start();\n\t\t\tEclipseAST existing = getAST(ast, false);\n\t\t\texisting.setSource(parser.scanner.getSource());\n\t\t\tnew TransformEclipseAST(existing).go();\n\t\t\tif (lombokTracker != null) lombokTracker.end(histoToken);\n\t\t\tDebugSnapshotStore.INSTANCE.snapshot(ast, \"transform exit\");\n\t\t} catch (Throwable t) {\n\t\t\tDebugSnapshotStore.INSTANCE.snapshot(ast, \"transform error: %s\", t.getClass().getSimpleName());\n\t\t\ttry {\n\t\t\t\tString message = \"Lombok can't parse this source: \" + t.toString();\n\t\t\t\t\n\t\t\t\tEclipseAST.addProblemToCompilationResult(ast.getFileName(), ast.compilationResult, false, message, 0, 0);\n\t\t\t\tt.printStackTrace();\n\t\t\t} catch (Throwable t2) {\n\t\t\t\ttry {\n\t\t\t\t\terror(ast, \"Can't create an error in the problems dialog while adding: \" + t.toString(), t2);\n\t\t\t\t} catch (Throwable t3) {\n\t\t\t\t\t//This seems risky to just silently turn off lombok, but if we get this far, something pretty\n\t\t\t\t\t//drastic went wrong. For example, the eclipse help system's JSP compiler will trigger a lombok call,\n\t\t\t\t\t//but due to class loader shenanigans we'll actually get here due to a cascade of\n\t\t\t\t\t//ClassNotFoundErrors. This is the right action for the help system (no lombok needed for that JSP compiler,\n\t\t\t\t\t//of course). 'disableLombok' is static, but each context classloader (e.g. each eclipse OSGi plugin) has\n\t\t\t\t\t//it's own edition of this class, so this won't turn off lombok everywhere.\n\t\t\t\t\tdisableLombok = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic TransformEclipseAST(EclipseAST ast) {\n\t\tthis.ast = ast;\n\t}\n\t\n\t/**\n\t * First handles all lombok annotations except PrintAST, then calls all non-annotation based handlers.\n\t * then handles any PrintASTs.\n\t */\n\tpublic void go() {\n\t\tlong nextPriority = Long.MIN_VALUE;\n\t\tfor (Long d : handlers.getPriorities()) {\n\t\t\tif (nextPriority > d) continue;\n\t\t\tAnnotationVisitor visitor = new AnnotationVisitor(d);\n\t\t\tast.traverse(visitor);\n\t\t\t// if no visitor interested for this AST, nextPriority would be MAX_VALUE and we bail out immediatetly\n\t\t\tnextPriority = visitor.getNextPriority();\n\t\t\tnextPriority = Math.min(nextPriority, handlers.callASTVisitors(ast, d, ast.isCompleteParse()));\n\t\t}\n\t}\n\t\n\tprivate static class AnnotationVisitor extends EclipseASTAdapter {\n\t\tprivate final long priority;\n\t\t// this is the next priority we continue to visit.\n\t\t// Long.MAX_VALUE means never. Each visit method will potentially reduce the next priority\n\t\tprivate long nextPriority = Long.MAX_VALUE;\n\t\t\n\t\tpublic AnnotationVisitor(long priority) {\n\t\t\tthis.priority = priority;\n\t\t}\n\t\t\n\t\tpublic long getNextPriority() {\n\t\t\treturn nextPriority;\n\t\t}\n\t\t\n\t\t@Override public void visitAnnotationOnField(FieldDeclaration field, EclipseNode annotationNode, Annotation annotation) {\n\t\t\tCompilationUnitDeclaration top = (CompilationUnitDeclaration) annotationNode.top().get();\n\t\t\tnextPriority = Math.min(nextPriority, handlers.handleAnnotation(top, annotationNode, annotation, priority));\n\t\t}\n\t\t\n\t\t@Override public void visitAnnotationOnMethodArgument(Argument arg, AbstractMethodDeclaration method, EclipseNode annotationNode, Annotation annotation) {\n\t\t\tCompilationUnitDeclaration top = (CompilationUnitDeclaration) annotationNode.top().get();\n\t\t\tnextPriority = Math.min(nextPriority, handlers.handleAnnotation(top, annotationNode, annotation, priority));\n\t\t}\n\t\t\n\t\t@Override public void visitAnnotationOnLocal(LocalDeclaration local, EclipseNode annotationNode, Annotation annotation) {\n\t\t\tCompilationUnitDeclaration top = (CompilationUnitDeclaration) annotationNode.top().get();\n\t\t\tnextPriority = Math.min(nextPriority, handlers.handleAnnotation(top, annotationNode, annotation, priority));\n\t\t}\n\t\t\n\t\t@Override public void visitAnnotationOnMethod(AbstractMethodDeclaration method, EclipseNode annotationNode, Annotation annotation) {\n\t\t\tCompilationUnitDeclaration top = (CompilationUnitDeclaration) annotationNode.top().get();\n\t\t\tnextPriority = Math.min(nextPriority, handlers.handleAnnotation(top, annotationNode, annotation, priority));\n\t\t}\n\t\t\n\t\t@Override public void visitAnnotationOnType(TypeDeclaration type, EclipseNode annotationNode, Annotation annotation) {\n\t\t\tCompilationUnitDeclaration top = (CompilationUnitDeclaration) annotationNode.top().get();\n\t\t\tnextPriority = Math.min(nextPriority, handlers.handleAnnotation(top, annotationNode, annotation, priority));\n\t\t}\n\t\t\n\t\t@Override public void visitAnnotationOnTypeUse(TypeReference typeUse, EclipseNode annotationNode, Annotation annotation) {\n\t\t\tCompilationUnitDeclaration top = (CompilationUnitDeclaration) annotationNode.top().get();\n\t\t\tnextPriority = Math.min(nextPriority, handlers.handleAnnotation(top, annotationNode, annotation, priority));\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/TransformationState.java",
    "content": "/*\n * Copyright (C) 2023 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse;\n\nenum TransformationState {\n\tDIET,\n\tFULL\n}"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java",
    "content": "/*\n * Copyright (C) 2009-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.eclipse.EcjAugments.*;\nimport static lombok.eclipse.Eclipse.*;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.EclipseReflectiveMembers.*;\n\nimport java.lang.reflect.Array;\nimport java.lang.reflect.Constructor;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\nimport java.lang.reflect.Modifier;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\nimport org.eclipse.jdt.core.compiler.CharOperation;\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.AllocationExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.Argument;\nimport org.eclipse.jdt.internal.compiler.ast.ArrayInitializer;\nimport org.eclipse.jdt.internal.compiler.ast.ArrayQualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.ArrayTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.AssertStatement;\nimport org.eclipse.jdt.internal.compiler.ast.BinaryExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Block;\nimport org.eclipse.jdt.internal.compiler.ast.CastExpression;\nimport org.eclipse.jdt.internal.compiler.ast.CharLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.ClassLiteralAccess;\nimport org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.DoubleLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.EqualExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.FalseLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.FieldReference;\nimport org.eclipse.jdt.internal.compiler.ast.FloatLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.IfStatement;\nimport org.eclipse.jdt.internal.compiler.ast.IntLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.Literal;\nimport org.eclipse.jdt.internal.compiler.ast.LongLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.MarkerAnnotation;\nimport org.eclipse.jdt.internal.compiler.ast.MemberValuePair;\nimport org.eclipse.jdt.internal.compiler.ast.MessageSend;\nimport org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.NameReference;\nimport org.eclipse.jdt.internal.compiler.ast.NormalAnnotation;\nimport org.eclipse.jdt.internal.compiler.ast.NullLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.OperatorIds;\nimport org.eclipse.jdt.internal.compiler.ast.ParameterizedQualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.ParameterizedSingleTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.SingleMemberAnnotation;\nimport org.eclipse.jdt.internal.compiler.ast.SingleNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.SingleTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.StringLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.ThisReference;\nimport org.eclipse.jdt.internal.compiler.ast.ThrowStatement;\nimport org.eclipse.jdt.internal.compiler.ast.TrueLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.TypeParameter;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.Wildcard;\nimport org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;\nimport org.eclipse.jdt.internal.compiler.env.ICompilationUnit;\nimport org.eclipse.jdt.internal.compiler.lookup.Binding;\nimport org.eclipse.jdt.internal.compiler.lookup.CaptureBinding;\nimport org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding;\nimport org.eclipse.jdt.internal.compiler.lookup.RawTypeBinding;\nimport org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeBinding;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeConstants;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeIds;\nimport org.eclipse.jdt.internal.compiler.lookup.WildcardBinding;\n\nimport lombok.AccessLevel;\nimport lombok.ConfigurationKeys;\nimport lombok.Data;\nimport lombok.Getter;\nimport lombok.Lombok;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.core.AnnotationValues.AnnotationValue;\nimport lombok.core.LombokImmutableList;\nimport lombok.core.TypeResolver;\nimport lombok.core.configuration.CheckerFrameworkVersion;\nimport lombok.core.configuration.NullAnnotationLibrary;\nimport lombok.core.configuration.NullCheckExceptionType;\nimport lombok.core.configuration.TypeName;\nimport lombok.core.debug.ProblemReporter;\nimport lombok.core.handlers.HandlerUtil;\nimport lombok.core.handlers.HandlerUtil.FieldAccess;\nimport lombok.core.handlers.HandlerUtil.JavadocTag;\nimport lombok.eclipse.EcjAugments;\nimport lombok.eclipse.Eclipse;\nimport lombok.eclipse.EclipseAST;\nimport lombok.eclipse.EclipseNode;\nimport lombok.experimental.Accessors;\nimport lombok.experimental.Tolerate;\nimport lombok.permit.Permit;\n\n/**\n * Container for static utility methods useful to handlers written for eclipse.\n */\npublic class EclipseHandlerUtil {\n\tprivate EclipseHandlerUtil() {\n\t\t//Prevent instantiation\n\t}\n\t\n\t/**\n\t * Generates an error in the Eclipse error log. Note that most people never look at it!\n\t * \n\t * @param cud The {@code CompilationUnitDeclaration} where the error occurred.\n\t *     An error will be generated on line 0 linking to the error log entry. Can be {@code null}.\n\t * @param message Human readable description of the problem.\n\t * @param ex The associated exception. Can be {@code null}.\n\t */\n\tpublic static void error(CompilationUnitDeclaration cud, String message, Throwable ex) {\n\t\tProblemReporter.error(message, ex);\n\t\tif (cud != null) EclipseAST.addProblemToCompilationResult(cud.getFileName(), cud.compilationResult, false, message + \" - See error log.\", 0, 0);\n\t}\n\t\n\t/**\n\t * Generates a warning in the Eclipse error log. Note that most people never look at it!\n\t * \n\t * @param message Human readable description of the problem.\n\t * @param ex The associated exception. Can be {@code null}.\n\t */\n\tpublic static void warning(String message, Throwable ex) {\n\t\tProblemReporter.warning(message, ex);\n\t}\n\t\n\tpublic static ASTNode getGeneratedBy(ASTNode node) {\n\t\treturn ASTNode_generatedBy.get(node);\n\t}\n\t\n\tpublic static boolean isGenerated(ASTNode node) {\n\t\treturn getGeneratedBy(node) != null;\n\t}\n\t\n\tpublic static <T extends ASTNode> T setGeneratedBy(T node, ASTNode source) {\n\t\tASTNode_generatedBy.set(node, source);\n\t\treturn node;\n\t}\n\t\n\tpublic static MarkerAnnotation generateDeprecatedAnnotation(ASTNode source) {\n\t\tQualifiedTypeReference qtr = new QualifiedTypeReference(new char[][] {\n\t\t\t\t{'j', 'a', 'v', 'a'}, {'l', 'a', 'n', 'g'}, {'D', 'e', 'p', 'r', 'e', 'c', 'a', 't', 'e', 'd'}}, poss(source, 3));\n\t\tsetGeneratedBy(qtr, source);\n\t\tMarkerAnnotation ma = new MarkerAnnotation(qtr, source.sourceStart);\n\t\t// No matter what value you input for sourceEnd, the AST->DOM converter of eclipse will reparse to find the end, and will fail as\n\t\t// it can't find code that isn't really there. This results in the end position being set to 2 or 0 or some weird magic value, and thus,\n\t\t// length, as calculated by end-start, is all screwed up, resulting in IllegalArgumentException during a setSourceRange call MUCH later in the process.\n\t\t// We solve it by going with a voodoo magic source start value such that the calculated length so happens to exactly be 0. 0 lengths are accepted\n\t\t// by eclipse. For some reason.\n\t\t// TL;DR: Don't change 1. 1 is sacred. Trust the 1.\n\t\t// issue: #408.\n\t\tma.sourceStart = 1;\n\t\tsetGeneratedBy(ma, source);\n\t\treturn ma;\n\t}\n\t\n\tpublic static MarkerAnnotation generateNamedAnnotation(ASTNode source, String typeName) {\n\t\tchar[][] cc = fromQualifiedName(typeName);\n\t\tQualifiedTypeReference qtr = new QualifiedTypeReference(cc, poss(source, cc.length));\n\t\tsetGeneratedBy(qtr, source);\n\t\tMarkerAnnotation ma = new MarkerAnnotation(qtr, source.sourceStart);\n\t\t// No matter what value you input for sourceEnd, the AST->DOM converter of eclipse will reparse to find the end, and will fail as\n\t\t// it can't find code that isn't really there. This results in the end position being set to 2 or 0 or some weird magic value, and thus,\n\t\t// length, as calculated by end-start, is all screwed up, resulting in IllegalArgumentException during a setSourceRange call MUCH later in the process.\n\t\t// We solve it by going with a voodoo magic source start value such that the calculated length so happens to exactly be 0. 0 lengths are accepted\n\t\t// by eclipse. For some reason.\n\t\t// TL;DR: Don't change 1. 1 is sacred. Trust the 1.\n\t\t// issue: #408.\n\t\tma.sourceStart = 1;\n\t\tsetGeneratedBy(ma, source);\n\t\treturn ma;\n\t}\n\t\n\tpublic static boolean isFieldDeprecated(EclipseNode fieldNode) {\n\t\tif (!(fieldNode.get() instanceof FieldDeclaration)) return false;\n\t\tFieldDeclaration field = (FieldDeclaration) fieldNode.get();\n\t\tif ((field.modifiers & ClassFileConstants.AccDeprecated) != 0) {\n\t\t\treturn true;\n\t\t}\n\t\tif (field.annotations == null) return false;\n\t\tfor (Annotation annotation : field.annotations) {\n\t\t\tif (typeMatches(Deprecated.class, fieldNode, annotation.type)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t\n\tpublic static CheckerFrameworkVersion getCheckerFrameworkVersion(EclipseNode node) {\n\t\tCheckerFrameworkVersion cfv = node.getAst().readConfiguration(ConfigurationKeys.CHECKER_FRAMEWORK);\n\t\treturn cfv != null ? cfv : CheckerFrameworkVersion.NONE;\n\t}\n\t\n\t/**\n\t * Checks if the given TypeReference node is likely to be a reference to the provided class.\n\t * \n\t * @param type An actual type. This method checks if {@code typeNode} is likely to be a reference to this type.\n\t * @param node A Lombok AST node. Any node in the appropriate compilation unit will do (used to get access to import statements).\n\t * @param typeRef A type reference to check.\n\t */\n\tpublic static boolean typeMatches(Class<?> type, EclipseNode node, TypeReference typeRef) {\n\t\treturn typeMatches(type.getName(), node, typeRef);\n\t}\n\t\n\t/**\n\t * Checks if the given TypeReference node is likely to be a reference to the provided class.\n\t * \n\t * @param type An actual type. This method checks if {@code typeNode} is likely to be a reference to this type.\n\t * @param node A Lombok AST node. Any node in the appropriate compilation unit will do (used to get access to import statements).\n\t * @param typeRef A type reference to check.\n\t */\n\tpublic static boolean typeMatches(String type, EclipseNode node, TypeReference typeRef) {\n\t\tchar[][] tn = typeRef == null ? null : typeRef.getTypeName();\n\t\tif (tn == null || tn.length == 0) return false;\n\t\tchar[] lastPartA = tn[tn.length - 1];\n\t\tint lastIndex = Math.max(type.lastIndexOf('.'), type.lastIndexOf('$')) + 1;\n\t\tif (lastPartA.length != type.length() - lastIndex) return false;\n\t\tfor (int i = 0; i < lastPartA.length; i++) if (lastPartA[i] != type.charAt(i + lastIndex)) return false;\n\t\tString typeName = toQualifiedName(tn);\n\t\tTypeResolver resolver = node.getImportListAsTypeResolver();\n\t\treturn resolver.typeMatches(node, type, typeName);\n\t}\n\t\n\tpublic static void sanityCheckForMethodGeneratingAnnotationsOnBuilderClass(EclipseNode typeNode, EclipseNode errorNode) {\n\t\tList<String> disallowed = null;\n\t\tfor (EclipseNode child : typeNode.down()) {\n\t\t\tif (child.getKind() != Kind.ANNOTATION) continue;\n\t\t\tfor (String annType : INVALID_ON_BUILDERS) {\n\t\t\t\tif (annotationTypeMatches(annType, child)) {\n\t\t\t\t\tif (disallowed == null) disallowed = new ArrayList<String>();\n\t\t\t\t\tint lastIndex = annType.lastIndexOf('.');\n\t\t\t\t\tdisallowed.add(lastIndex == -1 ? annType : annType.substring(lastIndex + 1));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tint size = disallowed == null ? 0 : disallowed.size();\n\t\tif (size == 0) return;\n\t\tif (size == 1) {\n\t\t\terrorNode.addError(\"@\" + disallowed.get(0) + \" is not allowed on builder classes.\");\n\t\t\treturn;\n\t\t}\n\t\tStringBuilder out = new StringBuilder();\n\t\tfor (String a : disallowed) out.append(\"@\").append(a).append(\", \");\n\t\tout.setLength(out.length() - 2);\n\t\terrorNode.addError(out.append(\" are not allowed on builder classes.\").toString());\n\t}\n\t\n\tpublic static Annotation copyAnnotation(Annotation annotation, ASTNode source) {\n\t\tint pS = source.sourceStart, pE = source.sourceEnd;\n\t\t\n\t\tif (annotation instanceof MarkerAnnotation) {\n\t\t\tMarkerAnnotation ann = new MarkerAnnotation(copyType(annotation.type, source), pS);\n\t\t\tsetGeneratedBy(ann, source);\n\t\t\tann.declarationSourceEnd = ann.sourceEnd = ann.statementEnd = pE;\n\t\t\tcopyMemberValuePairName(ann, annotation);\n\t\t\treturn ann;\n\t\t}\n\t\t\n\t\tif (annotation instanceof SingleMemberAnnotation) {\n\t\t\tSingleMemberAnnotation ann = new SingleMemberAnnotation(copyType(annotation.type, source), pS);\n\t\t\tsetGeneratedBy(ann, source);\n\t\t\tann.declarationSourceEnd = ann.sourceEnd = ann.statementEnd = pE;\n\t\t\tann.memberValue = copyAnnotationMemberValue(((SingleMemberAnnotation) annotation).memberValue);\n\t\t\tcopyMemberValuePairName(ann, annotation);\n\t\t\treturn ann;\n\t\t}\n\t\t\n\t\tif (annotation instanceof NormalAnnotation) {\n\t\t\tNormalAnnotation ann = new NormalAnnotation(copyType(annotation.type, source), pS);\n\t\t\tsetGeneratedBy(ann, source);\n\t\t\tann.declarationSourceEnd = ann.statementEnd = ann.sourceEnd = pE;\n\t\t\tMemberValuePair[] inPairs = ((NormalAnnotation) annotation).memberValuePairs;\n\t\t\tif (inPairs == null) {\n\t\t\t\tann.memberValuePairs = null;\n\t\t\t} else {\n\t\t\t\tann.memberValuePairs = new MemberValuePair[inPairs.length];\n\t\t\t\tfor (int i = 0; i < inPairs.length; i++) ann.memberValuePairs[i] =\n\t\t\t\t\t\tnew MemberValuePair(inPairs[i].name, inPairs[i].sourceStart, inPairs[i].sourceEnd, copyAnnotationMemberValue(inPairs[i].value));\n\t\t\t}\n\t\t\tcopyMemberValuePairName(ann, annotation);\n\t\t\treturn ann;\n\t\t}\n\t\t\n\t\treturn annotation;\n\t}\n\t\n\tprivate static void copyMemberValuePairName(Annotation source, Annotation target) {\n\t\tif (ANNOTATION__MEMBER_VALUE_PAIR_NAME == null) return;\n\t\t\n\t\ttry {\n\t\t\treflectSet(ANNOTATION__MEMBER_VALUE_PAIR_NAME, source, reflect(ANNOTATION__MEMBER_VALUE_PAIR_NAME, target));\n\t\t} catch (Exception ignore) { /* Various eclipse versions don't have it */ }\n\t}\n\t\n\tstatic class EclipseReflectiveMembers {\n\t\tpublic static final Field STRING_LITERAL__LINE_NUMBER;\n\t\tpublic static final Field ANNOTATION__MEMBER_VALUE_PAIR_NAME;\n\t\tpublic static final Field TYPE_REFERENCE__ANNOTATIONS;\n\t\tpublic static final Class<?> INTERSECTION_BINDING1, INTERSECTION_BINDING2;\n\t\tpublic static final Field INTERSECTION_BINDING_TYPES1, INTERSECTION_BINDING_TYPES2;\n\t\tpublic static final Field TYPE_DECLARATION_RECORD_COMPONENTS;\n\t\tpublic static final Class<?> COMPILATION_UNIT;\n\t\tpublic static final Method COMPILATION_UNIT_ORIGINAL_FROM_CLONE;\n\t\tstatic {\n\t\t\tSTRING_LITERAL__LINE_NUMBER = getField(StringLiteral.class, \"lineNumber\");\n\t\t\tANNOTATION__MEMBER_VALUE_PAIR_NAME = getField(Annotation.class, \"memberValuePairName\");\n\t\t\tTYPE_REFERENCE__ANNOTATIONS = getField(TypeReference.class, \"annotations\");\n\t\t\tINTERSECTION_BINDING1 = getClass(\"org.eclipse.jdt.internal.compiler.lookup.IntersectionTypeBinding18\");\n\t\t\tINTERSECTION_BINDING2 = getClass(\"org.eclipse.jdt.internal.compiler.lookup.IntersectionCastTypeBinding\");\n\t\t\tINTERSECTION_BINDING_TYPES1 = INTERSECTION_BINDING1 == null ? null : getField(INTERSECTION_BINDING1, \"intersectingTypes\");\n\t\t\tINTERSECTION_BINDING_TYPES2 = INTERSECTION_BINDING2 == null ? null : getField(INTERSECTION_BINDING2, \"intersectingTypes\");\n\t\t\tTYPE_DECLARATION_RECORD_COMPONENTS = getField(TypeDeclaration.class, \"recordComponents\");\n\t\t\tCOMPILATION_UNIT = getClass(\"org.eclipse.jdt.internal.core.CompilationUnit\");\n\t\t\tCOMPILATION_UNIT_ORIGINAL_FROM_CLONE = COMPILATION_UNIT == null ? null : Permit.permissiveGetMethod(COMPILATION_UNIT, \"originalFromClone\");\n\t\t}\n\t\t\n\t\tpublic static int reflectInt(Field f, Object o) {\n\t\t\ttry {\n\t\t\t\treturn ((Number) f.get(o)).intValue();\n\t\t\t} catch (IllegalAccessException e) {\n\t\t\t\tthrow new RuntimeException(e);\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic static void reflectSet(Field f, Object o, Object v) {\n\t\t\ttry {\n\t\t\t\tf.set(o, v);\n\t\t\t} catch (IllegalAccessException e) {\n\t\t\t\tthrow new RuntimeException(e);\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic static Object reflect(Field f, Object o) {\n\t\t\ttry {\n\t\t\t\treturn f.get(o);\n\t\t\t} catch (IllegalAccessException e) {\n\t\t\t\tthrow new RuntimeException(e);\n\t\t\t}\n\t\t}\n\t\t\n\t\tprivate static Class<?> getClass(String fqn) {\n\t\t\ttry {\n\t\t\t\treturn Class.forName(fqn);\n\t\t\t} catch (Throwable t) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\t\n\t\tprivate static Field getField(Class<?> c, String fName) {\n\t\t\ttry {\n\t\t\t\treturn Permit.getField(c, fName);\n\t\t\t} catch (Throwable t) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic static Expression copyAnnotationMemberValue(Expression in) {\n\t\tExpression out = copyAnnotationMemberValue0(in);\n\t\tout.constant = in.constant;\n\t\treturn out;\n\t}\n\t\n\tprivate static Expression copyAnnotationMemberValue0(Expression in) {\n\t\tint s = in.sourceStart, e = in.sourceEnd;\n\t\t\n\t\t// literals\n\t\t\n\t\tif (in instanceof FalseLiteral) return new FalseLiteral(s, e);\n\t\tif (in instanceof TrueLiteral) return new TrueLiteral(s, e);\n\t\tif (in instanceof NullLiteral) return new NullLiteral(s, e);\n\t\t\n\t\tif (in instanceof CharLiteral) return new CharLiteral(((Literal) in).source(), s, e);\n\t\tif (in instanceof DoubleLiteral) return new DoubleLiteral(((Literal) in).source(), s, e);\n\t\tif (in instanceof FloatLiteral) return new FloatLiteral(((Literal) in).source(), s, e);\n\t\tif (in instanceof IntLiteral) return IntLiteral.buildIntLiteral(((Literal) in).source(), s, e);\n\t\tif (in instanceof LongLiteral) return LongLiteral.buildLongLiteral(((Literal) in).source(), s, e);\n\t\t\n\t\tif (in instanceof StringLiteral) return new StringLiteral(((Literal) in).source(), s, e, reflectInt(STRING_LITERAL__LINE_NUMBER, in) + 1);\n\t\t\n\t\t// enums and field accesses (as long as those are references to compile time constant literals that's also acceptable)\n\t\t\n\t\tif (in instanceof SingleNameReference) {\n\t\t\tSingleNameReference snr = (SingleNameReference) in;\n\t\t\treturn new SingleNameReference(snr.token, pos(in));\n\t\t}\n\t\tif (in instanceof QualifiedNameReference) {\n\t\t\tQualifiedNameReference qnr = (QualifiedNameReference) in;\n\t\t\treturn new QualifiedNameReference(qnr.tokens, poss(in, qnr.tokens.length), s, e);\n\t\t}\n\t\t\n\t\t// class refs\n\t\tif (in instanceof ClassLiteralAccess) return new ClassLiteralAccess(e, copyType(((ClassLiteralAccess) in).type));\n\t\t\n\t\t// arrays\n\t\tif (in instanceof ArrayInitializer) {\n\t\t\tArrayInitializer out = new ArrayInitializer();\n\t\t\tout.sourceStart = s;\n\t\t\tout.sourceEnd = e;\n\t\t\tout.bits = in.bits;\n\t\t\tout.implicitConversion = in.implicitConversion;\n\t\t\tout.statementEnd = e;\n\t\t\tExpression[] exprs = ((ArrayInitializer) in).expressions;\n\t\t\tif (exprs != null) {\n\t\t\t\tExpression[] copy = new Expression[exprs.length];\n\t\t\t\tfor (int i = 0; i < exprs.length; i++) copy[i] = copyAnnotationMemberValue(exprs[i]);\n\t\t\t\tout.expressions = copy;\n\t\t\t}\n\t\t\treturn out;\n\t\t}\n\t\t\n\t\tif (in instanceof BinaryExpression) {\n\t\t\tBinaryExpression be = (BinaryExpression) in;\n\t\t\tBinaryExpression out = new BinaryExpression(be);\n\t\t\tout.left = copyAnnotationMemberValue(be.left);\n\t\t\tout.right = copyAnnotationMemberValue(be.right);\n\t\t\tout.sourceStart = s;\n\t\t\tout.sourceEnd = e;\n\t\t\tout.statementEnd = e;\n\t\t\treturn out;\n\t\t}\n\t\t\n\t\treturn in;\n\t}\n\t\n\t/**\n\t * You can't share TypeParameter objects or bad things happen; for example, one 'T' resolves differently\n\t * from another 'T', even for the same T in a single class file. Unfortunately the TypeParameter type hierarchy\n\t * is complicated and there's no clone method on TypeParameter itself. This method can clone them.\n\t */\n\tpublic static TypeParameter[] copyTypeParams(TypeParameter[] params, ASTNode source) {\n\t\tif (params == null) return null;\n\t\tTypeParameter[] out = new TypeParameter[params.length];\n\t\tint idx = 0;\n\t\tfor (TypeParameter param : params) {\n\t\t\tTypeParameter o = new TypeParameter();\n\t\t\tsetGeneratedBy(o, source);\n\t\t\to.annotations = param.annotations;\n\t\t\to.bits = param.bits;\n\t\t\to.modifiers = param.modifiers;\n\t\t\to.name = param.name;\n\t\t\to.type = copyType(param.type, source);\n\t\t\to.sourceStart = param.sourceStart;\n\t\t\to.sourceEnd = param.sourceEnd;\n\t\t\to.declarationEnd = param.declarationEnd;\n\t\t\to.declarationSourceStart = param.declarationSourceStart;\n\t\t\to.declarationSourceEnd = param.declarationSourceEnd;\n\t\t\tif (param.bounds != null) {\n\t\t\t\tTypeReference[] b = new TypeReference[param.bounds.length];\n\t\t\t\tint idx2 = 0;\n\t\t\t\tfor (TypeReference ref : param.bounds) b[idx2++] = copyType(ref, source);\n\t\t\t\to.bounds = b;\n\t\t\t}\n\t\t\tout[idx++] = o;\n\t\t}\n\t\treturn out;\n\t}\n\t\n\tpublic static Annotation[] getTypeUseAnnotations(TypeReference from) {\n\t\tAnnotation[][] a;\n\t\ttry {\n\t\t\ta = (Annotation[][]) reflect(TYPE_REFERENCE__ANNOTATIONS, from);\n\t\t} catch (Exception e) {\n\t\t\treturn null;\n\t\t}\n\t\tif (a == null) return null;\n\t\tAnnotation[] b = a[a.length - 1];\n\t\treturn b.length == 0 ? null : b;\n\t}\n\t\n\tpublic static void removeTypeUseAnnotations(TypeReference from) {\n\t\ttry {\n\t\t\treflectSet(TYPE_REFERENCE__ANNOTATIONS, from, null);\n\t\t} catch (Exception ignore) {}\n\t}\n\t\n\tpublic static TypeReference namePlusTypeParamsToTypeReference(EclipseNode type, TypeParameter[] params, long p) {\n\t\tTypeDeclaration td = (TypeDeclaration) type.get();\n\t\tboolean instance = (td.modifiers & MODIFIERS_INDICATING_STATIC) == 0;\n\t\treturn namePlusTypeParamsToTypeReference(type.up(), td.name, instance, params, p);\n\t}\n\t\n\tpublic static TypeReference namePlusTypeParamsToTypeReference(EclipseNode parentType, char[] typeName, boolean instance, TypeParameter[] params, long p) {\n\t\tif (params != null && params.length > 0) {\n\t\t\tTypeReference[] refs = new TypeReference[params.length];\n\t\t\tint idx = 0;\n\t\t\tfor (TypeParameter param : params) {\n\t\t\t\tTypeReference typeRef = new SingleTypeReference(param.name, p);\n\t\t\t\trefs[idx++] = typeRef;\n\t\t\t}\n\t\t\treturn generateParameterizedTypeReference(parentType, typeName, instance, refs, p);\n\t\t}\n\t\t\n\t\treturn generateTypeReference(parentType, typeName, instance, p);\n\t}\n\t\n\tpublic static TypeReference[] copyTypes(TypeReference[] refs) {\n\t\treturn copyTypes(refs, null);\n\t}\n\t\n\t/**\n\t * Convenience method that creates a new array and copies each TypeReference in the source array via\n\t * {@link #copyType(TypeReference, ASTNode)}.\n\t */\n\tpublic static TypeReference[] copyTypes(TypeReference[] refs, ASTNode source) {\n\t\tif (refs == null) return null;\n\t\tTypeReference[] outs = new TypeReference[refs.length];\n\t\tint idx = 0;\n\t\tfor (TypeReference ref : refs) {\n\t\t\touts[idx++] = copyType(ref, source);\n\t\t}\n\t\treturn outs;\n\t}\n\t\n\tpublic static TypeReference copyType(TypeReference ref) {\n\t\treturn copyType(ref, null);\n\t}\n\t\n\t/**\n\t * You can't share TypeReference objects or subtle errors start happening.\n\t * Unfortunately the TypeReference type hierarchy is complicated and there's no clone\n\t * method on TypeReference itself. This method can clone them.\n\t */\n\tpublic static TypeReference copyType(TypeReference ref, ASTNode source) {\n\t\tif (ref instanceof ParameterizedQualifiedTypeReference) {\n\t\t\tParameterizedQualifiedTypeReference iRef = (ParameterizedQualifiedTypeReference) ref;\n\t\t\tTypeReference[][] args = null;\n\t\t\tif (iRef.typeArguments != null) {\n\t\t\t\targs = new TypeReference[iRef.typeArguments.length][];\n\t\t\t\tint idx = 0;\n\t\t\t\tfor (TypeReference[] inRefArray : iRef.typeArguments) {\n\t\t\t\t\tif (inRefArray == null) args[idx++] = null;\n\t\t\t\t\telse {\n\t\t\t\t\t\tTypeReference[] outRefArray = new TypeReference[inRefArray.length];\n\t\t\t\t\t\tint idx2 = 0;\n\t\t\t\t\t\tfor (TypeReference inRef : inRefArray) {\n\t\t\t\t\t\t\toutRefArray[idx2++] = copyType(inRef, source);\n\t\t\t\t\t\t}\n\t\t\t\t\t\targs[idx++] = outRefArray;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tTypeReference typeRef = new ParameterizedQualifiedTypeReference(iRef.tokens, args, iRef.dimensions(), copy(iRef.sourcePositions));\n\t\t\tcopyTypeAnns(ref, typeRef);\n\t\t\tif (source != null) setGeneratedBy(typeRef, source);\n\t\t\treturn typeRef;\n\t\t}\n\t\t\n\t\tif (ref instanceof ArrayQualifiedTypeReference) {\n\t\t\tArrayQualifiedTypeReference iRef = (ArrayQualifiedTypeReference) ref;\n\t\t\tTypeReference typeRef = new ArrayQualifiedTypeReference(iRef.tokens, iRef.dimensions(), copy(iRef.sourcePositions));\n\t\t\tcopyTypeAnns(ref, typeRef);\n\t\t\tif (source != null) setGeneratedBy(typeRef, source);\n\t\t\treturn typeRef;\n\t\t}\n\t\t\n\t\tif (ref instanceof QualifiedTypeReference) {\n\t\t\tQualifiedTypeReference iRef = (QualifiedTypeReference) ref;\n\t\t\tTypeReference typeRef = new QualifiedTypeReference(iRef.tokens, copy(iRef.sourcePositions));\n\t\t\tcopyTypeAnns(ref, typeRef);\n\t\t\tif (source != null) setGeneratedBy(typeRef, source);\n\t\t\treturn typeRef;\n\t\t}\n\t\t\n\t\tif (ref instanceof ParameterizedSingleTypeReference) {\n\t\t\tParameterizedSingleTypeReference iRef = (ParameterizedSingleTypeReference) ref;\n\t\t\tTypeReference[] args = null;\n\t\t\tif (iRef.typeArguments != null) {\n\t\t\t\targs = new TypeReference[iRef.typeArguments.length];\n\t\t\t\tint idx = 0;\n\t\t\t\tfor (TypeReference inRef : iRef.typeArguments) {\n\t\t\t\t\tif (inRef == null) args[idx++] = null;\n\t\t\t\t\telse args[idx++] = copyType(inRef, source);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tTypeReference typeRef = new ParameterizedSingleTypeReference(iRef.token, args, iRef.dimensions(), (long) iRef.sourceStart << 32 | iRef.sourceEnd);\n\t\t\tcopyTypeAnns(ref, typeRef);\n\t\t\tif (source != null) setGeneratedBy(typeRef, source);\n\t\t\treturn typeRef;\n\t\t}\n\t\t\n\t\tif (ref instanceof ArrayTypeReference) {\n\t\t\tArrayTypeReference iRef = (ArrayTypeReference) ref;\n\t\t\tTypeReference typeRef = new ArrayTypeReference(iRef.token, iRef.dimensions(), (long) iRef.sourceStart << 32 | iRef.sourceEnd);\n\t\t\tcopyTypeAnns(ref, typeRef);\n\t\t\tif (source != null) setGeneratedBy(typeRef, source);\n\t\t\treturn typeRef;\n\t\t}\n\t\t\n\t\tif (ref instanceof Wildcard) {\n\t\t\tWildcard original = (Wildcard) ref;\n\t\t\t\n\t\t\tWildcard wildcard = new Wildcard(original.kind);\n\t\t\twildcard.sourceStart = original.sourceStart;\n\t\t\twildcard.sourceEnd = original.sourceEnd;\n\t\t\tif (original.bound != null) wildcard.bound = copyType(original.bound, source);\n\t\t\tcopyTypeAnns(ref, wildcard);\n\t\t\tif (source != null) setGeneratedBy(wildcard, source);\n\t\t\treturn wildcard;\n\t\t}\n\t\t\n\t\tif (ref instanceof SingleTypeReference) {\n\t\t\tSingleTypeReference iRef = (SingleTypeReference) ref;\n\t\t\tTypeReference typeRef = new SingleTypeReference(iRef.token, (long) iRef.sourceStart << 32 | iRef.sourceEnd);\n\t\t\tcopyTypeAnns(ref, typeRef);\n\t\t\tif (source != null) setGeneratedBy(typeRef, source);\n\t\t\treturn typeRef;\n\t\t}\n\t\t\n\t\treturn ref;\n\t}\n\t\n\tprivate static void copyTypeAnns(TypeReference in, TypeReference out) {\n\t\tAnnotation[][] a;\n\t\ttry {\n\t\t\ta = (Annotation[][]) reflect(TYPE_REFERENCE__ANNOTATIONS, in);\n\t\t} catch (Exception e) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (a == null) {\n\t\t\treflectSet(TYPE_REFERENCE__ANNOTATIONS, out, null);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tAnnotation[][] b = new Annotation[a.length][];\n\t\tfor (int i = 0; i < a.length; i++) {\n\t\t\tif (a[i] != null) {\n\t\t\t\tb[i] = new Annotation[a[i].length];\n\t\t\t\tfor (int j = 0 ; j < a[i].length; j++) {\n\t\t\t\t\tb[i][j] = copyAnnotation(a[i][j], a[i][j]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treflectSet(TYPE_REFERENCE__ANNOTATIONS, out, b);\n\t}\n\t\n\tpublic static Annotation[] copyAnnotations(ASTNode source, Annotation[]... allAnnotations) {\n\t\tList<Annotation> result = null;\n\t\tfor (Annotation[] annotations : allAnnotations) {\n\t\t\tif (annotations != null) {\n\t\t\t\tfor (Annotation annotation : annotations) {\n\t\t\t\t\tif (result == null) result = new ArrayList<Annotation>();\n\t\t\t\t\tresult.add(copyAnnotation(annotation, source));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn result == null ? null : result.toArray(new Annotation[0]);\n\t}\n\t\n\tpublic static boolean hasAnnotation(Class<? extends java.lang.annotation.Annotation> type, EclipseNode node) {\n\t\tif (node == null) return false;\n\t\tif (type == null) return false;\n\t\tswitch (node.getKind()) {\n\t\tcase ARGUMENT:\n\t\tcase FIELD:\n\t\tcase LOCAL:\n\t\tcase TYPE:\n\t\tcase METHOD:\n\t\t\tfor (EclipseNode child : node.down()) {\n\t\t\t\tif (annotationTypeMatches(type, child)) return true;\n\t\t\t}\n\t\t\t// intentional fallthrough\n\t\tdefault:\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\tpublic static boolean hasAnnotation(String type, EclipseNode node) {\n\t\tif (node == null) return false;\n\t\tif (type == null) return false;\n\t\tswitch (node.getKind()) {\n\t\tcase ARGUMENT:\n\t\tcase FIELD:\n\t\tcase LOCAL:\n\t\tcase TYPE:\n\t\tcase METHOD:\n\t\t\tfor (EclipseNode child : node.down()) {\n\t\t\t\tif (annotationTypeMatches(type, child)) return true;\n\t\t\t}\n\t\t\t// intentional fallthrough\n\t\tdefault:\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\tpublic static EclipseNode findInnerClass(EclipseNode parent, String name) {\n\t\tchar[] c = name.toCharArray();\n\t\tfor (EclipseNode child : parent.down()) {\n\t\t\tif (child.getKind() != Kind.TYPE) continue;\n\t\t\tTypeDeclaration td = (TypeDeclaration) child.get();\n\t\t\tif (Arrays.equals(td.name, c)) return child;\n\t\t}\n\t\treturn null;\n\t}\n\t\n\tpublic static EclipseNode findAnnotation(Class<? extends java.lang.annotation.Annotation> type, EclipseNode node) {\n\t\tif (node == null) return null;\n\t\tif (type == null) return null;\n\t\tswitch (node.getKind()) {\n\t\tcase ARGUMENT:\n\t\tcase FIELD:\n\t\tcase LOCAL:\n\t\tcase TYPE:\n\t\tcase METHOD:\n\t\t\tfor (EclipseNode child : node.down()) {\n\t\t\t\tif (annotationTypeMatches(type, child)) return child;\n\t\t\t}\n\t\t\t// intentional fallthrough\n\t\tdefault:\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic static String scanForNearestAnnotation(EclipseNode node, String... anns) {\n\t\twhile (node != null) {\n\t\t\tfor (EclipseNode ann : node.down()) {\n\t\t\t\tif (ann.getKind() != Kind.ANNOTATION) continue;\n\t\t\t\tAnnotation a = (Annotation) ann.get();\n\t\t\t\tTypeReference aType = a.type;\n\t\t\t\tfor (String annToFind : anns) if (typeMatches(annToFind, node, aType)) return annToFind;\n\t\t\t}\n\t\t\tnode = node.up();\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\t\n\tpublic static boolean hasNonNullAnnotations(EclipseNode node) {\n\t\tfor (EclipseNode child : node.down()) {\n\t\t\tif (child.getKind() != Kind.ANNOTATION) continue;\n\t\t\tAnnotation annotation = (Annotation) child.get();\n\t\t\tfor (String bn : NONNULL_ANNOTATIONS) if (typeMatches(bn, node, annotation.type)) return true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\tpublic static boolean hasNonNullAnnotations(EclipseNode node, List<Annotation> anns) {\n\t\tif (anns == null) return false;\n\t\tfor (Annotation annotation : anns) {\n\t\t\tTypeReference typeRef = annotation.type;\n\t\t\tif (typeRef != null && typeRef.getTypeName() != null) {\n\t\t\t\tfor (String bn : NONNULL_ANNOTATIONS) if (typeMatches(bn, node, typeRef)) return true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t\n\tprivate static final Annotation[] EMPTY_ANNOTATIONS_ARRAY = new Annotation[0];\n\t\n\t/**\n\t * Searches the given field node for annotations and returns each one that is 'copyable' (either via configuration or from the base list).\n\t */\n\tpublic static Annotation[] findCopyableAnnotations(EclipseNode node) {\n\t\tList<Annotation> result = new ArrayList<Annotation>();\n\t\tList<TypeName> configuredCopyable = node.getAst().readConfiguration(ConfigurationKeys.COPYABLE_ANNOTATIONS);\n\t\tfor (EclipseNode child : node.down()) {\n\t\t\tif (child.getKind() != Kind.ANNOTATION) continue;\n\t\t\t\n\t\t\tAnnotation annotation = (Annotation) child.get();\n\t\t\tTypeReference typeRef = annotation.type;\n\t\t\tboolean match = false;\n\t\t\tif (typeRef != null && typeRef.getTypeName() != null) {\n\t\t\t\tfor (TypeName cn : configuredCopyable) if (cn != null && typeMatches(cn.toString(), node, typeRef)) {\n\t\t\t\t\tresult.add(annotation);\n\t\t\t\t\tmatch = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (!match) for (String bn : BASE_COPYABLE_ANNOTATIONS) if (typeMatches(bn, node, typeRef)) {\n\t\t\t\t\tresult.add(annotation);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result.toArray(EMPTY_ANNOTATIONS_ARRAY);\n\t}\n\t\n\t/**\n\t * Searches the given field node for annotations that are specifically intended to be copied to the getter.\n\t * \n\t * @param forceCopyJacksonAnnotations If {@code true}, always copy the annotations regardless of regardless of lombok configuration key {@code lombok.copyJacksonAnnotationsToAccessors}.\n\t */\n\tpublic static Annotation[] findCopyableToGetterAnnotations(EclipseNode node, boolean forceCopyJacksonAnnotations) {\n\t\tif (!forceCopyJacksonAnnotations) {\n\t\t\tBoolean copyAnnotations = node.getAst().readConfiguration(ConfigurationKeys.COPY_JACKSON_ANNOTATIONS_TO_ACCESSORS);\n\t\t\tif (copyAnnotations == null || !copyAnnotations) return EMPTY_ANNOTATIONS_ARRAY;\n\t\t}\n\t\treturn findAnnotationsInList(node, JACKSON_COPY_TO_GETTER_ANNOTATIONS);\n\t}\n\t\n\t/**\n\t * Searches the given field node for annotations that are specifically intended to be copied to the setter.\n\t * \n\t * @param forceCopyJacksonAnnotations If {@code true}, always copy the annotations regardless of regardless of lombok configuration key {@code lombok.copyJacksonAnnotationsToAccessors}.\n\t */\n\tpublic static Annotation[] findCopyableToSetterAnnotations(EclipseNode node, boolean forceCopyJacksonAnnotations) {\n\t\tif (!forceCopyJacksonAnnotations) {\n\t\t\tBoolean copyAnnotations = node.getAst().readConfiguration(ConfigurationKeys.COPY_JACKSON_ANNOTATIONS_TO_ACCESSORS);\n\t\t\tif (copyAnnotations == null || !copyAnnotations) return EMPTY_ANNOTATIONS_ARRAY;\n\t\t}\n\t\treturn findAnnotationsInList(node, JACKSON_COPY_TO_SETTER_ANNOTATIONS);\n\t}\n\t\n\t/**\n\t * Searches the given field node for annotations that are specifically intended to be copied to the builder's singular method.\n\t */\n\tpublic static Annotation[] findCopyableToBuilderSingularSetterAnnotations(EclipseNode node) {\n\t\treturn findAnnotationsInList(node, JACKSON_COPY_TO_BUILDER_SINGULAR_SETTER_ANNOTATIONS);\n\t}\n\t\n\t/**\n\t * Searches the given field node for annotations that are in the given list, and returns those.\n\t */\n\tprivate static Annotation[] findAnnotationsInList(EclipseNode node, java.util.List<String> annotationsToFind) {\n\t\tList<Annotation> result = new ArrayList<Annotation>();\n\t\tfor (EclipseNode child : node.down()) {\n\t\t\tif (child.getKind() != Kind.ANNOTATION) continue;\n\t\t\t\n\t\t\tAnnotation annotation = (Annotation) child.get();\n\t\t\tTypeReference typeRef = annotation.type;\n\t\t\tif (typeRef != null && typeRef.getTypeName() != null) {\n\t\t\t\tfor (String bn : annotationsToFind) if (typeMatches(bn, node, typeRef)) {\n\t\t\t\t\tresult.add(annotation);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result.toArray(EMPTY_ANNOTATIONS_ARRAY);\n\t}\n\t\n\t/**\n\t * Checks if the provided annotation type is likely to be the intended type for the given annotation node.\n\t * \n\t * This is a guess, but a decent one.\n\t */\n\tpublic static boolean annotationTypeMatches(Class<? extends java.lang.annotation.Annotation> type, EclipseNode node) {\n\t\tif (node.getKind() != Kind.ANNOTATION) return false;\n\t\treturn typeMatches(type, node, ((Annotation) node.get()).type);\n\t}\n\t\n\t/**\n\t * Checks if the provided annotation type is likely to be the intended type for the given annotation node.\n\t * \n\t * This is a guess, but a decent one.\n\t */\n\tpublic static boolean annotationTypeMatches(String type, EclipseNode node) {\n\t\tif (node.getKind() != Kind.ANNOTATION) return false;\n\t\treturn typeMatches(type, node, ((Annotation) node.get()).type);\n\t}\n\t\n\tpublic static TypeReference cloneSelfType(EclipseNode context) {\n\t\treturn cloneSelfType(context, null);\n\t}\n\t\n\tpublic static TypeReference cloneSelfType(EclipseNode context, ASTNode source) {\n\t\tint pS = source == null ? 0 : source.sourceStart, pE = source == null ? 0 : source.sourceEnd;\n\t\tlong p = (long) pS << 32 | pE;\n\t\tEclipseNode type = context;\n\t\tTypeReference result = null;\n\t\twhile (type != null && type.getKind() != Kind.TYPE) type = type.up();\n\t\tif (type != null && type.get() instanceof TypeDeclaration) {\n\t\t\tTypeDeclaration typeDecl = (TypeDeclaration) type.get();\n\t\t\tif (typeDecl.typeParameters != null && typeDecl.typeParameters.length > 0) {\n\t\t\t\tTypeReference[] refs = new TypeReference[typeDecl.typeParameters.length];\n\t\t\t\tint idx = 0;\n\t\t\t\tfor (TypeParameter param : typeDecl.typeParameters) {\n\t\t\t\t\tTypeReference typeRef = new SingleTypeReference(param.name, (long)param.sourceStart << 32 | param.sourceEnd);\n\t\t\t\t\tif (source != null) setGeneratedBy(typeRef, source);\n\t\t\t\t\trefs[idx++] = typeRef;\n\t\t\t\t}\n\t\t\t\tresult = generateParameterizedTypeReference(type, refs, p);\n\t\t\t} else {\n\t\t\t\tresult = generateTypeReference(type, p);\n\t\t\t}\n\t\t}\n\t\tif (result != null && source != null) setGeneratedBy(result, source);\n\t\treturn result;\n\t}\n\t\n\tpublic static TypeReference generateParameterizedTypeReference(EclipseNode type, TypeReference[] typeParams, long p) {\n\t\tTypeDeclaration td = (TypeDeclaration) type.get();\n\t\tchar[][] tn = getQualifiedInnerName(type.up(), td.name);\n\t\tif (tn.length == 1) return new ParameterizedSingleTypeReference(tn[0], typeParams, 0, p);\n\t\tint tnLen = tn.length;\n\t\tlong[] ps = new long[tnLen];\n\t\tfor (int i = 0; i < tnLen; i++) ps[i] = p;\n\t\tTypeReference[][] rr = new TypeReference[tnLen][];\n\t\trr[tnLen - 1] = typeParams;\n\t\tboolean instance = (td.modifiers & MODIFIERS_INDICATING_STATIC) == 0;\n\t\tif (instance) fillOuterTypeParams(rr, tnLen - 2, type.up(), p);\n\t\treturn new ParameterizedQualifiedTypeReference(tn, rr, 0, ps);\n\t}\n\t\n\tpublic static TypeReference generateParameterizedTypeReference(EclipseNode parent, char[] name, boolean instance, TypeReference[] typeParams, long p) {\n\t\tchar[][] tn = getQualifiedInnerName(parent, name);\n\t\tif (tn.length == 1) return new ParameterizedSingleTypeReference(tn[0], typeParams, 0, p);\n\t\tint tnLen = tn.length;\n\t\tlong[] ps = new long[tnLen];\n\t\tfor (int i = 0; i < tnLen; i++) ps[i] = p;\n\t\tTypeReference[][] rr = new TypeReference[tnLen][];\n\t\trr[tnLen - 1] = typeParams;\n\t\tif (instance) fillOuterTypeParams(rr, tnLen - 2, parent, p);\n\t\treturn new ParameterizedQualifiedTypeReference(tn, rr, 0, ps);\n\t}\n\t\n\tprivate static final int MODIFIERS_INDICATING_STATIC = ClassFileConstants.AccInterface | ClassFileConstants.AccStatic | ClassFileConstants.AccEnum | Eclipse.AccRecord;\n\t\n\t/**\n\t * This class will add type params to fully qualified chain of type references for inner types, such as {@code GrandParent.Parent.Child}; this is needed only as long as the chain does not involve static.\n\t * \n\t * @return {@code true} if at least one parameterization is actually added, {@code false} otherwise.\n\t */\n\tprivate static boolean fillOuterTypeParams(TypeReference[][] rr, int idx, EclipseNode node, long p) {\n\t\tif (idx < 0 || node == null || !(node.get() instanceof TypeDeclaration)) return false;\n\t\tboolean filled = false;\n\t\tTypeDeclaration td = (TypeDeclaration) node.get();\n\t\tif (0 != (td.modifiers & (ClassFileConstants.AccInterface | ClassFileConstants.AccEnum))) {\n\t\t\t// any class defs inside an enum or interface are static, even if not marked as such.\n\t\t\treturn false;\n\t\t}\n\t\tTypeParameter[] tps = td.typeParameters;\n\t\tif (tps != null && tps.length > 0) {\n\t\t\tTypeReference[] trs = new TypeReference[tps.length];\n\t\t\tfor (int i = 0; i < tps.length; i++) {\n\t\t\t\ttrs[i] = new SingleTypeReference(tps[i].name, p);\n\t\t\t}\n\t\t\trr[idx] = trs;\n\t\t\tfilled = true;\n\t\t}\n\t\t\n\t\tif ((td.modifiers & MODIFIERS_INDICATING_STATIC) != 0) return filled; // Once we hit a static class, no further typeparams needed.\n\t\tboolean f2 = fillOuterTypeParams(rr, idx - 1, node.up(), p);\n\t\treturn f2 || filled;\n\t}\n\t\n\tpublic static NameReference generateNameReference(EclipseNode type, long p) {\n\t\tchar[][] tn = getQualifiedInnerName(type.up(), ((TypeDeclaration) type.get()).name);\n\t\tif (tn.length == 1) return new SingleNameReference(tn[0], p);\n\t\tint tnLen = tn.length;\n\t\tlong[] ps = new long[tnLen];\n\t\tfor (int i = 0; i < tnLen; i++) ps[i] = p;\n\t\tint ss = (int) (p >> 32);\n\t\tint se = (int) p;\n\t\treturn new QualifiedNameReference(tn, ps, ss, se);\n\t}\n\t\n\tpublic static NameReference generateNameReference(EclipseNode parent, char[] name, long p) {\n\t\tchar[][] tn = getQualifiedInnerName(parent, name);\n\t\tif (tn.length == 1) return new SingleNameReference(tn[0], p);\n\t\tint tnLen = tn.length;\n\t\tlong[] ps = new long[tnLen];\n\t\tfor (int i = 0; i < tnLen; i++) ps[i] = p;\n\t\tint ss = (int) (p >> 32);\n\t\tint se = (int) p;\n\t\treturn new QualifiedNameReference(tn, ps, ss, se);\n\t}\n\t\n\tpublic static TypeReference generateTypeReference(EclipseNode type, long p) {\n\t\tTypeDeclaration td = (TypeDeclaration) type.get();\n\t\tchar[][] tn = getQualifiedInnerName(type.up(), td.name);\n\t\tif (tn.length == 1) return new SingleTypeReference(tn[0], p);\n\t\tint tnLen = tn.length;\n\t\tlong[] ps = new long[tnLen];\n\t\tfor (int i = 0; i < tnLen; i++) ps[i] = p;\n\t\t\n\t\t\n\t\tboolean instance = (td.modifiers & MODIFIERS_INDICATING_STATIC) == 0 && type.up() != null && type.up().get() instanceof TypeDeclaration;\n\t\tif (instance) {\n\t\t\tTypeReference[][] trs = new TypeReference[tn.length][];\n\t\t\tboolean filled = fillOuterTypeParams(trs, trs.length - 2, type.up(), p);\n\t\t\tif (filled) return new ParameterizedQualifiedTypeReference(tn, trs, 0, ps);\n\t\t}\n\t\t\n\t\treturn new QualifiedTypeReference(tn, ps);\n\t}\n\t\n\tpublic static TypeReference generateTypeReference(EclipseNode parent, char[] name, boolean instance, long p) {\n\t\tchar[][] tn = getQualifiedInnerName(parent, name);\n\t\tif (tn.length == 1) return new SingleTypeReference(tn[0], p);\n\t\tint tnLen = tn.length;\n\t\tlong[] ps = new long[tnLen];\n\t\tfor (int i = 0; i < tnLen; i++) ps[i] = p;\n\t\t\n\t\tif (instance && parent != null && parent.get() instanceof TypeDeclaration) {\n\t\t\tTypeReference[][] trs = new TypeReference[tn.length][];\n\t\t\tif (fillOuterTypeParams(trs, tn.length - 2, parent, p)) return new ParameterizedQualifiedTypeReference(tn, trs, 0, ps);\n\t\t}\n\t\t\n\t\treturn new QualifiedTypeReference(tn, ps);\n\t}\n\t\n\t/**\n\t * Generate a chain of names for the enclosing classes.\n\t * \n\t * Given for example {@code class Outer { class Inner {} }} this would generate {@code char[][] { \"Outer\", \"Inner\" }}.\n\t * For method local and top level types, this generates a size-1 char[][] where the only char[] element is {@code name} itself.\n\t */\n\tpublic static char[][] getQualifiedInnerName(EclipseNode parent, char[] name) {\n\t\tint count = 0;\n\t\t\n\t\tEclipseNode n = parent;\n\t\twhile (n != null && n.getKind() == Kind.TYPE && n.get() instanceof TypeDeclaration) {\n\t\t\tTypeDeclaration td = (TypeDeclaration) n.get();\n\t\t\tif (td.name == null || td.name.length == 0) break;\n\t\t\tcount++;\n\t\t\tn = n.up();\n\t\t}\n\t\t\n\t\tif (count == 0) return new char[][] { name };\n\t\tchar[][] res = new char[count + 1][];\n\t\tres[count] = name;\n\t\t\n\t\tn = parent;\n\t\twhile (count > 0) {\n\t\t\tTypeDeclaration td = (TypeDeclaration) n.get();\n\t\t\tres[--count] = td.name;\n\t\t\tn = n.up();\n\t\t}\n\t\t\n\t\treturn res;\n\t}\n\t\n\tprivate static final char[] OBJECT_SIG = \"Ljava/lang/Object;\".toCharArray();\n\t\n\tprivate static int compare(char[] a, char[] b) {\n\t\tif (a == null) return b == null ? 0 : -1;\n\t\tif (b == null) return +1;\n\t\tint len = Math.min(a.length, b.length);\n\t\tfor (int i = 0; i < len; i++) {\n\t\t\tif (a[i] < b[i]) return -1;\n\t\t\tif (a[i] > b[i]) return +1;\n\t\t}\n\t\treturn a.length < b.length ? -1 : a.length > b.length ? +1 : 0;\n\t}\n\t\n\tpublic static TypeReference makeType(TypeBinding binding, ASTNode pos, boolean allowCompound) {\n\t\tObject[] arr = null;\n\t\tif (binding.getClass() == EclipseReflectiveMembers.INTERSECTION_BINDING1) {\n\t\t\tarr = (Object[]) EclipseReflectiveMembers.reflect(EclipseReflectiveMembers.INTERSECTION_BINDING_TYPES1, binding);\n\t\t} else if (binding.getClass() == EclipseReflectiveMembers.INTERSECTION_BINDING2) {\n\t\t\tarr = (Object[]) EclipseReflectiveMembers.reflect(EclipseReflectiveMembers.INTERSECTION_BINDING_TYPES2, binding);\n\t\t}\n\t\t\n\t\tif (arr != null) {\n\t\t\t// Is there a class? Alphabetically lowest wins.\n\t\t\tTypeBinding winner = null;\n\t\t\tint winLevel = 0; // 100 = array, 50 = class, 20 = typevar, 15 = wildcard, 10 = interface, 1 = Object.\n\t\t\tfor (Object b : arr) {\n\t\t\t\tif (b instanceof TypeBinding) {\n\t\t\t\t\tTypeBinding tb = (TypeBinding) b;\n\t\t\t\t\tint level = 0;\n\t\t\t\t\tif (tb.isArrayType()) level = 100;\n\t\t\t\t\telse if (tb.isClass()) level = 50;\n\t\t\t\t\telse if (tb.isTypeVariable()) level = 20;\n\t\t\t\t\telse if (tb.isWildcard()) level = 15;\n\t\t\t\t\telse level = 10;\n\t\t\t\t\t\n\t\t\t\t\tif (level == 50 && compare(tb.signature(), OBJECT_SIG) == 0) level = 1;\n\t\t\t\t\t\n\t\t\t\t\tif (winLevel > level) continue;\n\t\t\t\t\tif (winLevel < level) {\n\t\t\t\t\t\twinner = tb;\n\t\t\t\t\t\twinLevel = level;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (compare(winner.signature(), tb.signature()) > 0) winner = tb;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbinding = winner;\n\t\t}\n\t\tint dims = binding.dimensions();\n\t\tbinding = binding.leafComponentType();\n\t\t\n\t\t// Primitives\n\t\t\n\t\tchar[] base = null;\n\t\t\n\t\tswitch (binding.id) {\n\t\tcase TypeIds.T_int:\n\t\t\tbase = TypeConstants.INT;\n\t\t\tbreak;\n\t\tcase TypeIds.T_long:\n\t\t\tbase = TypeConstants.LONG;\n\t\t\tbreak;\n\t\tcase TypeIds.T_short:\n\t\t\tbase = TypeConstants.SHORT;\n\t\t\tbreak;\n\t\tcase TypeIds.T_byte:\n\t\t\tbase = TypeConstants.BYTE;\n\t\t\tbreak;\n\t\tcase TypeIds.T_double:\n\t\t\tbase = TypeConstants.DOUBLE;\n\t\t\tbreak;\n\t\tcase TypeIds.T_float:\n\t\t\tbase = TypeConstants.FLOAT;\n\t\t\tbreak;\n\t\tcase TypeIds.T_boolean:\n\t\t\tbase = TypeConstants.BOOLEAN;\n\t\t\tbreak;\n\t\tcase TypeIds.T_char:\n\t\t\tbase = TypeConstants.CHAR;\n\t\t\tbreak;\n\t\tcase TypeIds.T_void:\n\t\t\tbase = TypeConstants.VOID;\n\t\t\tbreak;\n\t\tcase TypeIds.T_null:\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\tif (base != null) {\n\t\t\tif (dims > 0) {\n\t\t\t\tTypeReference result = new ArrayTypeReference(base, dims, pos(pos));\n\t\t\t\tsetGeneratedBy(result, pos);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tTypeReference result = new SingleTypeReference(base, pos(pos));\n\t\t\tsetGeneratedBy(result, pos);\n\t\t\treturn result;\n\t\t}\n\t\t\n\t\tif (binding.isAnonymousType()) {\n\t\t\tReferenceBinding ref = (ReferenceBinding)binding;\n\t\t\tReferenceBinding[] supers = ref.superInterfaces();\n\t\t\tif (supers == null || supers.length == 0) supers = new ReferenceBinding[] {ref.superclass()};\n\t\t\tif (supers[0] == null) {\n\t\t\t\tTypeReference result = new QualifiedTypeReference(TypeConstants.JAVA_LANG_OBJECT, poss(pos, 3));\n\t\t\t\tsetGeneratedBy(result, pos);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\treturn makeType(supers[0], pos, false);\n\t\t}\n\t\t\n\t\tif (binding instanceof CaptureBinding) {\n\t\t\treturn makeType(((CaptureBinding)binding).wildcard, pos, allowCompound);\n\t\t}\n\t\t\n\t\tif (binding.isUnboundWildcard()) {\n\t\t\tif (!allowCompound) {\n\t\t\t\tTypeReference result = new QualifiedTypeReference(TypeConstants.JAVA_LANG_OBJECT, poss(pos, 3));\n\t\t\t\tsetGeneratedBy(result, pos);\n\t\t\t\treturn result;\n\t\t\t} else {\n\t\t\t\tWildcard out = new Wildcard(Wildcard.UNBOUND);\n\t\t\t\tsetGeneratedBy(out, pos);\n\t\t\t\tout.sourceStart = pos.sourceStart;\n\t\t\t\tout.sourceEnd = pos.sourceEnd;\n\t\t\t\treturn out;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (binding.isWildcard()) {\n\t\t\tWildcardBinding wildcard = (WildcardBinding) binding;\n\t\t\tif (wildcard.boundKind == Wildcard.EXTENDS) {\n\t\t\t\tif (!allowCompound) {\n\t\t\t\t\tTypeBinding bound = wildcard.bound;\n\t\t\t\t\tboolean isObject = bound.id == TypeIds.T_JavaLangObject;\n\t\t\t\t\tTypeBinding[] otherBounds = wildcard.otherBounds;\n\t\t\t\t\tif (isObject && otherBounds != null && otherBounds.length > 0) {\n\t\t\t\t\t\treturn makeType(otherBounds[0], pos, false);\n\t\t\t\t\t} else return makeType(bound, pos, false);\n\t\t\t\t} else {\n\t\t\t\t\tWildcard out = new Wildcard(Wildcard.EXTENDS);\n\t\t\t\t\tsetGeneratedBy(out, pos);\n\t\t\t\t\tout.bound = makeType(wildcard.bound, pos, false);\n\t\t\t\t\tout.sourceStart = pos.sourceStart;\n\t\t\t\t\tout.sourceEnd = pos.sourceEnd;\n\t\t\t\t\treturn out;\n\t\t\t\t}\n\t\t\t} else if (allowCompound && wildcard.boundKind == Wildcard.SUPER) {\n\t\t\t\tWildcard out = new Wildcard(Wildcard.SUPER);\n\t\t\t\tsetGeneratedBy(out, pos);\n\t\t\t\tout.bound = makeType(wildcard.bound, pos, false);\n\t\t\t\tout.sourceStart = pos.sourceStart;\n\t\t\t\tout.sourceEnd = pos.sourceEnd;\n\t\t\t\treturn out;\n\t\t\t} else {\n\t\t\t\tTypeReference result = new QualifiedTypeReference(TypeConstants.JAVA_LANG_OBJECT, poss(pos, 3));\n\t\t\t\tsetGeneratedBy(result, pos);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Keep moving up via 'binding.enclosingType()' and gather generics from each binding. We stop after a local type, or a static type, or a top-level type.\n\t\t// Finally, add however many nullTypeArgument[] arrays as that are missing, inverse the list, toArray it, and use that as PTR's typeArgument argument.\n\t\t\n\t\tList<TypeReference[]> params = new ArrayList<TypeReference[]>();\n\t\t/* Calculate generics */\n\t\tif (!(binding instanceof RawTypeBinding)) {\n\t\t\tTypeBinding b = binding;\n\t\t\twhile (true) {\n\t\t\t\tboolean isFinalStop = b.isLocalType() || !b.isMemberType() || b.enclosingType() == null;\n\t\t\t\t\n\t\t\t\tTypeReference[] tyParams = null;\n\t\t\t\tif (b instanceof ParameterizedTypeBinding) {\n\t\t\t\t\tParameterizedTypeBinding paramized = (ParameterizedTypeBinding) b;\n\t\t\t\t\tif (paramized.arguments != null) {\n\t\t\t\t\t\ttyParams = new TypeReference[paramized.arguments.length];\n\t\t\t\t\t\tfor (int i = 0; i < tyParams.length; i++) {\n\t\t\t\t\t\t\ttyParams[i] = makeType(paramized.arguments[i], pos, true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tparams.add(tyParams);\n\t\t\t\tif (isFinalStop) break;\n\t\t\t\tb = b.enclosingType();\n\t\t\t}\n\t\t}\n\t\t\n\t\tchar[][] parts;\n\t\t\n\t\tif (binding.isTypeVariable()) {\n\t\t\tparts = new char[][] { binding.shortReadableName() };\n\t\t} else if (binding.isLocalType()) {\n\t\t\tparts = new char[][] { binding.sourceName() };\n\t\t} else {\n\t\t\tString[] pkg = new String(binding.qualifiedPackageName()).split(\"\\\\.\");\n\t\t\tString[] name = new String(binding.qualifiedSourceName()).split(\"\\\\.\");\n\t\t\tif (pkg.length == 1 && pkg[0].isEmpty()) pkg = new String[0];\n\t\t\tparts = new char[pkg.length + name.length][];\n\t\t\tint ptr;\n\t\t\tfor (ptr = 0; ptr < pkg.length; ptr++) parts[ptr] = pkg[ptr].toCharArray();\n\t\t\tfor (; ptr < pkg.length + name.length; ptr++) parts[ptr] = name[ptr - pkg.length].toCharArray();\n\t\t}\n\t\t\n\t\twhile (params.size() < parts.length) params.add(null);\n\t\tCollections.reverse(params);\n\t\t\n\t\tboolean isParamized = false;\n\t\t\n\t\tfor (TypeReference[] tyParams : params) {\n\t\t\tif (tyParams != null) {\n\t\t\t\tisParamized = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (isParamized) {\n\t\t\tif (parts.length > 1) {\n\t\t\t\tTypeReference[][] typeArguments = params.toArray(new TypeReference[0][]);\n\t\t\t\tTypeReference result = new ParameterizedQualifiedTypeReference(parts, typeArguments, dims, poss(pos, parts.length));\n\t\t\t\tsetGeneratedBy(result, pos);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tTypeReference result = new ParameterizedSingleTypeReference(parts[0], params.get(0), dims, pos(pos));\n\t\t\tsetGeneratedBy(result, pos);\n\t\t\treturn result;\n\t\t}\n\t\t\n\t\tif (dims > 0) {\n\t\t\tif (parts.length > 1) {\n\t\t\t\tTypeReference result = new ArrayQualifiedTypeReference(parts, dims, poss(pos, parts.length));\n\t\t\t\tsetGeneratedBy(result, pos);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tTypeReference result = new ArrayTypeReference(parts[0], dims, pos(pos));\n\t\t\tsetGeneratedBy(result, pos);\n\t\t\treturn result;\n\t\t}\n\t\t\n\t\tif (parts.length > 1) {\n\t\t\tTypeReference result = new QualifiedTypeReference(parts, poss(pos, parts.length));\n\t\t\tsetGeneratedBy(result, pos);\n\t\t\treturn result;\n\t\t}\n\t\tTypeReference result = new SingleTypeReference(parts[0], pos(pos));\n\t\tsetGeneratedBy(result, pos);\n\t\treturn result;\n\t}\n\t\n\t/**\n\t * Provides AnnotationValues with the data it needs to do its thing.\n\t */\n\tpublic static <A extends java.lang.annotation.Annotation> AnnotationValues<A>\n\t\tcreateAnnotation(Class<A> type, final EclipseNode annotationNode) {\n\t\t\n\t\tfinal Annotation annotation = (Annotation) annotationNode.get();\n\t\tMap<String, AnnotationValue> values = new HashMap<String, AnnotationValue>();\n\t\t\n\t\tMemberValuePair[] memberValuePairs = annotation.memberValuePairs();\n\t\t\n\t\tif (memberValuePairs != null) for (final MemberValuePair pair : memberValuePairs) {\n\t\t\tList<String> raws = new ArrayList<String>();\n\t\t\tList<Object> expressionValues = new ArrayList<Object>();\n\t\t\tList<Object> guesses = new ArrayList<Object>();\n\t\t\tExpression[] expressions = null;\n\t\t\t\n\t\t\tchar[] n = pair.name;\n\t\t\tString mName = (n == null || n.length == 0) ? \"value\" : new String(pair.name);\n\t\t\tfinal Expression rhs = pair.value;\n\t\t\tif (rhs instanceof ArrayInitializer) {\n\t\t\t\texpressions = ((ArrayInitializer) rhs).expressions;\n\t\t\t} else if (rhs != null) {\n\t\t\t\texpressions = new Expression[] { rhs };\n\t\t\t}\n\t\t\tif (expressions != null) for (Expression ex : expressions) {\n\t\t\t\traws.add(ex.toString()); \n\t\t\t\texpressionValues.add(ex);\n\t\t\t\tguesses.add(calculateValue(ex));\n\t\t\t}\n\t\t\t\n\t\t\tfinal Expression[] exprs = expressions;\n\t\t\tvalues.put(mName, new AnnotationValue(annotationNode, raws, expressionValues, guesses, true) {\n\t\t\t\t@Override public void setError(String message, int valueIdx) {\n\t\t\t\t\tExpression ex;\n\t\t\t\t\tif (valueIdx == -1) ex = rhs;\n\t\t\t\t\telse ex = exprs != null ? exprs[valueIdx] : null;\n\t\t\t\t\t\n\t\t\t\t\tif (ex == null) ex = annotation;\n\t\t\t\t\t\n\t\t\t\t\tint sourceStart = ex.sourceStart;\n\t\t\t\t\tint sourceEnd = ex.sourceEnd;\n\t\t\t\t\t\n\t\t\t\t\tannotationNode.addError(message, sourceStart, sourceEnd);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t@Override public void setWarning(String message, int valueIdx) {\n\t\t\t\t\tExpression ex;\n\t\t\t\t\tif (valueIdx == -1) ex = rhs;\n\t\t\t\t\telse ex = exprs != null ? exprs[valueIdx] : null;\n\t\t\t\t\t\n\t\t\t\t\tif (ex == null) ex = annotation;\n\t\t\t\t\t\n\t\t\t\t\tint sourceStart = ex.sourceStart;\n\t\t\t\t\tint sourceEnd = ex.sourceEnd;\n\t\t\t\t\t\n\t\t\t\t\tannotationNode.addWarning(message, sourceStart, sourceEnd);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t\n\t\tfor (Method m : type.getDeclaredMethods()) {\n\t\t\tif (!Modifier.isPublic(m.getModifiers())) continue;\n\t\t\tString name = m.getName();\n\t\t\tif (!values.containsKey(name)) {\n\t\t\t\tvalues.put(name, new AnnotationValue(annotationNode, new ArrayList<String>(), new ArrayList<Object>(), new ArrayList<Object>(), false) {\n\t\t\t\t\t@Override public void setError(String message, int valueIdx) {\n\t\t\t\t\t\tannotationNode.addError(message);\n\t\t\t\t\t}\n\t\t\t\t\t@Override public void setWarning(String message, int valueIdx) {\n\t\t\t\t\t\tannotationNode.addWarning(message);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn new AnnotationValues<A>(type, values, annotationNode);\n\t}\n\t\n\t/**\n\t * Turns an {@code AccessLevel} instance into the flag bit used by eclipse.\n\t */\n\t@SuppressWarnings(\"deprecation\") // We have to use MODULE here to make it act according to spec, which is to treat it like `PACKAGE`.\n\tpublic static int toEclipseModifier(AccessLevel value) {\n\t\tswitch (value) {\n\t\tcase MODULE:\n\t\tcase PACKAGE:\n\t\t\treturn 0;\n\t\tdefault:\n\t\tcase PUBLIC:\n\t\t\treturn ClassFileConstants.AccPublic;\n\t\tcase PROTECTED:\n\t\t\treturn ClassFileConstants.AccProtected;\n\t\tcase NONE:\n\t\tcase PRIVATE:\n\t\t\treturn ClassFileConstants.AccPrivate;\n\t\t}\n\t}\n\t\n\tprivate static class GetterMethod {\n\t\tprivate final char[] name;\n\t\tprivate final TypeReference type;\n\t\t\n\t\tGetterMethod(char[] name, TypeReference type) {\n\t\t\tthis.name = name;\n\t\t\tthis.type = type;\n\t\t}\n\t}\n\t\n\tstatic void registerCreatedLazyGetter(FieldDeclaration field, char[] methodName, TypeReference returnType) {\n\t\tif (isBoolean(returnType)) {\n\t\t\tFieldDeclaration_booleanLazyGetter.set(field, true);\n\t\t}\n\t}\n\t\n\tpublic static boolean isBoolean(TypeReference typeReference) {\n\t\treturn nameEquals(typeReference.getTypeName(), \"boolean\") && typeReference.dimensions() == 0;\n\t}\n\t\n\tprivate static GetterMethod findGetter(EclipseNode field) {\n\t\tFieldDeclaration fieldDeclaration = (FieldDeclaration) field.get();\n\t\tboolean forceBool = FieldDeclaration_booleanLazyGetter.get(fieldDeclaration);\n\t\tTypeReference fieldType = fieldDeclaration.type;\n\t\tboolean isBoolean = forceBool || isBoolean(fieldType);\n\t\t\n\t\tEclipseNode typeNode = field.up();\n\t\tfor (String potentialGetterName : toAllGetterNames(field, isBoolean)) {\n\t\t\tfor (EclipseNode potentialGetter : typeNode.down()) {\n\t\t\t\tif (potentialGetter.getKind() != Kind.METHOD) continue;\n\t\t\t\tif (!(potentialGetter.get() instanceof MethodDeclaration)) continue;\n\t\t\t\tMethodDeclaration method = (MethodDeclaration) potentialGetter.get();\n\t\t\t\tif (!potentialGetterName.equalsIgnoreCase(new String(method.selector))) continue;\n\t\t\t\t/** static getX() methods don't count. */\n\t\t\t\tif ((method.modifiers & ClassFileConstants.AccStatic) != 0) continue;\n\t\t\t\t/** Nor do getters with a non-empty parameter list. */\n\t\t\t\tif (method.arguments != null && method.arguments.length > 0) continue;\n\t\t\t\treturn new GetterMethod(method.selector, method.returnType);\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Check if the field has a @Getter annotation.\n\t\t\n\t\tboolean hasGetterAnnotation = false;\n\t\t\n\t\tfor (EclipseNode child : field.down()) {\n\t\t\tif (child.getKind() == Kind.ANNOTATION && annotationTypeMatches(Getter.class, child)) {\n\t\t\t\tAnnotationValues<Getter> ann = createAnnotation(Getter.class, child);\n\t\t\t\tif (ann.getInstance().value() == AccessLevel.NONE) return null;   //Definitely WONT have a getter.\n\t\t\t\thasGetterAnnotation = true;\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Check if the class has a @Getter annotation.\n\t\t\n\t\tif (!hasGetterAnnotation && HandleGetter.fieldQualifiesForGetterGeneration(field)) {\n\t\t\t//Check if the class has @Getter or @Data annotation.\n\t\t\t\n\t\t\tEclipseNode containingType = field.up();\n\t\t\tif (containingType != null) for (EclipseNode child : containingType.down()) {\n\t\t\t\tif (child.getKind() == Kind.ANNOTATION && annotationTypeMatches(Data.class, child)) hasGetterAnnotation = true;\n\t\t\t\tif (child.getKind() == Kind.ANNOTATION && annotationTypeMatches(Getter.class, child)) {\n\t\t\t\t\tAnnotationValues<Getter> ann = createAnnotation(Getter.class, child);\n\t\t\t\t\tif (ann.getInstance().value() == AccessLevel.NONE) return null;   //Definitely WONT have a getter.\n\t\t\t\t\thasGetterAnnotation = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (hasGetterAnnotation) {\n\t\t\tString getterName = toGetterName(field, isBoolean);\n\t\t\tif (getterName == null) return null;\n\t\t\treturn new GetterMethod(getterName.toCharArray(), fieldType);\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\t\n\tstatic boolean lookForGetter(EclipseNode field, FieldAccess fieldAccess) {\n\t\tif (fieldAccess == FieldAccess.GETTER) return true;\n\t\tif (fieldAccess == FieldAccess.ALWAYS_FIELD) return false;\n\t\t\n\t\t// If @Getter(lazy = true) is used, then using it is mandatory.\n\t\tfor (EclipseNode child : field.down()) {\n\t\t\tif (child.getKind() != Kind.ANNOTATION) continue;\n\t\t\tif (annotationTypeMatches(Getter.class, child)) {\n\t\t\t\tAnnotationValues<Getter> ann = createAnnotation(Getter.class, child);\n\t\t\t\tif (ann.getInstance().lazy()) return true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t\n\tstatic TypeReference getFieldType(EclipseNode field, FieldAccess fieldAccess) {\n\t\tif (field.get() instanceof MethodDeclaration) return ((MethodDeclaration) field.get()).returnType;\n\t\t\n\t\tboolean lookForGetter = lookForGetter(field, fieldAccess);\n\t\t\n\t\tGetterMethod getter = lookForGetter ? findGetter(field) : null;\n\t\tif (getter == null) {\n\t\t\treturn ((FieldDeclaration) field.get()).type;\n\t\t}\n\t\t\n\t\treturn getter.type;\n\t}\n\t\n\tstatic Expression createFieldAccessor(EclipseNode field, FieldAccess fieldAccess, ASTNode source) {\n\t\tint pS = source == null ? 0 : source.sourceStart, pE = source == null ? 0 : source.sourceEnd;\n\t\tlong p = (long) pS << 32 | pE;\n\t\t\n\t\tboolean lookForGetter = lookForGetter(field, fieldAccess);\n\t\t\n\t\tGetterMethod getter = lookForGetter ? findGetter(field) : null;\n\t\t\n\t\tif (getter == null) {\n\t\t\tFieldDeclaration fieldDecl = (FieldDeclaration)field.get();\n\t\t\tFieldReference ref = new FieldReference(fieldDecl.name, p);\n\t\t\tif ((fieldDecl.modifiers & ClassFileConstants.AccStatic) != 0) {\n\t\t\t\tEclipseNode containerNode = field.up();\n\t\t\t\tif (containerNode != null && containerNode.get() instanceof TypeDeclaration) {\n\t\t\t\t\tref.receiver = new SingleNameReference(((TypeDeclaration)containerNode.get()).name, p);\n\t\t\t\t} else {\n\t\t\t\t\tExpression smallRef = new FieldReference(field.getName().toCharArray(), p);\n\t\t\t\t\tif (source != null) setGeneratedBy(smallRef, source);\n\t\t\t\t\treturn smallRef;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tref.receiver = new ThisReference(pS, pE);\n\t\t\t}\n\t\t\t\n\t\t\tif (source != null) {\n\t\t\t\tsetGeneratedBy(ref, source);\n\t\t\t\tsetGeneratedBy(ref.receiver, source);\n\t\t\t}\n\t\t\treturn ref;\n\t\t}\n\t\t\n\t\tMessageSend call = new MessageSend();\n\t\tsetGeneratedBy(call, source);\n\t\tcall.sourceStart = pS; call.statementEnd = call.sourceEnd = pE;\n\t\tcall.receiver = new ThisReference(pS, pE);\n\t\tsetGeneratedBy(call.receiver, source);\n\t\tcall.selector = getter.name;\n\t\treturn call;\n\t}\n\t\n\tstatic Expression createFieldAccessor(EclipseNode field, FieldAccess fieldAccess, ASTNode source, char[] receiver) {\n\t\tint pS = source.sourceStart, pE = source.sourceEnd;\n\t\tlong p = (long)pS << 32 | pE;\n\t\t\n\t\tboolean lookForGetter = lookForGetter(field, fieldAccess);\n\t\t\n\t\tGetterMethod getter = lookForGetter ? findGetter(field) : null;\n\t\t\n\t\tif (getter == null) {\n\t\t\tNameReference ref;\n\t\t\t\n\t\t\tchar[][] tokens = new char[2][];\n\t\t\ttokens[0] = receiver;\n\t\t\ttokens[1] = field.getName().toCharArray();\n\t\t\tlong[] poss = {p, p};\n\t\t\t\n\t\t\tref = new QualifiedNameReference(tokens, poss, pS, pE);\n\t\t\tsetGeneratedBy(ref, source);\n\t\t\treturn ref;\n\t\t}\n\t\t\n\t\tMessageSend call = new MessageSend();\n\t\tsetGeneratedBy(call, source);\n\t\tcall.sourceStart = pS; call.statementEnd = call.sourceEnd = pE;\n\t\tcall.receiver = new SingleNameReference(receiver, p);\n\t\tsetGeneratedBy(call.receiver, source);\n\t\tcall.selector = getter.name;\n\t\treturn call;\n\t}\n\t\n\tstatic Expression createMethodAccessor(EclipseNode method, ASTNode source) {\n\t\tint pS = source == null ? 0 : source.sourceStart, pE = source == null ? 0 : source.sourceEnd;\n\t\tlong p = (long) pS << 32 | pE;\n\t\t\n\t\tMethodDeclaration methodDecl = (MethodDeclaration) method.get();\n\t\tMessageSend call = new MessageSend();\n\t\tsetGeneratedBy(call, source);\n\t\tcall.sourceStart = pS; call.statementEnd = call.sourceEnd = pE;\n\t\tif ((methodDecl.modifiers & ClassFileConstants.AccStatic) == 0) {\n\t\t\tcall.receiver = new ThisReference(pS, pE);\n\t\t\tsetGeneratedBy(call.receiver, source);\n\t\t} else {\n\t\t\tEclipseNode containerNode = method.up();\n\t\t\tif (containerNode != null && containerNode.get() instanceof TypeDeclaration) {\n\t\t\t\tcall.receiver = new SingleNameReference(((TypeDeclaration) containerNode.get()).name, p);\n\t\t\t\tsetGeneratedBy(call.receiver, source);\n\t\t\t}\n\t\t}\n\t\t\n\t\tcall.selector = methodDecl.selector;\n\t\treturn call;\n\t}\n\t\n\tstatic Expression createMethodAccessor(EclipseNode method, ASTNode source, char[] receiver) {\n\t\tint pS = source == null ? 0 : source.sourceStart, pE = source == null ? 0 : source.sourceEnd;\n\t\tlong p = (long) pS << 32 | pE;\n\t\t\n\t\tMethodDeclaration methodDecl = (MethodDeclaration) method.get();\n\t\tMessageSend call = new MessageSend();\n\t\tsetGeneratedBy(call, source);\n\t\tcall.sourceStart = pS; call.statementEnd = call.sourceEnd = pE;\n\t\tcall.receiver = new SingleNameReference(receiver, p);\n\t\tsetGeneratedBy(call.receiver, source);\n\t\tcall.selector = methodDecl.selector;\n\t\treturn call;\n\t}\n\t\n\t/** Serves as return value for the methods that check for the existence of fields and methods. */\n\tpublic enum MemberExistsResult {\n\t\tNOT_EXISTS, EXISTS_BY_LOMBOK, EXISTS_BY_USER;\n\t}\n\t\n\t/**\n\t * Translates the given field into all possible getter names.\n\t * Convenient wrapper around {@link HandlerUtil#toAllGetterNames(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static List<String> toAllGetterNames(EclipseNode field, boolean isBoolean) {\n\t\treturn HandlerUtil.toAllGetterNames(field.getAst(), getAccessorsForField(field), field.getName(), isBoolean);\n\t}\n\t\n\t/**\n\t * Translates the given field into all possible getter names.\n\t * Convenient wrapper around {@link HandlerUtil#toAllGetterNames(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static List<String> toAllGetterNames(EclipseNode field, boolean isBoolean, AnnotationValues<Accessors> accessors) {\n\t\treturn HandlerUtil.toAllGetterNames(field.getAst(), accessors, field.getName(), isBoolean);\n\t}\n\t\n\t/**\n\t * @return the likely getter name for the stated field. (e.g. private boolean foo; to isFoo).\n\t * \n\t * Convenient wrapper around {@link HandlerUtil#toGetterName(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static String toGetterName(EclipseNode field, boolean isBoolean) {\n\t\treturn HandlerUtil.toGetterName(field.getAst(), getAccessorsForField(field), field.getName(), isBoolean);\n\t}\n\t\n\t/**\n\t * @return the likely getter name for the stated field. (e.g. private boolean foo; to isFoo).\n\t * \n\t * Convenient wrapper around {@link HandlerUtil#toGetterName(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static String toGetterName(EclipseNode field, boolean isBoolean, AnnotationValues<Accessors> accessors) {\n\t\treturn HandlerUtil.toGetterName(field.getAst(), accessors, field.getName(), isBoolean);\n\t}\n\t\n\t/**\n\t * Translates the given field into all possible setter names.\n\t * Convenient wrapper around {@link HandlerUtil#toAllSetterNames(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static java.util.List<String> toAllSetterNames(EclipseNode field, boolean isBoolean) {\n\t\treturn HandlerUtil.toAllSetterNames(field.getAst(), getAccessorsForField(field), field.getName(), isBoolean);\n\t}\n\t\n\t/**\n\t * Translates the given field into all possible setter names.\n\t * Convenient wrapper around {@link HandlerUtil#toAllSetterNames(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static java.util.List<String> toAllSetterNames(EclipseNode field, boolean isBoolean, AnnotationValues<Accessors> accessors) {\n\t\treturn HandlerUtil.toAllSetterNames(field.getAst(), accessors, field.getName(), isBoolean);\n\t}\n\t\n\t/**\n\t * @return the likely setter name for the stated field. (e.g. private boolean foo; to setFoo).\n\t * \n\t * Convenient wrapper around {@link HandlerUtil#toSetterName(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static String toSetterName(EclipseNode field, boolean isBoolean) {\n\t\treturn HandlerUtil.toSetterName(field.getAst(), getAccessorsForField(field), field.getName(), isBoolean);\n\t}\n\t\n\t/**\n\t * @return the likely setter name for the stated field. (e.g. private boolean foo; to setFoo).\n\t * \n\t * Convenient wrapper around {@link HandlerUtil#toSetterName(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static String toSetterName(EclipseNode field, boolean isBoolean, AnnotationValues<Accessors> accessors) {\n\t\treturn HandlerUtil.toSetterName(field.getAst(), accessors, field.getName(), isBoolean);\n\t}\n\t\n\t/**\n\t * Translates the given field into all possible with names.\n\t * Convenient wrapper around {@link HandlerUtil#toAllWithNames(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static java.util.List<String> toAllWithNames(EclipseNode field, boolean isBoolean) {\n\t\treturn HandlerUtil.toAllWithNames(field.getAst(), getAccessorsForField(field), field.getName(), isBoolean);\n\t}\n\t\n\t/**\n\t * Translates the given field into all possible with names.\n\t * Convenient wrapper around {@link HandlerUtil#toAllWithNames(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static java.util.List<String> toAllWithNames(EclipseNode field, boolean isBoolean, AnnotationValues<Accessors> accessors) {\n\t\treturn HandlerUtil.toAllWithNames(field.getAst(), accessors, field.getName(), isBoolean);\n\t}\n\t\n\t/**\n\t * Translates the given field into all possible withBy names.\n\t * Convenient wrapper around {@link HandlerUtil#toAllWithByNames(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static java.util.List<String> toAllWithByNames(EclipseNode field, boolean isBoolean) {\n\t\treturn HandlerUtil.toAllWithByNames(field.getAst(), getAccessorsForField(field), field.getName(), isBoolean);\n\t}\n\t\n\t/**\n\t * Translates the given field into all possible withBy names.\n\t * Convenient wrapper around {@link HandlerUtil#toAllWithByNames(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static java.util.List<String> toAllWithByNames(EclipseNode field, boolean isBoolean, AnnotationValues<Accessors> accessors) {\n\t\treturn HandlerUtil.toAllWithByNames(field.getAst(), accessors, field.getName(), isBoolean);\n\t}\n\t\n\t/**\n\t * @return the likely with name for the stated field. (e.g. private boolean foo; to withFoo).\n\t * \n\t * Convenient wrapper around {@link HandlerUtil#toWithName(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static String toWithName(EclipseNode field, boolean isBoolean) {\n\t\treturn HandlerUtil.toWithName(field.getAst(), getAccessorsForField(field), field.getName(), isBoolean);\n\t}\n\t\n\t/**\n\t * @return the likely with name for the stated field. (e.g. private boolean foo; to withFoo).\n\t * \n\t * Convenient wrapper around {@link HandlerUtil#toWithName(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static String toWithName(EclipseNode field, boolean isBoolean, AnnotationValues<Accessors> accessors) {\n\t\treturn HandlerUtil.toWithName(field.getAst(), accessors, field.getName(), isBoolean);\n\t}\n\t\n\t/**\n\t * @return the likely withBy name for the stated field. (e.g. private boolean foo; to withFooBy).\n\t * \n\t * Convenient wrapper around {@link HandlerUtil#toWithByName(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static String toWithByName(EclipseNode field, boolean isBoolean) {\n\t\treturn HandlerUtil.toWithByName(field.getAst(), getAccessorsForField(field), field.getName(), isBoolean);\n\t}\n\t\n\t/**\n\t * @return the likely withBy name for the stated field. (e.g. private boolean foo; to withFooBy).\n\t * \n\t * Convenient wrapper around {@link HandlerUtil#toWithByName(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static String toWithByName(EclipseNode field, boolean isBoolean, AnnotationValues<Accessors> accessors) {\n\t\treturn HandlerUtil.toWithByName(field.getAst(), accessors, field.getName(), isBoolean);\n\t}\n\t\n\t/**\n\t * When generating a setter/getter/wither, should it be made final?\n\t */\n\tpublic static boolean shouldMakeFinal(EclipseNode field, AnnotationValues<Accessors> accessors) {\n\t\tif ((((FieldDeclaration) field.get()).modifiers & ClassFileConstants.AccStatic) != 0) return false;\n\t\treturn shouldMakeFinal0(accessors, field.getAst());\n\t}\n\t/**\n\t * When generating a setter, the setter either returns void (beanspec) or Self (fluent).\n\t * This method scans for the {@code Accessors} annotation and associated config properties to figure that out.\n\t */\n\tpublic static boolean shouldReturnThis(EclipseNode field, AnnotationValues<Accessors> accessors) {\n\t\tif ((((FieldDeclaration) field.get()).modifiers & ClassFileConstants.AccStatic) != 0) return false;\n\t\treturn shouldReturnThis0(accessors, field.getAst());\n\t}\n\t\n\t/**\n\t * Checks if the field should be included in operations that work on 'all' fields:\n\t *    If the field is static, or starts with a '$', or is actually an enum constant, 'false' is returned, indicating you should skip it.\n\t */\n\tpublic static boolean filterField(FieldDeclaration declaration) {\n\t\treturn filterField(declaration, true);\n\t}\n\t\n\tpublic static boolean filterField(FieldDeclaration declaration, boolean skipStatic) {\n\t\t// Skip the fake fields that represent enum constants.\n\t\tif (declaration.initialization instanceof AllocationExpression &&\n\t\t\t\t((AllocationExpression) declaration.initialization).enumConstant != null) return false;\n\t\t\n\t\tif (declaration.type == null) return false;\n\t\t\n\t\t// Skip fields that start with $\n\t\tif (declaration.name.length > 0 && declaration.name[0] == '$') return false;\n\t\t\n\t\t// Skip static fields.\n\t\tif (skipStatic && (declaration.modifiers & ClassFileConstants.AccStatic) != 0) return false;\n\t\t\n\t\treturn true;\n\t}\n\t\n\tpublic static char[] removePrefixFromField(EclipseNode field) {\n\t\tList<String> prefixes = null;\n\t\tfor (EclipseNode node : field.down()) {\n\t\t\tif (annotationTypeMatches(Accessors.class, node)) {\n\t\t\t\tAnnotationValues<Accessors> ann = createAnnotation(Accessors.class, node);\n\t\t\t\tif (ann.isExplicit(\"prefix\")) prefixes = Arrays.asList(ann.getInstance().prefix());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (prefixes == null) {\n\t\t\tEclipseNode current = field.up();\n\t\t\touter:\n\t\t\twhile (current != null) {\n\t\t\t\tfor (EclipseNode node : current.down()) {\n\t\t\t\t\tif (annotationTypeMatches(Accessors.class, node)) {\n\t\t\t\t\t\tAnnotationValues<Accessors> ann = createAnnotation(Accessors.class, node);\n\t\t\t\t\t\tif (ann.isExplicit(\"prefix\")) prefixes = Arrays.asList(ann.getInstance().prefix());\n\t\t\t\t\t\tbreak outer;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcurrent = current.up();\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (prefixes == null) prefixes = field.getAst().readConfiguration(ConfigurationKeys.ACCESSORS_PREFIX);\n\t\tif (!prefixes.isEmpty()) {\n\t\t\tCharSequence newName = removePrefix(field.getName(), prefixes);\n\t\t\tif (newName != null) return newName.toString().toCharArray();\n\t\t}\n\t\t\n\t\treturn ((FieldDeclaration) field.get()).name;\n\t}\n\t\n\tpublic static AnnotationValues<Accessors> getAccessorsForField(EclipseNode field) {\n\t\tAnnotationValues<Accessors> values = null;\n\t\t\n\t\tfor (EclipseNode node : field.down()) {\n\t\t\tif (annotationTypeMatches(Accessors.class, node)) {\n\t\t\t\tvalues = createAnnotation(Accessors.class, node);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\tEclipseNode current = field.up();\n\t\twhile (current != null) {\n\t\t\tfor (EclipseNode node : current.down()) {\n\t\t\t\tif (annotationTypeMatches(Accessors.class, node)) {\n\t\t\t\t\tAnnotationValues<Accessors> onType = createAnnotation(Accessors.class, node);\n\t\t\t\t\tvalues = values == null ? onType : values.integrate(onType);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcurrent = current.up();\n\t\t}\n\t\t\n\t\treturn values == null ? AnnotationValues.of(Accessors.class, field) : values;\n\t}\n\t\n\tpublic static EclipseNode upToTypeNode(EclipseNode node) {\n\t\tif (node == null) throw new NullPointerException(\"node\");\n\t\twhile (node != null && !(node.get() instanceof TypeDeclaration)) node = node.up();\n\t\treturn node;\n\t}\n\t\n\t/**\n\t * Checks if there is a field with the provided name.\n\t * \n\t * @param fieldName the field name to check for.\n\t * @param node Any node that represents the Type (TypeDeclaration) to look in, or any child node thereof.\n\t */\n\tpublic static MemberExistsResult fieldExists(String fieldName, EclipseNode node) {\n\t\tnode = upToTypeNode(node);\n\t\tchar[] fieldNameChars = null;\n\t\tif (node != null && node.get() instanceof TypeDeclaration) {\n\t\t\tTypeDeclaration typeDecl = (TypeDeclaration) node.get();\n\t\t\tif (typeDecl.fields != null) for (FieldDeclaration def : typeDecl.fields) {\n\t\t\t\tchar[] fName = def.name;\n\t\t\t\tif (fName == null) continue;\n\t\t\t\tif (fieldNameChars == null) fieldNameChars = fieldName.toCharArray();\n\t\t\t\tif (Arrays.equals(fName, fieldNameChars)) {\n\t\t\t\t\treturn getGeneratedBy(def) == null ? MemberExistsResult.EXISTS_BY_USER : MemberExistsResult.EXISTS_BY_LOMBOK;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn MemberExistsResult.NOT_EXISTS;\n\t}\n\t\n\t/**\n\t * Wrapper for {@link #methodExists(String, EclipseNode, boolean, int)} with {@code caseSensitive} = {@code true}.\n\t */\n\tpublic static MemberExistsResult methodExists(String methodName, EclipseNode node, int params) {\n\t\treturn methodExists(methodName, node, true, params);\n\t}\n\t\n\t/**\n\t * Checks if there is a method with the provided name. In case of multiple methods (overloading), only\n\t * the first method decides if EXISTS_BY_USER or EXISTS_BY_LOMBOK is returned.\n\t * \n\t * @param methodName the method name to check for.\n\t * @param node Any node that represents the Type (TypeDeclaration) to look in, or any child node thereof.\n\t * @param caseSensitive If the search should be case sensitive.\n\t * @param params The number of parameters the method should have; varargs count as 0-*. Set to -1 to find any method with the appropriate name regardless of parameter count.\n\t */\n\tpublic static MemberExistsResult methodExists(String methodName, EclipseNode node, boolean caseSensitive, int params) {\n\t\twhile (node != null && !(node.get() instanceof TypeDeclaration)) {\n\t\t\tnode = node.up();\n\t\t}\n\t\t\n\t\tif (node != null && node.get() instanceof TypeDeclaration) {\n\t\t\tTypeDeclaration typeDecl = (TypeDeclaration)node.get();\n\t\t\tif (typeDecl.methods != null) top: for (AbstractMethodDeclaration def : typeDecl.methods) {\n\t\t\t\tif (def instanceof MethodDeclaration) {\n\t\t\t\t\tchar[] mName = def.selector;\n\t\t\t\t\tif (mName == null) continue;\n\t\t\t\t\tboolean nameEquals = caseSensitive ? methodName.equals(new String(mName)) : methodName.equalsIgnoreCase(new String(mName));\n\t\t\t\t\tif (nameEquals) {\n\t\t\t\t\t\tif (params > -1) {\n\t\t\t\t\t\t\tint minArgs = 0;\n\t\t\t\t\t\t\tint maxArgs = 0;\n\t\t\t\t\t\t\tif (def.arguments != null && def.arguments.length > 0) {\n\t\t\t\t\t\t\t\tminArgs = def.arguments.length;\n\t\t\t\t\t\t\t\tif ((def.arguments[def.arguments.length - 1].type.bits & ASTNode.IsVarArgs) != 0) {\n\t\t\t\t\t\t\t\t\tminArgs--;\n\t\t\t\t\t\t\t\t\tmaxArgs = Integer.MAX_VALUE;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tmaxArgs = minArgs;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (params < minArgs || params > maxArgs) continue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (isTolerate(node, def)) continue top;\n\t\t\t\t\t\t\n\t\t\t\t\t\treturn getGeneratedBy(def) == null ? MemberExistsResult.EXISTS_BY_USER : MemberExistsResult.EXISTS_BY_LOMBOK;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn MemberExistsResult.NOT_EXISTS;\n\t}\n\t\n\tpublic static boolean isTolerate(EclipseNode node, AbstractMethodDeclaration def) {\n\t\tif (def.annotations != null) for (Annotation anno : def.annotations) {\n\t\t\tif (typeMatches(Tolerate.class, node, anno.type)) return true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * Checks if there is a (non-default) constructor. In case of multiple constructors (overloading), only\n\t * the first constructor decides if EXISTS_BY_USER or EXISTS_BY_LOMBOK is returned.\n\t * \n\t * @param node Any node that represents the Type (TypeDeclaration) to look in, or any child node thereof.\n\t */\n\tpublic static MemberExistsResult constructorExists(EclipseNode node) {\n\t\tnode = upToTypeNode(node);\n\t\tif (node != null && node.get() instanceof TypeDeclaration) {\n\t\t\tTypeDeclaration typeDecl = (TypeDeclaration) node.get();\n\t\t\tif (typeDecl.methods != null) for (AbstractMethodDeclaration def : typeDecl.methods) {\n\t\t\t\tif (!(def instanceof ConstructorDeclaration)) continue;\n\t\t\t\tif ((def.bits & ASTNode.IsDefaultConstructor) != 0) continue;\n\t\t\t\tif (isTolerate(node, def)) continue;\n\t\t\t\treturn getGeneratedBy(def) == null ? MemberExistsResult.EXISTS_BY_USER : MemberExistsResult.EXISTS_BY_LOMBOK;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn MemberExistsResult.NOT_EXISTS;\n\t}\n\t\n\t/**\n\t * Inserts a field into an existing type. The type must represent a {@code TypeDeclaration}.\n\t * The field carries the &#64;{@link SuppressWarnings}(\"all\") annotation.\n\t */\n\tpublic static EclipseNode injectFieldAndMarkGenerated(EclipseNode type, FieldDeclaration field) {\n\t\tfield.annotations = addSuppressWarningsAll(type, field, field.annotations);\n\t\tfield.annotations = addGenerated(type, field, field.annotations);\n\t\treturn injectField(type, field);\n\t}\n\t\n\t/**\n\t * Inserts a field into an existing type. The type must represent a {@code TypeDeclaration}.\n\t */\n\tpublic static EclipseNode injectField(EclipseNode type, FieldDeclaration field) {\n\t\tTypeDeclaration parent = (TypeDeclaration) type.get();\n\t\t\n\t\tif (parent.fields == null) {\n\t\t\tparent.fields = new FieldDeclaration[1];\n\t\t\tparent.fields[0] = field;\n\t\t} else {\n\t\t\tint size = parent.fields.length;\n\t\t\tFieldDeclaration[] newArray = new FieldDeclaration[size + 1];\n\t\t\tSystem.arraycopy(parent.fields, 0, newArray, 0, size);\n\t\t\tint index = 0;\n\t\t\tfor (; index < size; index++) {\n\t\t\t\tFieldDeclaration f = newArray[index];\n\t\t\t\tif (isEnumConstant(f) || isGenerated(f) || isRecordField(f)) continue;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tSystem.arraycopy(newArray, index, newArray, index + 1, size - index);\n\t\t\tnewArray[index] = field;\n\t\t\tparent.fields = newArray;\n\t\t}\n\t\t\n\t\tif (isEnumConstant(field) || (field.modifiers & Modifier.STATIC) != 0) {\n\t\t\tif (!hasClinit(parent)) {\n\t\t\t\tparent.addClinit();\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn type.add(field, Kind.FIELD);\n\t}\n\t\n\tpublic static boolean isEnumConstant(final FieldDeclaration field) {\n\t\treturn ((field.initialization instanceof AllocationExpression) && (((AllocationExpression) field.initialization).enumConstant == field));\n\t}\n\t\n\t/**\n\t * Inserts a method into an existing type. The type must represent a {@code TypeDeclaration}.\n\t */\n\tpublic static EclipseNode injectMethod(EclipseNode type, AbstractMethodDeclaration method) {\n\t\tmethod.annotations = addSuppressWarningsAll(type, method, method.annotations);\n\t\tmethod.annotations = addGenerated(type, method, method.annotations);\n\t\tTypeDeclaration parent = (TypeDeclaration) type.get();\n\t\t\n\t\tif (parent.methods == null) {\n\t\t\tparent.methods = new AbstractMethodDeclaration[1];\n\t\t\tparent.methods[0] = method;\n\t\t} else {\n\t\t\tif (method instanceof ConstructorDeclaration) {\n\t\t\t\tfor (int i = 0 ; i < parent.methods.length ; i++) {\n\t\t\t\t\tif (parent.methods[i] instanceof ConstructorDeclaration &&\n\t\t\t\t\t\t\t(parent.methods[i].bits & ASTNode.IsDefaultConstructor) != 0) {\n\t\t\t\t\t\tEclipseNode tossMe = type.getNodeFor(parent.methods[i]);\n\t\t\t\t\t\t\n\t\t\t\t\t\tAbstractMethodDeclaration[] withoutGeneratedConstructor = new AbstractMethodDeclaration[parent.methods.length - 1];\n\t\t\t\t\t\t\n\t\t\t\t\t\tSystem.arraycopy(parent.methods, 0, withoutGeneratedConstructor, 0, i);\n\t\t\t\t\t\tSystem.arraycopy(parent.methods, i + 1, withoutGeneratedConstructor, i, parent.methods.length - i - 1);\n\t\t\t\t\t\t\n\t\t\t\t\t\tparent.methods = withoutGeneratedConstructor;\n\t\t\t\t\t\tif (tossMe != null) tossMe.up().removeChild(tossMe);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t//We insert the method in the last position of the methods registered to the type\n\t\t\t//When changing this behavior, this may trigger issue #155 and #377\n\t\t\tAbstractMethodDeclaration[] newArray = new AbstractMethodDeclaration[parent.methods.length + 1];\n\t\t\tSystem.arraycopy(parent.methods, 0, newArray, 0, parent.methods.length);\n\t\t\tnewArray[parent.methods.length] = method;\n\t\t\tparent.methods = newArray;\n\t\t}\n\t\t\n\t\treturn type.add(method, Kind.METHOD);\n\t}\n\t\n\t/**\n\t * Adds an inner type (class, interface, enum) to the given type. Cannot inject top-level types.\n\t * \n\t * @param typeNode parent type to inject new type into\n\t * @param type New type (class, interface, etc) to inject.\n\t */\n\tpublic static EclipseNode injectType(final EclipseNode typeNode, final TypeDeclaration type) {\n\t\ttype.annotations = addSuppressWarningsAll(typeNode, type, type.annotations);\n\t\ttype.annotations = addGenerated(typeNode, type, type.annotations);\n\t\tTypeDeclaration parent = (TypeDeclaration) typeNode.get();\n\t\t\n\t\tif (parent.memberTypes == null) {\n\t\t\tparent.memberTypes = new TypeDeclaration[] { type };\n\t\t} else {\n\t\t\tTypeDeclaration[] newArray = new TypeDeclaration[parent.memberTypes.length + 1];\n\t\t\tSystem.arraycopy(parent.memberTypes, 0, newArray, 0, parent.memberTypes.length);\n\t\t\tnewArray[parent.memberTypes.length] = type;\n\t\t\tparent.memberTypes = newArray;\n\t\t}\n\t\t\n\t\treturn typeNode.add(type, Kind.TYPE);\n\t}\n\t\n\tstatic final char[] ALL = \"all\".toCharArray();\n\tstatic final char[] UNCHECKED = \"unchecked\".toCharArray();\n\tprivate static final char[] JUSTIFICATION = \"justification\".toCharArray();\n\tprivate static final char[] GENERATED_CODE = \"generated code\".toCharArray();\n\tprivate static final char[] LOMBOK = \"lombok\".toCharArray();\n\tprivate static final char[][] JAVAX_ANNOTATION_GENERATED = Eclipse.fromQualifiedName(\"javax.annotation.Generated\");\n\tprivate static final char[][] JAKARTA_ANNOTATION_GENERATED = Eclipse.fromQualifiedName(\"jakarta.annotation.Generated\");\n\tprivate static final char[][] LOMBOK_GENERATED = Eclipse.fromQualifiedName(\"lombok.Generated\");\n\tprivate static final char[][] EDU_UMD_CS_FINDBUGS_ANNOTATIONS_SUPPRESSFBWARNINGS = Eclipse.fromQualifiedName(\"edu.umd.cs.findbugs.annotations.SuppressFBWarnings\");\n\t\n\tpublic static Annotation[] addSuppressWarningsAll(EclipseNode node, ASTNode source, Annotation[] originalAnnotationArray) {\n\t\tAnnotation[] anns = originalAnnotationArray;\n\t\t\n\t\tif (!Boolean.FALSE.equals(node.getAst().readConfiguration(ConfigurationKeys.ADD_SUPPRESSWARNINGS_ANNOTATIONS))) {\n\t\t\tanns = addAnnotation(source, anns, TypeConstants.JAVA_LANG_SUPPRESSWARNINGS, new StringLiteral(ALL, 0, 0, 0));\n\t\t}\n\t\t\n\t\tif (Boolean.TRUE.equals(node.getAst().readConfiguration(ConfigurationKeys.ADD_FINDBUGS_SUPPRESSWARNINGS_ANNOTATIONS))) {\n\t\t\tMemberValuePair mvp = new MemberValuePair(JUSTIFICATION, 0, 0, new StringLiteral(GENERATED_CODE, 0, 0, 0));\n\t\t\tanns = addAnnotation(source, anns, EDU_UMD_CS_FINDBUGS_ANNOTATIONS_SUPPRESSFBWARNINGS, mvp);\n\t\t}\n\t\t\n\t\treturn anns;\n\t}\n\t\n\tpublic static Annotation[] addGenerated(EclipseNode node, ASTNode source, Annotation[] originalAnnotationArray) {\n\t\tAnnotation[] result = originalAnnotationArray;\n\t\tif (HandlerUtil.shouldAddGenerated(node)) {\n\t\t\tresult = addAnnotation(source, result, JAVAX_ANNOTATION_GENERATED, new StringLiteral(LOMBOK, 0, 0, 0));\n\t\t}\n\t\tif (Boolean.TRUE.equals(node.getAst().readConfiguration(ConfigurationKeys.ADD_JAKARTA_GENERATED_ANNOTATIONS))) {\n\t\t\tresult = addAnnotation(source, result, JAKARTA_ANNOTATION_GENERATED, new StringLiteral(LOMBOK, 0, 0, 0));\n\t\t}\n\t\tif (!Boolean.FALSE.equals(node.getAst().readConfiguration(ConfigurationKeys.ADD_LOMBOK_GENERATED_ANNOTATIONS))) {\n\t\t\tresult = addAnnotation(source, result, LOMBOK_GENERATED);\n\t\t}\n\t\treturn result;\n\t}\n\t\n\tstatic Annotation[] addAnnotation(ASTNode source, Annotation[] originalAnnotationArray, char[][] annotationTypeFqn) {\n\t\treturn addAnnotation(source, originalAnnotationArray, annotationTypeFqn, (ASTNode[]) null);\n\t}\n\t\n\tstatic Annotation[] addAnnotation(ASTNode source, Annotation[] originalAnnotationArray, char[][] annotationTypeFqn, ASTNode... args) {\n\t\tchar[] simpleName = annotationTypeFqn[annotationTypeFqn.length - 1];\n\t\t\n\t\tif (originalAnnotationArray != null) for (Annotation ann : originalAnnotationArray) {\n\t\t\tif (ann.type instanceof QualifiedTypeReference) {\n\t\t\t\tchar[][] t = ((QualifiedTypeReference) ann.type).tokens;\n\t\t\t\tif (Arrays.deepEquals(t, annotationTypeFqn)) return originalAnnotationArray;\n\t\t\t}\n\t\t\t\n\t\t\tif (ann.type instanceof SingleTypeReference) {\n\t\t\t\tchar[] lastToken = ((SingleTypeReference) ann.type).token;\n\t\t\t\tif (Arrays.equals(lastToken, simpleName)) return originalAnnotationArray;\n\t\t\t}\n\t\t}\n\t\t\n\t\tint pS = source.sourceStart, pE = source.sourceEnd;\n\t\tTypeReference qualifiedType = generateQualifiedTypeRef(source, annotationTypeFqn);\n\t\tAnnotation ann;\n\t\tif (args != null && args.length == 1 && args[0] instanceof Expression) {\n\t\t\tSingleMemberAnnotation sma = new SingleMemberAnnotation(qualifiedType, pS);\n\t\t\tsma.declarationSourceEnd = pE;\n\t\t\targs[0].sourceStart = pS;\n\t\t\targs[0].sourceEnd = pE;\n\t\t\tsma.memberValue = (Expression) args[0];\n\t\t\tsetGeneratedBy(sma.memberValue, source);\n\t\t\tann = sma;\n\t\t} else if (args != null && args.length >= 1 && arrayHasOnlyElementsOfType(args, MemberValuePair.class)) {\n\t\t\tNormalAnnotation na = new NormalAnnotation(qualifiedType, pS);\n\t\t\tna.declarationSourceEnd = pE;\n\t\t\tna.memberValuePairs = new MemberValuePair[args.length];\n\t\t\tfor (int i = 0; i < args.length; i++) {\n\t\t\t\targs[i].sourceStart = pS;\n\t\t\t\targs[i].sourceEnd = pE;\n\t\t\t\tna.memberValuePairs[i] = (MemberValuePair) args[i];\n\t\t\t}\n\t\t\tsetGeneratedBy(na.memberValuePairs[0], source);\n\t\t\tsetGeneratedBy(na.memberValuePairs[0].value, source);\n\t\t\tna.memberValuePairs[0].value.sourceStart = pS;\n\t\t\tna.memberValuePairs[0].value.sourceEnd = pE;\n\t\t\tann = na;\n\t\t} else {\n\t\t\tMarkerAnnotation ma = new MarkerAnnotation(qualifiedType, pS);\n\t\t\tma.declarationSourceEnd = pE;\n\t\t\tann = ma;\n\t\t}\n\t\tsetGeneratedBy(ann, source);\n\t\tif (originalAnnotationArray == null) return new Annotation[] { ann };\n\t\tAnnotation[] newAnnotationArray = new Annotation[originalAnnotationArray.length + 1];\n\t\tSystem.arraycopy(originalAnnotationArray, 0, newAnnotationArray, 0, originalAnnotationArray.length);\n\t\tnewAnnotationArray[originalAnnotationArray.length] = ann;\n\t\treturn newAnnotationArray;\n\t}\n\t\n\tpublic static void addCheckerFrameworkReturnsReceiver(TypeReference returnType, ASTNode source, CheckerFrameworkVersion cfv) {\n\t\tif (cfv.generateReturnsReceiver()) {\n\t\t\tAnnotation rrAnn = generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__RETURNS_RECEIVER);\n\t\t\tint levels = returnType.getAnnotatableLevels();\n\t\t\treturnType.annotations = new Annotation[levels][];\n\t\t\treturnType.annotations[levels-1] = new Annotation[] {rrAnn};\n\t\t}\n\t}\n\t\n\tprivate static boolean arrayHasOnlyElementsOfType(Object[] array, Class<?> clazz) {\n\t\tfor (Object element : array) {\n\t\t\tif (!clazz.isInstance(element))\n\t\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Generates a new statement that checks if the given local variable is null, and if so, throws a specified exception with the\n\t * variable name as message.\n\t */\n\tpublic static Statement generateNullCheck(TypeReference type, char[] variable, EclipseNode sourceNode, String customMessage) {\n\t\tNullCheckExceptionType exceptionType = sourceNode.getAst().readConfiguration(ConfigurationKeys.NON_NULL_EXCEPTION_TYPE);\n\t\tif (exceptionType == null) exceptionType = NullCheckExceptionType.NULL_POINTER_EXCEPTION;\n\t\t\n\t\tASTNode source = sourceNode.get();\n\t\t\n\t\tint pS = source.sourceStart, pE = source.sourceEnd;\n\t\tlong p = (long) pS << 32 | pE;\n\t\t\n\t\tif (type != null && isPrimitive(type)) return null;\n\t\tSingleNameReference varName = new SingleNameReference(variable, p);\n\t\tsetGeneratedBy(varName, source);\n\t\t\n\t\tStringLiteral message = new StringLiteral(exceptionType.toExceptionMessage(new String(variable), customMessage).toCharArray(), pS, pE, 0);\n\t\tsetGeneratedBy(message, source);\n\t\t\n\t\tLombokImmutableList<String> method = exceptionType.getMethod();\n\t\tif (method != null) {\n\t\t\t\n\t\t\tMessageSend invocation = new MessageSend();\n\t\t\tinvocation.sourceStart = pS; invocation.sourceEnd = pE;\n\t\t\tsetGeneratedBy(invocation, source);\n\t\t\t\n\t\t\tchar[][] utilityTypeName = new char[method.size() - 1][];\n\t\t\tfor (int i = 0; i < method.size() - 1; i++) {\n\t\t\t\tutilityTypeName[i] = method.get(i).toCharArray();\n\t\t\t}\n\t\t\t\n\t\t\tinvocation.receiver = new QualifiedNameReference(utilityTypeName, new long[method.size() - 1], pS, pE);\n\t\t\tsetGeneratedBy(invocation.receiver, source);\n\t\t\tinvocation.selector = method.get(method.size() - 1).toCharArray();\n\t\t\tinvocation.arguments = new Expression[] {varName, message};\n\t\t\treturn invocation;\n\t\t}\n\t\t\n\t\tAllocationExpression exception = new AllocationExpression();\n\t\tsetGeneratedBy(exception, source);\n\t\t\n\t\tNullLiteral nullLiteral = new NullLiteral(pS, pE);\n\t\tsetGeneratedBy(nullLiteral, source);\n\t\t\n\t\tint equalOperator = exceptionType == NullCheckExceptionType.ASSERTION ? OperatorIds.NOT_EQUAL : OperatorIds.EQUAL_EQUAL; \n\t\tEqualExpression equalExpression = new EqualExpression(varName, nullLiteral, equalOperator);\n\t\tequalExpression.sourceStart = pS; equalExpression.statementEnd = equalExpression.sourceEnd = pE;\n\t\tsetGeneratedBy(equalExpression, source);\n\t\t\n\t\tif (exceptionType == NullCheckExceptionType.ASSERTION) {\n\t\t\tStatement assertStatement = new AssertStatement(message, equalExpression, pS);\n\t\t\tsetGeneratedBy(assertStatement, source);\n\t\t\treturn assertStatement;\n\t\t}\n\t\t\n\t\tString exceptionTypeStr = exceptionType.getExceptionType();\n\t\tint partCount = 1;\n\t\tfor (int i = 0; i < exceptionTypeStr.length(); i++) if (exceptionTypeStr.charAt(i) == '.') partCount++;\n\t\tlong[] ps = new long[partCount];\n\t\tArrays.fill(ps, 0L);\n\t\texception.type = new QualifiedTypeReference(fromQualifiedName(exceptionTypeStr), ps);\n\t\tsetGeneratedBy(exception.type, source);\n\t\texception.arguments = new Expression[] {message};\n\t\t\n\t\tThrowStatement throwStatement = new ThrowStatement(exception, pS, pE);\n\t\tsetGeneratedBy(throwStatement, source);\n\t\t\n\t\tBlock throwBlock = new Block(0);\n\t\tthrowBlock.statements = new Statement[] {throwStatement};\n\t\tthrowBlock.sourceStart = pS; throwBlock.sourceEnd = pE;\n\t\tsetGeneratedBy(throwBlock, source);\n\t\tIfStatement ifStatement = new IfStatement(equalExpression, throwBlock, 0, 0);\n\t\tsetGeneratedBy(ifStatement, source);\n\t\treturn ifStatement;\n\t}\n\t\n\t/**\n\t * Generates a new statement that checks if the given variable is null, and if so, throws a specified exception with the\n\t * variable name as message.\n\t * \n\t * @param exName The name of the exception to throw; normally {@code java.lang.NullPointerException}.\n\t */\n\tpublic static Statement generateNullCheck(AbstractVariableDeclaration variable, EclipseNode sourceNode, String customMessage) {\n\t\treturn generateNullCheck(variable.type, variable.name, sourceNode, customMessage);\n\t}\n\t\n\t/**\n\t * Create an annotation of the given name, and is marked as being generated by the given source.\n\t */\n\tpublic static MarkerAnnotation makeMarkerAnnotation(char[][] name, ASTNode source) {\n\t\tlong pos = (long) source.sourceStart << 32 | source.sourceEnd;\n\t\tlong[] poss = new long[name.length];\n\t\tArrays.fill(poss, pos);\n\t\tTypeReference typeRef = new QualifiedTypeReference(name, poss);\n\t\tsetGeneratedBy(typeRef, source);\n\t\tMarkerAnnotation ann = new MarkerAnnotation(typeRef, (int) (pos >> 32));\n\t\tann.declarationSourceEnd = ann.sourceEnd = ann.statementEnd = (int) pos;\n\t\tsetGeneratedBy(ann, source);\n\t\treturn ann;\n\t}\n\t\n\t/**\n\t * Given a list of field names and a node referring to a type, finds each name in the list that does not match a field within the type.\n\t */\n\tpublic static List<Integer> createListOfNonExistentFields(List<String> list, EclipseNode type, boolean excludeStandard, boolean excludeTransient) {\n\t\tboolean[] matched = new boolean[list.size()];\n\t\t\n\t\tfor (EclipseNode child : type.down()) {\n\t\t\tif (list.isEmpty()) break;\n\t\t\tif (child.getKind() != Kind.FIELD) continue;\n\t\t\tif (excludeStandard) {\n\t\t\t\tif ((((FieldDeclaration) child.get()).modifiers & ClassFileConstants.AccStatic) != 0) continue;\n\t\t\t\tif (child.getName().startsWith(\"$\")) continue;\n\t\t\t}\n\t\t\tif (excludeTransient && (((FieldDeclaration)child.get()).modifiers & ClassFileConstants.AccTransient) != 0) continue;\n\t\t\tint idx = list.indexOf(child.getName());\n\t\t\tif (idx > -1) matched[idx] = true;\n\t\t}\n\t\t\n\t\tList<Integer> problematic = new ArrayList<Integer>();\n\t\tfor (int i = 0 ; i < list.size() ; i++) {\n\t\t\tif (!matched[i]) problematic.add(i);\n\t\t}\n\t\t\n\t\treturn problematic;\n\t}\n\t\n\t/**\n\t * In eclipse 3.7+, the CastExpression constructor was changed from a really weird version to\n\t * a less weird one. Unfortunately that means we need to use reflection as we want to be compatible\n\t * with eclipse versions before 3.7 and 3.7+.\n\t * \n\t * @param ref The {@code foo} in {@code (String)foo}.\n\t * @param castTo The {@code String} in {@code (String)foo}.\n\t */\n\tpublic static CastExpression makeCastExpression(Expression ref, TypeReference castTo, ASTNode source) {\n\t\tCastExpression result;\n\t\ttry {\n\t\t\tif (castExpressionConstructorIsTypeRefBased) {\n\t\t\t\tresult = castExpressionConstructor.newInstance(ref, castTo);\n\t\t\t} else {\n\t\t\t\tExpression castToConverted = castTo;\n\t\t\t\t\n\t\t\t\tif (castTo.getClass() == SingleTypeReference.class && !isPrimitive(castTo)) {\n\t\t\t\t\tSingleTypeReference str = (SingleTypeReference) castTo;\n\t\t\t\t\t//Why a SingleNameReference instead of a SingleTypeReference you ask? I don't know. It seems dumb. Ask the ecj guys.\n\t\t\t\t\tcastToConverted = new SingleNameReference(str.token, 0);\n\t\t\t\t\tcastToConverted.bits = (castToConverted.bits & ~Binding.VARIABLE) | Binding.TYPE;\n\t\t\t\t\tcastToConverted.sourceStart = str.sourceStart;\n\t\t\t\t\tcastToConverted.sourceEnd = str.sourceEnd;\n\t\t\t\t\tsetGeneratedBy(castToConverted, source);\n\t\t\t\t} else if (castTo.getClass() == QualifiedTypeReference.class) {\n\t\t\t\t\tQualifiedTypeReference qtr = (QualifiedTypeReference) castTo;\n\t\t\t\t\t//Same here, but for the more complex types, they stay types.\n\t\t\t\t\tcastToConverted = new QualifiedNameReference(qtr.tokens, copy(qtr.sourcePositions), qtr.sourceStart, qtr.sourceEnd);\n\t\t\t\t\tcastToConverted.bits = (castToConverted.bits & ~Binding.VARIABLE) | Binding.TYPE;\n\t\t\t\t\tsetGeneratedBy(castToConverted, source);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tresult = castExpressionConstructor.newInstance(ref, castToConverted);\n\t\t\t}\n\t\t} catch (InvocationTargetException e) {\n\t\t\tthrow Lombok.sneakyThrow(e.getCause());\n\t\t} catch (IllegalAccessException e) {\n\t\t\tthrow Lombok.sneakyThrow(e);\n\t\t} catch (InstantiationException e) {\n\t\t\tthrow Lombok.sneakyThrow(e);\n\t\t}\n\t\t\n\t\tresult.sourceStart = source.sourceStart;\n\t\tresult.sourceEnd = source.sourceEnd;\n\t\tresult.statementEnd = source.sourceEnd;\n\t\t\n\t\tsetGeneratedBy(result, source);\n\t\treturn result;\n\t}\n\t\n\tprivate static final Constructor<CastExpression> castExpressionConstructor;\n\tprivate static final boolean castExpressionConstructorIsTypeRefBased;\n\t\n\tstatic {\n\t\tConstructor<?> constructor = null;\n\t\tfor (Constructor<?> ctor : CastExpression.class.getConstructors()) {\n\t\t\tif (ctor.getParameterTypes().length != 2) continue;\n\t\t\tconstructor = ctor;\n\t\t}\n\t\t\n\t\t@SuppressWarnings(\"unchecked\")\n\t\tConstructor<CastExpression> castExpressionConstructor_ = (Constructor<CastExpression>) constructor;\n\t\tcastExpressionConstructor = castExpressionConstructor_;\n\t\t\n\t\tcastExpressionConstructorIsTypeRefBased =\n\t\t\t\t(castExpressionConstructor.getParameterTypes()[1] == TypeReference.class);\n\t}\n\t\n\t/**\n\t * In eclipse 3.7+, IntLiterals are created using a factory-method \n\t * Unfortunately that means we need to use reflection as we want to be compatible\n\t * with eclipse versions before 3.7.\n\t */\n\tpublic static IntLiteral makeIntLiteral(char[] token, ASTNode source) {\n\t\tint pS = source == null ? 0 : source.sourceStart, pE = source == null ? 0 : source.sourceEnd;\n\t\tIntLiteral result;\n\t\tif (intLiteralConstructor != null) {\n\t\t\tresult = Permit.newInstanceSneaky(intLiteralConstructor, token, pS, pE);\n\t\t} else {\n\t\t\tresult = (IntLiteral) Permit.invokeSneaky(intLiteralFactoryMethod, null, token, pS, pE);\n\t\t}\n\t\t\n\t\tif (source != null) setGeneratedBy(result, source);\n\t\treturn result;\n\t}\n\t\n\tprivate static final Constructor<IntLiteral> intLiteralConstructor;\n\tprivate static final Method intLiteralFactoryMethod;\n\t\n\tstatic {\n\t\tClass<?>[] parameterTypes = {char[].class, int.class, int.class};\n\t\tConstructor<IntLiteral> intLiteralConstructor_ = null;\n\t\tMethod intLiteralFactoryMethod_ = null;\n\t\ttry { \n\t\t\tintLiteralConstructor_ = Permit.getConstructor(IntLiteral.class, parameterTypes);\n\t\t} catch (Throwable ignore) {\n\t\t\t// probably eclipse 3.7++\n\t\t}\n\t\ttry { \n\t\t\tintLiteralFactoryMethod_ = Permit.getMethod(IntLiteral.class, \"buildIntLiteral\", parameterTypes);\n\t\t} catch (Throwable ignore) {\n\t\t\t// probably eclipse versions before 3.7\n\t\t}\n\t\tintLiteralConstructor = intLiteralConstructor_;\n\t\tintLiteralFactoryMethod = intLiteralFactoryMethod_;\n\t}\n\t\n\tprivate static boolean isAllValidOnXCharacters(char[] in) {\n\t\tif (in == null || in.length == 0) return false;\n\t\tfor (char c : in) if (c != '_' && c != 'X' && c != 'x' && c != '$') return false;\n\t\treturn true;\n\t}\n\t\n\tpublic static void addError(String errorName, EclipseNode node) {\n\t\tif (node.getLatestJavaSpecSupported() < 8) {\n\t\t\tnode.addError(\"The correct format is \" + errorName + \"_={@SomeAnnotation, @SomeOtherAnnotation})\");\n\t\t} else {\n\t\t\tnode.addError(\"The correct format is \" + errorName + \"=@__({@SomeAnnotation, @SomeOtherAnnotation}))\");\n\t\t}\n\t}\n\t\n\tpublic static List<Annotation> unboxAndRemoveAnnotationParameter(Annotation annotation, String annotationName, String errorName, EclipseNode errorNode) {\n\t\tif (\"value\".equals(annotationName)) {\n\t\t\t// We can't unbox this, because SingleMemberAnnotation REQUIRES a value, and this method\n\t\t\t// is supposed to remove the value. That means we need to replace the SMA with either\n\t\t\t// MarkerAnnotation or NormalAnnotation and that is beyond the scope of this method as we\n\t\t\t// don't need that at the time of writing this method; we only unbox onMethod, onParameter\n\t\t\t// and onConstructor. Let's exit early and very obviously:\n\t\t\tthrow new UnsupportedOperationException(\"Lombok cannot unbox 'value' from SingleMemberAnnotation at this time.\");\n\t\t}\n\t\tif (!NormalAnnotation.class.equals(annotation.getClass())) {\n\t\t\t// Prevent MarkerAnnotation, SingleMemberAnnotation, and\n\t\t\t// CompletionOnAnnotationMemberValuePair from triggering this handler.\n\t\t\treturn Collections.emptyList();\n\t\t}\n\t\t\n\t\tNormalAnnotation normalAnnotation = (NormalAnnotation) annotation;\n\t\tMemberValuePair[] pairs = normalAnnotation.memberValuePairs;\n\t\t\n\t\tif (pairs == null) return Collections.emptyList();\n\t\t\n\t\tchar[] nameAsCharArray = annotationName.toCharArray();\n\t\t\n\t\ttop:\n\t\tfor (int i = 0; i < pairs.length; i++) {\n\t\t\tboolean allowRaw;\n\t\t\tchar[] name = pairs[i].name;\n\t\t\tif (name == null) continue;\n\t\t\tif (name.length < nameAsCharArray.length) continue;\n\t\t\tfor (int j = 0; j < nameAsCharArray.length; j++) {\n\t\t\t\tif (name[j] != nameAsCharArray[j]) continue top;\n\t\t\t}\n\t\t\tallowRaw = name.length > nameAsCharArray.length;\n\t\t\tfor (int j = nameAsCharArray.length; j < name.length; j++) {\n\t\t\t\tif (name[j] != '_') continue top;\n\t\t\t}\n\t\t\t// If we're still here it's the targeted annotation param.\n\t\t\tExpression value = pairs[i].value;\n\t\t\tMemberValuePair[] newPairs = new MemberValuePair[pairs.length - 1];\n\t\t\tif (i > 0) System.arraycopy(pairs, 0, newPairs, 0, i);\n\t\t\tif (i < pairs.length - 1) System.arraycopy(pairs, i + 1, newPairs, i, pairs.length - i - 1);\n\t\t\tnormalAnnotation.memberValuePairs = newPairs;\n\t\t\t// We have now removed the annotation parameter and stored the value,\n\t\t\t// which we must now unbox. It's either annotations, or @__(annotations).\n\t\t\t\n\t\t\tExpression content = null;\n\t\t\t\n\t\t\tif (value instanceof ArrayInitializer) {\n\t\t\t\tif (!allowRaw) {\n\t\t\t\t\taddError(errorName, errorNode);\n\t\t\t\t\treturn Collections.emptyList();\n\t\t\t\t}\n\t\t\t\tcontent = value;\n\t\t\t} else if (!(value instanceof Annotation)) {\n\t\t\t\taddError(errorName, errorNode);\n\t\t\t\treturn Collections.emptyList();\n\t\t\t} else {\n\t\t\t\tAnnotation atDummyIdentifier = (Annotation) value;\n\t\t\t\tif (atDummyIdentifier.type instanceof SingleTypeReference && isAllValidOnXCharacters(((SingleTypeReference) atDummyIdentifier.type).token)) {\n\t\t\t\t\tif (atDummyIdentifier instanceof MarkerAnnotation) {\n\t\t\t\t\t\treturn Collections.emptyList();\n\t\t\t\t\t} else if (atDummyIdentifier instanceof NormalAnnotation) {\n\t\t\t\t\t\tMemberValuePair[] mvps = ((NormalAnnotation) atDummyIdentifier).memberValuePairs;\n\t\t\t\t\t\tif (mvps == null || mvps.length == 0) {\n\t\t\t\t\t\t\treturn Collections.emptyList();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (mvps.length == 1 && Arrays.equals(\"value\".toCharArray(), mvps[0].name)) {\n\t\t\t\t\t\t\tcontent = mvps[0].value;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (atDummyIdentifier instanceof SingleMemberAnnotation) {\n\t\t\t\t\t\tcontent = ((SingleMemberAnnotation) atDummyIdentifier).memberValue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\taddError(errorName, errorNode);\n\t\t\t\t\t\treturn Collections.emptyList();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (allowRaw) {\n\t\t\t\t\t\tcontent = atDummyIdentifier;\n\t\t\t\t\t} else {\n\t\t\t\t\t\taddError(errorName, errorNode);\n\t\t\t\t\t\treturn Collections.emptyList();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (content == null) {\n\t\t\t\taddError(errorName, errorNode);\n\t\t\t\treturn Collections.emptyList();\n\t\t\t}\n\t\t\t\n\t\t\tif (content instanceof Annotation) {\n\t\t\t\treturn Collections.singletonList((Annotation) content);\n\t\t\t} else if (content instanceof ArrayInitializer) {\n\t\t\t\tExpression[] expressions = ((ArrayInitializer) content).expressions;\n\t\t\t\tList<Annotation> result = new ArrayList<Annotation>();\n\t\t\t\tif (expressions != null) for (Expression ex : expressions) {\n\t\t\t\t\tif (ex instanceof Annotation) result.add((Annotation) ex);\n\t\t\t\t\telse {\n\t\t\t\t\t\taddError(errorName, errorNode);\n\t\t\t\t\t\treturn Collections.emptyList();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t} else {\n\t\t\t\taddError(errorName, errorNode);\n\t\t\t\treturn Collections.emptyList();\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn Collections.emptyList();\n\t}\n\t\n\tpublic static NameReference createNameReference(String name, Annotation source) {\n\t\treturn generateQualifiedNameRef(source, fromQualifiedName(name));\n\t}\n\t\n\tprivate static long[] copy(long[] array) {\n\t\treturn array == null ? null : array.clone();\n\t}\n\t\n\tpublic static <T> T[] concat(T[] first, T[] second, Class<T> type) {\n\t\tif (first == null)\n\t\t\treturn second;\n\t\tif (second == null)\n\t\t\treturn first;\n\t\tif (first.length == 0)\n\t\t\treturn second;\n\t\tif (second.length == 0)\n\t\t\treturn first;\n\t\tT[] result = newArray(type, first.length + second.length);\n\t\tSystem.arraycopy(first, 0, result, 0, first.length);\n\t\tSystem.arraycopy(second, 0, result, first.length, second.length);\n\t\treturn result;\n\t}\n\t\n\t@SuppressWarnings(\"unchecked\")\n\tprivate static <T> T[] newArray(Class<T> type, int length) {\n\t\treturn (T[]) Array.newInstance(type, length);\n\t}\n\t\n\tpublic static boolean isDirectDescendantOfObject(EclipseNode typeNode) {\n\t\tif (!(typeNode.get() instanceof TypeDeclaration)) throw new IllegalArgumentException(\"not a type node\");\n\t\tTypeDeclaration typeDecl = (TypeDeclaration) typeNode.get();\n\t\tif (typeDecl.superclass == null) return true;\n\t\tString p = typeDecl.superclass.toString();\n\t\treturn p.equals(\"Object\") || p.equals(\"java.lang.Object\");\n\t}\n\t\n\tpublic static void createRelevantNullableAnnotation(EclipseNode typeNode, MethodDeclaration mth) {\n\t\tNullAnnotationLibrary lib = typeNode.getAst().readConfiguration(ConfigurationKeys.ADD_NULL_ANNOTATIONS);\n\t\tif (lib == null) return;\n\t\t\n\t\tapplyAnnotationToMethodDecl(typeNode, mth, lib.getNullableAnnotation(), lib.isTypeUse());\n\t}\n\t\n\tpublic static void createRelevantNonNullAnnotation(EclipseNode typeNode, MethodDeclaration mth) {\n\t\tNullAnnotationLibrary lib = typeNode.getAst().readConfiguration(ConfigurationKeys.ADD_NULL_ANNOTATIONS);\n\t\tif (lib == null) return;\n\t\t\n\t\tapplyAnnotationToMethodDecl(typeNode, mth, lib.getNonNullAnnotation(), lib.isTypeUse());\n\t}\n\t\n\tpublic static void createRelevantNullableAnnotation(EclipseNode typeNode, Argument arg, MethodDeclaration mth) {\n\t\tNullAnnotationLibrary lib = typeNode.getAst().readConfiguration(ConfigurationKeys.ADD_NULL_ANNOTATIONS);\n\t\tif (lib == null) return;\n\t\t\n\t\tapplyAnnotationToVarDecl(typeNode, arg, mth, lib.getNullableAnnotation(), lib.isTypeUse());\n\t}\n\t\n\tpublic static void createRelevantNullableAnnotation(EclipseNode typeNode, Argument arg, MethodDeclaration mth, List<NullAnnotationLibrary> applied) {\n\t\tNullAnnotationLibrary lib = typeNode.getAst().readConfiguration(ConfigurationKeys.ADD_NULL_ANNOTATIONS);\n\t\tif (lib == null || applied.contains(lib)) return;\n\t\t\n\t\tapplyAnnotationToVarDecl(typeNode, arg, mth, lib.getNullableAnnotation(), lib.isTypeUse());\n\t}\n\t\n\tpublic static void createRelevantNonNullAnnotation(EclipseNode typeNode, Argument arg, MethodDeclaration mth) {\n\t\tNullAnnotationLibrary lib = typeNode.getAst().readConfiguration(ConfigurationKeys.ADD_NULL_ANNOTATIONS);\n\t\tif (lib == null) return;\n\t\t\n\t\tapplyAnnotationToVarDecl(typeNode, arg, mth, lib.getNonNullAnnotation(), lib.isTypeUse());\n\t}\n\t\n\tprivate static void applyAnnotationToMethodDecl(EclipseNode typeNode, MethodDeclaration mth, String annType, boolean typeUse) {\n\t\tif (annType == null) return;\n\t\t\n\t\tint partCount = 1;\n\t\tfor (int i = 0; i < annType.length(); i++) if (annType.charAt(i) == '.') partCount++;\n\t\tlong[] ps = new long[partCount];\n\t\tArrays.fill(ps, 0L);\n\t\tAnnotation ann = new MarkerAnnotation(new QualifiedTypeReference(Eclipse.fromQualifiedName(annType), ps), 0);\n\t\t\n\t\tif (!typeUse || mth.returnType == null || mth.returnType.getTypeName().length < 2) {\n\t\t\tAnnotation[] a = mth.annotations;\n\t\t\tif (a == null) a = new Annotation[1];\n\t\t\telse {\n\t\t\t\tAnnotation[] b = new Annotation[a.length + 1];\n\t\t\t\tSystem.arraycopy(a, 0, b, 0, a.length);\n\t\t\t\ta = b;\n\t\t\t}\n\t\t\ta[a.length - 1] = ann;\n\t\t\tmth.annotations = a;\n\t\t} else {\n\t\t\tint len = mth.returnType.getTypeName().length;\n\t\t\tif (mth.returnType.annotations == null) mth.returnType.annotations = new Annotation[len][];\n\t\t\tAnnotation[] a = mth.returnType.annotations[len - 1];\n\t\t\tif (a == null) a = new Annotation[1];\n\t\t\telse {\n\t\t\t\tAnnotation[] b = new Annotation[a.length + 1];\n\t\t\t\tSystem.arraycopy(a, 0, b, 1, a.length);\n\t\t\t\ta = b;\n\t\t\t}\n\t\t\ta[0] = ann;\n\t\t\tmth.returnType.annotations[len - 1] = a;\n\t\t\tmth.bits |= Eclipse.HasTypeAnnotations;\n\t\t}\n\t}\n\tprivate static void applyAnnotationToVarDecl(EclipseNode typeNode, Argument arg, MethodDeclaration mth, String annType, boolean typeUse) {\n\t\tif (annType == null) return;\n\t\t\n\t\tint partCount = 1;\n\t\tfor (int i = 0; i < annType.length(); i++) if (annType.charAt(i) == '.') partCount++;\n\t\tlong[] ps = new long[partCount];\n\t\tArrays.fill(ps, 0L);\n\t\tAnnotation ann = new MarkerAnnotation(new QualifiedTypeReference(Eclipse.fromQualifiedName(annType), ps), 0);\n\t\t\n\t\tif (!typeUse || arg.type.getTypeName().length < 2) {\n\t\t\tAnnotation[] a = arg.annotations;\n\t\t\tif (a == null) a = new Annotation[1];\n\t\t\telse {\n\t\t\t\tAnnotation[] b = new Annotation[a.length + 1];\n\t\t\t\tSystem.arraycopy(a, 0, b, 0, a.length);\n\t\t\t\ta = b;\n\t\t\t}\n\t\t\ta[a.length - 1] = ann;\n\t\t\targ.annotations = a;\n\t\t} else {\n\t\t\tint len = arg.type.getTypeName().length;\n\t\t\tif (arg.type.annotations == null) arg.type.annotations = new Annotation[len][];\n\t\t\tAnnotation[] a = arg.type.annotations[len - 1];\n\t\t\tif (a == null) a = new Annotation[1];\n\t\t\telse {\n\t\t\t\tAnnotation[] b = new Annotation[a.length + 1];\n\t\t\t\tSystem.arraycopy(a, 0, b, 1, a.length);\n\t\t\t\ta = b;\n\t\t\t}\n\t\t\ta[0] = ann;\n\t\t\targ.type.annotations[len - 1] = a;\n\t\t\targ.type.bits |= Eclipse.HasTypeAnnotations;\n\t\t\targ.bits |= Eclipse.HasTypeAnnotations;\n\t\t\tmth.bits |= Eclipse.HasTypeAnnotations;\n\t\t}\n\t}\n\t\n\tpublic static NameReference generateQualifiedNameRef(ASTNode source, char[]... varNames) {\n\t\tint pS = source.sourceStart, pE = source.sourceEnd;\n\t\tlong p = (long)pS << 32 | pE;\n\t\t\n\t\tNameReference ref;\n\t\t\n\t\tif (varNames.length > 1) ref = new QualifiedNameReference(varNames, new long[varNames.length], pS, pE);\n\t\telse ref = new SingleNameReference(varNames[0], p);\n\t\tsetGeneratedBy(ref, source);\n\t\treturn ref;\n\t}\n\t\n\tpublic static TypeReference generateQualifiedTypeRef(ASTNode source, char[]... varNames) {\n\t\tint pS = source.sourceStart, pE = source.sourceEnd;\n\t\tlong p = (long)pS << 32 | pE;\n\t\t\n\t\tTypeReference ref;\n\t\t\n\t\tlong[] poss = Eclipse.poss(source, varNames.length);\n\t\tif (varNames.length > 1) ref = new QualifiedTypeReference(varNames, poss);\n\t\telse ref = new SingleTypeReference(varNames[0], p);\n\t\tsetGeneratedBy(ref, source);\n\t\treturn ref;\n\t}\n\t\n\tpublic static TypeReference createTypeReference(String typeName, ASTNode source) {\n\t\treturn generateQualifiedTypeRef(source, fromQualifiedName(typeName));\n\t}\n\t\n\t/**\n\t * Returns {@code true} if the provided node is an actual class and not some other type declaration (so, not an annotation definition, interface, enum, or record).\n\t */\n\tpublic static boolean isClass(EclipseNode typeNode) {\n\t\treturn isTypeAndDoesNotHaveFlags(typeNode, ClassFileConstants.AccInterface | ClassFileConstants.AccEnum | ClassFileConstants.AccAnnotation | AccRecord);\n\t}\n\t\n\t/**\n\t * Returns {@code true} if the provided node is an actual class or enum and not some other type declaration (so, not an annotation definition, interface, or record).\n\t */\n\tpublic static boolean isClassOrEnum(EclipseNode typeNode) {\n\t\treturn isTypeAndDoesNotHaveFlags(typeNode, ClassFileConstants.AccInterface | ClassFileConstants.AccAnnotation | AccRecord);\n\t}\n\t\n\t/**\n\t * Returns {@code true} if the provided node is an actual class, an enum or a record and not some other type declaration (so, not an annotation definition or interface).\n\t */\n\tpublic static boolean isClassEnumOrRecord(EclipseNode typeNode) {\n\t\treturn isTypeAndDoesNotHaveFlags(typeNode, ClassFileConstants.AccInterface | ClassFileConstants.AccAnnotation);\n\t}\n\t\n\t/**\n\t * Returns {@code true} if the provided node is a record declaration (so, not an annotation definition, interface, enum, or plain class).\n\t */\n\tpublic static boolean isRecord(EclipseNode typeNode) {\n\t\tASTNode node = typeNode.get();\n\t\treturn node instanceof TypeDeclaration && isRecord((TypeDeclaration) node);\n\t}\n\t\n\t/**\n\t * Returns {@code true} If the provided node is a field declaration, and represents a field in a {@code record} declaration.\n\t */\n\tpublic static boolean isRecordField(EclipseNode fieldNode) {\n\t\treturn fieldNode.getKind() == Kind.FIELD && (((FieldDeclaration) fieldNode.get()).modifiers & AccRecord) != 0;\n\t}\n\t\n\t/**\n\t * Returns {@code true} If the provided node is a field declaration, and represents a field in a {@code record} declaration.\n\t */\n\tpublic static boolean isRecordField(FieldDeclaration fieldDeclaration) {\n\t\treturn (fieldDeclaration.modifiers & AccRecord) != 0;\n\t}\n\t\n\t/**\n\t * Returns {@code true) if the provided node is a type declaration <em>and</em> is <strong>not</strong> of any kind indicated by the flags (the intent is to pass flags usch as `ClassFileConstants.AccEnum`).\n\t */\n\tstatic boolean isTypeAndDoesNotHaveFlags(EclipseNode typeNode, long flags) {\n\t\tTypeDeclaration typeDecl = null;\n\t\tif (typeNode.get() instanceof TypeDeclaration) typeDecl = (TypeDeclaration) typeNode.get();\n\t\tint modifiers = typeDecl == null ? 0 : typeDecl.modifiers;\n\t\treturn (modifiers & flags) == 0;\n\t}\n\t\n\t/**\n\t * Returns {@code true} if the provided node supports static methods and types (top level or static class)\n\t */\n\tpublic static boolean isStaticAllowed(EclipseNode typeNode) {\n\t\treturn typeNode.isStatic() || typeNode.up() == null || typeNode.up().getKind() == Kind.COMPILATION_UNIT || isRecord(typeNode);\n\t}\n\t\n\t/**\n\t * Returns {@code true} if the provided type declaration is a record declaration (so, not an annotation definition, interface, enum, or plain class).\n\t */\n\tpublic static boolean isRecord(TypeDeclaration typeDecl) {\n\t\tint modifiers = typeDecl == null ? 0 : typeDecl.modifiers;\n\t\treturn (modifiers & AccRecord) != 0;\n\t}\n\t\n\tpublic static AbstractVariableDeclaration[] getRecordComponents(TypeDeclaration typeDeclaration) {\n\t\tif (typeDeclaration == null || (typeDeclaration.modifiers & AccRecord) == 0) return null;\n\t\ttry {\n\t\t\treturn (AbstractVariableDeclaration[]) TYPE_DECLARATION_RECORD_COMPONENTS.get(typeDeclaration);\n\t\t} catch (Exception e) {\n\t\t\t// This presumably means this isn't a JDK16 - fall through.\n\t\t}\n\t\treturn null;\n\t}\n\t\n\tpublic static Annotation[][] getRecordFieldAnnotations(TypeDeclaration typeDeclaration) {\n\t\tif (typeDeclaration.fields == null) return null;\n\t\tAnnotation[][] annotations = new Annotation[typeDeclaration.fields.length][];\n\t\t\n\t\tAbstractVariableDeclaration[] recordComponents = getRecordComponents(typeDeclaration);\n\t\tif (recordComponents != null) {\n\t\t\tint j = 0;\n\t\t\tfor (int i = 0; i < typeDeclaration.fields.length; i++) {\n\t\t\t\tif ((typeDeclaration.fields[i].modifiers & AccRecord) != 0) {\n\t\t\t\t\tannotations[i] = recordComponents[j++].annotations;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn annotations;\n\t}\n\t\n\tprivate static final Pattern JAVADOC_PATTERN = Pattern.compile(\"^\\\\s*\\\\/\\\\*\\\\*(.*?)\\\\*\\\\/\", Pattern.MULTILINE | Pattern.DOTALL);\n\tprivate static final Pattern LEADING_ASTERISKS_PATTERN = Pattern.compile(\"^\\\\s*\\\\* ?\", Pattern.MULTILINE);\n\n\tpublic static String getDocComment(EclipseNode eclipseNode) {\n\t\tif (eclipseNode.getAst().getSource() == null) return null;\n\t\t\n\t\tint start = -1;\n\t\tint end = -1;\n\t\t\n\t\tfinal ASTNode node = eclipseNode.get();\n\t\tif (node instanceof FieldDeclaration) {\n\t\t\tFieldDeclaration fieldDeclaration = (FieldDeclaration) node;\n\t\t\tstart = fieldDeclaration.declarationSourceStart;\n\t\t\tend = fieldDeclaration.declarationSourceEnd;\n\t\t} else if (node instanceof AbstractMethodDeclaration) {\n\t\t\tAbstractMethodDeclaration abstractMethodDeclaration = (AbstractMethodDeclaration) node;\n\t\t\tstart = abstractMethodDeclaration.declarationSourceStart;\n\t\t\tend = abstractMethodDeclaration.declarationSourceEnd;\n\t\t}\n\t\tif (start != -1 && end != -1) {\n\t\t\tchar[] rawContent = CharOperation.subarray(eclipseNode.getAst().getSource(), start, end);\n\t\t\tString rawContentString = new String(rawContent);\n\t\t\tMatcher javadocMatcher = JAVADOC_PATTERN.matcher(rawContentString);\n\t\t\tif (javadocMatcher.find()) {\n\t\t\t\tString javadoc = javadocMatcher.group(1);\n\t\t\t\t/* Remove all leading asterisks */\n\t\t\t\treturn LEADING_ASTERISKS_PATTERN.matcher(javadoc).replaceAll(\"\").trim();\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\t\n\tpublic static void setDocComment(EclipseNode typeNode, EclipseNode eclipseNode, String doc) {\n\t\tsetDocComment((CompilationUnitDeclaration) eclipseNode.top().get(), (TypeDeclaration) typeNode.get(), eclipseNode.get(), doc);\n\t}\n\t\n\tpublic static void setDocComment(CompilationUnitDeclaration cud, EclipseNode eclipseNode, String doc) {\n\t\tsetDocComment(cud, (TypeDeclaration) upToTypeNode(eclipseNode).get(), eclipseNode.get(), doc);\n\t}\n\t\n\tpublic static void setDocComment(CompilationUnitDeclaration cud, TypeDeclaration type, ASTNode node, String doc) {\n\t\tif (doc == null) return;\n\t\t\n\t\tICompilationUnit compilationUnit = cud.compilationResult.compilationUnit;\n\t\tif (compilationUnit == null) return;\n\t\tif (compilationUnit.getClass().equals(COMPILATION_UNIT)) {\n\t\t\ttry {\n\t\t\t\tcompilationUnit = (ICompilationUnit) Permit.invoke(COMPILATION_UNIT_ORIGINAL_FROM_CLONE, compilationUnit);\n\t\t\t} catch (Throwable t) { }\n\t\t}\n\t\t\n\t\tMap<String, String> docs = EcjAugments.CompilationUnit_javadoc.setIfAbsent(compilationUnit, new HashMap<String, String>());\n\t\tif (node instanceof AbstractMethodDeclaration) {\n\t\t\tAbstractMethodDeclaration methodDeclaration = (AbstractMethodDeclaration) node;\n\t\t\tString signature = getSignature(type, methodDeclaration);\n\t\t\t/* Add javadoc start marker, remove trailing line break, add leading asterisks to each line, add javadoc end marker */\n\t\t\tdocs.put(signature, String.format(\"/**%n%s%n */\", doc.replaceAll(\"$\\\\r?\\\\n\", \"\").replaceAll(\"(?m)^\", \" * \")));\n\t\t}\n\t}\n\t\n\tpublic static String getSignature(TypeDeclaration type, AbstractMethodDeclaration methodDeclaration) {\n\t\tStringBuilder sb = new StringBuilder();\n\t\tsb.append(type.name);\n\t\tsb.append(\".\");\n\t\tsb.append(methodDeclaration.selector);\n\t\tsb.append(\"(\");\n\t\tArgument[] arguments = methodDeclaration.arguments;\n\t\tif (arguments != null) {\n\t\t\tfor (Argument argument : arguments) {\n\t\t\t\tsb.append(String.valueOf(argument.type));\n\t\t\t}\n\t\t}\n\t\tsb.append(\")\");\n\t\treturn sb.toString();\n\t}\n\t\n\tpublic static enum CopyJavadoc {\n\t\tVERBATIM {\n\t\t\t@Override public String apply(final EclipseNode node) {\n\t\t\t\treturn getDocComment(node);\n\t\t\t}\n\t\t},\n\t\tGETTER {\n\t\t\t@Override public String apply(final EclipseNode node) {\n\t\t\t\tString javadoc = getDocComment(node);\n\t\t\t\t// step 1: Check if there is a 'GETTER' section. If yes, that becomes the new method's javadoc.\n\t\t\t\tString out = getJavadocSection(javadoc, \"GETTER\");\n\t\t\t\tfinal boolean sectionBased = out != null;\n\t\t\t\tif (!sectionBased) {\n\t\t\t\t\tout = stripLinesWithTagFromJavadoc(stripSectionsFromJavadoc(javadoc), JavadocTag.PARAM);\n\t\t\t\t}\n\t\t\t\treturn out;\n\t\t\t}\n\t\t},\n\t\tSETTER {\n\t\t\t@Override public String apply(final EclipseNode node) {\n\t\t\t\treturn applySetter(node, \"SETTER\");\n\t\t\t}\n\t\t},\n\t\tWITH {\n\t\t\t@Override public String apply(final EclipseNode node) {\n\t\t\t\treturn addReturnsUpdatedSelfIfNeeded(applySetter(node, \"WITH|WITHER\"));\n\t\t\t}\n\t\t},\n\t\tWITH_BY {\n\t\t\t@Override public String apply( final EclipseNode node) {\n\t\t\t\treturn applySetter(node, \"WITHBY|WITH_BY\");\n\t\t\t}\n\t\t};\n\t\t\n\t\tpublic abstract String apply(final EclipseNode node);\n\t\t\n\t\tprivate static String applySetter(EclipseNode node, String sectionName) {\n\t\t\tString javadoc = getDocComment(node);\n\t\t\t// step 1: Check if there is a 'SETTER' section. If yes, that becomes the new method's javadoc.\n\t\t\tString out = getJavadocSection(javadoc, sectionName);\n\t\t\tfinal boolean sectionBased = out != null;\n\t\t\tif (!sectionBased) {\n\t\t\t\tout = stripLinesWithTagFromJavadoc(stripSectionsFromJavadoc(javadoc), JavadocTag.RETURN);\n\t\t\t}\n\t\t\treturn shouldReturnThis(node, EclipseHandlerUtil.getAccessorsForField(node)) ? addReturnsThisIfNeeded(out) : out;\n\t\t}\n\t}\n\t\n\t/**\n\t * Copies javadoc on one node to the other.\n\t * \n\t * This one is a shortcut for {@link EclipseHandlerUtil#copyJavadoc(EclipseNode, ASTNode, TypeDeclaration, CopyJavadoc, boolean)}\n\t * if source and target node are in the same type.\n\t */\n\tpublic static void copyJavadoc(EclipseNode from, ASTNode to, CopyJavadoc copyMode) {\n\t\tcopyJavadoc(from, to, (TypeDeclaration) upToTypeNode(from).get(), copyMode, false);\n\t}\n\t\n\t/**\n\t * Copies javadoc on one node to the other.\n\t * \n\t * This one is a shortcut for {@link EclipseHandlerUtil#copyJavadoc(EclipseNode, ASTNode, TypeDeclaration, CopyJavadoc, boolean)}\n\t * if source and target node are in the same type.\n\t */\n\tpublic static void copyJavadoc(EclipseNode from, ASTNode to, CopyJavadoc copyMode, boolean forceAddReturn) {\n\t\tcopyJavadoc(from, to, (TypeDeclaration) upToTypeNode(from).get(), copyMode, forceAddReturn);\n\t}\n\t\n\tpublic static void copyJavadoc(EclipseNode from, ASTNode to, TypeDeclaration type, CopyJavadoc copyMode) {\n\t\tcopyJavadoc(from, to, type, copyMode, false);\n\t}\n\t\n\t/**\n\t * Copies javadoc on one node to the other.\n\t * \n\t * in 'GETTER' copyMode, first a 'GETTER' segment is searched for. If it exists, that will become the javadoc for the 'to' node, and this section is\n\t * stripped out of the 'from' node. If no 'GETTER' segment is found, then the entire javadoc is taken minus any {@code @param} lines and other sections.\n\t * any {@code @return} lines are stripped from 'from'.\n\t * \n\t * in 'SETTER' mode, stripping works similarly to 'GETTER' mode, except {@code param} are copied and stripped from the original and {@code @return} are skipped.\n\t */\n\tpublic static void copyJavadoc(EclipseNode from, ASTNode to, TypeDeclaration type, CopyJavadoc copyMode, boolean forceAddReturn) {\n\t\tif (copyMode == null) copyMode = CopyJavadoc.VERBATIM;\n\t\ttry {\n\t\t\tCompilationUnitDeclaration cud = ((CompilationUnitDeclaration) from.top().get());\n\t\t\tString newJavadoc = copyMode.apply(from);\n\t\t\tif (forceAddReturn) {\n\t\t\t\tnewJavadoc = addReturnsThisIfNeeded(newJavadoc);\n\t\t\t}\n\t\t\tsetDocComment(cud, type, to, newJavadoc);\n\t\t} catch (Exception ignore) {}\n\t}\n\t\n\tpublic static void copyJavadocFromParam(EclipseNode from, MethodDeclaration to, TypeDeclaration type, String param) {\n\t\ttry {\n\t\t\tCompilationUnitDeclaration cud = (CompilationUnitDeclaration) from.top().get();\n\t\t\tString methodComment = getDocComment(from);\n\t\t\tString newJavadoc = addReturnsThisIfNeeded(getParamJavadoc(methodComment, param));\n\t\t\tsetDocComment(cud, type, to, newJavadoc);\n\t\t} catch (Exception ignore) {}\n\t}\n\n\t/**\n\t * Returns the method node containing the given annotation, or {@code null} if the given annotation node is not on a method or argument.\n\t */\n\tpublic static EclipseNode getAnnotatedMethod(EclipseNode node) {\n\t\tif (node == null || node.getKind() != Kind.ANNOTATION) return null;\n\t\t\n\t\tEclipseNode result = node.up();\n\t\tif (result.getKind() == Kind.ARGUMENT) {\n\t\t\tresult = node.up();\n\t\t}\n\t\tif (result.getKind() != Kind.METHOD) {\n\t\t\tresult = null;\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * Returns {@code true} if the given method node body was parsed.\n\t */\n\tpublic static boolean hasParsedBody(EclipseNode method) {\n\t\tif (method == null || method.getKind() != Kind.METHOD) return false;\n\t\t\n\t\tboolean isCompleteParse = method.getAst().isCompleteParse();\n\t\tif (isCompleteParse) return true;\n\t\t\n\t\tAbstractMethodDeclaration methodDecl = (AbstractMethodDeclaration) method.get();\n\t\tif (methodDecl.statements != null) return true;\n\t\t\n\t\t// If the method is part of a field initializer it was parsed\n\t\tEclipseNode parent = method.up();\n\t\twhile (parent != null) {\n\t\t\tif (parent.getKind() == Kind.FIELD) return true;\n\t\t\tparent = parent.up();\n\t\t}\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/EclipseSingularsRecipes.java",
    "content": "/*\n * Copyright (C) 2015-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.Argument;\nimport org.eclipse.jdt.internal.compiler.ast.Block;\nimport org.eclipse.jdt.internal.compiler.ast.ConditionalExpression;\nimport org.eclipse.jdt.internal.compiler.ast.EqualExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.FieldReference;\nimport org.eclipse.jdt.internal.compiler.ast.IfStatement;\nimport org.eclipse.jdt.internal.compiler.ast.IntLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.MessageSend;\nimport org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.NullLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.OperatorIds;\nimport org.eclipse.jdt.internal.compiler.ast.ParameterizedQualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.ParameterizedSingleTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.Reference;\nimport org.eclipse.jdt.internal.compiler.ast.ReturnStatement;\nimport org.eclipse.jdt.internal.compiler.ast.SingleNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.SingleTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.ThisReference;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.Wildcard;\nimport org.eclipse.jdt.internal.compiler.lookup.ClassScope;\nimport org.eclipse.jdt.internal.compiler.lookup.MethodScope;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeConstants;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeIds;\n\nimport lombok.AccessLevel;\nimport lombok.core.LombokImmutableList;\nimport lombok.core.SpiLoadUtil;\nimport lombok.core.TypeLibrary;\nimport lombok.core.configuration.CheckerFrameworkVersion;\nimport lombok.eclipse.EclipseNode;\nimport lombok.eclipse.handlers.HandleBuilder.BuilderJob;\n\npublic class EclipseSingularsRecipes {\n\tpublic interface TypeReferenceMaker {\n\t\tTypeReference make();\n\t}\n\t\n\tpublic interface StatementMaker {\n\t\tStatement make();\n\t}\n\t\n\tprivate static final EclipseSingularsRecipes INSTANCE = new EclipseSingularsRecipes();\n\tprivate final Map<String, EclipseSingularizer> singularizers = new HashMap<String, EclipseSingularizer>();\n\tprivate final TypeLibrary singularizableTypes = new TypeLibrary();\n\t\n\tprivate EclipseSingularsRecipes() {\n\t\ttry {\n\t\t\tloadAll(singularizableTypes, singularizers);\n\t\t\tsingularizableTypes.lock();\n\t\t} catch (IOException e) {\n\t\t\tSystem.err.println(\"Lombok's @Singularizable feature is broken due to misconfigured SPI files: \" + e);\n\t\t}\n\t}\n\t\n\tprivate static void loadAll(TypeLibrary library, Map<String, EclipseSingularizer> map) throws IOException {\n\t\tfor (EclipseSingularizer handler : SpiLoadUtil.findServices(EclipseSingularizer.class, EclipseSingularizer.class.getClassLoader())) {\n\t\t\tfor (String type : handler.getSupportedTypes()) {\n\t\t\t\tEclipseSingularizer existingSingularizer = map.get(type);\n\t\t\t\tif (existingSingularizer != null) {\n\t\t\t\t\tEclipseSingularizer toKeep = existingSingularizer.getClass().getName().compareTo(handler.getClass().getName()) > 0 ? handler : existingSingularizer;\n\t\t\t\t\tSystem.err.println(\"Multiple singularizers found for type \" + type + \"; the alphabetically first class is used: \" + toKeep.getClass().getName());\n\t\t\t\t\tmap.put(type, toKeep);\n\t\t\t\t} else {\n\t\t\t\t\tmap.put(type, handler);\n\t\t\t\t\tlibrary.addType(type);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic static EclipseSingularsRecipes get() {\n\t\treturn INSTANCE;\n\t}\n\t\n\tpublic String toQualified(String typeReference) {\n\t\tList<String> q = singularizableTypes.toQualifieds(typeReference);\n\t\tif (q.isEmpty()) return null;\n\t\treturn q.get(0);\n\t}\n\t\n\tpublic EclipseSingularizer getSingularizer(String fqn) {\n\t\treturn singularizers.get(fqn);\n\t}\n\t\n\tpublic static final class SingularData {\n\t\tprivate final EclipseNode annotation;\n\t\tprivate final char[] singularName;\n\t\tprivate final char[] pluralName;\n\t\tprivate final char[] setterPrefix;\n\t\tprivate final List<TypeReference> typeArgs;\n\t\tprivate final String targetFqn;\n\t\tprivate final EclipseSingularizer singularizer;\n\t\tprivate final boolean ignoreNullCollections;\n\t\tprivate final ASTNode source;\n\t\t\n\t\tpublic SingularData(EclipseNode annotation, char[] singularName, char[] pluralName, List<TypeReference> typeArgs, String targetFqn, EclipseSingularizer singularizer, ASTNode source, boolean ignoreNullCollections) {\n\t\t\tthis(annotation, singularName, pluralName, typeArgs, targetFqn, singularizer, source, ignoreNullCollections, new char[0]);\n\t\t}\n\t\t\n\t\tpublic SingularData(EclipseNode annotation, char[] singularName, char[] pluralName, List<TypeReference> typeArgs, String targetFqn, EclipseSingularizer singularizer, ASTNode source, boolean ignoreNullCollections, char[] setterPrefix) {\n\t\t\tthis.annotation = annotation;\n\t\t\tthis.singularName = singularName;\n\t\t\tthis.pluralName = pluralName;\n\t\t\tthis.typeArgs = typeArgs;\n\t\t\tthis.targetFqn = targetFqn;\n\t\t\tthis.singularizer = singularizer;\n\t\t\tthis.source = source;\n\t\t\tthis.ignoreNullCollections = ignoreNullCollections;\n\t\t\tthis.setterPrefix = setterPrefix;\n\t\t}\n\t\t\n\t\tpublic void setGeneratedByRecursive(ASTNode target) {\n\t\t\tSetGeneratedByVisitor visitor = new SetGeneratedByVisitor(source);\n\t\t\t\n\t\t\tif (target instanceof AbstractMethodDeclaration) {\n\t\t\t\t((AbstractMethodDeclaration) target).traverse(visitor, (ClassScope) null);\n\t\t\t} else if (target instanceof FieldDeclaration) {\n\t\t\t\t((FieldDeclaration) target).traverse(visitor, (MethodScope) null);\n\t\t\t} else {\n\t\t\t\ttarget.traverse(visitor, null);\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic ASTNode getSource() {\n\t\t\treturn source;\n\t\t}\n\t\t\n\t\tpublic EclipseNode getAnnotation() {\n\t\t\treturn annotation;\n\t\t}\n\t\t\n\t\tpublic char[] getSingularName() {\n\t\t\treturn singularName;\n\t\t}\n\t\t\n\t\tpublic char[] getPluralName() {\n\t\t\treturn pluralName;\n\t\t}\n\t\t\n\t\tpublic char[] getSetterPrefix() {\n\t\t\treturn setterPrefix;\n\t\t}\n\t\t\n\t\tpublic List<TypeReference> getTypeArgs() {\n\t\t\treturn typeArgs;\n\t\t}\n\t\t\n\t\tpublic String getTargetFqn() {\n\t\t\treturn targetFqn;\n\t\t}\n\t\t\n\t\tpublic EclipseSingularizer getSingularizer() {\n\t\t\treturn singularizer;\n\t\t}\n\t\t\n\t\tpublic boolean isIgnoreNullCollections() {\n\t\t\treturn ignoreNullCollections;\n\t\t}\n\t\t\n\t\tpublic String getTargetSimpleType() {\n\t\t\tint idx = targetFqn.lastIndexOf(\".\");\n\t\t\treturn idx == -1 ? targetFqn : targetFqn.substring(idx + 1);\n\t\t}\n\t}\n\t\n\tpublic static abstract class EclipseSingularizer {\n\t\tprotected static final long[] NULL_POSS = {0L};\n\t\tpublic abstract LombokImmutableList<String> getSupportedTypes();\n\t\t\n\t\t/** Checks if any of the to-be-generated nodes (fields, methods) already exist. If so, errors on these (singulars don't support manually writing some of it, and returns true). */\n\t\tpublic boolean checkForAlreadyExistingNodesAndGenerateError(EclipseNode builderType, SingularData data) {\n\t\t\tfor (EclipseNode child : builderType.down()) {\n\t\t\t\tswitch (child.getKind()) {\n\t\t\t\tcase FIELD: {\n\t\t\t\t\tFieldDeclaration fd = (FieldDeclaration) child.get();\n\t\t\t\t\tchar[] name = fd.name;\n\t\t\t\t\tif (name == null) continue;\n\t\t\t\t\tif (getGeneratedBy(fd) != null) continue;\n\t\t\t\t\tfor (char[] fieldToBeGenerated : listFieldsToBeGenerated(data, builderType)) {\n\t\t\t\t\t\tif (!Arrays.equals(name, fieldToBeGenerated)) continue;\n\t\t\t\t\t\tchild.addError(\"Manually adding a field that @Singular @Builder would generate is not supported. If you want to manually manage the builder aspect for this field/parameter, don't use @Singular.\");\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase METHOD: {\n\t\t\t\t\tAbstractMethodDeclaration method = (AbstractMethodDeclaration) child.get();\n\t\t\t\t\tchar[] name = method.selector;\n\t\t\t\t\tif (name == null) continue;\n\t\t\t\t\tif (getGeneratedBy(method) != null) continue;\n\t\t\t\t\tfor (char[] methodToBeGenerated : listMethodsToBeGenerated(data, builderType)) {\n\t\t\t\t\t\tif (!Arrays.equals(name, methodToBeGenerated)) continue;\n\t\t\t\t\t\tchild.addError(\"Manually adding a method that @Singular @Builder would generate is not supported. If you want to manually manage the builder aspect for this field/parameter, don't use @Singular.\");\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}}\n\t\t\t}\n\t\t\t\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tpublic List<char[]> listFieldsToBeGenerated(SingularData data, EclipseNode builderType) {\n\t\t\treturn Collections.singletonList(data.pluralName);\n\t\t}\n\t\t\n\t\tpublic List<char[]> listMethodsToBeGenerated(SingularData data, EclipseNode builderType) {\n\t\t\tchar[] p = data.pluralName;\n\t\t\tchar[] s = data.singularName;\n\t\t\tif (Arrays.equals(p, s)) return Collections.singletonList(p);\n\t\t\treturn Arrays.asList(p, s);\n\t\t}\n\t\t\n\t\tpublic abstract List<EclipseNode> generateFields(SingularData data, EclipseNode builderType);\n\t\t\n\t\t/**\n\t\t * Generates the singular, plural, and clear methods for the given {@link SingularData}.\n\t\t * Uses the given {@code builderType} as return type if {@code chain == true}, {@code void} otherwise.\n\t\t * If you need more control over the return type and value, use\n\t\t * {@link #generateMethods(SingularData, boolean, EclipseNode, boolean, TypeReferenceMaker, StatementMaker)}.\n\t\t */\n\t\tpublic void generateMethods(final BuilderJob job, SingularData data, boolean deprecate) {\n\t\t\tTypeReferenceMaker returnTypeMaker = new TypeReferenceMaker() {\n\t\t\t\t@Override public TypeReference make() {\n\t\t\t\t\treturn job.oldChain ? cloneSelfType(job.builderType) : TypeReference.baseTypeReference(TypeIds.T_void, 0);\n\t\t\t\t}\n\t\t\t};\n\t\t\t\n\t\t\tStatementMaker returnStatementMaker = new StatementMaker() {\n\t\t\t\t@Override public ReturnStatement make() {\n\t\t\t\t\treturn job.oldChain ? new ReturnStatement(new ThisReference(0, 0), 0, 0) : null;\n\t\t\t\t}\n\t\t\t};\n\t\t\t\n\t\t\tgenerateMethods(job.checkerFramework, data, deprecate, job.builderType, job.oldFluent, returnTypeMaker, returnStatementMaker, job.accessInners);\n\t\t}\n\t\t\n\t\t/**\n\t\t * Generates the singular, plural, and clear methods for the given {@link SingularData}.\n\t\t * Uses the given {@code returnTypeMaker} and {@code returnStatementMaker} for the generated methods.\n\t\t */\n\t\tpublic abstract void generateMethods(CheckerFrameworkVersion cfv, SingularData data, boolean deprecate, EclipseNode builderType, boolean fluent, TypeReferenceMaker returnTypeMaker, StatementMaker returnStatementMaker, AccessLevel access);\n\t\t\n\t\tpublic abstract void appendBuildCode(SingularData data, EclipseNode builderType, List<Statement> statements, char[] targetVariableName, String builderVariable);\n\t\t\n\t\tpublic boolean shadowedDuringBuild() {\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\tpublic boolean requiresCleaning() {\n\t\t\ttry {\n\t\t\t\treturn !getClass().getMethod(\"appendCleaningCode\", SingularData.class, EclipseNode.class, List.class).getDeclaringClass().equals(EclipseSingularizer.class);\n\t\t\t} catch (NoSuchMethodException e) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic void appendCleaningCode(SingularData data, EclipseNode builderType, List<Statement> statements) {\n\t\t}\n\t\t\n\t\t// -- Utility methods --\n\t\t\n\t\tprotected Annotation[] generateSelfReturnAnnotations(boolean deprecate, ASTNode source) {\n\t\t\tAnnotation deprecated = deprecate ? generateDeprecatedAnnotation(source) : null;\n\t\t\tif (deprecated == null) return null;\n\t\t\treturn new Annotation[] {deprecated};\n\t\t}\n\t\t\n\t\t/**\n\t\t * Adds the requested number of type arguments to the provided type, copying each argument in {@code typeArgs}. If typeArgs is too long, the extra elements are ignored.\n\t\t * If {@code typeArgs} is null or too short, {@code java.lang.Object} will be substituted for each missing type argument.\n\t\t * \n\t\t * @param count The number of type arguments requested.\n\t\t * @param addExtends If {@code true}, all bounds are either '? extends X' or just '?'. If false, the reverse is applied, and '? extends Foo' is converted to Foo, '?' to Object, etc.\n\t\t * @param node Some node in the same AST. Just used to obtain makers and contexts and such.\n\t\t * @param type The type to add generics to.\n\t\t * @param typeArgs the list of type args to clone.\n\t\t * @param source The source annotation that is the root cause of this code generation.\n\t\t */\n\t\tprotected TypeReference addTypeArgs(int count, boolean addExtends, EclipseNode node, TypeReference type, List<TypeReference> typeArgs) {\n\t\t\tTypeReference[] clonedAndFixedArgs = createTypeArgs(count, addExtends, node, typeArgs);\n\t\t\tif (type instanceof SingleTypeReference) {\n\t\t\t\ttype = new ParameterizedSingleTypeReference(((SingleTypeReference) type).token, clonedAndFixedArgs, 0, 0L);\n\t\t\t} else if (type instanceof QualifiedTypeReference) {\n\t\t\t\tQualifiedTypeReference qtr = (QualifiedTypeReference) type;\n\t\t\t\tTypeReference[][] trs = new TypeReference[qtr.tokens.length][];\n\t\t\t\ttrs[qtr.tokens.length - 1] = clonedAndFixedArgs;\n\t\t\t\ttype = new ParameterizedQualifiedTypeReference(((QualifiedTypeReference) type).tokens, trs, 0, NULL_POSS);\n\t\t\t} else {\n\t\t\t\tnode.addError(\"Don't know how to clone-and-parameterize type: \" + type);\n\t\t\t}\n\t\t\t\n\t\t\treturn type;\n\t\t}\n\t\t\n\t\tprotected TypeReference[] createTypeArgs(int count, boolean addExtends, EclipseNode node, List<TypeReference> typeArgs) {\n\t\t\tif (count < 0) throw new IllegalArgumentException(\"count is negative\");\n\t\t\tif (count == 0) return null;\n\t\t\tList<TypeReference> arguments = new ArrayList<TypeReference>();\n\t\t\t\n\t\t\tif (typeArgs != null) for (TypeReference orig : typeArgs) {\n\t\t\t\tWildcard wildcard = orig instanceof Wildcard ? (Wildcard) orig : null;\n\t\t\t\tif (!addExtends) {\n\t\t\t\t\tif (wildcard != null && (wildcard.kind == Wildcard.UNBOUND || wildcard.kind == Wildcard.SUPER)) {\n\t\t\t\t\t\targuments.add(new QualifiedTypeReference(TypeConstants.JAVA_LANG_OBJECT, NULL_POSS));\n\t\t\t\t\t} else if (wildcard != null && wildcard.kind == Wildcard.EXTENDS) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\targuments.add(copyType(wildcard.bound));\n\t\t\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t\t\targuments.add(new QualifiedTypeReference(TypeConstants.JAVA_LANG_OBJECT, NULL_POSS));\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\targuments.add(copyType(orig));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (wildcard != null && (wildcard.kind == Wildcard.UNBOUND || wildcard.kind == Wildcard.SUPER)) {\n\t\t\t\t\t\tWildcard w = new Wildcard(Wildcard.UNBOUND);\n\t\t\t\t\t\targuments.add(w);\n\t\t\t\t\t} else if (wildcard != null && wildcard.kind == Wildcard.EXTENDS) {\n\t\t\t\t\t\targuments.add(copyType(orig));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tWildcard w = new Wildcard(Wildcard.EXTENDS);\n\t\t\t\t\t\tw.bound = copyType(orig);\n\t\t\t\t\t\targuments.add(w);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (--count == 0) break;\n\t\t\t}\n\t\t\t\n\t\t\twhile (count-- > 0) {\n\t\t\t\tif (addExtends) {\n\t\t\t\t\targuments.add(new Wildcard(Wildcard.UNBOUND));\n\t\t\t\t} else {\n\t\t\t\t\targuments.add(new QualifiedTypeReference(TypeConstants.JAVA_LANG_OBJECT, NULL_POSS));\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (arguments.isEmpty()) return null;\n\t\t\treturn arguments.toArray(new TypeReference[0]);\n\t\t}\n\t\t\n\t\tprivate static final char[] SIZE_TEXT = new char[] {'s', 'i', 'z', 'e'};\n\t\t\n\t\t/** Generates 'this.<em>name</em>.size()' as an expression; if nullGuard is true, it's this.name == null ? 0 : this.name.size(). */\n\t\tprotected Expression getSize(EclipseNode builderType, char[] name, boolean nullGuard, String builderVariable) {\n\t\t\tMessageSend invoke = new MessageSend();\n\t\t\tReference thisRef = getBuilderReference(builderVariable);\n\t\t\tFieldReference thisDotName = new FieldReference(name, 0L);\n\t\t\tthisDotName.receiver = thisRef;\n\t\t\tinvoke.receiver = thisDotName;\n\t\t\tinvoke.selector = SIZE_TEXT;\n\t\t\tif (!nullGuard) return invoke;\n\t\t\t\n\t\t\tReference cdnThisRef = getBuilderReference(builderVariable);\n\t\t\tFieldReference cdnThisDotName = new FieldReference(name, 0L);\n\t\t\tcdnThisDotName.receiver = cdnThisRef;\n\t\t\tNullLiteral nullLiteral = new NullLiteral(0, 0);\n\t\t\tEqualExpression isNull = new EqualExpression(cdnThisDotName, nullLiteral, OperatorIds.EQUAL_EQUAL);\n\t\t\tIntLiteral zeroLiteral = makeIntLiteral(new char[] {'0'}, null);\n\t\t\tConditionalExpression conditional = new ConditionalExpression(isNull, zeroLiteral, invoke);\n\t\t\treturn conditional;\n\t\t}\n\t\t\n\t\tprotected TypeReference cloneParamType(int index, List<TypeReference> typeArgs, EclipseNode builderType) {\n\t\t\tif (typeArgs != null && typeArgs.size() > index) {\n\t\t\t\tTypeReference originalType = typeArgs.get(index);\n\t\t\t\tif (originalType instanceof Wildcard) {\n\t\t\t\t\tWildcard wOriginalType = (Wildcard) originalType;\n\t\t\t\t\tif (wOriginalType.kind == Wildcard.EXTENDS) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\treturn copyType(wOriginalType.bound);\n\t\t\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t\t\t// fallthrough\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treturn copyType(originalType);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn new QualifiedTypeReference(TypeConstants.JAVA_LANG_OBJECT, NULL_POSS);\n\t\t}\n\t\t\n\t\t/** @return a {@code SingleNameReference} to the builder in the variable {@code builderVariable}. If {@code builderVariable == \"this\"}, a {@code ThisReference} is returned. */\n\t\tprotected static Reference getBuilderReference(String builderVariable) {\n\t\t\tif (\"this\".equals(builderVariable)) {\n\t\t\t\treturn new ThisReference(0, 0);\n\t\t\t} else {\n\t\t\t\treturn new SingleNameReference(builderVariable.toCharArray(), 0);\n\t\t\t}\n\t\t}\n\t\t\n\t\tprotected void nullBehaviorize(EclipseNode typeNode, SingularData data, List<Statement> statements, Argument arg, MethodDeclaration md) {\n\t\t\tboolean ignoreNullCollections = data.isIgnoreNullCollections();\n\t\t\t\n\t\t\tif (ignoreNullCollections) {\n\t\t\t\tExpression isNotNull = new EqualExpression(new SingleNameReference(data.getPluralName(), 0L), new NullLiteral(0, 0), OperatorIds.NOT_EQUAL);\n\t\t\t\tBlock b = new Block(0);\n\t\t\t\tb.statements = statements.toArray(new Statement[statements.size()]);\n\t\t\t\tstatements.clear();\n\t\t\t\tstatements.add(new IfStatement(isNotNull, b, 0, 0));\n\t\t\t\tEclipseHandlerUtil.createRelevantNullableAnnotation(typeNode, arg, md);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tEclipseHandlerUtil.createRelevantNonNullAnnotation(typeNode, arg, md);\n\t\t\tStatement nullCheck = EclipseHandlerUtil.generateNullCheck(null, data.getPluralName(), typeNode, \"%s cannot be null\");\n\t\t\tstatements.add(0, nullCheck);\n\t\t}\n\t\t\n\t\tprotected abstract int getTypeArgumentsCount();\n\t\t\n\t\tprotected abstract char[][] getEmptyMakerReceiver(String targetFqn);\n\t\tprotected abstract char[] getEmptyMakerSelector(String targetFqn);\n\t\t\n\t\tpublic MessageSend getEmptyExpression(String targetFqn, SingularData data, EclipseNode typeNode, ASTNode source) {\n\t\t\tMessageSend send = new MessageSend();\n\t\t\tsend.receiver = generateQualifiedNameRef(source, getEmptyMakerReceiver(targetFqn));\n\t\t\tsend.selector = getEmptyMakerSelector(targetFqn);\n\t\t\tsend.typeArguments = createTypeArgs(getTypeArgumentsCount(), false, typeNode, data.getTypeArgs());\n\t\t\treturn send;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleAccessors.java",
    "content": "/*\n * Copyright (C) 2014-2022 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.handleExperimentalFlagUsage;\nimport lombok.ConfigurationKeys;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.experimental.Accessors;\nimport lombok.spi.Provides;\n\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\n\n@Provides\n@HandlerPriority(65536)\npublic class HandleAccessors extends EclipseAnnotationHandler<Accessors> {\n\t@Override public void handle(AnnotationValues<Accessors> annotation, Annotation ast, EclipseNode annotationNode) {\n\t\t// Accessors itself is handled by HandleGetter/Setter; this is just to ensure that usages are flagged if requested.\n\t\t\n\t\thandleExperimentalFlagUsage(annotationNode, ConfigurationKeys.ACCESSORS_FLAG_USAGE, \"@Accessors\");\n\t\tif (annotation.isMarking()) annotationNode.addWarning(\"Accessors on its own does nothing. Set at least one parameter\");\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleBuilder.java",
    "content": "/*\n * Copyright (C) 2013-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.eclipse.Eclipse.*;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\n\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.AllocationExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.Argument;\nimport org.eclipse.jdt.internal.compiler.ast.ArrayAllocationExpression;\nimport org.eclipse.jdt.internal.compiler.ast.ArrayInitializer;\nimport org.eclipse.jdt.internal.compiler.ast.Assignment;\nimport org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.EqualExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.FalseLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.FieldReference;\nimport org.eclipse.jdt.internal.compiler.ast.IfStatement;\nimport org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.MessageSend;\nimport org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.NullLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.OperatorIds;\nimport org.eclipse.jdt.internal.compiler.ast.ParameterizedQualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.ParameterizedSingleTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedAllocationExpression;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedThisReference;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.Receiver;\nimport org.eclipse.jdt.internal.compiler.ast.ReturnStatement;\nimport org.eclipse.jdt.internal.compiler.ast.SingleNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.SingleTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.StringLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.ThisReference;\nimport org.eclipse.jdt.internal.compiler.ast.TrueLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.TypeParameter;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.UnaryExpression;\nimport org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;\nimport org.eclipse.jdt.internal.compiler.lookup.ClassScope;\nimport org.eclipse.jdt.internal.compiler.lookup.MethodScope;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeConstants;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeIds;\n\nimport lombok.AccessLevel;\nimport lombok.Builder;\nimport lombok.Builder.ObtainVia;\nimport lombok.ConfigurationKeys;\nimport lombok.Singular;\nimport lombok.ToString;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.core.configuration.CheckerFrameworkVersion;\nimport lombok.core.handlers.HandlerUtil;\nimport lombok.core.handlers.HandlerUtil.FieldAccess;\nimport lombok.core.handlers.InclusionExclusionUtils.Included;\nimport lombok.eclipse.Eclipse;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.eclipse.handlers.EclipseHandlerUtil.CopyJavadoc;\nimport lombok.eclipse.handlers.EclipseHandlerUtil.MemberExistsResult;\nimport lombok.eclipse.handlers.EclipseSingularsRecipes.EclipseSingularizer;\nimport lombok.eclipse.handlers.EclipseSingularsRecipes.SingularData;\nimport lombok.eclipse.handlers.HandleConstructor.SkipIfConstructorExists;\nimport lombok.experimental.NonFinal;\nimport lombok.spi.Provides;\n\n@Provides\n@HandlerPriority(-1024) //-2^10; to ensure we've picked up @FieldDefault's changes (-2048) but @Value hasn't removed itself yet (-512), so that we can error on presence of it on the builder classes.\npublic class HandleBuilder extends EclipseAnnotationHandler<Builder> {\n\tprivate HandleConstructor handleConstructor = new HandleConstructor();\n\t\n\tstatic final char[] CLEAN_FIELD_NAME = \"$lombokUnclean\".toCharArray();\n\tstatic final char[] CLEAN_METHOD_NAME = \"$lombokClean\".toCharArray();\n\tstatic final String TO_BUILDER_METHOD_NAME_STRING = \"toBuilder\";\n\tstatic final char[] TO_BUILDER_METHOD_NAME = TO_BUILDER_METHOD_NAME_STRING.toCharArray();\n\tstatic final char[] DEFAULT_PREFIX = {'$', 'd', 'e', 'f', 'a', 'u', 'l', 't', '$'};\n\tstatic final char[] SET_PREFIX = {'$', 's', 'e', 't'};\n\tstatic final char[] VALUE_PREFIX = {'$', 'v', 'a', 'l', 'u', 'e'};\n\tstatic final char[] BUILDER_TEMP_VAR = {'b', 'u', 'i', 'l', 'd', 'e', 'r'};\n\tstatic final AbstractMethodDeclaration[] EMPTY_METHODS = {};\n\tstatic final String TO_BUILDER_NOT_SUPPORTED = \"@Builder(toBuilder=true) is only supported if you return your own type.\";\n\t\n\tprivate static final boolean toBoolean(Object expr, boolean defaultValue) {\n\t\tif (expr == null) return defaultValue;\n\t\tif (expr instanceof FalseLiteral) return false;\n\t\tif (expr instanceof TrueLiteral) return true;\n\t\treturn ((Boolean) expr).booleanValue();\n\t}\n\t\n\tstatic class BuilderJob {\n\t\tCheckerFrameworkVersion checkerFramework;\n\t\tEclipseNode parentType;\n\t\tString builderMethodName, buildMethodName;\n\t\tboolean isStatic;\n\t\tTypeParameter[] typeParams;\n\t\tTypeParameter[] builderTypeParams;\n\t\tASTNode source;\n\t\tEclipseNode sourceNode;\n\t\tList<BuilderFieldData> builderFields;\n\t\tAccessLevel accessInners, accessOuters;\n\t\tboolean oldFluent, oldChain, toBuilder;\n\t\t\n\t\tEclipseNode builderType;\n\t\tString builderClassName;\n\t\tchar[] builderClassNameArr;\n\t\t\n\t\tvoid setBuilderClassName(String builderClassName) {\n\t\t\tthis.builderClassName = builderClassName;\n\t\t\tthis.builderClassNameArr = builderClassName.toCharArray();\n\t\t}\n\t\t\n\t\tTypeParameter[] copyTypeParams() {\n\t\t\treturn EclipseHandlerUtil.copyTypeParams(typeParams, source);\n\t\t}\n\t\t\n\t\tlong getPos() {\n\t\t\treturn ((long) source.sourceStart) << 32 | source.sourceEnd;\n\t\t}\n\t\t\n\t\tpublic TypeReference createBuilderTypeReference() {\n\t\t\treturn namePlusTypeParamsToTypeReference(parentType, builderClassNameArr, !isStatic, builderTypeParams, getPos());\n\t\t}\n\t\t\n\t\tpublic TypeReference createBuilderTypeReferenceForceStatic() {\n\t\t\treturn namePlusTypeParamsToTypeReference(parentType, builderClassNameArr, false, builderTypeParams, getPos());\n\t\t}\n\t\t\n\t\tpublic TypeReference createBuilderParentTypeReference() {\n\t\t\treturn namePlusTypeParamsToTypeReference(parentType, typeParams, getPos());\n\t\t}\n\t\t\n\t\tpublic EclipseNode getTopNode() {\n\t\t\treturn parentType.top();\n\t\t}\n\t\t\n\t\tvoid init(AnnotationValues<Builder> annValues, Builder ann, EclipseNode node) {\n\t\t\taccessOuters = ann.access();\n\t\t\tif (accessOuters == null) accessOuters = AccessLevel.PUBLIC;\n\t\t\tif (accessOuters == AccessLevel.NONE) {\n\t\t\t\tsourceNode.addError(\"AccessLevel.NONE is not valid here\");\n\t\t\t\taccessOuters = AccessLevel.PUBLIC;\n\t\t\t}\n\t\t\taccessInners = accessOuters == AccessLevel.PROTECTED ? AccessLevel.PUBLIC : accessOuters;\n\t\t\t\n\t\t\t// These exist just to support the 'old' lombok.experimental.Builder, which had these properties. lombok.Builder no longer has them.\n\t\t\toldFluent = toBoolean(annValues.getActualExpression(\"fluent\"), true);\n\t\t\toldChain = toBoolean(annValues.getActualExpression(\"chain\"), true);\n\t\t\t\n\t\t\tbuilderMethodName = ann.builderMethodName();\n\t\t\tbuildMethodName = ann.buildMethodName();\n\t\t\tsetBuilderClassName(getBuilderClassNameTemplate(node, ann.builderClassName()));\n\t\t\ttoBuilder = ann.toBuilder();\n\t\t\t\n\t\t\tif (builderMethodName == null) builderMethodName = \"builder\";\n\t\t\tif (buildMethodName == null) buildMethodName = \"build\";\n\t\t}\n\t\t\n\t\tstatic String getBuilderClassNameTemplate(EclipseNode node, String override) {\n\t\t\tif (override != null && !override.isEmpty()) return override;\n\t\t\toverride = node.getAst().readConfiguration(ConfigurationKeys.BUILDER_CLASS_NAME);\n\t\t\tif (override != null && !override.isEmpty()) return override;\n\t\t\treturn \"*Builder\";\n\t\t}\n\t\t\n\t\tMethodDeclaration createNewMethodDeclaration() {\n\t\t\treturn new MethodDeclaration(((CompilationUnitDeclaration) getTopNode().get()).compilationResult);\n\t\t}\n\t\t\n\t\tString replaceBuilderClassName(char[] name) {\n\t\t\treturn replaceBuilderClassName(name, builderClassName);\n\t\t}\n\n\t\tString replaceBuilderClassName(char[] name, String template) {\n\t\t\tif (template.indexOf('*') == -1) return template;\n\t\t\treturn template.replace(\"*\", new String(name));\n\t\t}\n\t\t\n\t\tString replaceBuilderClassName(String name) {\n\t\t\treturn builderClassName.replace(\"*\", name);\n\t\t}\n\t}\n\t\n\tstatic class BuilderFieldData {\n\t\tAnnotation[] annotations;\n\t\tTypeReference type;\n\t\tchar[] rawName;\n\t\tchar[] name;\n\t\tchar[] builderFieldName;\n\t\tchar[] nameOfDefaultProvider;\n\t\tchar[] nameOfSetFlag;\n\t\tSingularData singularData;\n\t\tObtainVia obtainVia;\n\t\tEclipseNode obtainViaNode;\n\t\tEclipseNode originalFieldNode;\n\t\t\n\t\tList<EclipseNode> createdFields = new ArrayList<EclipseNode>();\n\t}\n\t\n\tprivate static boolean equals(String a, char[] b) {\n\t\tif (a.length() != b.length) return false;\n\t\tfor (int i = 0; i < b.length; i++) {\n\t\t\tif (a.charAt(i) != b[i]) return false;\n\t\t}\n\t\treturn true;\n\t}\n\t\n\tprivate static boolean equals(String a, char[][] b) {\n\t\tif (a == null || a.isEmpty()) return b.length == 0;\n\t\tString[] aParts = a.split(\"\\\\.\");\n\t\tif (aParts.length != b.length) return false;\n\t\tfor (int i = 0; i < b.length; i++) {\n\t\t\tif (!equals(aParts[i], b[i])) return false;\n\t\t}\n\t\treturn true;\n\t}\n\t\n\tprivate static final char[] prefixWith(char[] prefix, char[] name) {\n\t\tchar[] out = new char[prefix.length + name.length];\n\t\tSystem.arraycopy(prefix, 0, out, 0, prefix.length);\n\t\tSystem.arraycopy(name, 0, out, prefix.length, name.length);\n\t\treturn out;\n\t}\n\t\n\t@Override public void handle(AnnotationValues<Builder> annotation, Annotation ast, EclipseNode annotationNode) {\n\t\tfinal String BUILDER_NODE_NOT_SUPPORTED_ERR = \"@Builder is only supported on classes, records, constructors, and methods.\";\n\t\t\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.BUILDER_FLAG_USAGE, \"@Builder\");\n\t\tBuilderJob job = new BuilderJob();\n\t\tjob.sourceNode = annotationNode;\n\t\tjob.source = ast;\n\t\tjob.checkerFramework = getCheckerFrameworkVersion(annotationNode);\n\t\tjob.isStatic = true;\n\t\t\n\t\tBuilder annInstance = annotation.getInstance();\n\t\tjob.init(annotation, annInstance, annotationNode);\n\t\tList<char[]> typeArgsForToBuilder = null;\n\t\t\n\t\tboolean generateBuilderMethod;\n\t\tif (job.builderMethodName.isEmpty()) {\n\t\t\tgenerateBuilderMethod = false;\n\t\t} else if (!checkName(\"builderMethodName\", job.builderMethodName, annotationNode)) {\n\t\t\treturn;\n\t\t} else {\n\t\t\tgenerateBuilderMethod = true;\n\t\t}\n\t\t\n\t\tif (!checkName(\"buildMethodName\", job.buildMethodName, annotationNode)) return;\n\t\t\n\t\tEclipseNode parent = annotationNode.up();\n\t\t\n\t\tjob.builderFields = new ArrayList<BuilderFieldData>();\n\t\tTypeReference buildMethodReturnType;\n\t\tTypeReference[] buildMethodThrownExceptions;\n\t\tchar[] nameOfBuilderMethod;\n\t\t\n\t\tEclipseNode fillParametersFrom = parent.get() instanceof AbstractMethodDeclaration ? parent : null;\n\t\tboolean addCleaning = false;\n\t\t\n\t\tList<EclipseNode> nonFinalNonDefaultedFields = null;\n\t\t\n\t\tif (!isStaticAllowed(upToTypeNode(parent))) {\n\t\t\tannotationNode.addError(\"@Builder is not supported on non-static nested classes.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (parent.get() instanceof TypeDeclaration) {\n\t\t\tif (!isClass(parent) && !isRecord(parent)) {\n\t\t\t\tannotationNode.addError(BUILDER_NODE_NOT_SUPPORTED_ERR);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tjob.parentType = parent;\n\t\t\tTypeDeclaration td = (TypeDeclaration) parent.get();\n\t\t\t\n\t\t\tList<EclipseNode> allFields = new ArrayList<EclipseNode>();\n\t\t\tboolean valuePresent = (hasAnnotation(lombok.Value.class, parent) || hasAnnotation(\"lombok.experimental.Value\", parent));\n\t\t\tfor (EclipseNode fieldNode : HandleConstructor.findAllFields(parent, true)) {\n\t\t\t\tFieldDeclaration fd = (FieldDeclaration) fieldNode.get();\n\t\t\t\tEclipseNode isDefault = findAnnotation(Builder.Default.class, fieldNode);\n\t\t\t\tboolean isFinal = ((fd.modifiers & ClassFileConstants.AccFinal) != 0) || (valuePresent && !hasAnnotation(NonFinal.class, fieldNode));\n\t\t\t\t\n\t\t\t\tBuilderFieldData bfd = new BuilderFieldData();\n\t\t\t\tbfd.rawName = fieldNode.getName().toCharArray();\n\t\t\t\tbfd.name = removePrefixFromField(fieldNode);\n\t\t\t\tbfd.builderFieldName = bfd.name;\n\t\t\t\tbfd.annotations = copyAnnotations(fd, findCopyableAnnotations(fieldNode));\n\t\t\t\tbfd.type = fd.type;\n\t\t\t\tbfd.singularData = getSingularData(fieldNode, ast, annInstance.setterPrefix());\n\t\t\t\tbfd.originalFieldNode = fieldNode;\n\t\t\t\t\n\t\t\t\tif (bfd.singularData != null && isDefault != null) {\n\t\t\t\t\tisDefault.addError(\"@Builder.Default and @Singular cannot be mixed.\");\n\t\t\t\t\tisDefault = null;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (fd.initialization == null && isDefault != null) {\n\t\t\t\t\tisDefault.addWarning(\"@Builder.Default requires an initializing expression (' = something;').\");\n\t\t\t\t\tisDefault = null;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (fd.initialization != null && isDefault == null) {\n\t\t\t\t\tif (isFinal) continue;\n\t\t\t\t\tif (nonFinalNonDefaultedFields == null) nonFinalNonDefaultedFields = new ArrayList<EclipseNode>();\n\t\t\t\t\tnonFinalNonDefaultedFields.add(fieldNode);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (isDefault != null) {\n\t\t\t\t\tbfd.nameOfDefaultProvider = prefixWith(DEFAULT_PREFIX, bfd.name);\n\t\t\t\t\tbfd.nameOfSetFlag = prefixWith(bfd.name, SET_PREFIX);\n\t\t\t\t\tbfd.builderFieldName = prefixWith(bfd.name, VALUE_PREFIX);\n\t\t\t\t\t\n\t\t\t\t\tMethodDeclaration md = generateDefaultProvider(bfd.nameOfDefaultProvider, td.typeParameters, fieldNode, ast);\n\t\t\t\t\tif (md != null) injectMethod(parent, md);\n\t\t\t\t}\n\t\t\t\taddObtainVia(bfd, fieldNode);\n\t\t\t\tjob.builderFields.add(bfd);\n\t\t\t\tallFields.add(fieldNode);\n\t\t\t}\n\t\t\t\n\t\t\tif (!isRecord(parent)) {\n\t\t\t\t// Records ship with a canonical constructor that acts as @AllArgsConstructor - just use that one.\n\t\t\t\t\n\t\t\t\thandleConstructor.generateConstructor(parent, AccessLevel.PACKAGE, allFields, false, null, SkipIfConstructorExists.I_AM_BUILDER,\n\t\t\t\t\tCollections.<Annotation>emptyList(), annotationNode);\n\t\t\t}\n\t\t\t\n\t\t\tjob.typeParams = job.builderTypeParams = td.typeParameters;\n\t\t\tbuildMethodReturnType = job.createBuilderParentTypeReference();\n\t\t\tbuildMethodThrownExceptions = null;\n\t\t\tnameOfBuilderMethod = null;\n\t\t\tjob.setBuilderClassName(job.replaceBuilderClassName(td.name));\n\t\t\tif (!checkName(\"builderClassName\", job.builderClassName, annotationNode)) return;\n\t\t} else if (parent.get() instanceof ConstructorDeclaration) {\n\t\t\tConstructorDeclaration cd = (ConstructorDeclaration) parent.get();\n\t\t\tif (cd.typeParameters != null && cd.typeParameters.length > 0) {\n\t\t\t\tannotationNode.addError(\"@Builder is not supported on constructors with constructor type parameters.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tjob.parentType = parent.up();\n\t\t\tTypeDeclaration td = (TypeDeclaration) job.parentType.get();\n\t\t\tjob.typeParams = job.builderTypeParams = td.typeParameters;\n\t\t\tbuildMethodReturnType = job.createBuilderParentTypeReference();\n\t\t\tbuildMethodThrownExceptions = cd.thrownExceptions;\n\t\t\tnameOfBuilderMethod = null;\n\t\t\tjob.setBuilderClassName(job.replaceBuilderClassName(cd.selector));\n\t\t\tif (!checkName(\"builderClassName\", job.builderClassName, annotationNode)) return;\n\t\t} else if (parent.get() instanceof MethodDeclaration) {\n\t\t\tMethodDeclaration md = (MethodDeclaration) parent.get();\n\t\t\tjob.parentType = parent.up();\n\t\t\tjob.isStatic = md.isStatic();\n\t\t\t\n\t\t\tif (job.toBuilder) {\n\t\t\t\tchar[] token;\n\t\t\t\tchar[][] pkg = null;\n\t\t\t\tif (md.returnType.dimensions() > 0) {\n\t\t\t\t\tannotationNode.addError(TO_BUILDER_NOT_SUPPORTED);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (md.returnType instanceof SingleTypeReference) {\n\t\t\t\t\ttoken = ((SingleTypeReference) md.returnType).token;\n\t\t\t\t} else if (md.returnType instanceof QualifiedTypeReference) {\n\t\t\t\t\tpkg = ((QualifiedTypeReference) md.returnType).tokens;\n\t\t\t\t\ttoken = pkg[pkg.length];\n\t\t\t\t\tchar[][] pkg_ = new char[pkg.length - 1][];\n\t\t\t\t\tSystem.arraycopy(pkg, 0, pkg_, 0, pkg_.length);\n\t\t\t\t\tpkg = pkg_;\n\t\t\t\t} else {\n\t\t\t\t\tannotationNode.addError(TO_BUILDER_NOT_SUPPORTED);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (pkg != null && !equals(parent.getPackageDeclaration(), pkg)) {\n\t\t\t\t\tannotationNode.addError(TO_BUILDER_NOT_SUPPORTED);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (job.parentType == null || !equals(job.parentType.getName(), token)) {\n\t\t\t\t\tannotationNode.addError(TO_BUILDER_NOT_SUPPORTED);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tTypeParameter[] tpOnType = ((TypeDeclaration) job.parentType.get()).typeParameters;\n\t\t\t\tTypeParameter[] tpOnMethod = md.typeParameters;\n\t\t\t\tTypeReference[][] tpOnRet_ = null;\n\t\t\t\tif (md.returnType instanceof ParameterizedSingleTypeReference) {\n\t\t\t\t\ttpOnRet_ = new TypeReference[1][];\n\t\t\t\t\ttpOnRet_[0] = ((ParameterizedSingleTypeReference) md.returnType).typeArguments;\n\t\t\t\t} else if (md.returnType instanceof ParameterizedQualifiedTypeReference) {\n\t\t\t\t\ttpOnRet_ = ((ParameterizedQualifiedTypeReference) md.returnType).typeArguments;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (tpOnRet_ != null) for (int i = 0; i < tpOnRet_.length - 1; i++) {\n\t\t\t\t\tif (tpOnRet_[i] != null && tpOnRet_[i].length > 0) {\n\t\t\t\t\t\tannotationNode.addError(\"@Builder(toBuilder=true) is not supported if returning a type with generics applied to an intermediate.\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tTypeReference[] tpOnRet = tpOnRet_ == null ? null : tpOnRet_[tpOnRet_.length - 1];\n\t\t\t\ttypeArgsForToBuilder = new ArrayList<char[]>();\n\t\t\t\t\n\t\t\t\t// Every typearg on this method needs to be found in the return type, but the reverse is not true.\n\t\t\t\t// We also need to 'map' them.\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tif (tpOnMethod != null) for (TypeParameter onMethod : tpOnMethod) {\n\t\t\t\t\tint pos = -1;\n\t\t\t\t\tif (tpOnRet != null) for (int i = 0; i < tpOnRet.length; i++) {\n\t\t\t\t\t\tif (tpOnRet[i].getClass() != SingleTypeReference.class) continue;\n\t\t\t\t\t\tif (!Arrays.equals(((SingleTypeReference) tpOnRet[i]).token, onMethod.name)) continue;\n\t\t\t\t\t\tpos = i;\n\t\t\t\t\t}\n\t\t\t\t\tif (pos == -1 || tpOnType == null || tpOnType.length <= pos) {\n\t\t\t\t\t\tannotationNode.addError(\"@Builder(toBuilder=true) requires that each type parameter on the static method is part of the typeargs of the return value. Type parameter \" + new String(onMethod.name) + \" is not part of the return type.\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\ttypeArgsForToBuilder.add(tpOnType[pos].name);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tjob.typeParams = job.builderTypeParams = md.typeParameters;\n\t\t\tbuildMethodReturnType = copyType(md.returnType, ast);\n\t\t\tbuildMethodThrownExceptions = md.thrownExceptions;\n\t\t\tnameOfBuilderMethod = md.selector;\n\t\t\tif (job.builderClassName.indexOf('*') > -1) {\n\t\t\t\tchar[] token = returnTypeToBuilderClassName(annotationNode, md, job.typeParams);\n\t\t\t\tif (token == null) return; // should not happen.\n\t\t\t\tjob.setBuilderClassName(job.replaceBuilderClassName(token));\n\t\t\t\tif (!checkName(\"builderClassName\", job.builderClassName, annotationNode)) return;\n\t\t\t}\n\t\t} else {\n\t\t\tannotationNode.addError(BUILDER_NODE_NOT_SUPPORTED_ERR);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (fillParametersFrom != null) {\n\t\t\tfor (EclipseNode param : fillParametersFrom.down()) {\n\t\t\t\tif (param.getKind() != Kind.ARGUMENT) continue;\n\t\t\t\tBuilderFieldData bfd = new BuilderFieldData();\n\t\t\t\tArgument arg = (Argument) param.get();\n\t\t\t\t\n\t\t\t\tAnnotation[] copyableAnnotations = findCopyableAnnotations(param);\n\t\t\t\t\n\t\t\t\tbfd.rawName = arg.name;\n\t\t\t\tbfd.name = arg.name;\n\t\t\t\tbfd.builderFieldName = bfd.name;\n\t\t\t\tbfd.annotations = copyAnnotations(arg, copyableAnnotations);\n\t\t\t\tbfd.type = arg.type;\n\t\t\t\tbfd.singularData = getSingularData(param, ast, annInstance.setterPrefix());\n\t\t\t\tbfd.originalFieldNode = param;\n\t\t\t\taddObtainVia(bfd, param);\n\t\t\t\tjob.builderFields.add(bfd);\n\t\t\t}\n\t\t}\n\t\t\n\t\tjob.builderType = findInnerClass(job.parentType, job.builderClassName);\n\t\tif (job.builderType == null) makeBuilderClass(job);\n\t\telse {\n\t\t\tTypeDeclaration builderTypeDeclaration = (TypeDeclaration) job.builderType.get();\n\t\t\tif (job.isStatic && (builderTypeDeclaration.modifiers & ClassFileConstants.AccStatic) == 0) {\n\t\t\t\tannotationNode.addError(\"Existing Builder must be a static inner class.\");\n\t\t\t\treturn;\n\t\t\t} else if (!job.isStatic && (builderTypeDeclaration.modifiers & ClassFileConstants.AccStatic) != 0) {\n\t\t\t\tannotationNode.addError(\"Existing Builder must be a non-static inner class.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsanityCheckForMethodGeneratingAnnotationsOnBuilderClass(job.builderType, annotationNode);\n\t\t\t/* generate errors for @Singular BFDs that have one already defined node. */ {\n\t\t\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\t\t\tSingularData sd = bfd.singularData;\n\t\t\t\t\tif (sd == null) continue;\n\t\t\t\t\tEclipseSingularizer singularizer = sd.getSingularizer();\n\t\t\t\t\tif (singularizer == null) continue;\n\t\t\t\t\tif (singularizer.checkForAlreadyExistingNodesAndGenerateError(job.builderType, sd)) {\n\t\t\t\t\t\tbfd.singularData = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\tif (bfd.singularData != null && bfd.singularData.getSingularizer() != null) {\n\t\t\t\tif (bfd.singularData.getSingularizer().requiresCleaning()) {\n\t\t\t\t\taddCleaning = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (bfd.obtainVia != null) {\n\t\t\t\tif (bfd.obtainVia.field().isEmpty() == bfd.obtainVia.method().isEmpty()) {\n\t\t\t\t\tbfd.obtainViaNode.addError(\"The syntax is either @ObtainVia(field = \\\"fieldName\\\") or @ObtainVia(method = \\\"methodName\\\").\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (bfd.obtainVia.method().isEmpty() && bfd.obtainVia.isStatic()) {\n\t\t\t\t\tbfd.obtainViaNode.addError(\"@ObtainVia(isStatic = true) is not valid unless 'method' has been set.\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tgenerateBuilderFields(job);\n\t\tif (addCleaning) {\n\t\t\tFieldDeclaration cleanDecl = new FieldDeclaration(CLEAN_FIELD_NAME, 0, -1);\n\t\t\tcleanDecl.declarationSourceEnd = -1;\n\t\t\tcleanDecl.modifiers = ClassFileConstants.AccPrivate;\n\t\t\tcleanDecl.type = TypeReference.baseTypeReference(TypeIds.T_boolean, 0);\n\t\t\tcleanDecl.traverse(new SetGeneratedByVisitor(ast), (MethodScope) null);\n\t\t\tinjectFieldAndMarkGenerated(job.builderType, cleanDecl);\n\t\t}\n\t\t\n\t\tif (constructorExists(job.builderType) == MemberExistsResult.NOT_EXISTS) {\n\t\t\tConstructorDeclaration cd = HandleConstructor.createConstructor(\n\t\t\t\tAccessLevel.PACKAGE, job.builderType, Collections.<EclipseNode>emptyList(), false,\n\t\t\t\tannotationNode, Collections.<Annotation>emptyList());\n\t\t\tif (cd != null) injectMethod(job.builderType, cd);\n\t\t}\n\t\t\n\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\tmakePrefixedSetterMethodsForBuilder(job, bfd, annInstance.setterPrefix());\n\t\t}\n\t\t\n\t\t{\n\t\t\tMemberExistsResult methodExists = methodExists(job.buildMethodName, job.builderType, -1);\n\t\t\tif (methodExists == MemberExistsResult.EXISTS_BY_LOMBOK) methodExists = methodExists(job.buildMethodName, job.builderType, 0);\n\t\t\tif (methodExists == MemberExistsResult.NOT_EXISTS) {\n\t\t\t\tMethodDeclaration md = generateBuildMethod(job, nameOfBuilderMethod, buildMethodReturnType, buildMethodThrownExceptions, addCleaning);\n\t\t\t\tif (md != null) injectMethod(job.builderType, md);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (methodExists(\"toString\", job.builderType, 0) == MemberExistsResult.NOT_EXISTS) {\n\t\t\tList<Included<EclipseNode, ToString.Include>> fieldNodes = new ArrayList<Included<EclipseNode, ToString.Include>>();\n\t\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\t\tfor (EclipseNode f : bfd.createdFields) {\n\t\t\t\t\tfieldNodes.add(new Included<EclipseNode, ToString.Include>(f, null, true, false));\n\t\t\t\t}\n\t\t\t}\n\t\t\tMethodDeclaration md = HandleToString.createToString(job.builderType, fieldNodes, true, false, ast, FieldAccess.ALWAYS_FIELD);\n\t\t\tif (md != null) injectMethod(job.builderType, md);\n\t\t}\n\t\t\n\t\tif (addCleaning) {\n\t\t\tMethodDeclaration cleanMethod = generateCleanMethod(job);\n\t\t\tif (cleanMethod != null) injectMethod(job.builderType, cleanMethod);\n\t\t}\n\t\t\n\t\tif (generateBuilderMethod && methodExists(job.builderMethodName, job.parentType, -1) != MemberExistsResult.NOT_EXISTS) generateBuilderMethod = false;\n\t\tif (generateBuilderMethod) {\n\t\t\tMethodDeclaration md = generateBuilderMethod(job);\n\t\t\tif (md != null) injectMethod(job.parentType, md);\n\t\t}\n\t\t\n\t\tif (job.toBuilder) switch (methodExists(TO_BUILDER_METHOD_NAME_STRING, job.parentType, 0)) {\n\t\tcase EXISTS_BY_USER:\n\t\t\tannotationNode.addWarning(\"Not generating toBuilder() as it already exists.\");\n\t\t\tbreak;\n\t\tcase NOT_EXISTS:\n\t\t\tTypeParameter[] tps = job.typeParams;\n\t\t\tif (typeArgsForToBuilder != null) {\n\t\t\t\ttps = new TypeParameter[typeArgsForToBuilder.size()];\n\t\t\t\tfor (int i = 0; i < tps.length; i++) {\n\t\t\t\t\ttps[i] = new TypeParameter();\n\t\t\t\t\ttps[i].name = typeArgsForToBuilder.get(i);\n\t\t\t\t}\n\t\t\t}\n\t\t\tMethodDeclaration md = generateToBuilderMethod(job, tps, annInstance.setterPrefix());\n\t\t\t\n\t\t\tif (md != null) injectMethod(job.parentType, md);\n\t\t}\n\t\t\n\t\tif (nonFinalNonDefaultedFields != null && generateBuilderMethod) {\n\t\t\tfor (EclipseNode fieldNode : nonFinalNonDefaultedFields) {\n\t\t\t\tfieldNode.addWarning(\"@Builder will ignore the initializing expression entirely. If you want the initializing expression to serve as default, add @Builder.Default. If it is not supposed to be settable during building, make the field final.\");\n\t\t\t}\n\t\t}\n\t}\n\t\n\tstatic char[] returnTypeToBuilderClassName(EclipseNode annotationNode, MethodDeclaration md, TypeParameter[] typeParams) {\n\t\tchar[] token;\n\t\tif (md.returnType instanceof QualifiedTypeReference) {\n\t\t\tchar[][] tokens = ((QualifiedTypeReference) md.returnType).tokens;\n\t\t\ttoken = tokens[tokens.length - 1];\n\t\t} else if (md.returnType instanceof SingleTypeReference) {\n\t\t\ttoken = ((SingleTypeReference) md.returnType).token;\n\t\t\tif (!(md.returnType instanceof ParameterizedSingleTypeReference) && typeParams != null) {\n\t\t\t\tfor (TypeParameter tp : typeParams) {\n\t\t\t\t\tif (Arrays.equals(tp.name, token)) {\n\t\t\t\t\t\tannotationNode.addError(\"@Builder requires specifying 'builderClassName' if used on methods with a type parameter as return type.\");\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tannotationNode.addError(\"Unexpected kind of return type on annotated method. Specify 'builderClassName' to solve this problem.\");\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\tif (Character.isLowerCase(token[0])) {\n\t\t\tchar[] newToken = new char[token.length];\n\t\t\tSystem.arraycopy(token, 1, newToken, 1, token.length - 1);\n\t\t\tnewToken[0] = Character.toTitleCase(token[0]);\n\t\t\ttoken = newToken;\n\t\t}\n\t\treturn token;\n\t}\n\t\n\tprivate MethodDeclaration generateToBuilderMethod(BuilderJob job, TypeParameter[] typeParameters, String prefix) {\n\t\tint pS = job.source.sourceStart, pE = job.source.sourceEnd;\n\t\tlong p = job.getPos();\n\t\t\n\t\tMethodDeclaration out = job.createNewMethodDeclaration();\n\t\tout.selector = TO_BUILDER_METHOD_NAME;\n\t\tout.modifiers = toEclipseModifier(job.accessOuters);\n\t\tout.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\t\n\t\tout.returnType = job.createBuilderTypeReference();\n\t\tif (job.checkerFramework.generateUnique()) {\n\t\t\tint len = out.returnType.getTypeName().length;\n\t\t\tout.returnType.annotations = new Annotation[len][];\n\t\t\tout.returnType.annotations[len - 1] = new Annotation[] {generateNamedAnnotation(job.source, CheckerFrameworkVersion.NAME__UNIQUE)};\n\t\t}\n\t\tAllocationExpression invoke = new AllocationExpression();\n\t\tinvoke.type = job.createBuilderTypeReference();\n\t\t\n\t\tExpression receiver = invoke;\n\t\tList<Statement> preStatements = null;\n\t\tList<Statement> postStatements = null;\n\t\t\n\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\tString setterName = new String(bfd.name);\n\t\t\tString setterPrefix = !prefix.isEmpty() ? prefix : job.oldFluent ? \"\" : \"set\";\n\t\t\tif (!setterPrefix.isEmpty()) setterName = HandlerUtil.buildAccessorName(job.sourceNode, setterPrefix, setterName);\n\t\t\t\n\t\t\tMessageSend ms = new MessageSend();\n\t\t\tExpression[] tgt = new Expression[bfd.singularData == null ? 1 : 2];\n\t\t\t\n\t\t\tif (bfd.obtainVia == null || !bfd.obtainVia.field().isEmpty()) {\n\t\t\t\tchar[] fieldName = bfd.obtainVia == null ? bfd.rawName : bfd.obtainVia.field().toCharArray();\n\t\t\t\tfor (int i = 0; i < tgt.length; i++) {\n\t\t\t\t\tFieldReference fr = new FieldReference(fieldName, 0);\n\t\t\t\t\tfr.receiver = new ThisReference(0, 0);\n\t\t\t\t\ttgt[i] = fr;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tString obtainName = bfd.obtainVia.method();\n\t\t\t\tboolean obtainIsStatic = bfd.obtainVia.isStatic();\n\t\t\t\tMessageSend obtainExpr = new MessageSend();\n\t\t\t\tif (obtainIsStatic) {\n\t\t\t\t\tif (typeParameters != null && typeParameters.length > 0) {\n\t\t\t\t\t\tobtainExpr.typeArguments = new TypeReference[typeParameters.length];\n\t\t\t\t\t\tfor (int j = 0; j < typeParameters.length; j++) {\n\t\t\t\t\t\t\tobtainExpr.typeArguments[j] = new SingleTypeReference(typeParameters[j].name, 0);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tobtainExpr.receiver = generateNameReference(job.parentType, 0);\n\t\t\t\t} else {\n\t\t\t\t\tobtainExpr.receiver = new ThisReference(0, 0);\n\t\t\t\t}\n\t\t\t\tobtainExpr.selector = obtainName.toCharArray();\n\t\t\t\tif (obtainIsStatic) obtainExpr.arguments = new Expression[] {new ThisReference(0, 0)};\n\t\t\t\tfor (int i = 0; i < tgt.length; i++) tgt[i] = new SingleNameReference(bfd.name, 0L);\n\t\t\t\t\n\t\t\t\t// javac appears to cache the type of JCMethodInvocation expressions based on position, meaning, if you have 2 ObtainVia-based method invokes on different types, you get bizarre type mismatch errors.\n\t\t\t\t// going via a local variable declaration solves the problem. We copy this behaviour\n\t\t\t\t// for ecj so we match what javac's handler does.\n\t\t\t\tLocalDeclaration ld = new LocalDeclaration(bfd.name, 0, 0);\n\t\t\t\tld.modifiers = ClassFileConstants.AccFinal;\n\t\t\t\tld.type = EclipseHandlerUtil.copyType(bfd.type, job.source);\n\t\t\t\tld.initialization = obtainExpr;\n\t\t\t\tif (preStatements == null) preStatements = new ArrayList<Statement>();\n\t\t\t\tpreStatements.add(ld);\n\t\t\t}\n\t\t\t\n\t\t\tms.selector = setterName.toCharArray();\n\t\t\tif (bfd.singularData == null) {\n\t\t\t\tms.arguments = tgt;\n\t\t\t\tms.receiver = receiver;\n\t\t\t\treceiver = ms;\n\t\t\t} else {\n\t\t\t\tms.arguments = new Expression[] {tgt[1]};\n\t\t\t\tms.receiver = new SingleNameReference(BUILDER_TEMP_VAR, p);\n\t\t\t\tEqualExpression isNotNull = new EqualExpression(tgt[0], new NullLiteral(pS, pE), OperatorIds.NOT_EQUAL);\n\t\t\t\tif (postStatements == null) postStatements = new ArrayList<Statement>();\n\t\t\t\tpostStatements.add(new IfStatement(isNotNull, ms, pS, pE));\n\t\t\t}\n\t\t}\n\t\t\n\t\tint preSs = preStatements == null ? 0 : preStatements.size();\n\t\tint postSs = postStatements == null ? 0 : postStatements.size();\n\t\tif (postSs > 0) {\n\t\t\tout.statements = new Statement[preSs + postSs + 2];\n\t\t\tfor (int i = 0; i < preSs; i++) out.statements[i] = preStatements.get(i);\n\t\t\tfor (int i = 0; i < postSs; i++) out.statements[preSs + 1 + i] = postStatements.get(i);\n\t\t\tLocalDeclaration b = new LocalDeclaration(BUILDER_TEMP_VAR, pS, pE);\n\t\t\tout.statements[preSs] = b;\n\t\t\tb.modifiers |= ClassFileConstants.AccFinal;\n\t\t\tb.type = job.createBuilderTypeReference();\n\t\t\tb.type.sourceStart = pS; b.type.sourceEnd = pE;\n\t\t\tb.initialization = receiver;\n\t\t\tout.statements[preSs + postSs + 1] = new ReturnStatement(new SingleNameReference(BUILDER_TEMP_VAR, p), pS, pE);\n\t\t} else {\n\t\t\tout.statements = new Statement[preSs + 1];\n\t\t\tfor (int i = 0; i < preSs; i++) out.statements[i] = preStatements.get(i);\n\t\t\tout.statements[preSs] = new ReturnStatement(receiver, pS, pE);\n\t\t}\n\t\t\n\t\tcreateRelevantNonNullAnnotation(job.parentType, out);\n\t\tout.traverse(new SetGeneratedByVisitor(job.source), ((TypeDeclaration) job.parentType.get()).scope);\n\t\treturn out;\n\t}\n\t\n\tprivate MethodDeclaration generateCleanMethod(BuilderJob job) {\n\t\tList<Statement> statements = new ArrayList<Statement>();\n\t\t\n\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\tif (bfd.singularData != null && bfd.singularData.getSingularizer() != null) {\n\t\t\t\tbfd.singularData.getSingularizer().appendCleaningCode(bfd.singularData, job.builderType, statements);\n\t\t\t}\n\t\t}\n\t\t\n\t\tFieldReference thisUnclean = new FieldReference(CLEAN_FIELD_NAME, 0);\n\t\tthisUnclean.receiver = new ThisReference(0, 0);\n\t\tstatements.add(new Assignment(thisUnclean, new FalseLiteral(0, 0), 0));\n\t\tMethodDeclaration decl = job.createNewMethodDeclaration();\n\t\tdecl.selector = CLEAN_METHOD_NAME;\n\t\tdecl.modifiers = ClassFileConstants.AccPrivate;\n\t\tdecl.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tdecl.returnType = TypeReference.baseTypeReference(TypeIds.T_void, 0);\n\t\tdecl.statements = statements.toArray(new Statement[0]);\n\t\tdecl.traverse(new SetGeneratedByVisitor(job.source), (ClassScope) null);\n\t\treturn decl;\n\t}\n\t\n\tstatic Receiver generateBuildReceiver(BuilderJob job) {\n\t\tif (!job.checkerFramework.generateCalledMethods()) return null;\n\t\t\n\t\tList<char[]> mandatories = new ArrayList<char[]>();\n\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\tif (bfd.singularData == null && bfd.nameOfSetFlag == null) mandatories.add(bfd.name);\n\t\t}\n\t\t\n\t\tif (mandatories.size() == 0) return null;\n\t\t\n\t\tchar[][] nameCalled = fromQualifiedName(CheckerFrameworkVersion.NAME__CALLED);\n\t\tExpression memberValue;\n\t\tif (mandatories.size() == 1) {\n\t\t\tmemberValue = new StringLiteral(mandatories.get(0), 0, 0, 0);\n\t\t} else {\n\t\t\tArrayInitializer arr = new ArrayInitializer();\n\t\t\tarr.expressions = new Expression[mandatories.size()];\n\t\t\tfor (int i = 0; i < arr.expressions.length; i++) {\n\t\t\t\tarr.expressions[i] = new StringLiteral(mandatories.get(i), job.source.sourceStart, job.source.sourceEnd, 0);\n\t\t\t}\n\t\t\tmemberValue = arr;\n\t\t}\n\t\t\n\t\tTypeReference typeReference = job.createBuilderTypeReference();\n\t\tint len = typeReference.getTypeName().length;\n\t\ttypeReference.annotations = new Annotation[len][];\n\t\ttypeReference.annotations[len - 1] = EclipseHandlerUtil.addAnnotation(job.source, null, nameCalled, memberValue);\n\t\treturn new Receiver(new char[] { 't', 'h', 'i', 's' }, 0, typeReference, null, 0);\n\t}\n\t\n\tpublic MethodDeclaration generateBuildMethod(BuilderJob job, char[] staticName, TypeReference returnType, TypeReference[] thrownExceptions, boolean addCleaning) {\n\t\tMethodDeclaration out = job.createNewMethodDeclaration();\n\t\tout.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tList<Statement> statements = new ArrayList<Statement>();\n\t\t\n\t\tif (addCleaning) {\n\t\t\tFieldReference thisUnclean = new FieldReference(CLEAN_FIELD_NAME, 0);\n\t\t\tthisUnclean.receiver = new ThisReference(0, 0);\n\t\t\tExpression notClean = new UnaryExpression(thisUnclean, OperatorIds.NOT);\n\t\t\tMessageSend invokeClean = new MessageSend();\n\t\t\tinvokeClean.selector = CLEAN_METHOD_NAME;\n\t\t\tstatements.add(new IfStatement(notClean, invokeClean, 0, 0));\n\t\t}\n\t\t\n\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\tif (bfd.singularData != null && bfd.singularData.getSingularizer() != null) {\n\t\t\t\tbfd.singularData.getSingularizer().appendBuildCode(bfd.singularData, job.builderType, statements, bfd.builderFieldName, \"this\");\n\t\t\t}\n\t\t}\n\t\t\n\t\tList<Expression> args = new ArrayList<Expression>();\n\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\tif (bfd.nameOfSetFlag != null) {\n\t\t\t\tLocalDeclaration ld = new LocalDeclaration(bfd.builderFieldName, 0, 0);\n\t\t\t\tld.type = copyType(bfd.type);\n\t\t\t\tFieldReference builderAssign = new FieldReference(bfd.builderFieldName, 0);\n\t\t\t\tbuilderAssign.receiver = new ThisReference(0, 0);\n\t\t\t\tld.initialization = builderAssign;\n\t\t\t\tstatements.add(ld);\n\t\t\t\t\n\t\t\t\tMessageSend inv = new MessageSend();\n\t\t\t\tinv.sourceStart = job.source.sourceStart;\n\t\t\t\tinv.sourceEnd = job.source.sourceEnd;\n\t\t\t\tinv.receiver = new SingleNameReference(((TypeDeclaration) job.parentType.get()).name, 0L);\n\t\t\t\tinv.selector = bfd.nameOfDefaultProvider;\n\t\t\t\tinv.typeArguments = typeParameterNames(((TypeDeclaration) job.builderType.get()).typeParameters);\n\t\t\t\t\n\t\t\t\tAssignment defaultAssign = new Assignment(new SingleNameReference(bfd.builderFieldName, 0L), inv, 0);\n\t\t\t\tFieldReference thisSet = new FieldReference(bfd.nameOfSetFlag, 0L);\n\t\t\t\tthisSet.receiver = new ThisReference(0, 0);\n\t\t\t\tExpression thisNotSet = new UnaryExpression(thisSet, OperatorIds.NOT);\n\t\t\t\tstatements.add(new IfStatement(thisNotSet, defaultAssign, 0, 0));\n\t\t\t}\n\t\t\t\n\t\t\tif (bfd.nameOfSetFlag != null || (bfd.singularData != null && bfd.singularData.getSingularizer().shadowedDuringBuild())) {\n\t\t\t\targs.add(new SingleNameReference(bfd.builderFieldName, 0L));\n\t\t\t} else {\n\t\t\t\tFieldReference fr = new FieldReference(bfd.builderFieldName, 0L);\n\t\t\t\tfr.receiver = new ThisReference(0, 0);\n\t\t\t\targs.add(fr);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (addCleaning) {\n\t\t\tFieldReference thisUnclean = new FieldReference(CLEAN_FIELD_NAME, 0);\n\t\t\tthisUnclean.receiver = new ThisReference(0, 0);\n\t\t\tstatements.add(new Assignment(thisUnclean, new TrueLiteral(0, 0), 0));\n\t\t}\n\t\t\n\t\tout.modifiers = toEclipseModifier(job.accessInners);\n\t\tout.selector = job.buildMethodName.toCharArray();\n\t\tout.thrownExceptions = copyTypes(thrownExceptions);\n\t\tout.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tout.returnType = returnType;\n\t\t\n\t\tif (staticName == null) {\n\t\t\tAllocationExpression allocationStatement = new AllocationExpression();\n\t\t\tallocationStatement.type = copyType(out.returnType);\n\t\t\tallocationStatement.arguments = args.isEmpty() ? null : args.toArray(new Expression[0]);\n\t\t\tstatements.add(new ReturnStatement(allocationStatement, 0, 0));\n\t\t} else {\n\t\t\tMessageSend invoke = new MessageSend();\n\t\t\tinvoke.selector = staticName;\n\t\t\tif (job.isStatic) {\n\t\t\t\tinvoke.receiver = new SingleNameReference(job.builderType.up().getName().toCharArray(), 0);\n\t\t\t} else {\n\t\t\t\tinvoke.receiver = new QualifiedThisReference(generateTypeReference(job.builderType.up(), 0) , 0, 0);\n\t\t\t}\n\t\t\t\n\t\t\tinvoke.typeArguments = typeParameterNames(((TypeDeclaration) job.builderType.get()).typeParameters);\n\t\t\tinvoke.arguments = args.isEmpty() ? null : args.toArray(new Expression[0]);\n\t\t\tif (returnType instanceof SingleTypeReference && Arrays.equals(TypeConstants.VOID, ((SingleTypeReference) returnType).token)) {\n\t\t\t\tstatements.add(invoke);\n\t\t\t} else {\n\t\t\t\tstatements.add(new ReturnStatement(invoke, 0, 0));\n\t\t\t}\n\t\t}\n\t\tout.statements = statements.isEmpty() ? null : statements.toArray(new Statement[0]);\n\t\tif (job.checkerFramework.generateSideEffectFree()) {\n\t\t\tout.annotations = new Annotation[] {generateNamedAnnotation(job.source, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE)};\n\t\t}\n\t\tout.receiver = generateBuildReceiver(job);\n\t\tif (staticName == null) createRelevantNonNullAnnotation(job.builderType, out);\n\t\tout.traverse(new SetGeneratedByVisitor(job.source), (ClassScope) null);\n\t\treturn out;\n\t}\n\t\n\tprivate TypeReference[] typeParameterNames(TypeParameter[] typeParameters) {\n\t\tif (typeParameters == null) return null;\n\t\t\n\t\tTypeReference[] trs = new TypeReference[typeParameters.length];\n\t\tfor (int i = 0; i < trs.length; i++) {\n\t\t\ttrs[i] = new SingleTypeReference(typeParameters[i].name, 0);\n\t\t}\n\t\treturn trs;\n\t}\n\t\n\tpublic static MethodDeclaration generateDefaultProvider(char[] methodName, TypeParameter[] typeParameters, EclipseNode fieldNode, ASTNode source) {\n\t\tint pS = source.sourceStart, pE = source.sourceEnd;\n\t\t\n\t\tMethodDeclaration out = new MethodDeclaration(((CompilationUnitDeclaration) fieldNode.top().get()).compilationResult);\n\t\tout.typeParameters = copyTypeParams(typeParameters, source);\n\t\tout.selector = methodName;\n\t\tout.modifiers = ClassFileConstants.AccPrivate | ClassFileConstants.AccStatic;\n\t\tout.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tFieldDeclaration fd = (FieldDeclaration) fieldNode.get();\n\t\tout.returnType = copyType(fd.type, source);\n\t\t\n\t\t// Convert short array initializers from `{1,2}` to `new int[]{1,2}`\n\t\tExpression initialization;\n\t\tif (fd.initialization instanceof ArrayInitializer) {\n\t\t\tArrayAllocationExpression arrayAllocationExpression = new ArrayAllocationExpression();\n\t\t\tarrayAllocationExpression.initializer = (ArrayInitializer) fd.initialization;\n\t\t\tarrayAllocationExpression.type = generateQualifiedTypeRef(fd, fd.type.getTypeName());\n\t\t\tarrayAllocationExpression.dimensions = new Expression[fd.type.dimensions()];\n\t\t\tinitialization = arrayAllocationExpression;\n\t\t} else {\n\t\t\tinitialization = fd.initialization;\n\t\t}\n\t\t\n\t\tout.statements = new Statement[] {new ReturnStatement(initialization, pS, pE)};\n\t\tfd.initialization = null;\n\t\t\n\t\tout.traverse(new SetGeneratedByVisitor(source), ((TypeDeclaration) fieldNode.up().get()).scope);\n\t\treturn out;\n\t}\n\t\n\tpublic MethodDeclaration generateBuilderMethod(BuilderJob job) {\n\t\tint pS = job.source.sourceStart, pE = job.source.sourceEnd;\n\t\tlong p = job.getPos();\n\t\t\n\t\tMethodDeclaration out = job.createNewMethodDeclaration();\n\t\tout.selector = job.builderMethodName.toCharArray();\n\t\tout.modifiers = toEclipseModifier(job.accessOuters);\n\t\tif (job.isStatic) out.modifiers |= ClassFileConstants.AccStatic;\n\t\tout.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tout.returnType = job.createBuilderTypeReference();\n\t\tif (job.checkerFramework.generateUnique()) {\n\t\t\tint len = out.returnType.getTypeName().length;\n\t\t\tout.returnType.annotations = new Annotation[len][];\n\t\t\tout.returnType.annotations[len - 1] = new Annotation[] {generateNamedAnnotation(job.source, CheckerFrameworkVersion.NAME__UNIQUE)};\n\t\t}\n\t\tout.typeParameters = job.copyTypeParams();\n\t\tAllocationExpression invoke = new AllocationExpression();\n\t\tif (job.isStatic) {\n\t\t\tinvoke.type = job.createBuilderTypeReferenceForceStatic();\n\t\t\tout.statements = new Statement[] {new ReturnStatement(invoke, pS, pE)};\n\t\t} else {\n\t\t\t// return this.new Builder();\n\t\t\tQualifiedAllocationExpression qualifiedInvoke = new QualifiedAllocationExpression();\n\t\t\tqualifiedInvoke.enclosingInstance = new ThisReference(pS, pE);\n\t\t\tif (job.typeParams == null || job.typeParams.length == 0) {\n\t\t\t\tqualifiedInvoke.type = new SingleTypeReference(job.builderClassNameArr, p);\n\t\t\t} else {\n\t\t\t\tqualifiedInvoke.type = namePlusTypeParamsToTypeReference(null, job.builderClassNameArr, false, job.typeParams, p);\n\t\t\t}\n\t\t\t\n\t\t\tout.statements = new Statement[] {new ReturnStatement(qualifiedInvoke, pS, pE)};\n\t\t}\n\t\tif (job.checkerFramework.generateSideEffectFree()) {\n\t\t\tout.annotations = new Annotation[] {generateNamedAnnotation(job.source, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE)};\n\t\t}\n\t\tcreateRelevantNonNullAnnotation(job.builderType, out);\n\t\tout.traverse(new SetGeneratedByVisitor(job.source), ((TypeDeclaration) job.builderType.get()).scope);\n\t\treturn out;\n\t}\n\t\n\tpublic void generateBuilderFields(BuilderJob job) {\n\t\tList<EclipseNode> existing = new ArrayList<EclipseNode>();\n\t\tfor (EclipseNode child : job.builderType.down()) {\n\t\t\tif (child.getKind() == Kind.FIELD) existing.add(child);\n\t\t}\n\t\t\n\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\tif (bfd.singularData != null && bfd.singularData.getSingularizer() != null) {\n\t\t\t\tbfd.createdFields.addAll(bfd.singularData.getSingularizer().generateFields(bfd.singularData, job.builderType));\n\t\t\t} else {\n\t\t\t\tEclipseNode field = null, setFlag = null;\n\t\t\t\tfor (EclipseNode exists : existing) {\n\t\t\t\t\tchar[] n = ((FieldDeclaration) exists.get()).name;\n\t\t\t\t\tif (Arrays.equals(n, bfd.builderFieldName)) field = exists;\n\t\t\t\t\tif (bfd.nameOfSetFlag != null && Arrays.equals(n, bfd.nameOfSetFlag)) setFlag = exists;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (field == null) {\n\t\t\t\t\tFieldDeclaration fd = new FieldDeclaration(bfd.builderFieldName.clone(), 0, 0);\n\t\t\t\t\tfd.bits |= Eclipse.ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\t\t\t\tfd.modifiers = ClassFileConstants.AccPrivate;\n\t\t\t\t\tfd.type = copyType(bfd.type);\n\t\t\t\t\tfd.traverse(new SetGeneratedByVisitor(job.source), (MethodScope) null);\n\t\t\t\t\tfield = injectFieldAndMarkGenerated(job.builderType, fd);\n\t\t\t\t}\n\t\t\t\tif (setFlag == null && bfd.nameOfSetFlag != null) {\n\t\t\t\t\tFieldDeclaration fd = new FieldDeclaration(bfd.nameOfSetFlag, 0, 0);\n\t\t\t\t\tfd.bits |= Eclipse.ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\t\t\t\tfd.modifiers = ClassFileConstants.AccPrivate;\n\t\t\t\t\tfd.type = TypeReference.baseTypeReference(TypeIds.T_boolean, 0);\n\t\t\t\t\tfd.traverse(new SetGeneratedByVisitor(job.source), (MethodScope) null);\n\t\t\t\t\tinjectFieldAndMarkGenerated(job.builderType, fd);\n\t\t\t\t}\n\t\t\t\tbfd.createdFields.add(field);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic void makePrefixedSetterMethodsForBuilder(BuilderJob job, BuilderFieldData bfd, String prefix) {\n\t\tboolean deprecate = isFieldDeprecated(bfd.originalFieldNode);\n\t\tif (bfd.singularData == null || bfd.singularData.getSingularizer() == null) {\n\t\t\tmakePrefixedSetterMethodForBuilder(job, bfd, deprecate, prefix);\n\t\t} else {\n\t\t\tbfd.singularData.getSingularizer().generateMethods(job, bfd.singularData, deprecate);\n\t\t}\n\t}\n\t\n\tprivate void makePrefixedSetterMethodForBuilder(BuilderJob job, BuilderFieldData bfd, boolean deprecate, String prefix) {\n\t\tTypeDeclaration td = (TypeDeclaration) job.builderType.get();\n\t\tEclipseNode fieldNode = bfd.createdFields.get(0);\n\t\tAbstractMethodDeclaration[] existing = td.methods;\n\t\tif (existing == null) existing = EMPTY_METHODS;\n\t\tint len = existing.length;\n\t\tString setterPrefix = prefix.isEmpty() ? \"set\" : prefix;\n\t\tString setterName;\n\t\tif (job.oldFluent) {\n\t\t\tsetterName = prefix.isEmpty() ? new String(bfd.name) : HandlerUtil.buildAccessorName(job.sourceNode, setterPrefix, new String(bfd.name));\n\t\t} else {\n\t\t\tsetterName = HandlerUtil.buildAccessorName(job.sourceNode, setterPrefix, new String(bfd.name));\n\t\t}\n\t\t\n\t\tfor (int i = 0; i < len; i++) {\n\t\t\tif (!(existing[i] instanceof MethodDeclaration)) continue;\n\t\t\tchar[] existingName = existing[i].selector;\n\t\t\tif (Arrays.equals(setterName.toCharArray(), existingName) && !isTolerate(fieldNode, existing[i])) return;\n\t\t}\n\t\t\n\t\tList<Annotation> methodAnnsList = Collections.<Annotation>emptyList();\n\t\tAnnotation[] methodAnns = EclipseHandlerUtil.findCopyableToSetterAnnotations(bfd.originalFieldNode, true);\n\t\tif (methodAnns != null && methodAnns.length > 0) methodAnnsList = Arrays.asList(methodAnns);\n\t\tASTNode source = job.sourceNode.get();\n\t\tMethodDeclaration setter = HandleSetter.createSetter(td, deprecate, fieldNode, setterName, bfd.name, bfd.nameOfSetFlag, job.oldChain, toEclipseModifier(job.accessInners),\n\t\t\tjob.sourceNode, methodAnnsList, bfd.annotations != null ? Arrays.asList(copyAnnotations(source, bfd.annotations)) : Collections.<Annotation>emptyList());\n\t\tif (job.sourceNode.up().getKind() == Kind.METHOD) {\n\t\t\tcopyJavadocFromParam(bfd.originalFieldNode.up(), setter, td, new String(bfd.name));\n\t\t} else {\n\t\t\tcopyJavadoc(bfd.originalFieldNode, setter, td, CopyJavadoc.SETTER, true);\n\t\t}\n\t\tinjectMethod(job.builderType, setter);\n\t}\n\t\n\tpublic void makeBuilderClass(BuilderJob job) {\n\t\tTypeDeclaration parent = (TypeDeclaration) job.parentType.get();\n\t\tTypeDeclaration builder = new TypeDeclaration(parent.compilationResult);\n\t\tbuilder.bits |= Eclipse.ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tbuilder.modifiers |= toEclipseModifier(job.accessOuters);\n\t\tif (job.isStatic) builder.modifiers |= ClassFileConstants.AccStatic;\n\t\tbuilder.typeParameters = job.copyTypeParams();\n\t\tbuilder.name = job.builderClassNameArr;\n\t\tbuilder.traverse(new SetGeneratedByVisitor(job.source), (ClassScope) null);\n\t\tjob.builderType = injectType(job.parentType, builder);\n\t}\n\t\n\tprivate void addObtainVia(BuilderFieldData bfd, EclipseNode node) {\n\t\tfor (EclipseNode child : node.down()) {\n\t\t\tif (!annotationTypeMatches(ObtainVia.class, child)) continue;\n\t\t\tAnnotationValues<ObtainVia> ann = createAnnotation(ObtainVia.class, child);\n\t\t\tbfd.obtainVia = ann.getInstance();\n\t\t\tbfd.obtainViaNode = child;\n\t\t\treturn;\n\t\t}\n\t}\n\t\n\t/**\n\t * Returns the explicitly requested singular annotation on this node (field\n\t * or parameter), or null if there's no {@code @Singular} annotation on it.\n\t * \n\t * @param node The node (field or method param) to inspect for its name and potential {@code @Singular} annotation.\n\t * @param setterPrefix Explicitly requested setter prefix.\n\t */\n\tprivate SingularData getSingularData(EclipseNode node, ASTNode source, final String setterPrefix) {\n\t\tfor (EclipseNode child : node.down()) {\n\t\t\tif (!annotationTypeMatches(Singular.class, child)) continue;\n\t\t\tchar[] pluralName = node.getKind() == Kind.FIELD ? removePrefixFromField(node) : ((AbstractVariableDeclaration) node.get()).name;\n\t\t\tAnnotationValues<Singular> ann = createAnnotation(Singular.class, child);\n\t\t\tSingular singularInstance = ann.getInstance();\n\t\t\tString explicitSingular = singularInstance.value();\n\t\t\tif (explicitSingular.isEmpty()) {\n\t\t\t\tif (Boolean.FALSE.equals(node.getAst().readConfiguration(ConfigurationKeys.SINGULAR_AUTO))) {\n\t\t\t\t\tnode.addError(\"The singular must be specified explicitly (e.g. @Singular(\\\"task\\\")) because auto singularization is disabled.\");\n\t\t\t\t\texplicitSingular = new String(pluralName);\n\t\t\t\t} else {\n\t\t\t\t\texplicitSingular = autoSingularize(new String(pluralName));\n\t\t\t\t\tif (explicitSingular == null) {\n\t\t\t\t\t\tnode.addError(\"Can't singularize this name; please specify the singular explicitly (i.e. @Singular(\\\"sheep\\\"))\");\n\t\t\t\t\t\texplicitSingular = new String(pluralName);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tchar[] singularName = explicitSingular.toCharArray();\n\t\t\t\n\t\t\tTypeReference type = ((AbstractVariableDeclaration) node.get()).type;\n\t\t\tTypeReference[] typeArgs = null;\n\t\t\tString typeName;\n\t\t\tif (type instanceof ParameterizedSingleTypeReference) {\n\t\t\t\ttypeArgs = ((ParameterizedSingleTypeReference) type).typeArguments;\n\t\t\t\ttypeName = new String(((ParameterizedSingleTypeReference) type).token);\n\t\t\t} else if (type instanceof ParameterizedQualifiedTypeReference) {\n\t\t\t\tTypeReference[][] tr = ((ParameterizedQualifiedTypeReference) type).typeArguments;\n\t\t\t\tif (tr != null) typeArgs = tr[tr.length - 1];\n\t\t\t\tchar[][] tokens = ((ParameterizedQualifiedTypeReference) type).tokens;\n\t\t\t\tStringBuilder sb = new StringBuilder();\n\t\t\t\tfor (int i = 0; i < tokens.length; i++) {\n\t\t\t\t\tif (i > 0) sb.append(\".\");\n\t\t\t\t\tsb.append(tokens[i]);\n\t\t\t\t}\n\t\t\t\ttypeName = sb.toString();\n\t\t\t} else {\n\t\t\t\ttypeName = type.toString();\n\t\t\t}\n\t\t\t\n\t\t\tString targetFqn = EclipseSingularsRecipes.get().toQualified(typeName);\n\t\t\tEclipseSingularizer singularizer = EclipseSingularsRecipes.get().getSingularizer(targetFqn);\n\t\t\tif (singularizer == null) {\n\t\t\t\tnode.addError(\"Lombok does not know how to create the singular-form builder methods for type '\" + typeName + \"'; they won't be generated.\");\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t\n\t\t\treturn new SingularData(child, singularName, pluralName, typeArgs == null ? Collections.<TypeReference>emptyList() : Arrays.asList(typeArgs), targetFqn, singularizer, source, singularInstance.ignoreNullCollections(), setterPrefix.toCharArray());\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleBuilderDefault.java",
    "content": "/*\n * Copyright (C) 2017-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\n\nimport lombok.Builder;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.experimental.SuperBuilder;\nimport lombok.spi.Provides;\n\n@Provides\n@HandlerPriority(-1025) //HandleBuilder's level, minus one.\npublic class HandleBuilderDefault extends EclipseAnnotationHandler<Builder.Default> {\n\t@Override public void handle(AnnotationValues<Builder.Default> annotation, Annotation ast, EclipseNode annotationNode) {\n\t\tEclipseNode annotatedField = annotationNode.up();\n\t\tif (annotatedField.getKind() != Kind.FIELD) return;\n\t\tEclipseNode classWithAnnotatedField = annotatedField.up();\n\t\tif (!hasAnnotation(Builder.class, classWithAnnotatedField) && !hasAnnotation(\"lombok.experimental.Builder\", classWithAnnotatedField)\n\t\t\t\t&& !hasAnnotation(SuperBuilder.class, classWithAnnotatedField)) {\n\t\t\tannotationNode.addWarning(\"@Builder.Default requires @Builder or @SuperBuilder on the class for it to mean anything.\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleCleanup.java",
    "content": "/*\n * Copyright (C) 2009-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport java.util.Arrays;\n\nimport lombok.Cleanup;\nimport lombok.ConfigurationKeys;\nimport lombok.core.AnnotationValues;\nimport lombok.core.AST.Kind;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.spi.Provides;\n\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.Assignment;\nimport org.eclipse.jdt.internal.compiler.ast.Block;\nimport org.eclipse.jdt.internal.compiler.ast.CaseStatement;\nimport org.eclipse.jdt.internal.compiler.ast.CastExpression;\nimport org.eclipse.jdt.internal.compiler.ast.EqualExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.IfStatement;\nimport org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.MemberValuePair;\nimport org.eclipse.jdt.internal.compiler.ast.MessageSend;\nimport org.eclipse.jdt.internal.compiler.ast.NullLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.OperatorIds;\nimport org.eclipse.jdt.internal.compiler.ast.SingleNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.SwitchStatement;\nimport org.eclipse.jdt.internal.compiler.ast.TryStatement;\n\n/**\n * Handles the {@code lombok.Cleanup} annotation for eclipse.\n */\n@Provides\npublic class HandleCleanup extends EclipseAnnotationHandler<Cleanup> {\n\tpublic void handle(AnnotationValues<Cleanup> annotation, Annotation ast, EclipseNode annotationNode) {\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.CLEANUP_FLAG_USAGE, \"@Cleanup\");\n\t\t\n\t\tString cleanupName = annotation.getInstance().value();\n\t\tif (cleanupName.length() == 0) {\n\t\t\tannotationNode.addError(\"cleanupName cannot be the empty string.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (annotationNode.up().getKind() != Kind.LOCAL) {\n\t\t\tannotationNode.addError(\"@Cleanup is legal only on local variable declarations.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tLocalDeclaration decl = (LocalDeclaration)annotationNode.up().get();\n\t\t\n\t\tif (decl.initialization == null) {\n\t\t\tannotationNode.addError(\"@Cleanup variable declarations need to be initialized.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tEclipseNode ancestor = annotationNode.up().directUp();\n\t\tASTNode blockNode = ancestor.get();\n\t\t\n\t\tfinal boolean isSwitch;\n\t\tfinal Statement[] statements;\n\t\tif (blockNode instanceof AbstractMethodDeclaration) {\n\t\t\tisSwitch = false;\n\t\t\tstatements = ((AbstractMethodDeclaration)blockNode).statements;\n\t\t} else if (blockNode instanceof Block) {\n\t\t\tisSwitch = false;\n\t\t\tstatements = ((Block)blockNode).statements;\n\t\t} else if (blockNode instanceof SwitchStatement) {\n\t\t\tisSwitch = true;\n\t\t\tstatements = ((SwitchStatement)blockNode).statements;\n\t\t} else {\n\t\t\tannotationNode.addError(\"@Cleanup is legal only on a local variable declaration inside a block.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (statements == null) {\n\t\t\tannotationNode.addError(\"LOMBOK BUG: Parent block does not contain any statements.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tint start = 0;\n\t\tfor (; start < statements.length ; start++) {\n\t\t\tif (statements[start] == decl) break;\n\t\t}\n\t\t\n\t\tif (start == statements.length) {\n\t\t\tannotationNode.addError(\"LOMBOK BUG: Can't find this local variable declaration inside its parent.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tstart++;  //We start with try{} *AFTER* the var declaration.\n\t\t\n\t\tint end;\n\t\tif (isSwitch) {\n\t\t\tend = start + 1;\n\t\t\tfor (; end < statements.length ; end++) {\n\t\t\t\tif (statements[end] instanceof CaseStatement) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else end = statements.length;\n\t\t\n\t\t//At this point:\n\t\t//  start-1 = Local Declaration marked with @Cleanup\n\t\t//  start = first instruction that needs to be wrapped into a try block\n\t\t//  end = last instruction of the scope -OR- last instruction before the next case label in switch statements.\n\t\t//  hence:\n\t\t//  [start, end) = statements for the try block.\n\t\t\n\t\tStatement[] tryBlock = new Statement[end - start];\n\t\tSystem.arraycopy(statements, start, tryBlock, 0, end-start);\n\t\t//Remove the stuff we just dumped into the tryBlock, and then leave room for the try node.\n\t\tint newStatementsLength = statements.length - (end-start); //Remove room for every statement moved into try block...\n\t\tnewStatementsLength += 1; //But add room for the TryStatement node itself.\n\t\tStatement[] newStatements = new Statement[newStatementsLength];\n\t\tSystem.arraycopy(statements, 0, newStatements, 0, start); //copy all statements before the try block verbatim.\n\t\tSystem.arraycopy(statements, end, newStatements, start+1, statements.length - end); //For switch statements.\n\t\t\n\t\tdoAssignmentCheck(annotationNode, tryBlock, decl.name);\n\t\t\n\t\tTryStatement tryStatement = new TryStatement();\n\t\tsetGeneratedBy(tryStatement, ast);\n\t\ttryStatement.tryBlock = new Block(0);\n\t\ttryStatement.tryBlock.statements = tryBlock;\n\t\tsetGeneratedBy(tryStatement.tryBlock, ast);\n\t\t\n\t\t// Positions for in-method generated nodes are special\n\t\tint ss = decl.declarationSourceEnd + 1;\n\t\tint se = ss;\n\t\tif (tryBlock.length > 0) {\n\t\t\tse = tryBlock[tryBlock.length - 1].sourceEnd + 1; //+1 for the closing semicolon. Yes, there could be spaces. Bummer.\n\t\t\ttryStatement.sourceStart = ss;\n\t\t\ttryStatement.sourceEnd = se;\n\t\t\ttryStatement.tryBlock.sourceStart = ss;\n\t\t\ttryStatement.tryBlock.sourceEnd = se;\n\t\t}\n\t\t\n\t\t\n\t\tnewStatements[start] = tryStatement;\n\t\t\n\t\tStatement[] finallyBlock = new Statement[1];\n\t\tMessageSend unsafeClose = new MessageSend();\n\t\tsetGeneratedBy(unsafeClose, ast);\n\t\tunsafeClose.sourceStart = ast.sourceStart;\n\t\tunsafeClose.sourceEnd = ast.sourceEnd;\n\t\tSingleNameReference receiver = new SingleNameReference(decl.name, 0);\n\t\tsetGeneratedBy(receiver, ast);\n\t\tunsafeClose.receiver = receiver;\n\t\tlong nameSourcePosition = (long)ast.sourceStart << 32 | ast.sourceEnd;\n\t\tif (ast.memberValuePairs() != null) for (MemberValuePair pair : ast.memberValuePairs()) {\n\t\t\tif (pair.name != null && new String(pair.name).equals(\"value\")) {\n\t\t\t\tnameSourcePosition = (long)pair.value.sourceStart << 32 | pair.value.sourceEnd;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tunsafeClose.nameSourcePosition = nameSourcePosition;\n\t\tunsafeClose.selector = cleanupName.toCharArray();\n\t\t\n\t\t\n\t\tint pS = ast.sourceStart, pE = ast.sourceEnd;\n\t\tlong p = (long)pS << 32 | pE;\n\n\t\tSingleNameReference varName = new SingleNameReference(decl.name, p);\n\t\tsetGeneratedBy(varName, ast);\n\t\tNullLiteral nullLiteral = new NullLiteral(pS, pE);\n\t\tsetGeneratedBy(nullLiteral, ast);\n\t\t\n\t\tMessageSend preventNullAnalysis = preventNullAnalysis(ast, varName);\n\t\t\n\t\tEqualExpression equalExpression = new EqualExpression(preventNullAnalysis, nullLiteral, OperatorIds.NOT_EQUAL);\n\t\tequalExpression.sourceStart = pS; equalExpression.sourceEnd = pE;\n\t\tsetGeneratedBy(equalExpression, ast);\n\t\t\n\t\tBlock closeBlock = new Block(0);\n\t\tcloseBlock.statements = new Statement[1];\n\t\tcloseBlock.statements[0] = unsafeClose;\n\t\tsetGeneratedBy(closeBlock, ast);\n\t\tIfStatement ifStatement = new IfStatement(equalExpression, closeBlock, 0, 0);\n\t\tsetGeneratedBy(ifStatement, ast);\n\t\t\n\t\tfinallyBlock[0] = ifStatement;\n\t\ttryStatement.finallyBlock = new Block(0);\n\t\t\n\t\t// Positions for in-method generated nodes are special\n\t\tif (!isSwitch) {\n\t\t\ttryStatement.finallyBlock.sourceStart = blockNode.sourceEnd;\n\t\t\ttryStatement.finallyBlock.sourceEnd = blockNode.sourceEnd;\n\t\t}\n\t\tsetGeneratedBy(tryStatement.finallyBlock, ast);\n\t\ttryStatement.finallyBlock.statements = finallyBlock;\n\t\t\n\t\ttryStatement.catchArguments = null;\n\t\ttryStatement.catchBlocks = null;\n\t\t\n\t\tif (blockNode instanceof AbstractMethodDeclaration) {\n\t\t\t((AbstractMethodDeclaration)blockNode).statements = newStatements;\n\t\t} else if (blockNode instanceof Block) {\n\t\t\t((Block)blockNode).statements = newStatements;\n\t\t} else if (blockNode instanceof SwitchStatement) {\n\t\t\t((SwitchStatement)blockNode).statements = newStatements;\n\t\t}\n\t\t\n\t\tancestor.rebuild();\n\t}\n\t\n\tpublic MessageSend preventNullAnalysis(Annotation ast, Expression expr) {\n\t\tMessageSend singletonList = new MessageSend();\n\t\tsetGeneratedBy(singletonList, ast);\n\t\t\n\t\tint pS = ast.sourceStart, pE = ast.sourceEnd;\n\t\tlong p = (long)pS << 32 | pE;\n\t\t\n\t\tsingletonList.receiver = createNameReference(\"java.util.Collections\", ast);\n\t\tsingletonList.selector = \"singletonList\".toCharArray();\n\t\t\n\t\tsingletonList.arguments = new Expression[] { expr };\n\t\tsingletonList.nameSourcePosition = p;\n\t\tsingletonList.sourceStart = pS;\n\t\tsingletonList.sourceEnd = singletonList.statementEnd = pE;\n\t\t\n\t\tMessageSend preventNullAnalysis = new MessageSend();\n\t\tsetGeneratedBy(preventNullAnalysis, ast);\n\t\t\n\t\tpreventNullAnalysis.receiver = singletonList;\n\t\tpreventNullAnalysis.selector = \"get\".toCharArray();\n\t\t\n\t\tpreventNullAnalysis.arguments = new Expression[] { makeIntLiteral(\"0\".toCharArray(), ast) };\n\t\tpreventNullAnalysis.nameSourcePosition = p;\n\t\tpreventNullAnalysis.sourceStart = pS;\n\t\tpreventNullAnalysis.sourceEnd = singletonList.statementEnd = pE;\n\t\t\n\t\treturn preventNullAnalysis;\n\t}\n\t\n\tpublic void doAssignmentCheck(EclipseNode node, Statement[] tryBlock, char[] varName) {\n\t\tfor (Statement statement : tryBlock) doAssignmentCheck0(node, statement, varName);\n\t}\n\t\n\tprivate void doAssignmentCheck0(EclipseNode node, Statement statement, char[] varName) {\n\t\tif (statement instanceof Assignment)\n\t\t\tdoAssignmentCheck0(node, ((Assignment)statement).expression, varName);\n\t\telse if (statement instanceof LocalDeclaration)\n\t\t\tdoAssignmentCheck0(node, ((LocalDeclaration)statement).initialization, varName);\n\t\telse if (statement instanceof CastExpression)\n\t\t\tdoAssignmentCheck0(node, ((CastExpression)statement).expression, varName);\n\t\telse if (statement instanceof SingleNameReference) {\n\t\t\tif (Arrays.equals(((SingleNameReference)statement).token, varName)) {\n\t\t\t\tEclipseNode problemNode = node.getNodeFor(statement);\n\t\t\t\tif (problemNode != null) problemNode.addWarning(\n\t\t\t\t\t\t\"You're assigning an auto-cleanup variable to something else. This is a bad idea.\");\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleConstructor.java",
    "content": "/*\n * Copyright (C) 2010-2024 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.eclipse.Eclipse.ECLIPSE_DO_NOT_TOUCH_FLAG;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport java.lang.reflect.Modifier;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.List;\n\nimport lombok.AccessLevel;\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.ConfigurationKeys;\nimport lombok.NoArgsConstructor;\nimport lombok.RequiredArgsConstructor;\nimport lombok.core.AST.Kind;\nimport lombok.core.configuration.CheckerFrameworkVersion;\nimport lombok.core.AnnotationValues;\nimport lombok.eclipse.Eclipse;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.eclipse.handlers.EclipseHandlerUtil.MemberExistsResult;\nimport lombok.spi.Provides;\n\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.AllocationExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.Argument;\nimport org.eclipse.jdt.internal.compiler.ast.ArrayInitializer;\nimport org.eclipse.jdt.internal.compiler.ast.ArrayTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.Assignment;\nimport org.eclipse.jdt.internal.compiler.ast.CharLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.DoubleLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.ExplicitConstructorCall;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.FalseLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.FieldReference;\nimport org.eclipse.jdt.internal.compiler.ast.FloatLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.IntLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.LongLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.MessageSend;\nimport org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.NullLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.ReturnStatement;\nimport org.eclipse.jdt.internal.compiler.ast.SingleMemberAnnotation;\nimport org.eclipse.jdt.internal.compiler.ast.SingleNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.StringLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.ThisReference;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\nimport org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeConstants;\n\npublic class HandleConstructor {\n\t@Provides\n\tpublic static class HandleNoArgsConstructor extends EclipseAnnotationHandler<NoArgsConstructor> {\n\t\tprivate static final String NAME = NoArgsConstructor.class.getSimpleName();\n\t\tprivate HandleConstructor handleConstructor = new HandleConstructor();\n\t\t\n\t\t@Override public void handle(AnnotationValues<NoArgsConstructor> annotation, Annotation ast, EclipseNode annotationNode) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.NO_ARGS_CONSTRUCTOR_FLAG_USAGE, \"@NoArgsConstructor\", ConfigurationKeys.ANY_CONSTRUCTOR_FLAG_USAGE, \"any @xArgsConstructor\");\n\t\t\t\n\t\t\tEclipseNode typeNode = annotationNode.up();\n\t\t\tif (!checkLegality(typeNode, annotationNode, NAME)) return;\n\t\t\tNoArgsConstructor ann = annotation.getInstance();\n\t\t\tAccessLevel level = ann.access();\n\t\t\tString staticName = ann.staticName();\n\t\t\tif (level == AccessLevel.NONE) return;\n\t\t\t\n\t\t\tboolean force = ann.force();\n\t\t\t\n\t\t\tList<Annotation> onConstructor = unboxAndRemoveAnnotationParameter(ast, \"onConstructor\", \"@NoArgsConstructor(onConstructor\", annotationNode);\n\t\t\tif (!onConstructor.isEmpty()) {\n\t\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.ON_X_FLAG_USAGE, \"@NoArgsConstructor(onConstructor=...)\");\n\t\t\t}\n\t\t\t\n\t\t\thandleConstructor.generateConstructor(typeNode, level, Collections.<EclipseNode>emptyList(), force, staticName, SkipIfConstructorExists.NO, onConstructor, annotationNode);\n\t\t}\n\t}\n\t\n\t@Provides\n\tpublic static class HandleRequiredArgsConstructor extends EclipseAnnotationHandler<RequiredArgsConstructor> {\n\t\tprivate static final String NAME = RequiredArgsConstructor.class.getSimpleName();\n\t\tprivate HandleConstructor handleConstructor = new HandleConstructor();\n\t\t\n\t\t@Override public void handle(AnnotationValues<RequiredArgsConstructor> annotation, Annotation ast, EclipseNode annotationNode) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.REQUIRED_ARGS_CONSTRUCTOR_FLAG_USAGE, \"@RequiredArgsConstructor\", ConfigurationKeys.ANY_CONSTRUCTOR_FLAG_USAGE, \"any @xArgsConstructor\");\n\t\t\t\n\t\t\tEclipseNode typeNode = annotationNode.up();\n\t\t\tif (!checkLegality(typeNode, annotationNode, NAME)) return;\n\t\t\tRequiredArgsConstructor ann = annotation.getInstance();\n\t\t\tAccessLevel level = ann.access();\n\t\t\tif (level == AccessLevel.NONE) return;\n\t\t\tString staticName = ann.staticName();\n\t\t\tif (annotation.isExplicit(\"suppressConstructorProperties\")) {\n\t\t\t\tannotationNode.addError(\"This deprecated feature is no longer supported. Remove it; you can create a lombok.config file with 'lombok.anyConstructor.suppressConstructorProperties = true'.\");\n\t\t\t}\n\t\t\t\n\t\t\tList<Annotation> onConstructor = unboxAndRemoveAnnotationParameter(ast, \"onConstructor\", \"@RequiredArgsConstructor(onConstructor\", annotationNode);\n\t\t\tif (!onConstructor.isEmpty()) {\n\t\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.ON_X_FLAG_USAGE, \"@RequiredArgsConstructor(onConstructor=...)\");\n\t\t\t}\n\t\t\t\n\t\t\thandleConstructor.generateConstructor(\n\t\t\t\ttypeNode, level, findRequiredFields(typeNode), false, staticName, SkipIfConstructorExists.NO,\n\t\t\t\tonConstructor, annotationNode);\n\t\t}\n\t}\n\t\n\t@Provides\n\tpublic static class HandleAllArgsConstructor extends EclipseAnnotationHandler<AllArgsConstructor> {\n\t\tprivate static final String NAME = AllArgsConstructor.class.getSimpleName();\n\n\t\tprivate HandleConstructor handleConstructor = new HandleConstructor();\n\t\t\n\t\t@Override public void handle(AnnotationValues<AllArgsConstructor> annotation, Annotation ast, EclipseNode annotationNode) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.ALL_ARGS_CONSTRUCTOR_FLAG_USAGE, \"@AllArgsConstructor\", ConfigurationKeys.ANY_CONSTRUCTOR_FLAG_USAGE, \"any @xArgsConstructor\");\n\t\t\t\n\t\t\tEclipseNode typeNode = annotationNode.up();\n\t\t\tif (!checkLegality(typeNode, annotationNode, NAME)) return;\n\t\t\tAllArgsConstructor ann = annotation.getInstance();\n\t\t\tAccessLevel level = ann.access();\n\t\t\tif (level == AccessLevel.NONE) return;\n\t\t\tString staticName = ann.staticName();\n\t\t\tif (annotation.isExplicit(\"suppressConstructorProperties\")) {\n\t\t\t\tannotationNode.addError(\"This deprecated feature is no longer supported. Remove it; you can create a lombok.config file with 'lombok.anyConstructor.suppressConstructorProperties = true'.\");\n\t\t\t}\n\t\t\t\n\t\t\tList<Annotation> onConstructor = unboxAndRemoveAnnotationParameter(ast, \"onConstructor\", \"@AllArgsConstructor(onConstructor\", annotationNode);\n\t\t\tif (!onConstructor.isEmpty()) {\n\t\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.ON_X_FLAG_USAGE, \"@AllArgsConstructor(onConstructor=...)\");\n\t\t\t}\n\t\t\t\n\t\t\thandleConstructor.generateConstructor(\n\t\t\t\ttypeNode, level, findAllFields(typeNode), false, staticName, SkipIfConstructorExists.NO,\n\t\t\t\tonConstructor, annotationNode);\n\t\t}\n\t}\n\t\n\tprivate static List<EclipseNode> findRequiredFields(EclipseNode typeNode) {\n\t\treturn findFields(typeNode, true);\n\t}\n\t\n\tprivate static List<EclipseNode> findFields(EclipseNode typeNode, boolean nullMarked) {\n\t\tList<EclipseNode> fields = new ArrayList<EclipseNode>();\n\t\tfor (EclipseNode child : typeNode.down()) {\n\t\t\tif (child.getKind() != Kind.FIELD) continue;\n\t\t\tFieldDeclaration fieldDecl = (FieldDeclaration) child.get();\n\t\t\tif (!filterField(fieldDecl)) continue;\n\t\t\tboolean isFinal = (fieldDecl.modifiers & ClassFileConstants.AccFinal) != 0;\n\t\t\tboolean isNonNull = nullMarked && hasNonNullAnnotations(child);\n\t\t\tif ((isFinal || isNonNull) && fieldDecl.initialization == null) fields.add(child);\n\t\t}\n\t\treturn fields;\n\t}\n\t\n\tstatic List<EclipseNode> findAllFields(EclipseNode typeNode) {\n\t\treturn findAllFields(typeNode, false);\n\t}\n\t\n\tstatic List<EclipseNode> findAllFields(EclipseNode typeNode, boolean evenFinalInitialized) {\n\t\tList<EclipseNode> fields = new ArrayList<EclipseNode>();\n\t\tfor (EclipseNode child : typeNode.down()) {\n\t\t\tif (child.getKind() != Kind.FIELD) continue;\n\t\t\tFieldDeclaration fieldDecl = (FieldDeclaration) child.get();\n\t\t\tif (!filterField(fieldDecl)) continue;\n\t\t\t\n\t\t\tif (!evenFinalInitialized && ((fieldDecl.modifiers & ClassFileConstants.AccFinal) != 0) && fieldDecl.initialization != null) continue;\n\t\t\t\n\t\t\tfields.add(child);\n\t\t}\n\t\treturn fields;\n\t}\n\t\n\tstatic boolean checkLegality(EclipseNode typeNode, EclipseNode errorNode, String name) {\n\t\tif (!isClassOrEnum(typeNode)) {\n\t\t\terrorNode.addError(name + \" is only supported on a class or an enum.\");\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\tpublic enum SkipIfConstructorExists {\n\t\tYES, NO, I_AM_BUILDER;\n\t}\n\t\n\tpublic void generateExtraNoArgsConstructor(EclipseNode typeNode, EclipseNode sourceNode) {\n\t\tif (!isDirectDescendantOfObject(typeNode)) return;\n\t\t\n\t\tBoolean v = typeNode.getAst().readConfiguration(ConfigurationKeys.NO_ARGS_CONSTRUCTOR_EXTRA_PRIVATE);\n\t\tif (v == null || !v) return;\n\t\t\n\t\tgenerate(typeNode, AccessLevel.PRIVATE, Collections.<EclipseNode>emptyList(), true, null, SkipIfConstructorExists.NO, Collections.<Annotation>emptyList(), sourceNode, true);\n\t}\n\t\n\tpublic void generateRequiredArgsConstructor(\n\t\t\tEclipseNode typeNode, AccessLevel level, String staticName, SkipIfConstructorExists skipIfConstructorExists,\n\t\t\tList<Annotation> onConstructor, EclipseNode sourceNode) {\n\t\t\n\t\tgenerateConstructor(typeNode, level, findRequiredFields(typeNode), false, staticName, skipIfConstructorExists, onConstructor, sourceNode);\n\t}\n\t\n\tpublic void generateAllArgsConstructor(\n\t\t\tEclipseNode typeNode, AccessLevel level, String staticName, SkipIfConstructorExists skipIfConstructorExists,\n\t\t\tList<Annotation> onConstructor, EclipseNode sourceNode) {\n\t\t\n\t\tgenerateConstructor(typeNode, level, findAllFields(typeNode), false, staticName, skipIfConstructorExists, onConstructor, sourceNode);\n\t}\n\t\n\tpublic void generateConstructor(\n\t\tEclipseNode typeNode, AccessLevel level, List<EclipseNode> fieldsToParam, boolean forceDefaults, String staticName, SkipIfConstructorExists skipIfConstructorExists,\n\t\tList<Annotation> onConstructor, EclipseNode sourceNode) {\n\t\t\n\t\tgenerate(typeNode, level, fieldsToParam, forceDefaults, staticName, skipIfConstructorExists, onConstructor, sourceNode, false);\n\t}\n\t\n\tpublic void generate(\n\t\t\tEclipseNode typeNode, AccessLevel level, List<EclipseNode> fieldsToParam, boolean forceDefaults, String staticName, SkipIfConstructorExists skipIfConstructorExists,\n\t\t\tList<Annotation> onConstructor, EclipseNode sourceNode, boolean noArgs) {\n\t\t\t\n\t\tASTNode source = sourceNode.get();\n\t\tboolean staticConstrRequired = staticName != null && !staticName.equals(\"\");\n\n\t\tif (skipIfConstructorExists != SkipIfConstructorExists.NO) {\n\t\t\tfor (EclipseNode child : typeNode.down()) {\n\t\t\t\tif (child.getKind() == Kind.ANNOTATION) {\n\t\t\t\t\tboolean skipGeneration = (annotationTypeMatches(NoArgsConstructor.class, child) ||\n\t\t\t\t\t\tannotationTypeMatches(AllArgsConstructor.class, child) ||\n\t\t\t\t\t\tannotationTypeMatches(RequiredArgsConstructor.class, child));\n\t\t\t\t\t\n\t\t\t\t\tif (!skipGeneration && skipIfConstructorExists == SkipIfConstructorExists.YES) {\n\t\t\t\t\t\tskipGeneration = annotationTypeMatches(Builder.class, child);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (skipGeneration) {\n\t\t\t\t\t\tif (staticConstrRequired) {\n\t\t\t\t\t\t\t// @Data has asked us to generate a constructor, but we're going to skip this instruction, as an explicit 'make a constructor' annotation\n\t\t\t\t\t\t\t// will take care of it. However, @Data also wants a specific static name; this will be ignored; the appropriate way to do this is to use\n\t\t\t\t\t\t\t// the 'staticName' parameter of the @XArgsConstructor you've stuck on your type.\n\t\t\t\t\t\t\t// We should warn that we're ignoring @Data's 'staticConstructor' param.\n\t\t\t\t\t\t\ttypeNode.addWarning(\n\t\t\t\t\t\t\t\t\"Ignoring static constructor name: explicit @XxxArgsConstructor annotation present; its `staticName` parameter will be used.\",\n\t\t\t\t\t\t\t\tsource.sourceStart, source.sourceEnd);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (noArgs && noArgsConstructorExists(typeNode)) return;\n\t\t\n\t\tif (!(skipIfConstructorExists != SkipIfConstructorExists.NO && constructorExists(typeNode) != MemberExistsResult.NOT_EXISTS)) {\n\t\t\tConstructorDeclaration constr = createConstructor(\n\t\t\t\tstaticConstrRequired ? AccessLevel.PRIVATE : level, typeNode, fieldsToParam, forceDefaults,\n\t\t\t\tsourceNode, onConstructor);\n\t\t\tEclipseNode constructorNode = injectMethod(typeNode, constr);\n\t\t\tgenerateConstructorJavadoc(typeNode, constructorNode, fieldsToParam);\n\t\t}\n\t\tgenerateStaticConstructor(staticConstrRequired, typeNode, staticName, level, fieldsToParam, source);\n\t}\n\t\n\tprivate void generateStaticConstructor(boolean staticConstrRequired, EclipseNode typeNode, String staticName, AccessLevel level, Collection<EclipseNode> fields, ASTNode source) {\n\t\tif (staticConstrRequired) {\n\t\t\tMethodDeclaration staticConstr = createStaticConstructor(level, staticName, typeNode, fields, source);\n\t\t\tEclipseNode constructorNode = injectMethod(typeNode, staticConstr);\n\t\t\tgenerateConstructorJavadoc(typeNode, constructorNode, fields);\n\t\t}\n\t}\n\t\n\tprivate static boolean noArgsConstructorExists(EclipseNode node) {\n\t\tnode = EclipseHandlerUtil.upToTypeNode(node);\n\t\t\n\t\tif (node != null && node.get() instanceof TypeDeclaration) {\n\t\t\tTypeDeclaration typeDecl = (TypeDeclaration)node.get();\n\t\t\tif (typeDecl.methods != null) for (AbstractMethodDeclaration def : typeDecl.methods) {\n\t\t\t\tif (def instanceof ConstructorDeclaration) {\n\t\t\t\t\tArgument[] arguments = ((ConstructorDeclaration) def).arguments;\n\t\t\t\t\tif (arguments == null || arguments.length == 0) return true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tfor (EclipseNode child : node.down()) {\n\t\t\tif (annotationTypeMatches(NoArgsConstructor.class, child)) return true;\n\t\t\tif (annotationTypeMatches(RequiredArgsConstructor.class, child) && findRequiredFields(node).isEmpty()) return true;\n\t\t\tif (annotationTypeMatches(AllArgsConstructor.class, child) && findAllFields(node).isEmpty()) return true;\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\tprivate static final char[][] JAVA_BEANS_CONSTRUCTORPROPERTIES = new char[][] { \"java\".toCharArray(), \"beans\".toCharArray(), \"ConstructorProperties\".toCharArray() };\n\tpublic static Annotation[] createConstructorProperties(ASTNode source, Collection<EclipseNode> fields) {\n\t\tif (fields.isEmpty()) return null;\n\t\t\n\t\tint pS = source.sourceStart, pE = source.sourceEnd;\n\t\tlong p = (long) pS << 32 | pE;\n\t\tlong[] poss = new long[3];\n\t\tArrays.fill(poss, p);\n\t\tQualifiedTypeReference constructorPropertiesType = new QualifiedTypeReference(JAVA_BEANS_CONSTRUCTORPROPERTIES, poss);\n\t\tsetGeneratedBy(constructorPropertiesType, source);\n\t\tSingleMemberAnnotation ann = new SingleMemberAnnotation(constructorPropertiesType, pS);\n\t\tann.declarationSourceEnd = pE;\n\t\t\n\t\tArrayInitializer fieldNames = new ArrayInitializer();\n\t\tfieldNames.sourceStart = pS;\n\t\tfieldNames.sourceEnd = pE;\n\t\tfieldNames.expressions = new Expression[fields.size()];\n\t\t\n\t\tint ctr = 0;\n\t\tfor (EclipseNode field : fields) {\n\t\t\tchar[] fieldName = removePrefixFromField(field);\n\t\t\tfieldNames.expressions[ctr] = new StringLiteral(fieldName, pS, pE, 0);\n\t\t\tsetGeneratedBy(fieldNames.expressions[ctr], source);\n\t\t\tctr++;\n\t\t}\n\t\t\n\t\tann.memberValue = fieldNames;\n\t\tsetGeneratedBy(ann, source);\n\t\tsetGeneratedBy(ann.memberValue, source);\n\t\treturn new Annotation[] { ann };\n\t}\n\t\n\tprivate static final char[] DEFAULT_PREFIX = {'$', 'd', 'e', 'f', 'a', 'u', 'l', 't', '$'};\n\tprivate static final char[] prefixWith(char[] prefix, char[] name) {\n\t\tchar[] out = new char[prefix.length + name.length];\n\t\tSystem.arraycopy(prefix, 0, out, 0, prefix.length);\n\t\tSystem.arraycopy(name, 0, out, prefix.length, name.length);\n\t\treturn out;\n\t}\n\t\n\t@SuppressWarnings(\"deprecation\") public static ConstructorDeclaration createConstructor(\n\t\tAccessLevel level, EclipseNode type, Collection<EclipseNode> fieldsToParam, boolean forceDefaults,\n\t\tEclipseNode sourceNode, List<Annotation> onConstructor) {\n\t\t\n\t\tASTNode source = sourceNode.get();\n\t\tTypeDeclaration typeDeclaration = ((TypeDeclaration) type.get());\n\t\tlong p = (long) source.sourceStart << 32 | source.sourceEnd;\n\t\t\n\t\tboolean isEnum = (((TypeDeclaration) type.get()).modifiers & ClassFileConstants.AccEnum) != 0;\n\t\t\n\t\tif (isEnum) level = AccessLevel.PRIVATE;\n\t\t\n\t\tList<EclipseNode> fieldsToDefault = fieldsNeedingBuilderDefaults(type, fieldsToParam);\n\t\tList<EclipseNode> fieldsToExplicit = forceDefaults ? fieldsNeedingExplicitDefaults(type, fieldsToParam) : Collections.<EclipseNode>emptyList();\n\t\t\n\t\tboolean addConstructorProperties;\n\t\tif (fieldsToParam.isEmpty()) {\n\t\t\taddConstructorProperties = false;\n\t\t} else {\n\t\t\tBoolean v = type.getAst().readConfiguration(ConfigurationKeys.ANY_CONSTRUCTOR_ADD_CONSTRUCTOR_PROPERTIES);\n\t\t\taddConstructorProperties = v != null ? v.booleanValue() :\n\t\t\t\tBoolean.FALSE.equals(type.getAst().readConfiguration(ConfigurationKeys.ANY_CONSTRUCTOR_SUPPRESS_CONSTRUCTOR_PROPERTIES));\n\t\t}\n\t\t\n\t\tConstructorDeclaration constructor = new ConstructorDeclaration(((CompilationUnitDeclaration) type.top().get()).compilationResult);\n\t\t\n\t\tconstructor.modifiers = toEclipseModifier(level);\n\t\tconstructor.selector = typeDeclaration.name;\n\t\tconstructor.constructorCall = new ExplicitConstructorCall(ExplicitConstructorCall.ImplicitSuper);\n\t\tconstructor.constructorCall.sourceStart = source.sourceStart;\n\t\tconstructor.constructorCall.sourceEnd = source.sourceEnd;\n\t\tconstructor.thrownExceptions = null;\n\t\tconstructor.typeParameters = null;\n\t\tconstructor.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tconstructor.bodyStart = constructor.declarationSourceStart = constructor.sourceStart = source.sourceStart;\n\t\tconstructor.bodyEnd = constructor.declarationSourceEnd = constructor.sourceEnd = source.sourceEnd;\n\t\tconstructor.arguments = null;\n\t\t\n\t\tList<Argument> params = new ArrayList<Argument>();\n\t\tList<Statement> assigns = new ArrayList<Statement>();\n\t\tList<Statement> nullChecks = new ArrayList<Statement>();\n\t\t\n\t\tfor (EclipseNode fieldNode : fieldsToParam) {\n\t\t\tFieldDeclaration field = (FieldDeclaration) fieldNode.get();\n\t\t\tchar[] rawName = field.name;\n\t\t\tchar[] fieldName = removePrefixFromField(fieldNode);\n\t\t\tFieldReference thisX = new FieldReference(rawName, p);\n\t\t\tint s = (int) (p >> 32);\n\t\t\tint e = (int) p;\n\t\t\tthisX.receiver = new ThisReference(s, e);\n\t\t\t\n\t\t\tExpression assignmentExpr = new SingleNameReference(fieldName, p);\n\t\t\t\n\t\t\tAssignment assignment = new Assignment(thisX, assignmentExpr, (int) p);\n\t\t\tassignment.sourceStart = (int) (p >> 32); assignment.sourceEnd = assignment.statementEnd = (int) (p >> 32);\n\t\t\tassigns.add(assignment);\n\t\t\tlong fieldPos = (((long) field.sourceStart) << 32) | field.sourceEnd;\n\t\t\tArgument parameter = new Argument(fieldName, fieldPos, copyType(field.type, source), Modifier.FINAL);\n\t\t\tAnnotation[] copyableAnnotations = findCopyableAnnotations(fieldNode);\n\t\t\tif (hasNonNullAnnotations(fieldNode)) {\n\t\t\t\tStatement nullCheck = generateNullCheck(parameter, sourceNode, null);\n\t\t\t\tif (nullCheck != null) nullChecks.add(nullCheck);\n\t\t\t}\n\t\t\tparameter.annotations = copyAnnotations(source, copyableAnnotations);\n\t\t\tif (parameter.annotations != null) {\n\t\t\t\tparameter.bits |= Eclipse.HasTypeAnnotations;\n\t\t\t\tconstructor.bits |= Eclipse.HasTypeAnnotations;\n\t\t\t}\n\t\t\tparams.add(parameter);\n\t\t}\n\t\t\n\t\tfor (EclipseNode fieldNode : fieldsToExplicit) {\n\t\t\tFieldDeclaration field = (FieldDeclaration) fieldNode.get();\n\t\t\tchar[] rawName = field.name;\n\t\t\tFieldReference thisX = new FieldReference(rawName, p);\n\t\t\tint s = (int) (p >> 32);\n\t\t\tint e = (int) p;\n\t\t\tthisX.receiver = new ThisReference(s, e);\n\t\t\t\n\t\t\tExpression assignmentExpr = getDefaultExpr(field.type, s, e);\n\t\t\t\n\t\t\tAssignment assignment = new Assignment(thisX, assignmentExpr, (int) p);\n\t\t\tassignment.sourceStart = (int) (p >> 32); assignment.sourceEnd = assignment.statementEnd = (int) (p >> 32);\n\t\t\tassigns.add(assignment);\n\t\t}\n\t\t\n\t\tfor (EclipseNode fieldNode : fieldsToDefault) {\n\t\t\tFieldDeclaration field = (FieldDeclaration) fieldNode.get();\n\t\t\tchar[] rawName = field.name;\n\t\t\tFieldReference thisX = new FieldReference(rawName, p);\n\t\t\tint s = (int) (p >> 32);\n\t\t\tint e = (int) p;\n\t\t\tthisX.receiver = new ThisReference(s, e);\n\t\t\t\n\t\t\tMessageSend inv = new MessageSend();\n\t\t\tinv.sourceStart = source.sourceStart;\n\t\t\tinv.sourceEnd = source.sourceEnd;\n\t\t\tinv.receiver = new SingleNameReference(((TypeDeclaration) type.get()).name, 0L);\n\t\t\tinv.selector = prefixWith(DEFAULT_PREFIX, removePrefixFromField(fieldNode));\n\t\t\t\n\t\t\tAssignment assignment = new Assignment(thisX, inv, (int) p);\n\t\t\tassignment.sourceStart = (int) (p >> 32); assignment.sourceEnd = assignment.statementEnd = (int) (p >> 32);\n\t\t\tassigns.add(assignment);\n\t\t}\n\t\t\n\t\tnullChecks.addAll(assigns);\n\t\tconstructor.statements = nullChecks.isEmpty() ? null : nullChecks.toArray(new Statement[0]);\n\t\tconstructor.arguments = params.isEmpty() ? null : params.toArray(new Argument[0]);\n\t\t\n\t\t/* Generate annotations that must  be put on the generated method, and attach them. */ {\n\t\t\tAnnotation[] constructorProperties = null;\n\t\t\tif (addConstructorProperties && !isLocalType(type)) constructorProperties = createConstructorProperties(source, fieldsToParam);\n\t\t\t\n\t\t\tconstructor.annotations = copyAnnotations(source,\n\t\t\t\tonConstructor.toArray(new Annotation[0]),\n\t\t\t\tconstructorProperties);\n\t\t}\n\t\t\n\t\tconstructor.traverse(new SetGeneratedByVisitor(source), typeDeclaration.scope);\n\t\treturn constructor;\n\t}\n\t\n\tprivate static List<EclipseNode> fieldsNeedingBuilderDefaults(EclipseNode type, Collection<EclipseNode> fieldsToParam) {\n\t\tList<EclipseNode> out = new ArrayList<EclipseNode>();\n\t\ttop:\n\t\tfor (EclipseNode node : type.down()) {\n\t\t\tif (node.getKind() != Kind.FIELD) continue top;\n\t\t\tFieldDeclaration fd = (FieldDeclaration) node.get();\n\t\t\tif ((fd.modifiers & ClassFileConstants.AccStatic) != 0) continue top;\n\t\t\tfor (EclipseNode ftp : fieldsToParam) if (node == ftp) continue top;\n\t\t\tif (EclipseHandlerUtil.hasAnnotation(Builder.Default.class, node)) out.add(node);\n\t\t}\n\t\treturn out;\n\t}\n\t\n\tprivate static List<EclipseNode> fieldsNeedingExplicitDefaults(EclipseNode type, Collection<EclipseNode> fieldsToParam) {\n\t\tList<EclipseNode> out = new ArrayList<EclipseNode>();\n\t\ttop:\n\t\tfor (EclipseNode node : type.down()) {\n\t\t\tif (node.getKind() != Kind.FIELD) continue top;\n\t\t\tFieldDeclaration fd = (FieldDeclaration) node.get();\n\t\t\tif (fd.initialization != null) continue top;\n\t\t\tif ((fd.modifiers & ClassFileConstants.AccFinal) == 0) continue top;\n\t\t\tif ((fd.modifiers & ClassFileConstants.AccStatic) != 0) continue top;\n\t\t\tfor (EclipseNode ftp : fieldsToParam) if (node == ftp) continue top;\n\t\t\tif (EclipseHandlerUtil.hasAnnotation(Builder.Default.class, node)) continue top;\n\t\t\tout.add(node);\n\t\t}\n\t\treturn out;\n\t}\n\t\n\tprivate static Expression getDefaultExpr(TypeReference type, int s, int e) {\n\t\tboolean array = type instanceof ArrayTypeReference;\n\t\tif (array) return new NullLiteral(s, e);\n\t\tchar[] lastToken = type.getLastToken();\n\t\tif (Arrays.equals(TypeConstants.BOOLEAN, lastToken)) return new FalseLiteral(s, e);\n\t\tif (Arrays.equals(TypeConstants.CHAR, lastToken)) return new CharLiteral(new char[] {'\\'', '\\\\', '0', '\\''}, s, e);\n\t\tif (Arrays.equals(TypeConstants.BYTE, lastToken) || Arrays.equals(TypeConstants.SHORT, lastToken) ||\n\t\t\tArrays.equals(TypeConstants.INT, lastToken)) return IntLiteral.buildIntLiteral(new char[] {'0'}, s, e);\n\t\tif (Arrays.equals(TypeConstants.LONG, lastToken)) return LongLiteral.buildLongLiteral(new char[] {'0',  'L'}, s, e);\n\t\tif (Arrays.equals(TypeConstants.FLOAT, lastToken)) return new FloatLiteral(new char[] {'0', 'F'}, s, e);\n\t\tif (Arrays.equals(TypeConstants.DOUBLE, lastToken)) return new DoubleLiteral(new char[] {'0', 'D'}, s, e);\n\t\t\n\t\treturn new NullLiteral(s, e);\n\t}\n\t\n\tpublic static boolean isLocalType(EclipseNode type) {\n\t\tKind kind = type.up().getKind();\n\t\tif (kind == Kind.COMPILATION_UNIT) return false;\n\t\tif (kind == Kind.TYPE) return isLocalType(type.up());\n\t\treturn true;\n\t}\n\t\n\tpublic MethodDeclaration createStaticConstructor(AccessLevel level, String name, EclipseNode type, Collection<EclipseNode> fields, ASTNode source) {\n\t\tint pS = source.sourceStart, pE = source.sourceEnd;\n\t\tlong p = (long) pS << 32 | pE;\n\t\t\n\t\tMethodDeclaration constructor = new MethodDeclaration(((CompilationUnitDeclaration) type.top().get()).compilationResult);\n\t\t\n\t\tconstructor.modifiers = toEclipseModifier(level) | ClassFileConstants.AccStatic;\n\t\tTypeDeclaration typeDecl = (TypeDeclaration) type.get();\n\t\tconstructor.returnType = EclipseHandlerUtil.namePlusTypeParamsToTypeReference(type, typeDecl.typeParameters, p);\n\t\tconstructor.annotations = null;\n\t\tif (getCheckerFrameworkVersion(type).generateUnique()) {\n\t\t\tint len = constructor.returnType.getTypeName().length;\n\t\t\tconstructor.returnType.annotations = new Annotation[len][];\n\t\t\tconstructor.returnType.annotations[len - 1] = new Annotation[] {generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__UNIQUE)};\n\t\t}\n\t\tconstructor.selector = name.toCharArray();\n\t\tconstructor.thrownExceptions = null;\n\t\tconstructor.typeParameters = copyTypeParams(((TypeDeclaration) type.get()).typeParameters, source);\n\t\tconstructor.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tconstructor.bodyStart = constructor.declarationSourceStart = constructor.sourceStart = source.sourceStart;\n\t\tconstructor.bodyEnd = constructor.declarationSourceEnd = constructor.sourceEnd = source.sourceEnd;\n\t\t\n\t\tList<Argument> params = new ArrayList<Argument>();\n\t\tList<Expression> assigns = new ArrayList<Expression>();\n\t\tAllocationExpression statement = new AllocationExpression();\n\t\tstatement.sourceStart = pS; statement.sourceEnd = pE;\n\t\tstatement.type = copyType(constructor.returnType, source);\n\t\t\n\t\tfor (EclipseNode fieldNode : fields) {\n\t\t\tFieldDeclaration field = (FieldDeclaration) fieldNode.get();\n\t\t\tlong fieldPos = (((long) field.sourceStart) << 32) | field.sourceEnd;\n\t\t\tSingleNameReference nameRef = new SingleNameReference(field.name, fieldPos);\n\t\t\tassigns.add(nameRef);\n\t\t\t\n\t\t\tArgument parameter = new Argument(field.name, fieldPos, copyType(field.type, source), Modifier.FINAL);\n\t\t\tparameter.annotations = copyAnnotations(source, findCopyableAnnotations(fieldNode));\n\t\t\tif (parameter.annotations != null) {\n\t\t\t\tparameter.bits |= Eclipse.HasTypeAnnotations;\n\t\t\t\tconstructor.bits |= Eclipse.HasTypeAnnotations;\n\t\t\t}\n\t\t\tparams.add(parameter);\n\t\t}\n\t\t\n\t\tstatement.arguments = assigns.isEmpty() ? null : assigns.toArray(new Expression[0]);\n\t\tconstructor.arguments = params.isEmpty() ? null : params.toArray(new Argument[0]);\n\t\tconstructor.statements = new Statement[] { new ReturnStatement(statement, (int) (p >> 32), (int)p) };\n\t\t\n\t\tcreateRelevantNonNullAnnotation(type, constructor);\n\t\tconstructor.traverse(new SetGeneratedByVisitor(source), typeDecl.scope);\n\t\treturn constructor;\n\t}\n\t\n\tprivate void generateConstructorJavadoc(EclipseNode typeNode, EclipseNode constructorNode, Collection<EclipseNode> fields) {\n\t\ttry {\n\t\t\tif (fields.isEmpty()) return;\n\t\t\n\t\t\tString constructorJavadoc = getConstructorJavadocHeader(typeNode.getName());\n\t\t\tboolean fieldDescriptionAdded = false;\n\t\t\tfor (EclipseNode fieldNode : fields) {\n\t\t\t\tString paramName = String.valueOf(removePrefixFromField(fieldNode));\n\t\t\t\tString fieldJavadoc = getDocComment(fieldNode);\n\t\t\t\tString paramJavadoc = getConstructorParameterJavadoc(paramName, fieldJavadoc);\n\t\t\t\t\n\t\t\t\tif (paramJavadoc == null) {\n\t\t\t\t\tparamJavadoc = \"@param \" + paramName;\n\t\t\t\t} else {\n\t\t\t\t\tfieldDescriptionAdded = true;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tconstructorJavadoc = addJavadocLine(constructorJavadoc, paramJavadoc);\n\t\t\t}\n\t\t\tif (fieldDescriptionAdded) {\n\t\t\t\tsetDocComment(typeNode, constructorNode, constructorJavadoc);\n\t\t\t}\n\t\t} catch (Exception ignore) {}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleData.java",
    "content": "/*\n * Copyright (C) 2009-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport java.util.Collections;\n\nimport lombok.AccessLevel;\nimport lombok.ConfigurationKeys;\nimport lombok.Data;\nimport lombok.core.AnnotationValues;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.eclipse.handlers.HandleConstructor.SkipIfConstructorExists;\nimport lombok.spi.Provides;\n\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\n\n/**\n * Handles the {@code lombok.Data} annotation for eclipse.\n */\n@Provides\npublic class HandleData extends EclipseAnnotationHandler<Data> {\n\tprivate HandleGetter handleGetter = new HandleGetter();\n\tprivate HandleSetter handleSetter = new HandleSetter();\n\tprivate HandleEqualsAndHashCode handleEqualsAndHashCode = new HandleEqualsAndHashCode();\n\tprivate HandleToString handleToString = new HandleToString();\n\tprivate HandleConstructor handleConstructor = new HandleConstructor();\n\t\n\t@Override public void handle(AnnotationValues<Data> annotation, Annotation ast, EclipseNode annotationNode) {\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.DATA_FLAG_USAGE, \"@Data\");\n\t\t\n\t\tData ann = annotation.getInstance();\n\t\tEclipseNode typeNode = annotationNode.up();\n\t\t\n\t\tif (!isClass(typeNode)) {\n\t\t\tannotationNode.addError(\"@Data is only supported on a class.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t//Careful: Generate the public static constructor (if there is one) LAST, so that any attempt to\n\t\t//'find callers' on the annotation node will find callers of the constructor, which is by far the\n\t\t//most useful of the many methods built by @Data. This trick won't work for the non-static constructor,\n\t\t//for whatever reason, though you can find callers of that one by focusing on the class name itself\n\t\t//and hitting 'find callers'.\n\t\t\n\t\thandleGetter.generateGetterForType(typeNode, annotationNode, AccessLevel.PUBLIC, true, Collections.<Annotation>emptyList());\n\t\thandleSetter.generateSetterForType(typeNode, annotationNode, AccessLevel.PUBLIC, true, Collections.<Annotation>emptyList(), Collections.<Annotation>emptyList());\n\t\thandleEqualsAndHashCode.generateEqualsAndHashCodeForType(typeNode, annotationNode);\n\t\thandleToString.generateToStringForType(typeNode, annotationNode);\n\t\thandleConstructor.generateRequiredArgsConstructor(\n\t\t\t\ttypeNode, AccessLevel.PUBLIC, ann.staticConstructor(), SkipIfConstructorExists.YES,\n\t\t\t\tCollections.<Annotation>emptyList(), annotationNode);\n\t\thandleConstructor.generateExtraNoArgsConstructor(typeNode, annotationNode);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleDelegate.java",
    "content": "/*\n * Copyright (C) 2014-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.handleExperimentalFlagUsage;\nimport lombok.ConfigurationKeys;\nimport lombok.core.AnnotationValues;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.experimental.Delegate;\nimport lombok.spi.Provides;\n\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\n\n/**\n * This class just handles basic error cases. The real meat of eclipse '@Delegate' support is in {@code PatchDelegate}.\n */\n@Provides\npublic class HandleDelegate extends EclipseAnnotationHandler<Delegate> {\n\tpublic void handle(AnnotationValues<Delegate> annotation, Annotation ast, EclipseNode annotationNode) {\n\t\thandleExperimentalFlagUsage(annotationNode, ConfigurationKeys.DELEGATE_FLAG_USAGE, \"@Delegate\");\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleEqualsAndHashCode.java",
    "content": "/*\n * Copyright (C) 2009-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport java.lang.reflect.Modifier;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\n\nimport lombok.AccessLevel;\nimport lombok.ConfigurationKeys;\nimport lombok.EqualsAndHashCode;\nimport lombok.EqualsAndHashCode.CacheStrategy;\nimport lombok.core.AST.Kind;\nimport lombok.core.handlers.HandlerUtil;\nimport lombok.core.handlers.InclusionExclusionUtils;\nimport lombok.core.handlers.InclusionExclusionUtils.Included;\nimport lombok.core.AnnotationValues;\nimport lombok.core.configuration.CallSuperType;\nimport lombok.core.configuration.CheckerFrameworkVersion;\nimport lombok.core.configuration.NullAnnotationLibrary;\nimport lombok.eclipse.Eclipse;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.eclipse.handlers.EclipseHandlerUtil.MemberExistsResult;\nimport lombok.spi.Provides;\n\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.Argument;\nimport org.eclipse.jdt.internal.compiler.ast.Assignment;\nimport org.eclipse.jdt.internal.compiler.ast.BinaryExpression;\nimport org.eclipse.jdt.internal.compiler.ast.CastExpression;\nimport org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.ConditionalExpression;\nimport org.eclipse.jdt.internal.compiler.ast.EqualExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.FalseLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.FieldReference;\nimport org.eclipse.jdt.internal.compiler.ast.IfStatement;\nimport org.eclipse.jdt.internal.compiler.ast.InstanceOfExpression;\nimport org.eclipse.jdt.internal.compiler.ast.IntLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.MarkerAnnotation;\nimport org.eclipse.jdt.internal.compiler.ast.MessageSend;\nimport org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.NameReference;\nimport org.eclipse.jdt.internal.compiler.ast.NullLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.OperatorIds;\nimport org.eclipse.jdt.internal.compiler.ast.ParameterizedQualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.ParameterizedSingleTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.ReturnStatement;\nimport org.eclipse.jdt.internal.compiler.ast.SingleNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.SingleTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.SuperReference;\nimport org.eclipse.jdt.internal.compiler.ast.ThisReference;\nimport org.eclipse.jdt.internal.compiler.ast.TrueLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.UnaryExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Wildcard;\nimport org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeConstants;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeIds;\n\n/**\n * Handles the {@code EqualsAndHashCode} annotation for eclipse.\n */\n@Provides\npublic class HandleEqualsAndHashCode extends EclipseAnnotationHandler<EqualsAndHashCode> {\n\t\n\tprivate static final String HASH_CODE_CACHE_NAME = \"$hashCodeCache\";\n\t\n\tprivate final char[] HASH_CODE_CACHE_NAME_ARR = HASH_CODE_CACHE_NAME.toCharArray();\n\tprivate final char[] PRIME = \"PRIME\".toCharArray();\n\tprivate final char[] RESULT = \"result\".toCharArray();\n\t\n\tpublic static final Set<String> BUILT_IN_TYPES = Collections.unmodifiableSet(new HashSet<String>(Arrays.asList(\n\t\t\t\"byte\", \"short\", \"int\", \"long\", \"char\", \"boolean\", \"double\", \"float\")));\n\t\n\t@Override public void handle(AnnotationValues<EqualsAndHashCode> annotation, Annotation ast, EclipseNode annotationNode) {\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.EQUALS_AND_HASH_CODE_FLAG_USAGE, \"@EqualsAndHashCode\");\n\t\t\n\t\tEqualsAndHashCode ann = annotation.getInstance();\n\t\tList<Included<EclipseNode, EqualsAndHashCode.Include>> members = InclusionExclusionUtils.handleEqualsAndHashCodeMarking(annotationNode.up(), annotation, annotationNode);\n\t\tif (members == null) return;\n\t\t\n\t\tList<Annotation> onParam = unboxAndRemoveAnnotationParameter(ast, \"onParam\", \"@EqualsAndHashCode(onParam\", annotationNode);\n\t\t\n\t\tBoolean callSuper = ann.callSuper();\n\t\tif (!annotation.isExplicit(\"callSuper\")) callSuper = null;\n\t\t\n\t\tBoolean doNotUseGettersConfiguration = annotationNode.getAst().readConfiguration(ConfigurationKeys.EQUALS_AND_HASH_CODE_DO_NOT_USE_GETTERS);\n\t\tboolean doNotUseGetters = annotation.isExplicit(\"doNotUseGetters\") || doNotUseGettersConfiguration == null ? ann.doNotUseGetters() : doNotUseGettersConfiguration;\n\t\tFieldAccess fieldAccess = doNotUseGetters ? FieldAccess.PREFER_FIELD : FieldAccess.GETTER;\n\t\t\n\t\tboolean cacheHashCode = ann.cacheStrategy() == CacheStrategy.LAZY;\n\t\t\n\t\tgenerateMethods(annotationNode.up(), annotationNode, members, callSuper, true, cacheHashCode, fieldAccess, onParam);\n\t}\n\t\n\tpublic void generateEqualsAndHashCodeForType(EclipseNode typeNode, EclipseNode errorNode) {\n\t\tif (hasAnnotation(EqualsAndHashCode.class, typeNode)) {\n\t\t\t//The annotation will make it happen, so we can skip it.\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tList<Included<EclipseNode, EqualsAndHashCode.Include>> members = InclusionExclusionUtils.handleEqualsAndHashCodeMarking(typeNode, null, null);\n\t\t\n\t\tBoolean doNotUseGettersConfiguration = typeNode.getAst().readConfiguration(ConfigurationKeys.EQUALS_AND_HASH_CODE_DO_NOT_USE_GETTERS);\n\t\tFieldAccess access = doNotUseGettersConfiguration == null || !doNotUseGettersConfiguration ? FieldAccess.GETTER : FieldAccess.PREFER_FIELD;\n\t\t\n\t\tgenerateMethods(typeNode, errorNode, members, null, false, false, access, new ArrayList<Annotation>());\n\t}\n\t\n\tpublic void generateMethods(EclipseNode typeNode, EclipseNode errorNode, List<Included<EclipseNode, EqualsAndHashCode.Include>> members,\n\t\tBoolean callSuper, boolean whineIfExists, boolean cacheHashCode, FieldAccess fieldAccess, List<Annotation> onParam) {\n\t\t\n\t\tif (!isClass(typeNode)) {\n\t\t\terrorNode.addError(\"@EqualsAndHashCode is only supported on a class.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tTypeDeclaration typeDecl = (TypeDeclaration) typeNode.get();\n\t\tboolean implicitCallSuper = callSuper == null;\n\t\t\n\t\tif (callSuper == null) {\n\t\t\ttry {\n\t\t\t\tcallSuper = ((Boolean) EqualsAndHashCode.class.getMethod(\"callSuper\").getDefaultValue()).booleanValue();\n\t\t\t} catch (Exception ignore) {\n\t\t\t\tthrow new InternalError(\"Lombok bug - this cannot happen - can't find callSuper field in EqualsAndHashCode annotation.\");\n\t\t\t}\n\t\t}\n\t\t\n\t\tboolean isDirectDescendantOfObject = isDirectDescendantOfObject(typeNode);\n\t\t\n\t\tboolean isFinal = (typeDecl.modifiers & ClassFileConstants.AccFinal) != 0;\n\t\tboolean needsCanEqual = !isFinal || !isDirectDescendantOfObject;\n\t\tMemberExistsResult equalsExists = methodExists(\"equals\", typeNode, 1);\n\t\tMemberExistsResult hashCodeExists = methodExists(\"hashCode\", typeNode, 0);\n\t\tMemberExistsResult canEqualExists = methodExists(\"canEqual\", typeNode, 1);\n\t\tswitch (Collections.max(Arrays.asList(equalsExists, hashCodeExists))) {\n\t\tcase EXISTS_BY_LOMBOK:\n\t\t\treturn;\n\t\tcase EXISTS_BY_USER:\n\t\t\tif (whineIfExists) {\n\t\t\t\tString msg = \"Not generating equals and hashCode: A method with one of those names already exists. (Either both or none of these methods will be generated).\";\n\t\t\t\terrorNode.addWarning(msg);\n\t\t\t} else if (equalsExists == MemberExistsResult.NOT_EXISTS || hashCodeExists == MemberExistsResult.NOT_EXISTS) {\n\t\t\t\t// This means equals OR hashCode exists and not both.\n\t\t\t\t// Even though we should suppress the message about not generating these, this is such a weird and surprising situation we should ALWAYS generate a warning.\n\t\t\t\t// The user code couldn't possibly (barring really weird subclassing shenanigans) be in a shippable state anyway; the implementations of these 2 methods are\n\t\t\t\t// all inter-related and should be written by the same entity.\n\t\t\t\tString msg = String.format(\"Not generating %s: One of equals or hashCode exists. \" +\n\t\t\t\t\t\t\"You should either write both of these or none of these (in the latter case, lombok generates them).\",\n\t\t\t\t\t\tequalsExists == MemberExistsResult.NOT_EXISTS ? \"equals\" : \"hashCode\");\n\t\t\t\terrorNode.addWarning(msg);\n\t\t\t}\n\t\t\treturn;\n\t\tcase NOT_EXISTS:\n\t\tdefault:\n\t\t\t//fallthrough\n\t\t}\n\t\t\n\t\tif (isDirectDescendantOfObject && callSuper) {\n\t\t\terrorNode.addError(\"Generating equals/hashCode with a supercall to java.lang.Object is pointless.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (implicitCallSuper && !isDirectDescendantOfObject) {\n\t\t\tCallSuperType cst = typeNode.getAst().readConfiguration(ConfigurationKeys.EQUALS_AND_HASH_CODE_CALL_SUPER);\n\t\t\tif (cst == null) cst = CallSuperType.WARN;\n\t\t\t\n\t\t\tswitch (cst) {\n\t\t\tdefault:\n\t\t\tcase WARN:\n\t\t\t\terrorNode.addWarning(\"Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is intentional, add '@EqualsAndHashCode(callSuper=false)' to your type.\");\n\t\t\t\tcallSuper = false;\n\t\t\t\tbreak;\n\t\t\tcase SKIP:\n\t\t\t\tcallSuper = false;\n\t\t\t\tbreak;\n\t\t\tcase CALL:\n\t\t\t\tcallSuper = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\tMethodDeclaration equalsMethod = createEquals(typeNode, members, callSuper, errorNode.get(), fieldAccess, needsCanEqual, onParam);\n\t\tequalsMethod.traverse(new SetGeneratedByVisitor(errorNode.get()), ((TypeDeclaration)typeNode.get()).scope);\n\t\tinjectMethod(typeNode, equalsMethod);\n\t\t\n\t\tif (needsCanEqual && canEqualExists == MemberExistsResult.NOT_EXISTS) {\n\t\t\tMethodDeclaration canEqualMethod = createCanEqual(typeNode, errorNode.get(), onParam);\n\t\t\tcanEqualMethod.traverse(new SetGeneratedByVisitor(errorNode.get()), ((TypeDeclaration)typeNode.get()).scope);\n\t\t\tinjectMethod(typeNode, canEqualMethod);\n\t\t}\n\t\t\n\t\tif (cacheHashCode){\n\t\t\tif (fieldExists(HASH_CODE_CACHE_NAME, typeNode) != MemberExistsResult.NOT_EXISTS) {\n\t\t\t\tString msg = String.format(\"Not caching the result of hashCode: A field named %s already exists.\", HASH_CODE_CACHE_NAME);\n\t\t\t\terrorNode.addWarning(msg);\n\t\t\t\tcacheHashCode = false;\n\t\t\t} else {\n\t\t\t\tcreateHashCodeCacheField(typeNode, errorNode.get());\n\t\t\t}\n\t\t}\n\t\t\n\t\tMethodDeclaration hashCodeMethod = createHashCode(typeNode, members, callSuper, cacheHashCode, errorNode.get(), fieldAccess);\n\t\thashCodeMethod.traverse(new SetGeneratedByVisitor(errorNode.get()), ((TypeDeclaration)typeNode.get()).scope);\n\t\tinjectMethod(typeNode, hashCodeMethod);\n\t}\n\n\tprivate void createHashCodeCacheField(EclipseNode typeNode, ASTNode source) {\n\t\tFieldDeclaration hashCodeCacheDecl = new FieldDeclaration(HASH_CODE_CACHE_NAME_ARR, 0, 0);\n\t\thashCodeCacheDecl.modifiers = ClassFileConstants.AccPrivate | ClassFileConstants.AccTransient;\n\t\thashCodeCacheDecl.bits |= Eclipse.ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\thashCodeCacheDecl.type = TypeReference.baseTypeReference(TypeIds.T_int, 0);\n\t\thashCodeCacheDecl.declarationSourceEnd = -1;\n\t\tinjectFieldAndMarkGenerated(typeNode, hashCodeCacheDecl);\n\t\tsetGeneratedBy(hashCodeCacheDecl, source);\n\t\tsetGeneratedBy(hashCodeCacheDecl.type, source);\n\t}\n\t\n\tprivate static final char[] HASH_CODE = \"hashCode\".toCharArray(), FLOAT_TO_INT_BITS = \"floatToIntBits\".toCharArray(), DOUBLE_TO_LONG_BITS = \"doubleToLongBits\".toCharArray();\n\t\n\tpublic MethodDeclaration createHashCode(EclipseNode type, Collection<Included<EclipseNode, EqualsAndHashCode.Include>> members, boolean callSuper, boolean cacheHashCode, ASTNode source, FieldAccess fieldAccess) {\n\t\tint pS = source.sourceStart, pE = source.sourceEnd;\n\t\tlong p = (long) pS << 32 | pE;\n\t\t\n\t\tMethodDeclaration method = new MethodDeclaration(((CompilationUnitDeclaration) type.top().get()).compilationResult);\n\t\tsetGeneratedBy(method, source);\n\t\t\n\t\tmethod.modifiers = toEclipseModifier(AccessLevel.PUBLIC);\n\t\tmethod.returnType = TypeReference.baseTypeReference(TypeIds.T_int, 0);\n\t\tsetGeneratedBy(method.returnType, source);\n\t\tAnnotation overrideAnnotation = makeMarkerAnnotation(TypeConstants.JAVA_LANG_OVERRIDE, source);\n\t\tCheckerFrameworkVersion checkerFramework = getCheckerFrameworkVersion(type);\n\t\tif (cacheHashCode && checkerFramework.generatePure()) {\n\t\t\tmethod.annotations = new Annotation[] { overrideAnnotation, generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__PURE) };\n\t\t} else if (checkerFramework.generateSideEffectFree()) {\n\t\t\tmethod.annotations = new Annotation[] { overrideAnnotation, generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE) };\n\t\t} else {\n\t\t\tmethod.annotations = new Annotation[] { overrideAnnotation };\n\t\t}\n\t\tmethod.selector = \"hashCode\".toCharArray();\n\t\tmethod.thrownExceptions = null;\n\t\tmethod.typeParameters = null;\n\t\tmethod.bits |= Eclipse.ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tmethod.bodyStart = method.declarationSourceStart = method.sourceStart = source.sourceStart;\n\t\tmethod.bodyEnd = method.declarationSourceEnd = method.sourceEnd = source.sourceEnd;\n\t\tmethod.arguments = null;\n\t\t\n\t\tList<Statement> statements = new ArrayList<Statement>();\n\t\t\n\t\tboolean isEmpty = true;\n\t\tfor (Included<EclipseNode, EqualsAndHashCode.Include> member : members) {\n\t\t\tTypeReference fType = getFieldType(member.getNode(), fieldAccess);\n\t\t\tif (fType.getLastToken() != null) {\n\t\t\t\tisEmpty = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* if (this.$hashCodeCache != 0) return this.$hashCodeCache; */ {\n\t\t\tif (cacheHashCode) {\n\t\t\t\tFieldReference hashCodeCacheRef = new FieldReference(HASH_CODE_CACHE_NAME_ARR, p);\n\t\t\t\thashCodeCacheRef.receiver = new ThisReference(pS, pE);\n\t\t\t\tsetGeneratedBy(hashCodeCacheRef, source);\n\t\t\t\tsetGeneratedBy(hashCodeCacheRef.receiver, source);\n\t\t\t\tEqualExpression cacheNotZero = new EqualExpression(hashCodeCacheRef, makeIntLiteral(\"0\".toCharArray(), source), OperatorIds.NOT_EQUAL);\n\t\t\t\tsetGeneratedBy(cacheNotZero, source);\n\t\t\t\tReturnStatement returnCache = new ReturnStatement(hashCodeCacheRef, pS, pE);\n\t\t\t\tsetGeneratedBy(returnCache, source);\n\t\t\t\tIfStatement ifStatement = new IfStatement(cacheNotZero, returnCache, pS, pE);\n\t\t\t\tsetGeneratedBy(ifStatement, source);\n\t\t\t\tstatements.add(ifStatement);\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* final int PRIME = X; */ {\n\t\t\t/* Without members, PRIME isn't used, as that would trigger a 'local variable not used' warning. */\n\t\t\tif (!isEmpty) {\n\t\t\t\tLocalDeclaration primeDecl = new LocalDeclaration(PRIME, pS, pE);\n\t\t\t\tsetGeneratedBy(primeDecl, source);\n\t\t\t\tprimeDecl.modifiers |= Modifier.FINAL;\n\t\t\t\tprimeDecl.type = TypeReference.baseTypeReference(TypeIds.T_int, 0);\n\t\t\t\tprimeDecl.type.sourceStart = pS; primeDecl.type.sourceEnd = pE;\n\t\t\t\tsetGeneratedBy(primeDecl.type, source);\n\t\t\t\tprimeDecl.initialization = makeIntLiteral(String.valueOf(HandlerUtil.primeForHashcode()).toCharArray(), source);\n\t\t\t\tstatements.add(primeDecl);\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* int result = ... */ {\n\t\tLocalDeclaration resultDecl = new LocalDeclaration(RESULT, pS, pE);\n\t\t\tsetGeneratedBy(resultDecl, source);\n\t\t\tfinal Expression init;\n\t\t\tif (callSuper) {\n\t\t\t\t/* ... super.hashCode(); */\n\t\t\t\tMessageSend callToSuper = new MessageSend();\n\t\t\t\tsetGeneratedBy(callToSuper, source);\n\t\t\t\tcallToSuper.sourceStart = pS; callToSuper.sourceEnd = pE;\n\t\t\t\tcallToSuper.receiver = new SuperReference(pS, pE);\n\t\t\t\tsetGeneratedBy(callToSuper.receiver, source);\n\t\t\t\tcallToSuper.selector = \"hashCode\".toCharArray();\n\t\t\t\tinit = callToSuper;\n\t\t\t} else {\n\t\t\t\t/* ... 1; */\n\t\t\t\tinit = makeIntLiteral(\"1\".toCharArray(), source);\n\t\t\t}\n\t\t\tresultDecl.initialization = init;\n\t\t\tresultDecl.type = TypeReference.baseTypeReference(TypeIds.T_int, 0);\n\t\t\tresultDecl.type.sourceStart = pS; resultDecl.type.sourceEnd = pE;\n\t\t\tif (isEmpty && !cacheHashCode) resultDecl.modifiers |= Modifier.FINAL;\n\t\t\tsetGeneratedBy(resultDecl.type, source);\n\t\t\tstatements.add(resultDecl);\n\t\t}\n\t\t\n\t\tfor (Included<EclipseNode, EqualsAndHashCode.Include> member : members) {\n\t\t\tEclipseNode memberNode = member.getNode();\n\t\t\tboolean isMethod = memberNode.getKind() == Kind.METHOD;\n\t\t\t\n\t\t\tTypeReference fType = getFieldType(memberNode, fieldAccess);\n\t\t\tchar[] dollarFieldName = ((isMethod ? \"$$\" : \"$\") + memberNode.getName()).toCharArray();\n\t\t\tchar[] token = fType.getLastToken();\n\t\t\tExpression fieldAccessor = isMethod ? createMethodAccessor(memberNode, source) : createFieldAccessor(memberNode, fieldAccess, source);\n\t\t\tif (fType.dimensions() == 0 && token != null) {\n\t\t\t\tif (Arrays.equals(TypeConstants.BOOLEAN, token)) {\n\t\t\t\t\t/* booleanField ? X : Y */\n\t\t\t\t\tIntLiteral intTrue = makeIntLiteral(String.valueOf(HandlerUtil.primeForTrue()).toCharArray(), source);\n\t\t\t\t\tIntLiteral intFalse = makeIntLiteral(String.valueOf(HandlerUtil.primeForFalse()).toCharArray(), source);\n\t\t\t\t\tConditionalExpression intForBool = new ConditionalExpression(fieldAccessor, intTrue, intFalse);\n\t\t\t\t\tsetGeneratedBy(intForBool, source);\n\t\t\t\t\tstatements.add(createResultCalculation(source, intForBool));\n\t\t\t\t} else if (Arrays.equals(TypeConstants.LONG, token)) {\n\t\t\t\t\t/* (int)(ref >>> 32 ^ ref) */\n\t\t\t\t\tstatements.add(createLocalDeclaration(source, dollarFieldName, TypeReference.baseTypeReference(TypeIds.T_long, 0), fieldAccessor));\n\t\t\t\t\tSingleNameReference copy1 = new SingleNameReference(dollarFieldName, p);\n\t\t\t\t\tsetGeneratedBy(copy1, source);\n\t\t\t\t\tSingleNameReference copy2 = new SingleNameReference(dollarFieldName, p);\n\t\t\t\t\tsetGeneratedBy(copy2, source);\n\t\t\t\t\tstatements.add(createResultCalculation(source, longToIntForHashCode(copy1, copy2, source)));\n\t\t\t\t} else if (Arrays.equals(TypeConstants.FLOAT, token)) {\n\t\t\t\t\t/* Float.floatToIntBits(fieldName) */\n\t\t\t\t\tMessageSend floatToIntBits = new MessageSend();\n\t\t\t\t\tfloatToIntBits.sourceStart = pS; floatToIntBits.sourceEnd = pE;\n\t\t\t\t\tsetGeneratedBy(floatToIntBits, source);\n\t\t\t\t\tfloatToIntBits.receiver = generateQualifiedNameRef(source, TypeConstants.JAVA_LANG_FLOAT);\n\t\t\t\t\tfloatToIntBits.selector = FLOAT_TO_INT_BITS;\n\t\t\t\t\tfloatToIntBits.arguments = new Expression[] { fieldAccessor };\n\t\t\t\t\tstatements.add(createResultCalculation(source, floatToIntBits));\n\t\t\t\t} else if (Arrays.equals(TypeConstants.DOUBLE, token)) {\n\t\t\t\t\t/* longToIntForHashCode(Double.doubleToLongBits(fieldName)) */\n\t\t\t\t\tMessageSend doubleToLongBits = new MessageSend();\n\t\t\t\t\tdoubleToLongBits.sourceStart = pS; doubleToLongBits.sourceEnd = pE;\n\t\t\t\t\tsetGeneratedBy(doubleToLongBits, source);\n\t\t\t\t\tdoubleToLongBits.receiver = generateQualifiedNameRef(source, TypeConstants.JAVA_LANG_DOUBLE);\n\t\t\t\t\tdoubleToLongBits.selector = DOUBLE_TO_LONG_BITS;\n\t\t\t\t\tdoubleToLongBits.arguments = new Expression[] { fieldAccessor };\n\t\t\t\t\tstatements.add(createLocalDeclaration(source, dollarFieldName, TypeReference.baseTypeReference(TypeIds.T_long, 0), doubleToLongBits));\n\t\t\t\t\tSingleNameReference copy1 = new SingleNameReference(dollarFieldName, p);\n\t\t\t\t\tsetGeneratedBy(copy1, source);\n\t\t\t\t\tSingleNameReference copy2 = new SingleNameReference(dollarFieldName, p);\n\t\t\t\t\tsetGeneratedBy(copy2, source);\n\t\t\t\t\tstatements.add(createResultCalculation(source, longToIntForHashCode(copy1, copy2, source)));\n\t\t\t\t} else if (BUILT_IN_TYPES.contains(new String(token))) {\n\t\t\t\t\tstatements.add(createResultCalculation(source, fieldAccessor));\n\t\t\t\t} else /* objects */ {\n\t\t\t\t\t/* final java.lang.Object $fieldName = this.fieldName; */\n\t\t\t\t\t/* $fieldName == null ? NULL_PRIME : $fieldName.hashCode() */\n\t\t\t\t\tstatements.add(createLocalDeclaration(source, dollarFieldName, generateQualifiedTypeRef(source, TypeConstants.JAVA_LANG_OBJECT), fieldAccessor));\n\t\t\t\t\t\n\t\t\t\t\tSingleNameReference copy1 = new SingleNameReference(dollarFieldName, p);\n\t\t\t\t\tsetGeneratedBy(copy1, source);\n\t\t\t\t\tSingleNameReference copy2 = new SingleNameReference(dollarFieldName, p);\n\t\t\t\t\tsetGeneratedBy(copy2, source);\n\t\t\t\t\t\n\t\t\t\t\tMessageSend hashCodeCall = new MessageSend();\n\t\t\t\t\thashCodeCall.sourceStart = pS; hashCodeCall.sourceEnd = pE;\n\t\t\t\t\tsetGeneratedBy(hashCodeCall, source);\n\t\t\t\t\thashCodeCall.receiver = copy1;\n\t\t\t\t\thashCodeCall.selector = HASH_CODE;\n\t\t\t\t\tNullLiteral nullLiteral = new NullLiteral(pS, pE);\n\t\t\t\t\tsetGeneratedBy(nullLiteral, source);\n\t\t\t\t\tEqualExpression objIsNull = new EqualExpression(copy2, nullLiteral, OperatorIds.EQUAL_EQUAL);\n\t\t\t\t\tsetGeneratedBy(objIsNull, source);\n\t\t\t\t\tIntLiteral intMagic = makeIntLiteral(String.valueOf(HandlerUtil.primeForNull()).toCharArray(), source);\n\t\t\t\t\tConditionalExpression nullOrHashCode = new ConditionalExpression(objIsNull, intMagic, hashCodeCall);\n\t\t\t\t\tnullOrHashCode.sourceStart = pS; nullOrHashCode.sourceEnd = pE;\n\t\t\t\t\tsetGeneratedBy(nullOrHashCode, source);\n\t\t\t\t\tstatements.add(createResultCalculation(source, nullOrHashCode));\n\t\t\t\t}\n\t\t\t} else if (fType.dimensions() > 0 && token != null) {\n\t\t\t\t/* Arrays.deepHashCode(array)  //just hashCode for simple arrays */\n\t\t\t\tMessageSend arraysHashCodeCall = new MessageSend();\n\t\t\t\tarraysHashCodeCall.sourceStart = pS; arraysHashCodeCall.sourceEnd = pE;\n\t\t\t\tsetGeneratedBy(arraysHashCodeCall, source);\n\t\t\t\tarraysHashCodeCall.receiver = generateQualifiedNameRef(source, TypeConstants.JAVA, TypeConstants.UTIL, \"Arrays\".toCharArray());\n\t\t\t\tif (fType.dimensions() > 1 || !BUILT_IN_TYPES.contains(new String(token))) {\n\t\t\t\t\tarraysHashCodeCall.selector = \"deepHashCode\".toCharArray();\n\t\t\t\t} else {\n\t\t\t\t\tarraysHashCodeCall.selector = \"hashCode\".toCharArray();\n\t\t\t\t}\n\t\t\t\tarraysHashCodeCall.arguments = new Expression[] { fieldAccessor };\n\t\t\t\tstatements.add(createResultCalculation(source, arraysHashCodeCall));\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* \n\t\t * if (result == 0) result = Integer.MIN_VALUE;\n\t\t * this.$hashCodeCache = result;\n\t\t * \n\t\t */ {\n\t\t\tif (cacheHashCode) {\n\t\t\t\tSingleNameReference resultRef = new SingleNameReference(RESULT, p);\n\t\t\t\tsetGeneratedBy(resultRef, source);\n\t\t\t\t\n\t\t\t\tEqualExpression resultIsZero = new EqualExpression(resultRef, makeIntLiteral(\"0\".toCharArray(), source), OperatorIds.EQUAL_EQUAL);\n\t\t\t\tsetGeneratedBy(resultIsZero, source);\n\t\t\t\t\n\t\t\t\tresultRef = new SingleNameReference(RESULT, p);\n\t\t\t\tsetGeneratedBy(resultRef, source);\n\t\t\t\t\n\t\t\t\tFieldReference integerMinValue = new FieldReference(\"MIN_VALUE\".toCharArray(), p);\n\t\t\t\tintegerMinValue.receiver = generateQualifiedNameRef(source, TypeConstants.JAVA_LANG_INTEGER);\n\t\t\t\tsetGeneratedBy(integerMinValue, source);\n\t\t\t\t\n\t\t\t\tAssignment newResult = new Assignment(resultRef, integerMinValue, pE);\n\t\t\t\tnewResult.sourceStart = pS; newResult.statementEnd = newResult.sourceEnd = pE;\n\t\t\t\tsetGeneratedBy(newResult, source);\n\t\t\t\t\n\t\t\t\tIfStatement ifStatement = new IfStatement(resultIsZero, newResult, pS, pE);\n\t\t\t\tsetGeneratedBy(ifStatement, source);\n\t\t\t\tstatements.add(ifStatement);\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tFieldReference hashCodeCacheRef = new FieldReference(HASH_CODE_CACHE_NAME_ARR, p);\n\t\t\t\thashCodeCacheRef.receiver = new ThisReference(pS, pE);\n\t\t\t\tsetGeneratedBy(hashCodeCacheRef, source);\n\t\t\t\tsetGeneratedBy(hashCodeCacheRef.receiver, source);\n\t\t\t\t\n\t\t\t\tresultRef = new SingleNameReference(RESULT, p);\n\t\t\t\tsetGeneratedBy(resultRef, source);\n\t\t\t\t\n\t\t\t\tAssignment cacheResult = new Assignment(hashCodeCacheRef, resultRef, pE);\n\t\t\t\tcacheResult.sourceStart = pS; cacheResult.statementEnd = cacheResult.sourceEnd = pE;\n\t\t\t\tsetGeneratedBy(cacheResult, source);\n\t\t\t\tstatements.add(cacheResult);\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* return result; */ {\n\t\t\tSingleNameReference resultRef = new SingleNameReference(RESULT, p);\n\t\t\tsetGeneratedBy(resultRef, source);\n\t\t\tReturnStatement returnStatement = new ReturnStatement(resultRef, pS, pE);\n\t\t\tsetGeneratedBy(returnStatement, source);\n\t\t\tstatements.add(returnStatement);\n\t\t}\n\t\tmethod.statements = statements.toArray(new Statement[0]);\n\t\treturn method;\n\t}\n\n\tpublic LocalDeclaration createLocalDeclaration(ASTNode source, char[] dollarFieldName, TypeReference type, Expression initializer) {\n\t\tint pS = source.sourceStart, pE = source.sourceEnd;\n\t\tLocalDeclaration tempVar = new LocalDeclaration(dollarFieldName, pS, pE);\n\t\tsetGeneratedBy(tempVar, source);\n\t\ttempVar.initialization = initializer;\n\t\ttempVar.type = type;\n\t\ttempVar.type.sourceStart = pS; tempVar.type.sourceEnd = pE;\n\t\tsetGeneratedBy(tempVar.type, source);\n\t\ttempVar.modifiers = Modifier.FINAL;\n\t\treturn tempVar;\n\t}\n\n\tpublic Expression createResultCalculation(ASTNode source, Expression ex) {\n\t\t/* result = result * PRIME + (ex); */\n\t\tint pS = source.sourceStart, pE = source.sourceEnd;\n\t\tlong p = (long)pS << 32 | pE;\n\t\tSingleNameReference resultRef = new SingleNameReference(RESULT, p);\n\t\tsetGeneratedBy(resultRef, source);\n\t\tSingleNameReference primeRef = new SingleNameReference(PRIME, p);\n\t\tsetGeneratedBy(primeRef, source);\n\t\tBinaryExpression multiplyByPrime = new BinaryExpression(resultRef, primeRef, OperatorIds.MULTIPLY);\n\t\tmultiplyByPrime.sourceStart = pS; multiplyByPrime.sourceEnd = pE;\n\t\tsetGeneratedBy(multiplyByPrime, source);\n\t\tBinaryExpression addItem = new BinaryExpression(multiplyByPrime, ex, OperatorIds.PLUS);\n\t\taddItem.sourceStart = pS; addItem.sourceEnd = pE;\n\t\tsetGeneratedBy(addItem, source);\n\t\tresultRef = new SingleNameReference(RESULT, p);\n\t\tsetGeneratedBy(resultRef, source);\n\t\tAssignment assignment = new Assignment(resultRef, addItem, pE);\n\t\tassignment.sourceStart = pS; assignment.sourceEnd = assignment.statementEnd = pE;\n\t\tsetGeneratedBy(assignment, source);\n\t\treturn assignment;\n\t}\n\t\n\t/**\n\t * @param type Type to 'copy' into a typeref\n\t * @param p position\n\t * @param addWildcards If false, all generics are cut off. If true, replaces all genericparams with a ?.\n\t * @return\n\t */\n\tpublic TypeReference createTypeReference(EclipseNode type, long p, ASTNode source, boolean addWildcards) {\n\t\tint pS = source.sourceStart; int pE = source.sourceEnd;\n\t\tList<String> list = new ArrayList<String>();\n\t\tList<Integer> genericsCount = addWildcards ? new ArrayList<Integer>() : null;\n\t\t\n\t\tlist.add(type.getName());\n\t\tif (addWildcards) genericsCount.add(arraySizeOf(((TypeDeclaration) type.get()).typeParameters));\n\t\tboolean staticContext = (((TypeDeclaration) type.get()).modifiers & ClassFileConstants.AccStatic) != 0;\n\t\tEclipseNode tNode = type.up();\n\t\t\n\t\twhile (tNode != null && tNode.getKind() == Kind.TYPE) {\n\t\t\tTypeDeclaration td = (TypeDeclaration) tNode.get();\n\t\t\tif (td.name == null || td.name.length == 0) break;\n\t\t\tlist.add(tNode.getName());\n\t\t\tif (!staticContext && tNode.getKind() == Kind.TYPE && (td.modifiers & ClassFileConstants.AccInterface) != 0) staticContext = true;\n\t\t\tif (addWildcards) genericsCount.add(staticContext ? 0 : arraySizeOf(td.typeParameters));\n\t\t\tif (!staticContext) staticContext = (td.modifiers & Modifier.STATIC) != 0;\n\t\t\ttNode = tNode.up();\n\t\t}\n\t\tCollections.reverse(list);\n\t\tif (addWildcards) Collections.reverse(genericsCount);\n\t\t\n\t\tif (list.size() == 1) {\n\t\t\tif (!addWildcards || genericsCount.get(0) == 0) {\n\t\t\t\treturn new SingleTypeReference(list.get(0).toCharArray(), p);\n\t\t\t} else {\n\t\t\t\treturn new ParameterizedSingleTypeReference(list.get(0).toCharArray(), wildcardify(pS, pE, source, genericsCount.get(0)), 0, p);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (addWildcards) {\n\t\t\taddWildcards = false;\n\t\t\tfor (int i : genericsCount) if (i > 0) addWildcards = true;\n\t\t}\n\t\t\n\t\tlong[] ps = new long[list.size()];\n\t\tchar[][] tokens = new char[list.size()][];\n\t\tfor (int i = 0; i < list.size(); i++) {\n\t\t\tps[i] = p;\n\t\t\ttokens[i] = list.get(i).toCharArray();\n\t\t}\n\t\t\n\t\tif (!addWildcards) return new QualifiedTypeReference(tokens, ps);\n\t\tTypeReference[][] typeArgs2 = new TypeReference[tokens.length][];\n\t\tfor (int i = 0; i < tokens.length; i++) typeArgs2[i] = wildcardify(pS, pE, source, genericsCount.get(i));\n\t\treturn new ParameterizedQualifiedTypeReference(tokens, typeArgs2, 0, ps);\n\t}\n\t\n\tprivate TypeReference[] wildcardify(int pS, int pE, ASTNode source, int count) {\n\t\tif (count == 0) return null;\n\t\tTypeReference[] typeArgs = new TypeReference[count];\n\t\tfor (int i = 0; i < count; i++) {\n\t\t\ttypeArgs[i] = new Wildcard(Wildcard.UNBOUND);\n\t\t\ttypeArgs[i].sourceStart = pS; typeArgs[i].sourceEnd = pE;\n\t\t\tsetGeneratedBy(typeArgs[i], source);\n\t\t}\n\t\t\n\t\treturn typeArgs;\n\t}\n\t\n\tprivate int arraySizeOf(Object[] arr) {\n\t\treturn arr == null ? 0 : arr.length;\n\t}\n\t\n\t/*\n\t * scan method, then class, then enclosing classes, then package for the first of:\n\t * javax.annotation.ParametersAreNonnullByDefault or javax.annotation.ParametersAreNullableByDefault. If it's the NN variant, generate javax.annotation.Nullable _on the type_.\n\t * org.eclipse.jdt.annotation.NonNullByDefault ->  org.eclipse.jdt.annotation.Nullable\n\t */\n\t\n\tprivate static final char[][] JAVAX_ANNOTATION_NULLABLE = Eclipse.fromQualifiedName(\"javax.annotation.Nullable\");\n\tprivate static final char[][] ORG_ECLIPSE_JDT_ANNOTATION_NULLABLE = Eclipse.fromQualifiedName(\"org.eclipse.jdt.annotation.Nullable\");\n\t\n\tpublic MethodDeclaration createEquals(EclipseNode type, Collection<Included<EclipseNode, EqualsAndHashCode.Include>> members, boolean callSuper, ASTNode source, FieldAccess fieldAccess, boolean needsCanEqual, List<Annotation> onParam) {\n\t\tint pS = source.sourceStart; int pE = source.sourceEnd;\n\t\tlong p = (long) pS << 32 | pE;\n\t\t\n\t\tList<NullAnnotationLibrary> applied = new ArrayList<NullAnnotationLibrary>();\n\t\t\n\t\tAnnotation[] onParamNullable = null;\n\t\tString nearest = scanForNearestAnnotation(type, \"javax.annotation.ParametersAreNullableByDefault\", \"javax.annotation.ParametersAreNonnullByDefault\");\n\t\tif (\"javax.annotation.ParametersAreNonnullByDefault\".equals(nearest)) {\n\t\t\tonParamNullable = new Annotation[] { new MarkerAnnotation(generateQualifiedTypeRef(source, JAVAX_ANNOTATION_NULLABLE), 0) };\n\t\t\tapplied.add(NullAnnotationLibrary.JAVAX);\n\t\t}\n\t\t\n\t\tAnnotation[] onParamTypeNullable = null;\n\t\tnearest = scanForNearestAnnotation(type, \"org.eclipse.jdt.annotation.NonNullByDefault\");\n\t\tif (nearest != null) {\n\t\t\tonParamTypeNullable = new Annotation[] { new MarkerAnnotation(generateQualifiedTypeRef(source, ORG_ECLIPSE_JDT_ANNOTATION_NULLABLE), 0) };\n\t\t\tapplied.add(NullAnnotationLibrary.ECLIPSE);\n\t\t}\n\t\t\n\t\tMethodDeclaration method = new MethodDeclaration(((CompilationUnitDeclaration) type.top().get()).compilationResult);\n\t\tsetGeneratedBy(method, source);\n\t\tmethod.modifiers = toEclipseModifier(AccessLevel.PUBLIC);\n\t\tmethod.returnType = TypeReference.baseTypeReference(TypeIds.T_boolean, 0);\n\t\tmethod.returnType.sourceStart = pS; method.returnType.sourceEnd = pE;\n\t\tsetGeneratedBy(method.returnType, source);\n\t\tAnnotation overrideAnnotation = makeMarkerAnnotation(TypeConstants.JAVA_LANG_OVERRIDE, source);\n\t\tif (getCheckerFrameworkVersion(type).generateSideEffectFree()) {\n\t\t\tmethod.annotations = new Annotation[] { overrideAnnotation, generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE) };\n\t\t} else {\n\t\t\tmethod.annotations = new Annotation[] { overrideAnnotation };\n\t\t}\n\t\tmethod.selector = \"equals\".toCharArray();\n\t\tmethod.thrownExceptions = null;\n\t\tmethod.typeParameters = null;\n\t\tmethod.bits |= Eclipse.ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tmethod.bodyStart = method.declarationSourceStart = method.sourceStart = source.sourceStart;\n\t\tmethod.bodyEnd = method.declarationSourceEnd = method.sourceEnd = source.sourceEnd;\n\t\tQualifiedTypeReference objectRef = new QualifiedTypeReference(TypeConstants.JAVA_LANG_OBJECT, new long[] { p, p, p });\n\t\tif (onParamTypeNullable != null) {\n\t\t\tobjectRef.annotations = new Annotation[][] {null, null, onParamTypeNullable};\n\t\t\tobjectRef.bits |= Eclipse.HasTypeAnnotations;\n\t\t\tmethod.bits |= Eclipse.HasTypeAnnotations;\n\t\t}\n\t\tsetGeneratedBy(objectRef, source);\n\t\tmethod.arguments = new Argument[] {new Argument(new char[] { 'o' }, 0, objectRef, Modifier.FINAL)};\n\t\tmethod.arguments[0].sourceStart = pS; method.arguments[0].sourceEnd = pE;\n\t\tif (!onParam.isEmpty() || onParamNullable != null)\n\t\t\tmethod.arguments[0].annotations = copyAnnotations(source, onParam.toArray(new Annotation[0]), onParamNullable);\n\t\tEclipseHandlerUtil.createRelevantNullableAnnotation(type, method.arguments[0], method, applied);\n\t\tsetGeneratedBy(method.arguments[0], source);\n\t\t\n\t\tList<Statement> statements = new ArrayList<Statement>();\n\t\t\n\t\t/* if (o == this) return true; */ {\n\t\t\tSingleNameReference oRef = new SingleNameReference(new char[] { 'o' }, p);\n\t\t\tsetGeneratedBy(oRef, source);\n\t\t\tThisReference thisRef = new ThisReference(pS, pE);\n\t\t\tsetGeneratedBy(thisRef, source);\n\t\t\tEqualExpression otherEqualsThis = new EqualExpression(oRef, thisRef, OperatorIds.EQUAL_EQUAL);\n\t\t\tsetGeneratedBy(otherEqualsThis, source);\n\t\t\t\n\t\t\tTrueLiteral trueLiteral = new TrueLiteral(pS, pE);\n\t\t\tsetGeneratedBy(trueLiteral, source);\n\t\t\tReturnStatement returnTrue = new ReturnStatement(trueLiteral, pS, pE);\n\t\t\tsetGeneratedBy(returnTrue, source);\n\t\t\tIfStatement ifOtherEqualsThis = new IfStatement(otherEqualsThis, returnTrue, pS, pE);\n\t\t\tsetGeneratedBy(ifOtherEqualsThis, source);\n\t\t\tstatements.add(ifOtherEqualsThis);\n\t\t}\n\t\t\n\t\t/* if (!(o instanceof Outer.Inner.MyType) return false; */ {\n\t\t\tSingleNameReference oRef = new SingleNameReference(new char[] { 'o' }, p);\n\t\t\tsetGeneratedBy(oRef, source);\n\t\t\t\n\t\t\tTypeReference typeReference = createTypeReference(type, p, source, false);\n\t\t\tsetGeneratedBy(typeReference, source);\n\n\t\t\tInstanceOfExpression instanceOf = new InstanceOfExpression(oRef, typeReference);\n\t\t\tinstanceOf.sourceStart = pS; instanceOf.sourceEnd = pE;\n\t\t\tsetGeneratedBy(instanceOf, source);\n\t\t\t\n\t\t\tExpression notInstanceOf = new UnaryExpression(instanceOf, OperatorIds.NOT);\n\t\t\tsetGeneratedBy(notInstanceOf, source);\n\t\t\t\n\t\t\tFalseLiteral falseLiteral = new FalseLiteral(pS, pE);\n\t\t\tsetGeneratedBy(falseLiteral, source);\n\t\t\t\n\t\t\tReturnStatement returnFalse = new ReturnStatement(falseLiteral, pS, pE);\n\t\t\tsetGeneratedBy(returnFalse, source);\n\t\t\t\n\t\t\tIfStatement ifNotInstanceOf = new IfStatement(notInstanceOf, returnFalse, pS, pE);\n\t\t\tsetGeneratedBy(ifNotInstanceOf, source);\n\t\t\tstatements.add(ifNotInstanceOf);\n\t\t}\n\t\t\n\t\tchar[] otherName = \"other\".toCharArray();\n\t\t\n\t\t/* Outer.Inner.MyType<?> other = (Outer.Inner.MyType<?>) o; */ {\n\t\t\tif (!members.isEmpty() || needsCanEqual) {\n\t\t\t\tLocalDeclaration other = new LocalDeclaration(otherName, pS, pE);\n\t\t\t\tother.modifiers |= ClassFileConstants.AccFinal;\n\t\t\t\tsetGeneratedBy(other, source);\n\t\t\t\tTypeReference targetType = createTypeReference(type, p, source, true);\n\t\t\t\tsetGeneratedBy(targetType, source);\n\t\t\t\tother.type = createTypeReference(type, p, source, true);\n\t\t\t\tsetGeneratedBy(other.type, source);\n\t\t\t\tNameReference oRef = new SingleNameReference(new char[] { 'o' }, p);\n\t\t\t\tsetGeneratedBy(oRef, source);\n\t\t\t\tother.initialization = makeCastExpression(oRef, targetType, source);\n\t\t\t\tstatements.add(other);\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* if (!other.canEqual((java.lang.Object) this)) return false; */ {\n\t\t\tif (needsCanEqual) {\n\t\t\t\tMessageSend otherCanEqual = new MessageSend();\n\t\t\t\totherCanEqual.sourceStart = pS; otherCanEqual.sourceEnd = pE;\n\t\t\t\tsetGeneratedBy(otherCanEqual, source);\n\t\t\t\totherCanEqual.receiver = new SingleNameReference(otherName, p);\n\t\t\t\tsetGeneratedBy(otherCanEqual.receiver, source);\n\t\t\t\totherCanEqual.selector = \"canEqual\".toCharArray();\n\t\t\t\t\n\t\t\t\tThisReference thisReference = new ThisReference(pS, pE);\n\t\t\t\tsetGeneratedBy(thisReference, source);\n\t\t\t\tCastExpression castThisRef = makeCastExpression(thisReference, generateQualifiedTypeRef(source, TypeConstants.JAVA_LANG_OBJECT), source);\n\t\t\t\tcastThisRef.sourceStart = pS; castThisRef.sourceEnd = pE;\n\t\t\t\t\n\t\t\t\totherCanEqual.arguments = new Expression[] {castThisRef};\n\t\t\t\t\n\t\t\t\tExpression notOtherCanEqual = new UnaryExpression(otherCanEqual, OperatorIds.NOT);\n\t\t\t\tsetGeneratedBy(notOtherCanEqual, source);\n\t\t\t\t\n\t\t\t\tFalseLiteral falseLiteral = new FalseLiteral(pS, pE);\n\t\t\t\tsetGeneratedBy(falseLiteral, source);\n\t\t\t\t\n\t\t\t\tReturnStatement returnFalse = new ReturnStatement(falseLiteral, pS, pE);\n\t\t\t\tsetGeneratedBy(returnFalse, source);\n\t\t\t\t\n\t\t\t\tIfStatement ifNotCanEqual = new IfStatement(notOtherCanEqual, returnFalse, pS, pE);\n\t\t\t\tsetGeneratedBy(ifNotCanEqual, source);\n\t\t\t\t\n\t\t\t\tstatements.add(ifNotCanEqual);\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* if (!super.equals(o)) return false; */\n\t\tif (callSuper) {\n\t\t\tMessageSend callToSuper = new MessageSend();\n\t\t\tcallToSuper.sourceStart = pS; callToSuper.sourceEnd = pE;\n\t\t\tsetGeneratedBy(callToSuper, source);\n\t\t\tcallToSuper.receiver = new SuperReference(pS, pE);\n\t\t\tsetGeneratedBy(callToSuper.receiver, source);\n\t\t\tcallToSuper.selector = \"equals\".toCharArray();\n\t\t\tSingleNameReference oRef = new SingleNameReference(new char[] { 'o' }, p);\n\t\t\tsetGeneratedBy(oRef, source);\n\t\t\tcallToSuper.arguments = new Expression[] {oRef};\n\t\t\tExpression superNotEqual = new UnaryExpression(callToSuper, OperatorIds.NOT);\n\t\t\tsetGeneratedBy(superNotEqual, source);\n\t\t\tFalseLiteral falseLiteral = new FalseLiteral(pS, pE);\n\t\t\tsetGeneratedBy(falseLiteral, source);\n\t\t\tReturnStatement returnFalse = new ReturnStatement(falseLiteral, pS, pE);\n\t\t\tsetGeneratedBy(returnFalse, source);\n\t\t\tIfStatement ifSuperEquals = new IfStatement(superNotEqual, returnFalse, pS, pE);\n\t\t\tsetGeneratedBy(ifSuperEquals, source);\n\t\t\tstatements.add(ifSuperEquals);\n\t\t}\n\t\t\n\t\tfor (Included<EclipseNode, EqualsAndHashCode.Include> member : members) {\n\t\t\tEclipseNode memberNode = member.getNode();\n\t\t\tboolean isMethod = memberNode.getKind() == Kind.METHOD;\n\t\t\t\n\t\t\tTypeReference fType = getFieldType(memberNode, fieldAccess);\n\t\t\tchar[] token = fType.getLastToken();\n\t\t\tExpression thisFieldAccessor = isMethod ? createMethodAccessor(memberNode, source) : createFieldAccessor(memberNode, fieldAccess, source);\n\t\t\tExpression otherFieldAccessor = isMethod ? createMethodAccessor(memberNode, source, otherName) : createFieldAccessor(memberNode, fieldAccess, source, otherName);\n\t\t\t\n\t\t\tif (fType.dimensions() == 0 && token != null) {\n\t\t\t\tif (Arrays.equals(TypeConstants.FLOAT, token)) {\n\t\t\t\t\tstatements.add(generateCompareFloatOrDouble(thisFieldAccessor, otherFieldAccessor, \"Float\".toCharArray(), source));\n\t\t\t\t} else if (Arrays.equals(TypeConstants.DOUBLE, token)) {\n\t\t\t\t\tstatements.add(generateCompareFloatOrDouble(thisFieldAccessor, otherFieldAccessor, \"Double\".toCharArray(), source));\n\t\t\t\t} else if (BUILT_IN_TYPES.contains(new String(token))) {\n\t\t\t\t\tEqualExpression fieldsNotEqual = new EqualExpression(thisFieldAccessor, otherFieldAccessor, OperatorIds.NOT_EQUAL);\n\t\t\t\t\tsetGeneratedBy(fieldsNotEqual, source);\n\t\t\t\t\tFalseLiteral falseLiteral = new FalseLiteral(pS, pE);\n\t\t\t\t\tsetGeneratedBy(falseLiteral, source);\n\t\t\t\t\tReturnStatement returnStatement = new ReturnStatement(falseLiteral, pS, pE);\n\t\t\t\t\tsetGeneratedBy(returnStatement, source);\n\t\t\t\t\tIfStatement ifStatement = new IfStatement(fieldsNotEqual, returnStatement, pS, pE);\n\t\t\t\t\tsetGeneratedBy(ifStatement, source);\n\t\t\t\t\tstatements.add(ifStatement);\n\t\t\t\t} else /* objects */ {\n\t\t\t\t\t/* final java.lang.Object this$fieldName = this.fieldName; */\n\t\t\t\t\t/* final java.lang.Object other$fieldName = other.fieldName; */\n\t\t\t\t\t/* if (this$fieldName == null ? other$fieldName != null : !this$fieldName.equals(other$fieldName)) return false; */\n\t\t\t\t\tchar[] thisDollarFieldName = (\"this\" + (isMethod ? \"$$\" : \"$\") + memberNode.getName()).toCharArray();\n\t\t\t\t\tchar[] otherDollarFieldName = (\"other\" + (isMethod ? \"$$\" : \"$\") + memberNode.getName()).toCharArray();\n\t\t\t\t\t\n\t\t\t\t\tstatements.add(createLocalDeclaration(source, thisDollarFieldName, generateQualifiedTypeRef(source, TypeConstants.JAVA_LANG_OBJECT), thisFieldAccessor));\n\t\t\t\t\tstatements.add(createLocalDeclaration(source, otherDollarFieldName, generateQualifiedTypeRef(source, TypeConstants.JAVA_LANG_OBJECT), otherFieldAccessor));\n\t\t\t\t\t\n\t\t\t\t\tSingleNameReference this1 = new SingleNameReference(thisDollarFieldName, p);\n\t\t\t\t\tsetGeneratedBy(this1, source);\n\t\t\t\t\tSingleNameReference this2 = new SingleNameReference(thisDollarFieldName, p);\n\t\t\t\t\tsetGeneratedBy(this2, source);\n\t\t\t\t\tSingleNameReference other1 = new SingleNameReference(otherDollarFieldName, p);\n\t\t\t\t\tsetGeneratedBy(other1, source);\n\t\t\t\t\tSingleNameReference other2 = new SingleNameReference(otherDollarFieldName, p);\n\t\t\t\t\tsetGeneratedBy(other2, source);\n\t\t\t\t\t\n\t\t\t\t\tNullLiteral nullLiteral = new NullLiteral(pS, pE);\n\t\t\t\t\tsetGeneratedBy(nullLiteral, source);\n\t\t\t\t\tEqualExpression fieldIsNull = new EqualExpression(this1, nullLiteral, OperatorIds.EQUAL_EQUAL);\n\t\t\t\t\tnullLiteral = new NullLiteral(pS, pE);\n\t\t\t\t\tsetGeneratedBy(nullLiteral, source);\n\t\t\t\t\tEqualExpression otherFieldIsntNull = new EqualExpression(other1, nullLiteral, OperatorIds.NOT_EQUAL);\n\t\t\t\t\tMessageSend equalsCall = new MessageSend();\n\t\t\t\t\tequalsCall.sourceStart = pS; equalsCall.sourceEnd = pE;\n\t\t\t\t\tsetGeneratedBy(equalsCall, source);\n\t\t\t\t\tequalsCall.receiver = this2;\n\t\t\t\t\tequalsCall.selector = \"equals\".toCharArray();\n\t\t\t\t\tequalsCall.arguments = new Expression[] { other2 };\n\t\t\t\t\tUnaryExpression fieldsNotEqual = new UnaryExpression(equalsCall, OperatorIds.NOT);\n\t\t\t\t\tfieldsNotEqual.sourceStart = pS; fieldsNotEqual.sourceEnd = pE;\n\t\t\t\t\tsetGeneratedBy(fieldsNotEqual, source);\n\t\t\t\t\tConditionalExpression fullEquals = new ConditionalExpression(fieldIsNull, otherFieldIsntNull, fieldsNotEqual);\n\t\t\t\t\tfullEquals.sourceStart = pS; fullEquals.sourceEnd = pE;\n\t\t\t\t\tsetGeneratedBy(fullEquals, source);\n\t\t\t\t\tFalseLiteral falseLiteral = new FalseLiteral(pS, pE);\n\t\t\t\t\tsetGeneratedBy(falseLiteral, source);\n\t\t\t\t\tReturnStatement returnStatement = new ReturnStatement(falseLiteral, pS, pE);\n\t\t\t\t\tsetGeneratedBy(returnStatement, source);\n\t\t\t\t\tIfStatement ifStatement = new IfStatement(fullEquals, returnStatement, pS, pE);\n\t\t\t\t\tsetGeneratedBy(ifStatement, source);\n\t\t\t\t\tstatements.add(ifStatement);\n\t\t\t\t}\n\t\t\t} else if (fType.dimensions() > 0 && token != null) {\n\t\t\t\tMessageSend arraysEqualCall = new MessageSend();\n\t\t\t\tarraysEqualCall.sourceStart = pS; arraysEqualCall.sourceEnd = pE;\n\t\t\t\tsetGeneratedBy(arraysEqualCall, source);\n\t\t\t\tarraysEqualCall.receiver = generateQualifiedNameRef(source, TypeConstants.JAVA, TypeConstants.UTIL, \"Arrays\".toCharArray());\n\t\t\t\tif (fType.dimensions() > 1 || !BUILT_IN_TYPES.contains(new String(token))) {\n\t\t\t\t\tarraysEqualCall.selector = \"deepEquals\".toCharArray();\n\t\t\t\t} else {\n\t\t\t\t\tarraysEqualCall.selector = \"equals\".toCharArray();\n\t\t\t\t}\n\t\t\t\tarraysEqualCall.arguments = new Expression[] { thisFieldAccessor, otherFieldAccessor };\n\t\t\t\tUnaryExpression arraysNotEqual = new UnaryExpression(arraysEqualCall, OperatorIds.NOT);\n\t\t\t\tarraysNotEqual.sourceStart = pS; arraysNotEqual.sourceEnd = pE;\n\t\t\t\tsetGeneratedBy(arraysNotEqual, source);\n\t\t\t\tFalseLiteral falseLiteral = new FalseLiteral(pS, pE);\n\t\t\t\tsetGeneratedBy(falseLiteral, source);\n\t\t\t\tReturnStatement returnStatement = new ReturnStatement(falseLiteral, pS, pE);\n\t\t\t\tsetGeneratedBy(returnStatement, source);\n\t\t\t\tIfStatement ifStatement = new IfStatement(arraysNotEqual, returnStatement, pS, pE);\n\t\t\t\tsetGeneratedBy(ifStatement, source);\n\t\t\t\tstatements.add(ifStatement);\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* return true; */ {\n\t\t\tTrueLiteral trueLiteral = new TrueLiteral(pS, pE);\n\t\t\tsetGeneratedBy(trueLiteral, source);\n\t\t\tReturnStatement returnStatement = new ReturnStatement(trueLiteral, pS, pE);\n\t\t\tsetGeneratedBy(returnStatement, source);\n\t\t\tstatements.add(returnStatement);\n\t\t}\n\t\tmethod.statements = statements.toArray(new Statement[0]);\n\t\treturn method;\n\t}\n\t\n\tpublic MethodDeclaration createCanEqual(EclipseNode type, ASTNode source, List<Annotation> onParam) {\n\t\t/* protected boolean canEqual(final java.lang.Object other) {\n\t\t *     return other instanceof Outer.Inner.MyType;\n\t\t * }\n\t\t */\n\t\tint pS = source.sourceStart; int pE = source.sourceEnd;\n\t\tlong p = (long)pS << 32 | pE;\n\t\t\n\t\tchar[] otherName = \"other\".toCharArray();\n\t\t\n\t\tMethodDeclaration method = new MethodDeclaration(((CompilationUnitDeclaration) type.top().get()).compilationResult);\n\t\tsetGeneratedBy(method, source);\n\t\tmethod.modifiers = toEclipseModifier(AccessLevel.PROTECTED);\n\t\tmethod.returnType = TypeReference.baseTypeReference(TypeIds.T_boolean, 0);\n\t\tmethod.returnType.sourceStart = pS; method.returnType.sourceEnd = pE;\n\t\tsetGeneratedBy(method.returnType, source);\n\t\tmethod.selector = \"canEqual\".toCharArray();\n\t\tmethod.thrownExceptions = null;\n\t\tmethod.typeParameters = null;\n\t\tmethod.bits |= Eclipse.ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tmethod.bodyStart = method.declarationSourceStart = method.sourceStart = source.sourceStart;\n\t\tmethod.bodyEnd = method.declarationSourceEnd = method.sourceEnd = source.sourceEnd;\n\t\tTypeReference objectRef = new QualifiedTypeReference(TypeConstants.JAVA_LANG_OBJECT, new long[] { p, p, p });\n\t\tsetGeneratedBy(objectRef, source);\n\t\tmethod.arguments = new Argument[] {new Argument(otherName, 0, objectRef, Modifier.FINAL)};\n\t\tmethod.arguments[0].sourceStart = pS; method.arguments[0].sourceEnd = pE;\n\t\tif (!onParam.isEmpty()) method.arguments[0].annotations = onParam.toArray(new Annotation[0]);\n\t\tEclipseHandlerUtil.createRelevantNullableAnnotation(type, method.arguments[0], method);\n\t\tsetGeneratedBy(method.arguments[0], source);\n\t\t\n\t\tSingleNameReference otherRef = new SingleNameReference(otherName, p);\n\t\tsetGeneratedBy(otherRef, source);\n\t\t\n\t\tTypeReference typeReference = createTypeReference(type, p, source, false);\n\t\tsetGeneratedBy(typeReference, source);\n\t\t\n\t\tInstanceOfExpression instanceOf = new InstanceOfExpression(otherRef, typeReference);\n\t\tinstanceOf.sourceStart = pS; instanceOf.sourceEnd = pE;\n\t\tsetGeneratedBy(instanceOf, source);\n\t\t\n\t\tReturnStatement returnStatement = new ReturnStatement(instanceOf, pS, pE);\n\t\tsetGeneratedBy(returnStatement, source);\n\t\t\n\t\tmethod.statements = new Statement[] {returnStatement};\n\t\tif (getCheckerFrameworkVersion(type).generatePure()) method.annotations = new Annotation[] { generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__PURE) };\n\t\treturn method;\n\t}\n\n\t\n\tpublic IfStatement generateCompareFloatOrDouble(Expression thisRef, Expression otherRef, char[] floatOrDouble, ASTNode source) {\n\t\tint pS = source.sourceStart, pE = source.sourceEnd;\n\t\t/* if (Float.compare(fieldName, other.fieldName) != 0) return false */\n\t\tMessageSend floatCompare = new MessageSend();\n\t\tfloatCompare.sourceStart = pS; floatCompare.sourceEnd = pE;\n\t\tsetGeneratedBy(floatCompare, source);\n\t\tfloatCompare.receiver = generateQualifiedNameRef(source, TypeConstants.JAVA, TypeConstants.LANG, floatOrDouble);\n\t\tfloatCompare.selector = \"compare\".toCharArray();\n\t\tfloatCompare.arguments = new Expression[] {thisRef, otherRef};\n\t\tIntLiteral int0 = makeIntLiteral(\"0\".toCharArray(), source);\n\t\tEqualExpression ifFloatCompareIsNot0 = new EqualExpression(floatCompare, int0, OperatorIds.NOT_EQUAL);\n\t\tifFloatCompareIsNot0.sourceStart = pS; ifFloatCompareIsNot0.sourceEnd = pE;\n\t\tsetGeneratedBy(ifFloatCompareIsNot0, source);\n\t\tFalseLiteral falseLiteral = new FalseLiteral(pS, pE);\n\t\tsetGeneratedBy(falseLiteral, source);\n\t\tReturnStatement returnFalse = new ReturnStatement(falseLiteral, pS, pE);\n\t\tsetGeneratedBy(returnFalse, source);\n\t\tIfStatement ifStatement = new IfStatement(ifFloatCompareIsNot0, returnFalse, pS, pE);\n\t\tsetGeneratedBy(ifStatement, source);\n\t\treturn ifStatement;\n\t}\n\t\n\t/** Give 2 clones! */\n\tpublic Expression longToIntForHashCode(Expression ref1, Expression ref2, ASTNode source) {\n\t\tint pS = source.sourceStart, pE = source.sourceEnd;\n\t\t/* (int)(ref >>> 32 ^ ref) */\n\t\tIntLiteral int32 = makeIntLiteral(\"32\".toCharArray(), source);\n\t\tBinaryExpression higherBits = new BinaryExpression(ref1, int32, OperatorIds.UNSIGNED_RIGHT_SHIFT);\n\t\tsetGeneratedBy(higherBits, source);\n\t\tBinaryExpression xorParts = new BinaryExpression(ref2, higherBits, OperatorIds.XOR);\n\t\tsetGeneratedBy(xorParts, source);\n\t\tTypeReference intRef = TypeReference.baseTypeReference(TypeIds.T_int, 0);\n\t\tintRef.sourceStart = pS; intRef.sourceEnd = pE;\n\t\tsetGeneratedBy(intRef, source);\n\t\tCastExpression expr = makeCastExpression(xorParts, intRef, source);\n\t\texpr.sourceStart = pS; expr.sourceEnd = pE;\n\t\treturn expr;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleExtensionMethod.java",
    "content": "/*\n * Copyright (C) 2012-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\n\nimport java.util.List;\n\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;\n\nimport lombok.ConfigurationKeys;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.experimental.ExtensionMethod;\nimport lombok.spi.Provides;\n\n// This handler just does some additional error checking; the real work is done in the agent.\n@Provides\n@HandlerPriority(66560) // 2^16 + 2^10; we must run AFTER HandleVal which is at 2^16\npublic class HandleExtensionMethod extends EclipseAnnotationHandler<ExtensionMethod> {\n\t@Override public void handle(AnnotationValues<ExtensionMethod> annotation, Annotation ast, EclipseNode annotationNode) {\n\t\thandleExperimentalFlagUsage(annotationNode, ConfigurationKeys.EXTENSION_METHOD_FLAG_USAGE, \"@ExtensionMethod\");\n\t\t\n\t\tTypeDeclaration typeDecl = null;\n\t\tEclipseNode owner = annotationNode.up();\n\t\tif (owner.get() instanceof TypeDeclaration) typeDecl = (TypeDeclaration) owner.get();\n\t\tint modifiers = typeDecl == null ? 0 : typeDecl.modifiers;\n\t\t\n\t\tboolean notAClass = (modifiers &\n\t\t\t\t(ClassFileConstants.AccAnnotation)) != 0;\n\t\t\n\t\tif (typeDecl == null || notAClass) {\n\t\t\tannotationNode.addError(\"@ExtensionMethod is legal only on classes and enums and interfaces.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tList<Object> listenerInterfaces = annotation.getActualExpressions(\"value\");\n\t\tif (listenerInterfaces.isEmpty()) {\n\t\t\tannotationNode.addWarning(String.format(\"@ExtensionMethod has no effect since no extension types were specified.\"));\n\t\t\treturn;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleFieldDefaults.java",
    "content": "/*\n * Copyright (C) 2012-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport java.util.Arrays;\n\nimport lombok.AccessLevel;\nimport lombok.ConfigurationKeys;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.eclipse.Eclipse;\nimport lombok.eclipse.EclipseASTAdapter;\nimport lombok.eclipse.EclipseASTVisitor;\nimport lombok.eclipse.EclipseNode;\nimport lombok.experimental.FieldDefaults;\nimport lombok.experimental.NonFinal;\nimport lombok.experimental.PackagePrivate;\nimport lombok.spi.Provides;\n\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.SingleTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\nimport org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;\n\n/**\n * Handles the {@code lombok.FieldDefaults} annotation for eclipse.\n */\n@Provides(EclipseASTVisitor.class)\n@HandlerPriority(-2048) //-2^11; to ensure @Value picks up on messing with the fields' 'final' state, run earlier.\npublic class HandleFieldDefaults extends EclipseASTAdapter {\n\tpublic boolean generateFieldDefaultsForType(EclipseNode typeNode, EclipseNode pos, AccessLevel level, boolean makeFinal, boolean checkForTypeLevelFieldDefaults) {\n\t\tif (checkForTypeLevelFieldDefaults) {\n\t\t\tif (hasAnnotation(FieldDefaults.class, typeNode)) {\n\t\t\t\t//The annotation will make it happen, so we can skip it.\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (!isClassOrEnum(typeNode)) {\n\t\t\tpos.addError(\"@FieldDefaults is only supported on a class or an enum.\");\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tfor (EclipseNode field : typeNode.down()) {\n\t\t\tif (field.getKind() != Kind.FIELD) continue;\n\t\t\tFieldDeclaration fieldDecl = (FieldDeclaration) field.get();\n\t\t\tif (!filterField(fieldDecl, false)) continue;\n\t\t\t\n\t\t\tClass<?> t = field.get().getClass();\n\t\t\tif (t == FieldDeclaration.class) {\n\t\t\t\t// There are various other things that extend FieldDeclaration that really\n\t\t\t\t// aren't field declarations. Typing 'ma' in an otherwise blank class is a\n\t\t\t\t// CompletionOnFieldType object (extends FieldDeclaration). If we mess with the\n\t\t\t\t// modifiers of such a thing, you take away template suggestions such as\n\t\t\t\t// 'main method'. See issue 411.\n\t\t\t\tsetFieldDefaultsForField(field, pos.get(), level, makeFinal);\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\t\n\tpublic void setFieldDefaultsForField(EclipseNode fieldNode, ASTNode pos, AccessLevel level, boolean makeFinal) {\n\t\tFieldDeclaration field = (FieldDeclaration) fieldNode.get();\n\t\tif (level != null && level != AccessLevel.NONE) {\n\t\t\tif ((field.modifiers & (ClassFileConstants.AccPublic | ClassFileConstants.AccPrivate | ClassFileConstants.AccProtected)) == 0) {\n\t\t\t\tif (!hasAnnotation(PackagePrivate.class, fieldNode)) {\n\t\t\t\t\tif ((field.modifiers & ClassFileConstants.AccStatic) == 0) {\n\t\t\t\t\t\tfield.modifiers |= EclipseHandlerUtil.toEclipseModifier(level);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (makeFinal && (field.modifiers & ClassFileConstants.AccFinal) == 0) {\n\t\t\tif (!hasAnnotation(NonFinal.class, fieldNode)) {\n\t\t\t\tif ((field.modifiers & ClassFileConstants.AccStatic) == 0) {\n\t\t\t\t\tfield.modifiers |= ClassFileConstants.AccFinal;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tfieldNode.rebuild();\n\t}\n\t\n\tprivate static final char[] FIELD_DEFAULTS = \"FieldDefaults\".toCharArray();\n\t\n\t@Override public void visitType(EclipseNode typeNode, TypeDeclaration type) {\n\t\tAnnotationValues<FieldDefaults> fieldDefaults = null;\n\t\tEclipseNode source = typeNode;\n\t\t\n\t\tboolean levelIsExplicit = false;\n\t\tboolean makeFinalIsExplicit = false;\n\t\tFieldDefaults fd = null;\n\t\tfor (EclipseNode jn : typeNode.down()) {\n\t\t\tif (jn.getKind() != Kind.ANNOTATION) continue;\n\t\t\tAnnotation ann = (Annotation) jn.get();\n\t\t\tTypeReference typeTree = ann.type;\n\t\t\tif (typeTree == null) continue;\n\t\t\tif (typeTree instanceof SingleTypeReference) {\n\t\t\t\tchar[] t = ((SingleTypeReference) typeTree).token;\n\t\t\t\tif (!Arrays.equals(t, FIELD_DEFAULTS)) continue;\n\t\t\t} else if (typeTree instanceof QualifiedTypeReference) {\n\t\t\t\tchar[][] t = ((QualifiedTypeReference) typeTree).tokens;\n\t\t\t\tif (!Eclipse.nameEquals(t, \"lombok.experimental.FieldDefaults\")) continue;\n\t\t\t} else {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tif (!typeMatches(FieldDefaults.class, jn, typeTree)) continue;\n\t\t\t\n\t\t\tsource = jn;\n\t\t\tfieldDefaults = createAnnotation(FieldDefaults.class, jn);\n\t\t\tlevelIsExplicit = fieldDefaults.isExplicit(\"level\");\n\t\t\tmakeFinalIsExplicit = fieldDefaults.isExplicit(\"makeFinal\");\n\t\t\t\n\t\t\thandleExperimentalFlagUsage(jn, ConfigurationKeys.FIELD_DEFAULTS_FLAG_USAGE, \"@FieldDefaults\");\n\t\t\t\n\t\t\tfd = fieldDefaults.getInstance();\n\t\t\tif (!levelIsExplicit && !makeFinalIsExplicit) {\n\t\t\t\tjn.addError(\"This does nothing; provide either level or makeFinal or both.\");\n\t\t\t}\n\t\t\t\n\t\t\tif (levelIsExplicit && fd.level() == AccessLevel.NONE) {\n\t\t\t\tjn.addError(\"AccessLevel.NONE doesn't mean anything here. Pick another value.\");\n\t\t\t\tlevelIsExplicit = false;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\t\n\t\tif (fd == null && (type.modifiers & (ClassFileConstants.AccInterface | ClassFileConstants.AccAnnotation)) != 0) return;\n\t\t\n\t\tboolean defaultToPrivate = levelIsExplicit ? false : Boolean.TRUE.equals(typeNode.getAst().readConfiguration(ConfigurationKeys.FIELD_DEFAULTS_PRIVATE_EVERYWHERE));\n\t\tboolean defaultToFinal = makeFinalIsExplicit ? false : Boolean.TRUE.equals(typeNode.getAst().readConfiguration(ConfigurationKeys.FIELD_DEFAULTS_FINAL_EVERYWHERE));\n\t\t\n\t\tif (!defaultToPrivate && !defaultToFinal && fieldDefaults == null) return;\n\t\t// Do not apply field defaults to records if set using the config system\n\t\tif (fieldDefaults == null && !isClassOrEnum(typeNode)) return;\n\t\tAccessLevel fdAccessLevel = (fieldDefaults != null && levelIsExplicit) ? fd.level() : defaultToPrivate ? AccessLevel.PRIVATE : null;\n\t\tboolean fdToFinal = (fieldDefaults != null && makeFinalIsExplicit) ? fd.makeFinal() : defaultToFinal;\n\t\t\n\t\tgenerateFieldDefaultsForType(typeNode, source, fdAccessLevel, fdToFinal, false);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleFieldNameConstants.java",
    "content": "/*\n * Copyright (C) 2014-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.handleExperimentalFlagUsage;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport org.eclipse.jdt.internal.compiler.ASTVisitor;\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.AllocationExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.Clinit;\nimport org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.ExplicitConstructorCall;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.StringLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeConstants;\n\nimport lombok.AccessLevel;\nimport lombok.ConfigurationKeys;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.core.configuration.IdentifierName;\nimport lombok.core.handlers.HandlerUtil;\nimport lombok.eclipse.Eclipse;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.eclipse.handlers.EclipseHandlerUtil.MemberExistsResult;\nimport lombok.experimental.FieldNameConstants;\nimport lombok.spi.Provides;\n\n@Provides\npublic class HandleFieldNameConstants extends EclipseAnnotationHandler<FieldNameConstants> {\n\tprivate static final IdentifierName FIELDS = IdentifierName.valueOf(\"Fields\");\n\n\tpublic void generateFieldNameConstantsForType(EclipseNode typeNode, EclipseNode errorNode, AccessLevel level, boolean asEnum, IdentifierName innerTypeName, boolean onlyExplicit, boolean uppercase) {\n\t\tif (!isClassEnumOrRecord(typeNode)) {\n\t\t\terrorNode.addError(\"@FieldNameConstants is only supported on a class, an enum or a record.\");\n\t\t\treturn;\n\t\t}\n\t\tif (!isStaticAllowed(typeNode)) {\n\t\t\terrorNode.addError(\"@FieldNameConstants is not supported on non-static nested classes.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tList<EclipseNode> qualified = new ArrayList<EclipseNode>();\n\t\t\n\t\tfor (EclipseNode field : typeNode.down()) {\n\t\t\tif (fieldQualifiesForFieldNameConstantsGeneration(field, onlyExplicit)) qualified.add(field);\n\t\t}\n\t\t\n\t\tif (qualified.isEmpty()) {\n\t\t\terrorNode.addWarning(\"No fields qualify for @FieldNameConstants, therefore this annotation does nothing\");\n\t\t} else {\n\t\t\tcreateInnerTypeFieldNameConstants(typeNode, errorNode, errorNode.get(), level, qualified, asEnum, innerTypeName, uppercase);\n\t\t}\n\t}\n\t\n\tprivate boolean fieldQualifiesForFieldNameConstantsGeneration(EclipseNode field, boolean onlyExplicit) {\n\t\tif (field.getKind() != Kind.FIELD) return false;\n\t\tif (hasAnnotation(FieldNameConstants.Exclude.class, field)) return false;\n\t\tif (hasAnnotation(FieldNameConstants.Include.class, field)) return true;\n\t\tif (onlyExplicit) return false;\n\t\t\n\t\tFieldDeclaration fieldDecl = (FieldDeclaration) field.get();\n\t\treturn filterField(fieldDecl);\n\t}\n\t\n\t@Override public void handle(AnnotationValues<FieldNameConstants> annotation, Annotation ast, EclipseNode annotationNode) {\n\t\thandleExperimentalFlagUsage(annotationNode, ConfigurationKeys.FIELD_NAME_CONSTANTS_FLAG_USAGE, \"@FieldNameConstants\");\n\t\t\n\t\tEclipseNode node = annotationNode.up();\n\t\tFieldNameConstants annotationInstance = annotation.getInstance();\n\t\tAccessLevel level = annotationInstance.level();\n\t\tboolean asEnum = annotationInstance.asEnum();\n\t\tboolean usingLombokv1_18_2 = annotation.isExplicit(\"prefix\") || annotation.isExplicit(\"suffix\") || node.getKind() == Kind.FIELD;\n\t\t\n\t\tif (usingLombokv1_18_2) {\n\t\t\tannotationNode.addError(\"@FieldNameConstants has been redesigned in lombok v1.18.4; please upgrade your project dependency on lombok. See https://projectlombok.org/features/experimental/FieldNameConstants for more information.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (level == AccessLevel.NONE) {\n\t\t\tannotationNode.addWarning(\"AccessLevel.NONE is not compatible with @FieldNameConstants. If you don't want the inner type, simply remove FieldNameConstants.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tIdentifierName innerTypeName;\n\t\ttry {\n\t\t\tinnerTypeName = IdentifierName.valueOf(annotationInstance.innerTypeName());\n\t\t} catch(IllegalArgumentException e) {\n\t\t\tannotationNode.addError(\"InnerTypeName \" + annotationInstance.innerTypeName() + \" is not a valid Java identifier.\");\n\t\t\treturn;\n\t\t}\n\t\tif (innerTypeName == null) innerTypeName = annotationNode.getAst().readConfiguration(ConfigurationKeys.FIELD_NAME_CONSTANTS_INNER_TYPE_NAME);\n\t\tif (innerTypeName == null) innerTypeName = FIELDS;\n\t\tBoolean uppercase = annotationNode.getAst().readConfiguration(ConfigurationKeys.FIELD_NAME_CONSTANTS_UPPERCASE);\n\t\tif (uppercase == null) uppercase = false;\n\t\t\n\t\tgenerateFieldNameConstantsForType(node, annotationNode, level, asEnum, innerTypeName, annotationInstance.onlyExplicitlyIncluded(), uppercase);\n\t}\n\t\n\tprivate void createInnerTypeFieldNameConstants(EclipseNode typeNode, EclipseNode errorNode, ASTNode source, AccessLevel level, List<EclipseNode> fields, boolean asEnum, IdentifierName innerTypeName, boolean uppercase) {\n\t\tif (fields.isEmpty()) return;\n\t\t\n\t\tASTVisitor generatedByVisitor = new SetGeneratedByVisitor(source);\n\t\tTypeDeclaration parent = (TypeDeclaration) typeNode.get();\n\t\tEclipseNode fieldsType = findInnerClass(typeNode, innerTypeName.getName());\n\t\tboolean genConstr = false, genClinit = false;\n\t\tchar[] name = innerTypeName.getCharArray();\n\t\tif (fieldsType == null) {\n\t\t\tTypeDeclaration generatedInnerType = new TypeDeclaration(parent.compilationResult);\n\t\t\tgeneratedInnerType.bits |= Eclipse.ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\t\tgeneratedInnerType.modifiers = toEclipseModifier(level) | (asEnum ? ClassFileConstants.AccEnum : (ClassFileConstants.AccStatic | ClassFileConstants.AccFinal));\n\t\t\tgeneratedInnerType.name = name;\n\t\t\tfieldsType = injectType(typeNode, generatedInnerType);\n\t\t\tgenConstr = true;\n\t\t\tgenClinit = asEnum;\n\t\t\tgeneratedInnerType.traverse(generatedByVisitor, ((TypeDeclaration) typeNode.get()).scope);\n\t\t} else {\n\t\t\tTypeDeclaration builderTypeDeclaration = (TypeDeclaration) fieldsType.get();\n\t\t\tif (asEnum && (builderTypeDeclaration.modifiers & ClassFileConstants.AccEnum) == 0) {\n\t\t\t\terrorNode.addError(\"Existing \" + innerTypeName + \" must be declared as an 'enum'.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!asEnum && (builderTypeDeclaration.modifiers & ClassFileConstants.AccStatic) == 0) {\n\t\t\t\terrorNode.addError(\"Existing \" + innerTypeName + \" must be declared as a 'static class'.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tgenConstr = constructorExists(fieldsType) == MemberExistsResult.NOT_EXISTS;\n\t\t}\n\t\t\n\t\tif (genConstr) {\n\t\t\tConstructorDeclaration constructor = new ConstructorDeclaration(parent.compilationResult);\n\t\t\tconstructor.selector = name;\n\t\t\tconstructor.modifiers = ClassFileConstants.AccPrivate;\n\t\t\tExplicitConstructorCall superCall = new ExplicitConstructorCall(0);\n\t\t\tsuperCall.sourceStart = source.sourceStart;\n\t\t\tsuperCall.sourceEnd = source.sourceEnd;\n\t\t\tsuperCall.bits |= Eclipse.ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\t\tconstructor.constructorCall = superCall;\n\t\t\tif (!asEnum) constructor.statements = new Statement[0];\n\t\t\tinjectMethod(fieldsType, constructor);\n\t\t}\n\t\t\n\t\tClinit cli = null;\n\t\tif (genClinit) {\n\t\t\tcli = new Clinit(parent.compilationResult);\n\t\t\tinjectMethod(fieldsType, cli);\n\t\t}\n\t\t\n\t\tfor (EclipseNode fieldNode : fields) {\n\t\t\tFieldDeclaration field = (FieldDeclaration) fieldNode.get();\n\t\t\tchar[] fName = field.name;\n\t\t\tif (uppercase) fName = HandlerUtil.camelCaseToConstant(new String(fName)).toCharArray();\n\t\t\tif (fieldExists(new String(fName), fieldsType) != MemberExistsResult.NOT_EXISTS) continue;\n\t\t\tint pS = source.sourceStart, pE = source.sourceEnd;\n\t\t\tlong p = (long) pS << 32 | pE;\n\t\t\tFieldDeclaration constantField = new FieldDeclaration(fName, pS, pE);\n\t\t\tconstantField.bits |= Eclipse.ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\t\tif (asEnum) {\n\t\t\t\tAllocationExpression ac = new AllocationExpression();\n\t\t\t\tac.enumConstant = constantField;\n\t\t\t\tac.sourceStart = source.sourceStart;\n\t\t\t\tac.sourceEnd = source.sourceEnd;\n\t\t\t\tconstantField.initialization = ac;\n\t\t\t\tconstantField.modifiers = 0;\n\t\t\t\t((TypeDeclaration) fieldsType.get()).enumConstantsCounter++;\n\t\t\t} else {\n\t\t\t\tconstantField.type = new QualifiedTypeReference(TypeConstants.JAVA_LANG_STRING, new long[] {p, p, p});\n\t\t\t\tconstantField.initialization = new StringLiteral(field.name, pS, pE, 0);\n\t\t\t\tconstantField.modifiers = ClassFileConstants.AccPublic | ClassFileConstants.AccStatic | ClassFileConstants.AccFinal;\n\t\t\t}\n\t\t\tinjectField(fieldsType, constantField);\n\t\t\tconstantField.traverse(generatedByVisitor, ((TypeDeclaration) fieldsType.get()).initializerScope);\n\t\t}\n\t\t\n\t\tif (genClinit) {\n\t\t\tcli.traverse(generatedByVisitor, ((TypeDeclaration) fieldsType.get()).scope);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleGetter.java",
    "content": "/*\n * Copyright (C) 2009-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.eclipse.Eclipse.*;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport lombok.AccessLevel;\nimport lombok.ConfigurationKeys;\nimport lombok.experimental.Accessors;\nimport lombok.experimental.Delegate;\nimport lombok.spi.Provides;\nimport lombok.Getter;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.core.configuration.CheckerFrameworkVersion;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.eclipse.agent.PatchDelegate;\n\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.AllocationExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.ArrayInitializer;\nimport org.eclipse.jdt.internal.compiler.ast.ArrayTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.Assignment;\nimport org.eclipse.jdt.internal.compiler.ast.BinaryExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Block;\nimport org.eclipse.jdt.internal.compiler.ast.CastExpression;\nimport org.eclipse.jdt.internal.compiler.ast.ConditionalExpression;\nimport org.eclipse.jdt.internal.compiler.ast.EqualExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.IfStatement;\nimport org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.MessageSend;\nimport org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.NullLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.ParameterizedQualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.ReturnStatement;\nimport org.eclipse.jdt.internal.compiler.ast.SingleNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.SingleTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.StringLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.SynchronizedStatement;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\nimport org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeConstants;\n\n/**\n * Handles the {@code lombok.Getter} annotation for eclipse.\n */\n@Provides\npublic class HandleGetter extends EclipseAnnotationHandler<Getter> {\n\tprivate static final Annotation[] EMPTY_ANNOTATIONS_ARRAY = new Annotation[0];\n\tprivate static final String GETTER_NODE_NOT_SUPPORTED_ERR = \"@Getter is only supported on a class, an enum, or a field.\";\n\t\n\tpublic boolean generateGetterForType(EclipseNode typeNode, EclipseNode pos, AccessLevel level, boolean checkForTypeLevelGetter, List<Annotation> onMethod) {\n\t\tif (checkForTypeLevelGetter) {\n\t\t\tif (hasAnnotation(Getter.class, typeNode)) {\n\t\t\t\t//The annotation will make it happen, so we can skip it.\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (!isClassOrEnum(typeNode)) {\n\t\t\tpos.addError(GETTER_NODE_NOT_SUPPORTED_ERR);\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tfor (EclipseNode field : typeNode.down()) {\n\t\t\tif (fieldQualifiesForGetterGeneration(field)) generateGetterForField(field, pos.get(), level, false, onMethod);\n\t\t}\n\t\treturn true;\n\t}\n\t\n\tpublic static boolean fieldQualifiesForGetterGeneration(EclipseNode field) {\n\t\tif (field.getKind() != Kind.FIELD) return false;\n\t\tFieldDeclaration fieldDecl = (FieldDeclaration) field.get();\n\t\treturn filterField(fieldDecl);\n\t}\n\t\n\t/**\n\t * Generates a getter on the stated field.\n\t * \n\t * Used by {@link HandleData}.\n\t * \n\t * The difference between this call and the handle method is as follows:\n\t * \n\t * If there is a {@code lombok.Getter} annotation on the field, it is used and the\n\t * same rules apply (e.g. warning if the method already exists, stated access level applies).\n\t * If not, the getter is still generated if it isn't already there, though there will not\n\t * be a warning if its already there. The default access level is used.\n\t */\n\tpublic void generateGetterForField(EclipseNode fieldNode, ASTNode pos, AccessLevel level, boolean lazy, List<Annotation> onMethod) {\n\t\tif (hasAnnotation(Getter.class, fieldNode)) {\n\t\t\t//The annotation will make it happen, so we can skip it.\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tcreateGetterForField(level, fieldNode, fieldNode, pos, false, lazy, onMethod);\n\t}\n\t\n\tpublic void handle(AnnotationValues<Getter> annotation, Annotation ast, EclipseNode annotationNode) {\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.GETTER_FLAG_USAGE, \"@Getter\");\n\t\t\n\t\tEclipseNode node = annotationNode.up();\n\t\tGetter annotationInstance = annotation.getInstance();\n\t\tAccessLevel level = annotationInstance.value();\n\t\tboolean lazy = annotationInstance.lazy();\n\t\tif (lazy) handleFlagUsage(annotationNode, ConfigurationKeys.GETTER_LAZY_FLAG_USAGE, \"@Getter(lazy=true)\");\n\t\t\n\t\tif (level == AccessLevel.NONE) {\n\t\t\tif (lazy) annotationNode.addWarning(\"'lazy' does not work with AccessLevel.NONE.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (node == null) return;\n\t\t\n\t\tList<Annotation> onMethod = unboxAndRemoveAnnotationParameter(ast, \"onMethod\", \"@Getter(onMethod\", annotationNode);\n\t\tif (!onMethod.isEmpty()) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.ON_X_FLAG_USAGE, \"@Getter(onMethod=...)\");\n\t\t}\n\t\t\n\t\tswitch (node.getKind()) {\n\t\tcase FIELD:\n\t\t\tcreateGetterForFields(level, annotationNode.upFromAnnotationToFields(), annotationNode, annotationNode.get(), true, lazy, onMethod);\n\t\t\tbreak;\n\t\tcase TYPE:\n\t\t\tif (lazy) annotationNode.addError(\"'lazy' is not supported for @Getter on a type.\");\n\t\t\tgenerateGetterForType(node, annotationNode, level, false, onMethod);\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tpublic void createGetterForFields(AccessLevel level, Collection<EclipseNode> fieldNodes, EclipseNode errorNode, ASTNode source, boolean whineIfExists, boolean lazy, List<Annotation> onMethod) {\n\t\tfor (EclipseNode fieldNode : fieldNodes) {\n\t\t\tcreateGetterForField(level, fieldNode, errorNode, source, whineIfExists, lazy, onMethod);\n\t\t}\n\t}\n\t\n\tpublic void createGetterForField(AccessLevel level,\n\t\t\tEclipseNode fieldNode, EclipseNode errorNode, ASTNode source, boolean whineIfExists, boolean lazy, List<Annotation> onMethod) {\n\t\t\n\t\tif (fieldNode.getKind() != Kind.FIELD || fieldNode.isEnumMember()) {\n\t\t\terrorNode.addError(GETTER_NODE_NOT_SUPPORTED_ERR);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tFieldDeclaration field = (FieldDeclaration) fieldNode.get();\n\t\tif (lazy) {\n\t\t\tif ((field.modifiers & ClassFileConstants.AccPrivate) == 0 || (field.modifiers & ClassFileConstants.AccFinal) == 0) {\n\t\t\t\terrorNode.addError(\"'lazy' requires the field to be private and final.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ((field.modifiers & ClassFileConstants.AccTransient) != 0) {\n\t\t\t\terrorNode.addError(\"'lazy' is not supported on transient fields.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (field.initialization == null) {\n\t\t\t\terrorNode.addError(\"'lazy' requires field initialization.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t\n\t\tTypeReference fieldType = copyType(field.type, source);\n\t\tboolean isBoolean = isBoolean(fieldType);\n\t\tAnnotationValues<Accessors> accessors = getAccessorsForField(fieldNode);\n\t\tString getterName = toGetterName(fieldNode, isBoolean, accessors);\n\t\t\n\t\tif (getterName == null) {\n\t\t\terrorNode.addWarning(\"Not generating getter for this field: It does not fit your @Accessors prefix list.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tint modifier = toEclipseModifier(level) | (field.modifiers & ClassFileConstants.AccStatic);\n\t\t\n\t\tfor (String altName : toAllGetterNames(fieldNode, isBoolean, accessors)) {\n\t\t\tswitch (methodExists(altName, fieldNode, false, 0)) {\n\t\t\tcase EXISTS_BY_LOMBOK:\n\t\t\t\treturn;\n\t\t\tcase EXISTS_BY_USER:\n\t\t\t\tif (whineIfExists) {\n\t\t\t\t\tString altNameExpl = \"\";\n\t\t\t\t\tif (!altName.equals(getterName)) altNameExpl = String.format(\" (%s)\", altName);\n\t\t\t\t\terrorNode.addWarning(\n\t\t\t\t\t\tString.format(\"Not generating %s(): A method with that name already exists%s\", getterName, altNameExpl));\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\tcase NOT_EXISTS:\n\t\t\t\t//continue scanning the other alt names.\n\t\t\t}\n\t\t}\n\t\t\n\t\tMethodDeclaration method = createGetter((TypeDeclaration) fieldNode.up().get(), fieldNode, getterName, modifier, source, lazy, onMethod);\n\t\t\n\t\tinjectMethod(fieldNode.up(), method);\n\t}\n\t\n\tpublic static Annotation[] findDelegatesAndMarkAsHandled(EclipseNode fieldNode) {\n\t\tList<Annotation> delegates = new ArrayList<Annotation>();\n\t\tfor (EclipseNode child : fieldNode.down()) {\n\t\t\tif (annotationTypeMatches(Delegate.class, child)) {\n\t\t\t\tAnnotation delegate = (Annotation)child.get();\n\t\t\t\tPatchDelegate.markHandled(delegate);\n\t\t\t\tdelegates.add(delegate);\n\t\t\t}\n\t\t}\n\t\treturn delegates.toArray(EMPTY_ANNOTATIONS_ARRAY);\n\t}\n\t\n\tpublic MethodDeclaration createGetter(TypeDeclaration parent, EclipseNode fieldNode, String name, int modifier, ASTNode source, boolean lazy, List<Annotation> onMethod) {\n\t\t// Remember the type; lazy will change it;\n\t\tTypeReference returnType = copyType(((FieldDeclaration) fieldNode.get()).type, source);\n\t\t\n\t\tStatement[] statements;\n\t\tboolean addSuppressWarningsUnchecked = false;\n\t\tif (lazy) {\n\t\t\tstatements = createLazyGetterBody(source, fieldNode);\n\t\t\taddSuppressWarningsUnchecked = true;\n\t\t} else {\n\t\t\tstatements = createSimpleGetterBody(source, fieldNode);\n\t\t}\n\t\t\n\t\tAnnotationValues<Accessors> accessors = getAccessorsForField(fieldNode);\n\t\tMethodDeclaration method = new MethodDeclaration(parent.compilationResult);\n\t\tif (shouldMakeFinal(fieldNode, accessors)) modifier |= ClassFileConstants.AccFinal;\n\t\tmethod.modifiers = modifier;\n\t\tmethod.returnType = returnType;\n\t\tmethod.annotations = null;\n\t\tmethod.arguments = null;\n\t\tmethod.selector = name.toCharArray();\n\t\tmethod.binding = null;\n\t\tmethod.thrownExceptions = null;\n\t\tmethod.typeParameters = null;\n\t\tmethod.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tmethod.bodyStart = method.declarationSourceStart = method.sourceStart = source.sourceStart;\n\t\tmethod.bodyEnd = method.declarationSourceEnd = method.sourceEnd = source.sourceEnd;\n\t\tmethod.statements = statements;\n\t\t\n\t\tEclipseHandlerUtil.registerCreatedLazyGetter((FieldDeclaration) fieldNode.get(), method.selector, returnType);\n\t\t\n\t\t/* Generate annotations that must be put on the generated method, and attach them. */ {\n\t\t\tAnnotation[] deprecated = null, checkerFramework = null;\n\t\t\tif (isFieldDeprecated(fieldNode)) deprecated = new Annotation[] { generateDeprecatedAnnotation(source) };\n\t\t\tif (fieldNode.isFinal()) {\n\t\t\t\tif (getCheckerFrameworkVersion(fieldNode).generatePure()) checkerFramework = new Annotation[] { generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__PURE) };\n\t\t\t} else {\n\t\t\t\tif (getCheckerFrameworkVersion(fieldNode).generateSideEffectFree()) checkerFramework = new Annotation[] { generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE) };\n\t\t\t}\n\t\t\t\n\t\t\t// Copying Jackson annotations is required for fluent accessors (otherwise Jackson would not find the accessor).\n\t\t\tboolean fluent = accessors.isExplicit(\"fluent\");\n\t\t\tBoolean fluentConfig = fieldNode.getAst().readConfiguration(ConfigurationKeys.ACCESSORS_FLUENT);\n\t\t\tif (fluentConfig != null && fluentConfig) fluent = fluentConfig;\n\t\t\t\n\t\t\tmethod.annotations = copyAnnotations(source,\n\t\t\t\tonMethod.toArray(new Annotation[0]),\n\t\t\t\tfindCopyableAnnotations(fieldNode),\n\t\t\t\tfindCopyableToGetterAnnotations(fieldNode, fluent),\n\t\t\t\tfindDelegatesAndMarkAsHandled(fieldNode),\n\t\t\t\tcheckerFramework,\n\t\t\t\tdeprecated);\n\t\t}\n\t\t\n\t\tif (addSuppressWarningsUnchecked) {\n\t\t\tList<Expression> suppressions = new ArrayList<Expression>(2);\n\t\t\tif (!Boolean.FALSE.equals(fieldNode.getAst().readConfiguration(ConfigurationKeys.ADD_SUPPRESSWARNINGS_ANNOTATIONS))) {\n\t\t\t\tsuppressions.add(new StringLiteral(ALL, 0, 0, 0));\n\t\t\t}\n\t\t\tsuppressions.add(new StringLiteral(UNCHECKED, 0, 0, 0));\n\t\t\tArrayInitializer arr = new ArrayInitializer();\n\t\t\tarr.expressions = suppressions.toArray(new Expression[0]);\n\t\t\tmethod.annotations = addAnnotation(source, method.annotations, TypeConstants.JAVA_LANG_SUPPRESSWARNINGS, arr);\n\t\t}\n\t\t\n\t\tmethod.traverse(new SetGeneratedByVisitor(source), parent.scope);\n\t\tcopyJavadoc(fieldNode, method, CopyJavadoc.GETTER);\n\t\treturn method;\n\t}\n\n\tpublic Statement[] createSimpleGetterBody(ASTNode source, EclipseNode fieldNode) {\n\t\tFieldDeclaration field = (FieldDeclaration) fieldNode.get();\n\t\tExpression fieldRef = createFieldAccessor(fieldNode, FieldAccess.ALWAYS_FIELD, source);\n\t\tStatement returnStatement = new ReturnStatement(fieldRef, field.sourceStart, field.sourceEnd);\n\t\treturn new Statement[] {returnStatement};\n\t}\n\t\n\tprivate static final char[][] AR = fromQualifiedName(\"java.util.concurrent.atomic.AtomicReference\");\n\t\n\tpublic static final java.util.Map<String, char[][]> TYPE_MAP;\n\tstatic {\n\t\tMap<String, char[][]> m = new HashMap<String, char[][]>();\n\t\tm.put(\"int\", fromQualifiedName(\"java.lang.Integer\"));\n\t\tm.put(\"double\", fromQualifiedName(\"java.lang.Double\"));\n\t\tm.put(\"float\", fromQualifiedName(\"java.lang.Float\"));\n\t\tm.put(\"short\", fromQualifiedName(\"java.lang.Short\"));\n\t\tm.put(\"byte\", fromQualifiedName(\"java.lang.Byte\"));\n\t\tm.put(\"long\", fromQualifiedName(\"java.lang.Long\"));\n\t\tm.put(\"boolean\", fromQualifiedName(\"java.lang.Boolean\"));\n\t\tm.put(\"char\", fromQualifiedName(\"java.lang.Character\"));\n\t\tTYPE_MAP = Collections.unmodifiableMap(m);\n\t}\n\t\n\tprivate static char[] valueName = \"$value\".toCharArray();\n\tprivate static char[] actualValueName = \"actualValue\".toCharArray();\n\t\n\tprivate static final int PARENTHESIZED = (1 << ASTNode.ParenthesizedSHIFT) & ASTNode.ParenthesizedMASK;\n\t\n\tpublic Statement[] createLazyGetterBody(ASTNode source, EclipseNode fieldNode) {\n\t\t/*\n\t\tjava.lang.Object value = this.fieldName.get();\n\t\tif (value == null) {\n\t\t\tsynchronized (this.fieldName) {\n\t\t\t\tvalue = this.fieldName.get();\n\t\t\t\tif (value == null) {\n\t\t\t\t\tfinal RawValueType actualValue = INITIALIZER_EXPRESSION;\n\t\t\t\t\t[IF PRIMITIVE]\n\t\t\t\t\tvalue = actualValue;\n\t\t\t\t\t[ELSE]\n\t\t\t\t\tvalue = actualValue == null ? this.fieldName : actualValue;\n\t\t\t\t\t[END IF]\n\t\t\t\t\tthis.fieldName.set(value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t[IF PRIMITIVE]\n\t\treturn (BoxedValueType) value;\n\t\t[ELSE]\n\t\treturn (BoxedValueType) (value == this.fieldName ? null : value);\n\t\t[END IF]\n\t\t*/\n\t\t\n\t\tFieldDeclaration field = (FieldDeclaration) fieldNode.get();\n\t\tint pS = source.sourceStart, pE = source.sourceEnd;\n\t\tlong p = (long)pS << 32 | pE;\n\t\t\n\t\tTypeReference rawComponentType = copyType(field.type, source);\n\t\tTypeReference boxedComponentType = null;\n\t\tboolean isPrimitive = false;\n\t\tif (field.type instanceof SingleTypeReference && !(field.type instanceof ArrayTypeReference)) {\n\t\t\tchar[][] newType = TYPE_MAP.get(new String(((SingleTypeReference)field.type).token));\n\t\t\tif (newType != null) {\n\t\t\t\tboxedComponentType = new QualifiedTypeReference(newType, poss(source, 3));\n\t\t\t\tisPrimitive = true;\n\t\t\t}\n\t\t}\n\t\tif (boxedComponentType == null) boxedComponentType = copyType(field.type, source);\n\t\tboxedComponentType.sourceStart = pS; boxedComponentType.sourceEnd = boxedComponentType.statementEnd = pE;\n\t\t\n\t\tStatement[] statements = new Statement[3];\n\t\t\n\t\t/* java.lang.Object value = this.fieldName.get(); */ {\n\t\t\tLocalDeclaration valueDecl = new LocalDeclaration(valueName, pS, pE);\n\t\t\tvalueDecl.type = new QualifiedTypeReference(TypeConstants.JAVA_LANG_OBJECT, poss(source, 3));\n\t\t\tvalueDecl.type.sourceStart = pS; valueDecl.type.sourceEnd = valueDecl.type.statementEnd = pE;\n\t\t\t\n\t\t\tMessageSend getter = new MessageSend();\n\t\t\tgetter.sourceStart = pS; getter.statementEnd = getter.sourceEnd = pE;\n\t\t\tgetter.selector = new char[] {'g', 'e', 't'};\n\t\t\tgetter.receiver = createFieldAccessor(fieldNode, FieldAccess.ALWAYS_FIELD, source);\n\t\t\t\n\t\t\tvalueDecl.initialization = getter;\n\t\t\tstatements[0] = valueDecl;\n\t\t}\n\t\t\n\t\t/*\n\t\tif (value == null) {\n\t\t\tsynchronized (this.fieldName) {\n\t\t\t\tvalue = this.fieldName.get();\n\t\t\t\tif (value == null) { \n\t\t\t\t\tfinal ValueType actualValue = INITIALIZER_EXPRESSION;\n\t\t\t\t\t[IF PRIMITIVE]\n\t\t\t\t\tvalue = actualValue;\n\t\t\t\t\t[ELSE]\n\t\t\t\t\tvalue = actualValue == null ? this.fieldName : actualValue;\n\t\t\t\t\t[END IF]\n\t\t\t\t\tthis.fieldName.set(value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t */ {\n\t\t\tEqualExpression cond = new EqualExpression(\n\t\t\t\t\tnew SingleNameReference(valueName, p), new NullLiteral(pS, pE),\n\t\t\t\t\tBinaryExpression.EQUAL_EQUAL);\n\t\t\tBlock then = new Block(0);\n\t\t\tExpression lock = createFieldAccessor(fieldNode, FieldAccess.ALWAYS_FIELD, source);\n\t\t\tBlock inner = new Block(0);\n\t\t\tinner.statements = new Statement[2];\n\t\t\t/* value = this.fieldName.get(); */ {\n\t\t\t\tMessageSend getter = new MessageSend();\n\t\t\t\tgetter.sourceStart = pS; getter.sourceEnd = getter.statementEnd = pE;\n\t\t\t\tgetter.selector = new char[] {'g', 'e', 't'};\n\t\t\t\tgetter.receiver = createFieldAccessor(fieldNode, FieldAccess.ALWAYS_FIELD, source);\n\t\t\t\tAssignment assign = new Assignment(new SingleNameReference(valueName, p), getter, pE);\n\t\t\t\tassign.sourceStart = pS; assign.statementEnd = assign.sourceEnd = pE;\n\t\t\t\tinner.statements[0] = assign;\n\t\t\t}\n\t\t\t/* if (value == null) */ {\n\t\t\t\tEqualExpression innerCond = new EqualExpression(\n\t\t\t\t\t\tnew SingleNameReference(valueName, p), new NullLiteral(pS, pE),\n\t\t\t\t\t\tBinaryExpression.EQUAL_EQUAL);\n\t\t\t\tinnerCond.sourceStart = pS; innerCond.sourceEnd = innerCond.statementEnd = pE;\n\t\t\t\tBlock innerThen = new Block(0);\n\t\t\t\tinnerThen.statements = new Statement[3];\n\t\t\t\t/* final ValueType actualValue = INITIALIZER_EXPRESSION */ {\n\t\t\t\t\tLocalDeclaration actualValueDecl = new LocalDeclaration(actualValueName, pS, pE);\n\t\t\t\t\tactualValueDecl.type = rawComponentType;\n\t\t\t\t\tactualValueDecl.type.sourceStart = pS; actualValueDecl.type.sourceEnd = actualValueDecl.type.statementEnd = pE;\n\t\t\t\t\tactualValueDecl.initialization = field.initialization;\n\t\t\t\t\tactualValueDecl.modifiers = ClassFileConstants.AccFinal;\n\t\t\t\t\tinnerThen.statements[0] = actualValueDecl;\n\t\t\t\t}\n\t\t\t\t/* [IF PRIMITIVE] value = actualValue; */ {\n\t\t\t\t\tif (isPrimitive) {\n\t\t\t\t\t\tAssignment innerAssign = new Assignment(new SingleNameReference(valueName, p), new SingleNameReference(actualValueName, p), pE);\n\t\t\t\t\t\tinnerAssign.sourceStart = pS; innerAssign.statementEnd = innerAssign.sourceEnd = pE;\n\t\t\t\t\t\tinnerThen.statements[1] = innerAssign;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t/* [ELSE] value = actualValue == null ? this.fieldName : actualValue; */ {\n\t\t\t\t\tif (!isPrimitive) {\n\t\t\t\t\t\tEqualExpression avIsNull = new EqualExpression(\n\t\t\t\t\t\t\t\tnew SingleNameReference(actualValueName, p), new NullLiteral(pS, pE),\n\t\t\t\t\t\t\t\tBinaryExpression.EQUAL_EQUAL);\n\t\t\t\t\t\tavIsNull.sourceStart = pS; avIsNull.sourceEnd = avIsNull.statementEnd = pE;\n\t\t\t\t\t\tExpression fieldRef = createFieldAccessor(fieldNode, FieldAccess.ALWAYS_FIELD, source);\n\t\t\t\t\t\tConditionalExpression ternary = new ConditionalExpression(avIsNull, fieldRef, new SingleNameReference(actualValueName, p));\n\t\t\t\t\t\tternary.sourceStart = pS; ternary.sourceEnd = ternary.statementEnd = pE;\n\t\t\t\t\t\tAssignment innerAssign = new Assignment(new SingleNameReference(valueName, p), ternary, pE);\n\t\t\t\t\t\tinnerAssign.sourceStart = pS; innerAssign.statementEnd = innerAssign.sourceEnd = pE;\n\t\t\t\t\t\tinnerThen.statements[1] = innerAssign;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/* this.fieldName.set(value); */ {\n\t\t\t\t\tMessageSend setter = new MessageSend();\n\t\t\t\t\tsetter.sourceStart = pS; setter.sourceEnd = setter.statementEnd =  pE;\n\t\t\t\t\tsetter.receiver = createFieldAccessor(fieldNode, FieldAccess.ALWAYS_FIELD, source);\n\t\t\t\t\tsetter.selector = new char[] { 's', 'e', 't' };\n\t\t\t\t\tsetter.arguments = new Expression[] {\n\t\t\t\t\t\t\tnew SingleNameReference(valueName, p)};\n\t\t\t\t\tinnerThen.statements[2] = setter;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tIfStatement innerIf = new IfStatement(innerCond, innerThen, pS, pE);\n\t\t\t\tinner.statements[1] = innerIf;\n\t\t\t}\n\t\t\t\n\t\t\tSynchronizedStatement sync = new SynchronizedStatement(lock, inner, pS, pE);\n\t\t\tthen.statements = new Statement[] {sync};\n\t\t\t\n\t\t\tIfStatement ifStatement = new IfStatement(cond, then, pS, pE);\n\t\t\tstatements[1] = ifStatement;\n\t\t}\n\t\t\n\t\t/* [IF PRIMITIVE] return (BoxedValueType)value; */ {\n\t\t\tif (isPrimitive) {\n\t\t\t\tCastExpression cast = makeCastExpression(new SingleNameReference(valueName, p), boxedComponentType, source);\n\t\t\t\tstatements[2] = new ReturnStatement(cast, pS, pE);\n\t\t\t}\n\t\t}\n\t\t/* [ELSE] return (BoxedValueType)(value == this.fieldName ? null : value); */ {\n\t\t\tif (!isPrimitive) {\n\t\t\t\tEqualExpression vIsThisFieldName = new EqualExpression(\n\t\t\t\t\t\tnew SingleNameReference(valueName, p), createFieldAccessor(fieldNode, FieldAccess.ALWAYS_FIELD, source),\n\t\t\t\t\t\tBinaryExpression.EQUAL_EQUAL);\n\t\t\t\tvIsThisFieldName.sourceStart = pS; vIsThisFieldName.sourceEnd = vIsThisFieldName.statementEnd = pE;\n\t\t\t\tConditionalExpression ternary = new ConditionalExpression(vIsThisFieldName, new NullLiteral(pS, pE), new SingleNameReference(valueName, p));\n\t\t\t\tternary.sourceStart = pS; ternary.sourceEnd = ternary.statementEnd = pE;\n\t\t\t\tternary.bits |= PARENTHESIZED;\n\t\t\t\tCastExpression cast = makeCastExpression(ternary, boxedComponentType, source);\n\t\t\t\tstatements[2] = new ReturnStatement(cast, pS, pE);\n\t\t\t}\n\t\t}\n\t\t\n\t\t// update the field type and init last\n\t\t\t\n\t\t/* \tprivate final java.util.concurrent.atomic.AtomicReference<java.lang.Object> fieldName = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>(); */ {\n\t\t\tTypeReference innerType = new QualifiedTypeReference(TypeConstants.JAVA_LANG_OBJECT, poss(source, 3));\n\t\t\tTypeReference[][] typeParams = new TypeReference[5][];\n\t\t\ttypeParams[4] = new TypeReference[] {innerType};\n\t\t\tTypeReference type = new ParameterizedQualifiedTypeReference(AR, typeParams, 0, poss(source, 5));\n\t\t\t\n\t\t\t// Some magic here\n\t\t\ttype.sourceStart = -1; type.sourceEnd = -2;\n\t\t\t\n\t\t\tfield.type = type;\n\t\t\tAllocationExpression init = new AllocationExpression();\n\t\t\t// Some magic here\n\t\t\tinit.sourceStart = field.initialization.sourceStart; init.sourceEnd = init.statementEnd = field.initialization.sourceEnd;\n\t\t\tinit.type = copyType(type, source);\n\t\t\tfield.initialization = init;\n\t\t}\n\t\treturn statements;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleHelper.java",
    "content": "/*\n * Copyright (C) 2015-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.handleExperimentalFlagUsage;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\n\nimport org.eclipse.jdt.internal.compiler.ASTVisitor;\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.AllocationExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.Block;\nimport org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.MessageSend;\nimport org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.SingleNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.SingleTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.SwitchStatement;\nimport org.eclipse.jdt.internal.compiler.ast.ThisReference;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;\nimport org.eclipse.jdt.internal.compiler.lookup.BlockScope;\n\nimport lombok.ConfigurationKeys;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.experimental.Helper;\nimport lombok.spi.Provides;\n\n/**\n * Handles the {@code lombok.Cleanup} annotation for eclipse.\n */\n@Provides\npublic class HandleHelper extends EclipseAnnotationHandler<Helper> {\n\tprivate Statement[] getStatementsFromAstNode(ASTNode node) {\n\t\tif (node instanceof Block) return ((Block) node).statements;\n\t\tif (node instanceof AbstractMethodDeclaration) return ((AbstractMethodDeclaration) node).statements;\n\t\tif (node instanceof SwitchStatement) return ((SwitchStatement) node).statements;\n\t\treturn null;\n\t}\n\t\n\tprivate void setStatementsOfAstNode(ASTNode node, Statement[] statements) {\n\t\tif (node instanceof Block) ((Block) node).statements = statements;\n\t\telse if (node instanceof AbstractMethodDeclaration) ((AbstractMethodDeclaration) node).statements = statements;\n\t\telse if (node instanceof SwitchStatement) ((SwitchStatement) node).statements = statements;\n\t\telse throw new IllegalArgumentException(\"Can't set statements on node type: \" + node.getClass());\n\t}\n\t\n\t@Override public void handle(AnnotationValues<Helper> annotation, Annotation ast, EclipseNode annotationNode) {\n\t\thandleExperimentalFlagUsage(annotationNode, ConfigurationKeys.HELPER_FLAG_USAGE, \"@Helper\");\n\t\t\n\t\tEclipseNode annotatedType = annotationNode.up();\n\t\tEclipseNode containingBlock = annotatedType == null ? null : annotatedType.directUp();\n\t\tStatement[] origStatements = getStatementsFromAstNode(containingBlock == null ? null : containingBlock.get());\n\t\t\n\t\tif (annotatedType == null || annotatedType.getKind() != Kind.TYPE || origStatements == null) {\n\t\t\tannotationNode.addError(\"@Helper is legal only on method-local classes.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tTypeDeclaration annotatedType_ = (TypeDeclaration) annotatedType.get();\n\t\tint indexOfType = -1;\n\t\tfor (int i = 0; i < origStatements.length; i++) {\n\t\t\tif (origStatements[i] == annotatedType_) {\n\t\t\t\tindexOfType = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\tfinal List<String> knownMethodNames = new ArrayList<String>();\n\t\t\n\t\tfor (AbstractMethodDeclaration methodOfHelper : annotatedType_.methods) {\n\t\t\tif (!(methodOfHelper instanceof MethodDeclaration)) continue;\n\t\t\tchar[] name = methodOfHelper.selector;\n\t\t\tif (name != null && name.length > 0 && name[0] != '<') knownMethodNames.add(new String(name));\n\t\t}\n\t\t\n\t\tCollections.sort(knownMethodNames);\n\t\tfinal String[] knownMethodNames_ = knownMethodNames.toArray(new String[0]);\n\t\t\n\t\tfinal char[] helperName = new char[annotatedType_.name.length + 1];\n\t\tfinal boolean[] helperUsed = new boolean[1];\n\t\thelperName[0] = '$';\n\t\tSystem.arraycopy(annotatedType_.name, 0, helperName, 1, helperName.length - 1);\n\t\t\n\t\tASTVisitor visitor = new ASTVisitor() {\n\t\t\t@Override public boolean visit(MessageSend messageSend, BlockScope scope) {\n\t\t\t\tif (messageSend.receiver instanceof ThisReference) {\n\t\t\t\t\tif ((((ThisReference) messageSend.receiver).bits & ASTNode.IsImplicitThis) == 0) return true;\n\t\t\t\t} else if (messageSend.receiver != null) return true;\n\t\t\t\t\n\t\t\t\tchar[] name = messageSend.selector;\n\t\t\t\tif (name == null || name.length == 0 || name[0] == '<') return true;\n\t\t\t\tString n = new String(name);\n\t\t\t\tif (Arrays.binarySearch(knownMethodNames_, n) < 0) return true;\n\t\t\t\tmessageSend.receiver = new SingleNameReference(helperName, messageSend.nameSourcePosition);\n\t\t\t\thelperUsed[0] = true;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t};\n\t\t\n\t\tfor (int i = indexOfType + 1; i < origStatements.length; i++) {\n\t\t\torigStatements[i].traverse(visitor, null);\n\t\t}\n\t\t\n\t\tif (!helperUsed[0]) {\n\t\t\tannotationNode.addWarning(\"No methods of this helper class are ever used.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tStatement[] newStatements = new Statement[origStatements.length + 1];\n\t\tSystem.arraycopy(origStatements, 0, newStatements, 0, indexOfType + 1);\n\t\tSystem.arraycopy(origStatements, indexOfType + 1, newStatements, indexOfType + 2, origStatements.length - indexOfType - 1);\n\t\tLocalDeclaration decl = new LocalDeclaration(helperName, 0, 0);\n\t\tdecl.modifiers |= ClassFileConstants.AccFinal;\n\t\tAllocationExpression alloc = new AllocationExpression();\n\t\talloc.type = new SingleTypeReference(annotatedType_.name, 0L);\n\t\tdecl.initialization = alloc;\n\t\tdecl.type = new SingleTypeReference(annotatedType_.name, 0L);\n\t\tSetGeneratedByVisitor sgbvVisitor = new SetGeneratedByVisitor(annotationNode.get());\n\t\tdecl.traverse(sgbvVisitor, null);\n\t\tnewStatements[indexOfType + 1] = decl;\n\t\tsetStatementsOfAstNode(containingBlock.get(), newStatements);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleJacksonized.java",
    "content": "/*\n * Copyright (C) 2020-2026 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.handleExperimentalFlagUsage;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\n\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.ClassLiteralAccess;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.MemberValuePair;\nimport org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.StringLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\nimport org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;\n\nimport lombok.Builder;\nimport lombok.ConfigurationKeys;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.core.JacksonAnnotationType;\nimport lombok.core.AST.Kind;\nimport lombok.core.configuration.JacksonVersion;\nimport lombok.core.handlers.HandlerUtil;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.experimental.Accessors;\nimport lombok.experimental.SuperBuilder;\nimport lombok.extern.jackson.Jacksonized;\nimport lombok.spi.Provides;\n\n/**\n * This (ecj) handler deals with {@code @Jacksonized} modifying the (already\n * generated) {@code @Builder} or {@code @SuperBuilder} to conform to Jackson's\n * needs for builders.\n */\n@Provides\n@HandlerPriority(-512) // Above Handle(Super)Builder's level (builders must be already generated).\npublic class HandleJacksonized extends EclipseAnnotationHandler<Jacksonized> {\n\tstatic boolean hasAnnotation(EclipseNode node, JacksonAnnotationType annotation) {\n\t\treturn EclipseHandlerUtil.hasAnnotation(annotation.getQualifiedName(), node);\n\t}\n\t\n\t@Override public void handle(AnnotationValues<Jacksonized> annotation, Annotation ast, EclipseNode annotationNode) {\n\t\thandleExperimentalFlagUsage(annotationNode, ConfigurationKeys.JACKSONIZED_FLAG_USAGE, \"@Jacksonized\");\n\t\t\n\t\tEclipseNode annotatedNode = annotationNode.up();\n\t\t\n\t\tEclipseNode tdNode;\n\t\tif (annotatedNode.getKind() != Kind.TYPE)  tdNode = annotatedNode.up(); // @Jacksonized on a constructor or a static factory method.\n\t\telse tdNode = annotatedNode; // @Jacksonized on the class.\n\t\tTypeDeclaration td = (TypeDeclaration) tdNode.get();\n\t\t\n\t\tEclipseNode builderAnnotationNode = findAnnotation(Builder.class, annotatedNode);\n\t\tEclipseNode superBuilderAnnotationNode = findAnnotation(SuperBuilder.class, annotatedNode);\n\t\tEclipseNode accessorsAnnotationNode = (annotatedNode.getKind() == Kind.TYPE) ? findAnnotation(Accessors.class, annotatedNode) : null;\n\t\t\n\t\tif (builderAnnotationNode == null && superBuilderAnnotationNode == null && accessorsAnnotationNode == null) {\n\t\t\tannotationNode.addWarning(\"@Jacksonized requires @Builder, @SuperBuilder, or @Accessors for it to mean anything.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (builderAnnotationNode != null && superBuilderAnnotationNode != null) {\n\t\t\tannotationNode.addError(\"@Jacksonized cannot process both @Builder and @SuperBuilder on the same class.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tboolean jacksonizedBuilder = builderAnnotationNode != null || superBuilderAnnotationNode != null;\n\t\tif (jacksonizedBuilder) {\n\t\t\thandleJacksonizedBuilder(ast, annotationNode, annotatedNode, tdNode, td, builderAnnotationNode, superBuilderAnnotationNode);\n\t\t}\n\t\t\n\t\tif (accessorsAnnotationNode != null) {\n\t\t\thandleJacksonizedAccessors(ast, annotationNode, annotatedNode, tdNode, td, accessorsAnnotationNode, jacksonizedBuilder);\n\t\t}\n\t}\n\t\n\tprivate void handleJacksonizedBuilder(Annotation ast, EclipseNode annotationNode, EclipseNode annotatedNode, EclipseNode tdNode, TypeDeclaration td, EclipseNode builderAnnotationNode, EclipseNode superBuilderAnnotationNode) {\n\t\tboolean isAbstract = (td.modifiers & ClassFileConstants.AccAbstract) != 0;\n\t\tif (isAbstract) {\n\t\t\tannotationNode.addError(\"Builders on abstract classes cannot be @Jacksonized (the builder would never be used).\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tAnnotationValues<Builder> builderAnnotation = builderAnnotationNode != null ? createAnnotation(Builder.class, builderAnnotationNode) : null;\n\t\tAnnotationValues<SuperBuilder> superBuilderAnnotation = superBuilderAnnotationNode != null ? createAnnotation(SuperBuilder.class, superBuilderAnnotationNode) : null;\n\t\t\n\t\tString setPrefix = builderAnnotation != null ? builderAnnotation.getInstance().setterPrefix() : superBuilderAnnotation.getInstance().setterPrefix();\n\t\tString buildMethodName = builderAnnotation != null ? builderAnnotation.getInstance().buildMethodName() : superBuilderAnnotation.getInstance().buildMethodName();\n\t\t\n\t\t// Now lets find the generated builder class.\n\t\tEclipseNode builderClassNode = null;\n\t\tTypeDeclaration builderClass = null;\n\t\tString builderClassName = getBuilderClassName(ast, annotationNode, annotatedNode, td, builderAnnotation);\n\t\tfor (EclipseNode member : tdNode.down()) {\n\t\t\tASTNode astNode = member.get();\n\t\t\tif (astNode instanceof TypeDeclaration && Arrays.equals(((TypeDeclaration)astNode).name, builderClassName.toCharArray())) {\n\t\t\t\tbuilderClassNode = member;\n\t\t\t\tbuilderClass = (TypeDeclaration) astNode;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (builderClass == null) {\n\t\t\tannotationNode.addError(\"Could not find @(Super)Builder's generated builder class for @Jacksonized processing. If there are other compiler errors, fix them first.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t// Insert @JsonDeserialize on annotated class.\n\t\tif (hasAnnotation(tdNode, JacksonAnnotationType.JSON_DESERIALIZE2) || hasAnnotation(tdNode, JacksonAnnotationType.JSON_DESERIALIZE3)) {\n\t\t\tannotationNode.addError(\"@JsonDeserialize already exists on class. Either delete @JsonDeserialize, or remove @Jacksonized and manually configure Jackson.\");\n\t\t\treturn;\n\t\t}\n\t\tlong p = (long) ast.sourceStart << 32 | ast.sourceEnd;\n\t\tTypeReference builderClassExpression = namePlusTypeParamsToTypeReference(builderClassNode, null, p);\n\t\tClassLiteralAccess builderClassLiteralAccess = new ClassLiteralAccess(td.sourceEnd, builderClassExpression);\n\t\tMemberValuePair builderMvp = new MemberValuePair(\"builder\".toCharArray(), td.sourceStart, td.sourceEnd, builderClassLiteralAccess);\n\t\t\n\t\tList<JacksonVersion> jacksonVersions = annotationNode.getAst().readConfigurationOr(ConfigurationKeys.JACKSONIZED_JACKSON_VERSION, Arrays.<JacksonVersion>asList());\n\t\t\n\t\tif (jacksonVersions.isEmpty()) {\n\t\t\tannotationNode.addWarning(\"Ambiguous: Jackson2 and Jackson3 exist; define which variant(s) you want in 'lombok.config'. See https://projectlombok.org/features/experimental/Jacksonized\");\n\t\t\tjacksonVersions = Arrays.asList(JacksonVersion.TWO);\n\t\t}\n\t\t\n\t\tif (jacksonVersions.contains(JacksonVersion.TWO)) {\n\t\t\ttd.annotations = addAnnotation(td, td.annotations, JacksonAnnotationType.JSON_DESERIALIZE2.getQualifiednameAsCharArrayArray(), builderMvp);\n\t\t}\n\t\t\n\t\tif (jacksonVersions.contains(JacksonVersion.THREE)) {\n\t\t\ttd.annotations = addAnnotation(td, td.annotations, JacksonAnnotationType.JSON_DESERIALIZE3.getQualifiednameAsCharArrayArray(), builderMvp);\n\t\t}\n\t\t\n\t\t// Copy annotations from the class to the builder class.\n\t\tAnnotation[] copyableAnnotations = findJacksonAnnotationsOnClass(td, tdNode);\n\t\tbuilderClass.annotations = copyAnnotations(builderClass, builderClass.annotations, copyableAnnotations);\n\t\t\n\t\t// Insert @JsonPOJOBuilder on the builder class.\n\t\tStringLiteral withPrefixLiteral = new StringLiteral(setPrefix.toCharArray(), builderClass.sourceStart, builderClass.sourceEnd, 0);\n\t\tMemberValuePair withPrefixMvp = new MemberValuePair(\"withPrefix\".toCharArray(), builderClass.sourceStart, builderClass.sourceEnd, withPrefixLiteral);\n\t\tStringLiteral buildMethodNameLiteral = new StringLiteral(buildMethodName.toCharArray(), builderClass.sourceStart, builderClass.sourceEnd, 0);\n\t\tMemberValuePair buildMethodNameMvp = new MemberValuePair(\"buildMethodName\".toCharArray(), builderClass.sourceStart, builderClass.sourceEnd, buildMethodNameLiteral);\n\t\t\n\t\tif (jacksonVersions.contains(JacksonVersion.TWO)) {\n\t\t\tbuilderClass.annotations = addAnnotation(builderClass, builderClass.annotations, JacksonAnnotationType.JSON_POJO_BUILDER2.getQualifiednameAsCharArrayArray(), withPrefixMvp, buildMethodNameMvp);\n\t\t}\n\t\tif (jacksonVersions.contains(JacksonVersion.THREE)) {\n\t\t\tbuilderClass.annotations = addAnnotation(builderClass, builderClass.annotations, JacksonAnnotationType.JSON_POJO_BUILDER3.getQualifiednameAsCharArrayArray(), withPrefixMvp, buildMethodNameMvp);\n\t\t}\n\t\t\n\t\t// @SuperBuilder? Make it package-private!\n\t\tif (superBuilderAnnotationNode != null) builderClass.modifiers = builderClass.modifiers & ~ClassFileConstants.AccPrivate;\n\t}\n\t\n\tprivate void handleJacksonizedAccessors(Annotation ast, EclipseNode annotationNode, EclipseNode annotatedNode, EclipseNode tdNode, TypeDeclaration td, EclipseNode accessorsAnnotationNode, boolean jacksonizedBuilder) {\n\t\tAnnotationValues<Accessors> accessorsAnnotation = accessorsAnnotationNode != null ? \n\t\t\tcreateAnnotation(Accessors.class, accessorsAnnotationNode) : null;\n\t\tboolean fluent = accessorsAnnotation != null && accessorsAnnotation.getInstance().fluent();\n\t\t\n\t\tif (!fluent) {\n\t\t\t// No changes required for chained-only accessors.\n\t\t\tif (!jacksonizedBuilder) {\n\t\t\t\tannotationNode.addWarning(\"@Jacksonized only affects fluent accessors (@Accessors(fluent=true)).\");\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t// Add @JsonProperty to all fields. It will be automatically copied to the getter/setters later.\n\t\tfor (EclipseNode eclipseNode : tdNode.down()) {\n\t\t\tif (eclipseNode.getKind() == Kind.FIELD) {\n\t\t\t\tif (hasAnnotation(eclipseNode, JacksonAnnotationType.JSON_PROPERTY2) || \n\t\t\t\t\thasAnnotation(eclipseNode, JacksonAnnotationType.JSON_IGNORE2)) {\n\t\t\t\t\treturn;\n\t\t\t\t} else if (eclipseNode.isTransient()) {\n\t\t\t\t\tcreateJsonIgnoreForField(eclipseNode, annotationNode);\n\t\t\t\t} else {\n\t\t\t\t\tcreateJsonPropertyForField(eclipseNode, annotationNode);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\ttdNode.rebuild();\n\t}\n\t\n\tprivate void createJsonPropertyForField(EclipseNode fieldNode, EclipseNode annotationNode) {\n\t\tASTNode astNode = fieldNode.get();\n\t\tif (astNode instanceof FieldDeclaration) {\n\t\t\tFieldDeclaration fd = (FieldDeclaration) astNode;\n\t\t\tStringLiteral fieldName = new StringLiteral(fd.name, 0, 0, 0);\n\t\t\t((FieldDeclaration) astNode).annotations = addAnnotation(fieldNode.get(), fd.annotations, JacksonAnnotationType.JSON_PROPERTY2.getQualifiednameAsCharArrayArray(), fieldName);\n\t\t}\n\t}\n\t\n\tprivate void createJsonIgnoreForField(EclipseNode fieldNode, EclipseNode annotationNode) {\n\t\tASTNode astNode = fieldNode.get();\n\t\tif (astNode instanceof FieldDeclaration) {\n\t\t\tFieldDeclaration fd = (FieldDeclaration) astNode;\n\t\t\t((FieldDeclaration) astNode).annotations = addAnnotation(fieldNode.get(), fd.annotations, JacksonAnnotationType.JSON_IGNORE2.getQualifiednameAsCharArrayArray());\n\t\t}\n\t}\n\t\n\tprivate String getBuilderClassName(Annotation ast, EclipseNode annotationNode, EclipseNode annotatedNode, TypeDeclaration td, AnnotationValues<Builder> builderAnnotation) {\n\t\tString builderClassName = builderAnnotation != null ? \n\t\t\tbuilderAnnotation.getInstance().builderClassName() : null;\n\t\tif (builderClassName == null || builderClassName.isEmpty()) {\n\t\t\tbuilderClassName = annotationNode.getAst().readConfiguration(ConfigurationKeys.BUILDER_CLASS_NAME);\n\t\t\tif (builderClassName == null || builderClassName.isEmpty()) builderClassName = \"*Builder\";\n\t\t\t\n\t\t\tMethodDeclaration fillParametersFrom = annotatedNode.get() instanceof MethodDeclaration ? (MethodDeclaration) annotatedNode.get() : null;\n\t\t\tchar[] replacement;\n\t\t\tif (fillParametersFrom != null) {\n\t\t\t\t// @Builder on a method: Use name of return type for builder class name.\n\t\t\t\treplacement = HandleBuilder.returnTypeToBuilderClassName(annotationNode, fillParametersFrom, fillParametersFrom.typeParameters);\n\t\t\t} else {\n\t\t\t\t// @Builder on class or constructor: Use the class name.\n\t\t\t\treplacement = td.name;\n\t\t\t}\n\t\t\tbuilderClassName = builderClassName.replace(\"*\", new String(replacement));\n\t\t}\n\t\t\n\t\tif (builderAnnotation == null) builderClassName += \"Impl\"; // For @SuperBuilder, all Jackson annotations must be put on the BuilderImpl class.\n\t\t\n\t\treturn builderClassName;\n\t}\n\t\n\tprivate static final Annotation[] EMPTY_ANNOTATIONS_ARRAY = new Annotation[0];\n\t\n\tprivate static Annotation[] findJacksonAnnotationsOnClass(TypeDeclaration td, EclipseNode node) {\n\t\tif (td.annotations == null) return EMPTY_ANNOTATIONS_ARRAY;\n\t\t\n\t\tList<Annotation> result = new ArrayList<Annotation>();\n\t\tfor (Annotation annotation : td.annotations) {\n\t\t\tTypeReference typeRef = annotation.type;\n\t\t\tif (typeRef != null && typeRef.getTypeName() != null) {\n\t\t\t\tfor (String bn : HandlerUtil.JACKSON_COPY_TO_BUILDER_ANNOTATIONS) {\n\t\t\t\t\tif (typeMatches(bn, node, typeRef)) {\n\t\t\t\t\t\tresult.add(annotation);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result.toArray(EMPTY_ANNOTATIONS_ARRAY);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleLocked.java",
    "content": "/*\n * Copyright (C) 2021-2024 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.eclipse.EcjAugments.ASTNode_handled;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeConstants;\n\nimport lombok.Locked;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.eclipse.DeferUntilPostDiet;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.spi.Provides;\n\n/**\n * Handles the {@code lombok.Locked} annotation for eclipse.\n */\n@Provides\n@DeferUntilPostDiet\n@HandlerPriority(value = 1024) // 2^10; @NonNull must have run first, so that we wrap around the statements generated by it.\npublic class HandleLocked extends EclipseAnnotationHandler<Locked> {\n\tprivate static final String ANNOTATION_NAME = \"@Locked\";\n\tprivate static final char[][] LOCK_TYPE_CLASS = new char[][] { TypeConstants.JAVA, TypeConstants.UTIL,\n\t\t\"concurrent\".toCharArray(), \"locks\".toCharArray(), \"Lock\".toCharArray() };\n\tprivate static final char[][] LOCK_IMPL_CLASS = new char[][] { TypeConstants.JAVA, TypeConstants.UTIL,\n\t\t\"concurrent\".toCharArray(), \"locks\".toCharArray(), \"ReentrantLock\".toCharArray() };\n\t\n\t@Override public void handle(AnnotationValues<Locked> annotation, Annotation source, EclipseNode annotationNode) {\n\t\tString annotationValue = annotation.getInstance().value();\n\t\tHandleLockedUtil.handle(annotationValue, source, annotationNode, ANNOTATION_NAME, LOCK_TYPE_CLASS, LOCK_IMPL_CLASS);\n\t}\n\t\n\t@Override public void preHandle(AnnotationValues<Locked> annotation, Annotation source, EclipseNode annotationNode) {\n\t\tString annotationValue = annotation.getInstance().value();\n\t\tHandleLockedUtil.preHandle(annotationValue, LOCK_TYPE_CLASS, LOCK_IMPL_CLASS, annotationNode);\n\t\t\n\t\tif (hasParsedBody(getAnnotatedMethod(annotationNode))) {\n\t\t\t// This method has a body in diet mode, so we have to handle it now.\n\t\t\thandle(annotation, source, annotationNode);\n\t\t\tASTNode_handled.set(source, true);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleLockedRead.java",
    "content": "/*\n * Copyright (C) 2021-2024 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.eclipse.EcjAugments.ASTNode_handled;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeConstants;\n\nimport lombok.Locked;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.eclipse.DeferUntilPostDiet;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.spi.Provides;\n\n/**\n * Handles the {@code lombok.Locked.Read} annotation for eclipse.\n */\n@Provides\n@DeferUntilPostDiet\n@HandlerPriority(value = 1024) // 2^10; @NonNull must have run first, so that we wrap around the statements generated by it.\npublic class HandleLockedRead extends EclipseAnnotationHandler<Locked.Read> {\n\tprivate static final char[] LOCK_METHOD = \"readLock\".toCharArray();\n\tprivate static final String ANNOTATION_NAME = \"@Locked.Read\";\n\tprivate static final char[][] LOCK_TYPE_CLASS = new char[][] { TypeConstants.JAVA, TypeConstants.UTIL,\n\t\t\"concurrent\".toCharArray(), \"locks\".toCharArray(), \"ReadWriteLock\".toCharArray() };\n\t\tprivate static final char[][] LOCK_IMPL_CLASS = new char[][] { TypeConstants.JAVA, TypeConstants.UTIL,\n\t\t\"concurrent\".toCharArray(), \"locks\".toCharArray(), \"ReentrantReadWriteLock\".toCharArray() };\n\t\t\n\t@Override public void handle(AnnotationValues<Locked.Read> annotation, Annotation source, EclipseNode annotationNode) {\n\t\tString annotationValue = annotation.getInstance().value();\n\t\tHandleLockedUtil.handle(annotationValue, source, annotationNode, ANNOTATION_NAME, LOCK_TYPE_CLASS, LOCK_IMPL_CLASS, LOCK_METHOD);\n\t}\n\t\n\t@Override public void preHandle(AnnotationValues<Locked.Read> annotation, Annotation source, EclipseNode annotationNode) {\n\t\tString annotationValue = annotation.getInstance().value();\n\t\tHandleLockedUtil.preHandle(annotationValue, LOCK_TYPE_CLASS, LOCK_IMPL_CLASS, annotationNode);\n\t\t\n\t\tif (hasParsedBody(getAnnotatedMethod(annotationNode))) {\n\t\t\t// This method has a body in diet mode, so we have to handle it now.\n\t\t\thandle(annotation, source, annotationNode);\n\t\t\tASTNode_handled.set(source, true);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleLockedUtil.java",
    "content": "/*\n * Copyright (C) 2024-2025 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n/* Copyright (C) 2021-2023 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport lombok.ConfigurationKeys;\nimport lombok.core.AST;\nimport lombok.eclipse.EclipseNode;\n\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.AllocationExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.Block;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.FieldReference;\nimport org.eclipse.jdt.internal.compiler.ast.MessageSend;\nimport org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.Reference;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.ThisReference;\nimport org.eclipse.jdt.internal.compiler.ast.TryStatement;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\n\nimport java.lang.reflect.Modifier;\nimport java.util.Arrays;\nimport java.util.concurrent.atomic.AtomicBoolean;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\n/**\n * Container for static utility methods used by the Locked[.Read/Write] annotations for eclipse.\n */\npublic final class HandleLockedUtil {\n\tprivate static final char[] INSTANCE_LOCK_NAME = \"$lock\".toCharArray();\n\tprivate static final char[] STATIC_LOCK_NAME = \"$LOCK\".toCharArray();\n\tprivate static final char[] LOCK_METHOD = \"lock\".toCharArray();\n\tprivate static final char[] UNLOCK_METHOD = \"unlock\".toCharArray();\n\t\n\tprivate HandleLockedUtil() {\n\t\t//Prevent instantiation\n\t}\n\t\n\tpublic static void preHandle(String annotationValue, char[][] lockTypeClass, char[][] lockImplClass, EclipseNode annotationNode) {\n\t\tEclipseNode methodNode = annotationNode.up();\n\t\tif (methodNode == null || methodNode.getKind() != AST.Kind.METHOD || !(methodNode.get() instanceof MethodDeclaration)) return;\n\t\tMethodDeclaration method = (MethodDeclaration) methodNode.get();\n\t\tif (method.isAbstract()) return;\n\t\tEclipseNode typeNode = upToTypeNode(annotationNode);\n\t\tif (isRecord(typeNode)) return;\n\t\t\n\t\tcreateLockField(annotationValue, annotationNode, lockTypeClass, lockImplClass, new AtomicBoolean(method.isStatic()), false);\n\t}\n\t\n\tprivate static char[] createLockField(String name, EclipseNode annotationNode, char[][] lockTypeClass, char[][] lockImplClass, AtomicBoolean isStatic, boolean reportErrors) {\n\t\tchar[] lockName = name.toCharArray();\n\t\t\n\t\tAnnotation source = (Annotation) annotationNode.get();\n\t\tif (lockName.length == 0) {\n\t\t\tlockName = isStatic.get() ? STATIC_LOCK_NAME : INSTANCE_LOCK_NAME;\n\t\t}\n\t\t\n\t\tEclipseNode typeNode = upToTypeNode(annotationNode);\n\t\tMemberExistsResult exists = MemberExistsResult.NOT_EXISTS;\n\t\t\n\t\tQualifiedTypeReference lockType = new QualifiedTypeReference(lockTypeClass, new long[] { 0, 0, 0, 0, 0 });\n\t\t\n\t\tif (typeNode != null && typeNode.get() instanceof TypeDeclaration) {\n\t\t\tTypeDeclaration typeDecl = (TypeDeclaration) typeNode.get();\n\t\t\tif (typeDecl.fields != null) for (FieldDeclaration def : typeDecl.fields) {\n\t\t\t\tchar[] fName = def.name;\n\t\t\t\tif (fName == null) continue;\n\t\t\t\tif (Arrays.equals(fName, lockName)) {\n\t\t\t\t\texists = getGeneratedBy(def) == null ? MemberExistsResult.EXISTS_BY_USER : MemberExistsResult.EXISTS_BY_LOMBOK;\n\t\t\t\t\tboolean st = def.isStatic();\n\t\t\t\t\tif (st != isStatic.get() && exists == MemberExistsResult.EXISTS_BY_LOMBOK) {\n\t\t\t\t\t\tif (reportErrors) annotationNode.addError(String.format(\"The generated field %s does not match the static status of this method\", new String(lockName)));\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tisStatic.set(st);\n\t\t\t\t\t\n\t\t\t\t\tif (exists == MemberExistsResult.EXISTS_BY_LOMBOK && !Arrays.deepEquals(lockType.getTypeName(), def.type.getTypeName())) {\n\t\t\t\t\t\tannotationNode.addError(\"Expected field \" + new String(lockName) + \" to be of type \" + lockType +\n\t\t\t\t\t\t\t\" but got type \" + def.type + \". Did you mix @Locked with @Locked.Read/Write on the same generated field?\");\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (exists == MemberExistsResult.NOT_EXISTS) {\n\t\t\tFieldDeclaration fieldDecl = setGeneratedBy(new FieldDeclaration(lockName, 0, -1), source);\n\t\t\tfieldDecl.declarationSourceEnd = -1;\n\t\t\t\n\t\t\tfieldDecl.modifiers = (isStatic.get() ? Modifier.STATIC : 0) | Modifier.FINAL | Modifier.PRIVATE;\n\t\t\t\n\t\t\tAllocationExpression lockAlloc = setGeneratedBy(new AllocationExpression(), source);\n\t\t\tlockAlloc.type = setGeneratedBy(new QualifiedTypeReference(lockImplClass, new long[] { 0, 0, 0, 0, 0 }), source);\n\t\t\tfieldDecl.type = setGeneratedBy(new QualifiedTypeReference(lockTypeClass, new long[] { 0, 0, 0, 0, 0 }), source);\n\t\t\tfieldDecl.initialization = lockAlloc;\n\t\t\tinjectFieldAndMarkGenerated(annotationNode.up().up(), fieldDecl);\n\t\t}\n\t\t\n\t\treturn lockName;\n\t}\n\t\n\t/**\n\t * See {@link #handle(String, Annotation, EclipseNode, String, char[][], char[])} for\n\t * {@code lockableMethodName = null}.\n\t */\n\tpublic static void handle(String annotationValue, Annotation ast, EclipseNode annotationNode, String annotationName, char[][] lockTypeClass, char[][] lockImplClass) {\n\t\thandle(annotationValue, ast, annotationNode, annotationName, lockTypeClass, lockImplClass, null);\n\t}\n\t\n\t/**\n\t * Called when an annotation is found that is likely to match the annotation you're interested in.\n\t *\n\t * Be aware that you'll be called for ANY annotation node in the source that looks like a match. There is,\n\t * for example, no guarantee that the annotation node belongs to a method, even if you set your\n\t * TargetType in the annotation to methods only.\n\t *\n\t * @param annotationValue The value of the annotation. This will be the name of the object used for locking.\n\t * @param source The Eclipse AST node representing the annotation.\n\t * @param annotationNode The Lombok AST wrapper around the 'ast' parameter. You can use this object\n\t * to travel back up the chain (something javac AST can't do) to the parent of the annotation, as well\n\t * as access useful methods such as generating warnings or errors focused on the annotation.\n\t * @param annotationName The name of the annotation to use when referencing it in errors.\n\t * @param lockTypeClass The fully qualified type of the variable when generating a lock to use.\n\t * @param lockImplClass Call the constructor of this fully qualified classname to generate a lock to use.\n\t * @param lockableMethodName The name of the method in the {@code lockClass} that returns a\n\t * {@link java.util.concurrent.locks.Lock} object. When this is {@code null}, it is assumed that {@code lockClass}\n\t * itself can be locked/unlocked.\n\t */\n\tpublic static void handle(String annotationValue, Annotation source, EclipseNode annotationNode,\n\t\tString annotationName, char[][] lockTypeClass, char[][] lockImplClass, char[] lockableMethodName) {\n\t\t\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.LOCKED_FLAG_USAGE, annotationName);\n\t\t\n\t\tint p1 = source.sourceStart -1;\n\t\tint p2 = source.sourceStart -2;\n\t\tlong pos = (((long) p1) << 32) | p2;\n\t\t\n\t\tEclipseNode methodNode = annotationNode.up();\n\t\tif (methodNode == null || methodNode.getKind() != AST.Kind.METHOD || !(methodNode.get() instanceof MethodDeclaration)) {\n\t\t\tannotationNode.addError(annotationName + \" is legal only on methods.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tMethodDeclaration method = (MethodDeclaration) methodNode.get();\n\t\tif (method.isAbstract()) {\n\t\t\tannotationNode.addError(annotationName + \" is legal only on concrete methods.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tEclipseNode typeNode = upToTypeNode(annotationNode);\n\t\tif (!isClassOrEnum(typeNode)) {\n\t\t\tannotationNode.addError(annotationName + \" is legal only on methods in classes and enums.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tAtomicBoolean isStatic = new AtomicBoolean(method.isStatic());\n\t\tchar[] lockName = createLockField(annotationValue, annotationNode, lockTypeClass, lockImplClass, isStatic, true);\n\t\tif (lockName == null) return;\n\t\tif (method.statements == null) return;\n\t\t\n\t\tBlock block = new Block(0);\n\t\tblock.statements = method.statements;\n\t\tsetGeneratedBy(block, source);\n\t\t\n\t\t// Positions for in-method generated nodes are special\n\t\tblock.sourceEnd = method.bodyEnd;\n\t\tblock.sourceStart = method.bodyStart;\n\t\t\n\t\tStatement acquireLock = getLockingStatement(source, typeNode, LOCK_METHOD, lockName, lockableMethodName, isStatic.get(), p1, p2, pos);\n\t\tStatement unLock = getLockingStatement(source, typeNode, UNLOCK_METHOD, lockName, lockableMethodName, isStatic.get(), p1, p2, pos);\n\t\t\n\t\tTryStatement tryStatement = new TryStatement();\n\t\ttryStatement.tryBlock = block;\n\t\ttryStatement.finallyBlock = new Block(0);\n\t\ttryStatement.finallyBlock.statements = new Statement[] { unLock };\n\t\t\n\t\tmethod.statements = new Statement[] { acquireLock, tryStatement };\n\t\t\n\t\t// Positions for in-method generated nodes are special\n\t\tmethod.statements[0].sourceEnd = method.bodyEnd;\n\t\tmethod.statements[0].sourceStart = method.bodyStart;\n\t\t\n\t\tmethodNode.rebuild();\n\t}\n\t\n\tprivate static Statement getLockingStatement(ASTNode source, EclipseNode typeNode, char[] lockMethod,\n\t\tchar[] lockableObjectName, char[] lockableMethodName, boolean isStatic, int p1, int p2, long pos) {\n\t\t\n\t\tMessageSend lockStat = setGeneratedBy(new MessageSend(), source);\n\t\tlockStat.receiver = getLockable(source, typeNode, lockableObjectName, lockableMethodName, isStatic, p1, p2, pos);\n\t\tlockStat.selector = lockMethod;\n\t\tlockStat.nameSourcePosition = pos;\n\t\tlockStat.sourceStart = p1;\n\t\tlockStat.sourceEnd = lockStat.statementEnd = p2;\n\t\treturn lockStat;\n\t}\n\t\n\tprivate static Expression getLockable(ASTNode source, EclipseNode typeNode, char[] lockName,\n\t\tchar[] lockableMethodName, boolean isStatic, int p1, int p2, long pos) {\n\t\t\n\t\tReference lockVariable;\n\t\tif (isStatic) {\n\t\t\tchar[][] n = getQualifiedInnerName(typeNode, lockName);\n\t\t\tlong[] ps = new long[n.length];\n\t\t\tArrays.fill(ps, pos);\n\t\t\tlockVariable = new QualifiedNameReference(n, ps, p1, p2);\n\t\t} else {\n\t\t\tlockVariable = new FieldReference(lockName, pos);\n\t\t\tThisReference thisReference = new ThisReference(p1, p2);\n\t\t\tsetGeneratedBy(thisReference, source);\n\t\t\t((FieldReference) lockVariable).receiver = thisReference;\n\t\t}\n\t\tsetGeneratedBy(lockVariable, source);\n\t\t\n\t\tExpression lockable;\n\t\tif (lockableMethodName == null) lockable = lockVariable;\n\t\telse {\n\t\t\tlockable = new MessageSend();\n\t\t\t((MessageSend) lockable).receiver = lockVariable;\n\t\t\t((MessageSend) lockable).selector = lockableMethodName;\n\t\t\t((MessageSend) lockable).nameSourcePosition = pos;\n\t\t\tlockable.sourceStart = p1;\n\t\t\tlockable.sourceEnd = lockable.statementEnd = p2;\n\t\t}\n\t\treturn setGeneratedBy(lockable, source);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleLockedWrite.java",
    "content": "/*\n * Copyright (C) 2021-2024 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.eclipse.EcjAugments.ASTNode_handled;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeConstants;\n\nimport lombok.Locked;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.eclipse.DeferUntilPostDiet;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.spi.Provides;\n\n/**\n * Handles the {@code lombok.Locked.Write} annotation for eclipse.\n */\n@Provides\n@DeferUntilPostDiet\n@HandlerPriority(value = 1024) // 2^10; @NonNull must have run first, so that we wrap around the statements generated by it.\npublic class HandleLockedWrite extends EclipseAnnotationHandler<Locked.Write> {\n\tprivate static final char[] LOCK_METHOD = \"writeLock\".toCharArray();\n\tprivate static final String ANNOTATION_NAME = \"@Locked.Write\";\n\tprivate static final char[][] LOCK_TYPE_CLASS = new char[][] { TypeConstants.JAVA, TypeConstants.UTIL,\n\t\t\"concurrent\".toCharArray(), \"locks\".toCharArray(), \"ReadWriteLock\".toCharArray() };\n\tprivate static final char[][] LOCK_IMPL_CLASS = new char[][] { TypeConstants.JAVA, TypeConstants.UTIL,\n\t\t\"concurrent\".toCharArray(), \"locks\".toCharArray(), \"ReentrantReadWriteLock\".toCharArray() };\n\n\t@Override public void handle(AnnotationValues<Locked.Write> annotation, Annotation source, EclipseNode annotationNode) {\n\t\tString annotationValue = annotation.getInstance().value();\n\t\tHandleLockedUtil.handle(annotationValue, source, annotationNode, ANNOTATION_NAME, LOCK_TYPE_CLASS, LOCK_IMPL_CLASS, LOCK_METHOD);\n\t}\n\n\t@Override public void preHandle(AnnotationValues<Locked.Write> annotation, Annotation source, EclipseNode annotationNode) {\n\t\tString annotationValue = annotation.getInstance().value();\n\t\tHandleLockedUtil.preHandle(annotationValue, LOCK_TYPE_CLASS, LOCK_IMPL_CLASS, annotationNode);\n\t\t\n\t\tif (hasParsedBody(getAnnotatedMethod(annotationNode))) {\n\t\t\t// This method has a body in diet mode, so we have to handle it now.\n\t\t\thandle(annotation, source, annotationNode);\n\t\t\tASTNode_handled.set(source, true);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleLog.java",
    "content": "/*\n * Copyright (C) 2010-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.handleFlagUsage;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport java.lang.reflect.Modifier;\nimport java.util.List;\n\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.ClassLiteralAccess;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.MessageSend;\nimport org.eclipse.jdt.internal.compiler.ast.NullLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.SingleTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.StringLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\nimport org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;\n\nimport lombok.AccessLevel;\nimport lombok.ConfigurationKeys;\nimport lombok.core.AnnotationValues;\nimport lombok.core.configuration.IdentifierName;\nimport lombok.core.configuration.LogDeclaration;\nimport lombok.core.configuration.LogDeclaration.LogFactoryParameter;\nimport lombok.core.handlers.LoggingFramework;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.eclipse.handlers.EclipseHandlerUtil.MemberExistsResult;\nimport lombok.spi.Provides;\n\npublic class HandleLog {\n\tprivate static final IdentifierName LOG = IdentifierName.valueOf(\"log\");\n\t\n\tprivate HandleLog() {\n\t\tthrow new UnsupportedOperationException();\n\t}\n\t\n\tpublic static void processAnnotation(LoggingFramework framework, AccessLevel access, AnnotationValues<? extends java.lang.annotation.Annotation> annotation, Annotation source, EclipseNode annotationNode) {\n\t\tEclipseNode owner = annotationNode.up();\n\t\t\n\t\tswitch (owner.getKind()) {\n\t\tcase TYPE:\n\t\t\tIdentifierName logFieldName = annotationNode.getAst().readConfiguration(ConfigurationKeys.LOG_ANY_FIELD_NAME);\n\t\t\tif (logFieldName == null) logFieldName = LOG;\n\t\t\t\n\t\t\tboolean useStatic = !Boolean.FALSE.equals(annotationNode.getAst().readConfiguration(ConfigurationKeys.LOG_ANY_FIELD_IS_STATIC));\n\t\t\t\n\t\t\tTypeDeclaration typeDecl = null;\n\t\t\tif (owner.get() instanceof TypeDeclaration) typeDecl = (TypeDeclaration) owner.get();\n\t\t\tint modifiers = typeDecl == null ? 0 : typeDecl.modifiers;\n\t\t\t\n\t\t\tboolean notAClass = (modifiers & (ClassFileConstants.AccInterface | ClassFileConstants.AccAnnotation)) != 0;\n\t\t\t\n\t\t\tif (typeDecl == null || notAClass) {\n\t\t\t\tannotationNode.addError(framework.getAnnotationAsString() + \" is legal only on classes and enums.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (fieldExists(logFieldName.getName(), owner) != MemberExistsResult.NOT_EXISTS) {\n\t\t\t\tannotationNode.addWarning(\"Field '\" + logFieldName + \"' already exists.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (isRecord(owner) && !useStatic) {\n\t\t\t\tannotationNode.addError(\"Logger fields must be static in records.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (useStatic && !isStaticAllowed(owner)) {\n\t\t\t\tannotationNode.addError(framework.getAnnotationAsString() + \" is not supported on non-static nested classes.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tObject valueGuess = annotation.getValueGuess(\"topic\");\n\t\t\tExpression loggerTopic = (Expression) annotation.getActualExpression(\"topic\");\n\t\t\t\n\t\t\tif (valueGuess instanceof String && ((String) valueGuess).trim().isEmpty()) loggerTopic = null;\n\t\t\t\n\t\t\tif (framework.getDeclaration().getParametersWithTopic() == null && loggerTopic != null) {\n\t\t\t\tannotationNode.addError(framework.getAnnotationAsString() + \" does not allow a topic.\");\n\t\t\t\tloggerTopic = null;\n\t\t\t}\n\t\t\tif (framework.getDeclaration().getParametersWithoutTopic() == null && loggerTopic == null) {\n\t\t\t\tannotationNode.addError(framework.getAnnotationAsString() + \" requires a topic.\");\n\t\t\t\tloggerTopic = new StringLiteral(new char[]{}, 0, 0, 0);\n\t\t\t}\n\t\t\t\n\t\t\tif (access == AccessLevel.NONE) break;\n\t\t\t\n\t\t\tClassLiteralAccess loggingType = selfType(owner, source);\n\t\t\tFieldDeclaration fieldDeclaration = createField(framework, access, source, loggingType, logFieldName.getName(), useStatic, loggerTopic);\n\t\t\tfieldDeclaration.traverse(new SetGeneratedByVisitor(source), typeDecl.staticInitializerScope);\n\t\t\tinjectFieldAndMarkGenerated(owner, fieldDeclaration);\n\t\t\towner.rebuild();\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tpublic static ClassLiteralAccess selfType(EclipseNode type, Annotation source) {\n\t\tint pS = source.sourceStart, pE = source.sourceEnd;\n\t\tlong p = (long) pS << 32 | pE;\n\t\t\n\t\tTypeDeclaration typeDeclaration = (TypeDeclaration)type.get();\n\t\tTypeReference typeReference = new SingleTypeReference(typeDeclaration.name, p);\n\t\tsetGeneratedBy(typeReference, source);\n\t\t\n\t\tClassLiteralAccess result = new ClassLiteralAccess(source.sourceEnd, typeReference);\n\t\tsetGeneratedBy(result, source);\n\t\t\n\t\treturn result;\n\t}\n\t\n\tprivate static FieldDeclaration createField(LoggingFramework framework, AccessLevel access, Annotation source, ClassLiteralAccess loggingType, String logFieldName, boolean useStatic, Expression loggerTopic) {\n\t\tint pS = source.sourceStart, pE = source.sourceEnd;\n\t\tlong p = (long) pS << 32 | pE;\n\t\t\n\t\t// private static final <loggerType> log = <factoryMethod>(<parameter>);\n\t\tFieldDeclaration fieldDecl = new FieldDeclaration(logFieldName.toCharArray(), 0, -1);\n\t\tsetGeneratedBy(fieldDecl, source);\n\t\tfieldDecl.declarationSourceEnd = -1;\n\t\tfieldDecl.modifiers = toEclipseModifier(access) | (useStatic ? Modifier.STATIC : 0) | Modifier.FINAL;\n\t\t\n\t\tLogDeclaration logDeclaration = framework.getDeclaration();\n\t\tfieldDecl.type = createTypeReference(logDeclaration.getLoggerType().getName(), source);\n\t\t\n\t\tMessageSend factoryMethodCall = new MessageSend();\n\t\tsetGeneratedBy(factoryMethodCall, source);\n\t\t\n\t\tfactoryMethodCall.receiver = createNameReference(logDeclaration.getLoggerFactoryType().getName(), source);\n\t\tfactoryMethodCall.selector = logDeclaration.getLoggerFactoryMethod().getCharArray();\n\t\t\n\t\tList<LogFactoryParameter> parameters = loggerTopic != null ? logDeclaration.getParametersWithTopic() : logDeclaration.getParametersWithoutTopic();\n\t\tfactoryMethodCall.arguments = createFactoryParameters(loggingType, source, parameters, loggerTopic);\n\t\tfactoryMethodCall.nameSourcePosition = p;\n\t\tfactoryMethodCall.sourceStart = pS;\n\t\tfactoryMethodCall.sourceEnd = factoryMethodCall.statementEnd = pE;\n\t\t\n\t\tfieldDecl.initialization = factoryMethodCall;\n\t\t\n\t\treturn fieldDecl;\n\t}\n\t\n\tprivate static final Expression[] createFactoryParameters(ClassLiteralAccess loggingType, Annotation source, List<LogFactoryParameter> parameters, Expression loggerTopic) {\n\t\tExpression[] expressions = new Expression[parameters.size()];\n\t\tint pS = source.sourceStart, pE = source.sourceEnd;\n\t\t\n\t\tfor (int i = 0; i < parameters.size(); i++) {\n\t\t\tLogFactoryParameter parameter = parameters.get(i);\n\t\t\t\n\t\t\tswitch(parameter) {\n\t\t\tcase TYPE:\n\t\t\t\texpressions[i] = createFactoryTypeParameter(loggingType, source);\n\t\t\t\tbreak;\n\t\t\tcase NAME:\n\t\t\t\tlong p = (long) pS << 32 | pE;\n\t\t\t\t\n\t\t\t\tMessageSend factoryParameterCall = new MessageSend();\n\t\t\t\tsetGeneratedBy(factoryParameterCall, source);\n\t\t\t\t\n\t\t\t\tfactoryParameterCall.receiver = createFactoryTypeParameter(loggingType, source);\n\t\t\t\tfactoryParameterCall.selector = \"getName\".toCharArray();\n\t\t\t\t\n\t\t\t\tfactoryParameterCall.nameSourcePosition = p;\n\t\t\t\tfactoryParameterCall.sourceStart = pS;\n\t\t\t\tfactoryParameterCall.sourceEnd = factoryParameterCall.statementEnd = pE;\n\t\t\t\t\n\t\t\t\texpressions[i] = factoryParameterCall;\n\t\t\t\tbreak;\n\t\t\tcase TOPIC:\n\t\t\t\texpressions[i] = EclipseHandlerUtil.copyAnnotationMemberValue(loggerTopic);\n\t\t\t\tbreak;\n\t\t\tcase NULL:\n\t\t\t\texpressions[i] = new NullLiteral(pS, pE);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new IllegalStateException(\"Unknown logger factory parameter type: \" + parameter);\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn expressions;\n\t}\n\t\n\tprivate static final Expression createFactoryTypeParameter(ClassLiteralAccess loggingType, Annotation source) {\n\t\tTypeReference copy = copyType(loggingType.type, source);\n\t\tClassLiteralAccess result = new ClassLiteralAccess(source.sourceEnd, copy);\n\t\tsetGeneratedBy(result, source);\n\t\treturn result;\n\t}\n\t\n\t/**\n\t * Handles the {@link lombok.extern.apachecommons.CommonsLog} annotation for Eclipse.\n\t */\n\t@Provides\n\tpublic static class HandleCommonsLog extends EclipseAnnotationHandler<lombok.extern.apachecommons.CommonsLog> {\n\t\t@Override public void handle(AnnotationValues<lombok.extern.apachecommons.CommonsLog> annotation, Annotation source, EclipseNode annotationNode) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.LOG_COMMONS_FLAG_USAGE, \"@apachecommons.CommonsLog\", ConfigurationKeys.LOG_ANY_FLAG_USAGE, \"any @Log\");\n\t\t\tprocessAnnotation(LoggingFramework.COMMONS, annotation.getInstance().access(), annotation, source, annotationNode);\n\t\t}\n\t}\n\t\n\t/**\n\t * Handles the {@link lombok.extern.java.Log} annotation for Eclipse.\n\t */\n\t@Provides\n\tpublic static class HandleJulLog extends EclipseAnnotationHandler<lombok.extern.java.Log> {\n\t\t@Override public void handle(AnnotationValues<lombok.extern.java.Log> annotation, Annotation source, EclipseNode annotationNode) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.LOG_JUL_FLAG_USAGE, \"@java.Log\", ConfigurationKeys.LOG_ANY_FLAG_USAGE, \"any @Log\");\n\t\t\tprocessAnnotation(LoggingFramework.JUL, annotation.getInstance().access(), annotation, source, annotationNode);\n\t\t}\n\t}\n\t\n\t/**\n\t * Handles the {@link lombok.extern.log4j.Log4j} annotation for Eclipse.\n\t */\n\t@Provides\n\tpublic static class HandleLog4jLog extends EclipseAnnotationHandler<lombok.extern.log4j.Log4j> {\n\t\t@Override public void handle(AnnotationValues<lombok.extern.log4j.Log4j> annotation, Annotation source, EclipseNode annotationNode) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.LOG_LOG4J_FLAG_USAGE, \"@Log4j\", ConfigurationKeys.LOG_ANY_FLAG_USAGE, \"any @Log\");\n\t\t\tprocessAnnotation(LoggingFramework.LOG4J, annotation.getInstance().access(), annotation, source, annotationNode);\n\t\t}\n\t}\n\t\n\t/**\n\t * Handles the {@link lombok.extern.log4j.Log4j2} annotation for Eclipse.\n\t */\n\t@Provides\n\tpublic static class HandleLog4j2Log extends EclipseAnnotationHandler<lombok.extern.log4j.Log4j2> {\n\t\t@Override public void handle(AnnotationValues<lombok.extern.log4j.Log4j2> annotation, Annotation source, EclipseNode annotationNode) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.LOG_LOG4J2_FLAG_USAGE, \"@Log4j2\", ConfigurationKeys.LOG_ANY_FLAG_USAGE, \"any @Log\");\n\t\t\tprocessAnnotation(LoggingFramework.LOG4J2, annotation.getInstance().access(), annotation, source, annotationNode);\n\t\t}\n\t}\n\t\n\t/**\n\t * Handles the {@link lombok.extern.slf4j.Slf4j} annotation for Eclipse.\n\t */\n\t@Provides\n\tpublic static class HandleSlf4jLog extends EclipseAnnotationHandler<lombok.extern.slf4j.Slf4j> {\n\t\t@Override public void handle(AnnotationValues<lombok.extern.slf4j.Slf4j> annotation, Annotation source, EclipseNode annotationNode) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.LOG_SLF4J_FLAG_USAGE, \"@Slf4j\", ConfigurationKeys.LOG_ANY_FLAG_USAGE, \"any @Log\");\n\t\t\tprocessAnnotation(LoggingFramework.SLF4J, annotation.getInstance().access(), annotation, source, annotationNode);\n\t\t}\n\t}\n\t\n\t/**\n\t * Handles the {@link lombok.extern.slf4j.XSlf4j} annotation for Eclipse.\n\t */\n\t@Provides\n\tpublic static class HandleXSlf4jLog extends EclipseAnnotationHandler<lombok.extern.slf4j.XSlf4j> {\n\t\t@Override public void handle(AnnotationValues<lombok.extern.slf4j.XSlf4j> annotation, Annotation source, EclipseNode annotationNode) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.LOG_XSLF4J_FLAG_USAGE, \"@XSlf4j\", ConfigurationKeys.LOG_ANY_FLAG_USAGE, \"any @Log\");\n\t\t\tprocessAnnotation(LoggingFramework.XSLF4J, annotation.getInstance().access(), annotation, source, annotationNode);\n\t\t}\n\t}\n\t\n\t/**\n\t * Handles the {@link lombok.extern.jbosslog.JBossLog} annotation for Eclipse.\n\t */\n\t@Provides\n\tpublic static class HandleJBossLog extends EclipseAnnotationHandler<lombok.extern.jbosslog.JBossLog> {\n\t\t@Override public void handle(AnnotationValues<lombok.extern.jbosslog.JBossLog> annotation, Annotation source, EclipseNode annotationNode) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.LOG_JBOSSLOG_FLAG_USAGE, \"@JBossLog\", ConfigurationKeys.LOG_ANY_FLAG_USAGE, \"any @Log\");\n\t\t\tprocessAnnotation(LoggingFramework.JBOSSLOG, annotation.getInstance().access(), annotation, source, annotationNode);\n\t\t}\n\t}\n\t\n\t/**\n\t * Handles the {@link lombok.extern.flogger.Flogger} annotation for Eclipse.\n\t */\n\t@Provides\n\tpublic static class HandleFloggerLog extends EclipseAnnotationHandler<lombok.extern.flogger.Flogger> {\n\t\t@Override public void handle(AnnotationValues<lombok.extern.flogger.Flogger> annotation, Annotation source, EclipseNode annotationNode) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.LOG_FLOGGER_FLAG_USAGE, \"@Flogger\", ConfigurationKeys.LOG_ANY_FLAG_USAGE, \"any @Log\");\n\t\t\tprocessAnnotation(LoggingFramework.FLOGGER, annotation.getInstance().access(), annotation, source, annotationNode);\n\t\t}\n\t}\n\t\n\t/**\n\t * Handles the {@link lombok.CustomLog} annotation for Eclipse.\n\t */\n\t@Provides\n\tpublic static class HandleCustomLog extends EclipseAnnotationHandler<lombok.CustomLog> {\n\t\t@Override public void handle(AnnotationValues<lombok.CustomLog> annotation, Annotation source, EclipseNode annotationNode) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.LOG_CUSTOM_FLAG_USAGE, \"@CustomLog\", ConfigurationKeys.LOG_ANY_FLAG_USAGE, \"any @Log\");\n\t\t\tLogDeclaration logDeclaration = annotationNode.getAst().readConfiguration(ConfigurationKeys.LOG_CUSTOM_DECLARATION);\n\t\t\tif (logDeclaration == null) {\n\t\t\t\tannotationNode.addError(\"The @CustomLog annotation is not configured; please set lombok.log.custom.declaration in lombok.config.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tLoggingFramework framework = new LoggingFramework(lombok.CustomLog.class, logDeclaration);\n\t\t\tprocessAnnotation(framework, annotation.getInstance().access(), annotation, source, annotationNode);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleNonNull.java",
    "content": "/*\n * Copyright (C) 2013-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.handleFlagUsage;\nimport static lombok.eclipse.Eclipse.*;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\n\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.Argument;\nimport org.eclipse.jdt.internal.compiler.ast.AssertStatement;\nimport org.eclipse.jdt.internal.compiler.ast.Assignment;\nimport org.eclipse.jdt.internal.compiler.ast.Block;\nimport org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.EqualExpression;\nimport org.eclipse.jdt.internal.compiler.ast.ExplicitConstructorCall;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.FieldReference;\nimport org.eclipse.jdt.internal.compiler.ast.IfStatement;\nimport org.eclipse.jdt.internal.compiler.ast.MessageSend;\nimport org.eclipse.jdt.internal.compiler.ast.NullLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.SingleNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.SingleTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.SynchronizedStatement;\nimport org.eclipse.jdt.internal.compiler.ast.ThisReference;\nimport org.eclipse.jdt.internal.compiler.ast.ThrowStatement;\nimport org.eclipse.jdt.internal.compiler.ast.TryStatement;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\nimport org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;\n\nimport lombok.ConfigurationKeys;\nimport lombok.NonNull;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.eclipse.EcjAugments;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.spi.Provides;\n\n@Provides\n@HandlerPriority(value = 512) // 2^9; onParameter=@__(@NonNull) has to run first.\npublic class HandleNonNull extends EclipseAnnotationHandler<NonNull> {\n\tprivate static final char[] REQUIRE_NON_NULL = \"requireNonNull\".toCharArray();\n\tprivate static final char[] CHECK_NOT_NULL = \"checkNotNull\".toCharArray();\n\t\n\tpublic static final HandleNonNull INSTANCE = new HandleNonNull();\n\t\n\tpublic void fix(EclipseNode method) {\n\t\tfor (EclipseNode m : method.down()) {\n\t\t\tif (m.getKind() != Kind.ARGUMENT) continue;\n\t\t\tfor (EclipseNode c : m.down()) {\n\t\t\t\tif (c.getKind() == Kind.ANNOTATION) {\n\t\t\t\t\tif (annotationTypeMatches(NonNull.class, c)) {\n\t\t\t\t\t\thandle0((Annotation) c.get(), c, true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate List<FieldDeclaration> getRecordComponents(EclipseNode typeNode) {\n\t\tList<FieldDeclaration> list = new ArrayList<FieldDeclaration>();\n\t\t\n\t\tfor (EclipseNode child : typeNode.down()) {\n\t\t\tif (child.getKind() == Kind.FIELD) {\n\t\t\t\tFieldDeclaration fd = (FieldDeclaration) child.get();\n\t\t\t\tif ((fd.modifiers & AccRecord) != 0) list.add(fd);\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn list;\n\t}\n\t\n\tprivate EclipseNode addCompactConstructorIfNeeded(EclipseNode typeNode, EclipseNode annotationNode) {\n\t\t// explicit Compact Constructor has bits set: Bit32, IsCanonicalConstructor (10).\n\t\t// implicit Compact Constructor has bits set: Bit32, IsCanonicalConstructor (10), and IsImplicit (11).\n\t\t// explicit constructor with long-form shows up as a normal constructor (Bit32 set, that's all), but the\n\t\t//   implicit CC is then also present and will presumably be stripped out in some later phase.\n\t\t\n\t\tEclipseNode toRemove = null;\n\t\tEclipseNode existingCompactConstructor = null;\n\t\tList<FieldDeclaration> recordComponents = null;\n\t\tfor (EclipseNode child : typeNode.down()) {\n\t\t\tif (!(child.get() instanceof ConstructorDeclaration)) continue;\n\t\t\tConstructorDeclaration cd = (ConstructorDeclaration) child.get();\n\t\t\tif ((cd.bits & IsCanonicalConstructor) != 0) {\n\t\t\t\tif ((cd.bits & IsImplicit) != 0) {\n\t\t\t\t\ttoRemove = child;\n\t\t\t\t} else {\n\t\t\t\t\texistingCompactConstructor = child;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If this constructor has exact matching types vs. the record components,\n\t\t\t\t// this is the canonical constructor in long form and we should not generate one.\n\t\t\t\t\n\t\t\t\tif (recordComponents == null) recordComponents = getRecordComponents(typeNode);\n\t\t\t\tint argLength = cd.arguments == null ? 0 : cd.arguments.length;\n\t\t\t\tint compLength = recordComponents.size();\n\t\t\t\tboolean isCanonical = argLength == compLength;\n\t\t\t\tif (isCanonical) top: for (int i = 0; i < argLength; i++) {\n\t\t\t\t\tTypeReference a = recordComponents.get(i).type;\n\t\t\t\t\tTypeReference b = cd.arguments[i] == null ? null : cd.arguments[i].type;\n\t\t\t\t\t// technically this won't match e.g. `java.lang.String` to just `String`;\n\t\t\t\t\t// to use this feature you'll need to use the same way to write it, which seems\n\t\t\t\t\t// like a fair requirement.\n\t\t\t\t\tchar[][] ta = getRawTypeName(a);\n\t\t\t\t\tchar[][] tb = getRawTypeName(b);\n\t\t\t\t\tif (ta == null || tb == null || ta.length != tb.length) {\n\t\t\t\t\t\tisCanonical = false;\n\t\t\t\t\t\tbreak top;\n\t\t\t\t\t}\n\t\t\t\t\tfor (int j = 0; j < ta.length; j++) {\n\t\t\t\t\t\tif (!Arrays.equals(ta[j], tb[j])) {\n\t\t\t\t\t\t\tisCanonical = false;\n\t\t\t\t\t\t\tbreak top;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (isCanonical) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (existingCompactConstructor != null) return existingCompactConstructor;\n\t\tint posToInsert = -1;\n\t\tTypeDeclaration td = (TypeDeclaration) typeNode.get();\n\t\tif (toRemove != null) {\n\t\t\tint idxToRemove = -1;\n\t\t\tfor (int i = 0; i < td.methods.length; i++) {\n\t\t\t\tif (td.methods[i] == toRemove.get()) idxToRemove = i;\n\t\t\t}\n\t\t\tif (idxToRemove != -1) {\n\t\t\t\tSystem.arraycopy(td.methods, idxToRemove + 1, td.methods, idxToRemove, td.methods.length - idxToRemove - 1);\n\t\t\t\tposToInsert = td.methods.length - 1;\n\t\t\t\ttypeNode.removeChild(toRemove);\n\t\t\t}\n\t\t}\n\t\tif (posToInsert == -1) {\n\t\t\tif (td.methods == null) {\n\t\t\t\ttd.methods = new AbstractMethodDeclaration[1];\n\t\t\t\tposToInsert = 0;\n\t\t\t} else {\n\t\t\t\tposToInsert = td.methods.length;\n\t\t\t\tAbstractMethodDeclaration[] na = new AbstractMethodDeclaration[posToInsert + 1];\n\t\t\t\tSystem.arraycopy(td.methods, 0, na, 0, posToInsert);\n\t\t\t\ttd.methods = na;\n\t\t\t}\n\t\t}\n\t\t\n\t\tConstructorDeclaration cd = new ConstructorDeclaration(((CompilationUnitDeclaration) typeNode.top().get()).compilationResult);\n\t\tcd.modifiers = ClassFileConstants.AccPublic;\n\t\tcd.bits = ASTNode.Bit32 | ECLIPSE_DO_NOT_TOUCH_FLAG | IsCanonicalConstructor;\n\t\tcd.selector = td.name;\n\t\tcd.constructorCall = new ExplicitConstructorCall(ExplicitConstructorCall.ImplicitSuper);\n\t\tif (recordComponents == null) recordComponents = getRecordComponents(typeNode);\n\t\tcd.arguments = new Argument[recordComponents.size()];\n\t\tcd.statements = new Statement[recordComponents.size()];\n\t\tcd.bits = IsCanonicalConstructor;\n\t\t\n\t\tfor (int i = 0; i < cd.arguments.length; i++) {\n\t\t\tFieldDeclaration cmp = recordComponents.get(i);\n\t\t\tcd.arguments[i] = new Argument(cmp.name, cmp.sourceStart, cmp.type, cmp.modifiers);\n\t\t\tcd.arguments[i].bits = ASTNode.IsArgument | ASTNode.IgnoreRawTypeCheck | ASTNode.IsReachable;\n\t\t\tcd.arguments[i].annotations = cmp.annotations;\n\t\t\tFieldReference lhs = new FieldReference(cmp.name, 0);\n\t\t\tlhs.receiver = new ThisReference(0, 0);\n\t\t\tSingleNameReference rhs = new SingleNameReference(cmp.name, 0);\n\t\t\tcd.statements[i] = new Assignment(lhs, rhs, cmp.sourceEnd);\n\t\t}\n\t\t\n\t\tsetGeneratedBy(cd, annotationNode.get());\n\t\tfor (int i = 0; i < cd.arguments.length; i++) {\n\t\t\tFieldDeclaration cmp = recordComponents.get(i);\n\t\t\tcd.arguments[i].sourceStart = cmp.sourceStart;\n\t\t\tcd.arguments[i].sourceEnd = cmp.sourceStart;\n\t\t\tcd.arguments[i].declarationSourceEnd = cmp.sourceStart;\n\t\t\tcd.arguments[i].declarationEnd = cmp.sourceStart;\n\t\t}\n\t\t\n\t\ttd.methods[posToInsert] = cd;\n\t\tcd.annotations = addSuppressWarningsAll(typeNode, cd, cd.annotations);\n\t\tcd.annotations = addGenerated(typeNode, cd, cd.annotations);\n\t\treturn typeNode.add(cd, Kind.METHOD);\n\t}\n\t\n\tprivate static char[][] getRawTypeName(TypeReference a) {\n\t\tif (a instanceof QualifiedTypeReference) return ((QualifiedTypeReference) a).tokens;\n\t\tif (a instanceof SingleTypeReference) return new char[][] {((SingleTypeReference) a).token};\n\t\treturn null;\n\t}\n\t\n\t@Override public void handle(AnnotationValues<NonNull> annotation, Annotation ast, EclipseNode annotationNode) {\n\t\t// Generating new methods is only possible during diet parse but modifying existing methods requires a full parse.\n\t\t// As we need both for @NonNull we reset the handled flag during diet parse.\n\t\t\n\t\tif (!annotationNode.isCompleteParse()) {\n\t\t\tfinal EclipseNode node;\n\t\t\tif (annotationNode.up().getKind() == Kind.TYPE_USE) {\n\t\t\t\tnode = annotationNode.directUp().directUp();\n\t\t\t} else {\n\t\t\t\tnode = annotationNode.up();\n\t\t\t}\n\t\t\t\n\t\t\tif (node.getKind() == Kind.FIELD) {\n\t\t\t\t//Check if this is a record and we need to generate the compact form constructor.\n\t\t\t\tEclipseNode typeNode = node.up();\n\t\t\t\tif (typeNode.getKind() == Kind.TYPE) {\n\t\t\t\t\tif (isRecord(typeNode)) {\n\t\t\t\t\t\taddCompactConstructorIfNeeded(typeNode, annotationNode);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tEcjAugments.ASTNode_handled.clear(ast);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\thandle0(ast, annotationNode, false);\n\t}\n\t\n\tprivate EclipseNode findCompactConstructor(EclipseNode typeNode) {\n\t\tfor (EclipseNode child : typeNode.down()) {\n\t\t\tif (!(child.get() instanceof ConstructorDeclaration)) continue;\n\t\t\tConstructorDeclaration cd = (ConstructorDeclaration) child.get();\n\t\t\tif ((cd.bits & IsCanonicalConstructor) != 0 && (cd.bits & IsImplicit) == 0) return child;\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\t\n\tprivate void handle0(Annotation ast, EclipseNode annotationNode, boolean force) {\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.NON_NULL_FLAG_USAGE, \"@NonNull\");\n\t\t\n\t\tfinal EclipseNode node;\n\t\tif (annotationNode.up().getKind() == Kind.TYPE_USE) {\n\t\t\tnode = annotationNode.directUp().directUp();\n\t\t} else {\n\t\t\tnode = annotationNode.up();\n\t\t}\n\t\t\n\t\tif (node.getKind() == Kind.FIELD) {\n\t\t\t// This is meaningless unless the field is used to generate a method (@Setter, @RequiredArgsConstructor, etc),\n\t\t\t// but in that case those handlers will take care of it. However, we DO check if the annotation is applied to\n\t\t\t// a primitive, because those handlers trigger on any annotation named @NonNull and we only want the warning\n\t\t\t// behaviour on _OUR_ 'lombok.NonNull'.\n\t\t\tEclipseNode fieldNode = node;\n\t\t\tEclipseNode typeNode = fieldNode.up();\n\t\t\t\n\t\t\ttry {\n\t\t\t\tif (isPrimitive(((AbstractVariableDeclaration) node.get()).type)) {\n\t\t\t\t\tannotationNode.addWarning(\"@NonNull is meaningless on a primitive.\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch (Exception ignore) {}\n\t\t\t\n\t\t\tif (isRecord(typeNode)) {\n\t\t\t\t// well, these kinda double as parameters (of the compact constructor), so we do some work here.\n\t\t\t\t// NB:Tthe diet parse run already added an explicit compact constructor if we need to take any actions.\n\t\t\t\tEclipseNode compactConstructor = findCompactConstructor(typeNode);\n\t\t\t\t\n\t\t\t\tif (compactConstructor != null) {\n\t\t\t\t\taddNullCheckIfNeeded((AbstractMethodDeclaration) compactConstructor.get(), (AbstractVariableDeclaration) fieldNode.get(), annotationNode);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (node.getKind() != Kind.ARGUMENT) return;\n\t\t\n\t\tArgument param;\n\t\tAbstractMethodDeclaration declaration;\n\t\t\n\t\ttry {\n\t\t\tparam = (Argument) node.get();\n\t\t\tdeclaration = (AbstractMethodDeclaration) node.up().get();\n\t\t} catch (Exception e) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif ((param.modifiers & AccRecord) != 0) {\n\t\t\taddNullCheckIfNeeded(declaration, param, annotationNode);\n\t\t\tnode.up().rebuild();\n\t\t}\n\t\t\n\t\tif (!force && isGenerated(declaration)) return;\n\t\t\n\t\tif (declaration.isAbstract()) {\n\t\t\t// This used to be a warning, but as @NonNull also has a documentary purpose, better to not warn about this. Since 1.16.7\n\t\t\treturn;\n\t\t}\n\t\t\n\t\taddNullCheckIfNeeded(declaration, param, annotationNode);\n\t\tnode.up().rebuild();\n\t}\n\t\n\tprivate void addNullCheckIfNeeded(AbstractMethodDeclaration declaration, AbstractVariableDeclaration param, EclipseNode annotationNode) {\n\t\t// Possibly, if 'declaration instanceof ConstructorDeclaration', fetch declaration.constructorCall, search it for any references to our parameter,\n\t\t// and if they exist, create a new method in the class: 'private static <T> T lombok$nullCheck(T expr, String msg) {if (expr == null) throw NPE; return expr;}' and\n\t\t// wrap all references to it in the super/this to a call to this method.\n\t\t\n\t\tStatement nullCheck = generateNullCheck(param, annotationNode, null);\n\t\t\n\t\tif (nullCheck == null) {\n\t\t\t// @NonNull applied to a primitive. Kinda pointless. Let's generate a warning.\n\t\t\tannotationNode.addWarning(\"@NonNull is meaningless on a primitive.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (declaration.statements == null) {\n\t\t\tdeclaration.statements = new Statement[] {nullCheck};\n\t\t} else {\n\t\t\tchar[] expectedName = param.name;\n\t\t\t/* Abort if the null check is already there, delving into try and synchronized statements */ {\n\t\t\t\tStatement[] stats = declaration.statements;\n\t\t\t\tint idx = 0;\n\t\t\t\twhile (stats != null && stats.length > idx) {\n\t\t\t\t\tStatement stat = stats[idx++];\n\t\t\t\t\tif (stat instanceof TryStatement) {\n\t\t\t\t\t\tstats = ((TryStatement) stat).tryBlock.statements;\n\t\t\t\t\t\tidx = 0;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (stat instanceof SynchronizedStatement) {\n\t\t\t\t\t\tstats = ((SynchronizedStatement) stat).block.statements;\n\t\t\t\t\t\tidx = 0;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tchar[] varNameOfNullCheck = returnVarNameIfNullCheck(stat);\n\t\t\t\t\tif (varNameOfNullCheck == null) break;\n\t\t\t\t\tif (Arrays.equals(varNameOfNullCheck, expectedName)) return;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tStatement[] newStatements = new Statement[declaration.statements.length + 1];\n\t\t\tint skipOver = 0;\n\t\t\tfor (Statement stat : declaration.statements) {\n\t\t\t\tif (isGenerated(stat) && isNullCheck(stat)) skipOver++;\n\t\t\t\telse break;\n\t\t\t}\n\t\t\tSystem.arraycopy(declaration.statements, 0, newStatements, 0, skipOver);\n\t\t\tSystem.arraycopy(declaration.statements, skipOver, newStatements, skipOver + 1, declaration.statements.length - skipOver);\n\t\t\tnewStatements[skipOver] = nullCheck;\n\t\t\tdeclaration.statements = newStatements;\n\t\t}\n\t}\n\t\n\tpublic boolean isNullCheck(Statement stat) {\n\t\treturn returnVarNameIfNullCheck(stat) != null;\n\t}\n\t\n\tpublic char[] returnVarNameIfNullCheck(Statement stat) {\n\t\tboolean isIf = stat instanceof IfStatement;\n\t\tboolean isExpression = stat instanceof Expression;\n\t\tif (!isIf && !(stat instanceof AssertStatement) && !isExpression) return null;\n\t\t\n\t\tif (isExpression) {\n\t\t\t/* Check if the statements contains a call to checkNotNull or requireNonNull */\n\t\t\tExpression expression = (Expression) stat;\n\t\t\tif (expression instanceof Assignment) expression = ((Assignment) expression).expression;\n\t\t\tif (!(expression instanceof MessageSend)) return null;\n\t\t\t\n\t\t\tMessageSend invocation = (MessageSend) expression;\n\t\t\tif (!Arrays.equals(invocation.selector, CHECK_NOT_NULL) && !Arrays.equals(invocation.selector, REQUIRE_NON_NULL)) return null;\n\t\t\tif (invocation.arguments == null || invocation.arguments.length == 0) return null;\n\t\t\tExpression firstArgument = invocation.arguments[0];\n\t\t\tif (!(firstArgument instanceof SingleNameReference)) return null;\n\t\t\treturn ((SingleNameReference) firstArgument).token;\n\t\t}\n\t\t\n\t\tif (isIf) {\n\t\t\t/* Check that the if's statement is a throw statement, possibly in a block. */\n\t\t\tStatement then = ((IfStatement) stat).thenStatement;\n\t\t\tif (then instanceof Block) {\n\t\t\t\tStatement[] blockStatements = ((Block) then).statements;\n\t\t\t\tif (blockStatements == null || blockStatements.length == 0) return null;\n\t\t\t\tthen = blockStatements[0];\n\t\t\t}\n\t\t\t\n\t\t\tif (!(then instanceof ThrowStatement)) return null;\n\t\t}\n\t\t\n\t\t/* Check that the if's conditional is like 'x == null'. Return from this method (don't generate\n\t\t   a nullcheck) if 'x' is equal to our own variable's name: There's already a nullcheck here. */ {\n\t\t\tExpression cond = isIf ? ((IfStatement) stat).condition : ((AssertStatement) stat).assertExpression;\n\t\t\tif (!(cond instanceof EqualExpression)) return null;\n\t\t\tEqualExpression bin = (EqualExpression) cond;\n\t\t\tString op = bin.operatorToString();\n\t\t\tif (isIf) {\n\t\t\t\tif (!\"==\".equals(op)) return null;\n\t\t\t} else {\n\t\t\t\tif (!\"!=\".equals(op)) return null;\n\t\t\t}\n\t\t\tif (!(bin.left instanceof SingleNameReference)) return null;\n\t\t\tif (!(bin.right instanceof NullLiteral)) return null;\n\t\t\treturn ((SingleNameReference) bin.left).token;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandlePrintAST.java",
    "content": "/*\n * Copyright (C) 2009-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport java.io.File;\nimport java.io.FileNotFoundException;\nimport java.io.PrintStream;\n\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\n\nimport lombok.Lombok;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.core.PrintAST;\nimport lombok.eclipse.DeferUntilPostDiet;\nimport lombok.eclipse.EclipseASTVisitor;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.spi.Provides;\n\n/**\n * Handles the {@code lombok.core.PrintAST} annotation for eclipse.\n */\n@Provides\n@DeferUntilPostDiet\n@HandlerPriority(536870912) // 2^29; this handler is customarily run at the very end.\npublic class HandlePrintAST extends EclipseAnnotationHandler<PrintAST> {\n\tpublic void handle(AnnotationValues<PrintAST> annotation, Annotation ast, EclipseNode annotationNode) {\n\t\tPrintStream stream = System.out;\n\t\tString fileName = annotation.getInstance().outfile();\n\t\tif (fileName.length() > 0) try {\n\t\t\tstream = new PrintStream(new File(fileName));\n\t\t} catch (FileNotFoundException e) {\n\t\t\tthrow Lombok.sneakyThrow(e);\n\t\t}\n\t\ttry {\n\t\t\tannotationNode.up().traverse(new EclipseASTVisitor.Printer(annotation.getInstance().printContent(), stream, annotation.getInstance().printPositions()));\n\t\t} finally {\n\t\t\tif (stream != System.out) {\n\t\t\t\ttry {\n\t\t\t\t\tstream.close();\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t\tthrow Lombok.sneakyThrow(e);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleSetter.java",
    "content": "/*\n * Copyright (C) 2009-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.eclipse.Eclipse.*;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport java.lang.reflect.Modifier;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collection;\nimport java.util.List;\n\nimport lombok.AccessLevel;\nimport lombok.ConfigurationKeys;\nimport lombok.Setter;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.eclipse.Eclipse;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.experimental.Accessors;\nimport lombok.spi.Provides;\n\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.Argument;\nimport org.eclipse.jdt.internal.compiler.ast.Assignment;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.NameReference;\nimport org.eclipse.jdt.internal.compiler.ast.ReturnStatement;\nimport org.eclipse.jdt.internal.compiler.ast.SingleNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.ThisReference;\nimport org.eclipse.jdt.internal.compiler.ast.TrueLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\nimport org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeIds;\n\n/**\n * Handles the {@code lombok.Setter} annotation for eclipse.\n */\n@Provides\npublic class HandleSetter extends EclipseAnnotationHandler<Setter> {\n\tprivate static final String SETTER_NODE_NOT_SUPPORTED_ERR = \"@Setter is only supported on a class or a field.\";\n\t\n\tpublic boolean generateSetterForType(EclipseNode typeNode, EclipseNode pos, AccessLevel level, boolean checkForTypeLevelSetter, List<Annotation> onMethod, List<Annotation> onParam) {\n\t\tif (checkForTypeLevelSetter) {\n\t\t\tif (hasAnnotation(Setter.class, typeNode)) {\n\t\t\t\t//The annotation will make it happen, so we can skip it.\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (!isClass(typeNode)) {\n\t\t\tpos.addError(SETTER_NODE_NOT_SUPPORTED_ERR);\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tfor (EclipseNode field : typeNode.down()) {\n\t\t\tif (field.getKind() != Kind.FIELD) continue;\n\t\t\tFieldDeclaration fieldDecl = (FieldDeclaration) field.get();\n\t\t\tif (!filterField(fieldDecl)) continue;\n\t\t\t\n\t\t\t//Skip final fields.\n\t\t\tif ((fieldDecl.modifiers & ClassFileConstants.AccFinal) != 0) continue;\n\t\t\t\n\t\t\tgenerateSetterForField(field, pos, level, onMethod, onParam);\n\t\t}\n\t\treturn true;\n\t}\n\t\n\t/**\n\t * Generates a setter on the stated field.\n\t * \n\t * Used by {@link HandleData}.\n\t * \n\t * The difference between this call and the handle method is as follows:\n\t * \n\t * If there is a {@code lombok.Setter} annotation on the field, it is used and the\n\t * same rules apply (e.g. warning if the method already exists, stated access level applies).\n\t * If not, the setter is still generated if it isn't already there, though there will not\n\t * be a warning if its already there. The default access level is used.\n\t */\n\tpublic void generateSetterForField(EclipseNode fieldNode, EclipseNode sourceNode, AccessLevel level, List<Annotation> onMethod, List<Annotation> onParam) {\n\t\tif (hasAnnotation(Setter.class, fieldNode)) {\n\t\t\t//The annotation will make it happen, so we can skip it.\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t// If a fluent setter should be generated, force-copy annotations from the field.\n\t\tAnnotationValues<Accessors> accessorsForField = EclipseHandlerUtil.getAccessorsForField(fieldNode);\n\t\t// Copying Jackson annotations is required for fluent accessors (otherwise Jackson would not find the accessor).\n\t\tAnnotation[] copyableToSetterAnnotations = findCopyableToSetterAnnotations(fieldNode, accessorsForField.isExplicit(\"fluent\"));\n\t\tonMethod = new ArrayList<Annotation>(onMethod);\n\t\tonMethod.addAll(Arrays.asList(copyableToSetterAnnotations));\n\t\t\n\t\tcreateSetterForField(level, fieldNode, sourceNode, false, onMethod, onParam);\n\t}\n\t\n\t@Override public void handle(AnnotationValues<Setter> annotation, Annotation ast, EclipseNode annotationNode) {\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.SETTER_FLAG_USAGE, \"@Setter\");\n\t\t\n\t\tEclipseNode node = annotationNode.up();\n\t\tAccessLevel level = annotation.getInstance().value();\n\t\tif (level == AccessLevel.NONE || node == null) return;\n\t\t\n\t\tList<Annotation> onMethod = unboxAndRemoveAnnotationParameter(ast, \"onMethod\", \"@Setter(onMethod\", annotationNode);\n\t\tif (!onMethod.isEmpty()) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.ON_X_FLAG_USAGE, \"@Setter(onMethod=...)\");\n\t\t}\n\t\tList<Annotation> onParam = unboxAndRemoveAnnotationParameter(ast, \"onParam\", \"@Setter(onParam\", annotationNode);\n\t\tif (!onParam.isEmpty()) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.ON_X_FLAG_USAGE, \"@Setter(onParam=...)\");\n\t\t}\n\t\t\n\t\tswitch (node.getKind()) {\n\t\tcase FIELD:\n\t\t\tcreateSetterForFields(level, annotationNode.upFromAnnotationToFields(), annotationNode, true, onMethod, onParam);\n\t\t\tbreak;\n\t\tcase TYPE:\n\t\t\tgenerateSetterForType(node, annotationNode, level, false, onMethod, onParam);\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tpublic void createSetterForFields(AccessLevel level, Collection<EclipseNode> fieldNodes, EclipseNode sourceNode, boolean whineIfExists, List<Annotation> onMethod, List<Annotation> onParam) {\n\t\tfor (EclipseNode fieldNode : fieldNodes) {\n\t\t\tcreateSetterForField(level, fieldNode, sourceNode, whineIfExists, onMethod, onParam);\n\t\t}\n\t}\n\t\n\tpublic void createSetterForField(\n\t\t\tAccessLevel level, EclipseNode fieldNode, EclipseNode sourceNode,\n\t\t\tboolean whineIfExists, List<Annotation> onMethod,\n\t\t\tList<Annotation> onParam) {\n\t\t\n\t\tASTNode source = sourceNode.get();\n\t\tif (fieldNode.getKind() != Kind.FIELD) {\n\t\t\tsourceNode.addError(SETTER_NODE_NOT_SUPPORTED_ERR);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tFieldDeclaration field = (FieldDeclaration) fieldNode.get();\n\t\tTypeReference fieldType = copyType(field.type, source);\n\t\tboolean isBoolean = isBoolean(fieldType);\n\t\tAnnotationValues<Accessors> accessors = getAccessorsForField(fieldNode);\n\t\tString setterName = toSetterName(fieldNode, isBoolean, accessors);\n\t\tboolean shouldReturnThis = shouldReturnThis(fieldNode, accessors);\n\t\t\n\t\tif (setterName == null) {\n\t\t\tfieldNode.addWarning(\"Not generating setter for this field: It does not fit your @Accessors prefix list.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tint modifier = toEclipseModifier(level) | (field.modifiers & ClassFileConstants.AccStatic);\n\t\t\n\t\tfor (String altName : toAllSetterNames(fieldNode, isBoolean, accessors)) {\n\t\t\tswitch (methodExists(altName, fieldNode, false, 1)) {\n\t\t\tcase EXISTS_BY_LOMBOK:\n\t\t\t\treturn;\n\t\t\tcase EXISTS_BY_USER:\n\t\t\t\tif (whineIfExists) {\n\t\t\t\t\tString altNameExpl = \"\";\n\t\t\t\t\tif (!altName.equals(setterName)) altNameExpl = String.format(\" (%s)\", altName);\n\t\t\t\t\tfieldNode.addWarning(\n\t\t\t\t\t\tString.format(\"Not generating %s(): A method with that name already exists%s\", setterName, altNameExpl));\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\tcase NOT_EXISTS:\n\t\t\t\t//continue scanning the other alt names.\n\t\t\t}\n\t\t}\n\t\t\n\t\tMethodDeclaration method = createSetter((TypeDeclaration) fieldNode.up().get(), false, fieldNode, setterName, null, null, shouldReturnThis, modifier, sourceNode, onMethod, onParam);\n\t\tinjectMethod(fieldNode.up(), method);\n\t}\n\n\tstatic MethodDeclaration createSetter(TypeDeclaration parent, boolean deprecate, EclipseNode fieldNode, String name, char[] paramName, char[] booleanFieldToSet, boolean shouldReturnThis, int modifier, EclipseNode sourceNode, List<Annotation> onMethod, List<Annotation> onParam) {\n\t\tASTNode source = sourceNode.get();\n\t\tint pS = source.sourceStart, pE = source.sourceEnd;\n\t\t\n\t\tTypeReference returnType = null;\n\t\tReturnStatement returnThis = null;\n\t\tif (shouldReturnThis) {\n\t\t\treturnType = cloneSelfType(fieldNode, source);\n\t\t\taddCheckerFrameworkReturnsReceiver(returnType, source, getCheckerFrameworkVersion(sourceNode));\n\t\t\tThisReference thisRef = new ThisReference(pS, pE);\n\t\t\treturnThis = new ReturnStatement(thisRef, pS, pE);\n\t\t}\n\t\t\n\t\tMethodDeclaration d = createSetter(parent, deprecate, fieldNode, name, paramName, booleanFieldToSet, returnType, returnThis, modifier, sourceNode, onMethod, onParam);\n\t\treturn d;\n\t}\n\t\n\tstatic MethodDeclaration createSetter(TypeDeclaration parent, boolean deprecate, EclipseNode fieldNode, String name, char[] paramName, char[] booleanFieldToSet, TypeReference returnType, Statement returnStatement, int modifier, EclipseNode sourceNode, List<Annotation> onMethod, List<Annotation> onParam) {\n\t\tFieldDeclaration field = (FieldDeclaration) fieldNode.get();\n\t\tif (paramName == null) paramName = field.name;\n\t\tASTNode source = sourceNode.get();\n\t\tint pS = source.sourceStart, pE = source.sourceEnd;\n\t\tlong p = (long) pS << 32 | pE;\n\t\tMethodDeclaration method = new MethodDeclaration(parent.compilationResult);\n\t\tAnnotationValues<Accessors> accessors = getAccessorsForField(fieldNode);\n\t\tif (shouldMakeFinal(fieldNode, accessors)) modifier |= ClassFileConstants.AccFinal;\n\t\tmethod.modifiers = modifier;\n\t\tif (returnType != null) {\n\t\t\tmethod.returnType = returnType;\n\t\t} else {\n\t\t\tmethod.returnType = TypeReference.baseTypeReference(TypeIds.T_void, 0);\n\t\t\tmethod.returnType.sourceStart = pS; method.returnType.sourceEnd = pE;\n\t\t}\n\t\tAnnotation[] deprecated = null;\n\t\tif (isFieldDeprecated(fieldNode) || deprecate) {\n\t\t\tdeprecated = new Annotation[] { generateDeprecatedAnnotation(source) };\n\t\t}\n\t\tmethod.annotations = copyAnnotations(source, onMethod.toArray(new Annotation[0]), deprecated, findCopyableToSetterAnnotations(fieldNode, false));\n\t\tArgument param = new Argument(paramName, p, copyType(field.type, source), Modifier.FINAL);\n\t\tparam.sourceStart = pS; param.sourceEnd = pE;\n\t\tmethod.arguments = new Argument[] { param };\n\t\tmethod.selector = name.toCharArray();\n\t\tmethod.binding = null;\n\t\tmethod.thrownExceptions = null;\n\t\tmethod.typeParameters = null;\n\t\tmethod.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tExpression fieldRef = createFieldAccessor(fieldNode, FieldAccess.ALWAYS_FIELD, source);\n\t\tNameReference fieldNameRef = new SingleNameReference(paramName, p);\n\t\tAssignment assignment = new Assignment(fieldRef, fieldNameRef, (int) p);\n\t\tassignment.sourceStart = pS; assignment.sourceEnd = assignment.statementEnd = pE;\n\t\tmethod.bodyStart = method.declarationSourceStart = method.sourceStart = source.sourceStart;\n\t\tmethod.bodyEnd = method.declarationSourceEnd = method.sourceEnd = source.sourceEnd;\n\t\t\n\t\tAnnotation[] copyableAnnotations = findCopyableAnnotations(fieldNode);\n\t\tList<Statement> statements = new ArrayList<Statement>(5);\n\t\tif (!hasNonNullAnnotations(fieldNode) && !hasNonNullAnnotations(fieldNode, onParam)) {\n\t\t\tstatements.add(assignment);\n\t\t} else {\n\t\t\tStatement nullCheck = generateNullCheck(field.type, paramName, sourceNode, null);\n\t\t\tif (nullCheck != null) statements.add(nullCheck);\n\t\t\tstatements.add(assignment);\n\t\t}\n\t\t\n\t\tif (booleanFieldToSet != null) {\n\t\t\tstatements.add(new Assignment(new SingleNameReference(booleanFieldToSet, p), new TrueLiteral(pS, pE), pE));\n\t\t}\n\t\t\n\t\tif (returnType != null && returnStatement != null) {\n\t\t\tstatements.add(returnStatement);\n\t\t}\n\t\tmethod.statements = statements.toArray(new Statement[0]);\n\t\tparam.annotations = copyAnnotations(source, copyableAnnotations, onParam.toArray(new Annotation[0]));\n\t\tif (param.annotations != null) {\n\t\t\tparam.bits |= Eclipse.HasTypeAnnotations;\n\t\t\tmethod.bits |= Eclipse.HasTypeAnnotations;\n\t\t}\n\t\t\n\t\tif (returnType != null && returnStatement != null) createRelevantNonNullAnnotation(sourceNode, method);\n\t\t\n\t\tmethod.traverse(new SetGeneratedByVisitor(source), parent.scope);\n\t\tcopyJavadoc(fieldNode, method, CopyJavadoc.SETTER, returnStatement != null);\n\t\treturn method;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleSneakyThrows.java",
    "content": "/*\n * Copyright (C) 2009-2024 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.eclipse.EcjAugments.ASTNode_handled;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport java.lang.reflect.Modifier;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\n\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.Argument;\nimport org.eclipse.jdt.internal.compiler.ast.ArrayInitializer;\nimport org.eclipse.jdt.internal.compiler.ast.Block;\nimport org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.ExplicitConstructorCall;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.MemberValuePair;\nimport org.eclipse.jdt.internal.compiler.ast.MessageSend;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.SingleNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.SingleTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.ThrowStatement;\nimport org.eclipse.jdt.internal.compiler.ast.TryStatement;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\n\nimport lombok.ConfigurationKeys;\nimport lombok.SneakyThrows;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.eclipse.DeferUntilPostDiet;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.spi.Provides;\n\n/**\n * Handles the {@code lombok.HandleSneakyThrows} annotation for eclipse.\n */\n@Provides\n@DeferUntilPostDiet\n@HandlerPriority(value = 1024) // 2^10; @NonNull must have run first, so that we wrap around the statements generated by it.\npublic class HandleSneakyThrows extends EclipseAnnotationHandler<SneakyThrows> {\n\t\n\tprivate static class DeclaredException {\n\t\tfinal String exceptionName;\n\t\tfinal ASTNode node;\n\t\t\n\t\tDeclaredException(String exceptionName, ASTNode node) {\n\t\t\tthis.exceptionName = exceptionName;\n\t\t\tthis.node = node;\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic void preHandle(AnnotationValues<SneakyThrows> annotation, Annotation ast, EclipseNode annotationNode) {\n\t\tif (hasParsedBody(getAnnotatedMethod(annotationNode))) {\n\t\t\t// This method has a body in diet mode, so we have to handle it now.\n\t\t\thandle(annotation, ast, annotationNode);\n\t\t\tASTNode_handled.set(ast, true);\n\t\t}\n\t}\n\t\n\t@Override public void handle(AnnotationValues<SneakyThrows> annotation, Annotation source, EclipseNode annotationNode) {\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.SNEAKY_THROWS_FLAG_USAGE, \"@SneakyThrows\");\n\t\t\n\t\tList<String> exceptionNames = annotation.getRawExpressions(\"value\");\n\t\tList<DeclaredException> exceptions = new ArrayList<DeclaredException>();\n\t\t\n\t\tMemberValuePair[] memberValuePairs = source.memberValuePairs();\n\t\tif (memberValuePairs == null || memberValuePairs.length == 0) {\n\t\t\texceptions.add(new DeclaredException(\"java.lang.Throwable\", source));\n\t\t} else {\n\t\t\tExpression arrayOrSingle = memberValuePairs[0].value;\n\t\t\tfinal Expression[] exceptionNameNodes;\n\t\t\tif (arrayOrSingle instanceof ArrayInitializer) {\n\t\t\t\texceptionNameNodes = ((ArrayInitializer)arrayOrSingle).expressions;\n\t\t\t} else exceptionNameNodes = new Expression[] { arrayOrSingle };\n\t\t\t\n\t\t\tif (exceptionNames.size() != exceptionNameNodes.length) {\n\t\t\t\tannotationNode.addError(\n\t\t\t\t\t\t\"LOMBOK BUG: The number of exception classes in the annotation isn't the same pre- and post- guessing.\");\n\t\t\t}\n\t\t\t\n\t\t\tint idx = 0;\n\t\t\tfor (String exceptionName : exceptionNames) {\n\t\t\t\tif (exceptionName.endsWith(\".class\")) exceptionName = exceptionName.substring(0, exceptionName.length() - 6);\n\t\t\t\texceptions.add(new DeclaredException(exceptionName, exceptionNameNodes[idx++]));\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\tEclipseNode owner = annotationNode.up();\n\t\tswitch (owner.getKind()) {\n//\t\tcase FIELD:\n//\t\t\treturn handleField(annotationNode, (FieldDeclaration)owner.get(), exceptions);\n\t\tcase METHOD:\n\t\t\thandleMethod(annotationNode, (AbstractMethodDeclaration)owner.get(), exceptions);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tannotationNode.addError(\"@SneakyThrows is legal only on methods and constructors.\");\n\t\t}\n\t}\n\t\n//\tprivate boolean handleField(Node annotation, FieldDeclaration field, List<DeclaredException> exceptions) {\n//\t\tif (field.initialization == null) {\n//\t\t\tannotation.addError(\"@SneakyThrows can only be used on fields with an initialization statement.\");\n//\t\t\treturn true;\n//\t\t}\n//\t\t\n//\t\tExpression expression = field.initialization;\n//\t\tStatement[] content = new Statement[] {new Assignment(\n//\t\t\t\tnew SingleNameReference(field.name, 0), expression, 0)};\n//\t\tfield.initialization = null;\n//\t\t\n//\t\tfor (DeclaredException exception : exceptions) {\n//\t\t\tcontent = new Statement[] { buildTryCatchBlock(content, exception) };\n//\t\t}\n//\t\t\n//\t\tBlock block = new Block(0);\n//\t\tblock.statements = content;\n//\t\t\n//\t\tNode typeNode = annotation.up().up();\n//\t\t\n//\t\tInitializer initializer = new Initializer(block, field.modifiers & Modifier.STATIC);\n//\t\tinitializer.sourceStart = expression.sourceStart;\n//\t\tinitializer.sourceEnd = expression.sourceEnd;\n//\t\tinitializer.declarationSourceStart = expression.sourceStart;\n//\t\tinitializer.declarationSourceEnd = expression.sourceEnd;\n//\t\tinjectField(typeNode, initializer);\n//\t\t\n//\t\ttypeNode.rebuild();\n//\t\t\n//\t\treturn true;\n//\t}\n\t\n\tpublic void handleMethod(EclipseNode annotation, AbstractMethodDeclaration method, List<DeclaredException> exceptions) {\n\t\tif (method.isAbstract()) {\n\t\t\tannotation.addError(\"@SneakyThrows can only be used on concrete methods.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (method.statements == null || method.statements.length == 0) {\n\t\t\tboolean hasConstructorCall = false;\n\t\t\tif (method instanceof ConstructorDeclaration) {\n\t\t\t\tExplicitConstructorCall constructorCall = ((ConstructorDeclaration) method).constructorCall;\n\t\t\t\thasConstructorCall = constructorCall != null && !constructorCall.isImplicitSuper() && !constructorCall.isImplicitThis();\n\t\t\t}\n\t\t\t\n\t\t\tif (hasConstructorCall) {\n\t\t\t\tannotation.addWarning(\"Calls to sibling / super constructors are always excluded from @SneakyThrows; @SneakyThrows has been ignored because there is no other code in this constructor.\");\n\t\t\t} else {\n\t\t\t\tannotation.addWarning(\"This method or constructor is empty; @SneakyThrows has been ignored.\");\n\t\t\t}\n\t\t\t\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tStatement[] contents = method.statements;\n\t\t\n\t\tfor (DeclaredException exception : exceptions) {\n\t\t\tcontents = new Statement[] { buildTryCatchBlock(contents, exception, exception.node, method) };\n\t\t}\n\t\t\n\t\tmethod.statements = contents;\n\t\tannotation.up().rebuild();\n\t}\n\t\n\tpublic Statement buildTryCatchBlock(Statement[] contents, DeclaredException exception, ASTNode source, AbstractMethodDeclaration method) {\n\t\tint methodStart = method.bodyStart;\n\t\tint methodEnd = method.bodyEnd;\n\t\tlong methodPosEnd = ((long) methodEnd) << 32 | (methodEnd & 0xFFFFFFFFL);\n\t\t\n\t\tTryStatement tryStatement = new TryStatement();\n\t\tsetGeneratedBy(tryStatement, source);\n\t\ttryStatement.tryBlock = new Block(0);\n\t\t\n\t\t// Positions for in-method generated nodes are special\n\t\ttryStatement.tryBlock.sourceStart = methodStart; tryStatement.tryBlock.sourceEnd = methodEnd;\n\t\t\n\t\tsetGeneratedBy(tryStatement.tryBlock, source);\n\t\ttryStatement.tryBlock.statements = contents;\n\t\tTypeReference typeReference;\n\t\tif (exception.exceptionName.indexOf('.') == -1) {\n\t\t\ttypeReference = new SingleTypeReference(exception.exceptionName.toCharArray(), methodPosEnd);\n\t\t\ttypeReference.statementEnd = methodEnd;\n\t\t} else {\n\t\t\tString[] x = exception.exceptionName.split(\"\\\\.\");\n\t\t\tchar[][] elems = new char[x.length][];\n\t\t\tlong[] poss = new long[x.length];\n\t\t\tArrays.fill(poss, methodPosEnd);\n\t\t\tfor (int i = 0; i < x.length; i++) {\n\t\t\t\telems[i] = x[i].trim().toCharArray();\n\t\t\t}\n\t\t\ttypeReference = new QualifiedTypeReference(elems, poss);\n\t\t}\n\t\tsetGeneratedBy(typeReference, source);\n\t\t\n\t\tArgument catchArg = new Argument(\"$ex\".toCharArray(), methodPosEnd, typeReference, Modifier.FINAL);\n\t\tsetGeneratedBy(catchArg, source);\n\t\tcatchArg.declarationSourceEnd = catchArg.declarationEnd = catchArg.sourceEnd = methodEnd;\n\t\tcatchArg.declarationSourceStart = catchArg.modifiersSourceStart = catchArg.sourceStart = methodEnd;\n\t\t\n\t\ttryStatement.catchArguments = new Argument[] { catchArg };\n\t\t\n\t\tMessageSend sneakyThrowStatement = new MessageSend();\n\t\tsetGeneratedBy(sneakyThrowStatement, source);\n\t\tsneakyThrowStatement.receiver = new QualifiedNameReference(new char[][] { \"lombok\".toCharArray(), \"Lombok\".toCharArray() }, new long[2], methodEnd, methodEnd);\n\t\tsetGeneratedBy(sneakyThrowStatement.receiver, source);\n\t\tsneakyThrowStatement.receiver.statementEnd = methodEnd;\n\t\tsneakyThrowStatement.selector = \"sneakyThrow\".toCharArray();\n\t\tSingleNameReference exRef = new SingleNameReference(\"$ex\".toCharArray(), methodPosEnd);\n\t\tsetGeneratedBy(exRef, source);\n\t\texRef.statementEnd = methodEnd;\n\t\tsneakyThrowStatement.arguments = new Expression[] { exRef };\n\t\t\n\t\t// This is the magic fix for rendering issues\n\t\t// In org.eclipse.jdt.core.dom.ASTConverter#convert(org.eclipse.jdt.internal.compiler.ast.MessageSend)\n\t\t// a new SimpleName is created and the setSourceRange should receive -1, 0. That's why we provide -2L :-)\n\t\tsneakyThrowStatement.nameSourcePosition = -2L;\n\t\t\n\t\tsneakyThrowStatement.sourceStart = methodEnd;\n\t\tsneakyThrowStatement.sourceEnd = sneakyThrowStatement.statementEnd = methodEnd;\n\t\t\n\t\tStatement rethrowStatement = new ThrowStatement(sneakyThrowStatement, methodEnd, methodEnd);\n\t\tsetGeneratedBy(rethrowStatement, source);\n\t\t\n\t\tBlock block = new Block(0);\n\t\tblock.sourceStart = methodEnd;\n\t\tblock.sourceEnd = methodEnd;\n\t\tsetGeneratedBy(block, source);\n\t\tblock.statements = new Statement[] { rethrowStatement };\n\t\t\n\t\ttryStatement.catchBlocks = new Block[] { block };\n\t\t\n\t\t// Positions for in-method generated nodes are special\n\t\ttryStatement.sourceStart = method.bodyStart;\n\t\ttryStatement.sourceEnd = method.bodyEnd;\n\t\t\n\t\treturn tryStatement;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleStandardException.java",
    "content": "/*\n * Copyright (C) 2021-2024 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport lombok.AccessLevel;\nimport lombok.ConfigurationKeys;\nimport lombok.experimental.StandardException;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.eclipse.handlers.EclipseHandlerUtil.*;\nimport lombok.spi.Provides;\nimport org.eclipse.jdt.internal.compiler.ast.*;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeConstants;\n\nimport java.lang.reflect.Modifier;\nimport java.util.*;\n\nimport static lombok.core.handlers.HandlerUtil.handleFlagUsage;\nimport static lombok.eclipse.Eclipse.ECLIPSE_DO_NOT_TOUCH_FLAG;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\n@Provides\npublic class HandleStandardException extends EclipseAnnotationHandler<StandardException> {\n\t@Override\n\tpublic void handle(AnnotationValues<StandardException> annotation, Annotation ast, EclipseNode annotationNode) {\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.STANDARD_EXCEPTION_FLAG_USAGE, \"@StandardException\");\n\t\t\n\t\tEclipseNode typeNode = annotationNode.up();\n\t\tif (!isClass(typeNode)) {\n\t\t\tannotationNode.addError(\"@StandardException is only supported on a class\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tTypeDeclaration classDef = (TypeDeclaration) typeNode.get();\n\t\tif (classDef.superclass == null) {\n\t\t\tannotationNode.addError(\"@StandardException requires that you extend a Throwable type\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tAccessLevel access = annotation.getInstance().access();\n\t\t\n\t\tgenerateNoArgsConstructor(typeNode, access, annotationNode);\n\t\tgenerateMsgOnlyConstructor(typeNode, access, annotationNode);\n\t\tgenerateCauseOnlyConstructor(typeNode, access, annotationNode);\n\t\tgenerateFullConstructor(typeNode, access, annotationNode);\n\t}\n\t\n\tprivate void generateNoArgsConstructor(EclipseNode typeNode, AccessLevel level, EclipseNode source) {\n\t\tif (hasConstructor(typeNode) != MemberExistsResult.NOT_EXISTS) return;\n\t\tint pS = source.get().sourceStart, pE = source.get().sourceEnd;\n\t\t\n\t\tExpression messageArgument = new CastExpression(new NullLiteral(pS, pE), generateQualifiedTypeRef(source.get(), TypeConstants.JAVA_LANG_STRING));\n\t\tExpression causeArgument = new CastExpression(new NullLiteral(pS, pE), generateQualifiedTypeRef(source.get(), TypeConstants.JAVA_LANG_THROWABLE));\n\t\tExplicitConstructorCall explicitCall = new ExplicitConstructorCall(ExplicitConstructorCall.This);\n\t\texplicitCall.arguments = new Expression[] {messageArgument, causeArgument};\n\t\tConstructorDeclaration constructor = createConstructor(level, typeNode, false, false, source, explicitCall, null);\n\t\tinjectMethod(typeNode, constructor);\n\t}\n\t\n\tprivate void generateMsgOnlyConstructor(EclipseNode typeNode, AccessLevel level, EclipseNode source) {\n\t\tif (hasConstructor(typeNode, String.class) != MemberExistsResult.NOT_EXISTS) return;\n\t\tint pS = source.get().sourceStart, pE = source.get().sourceEnd;\n\t\tlong p = (long) pS << 32 | pE;\n\t\t\n\t\tExpression messageArgument = new SingleNameReference(MESSAGE, p);\n\t\tExpression causeArgument = new CastExpression(new NullLiteral(pS, pE), generateQualifiedTypeRef(source.get(), TypeConstants.JAVA_LANG_THROWABLE));\n\t\tExplicitConstructorCall explicitCall = new ExplicitConstructorCall(ExplicitConstructorCall.This);\n\t\texplicitCall.arguments = new Expression[] {messageArgument, causeArgument};\n\t\tConstructorDeclaration constructor = createConstructor(level, typeNode, true, false, source, explicitCall, null);\n\t\tinjectMethod(typeNode, constructor);\n\t}\n\t\n\tprivate void generateCauseOnlyConstructor(EclipseNode typeNode, AccessLevel level, EclipseNode source) {\n\t\tif (hasConstructor(typeNode, Throwable.class) != MemberExistsResult.NOT_EXISTS) return;\n\t\tint pS = source.get().sourceStart, pE = source.get().sourceEnd;\n\t\tlong p = (long) pS << 32 | pE;\n\t\t\n\t\tExplicitConstructorCall explicitCall = new ExplicitConstructorCall(ExplicitConstructorCall.This);\n\t\tExpression causeNotNull = new EqualExpression(new SingleNameReference(CAUSE, p), new NullLiteral(pS, pE), OperatorIds.NOT_EQUAL);\n\t\tMessageSend causeDotGetMessage = new MessageSend();\n\t\tcauseDotGetMessage.sourceStart = pS; causeDotGetMessage.sourceEnd = pE;\n\t\tcauseDotGetMessage.receiver = new SingleNameReference(CAUSE, p);\n\t\tcauseDotGetMessage.selector = GET_MESSAGE;\n\t\tExpression messageExpr = new ConditionalExpression(causeNotNull, causeDotGetMessage, new NullLiteral(pS, pE));\n\t\texplicitCall.arguments = new Expression[] {messageExpr, new SingleNameReference(CAUSE, p)};\n\t\tConstructorDeclaration constructor = createConstructor(level, typeNode, false, true, source, explicitCall, null);\n\t\tinjectMethod(typeNode, constructor);\n\t}\n\t\n\tprivate void generateFullConstructor(EclipseNode typeNode, AccessLevel level, EclipseNode source) {\n\t\tif (hasConstructor(typeNode, String.class, Throwable.class) != MemberExistsResult.NOT_EXISTS) return;\n\t\tint pS = source.get().sourceStart, pE = source.get().sourceEnd;\n\t\tlong p = (long) pS << 32 | pE;\n\t\t\n\t\tExplicitConstructorCall explicitCall = new ExplicitConstructorCall(ExplicitConstructorCall.Super);\n\t\texplicitCall.arguments = new Expression[] {new SingleNameReference(MESSAGE, p)};\n\t\tExpression causeNotNull = new EqualExpression(new SingleNameReference(CAUSE, p), new NullLiteral(pS, pE), OperatorIds.NOT_EQUAL);\n\t\tMessageSend causeDotInitCause = new MessageSend();\n\t\tcauseDotInitCause.sourceStart = pS; causeDotInitCause.sourceEnd = pE;\n\t\tcauseDotInitCause.receiver = new SuperReference(pS, pE);\n\t\tcauseDotInitCause.selector = INIT_CAUSE;\n\t\tcauseDotInitCause.arguments = new Expression[] {new SingleNameReference(CAUSE, p)};\n\t\tIfStatement ifs = new IfStatement(causeNotNull, causeDotInitCause, pS, pE);\n\t\tConstructorDeclaration constructor = createConstructor(level, typeNode, true, true, source, explicitCall, ifs);\n\t\tinjectMethod(typeNode, constructor);\n\t}\n\t\n\t/**\n\t * Checks if a constructor with the provided parameters exists under the type node.\n\t */\n\tpublic static MemberExistsResult hasConstructor(EclipseNode node, Class<?>... paramTypes) {\n\t\tnode = upToTypeNode(node);\n\t\t\n\t\tif (node != null && node.get() instanceof TypeDeclaration) {\n\t\t\tTypeDeclaration typeDecl = (TypeDeclaration) node.get();\n\t\t\tif (typeDecl.methods != null) for (AbstractMethodDeclaration def : typeDecl.methods) {\n\t\t\t\tif (def instanceof ConstructorDeclaration) {\n\t\t\t\t\tif ((def.bits & ASTNode.IsDefaultConstructor) != 0) continue;\n\t\t\t\t\tif (!paramsMatch(node, def.arguments, paramTypes)) continue;\n\t\t\t\t\treturn getGeneratedBy(def) == null ? MemberExistsResult.EXISTS_BY_USER : MemberExistsResult.EXISTS_BY_LOMBOK;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn MemberExistsResult.NOT_EXISTS;\n\t}\n\t\n\tprivate static boolean paramsMatch(EclipseNode node, Argument[] a, Class<?>[] b) {\n\t\tif (a == null) return b == null || b.length == 0;\n\t\tif (b == null) return a.length == 0;\n\t\tif (a.length != b.length) return false;\n\t\t\n\t\tfor (int i = 0; i < a.length; i++) {\n\t\t\tif (!typeMatches(b[i], node, a[i].type)) return false;\n\t\t}\n\t\treturn true;\n\t}\n\t\n\tprivate static final char[][] JAVA_BEANS_CONSTRUCTORPROPERTIES = new char[][] { \"java\".toCharArray(), \"beans\".toCharArray(), \"ConstructorProperties\".toCharArray() };\n\tprivate static final char[] MESSAGE = \"message\".toCharArray(), CAUSE = \"cause\".toCharArray(), GET_MESSAGE = \"getMessage\".toCharArray(), INIT_CAUSE = \"initCause\".toCharArray();\n\t\n\tpublic static Annotation[] createConstructorProperties(ASTNode source, boolean msgParam, boolean causeParam) {\n\t\tif (!msgParam && !causeParam) return null;\n\t\t\n\t\tint pS = source.sourceStart, pE = source.sourceEnd;\n\t\tlong p = (long) pS << 32 | pE;\n\t\tlong[] poss = new long[3];\n\t\tArrays.fill(poss, p);\n\t\t\n\t\tQualifiedTypeReference constructorPropertiesType = new QualifiedTypeReference(JAVA_BEANS_CONSTRUCTORPROPERTIES, poss);\n\t\tsetGeneratedBy(constructorPropertiesType, source);\n\t\tSingleMemberAnnotation ann = new SingleMemberAnnotation(constructorPropertiesType, pS);\n\t\tann.declarationSourceEnd = pE;\n\t\t\n\t\tArrayInitializer fieldNames = new ArrayInitializer();\n\t\tfieldNames.sourceStart = pS;\n\t\tfieldNames.sourceEnd = pE;\n\t\tfieldNames.expressions = new Expression[(msgParam && causeParam) ? 2 : 1];\n\t\t\n\t\tint ctr = 0;\n\t\tif (msgParam) {\n\t\t\tfieldNames.expressions[ctr] = new StringLiteral(MESSAGE, pS, pE, 0);\n\t\t\tsetGeneratedBy(fieldNames.expressions[ctr], source);\n\t\t\tctr++;\n\t\t}\n\t\tif (causeParam) {\n\t\t\tfieldNames.expressions[ctr] = new StringLiteral(CAUSE, pS, pE, 0);\n\t\t\tsetGeneratedBy(fieldNames.expressions[ctr], source);\n\t\t\tctr++;\n\t\t}\n\t\t\n\t\tann.memberValue = fieldNames;\n\t\tsetGeneratedBy(ann, source);\n\t\tsetGeneratedBy(ann.memberValue, source);\n\t\treturn new Annotation[] { ann };\n\t}\n\t\n\t@SuppressWarnings(\"deprecation\") public static ConstructorDeclaration createConstructor(AccessLevel level, EclipseNode typeNode, boolean msgParam, boolean causeParam, EclipseNode sourceNode, ExplicitConstructorCall explicitCall, Statement extra) {\n\t\tASTNode source = sourceNode.get();\n\t\tTypeDeclaration typeDeclaration = ((TypeDeclaration) typeNode.get());\n\t\tint pS = source.sourceStart, pE = source.sourceEnd;\n\t\tlong p = (long) pS << 32 | pE;\n\t\t\n\t\tboolean addConstructorProperties;\n\t\tif ((!msgParam && !causeParam) || isLocalType(typeNode)) {\n\t\t\taddConstructorProperties = false;\n\t\t} else {\n\t\t\tBoolean v = typeNode.getAst().readConfiguration(ConfigurationKeys.ANY_CONSTRUCTOR_ADD_CONSTRUCTOR_PROPERTIES);\n\t\t\taddConstructorProperties = v != null ? v.booleanValue() :\n\t\t\t\tBoolean.FALSE.equals(typeNode.getAst().readConfiguration(ConfigurationKeys.ANY_CONSTRUCTOR_SUPPRESS_CONSTRUCTOR_PROPERTIES));\n\t\t}\n\t\t\n\t\tConstructorDeclaration constructor = new ConstructorDeclaration(((CompilationUnitDeclaration) typeNode.top().get()).compilationResult);\n\t\t\n\t\tconstructor.modifiers = toEclipseModifier(level);\n\t\tconstructor.selector = typeDeclaration.name;\n\t\tconstructor.thrownExceptions = null;\n\t\tconstructor.typeParameters = null;\n\t\tconstructor.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tconstructor.bodyStart = constructor.declarationSourceStart = constructor.sourceStart = pS;\n\t\tconstructor.bodyEnd = constructor.declarationSourceEnd = constructor.sourceEnd = pE;\n\t\tconstructor.arguments = null;\n\t\t\n\t\tList<Argument> params = new ArrayList<Argument>();\n\t\t\n\t\tif (msgParam) {\n\t\t\tTypeReference typeRef = new QualifiedTypeReference(TypeConstants.JAVA_LANG_STRING, new long[] {p, p, p});\n\t\t\tArgument parameter = new Argument(MESSAGE, p, typeRef, Modifier.FINAL);\n\t\t\tparams.add(parameter);\n\t\t}\n\t\tif (causeParam) {\n\t\t\tTypeReference typeRef = new QualifiedTypeReference(TypeConstants.JAVA_LANG_THROWABLE, new long[] {p, p, p});\n\t\t\tArgument parameter = new Argument(CAUSE, p, typeRef, Modifier.FINAL);\n\t\t\tparams.add(parameter);\n\t\t}\n\t\t\n\t\texplicitCall.sourceStart = pS;\n\t\texplicitCall.sourceEnd = pE;\n\t\tconstructor.constructorCall = explicitCall;\n\t\tconstructor.statements = extra != null ? new Statement[] {extra} : null;\n\t\tconstructor.arguments = params.isEmpty() ? null : params.toArray(new Argument[0]);\n\t\t\n\t\tAnnotation[] constructorProperties = null;\n\t\tif (addConstructorProperties) constructorProperties = createConstructorProperties(source, msgParam, causeParam);\n\t\tconstructor.annotations = copyAnnotations(source, constructorProperties);\n\t\tconstructor.traverse(new SetGeneratedByVisitor(source), typeDeclaration.scope);\n\t\treturn constructor;\n\t}\n\n\tpublic static boolean isLocalType(EclipseNode type) {\n\t\tKind kind = type.up().getKind();\n\t\tif (kind == Kind.COMPILATION_UNIT) return false;\n\t\tif (kind == Kind.TYPE) return isLocalType(type.up());\n\t\treturn true;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleSuperBuilder.java",
    "content": "/*\n * Copyright (C) 2013-2025 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.eclipse.handlers.HandleBuilder.*;\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.eclipse.Eclipse.*;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport java.lang.reflect.Modifier;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.HashSet;\nimport java.util.List;\n\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.AllocationExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.Argument;\nimport org.eclipse.jdt.internal.compiler.ast.Assignment;\nimport org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.ConditionalExpression;\nimport org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.EqualExpression;\nimport org.eclipse.jdt.internal.compiler.ast.ExplicitConstructorCall;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.FalseLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.FieldReference;\nimport org.eclipse.jdt.internal.compiler.ast.IfStatement;\nimport org.eclipse.jdt.internal.compiler.ast.Initializer;\nimport org.eclipse.jdt.internal.compiler.ast.MessageSend;\nimport org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.NullLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.OperatorIds;\nimport org.eclipse.jdt.internal.compiler.ast.ParameterizedQualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.ParameterizedSingleTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.ReturnStatement;\nimport org.eclipse.jdt.internal.compiler.ast.SingleNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.SingleTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.SuperReference;\nimport org.eclipse.jdt.internal.compiler.ast.ThisReference;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.TypeParameter;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.Wildcard;\nimport org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;\nimport org.eclipse.jdt.internal.compiler.lookup.ClassScope;\nimport org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers;\nimport org.eclipse.jdt.internal.compiler.lookup.MethodScope;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeConstants;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeIds;\n\nimport lombok.AccessLevel;\nimport lombok.Builder;\nimport lombok.Builder.ObtainVia;\nimport lombok.ConfigurationKeys;\nimport lombok.Singular;\nimport lombok.ToString;\nimport lombok.core.AST.Kind;\nimport lombok.core.configuration.CheckerFrameworkVersion;\nimport lombok.core.handlers.HandlerUtil;\nimport lombok.core.handlers.InclusionExclusionUtils.Included;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.eclipse.Eclipse;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.eclipse.handlers.EclipseHandlerUtil.CopyJavadoc;\nimport lombok.eclipse.handlers.EclipseHandlerUtil.MemberExistsResult;\nimport lombok.eclipse.handlers.EclipseSingularsRecipes.EclipseSingularizer;\nimport lombok.eclipse.handlers.EclipseSingularsRecipes.SingularData;\nimport lombok.eclipse.handlers.EclipseSingularsRecipes.StatementMaker;\nimport lombok.eclipse.handlers.EclipseSingularsRecipes.TypeReferenceMaker;\nimport lombok.eclipse.handlers.HandleBuilder.BuilderFieldData;\nimport lombok.eclipse.handlers.HandleBuilder.BuilderJob;\nimport lombok.experimental.NonFinal;\nimport lombok.experimental.SuperBuilder;\nimport lombok.spi.Provides;\n\n@Provides\n@HandlerPriority(-1024) //-2^10; to ensure we've picked up @FieldDefault's changes (-2048) but @Value hasn't removed itself yet (-512), so that we can error on presence of it on the builder classes.\npublic class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> {\n\tprivate static final char[] SELF_METHOD_NAME = \"self\".toCharArray();\n\tprivate static final char[] FILL_VALUES_METHOD_NAME = \"$fillValuesFrom\".toCharArray();\n\tprivate static final char[] FILL_VALUES_STATIC_METHOD_NAME = \"$fillValuesFromInstanceIntoBuilder\".toCharArray();\n\tprivate static final char[] INSTANCE_VARIABLE_NAME = \"instance\".toCharArray();\n\tprivate static final String BUILDER_VARIABLE_NAME_STRING = \"b\";\n\tprivate static final char[] BUILDER_VARIABLE_NAME = BUILDER_VARIABLE_NAME_STRING.toCharArray();\n\t\n\tclass SuperBuilderJob extends BuilderJob {\n\t\tvoid init(AnnotationValues<SuperBuilder> annValues, SuperBuilder ann, EclipseNode node) {\n\t\t\taccessOuters = accessInners = AccessLevel.PUBLIC;\n\t\t\toldFluent = true;\n\t\t\toldChain = true;\n\t\t\t\n\t\t\tbuilderMethodName = ann.builderMethodName();\n\t\t\tbuildMethodName = ann.buildMethodName();\n\t\t\ttoBuilder = ann.toBuilder();\n\t\t\t\n\t\t\tif (builderMethodName == null) builderMethodName = \"builder\";\n\t\t\tif (buildMethodName == null) buildMethodName = \"build\";\n\t\t\tbuilderClassName = getBuilderClassNameTemplate(node, null);\n\t\t}\n\t\t\n\t\tEclipseNode builderAbstractType;\n\t\tString builderAbstractClassName;\n\t\tchar[] builderAbstractClassNameArr;\n\t\tEclipseNode builderImplType;\n\t\tString builderImplClassName;\n\t\tchar[] builderImplClassNameArr;\n\t\tprivate TypeParameter[] builderTypeParams_;\n\t\tvoid setBuilderToImpl() {\n\t\t\tbuilderType = builderImplType;\n\t\t\tbuilderClassName = builderImplClassName;\n\t\t\tbuilderClassNameArr = builderImplClassNameArr;\n\t\t\tbuilderTypeParams = typeParams;\n\t\t}\n\t\t\n\t\tvoid setBuilderToAbstract() {\n\t\t\tbuilderType = builderAbstractType;\n\t\t\tbuilderClassName = builderAbstractClassName;\n\t\t\tbuilderClassNameArr = builderAbstractClassNameArr;\n\t\t\tbuilderTypeParams = builderTypeParams_;\n\t\t}\n\t}\n\t\n\t@Override public void handle(AnnotationValues<SuperBuilder> annotation, Annotation ast, EclipseNode annotationNode) {\n\t\thandleExperimentalFlagUsage(annotationNode, ConfigurationKeys.SUPERBUILDER_FLAG_USAGE, \"@SuperBuilder\");\n\t\tSuperBuilderJob job = new SuperBuilderJob();\n\t\tjob.sourceNode = annotationNode;\n\t\tjob.source = ast;\n\t\tjob.checkerFramework = getCheckerFrameworkVersion(annotationNode);\n\t\tjob.isStatic = true;\n\t\t\n\t\tSuperBuilder annInstance = annotation.getInstance();\n\t\tjob.init(annotation, annInstance, annotationNode);\n\t\t\n\t\tboolean generateBuilderMethod;\n\t\tif (job.builderMethodName.isEmpty()) generateBuilderMethod = false;\n\t\telse if (!checkName(\"builderMethodName\", job.builderMethodName, annotationNode)) return;\n\t\telse generateBuilderMethod = true;\n\t\t\n\t\tif (!checkName(\"buildMethodName\", job.buildMethodName, annotationNode)) return;\n\t\t\n\t\tEclipseNode parent = annotationNode.up();\n\t\t\n\t\tjob.builderFields = new ArrayList<BuilderFieldData>();\n\t\tTypeReference buildMethodReturnType;\n\t\t\n\t\tboolean addCleaning = false;\n\t\t\n\t\tList<EclipseNode> nonFinalNonDefaultedFields = null;\n\t\t\n\t\tif (!isClass(parent)) {\n\t\t\tannotationNode.addError(\"@SuperBuilder is only supported on classes.\");\n\t\t\treturn;\n\t\t}\n\t\tif (!isStaticAllowed(parent)) {\n\t\t\tannotationNode.addError(\"@SuperBuilder is not supported on non-static nested classes.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tjob.parentType = parent;\n\t\tTypeDeclaration td = (TypeDeclaration) parent.get();\n\t\t\n\t\t// Gather all fields of the class that should be set by the builder.\n\t\tList<EclipseNode> allFields = new ArrayList<EclipseNode>();\n\t\t\n\t\tboolean valuePresent = (hasAnnotation(lombok.Value.class, parent) || hasAnnotation(\"lombok.experimental.Value\", parent));\n\t\tfor (EclipseNode fieldNode : HandleConstructor.findAllFields(parent, true)) {\n\t\t\tFieldDeclaration fd = (FieldDeclaration) fieldNode.get();\n\t\t\tEclipseNode isDefault = findAnnotation(Builder.Default.class, fieldNode);\n\t\t\tboolean isFinal = ((fd.modifiers & ClassFileConstants.AccFinal) != 0) || (valuePresent && !hasAnnotation(NonFinal.class, fieldNode));\n\t\t\t\n\t\t\tAnnotation[] copyableAnnotations = findCopyableAnnotations(fieldNode);\n\t\t\t\n\t\t\tBuilderFieldData bfd = new BuilderFieldData();\n\t\t\tbfd.rawName = fieldNode.getName().toCharArray();\n\t\t\tbfd.name = removePrefixFromField(fieldNode);\n\t\t\tbfd.builderFieldName = bfd.name;\n\t\t\tbfd.annotations = copyAnnotations(fd, copyableAnnotations);\n\t\t\tbfd.type = fd.type;\n\t\t\tbfd.singularData = getSingularData(fieldNode, ast, annInstance.setterPrefix());\n\t\t\tbfd.originalFieldNode = fieldNode;\n\t\t\t\n\t\t\tif (bfd.singularData != null && isDefault != null) {\n\t\t\t\tisDefault.addError(\"@Builder.Default and @Singular cannot be mixed.\");\n\t\t\t\tisDefault = null;\n\t\t\t}\n\t\t\t\n\t\t\tif (fd.initialization == null && isDefault != null) {\n\t\t\t\tisDefault.addWarning(\"@Builder.Default requires an initializing expression (' = something;').\");\n\t\t\t\tisDefault = null;\n\t\t\t}\n\t\t\t\n\t\t\tif (fd.initialization != null && isDefault == null) {\n\t\t\t\tif (isFinal) continue;\n\t\t\t\tif (nonFinalNonDefaultedFields == null) nonFinalNonDefaultedFields = new ArrayList<EclipseNode>();\n\t\t\t\tnonFinalNonDefaultedFields.add(fieldNode);\n\t\t\t}\n\t\t\t\n\t\t\tif (isDefault != null) {\n\t\t\t\tbfd.nameOfDefaultProvider = prefixWith(DEFAULT_PREFIX, bfd.name);\n\t\t\t\tbfd.nameOfSetFlag = prefixWith(bfd.name, SET_PREFIX);\n\t\t\t\tbfd.builderFieldName = prefixWith(bfd.name, VALUE_PREFIX);\n\t\t\t\t\n\t\t\t\tMethodDeclaration md = HandleBuilder.generateDefaultProvider(bfd.nameOfDefaultProvider, td.typeParameters, fieldNode, ast);\n\t\t\t\tif (md != null) injectMethod(parent, md);\n\t\t\t}\n\t\t\taddObtainVia(bfd, fieldNode);\n\t\t\tjob.builderFields.add(bfd);\n\t\t\tallFields.add(fieldNode);\n\t\t}\n\t\t\n\t\tjob.typeParams = td.typeParameters != null ? td.typeParameters : new TypeParameter[0];\n\t\tbuildMethodReturnType = job.createBuilderParentTypeReference();\n\t\t\n\t\t// <C, B> are the generics for our builder.\n\t\tString classGenericName = \"C\";\n\t\tString builderGenericName = \"B\";\n\t\t// We have to make sure that the generics' names do not collide with any generics on the annotated class,\n\t\t// the classname itself, or any member type name of the annotated class.\n\t\t// For instance, if there are generics <B, B2, C> on the annotated class, use \"C2\" and \"B3\" for our builder.\n\t\tjava.util.Set<String> usedNames = gatherUsedTypeNames(job.typeParams, td);\n\t\tclassGenericName = generateNonclashingNameFor(classGenericName, usedNames);\n\t\tbuilderGenericName = generateNonclashingNameFor(builderGenericName, usedNames);\n\t\t\n\t\tTypeParameter[] paddedTypeParameters; {\n\t\t\tpaddedTypeParameters = new TypeParameter[job.typeParams.length + 2];\n\t\t\tSystem.arraycopy(job.typeParams, 0, paddedTypeParameters, 0, job.typeParams.length);\n\t\t\t\n\t\t\tTypeParameter c = new TypeParameter();\n\t\t\tc.name = classGenericName.toCharArray();\n\t\t\tc.type = cloneSelfType(job.parentType, job.source);\n\t\t\tpaddedTypeParameters[paddedTypeParameters.length - 2] = c;\n\t\t\t\n\t\t\tTypeParameter b = new TypeParameter();\n\t\t\tb.name = builderGenericName.toCharArray();\n\t\t\tb.type = cloneSelfType(job.parentType, job.source);\n\t\t\tpaddedTypeParameters[paddedTypeParameters.length - 1] = b;\n\t\t}\n\t\tjob.builderTypeParams = job.builderTypeParams_ = paddedTypeParameters;\n\t\t\n\t\tTypeReference extendsClause = td.superclass;\n\t\tTypeReference superclassBuilderClass = null;\n\t\tTypeReference[] typeArguments = new TypeReference[] {\n\t\t\tnew SingleTypeReference(classGenericName.toCharArray(), 0), \n\t\t\tnew SingleTypeReference(builderGenericName.toCharArray(), 0), \n\t\t};\n\t\tif (extendsClause instanceof QualifiedTypeReference) {\n\t\t\tQualifiedTypeReference qualifiedTypeReference = (QualifiedTypeReference)extendsClause;\n\t\t\tchar[] superclassClassName = qualifiedTypeReference.getLastToken();\n\t\t\tString builderClassNameTemplate = BuilderJob.getBuilderClassNameTemplate(annotationNode, null);\n\t\t\tString superclassBuilderClassName = job.replaceBuilderClassName(superclassClassName, builderClassNameTemplate);\n\t\t\t\n\t\t\tchar[][] tokens = Arrays.copyOf(qualifiedTypeReference.tokens, qualifiedTypeReference.tokens.length + 1);\n\t\t\ttokens[tokens.length-1] = superclassBuilderClassName.toCharArray();\n\t\t\tlong[] poss = new long[tokens.length];\n\t\t\tArrays.fill(poss, job.getPos());\n\t\t\t\n\t\t\tTypeReference[] superclassTypeArgs = getTypeParametersFrom(extendsClause);\n\t\t\t\n\t\t\t// Every token may potentially have type args. Here, we only have\n\t\t\t// type args for the last token, the superclass' builder.\n\t\t\tTypeReference[][] typeArgsForTokens = new TypeReference[tokens.length][];\n\t\t\ttypeArgsForTokens[typeArgsForTokens.length-1] = mergeTypeReferences(superclassTypeArgs, typeArguments);\n\t\t\t\n\t\t\tsuperclassBuilderClass = new ParameterizedQualifiedTypeReference(tokens, typeArgsForTokens, 0, poss);\n\t\t} else if (extendsClause != null) {\n\t\t\tchar[] superclassClassName = extendsClause.getTypeName()[0];\n\t\t\tString builderClassNameTemplate = BuilderJob.getBuilderClassNameTemplate(annotationNode, null);\n\t\t\tString superclassBuilderClassName = job.replaceBuilderClassName(superclassClassName, builderClassNameTemplate);\n\t\t\t\n\t\t\tchar[][] tokens = new char[][] {superclassClassName, superclassBuilderClassName.toCharArray()};\n\t\t\tlong[] poss = new long[tokens.length];\n\t\t\tArrays.fill(poss, job.getPos());\n\t\t\t\n\t\t\tTypeReference[] superclassTypeArgs = getTypeParametersFrom(extendsClause);\n\t\t\t\n\t\t\t// Every token may potentially have type args. Here, we only have\n\t\t\t// type args for the last token, the superclass' builder.\n\t\t\tTypeReference[][] typeArgsForTokens = new TypeReference[tokens.length][];\n\t\t\ttypeArgsForTokens[typeArgsForTokens.length-1] = mergeTypeReferences(superclassTypeArgs, typeArguments);\n\t\t\t\n\t\t\tsuperclassBuilderClass = new ParameterizedQualifiedTypeReference(tokens, typeArgsForTokens, 0, poss);\n\t\t}\n\t\tjob.builderAbstractClassName = job.builderClassName = job.replaceBuilderClassName(td.name);\n\t\tjob.builderAbstractClassNameArr = job.builderClassNameArr = job.builderAbstractClassName.toCharArray();\n\t\tjob.builderImplClassName = job.builderAbstractClassName + \"Impl\";\n\t\tjob.builderImplClassNameArr = job.builderImplClassName.toCharArray();\n\t\t\n\t\t// If there is no superclass, superclassBuilderClassExpression is still == null at this point.\n\t\t// You can use it to check whether to inherit or not.\n\t\t\n\t\tif (!constructorExists(parent, job.builderClassName)) {\n\t\t\tgenerateBuilderBasedConstructor(job, superclassBuilderClass != null);\n\t\t}\n\t\t\n\t\t// Create the abstract builder class, or reuse an existing one.\n\t\tjob.builderAbstractType = findInnerClass(parent, job.builderClassName);\n\t\tif (job.builderAbstractType == null) {\n\t\t\tjob.builderAbstractType = generateBuilderAbstractClass(job, superclassBuilderClass, classGenericName, builderGenericName);\n\t\t} else {\n\t\t\tTypeDeclaration builderTypeDeclaration = (TypeDeclaration) job.builderAbstractType.get();\n\t\t\tif ((builderTypeDeclaration.modifiers & (ClassFileConstants.AccStatic | ClassFileConstants.AccAbstract)) == 0) {\n\t\t\t\tannotationNode.addError(\"Existing Builder must be an abstract static inner class.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsanityCheckForMethodGeneratingAnnotationsOnBuilderClass(job.builderAbstractType, annotationNode);\n\t\t\t// Generate errors for @Singular BFDs that have one already defined node.\n\t\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\t\tSingularData sd = bfd.singularData;\n\t\t\t\tif (sd == null) continue;\n\t\t\t\tEclipseSingularizer singularizer = sd.getSingularizer();\n\t\t\t\tif (singularizer == null) continue;\n\t\t\t\tif (singularizer.checkForAlreadyExistingNodesAndGenerateError(job.builderAbstractType, sd)) bfd.singularData = null;\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Check validity of @ObtainVia fields, and add check if adding cleaning for @Singular is necessary.\n\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\tif (bfd.singularData != null && bfd.singularData.getSingularizer() != null) {\n\t\t\t\tif (bfd.singularData.getSingularizer().requiresCleaning()) {\n\t\t\t\t\taddCleaning = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (bfd.obtainVia != null) {\n\t\t\t\tif (bfd.obtainVia.field().isEmpty() == bfd.obtainVia.method().isEmpty()) {\n\t\t\t\t\tbfd.obtainViaNode.addError(\"The syntax is either @ObtainVia(field = \\\"fieldName\\\") or @ObtainVia(method = \\\"methodName\\\").\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (bfd.obtainVia.method().isEmpty() && bfd.obtainVia.isStatic()) {\n\t\t\t\t\tbfd.obtainViaNode.addError(\"@ObtainVia(isStatic = true) is not valid unless 'method' has been set.\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Generate the fields in the abstract builder class that hold the values for the instance.\n\t\tjob.setBuilderToAbstract();\n\t\tgenerateBuilderFields(job);\n\t\tif (addCleaning) {\n\t\t\tFieldDeclaration cleanDecl = new FieldDeclaration(CLEAN_FIELD_NAME, 0, -1);\n\t\t\tcleanDecl.declarationSourceEnd = -1;\n\t\t\tcleanDecl.modifiers = ClassFileConstants.AccPrivate;\n\t\t\tcleanDecl.type = TypeReference.baseTypeReference(TypeIds.T_boolean, 0);\n\t\t\tinjectFieldAndMarkGenerated(job.builderType, cleanDecl);\n\t\t}\n\t\t\n\t\tif (job.toBuilder) {\n\t\t\t// Generate $fillValuesFrom() method in the abstract builder.\n\t\t\tinjectMethod(job.builderType, generateFillValuesMethod(job, superclassBuilderClass != null, builderGenericName, classGenericName));\n\t\t\t// Generate $fillValuesFromInstanceIntoBuilder() method in the builder implementation class.\n\t\t\tinjectMethod(job.builderType, generateStaticFillValuesMethod(job, annInstance.setterPrefix()));\n\t\t}\n\t\t\n\t\t// Create the setter methods in the abstract builder.\n\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\tgenerateSetterMethodsForBuilder(job, bfd, builderGenericName, annInstance.setterPrefix());\n\t\t}\n\t\t\n\t\t// Generate abstract self() and build() methods in the abstract builder.\n\t\tinjectMethod(job.builderType, generateAbstractSelfMethod(job, superclassBuilderClass != null, builderGenericName));\n\t\tjob.setBuilderToAbstract();\n\t\tinjectMethod(job.builderType, generateAbstractBuildMethod(job, superclassBuilderClass != null, classGenericName));\n\t\t\n\t\t// Create the toString() method for the abstract builder.\n\t\tif (methodExists(\"toString\", job.builderType, 0) == MemberExistsResult.NOT_EXISTS) {\n\t\t\tList<Included<EclipseNode, ToString.Include>> fieldNodes = new ArrayList<Included<EclipseNode, ToString.Include>>();\n\t\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\t\tfor (EclipseNode f : bfd.createdFields) {\n\t\t\t\t\tfieldNodes.add(new Included<EclipseNode, ToString.Include>(f, null, true, false));\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Let toString() call super.toString() if there is a superclass, so that it also shows fields from the superclass' builder.\n\t\t\tMethodDeclaration md = HandleToString.createToString(job.builderType, fieldNodes, true, superclassBuilderClass != null, ast, FieldAccess.ALWAYS_FIELD);\n\t\t\tif (md != null) injectMethod(job.builderType, md);\n\t\t}\n\t\t\n\t\tif (addCleaning) {\n\t\t\tjob.setBuilderToAbstract();\n\t\t\tinjectMethod(job.builderType, generateCleanMethod(job));\n\t\t}\n\t\t\n\t\tboolean isAbstract = (td.modifiers & ClassFileConstants.AccAbstract) != 0;\n\t\tif (isAbstract) {\n\t\t\t// Only non-abstract classes get the Builder implementation.\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t// Create the builder implementation class, or reuse an existing one.\n\t\tjob.builderImplType = findInnerClass(parent, job.builderImplClassName);\n\t\tif (job.builderImplType == null) {\n\t\t\tjob.builderImplType = generateBuilderImplClass(job, job.builderImplClassName);\n\t\t} else {\n\t\t\tTypeDeclaration builderImplTypeDeclaration = (TypeDeclaration) job.builderImplType.get();\n\t\t\tif ((builderImplTypeDeclaration.modifiers & ClassFileConstants.AccAbstract) != 0 ||\n\t\t\t\t\t(builderImplTypeDeclaration.modifiers & ClassFileConstants.AccStatic) == 0) {\n\t\t\t\tannotationNode.addError(\"Existing BuilderImpl must be a non-abstract static inner class.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsanityCheckForMethodGeneratingAnnotationsOnBuilderClass(job.builderImplType, annotationNode);\n\t\t}\n\t\t\n\t\tjob.setBuilderToImpl();\n\t\tif (job.toBuilder) {\n\t\t\t// Add the toBuilder() method to the annotated class.\n\t\t\tswitch (methodExists(TO_BUILDER_METHOD_NAME_STRING, job.parentType, 0)) {\n\t\t\tcase EXISTS_BY_USER:\n\t\t\t\tbreak;\n\t\t\tcase NOT_EXISTS:\n\t\t\t\tinjectMethod(parent, generateToBuilderMethod(job));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// Should not happen.\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Create the self() and build() methods in the BuilderImpl.\n\t\tjob.setBuilderToImpl();\n\t\tinjectMethod(job.builderImplType, generateSelfMethod(job));\n\t\t\n\t\tif (methodExists(job.buildMethodName, job.builderImplType, -1) == MemberExistsResult.NOT_EXISTS) {\n\t\t\tjob.setBuilderToImpl();\n\t\t\tinjectMethod(job.builderImplType, generateBuildMethod(job, buildMethodReturnType));\n\t\t}\n\t\t\n\t\t// Add the builder() method to the annotated class.\n\t\tif (generateBuilderMethod && methodExists(job.builderMethodName, parent, -1) != MemberExistsResult.NOT_EXISTS) generateBuilderMethod = false;\n\t\tif (generateBuilderMethod) {\n\t\t\tMethodDeclaration md = generateBuilderMethod(job);\n\t\t\tif (md != null) injectMethod(parent, md);\n\t\t}\n\t\t\n\t\tif (nonFinalNonDefaultedFields != null && generateBuilderMethod) {\n\t\t\tfor (EclipseNode fieldNode : nonFinalNonDefaultedFields) {\n\t\t\t\tfieldNode.addWarning(\"@SuperBuilder will ignore the initializing expression entirely. If you want the initializing expression to serve as default, add @Builder.Default. If it is not supposed to be settable during building, make the field final.\");\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate EclipseNode generateBuilderAbstractClass(BuilderJob job, TypeReference superclassBuilderClass, String classGenericName, String builderGenericName) {\n\t\tTypeDeclaration parent = (TypeDeclaration) job.parentType.get();\n\t\tTypeDeclaration builder = new TypeDeclaration(parent.compilationResult);\n\t\tbuilder.bits |= Eclipse.ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tbuilder.modifiers |= ClassFileConstants.AccPublic | ClassFileConstants.AccStatic | ClassFileConstants.AccAbstract;\n\t\tbuilder.name = job.builderClassNameArr;\n\t\t\n\t\t// Keep any type params of the annotated class.\n\t\tbuilder.typeParameters = Arrays.copyOf(copyTypeParams(job.typeParams, job.source), job.typeParams.length + 2);\n\t\t// Add builder-specific type params required for inheritable builders.\n\t\t// 1. The return type for the build() method, named \"C\", which extends the annotated class.\n\t\tTypeParameter o = new TypeParameter();\n\t\to.name = classGenericName.toCharArray();\n\t\to.type = cloneSelfType(job.parentType, job.source);\n\t\tbuilder.typeParameters[builder.typeParameters.length - 2] = o;\n\t\t// 2. The return type for all setter methods, named \"B\", which extends this builder class.\n\t\to = new TypeParameter();\n\t\to.name = builderGenericName.toCharArray();\n\t\tTypeReference[] typerefs = appendBuilderTypeReferences(job.typeParams, classGenericName, builderGenericName);\n\t\to.type = generateParameterizedTypeReference(job.parentType, job.builderClassNameArr, false, typerefs, 0);\n\t\tbuilder.typeParameters[builder.typeParameters.length - 1] = o;\n\t\t\n\t\tif (superclassBuilderClass != null) builder.superclass = copyType(superclassBuilderClass, job.source);\n\t\t\n\t\tbuilder.createDefaultConstructor(false, true);\n\t\t\n\t\tbuilder.traverse(new SetGeneratedByVisitor(job.source), (ClassScope) null);\n\t\treturn injectType(job.parentType, builder);\n\t}\n\t\n\tprivate EclipseNode generateBuilderImplClass(BuilderJob job, String builderImplClass) {\n\t\tTypeDeclaration parent = (TypeDeclaration) job.parentType.get();\n\t\tTypeDeclaration builder = new TypeDeclaration(parent.compilationResult);\n\t\tbuilder.bits |= Eclipse.ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tbuilder.modifiers |= ClassFileConstants.AccPrivate | ClassFileConstants.AccStatic | ClassFileConstants.AccFinal;\n\t\tbuilder.name = builderImplClass.toCharArray();\n\t\t\n\t\t// Add type params if there are any.\n\t\tif (job.typeParams != null && job.typeParams.length > 0) builder.typeParameters = copyTypeParams(job.typeParams, job.source);\n\t\t\n\t\tif (job.builderClassName != null) {\n\t\t\t// Extend the abstract builder.\n\t\t\t// 1. Add any type params of the annotated class.\n\t\t\tTypeReference[] typeArgs = new TypeReference[job.typeParams.length + 2];\n\t\t\tfor (int i = 0; i < job.typeParams.length; i++) {\n\t\t\t\ttypeArgs[i] = new SingleTypeReference(job.typeParams[i].name, 0);\n\t\t\t}\n\t\t\t// 2. The return type for the build() method (named \"C\" in the abstract builder), which is the annotated class.\n\t\t\t// 3. The return type for all setter methods (named \"B\" in the abstract builder), which is this builder class.\n\t\t\ttypeArgs[typeArgs.length - 2] = cloneSelfType(job.parentType, job.source);\n\t\t\ttypeArgs[typeArgs.length - 1] = createTypeReferenceWithTypeParameters(job.parentType, builderImplClass, job.typeParams);\n\t\t\tbuilder.superclass = generateParameterizedTypeReference(job.parentType, job.builderClassNameArr, false, typeArgs, 0);\n\t\t}\n\t\t\n\t\tbuilder.createDefaultConstructor(false, true);\n\t\t\n\t\tbuilder.traverse(new SetGeneratedByVisitor(job.source), (ClassScope) null);\n\t\treturn injectType(job.parentType, builder);\n\t}\n\t\n\t/**\n\t * Generates a constructor that has a builder as the only parameter.\n\t * The values from the builder are used to initialize the fields of new instances.\n\t *\n\t * @param callBuilderBasedSuperConstructor\n\t *            If {@code true}, the constructor will explicitly call a super\n\t *            constructor with the builder as argument. Requires\n\t *            {@code builderClassAsParameter != null}.\n\t */\n\tprivate void generateBuilderBasedConstructor(BuilderJob job, boolean callBuilderBasedSuperConstructor) {\n\t\tTypeDeclaration typeDeclaration = ((TypeDeclaration) job.parentType.get());\n\t\tlong p = job.getPos();\n\t\t\n\t\tConstructorDeclaration constructor = new ConstructorDeclaration(((CompilationUnitDeclaration) job.parentType.top().get()).compilationResult);\n\t\t\n\t\tconstructor.modifiers = toEclipseModifier(AccessLevel.PROTECTED);\n\t\tconstructor.selector = typeDeclaration.name;\n\t\tif (callBuilderBasedSuperConstructor) {\n\t\t\tconstructor.constructorCall = new ExplicitConstructorCall(ExplicitConstructorCall.Super);\n\t\t\tconstructor.constructorCall.arguments = new Expression[] {new SingleNameReference(BUILDER_VARIABLE_NAME, p)};\n\t\t} else {\n\t\t\tconstructor.constructorCall = new ExplicitConstructorCall(ExplicitConstructorCall.ImplicitSuper);\n\t\t}\n\t\tconstructor.constructorCall.sourceStart = job.source.sourceStart;\n\t\tconstructor.constructorCall.sourceEnd = job.source.sourceEnd;\n\t\tconstructor.thrownExceptions = null;\n\t\tconstructor.typeParameters = null;\n\t\tconstructor.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tconstructor.bodyStart = constructor.declarationSourceStart = constructor.sourceStart = job.source.sourceStart;\n\t\tconstructor.bodyEnd = constructor.declarationSourceEnd = constructor.sourceEnd = job.source.sourceEnd;\n\t\t\n\t\tTypeReference[] wildcards = new TypeReference[] {new Wildcard(Wildcard.UNBOUND), new Wildcard(Wildcard.UNBOUND)};\n\t\tTypeReference builderType = generateParameterizedTypeReference(job.parentType, job.builderClassNameArr, false, mergeToTypeReferences(job.typeParams, wildcards), p);\n\t\tconstructor.arguments = new Argument[] {new Argument(BUILDER_VARIABLE_NAME, p, builderType, Modifier.FINAL)};\n\t\t\n\t\tList<Statement> statements = new ArrayList<Statement>();\n\t\t\n\t\tfor (BuilderFieldData fieldNode : job.builderFields) {\n\t\t\tFieldReference fieldInThis = new FieldReference(fieldNode.rawName, p);\n\t\t\tint s = (int) (p >> 32);\n\t\t\tint e = (int) p;\n\t\t\tfieldInThis.receiver = new ThisReference(s, e);\n\t\t\t\n\t\t\tExpression assignmentExpr;\n\t\t\tif (fieldNode.singularData != null && fieldNode.singularData.getSingularizer() != null) {\n\t\t\t\tfieldNode.singularData.getSingularizer().appendBuildCode(fieldNode.singularData, job.parentType, statements, fieldNode.builderFieldName, BUILDER_VARIABLE_NAME_STRING);\n\t\t\t\tassignmentExpr = new SingleNameReference(fieldNode.builderFieldName, p);\n\t\t\t} else {\n\t\t\t\tchar[][] variableInBuilder = new char[][] {BUILDER_VARIABLE_NAME, fieldNode.builderFieldName};\n\t\t\t\tlong[] positions = new long[] {p, p};\n\t\t\t\tassignmentExpr = new QualifiedNameReference(variableInBuilder, positions, s, e);\n\t\t\t}\n\t\t\tStatement assignment = new Assignment(fieldInThis, assignmentExpr, (int) p);\n\t\t\t\n\t\t\t// In case of @Builder.Default, set the value to the default if it was NOT set in the builder.\n\t\t\tif (fieldNode.nameOfSetFlag != null) {\n\t\t\t\tchar[][] setVariableInBuilder = new char[][] {BUILDER_VARIABLE_NAME, fieldNode.nameOfSetFlag};\n\t\t\t\tlong[] positions = new long[] {p, p};\n\t\t\t\tQualifiedNameReference setVariableInBuilderRef = new QualifiedNameReference(setVariableInBuilder, positions, s, e);\n\t\t\t\t\n\t\t\t\tMessageSend defaultMethodCall = new MessageSend();\n\t\t\t\tdefaultMethodCall.sourceStart = job.source.sourceStart;\n\t\t\t\tdefaultMethodCall.sourceEnd = job.source.sourceEnd;\n\t\t\t\tdefaultMethodCall.receiver = generateNameReference(job.parentType, 0L);\n\t\t\t\tdefaultMethodCall.selector = fieldNode.nameOfDefaultProvider;\n\t\t\t\tdefaultMethodCall.typeArguments = typeParameterNames(((TypeDeclaration) job.parentType.get()).typeParameters);\n\t\t\t\t\n\t\t\t\tStatement defaultAssignment = new Assignment(fieldInThis, defaultMethodCall, (int) p);\n\t\t\t\tIfStatement ifBlockForDefault = new IfStatement(setVariableInBuilderRef, assignment, defaultAssignment, s, e);\n\t\t\t\tstatements.add(ifBlockForDefault);\n\t\t\t} else {\n\t\t\t\tstatements.add(assignment);\n\t\t\t}\n\t\t\t\n\t\t\tif (hasNonNullAnnotations(fieldNode.originalFieldNode)) {\n\t\t\t\tStatement nullCheck = generateNullCheck((FieldDeclaration) fieldNode.originalFieldNode.get(), job.sourceNode, null);\n\t\t\t\tif (nullCheck != null) statements.add(nullCheck);\n\t\t\t}\n\t\t}\n\t\t\n\t\tconstructor.statements = statements.isEmpty() ? null : statements.toArray(new Statement[0]);\n\t\tif (job.checkerFramework.generateSideEffectFree()) {\n\t\t\tconstructor.annotations = new Annotation[] {generateNamedAnnotation(job.source, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE)};\n\t\t}\n\t\t\n\t\tconstructor.traverse(new SetGeneratedByVisitor(job.source), typeDeclaration.scope);\n\t\t\n\t\tinjectMethod(job.parentType, constructor);\n\t}\n\n\tprivate MethodDeclaration generateBuilderMethod(SuperBuilderJob job) {\n\t\tint pS = job.source.sourceStart, pE = job.source.sourceEnd;\n\t\tlong p = (long) pS << 32 | pE;\n\t\t\n\t\tMethodDeclaration out = job.createNewMethodDeclaration();\n\t\tout.selector = job.builderMethodName.toCharArray();\n\t\tout.modifiers = ClassFileConstants.AccPublic | ClassFileConstants.AccStatic;\n\t\tout.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\t\n\t\t// Add type params if there are any.\n\t\tif (job.typeParams != null && job.typeParams.length > 0) out.typeParameters = copyTypeParams(job.typeParams, job.source);\n\t\t\n\t\tTypeReference[] wildcards = new TypeReference[] {new Wildcard(Wildcard.UNBOUND), new Wildcard(Wildcard.UNBOUND) };\n\t\tout.returnType = generateParameterizedTypeReference(job.parentType, job.builderAbstractClassNameArr, false, mergeToTypeReferences(job.typeParams, wildcards), p);\n\t\tif (job.checkerFramework.generateUnique()) {\n\t\t\tint len = out.returnType.getTypeName().length;\n\t\t\tout.returnType.annotations = new Annotation[len][];\n\t\t\tout.returnType.annotations[len - 1] = new Annotation[] {generateNamedAnnotation(job.source, CheckerFrameworkVersion.NAME__UNIQUE)};\n\t\t}\n\t\t\n\t\tAllocationExpression invoke = new AllocationExpression();\n\t\tinvoke.type = namePlusTypeParamsToTypeReference(job.parentType, job.builderImplClassNameArr, false, job.typeParams, p);\n\t\tout.statements = new Statement[] {new ReturnStatement(invoke, pS, pE)};\n\t\tif (job.checkerFramework.generateSideEffectFree()) {\n\t\t\tout.annotations = new Annotation[] {generateNamedAnnotation(job.source, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE)};\n\t\t}\n\t\t\n\t\tcreateRelevantNonNullAnnotation(job.parentType, out);\n\t\tout.traverse(new SetGeneratedByVisitor(job.source), ((TypeDeclaration) job.parentType.get()).scope);\n\t\treturn out;\n\t}\n\t\n\t/**\n\t * Generates a {@code toBuilder()} method in the annotated class that looks like this:\n\t * <pre>\n\t * public <i>Foobar</i>.<i>Foobar</i>Builder&lt;?, ?&gt; toBuilder() {\n\t *     return new <i.Foobar</i>.<i>Foobar</i>BuilderImpl().$fillValuesFrom(this);\n\t * }\n\t * </pre>\n\t */\n\tprivate MethodDeclaration generateToBuilderMethod(SuperBuilderJob job) {\n\t\tint pS = job.source.sourceStart, pE = job.source.sourceEnd;\n\t\tlong p = (long) pS << 32 | pE;\n\t\t\n\t\tMethodDeclaration out = job.createNewMethodDeclaration();\n\t\tout.selector = TO_BUILDER_METHOD_NAME;\n\t\tout.modifiers = ClassFileConstants.AccPublic;\n\t\tout.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\t\n\t\tTypeReference[] wildcards = new TypeReference[] {new Wildcard(Wildcard.UNBOUND), new Wildcard(Wildcard.UNBOUND) };\n\t\tout.returnType = generateParameterizedTypeReference(job.parentType, job.builderAbstractClassNameArr, false, mergeToTypeReferences(job.typeParams, wildcards), p);\n\t\tif (job.checkerFramework.generateUnique()) {\n\t\t\tint len = out.returnType.getTypeName().length;\n\t\t\tout.returnType.annotations = new Annotation[len][];\n\t\t\tout.returnType.annotations[len - 1] = new Annotation[] {generateNamedAnnotation(job.source, CheckerFrameworkVersion.NAME__UNIQUE)};\n\t\t}\n\t\t\n\t\tAllocationExpression newClass = new AllocationExpression();\n\t\tnewClass.type = namePlusTypeParamsToTypeReference(job.parentType, job.builderImplClassNameArr, false, job.typeParams, p);\n\t\tMessageSend invokeFillMethod = new MessageSend();\n\t\tinvokeFillMethod.receiver = newClass;\n\t\tinvokeFillMethod.selector = FILL_VALUES_METHOD_NAME;\n\t\tinvokeFillMethod.arguments = new Expression[] {new ThisReference(0, 0)};\n\t\tout.statements = new Statement[] {new ReturnStatement(invokeFillMethod, pS, pE)};\n\t\tif (job.checkerFramework.generateSideEffectFree()) {\n\t\t\tout.annotations = new Annotation[] {generateNamedAnnotation(job.source, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE)};\n\t\t}\n\t\t\n\t\tcreateRelevantNonNullAnnotation(job.parentType, out);\n\t\tout.traverse(new SetGeneratedByVisitor(job.source), ((TypeDeclaration) job.parentType.get()).scope);\n\t\treturn out;\n\t}\n\t\n\t/**\n\t * Generates a {@code $fillValuesFrom()} method in the abstract builder class.\n\t * It looks like:\n\t * <pre>\n\t * protected B $fillValuesFrom(final C instance) {\n\t *     super.$fillValuesFrom(instance);\n\t *     Foobar.FoobarBuilder.$fillValuesFromInstanceIntoBuilder(instance, this);\n\t *     return self();\n\t * }\n\t * </pre>\n\t */\n\tprivate MethodDeclaration generateFillValuesMethod(SuperBuilderJob job, boolean inherited, String builderGenericName, String classGenericName) {\n\t\tMethodDeclaration out = job.createNewMethodDeclaration();\n\t\tout.selector = FILL_VALUES_METHOD_NAME;\n\t\tout.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tout.modifiers = ClassFileConstants.AccProtected;\n\t\tif (inherited) out.annotations = new Annotation[] {makeMarkerAnnotation(TypeConstants.JAVA_LANG_OVERRIDE, job.parentType.get())};\n\t\tout.returnType = new SingleTypeReference(builderGenericName.toCharArray(), 0);\n\t\t\n\t\tTypeReference builderType = new SingleTypeReference(classGenericName.toCharArray(), 0);\n\t\tout.arguments = new Argument[] {new Argument(INSTANCE_VARIABLE_NAME, 0, builderType, Modifier.FINAL)};\n\t\t\n\t\tList<Statement> body = new ArrayList<Statement>();\n\t\t\n\t\tif (inherited) {\n\t\t\t// Call super.\n\t\t\tMessageSend callToSuper = new MessageSend();\n\t\t\tcallToSuper.receiver = new SuperReference(0, 0);\n\t\t\tcallToSuper.selector = FILL_VALUES_METHOD_NAME;\n\t\t\tcallToSuper.arguments = new Expression[] {new SingleNameReference(INSTANCE_VARIABLE_NAME, 0)};\n\t\t\tbody.add(callToSuper);\n\t\t}\n\t\t\n\t\t// Call the builder implemention's helper method that actually fills the values from the instance.\n\t\tMessageSend callStaticFillValuesMethod = new MessageSend();\n\t\tcallStaticFillValuesMethod.receiver = generateNameReference(job.parentType, job.builderAbstractClassNameArr, 0);\n\t\tcallStaticFillValuesMethod.selector = FILL_VALUES_STATIC_METHOD_NAME;\n\t\tcallStaticFillValuesMethod.arguments = new Expression[] {new SingleNameReference(INSTANCE_VARIABLE_NAME, 0), new ThisReference(0, 0)};\n\t\tbody.add(callStaticFillValuesMethod);\n\t\t\n\t\t// Return self().\n\t\tMessageSend returnCall = new MessageSend();\n\t\treturnCall.receiver = ThisReference.implicitThis();\n\t\treturnCall.selector = SELF_METHOD_NAME;\n\t\tbody.add(new ReturnStatement(returnCall, 0, 0));\n\t\t\n\t\tout.statements = body.isEmpty() ? null : body.toArray(new Statement[0]);\n\t\t\n\t\treturn out;\n\t}\n\t\n\t/**\n\t * Generates a {@code $fillValuesFromInstanceIntoBuilder()} method in\n\t * the builder implementation class that copies all fields from the instance\n\t * to the builder. It looks like this:\n\t * \n\t * <pre>\n\t * protected B $fillValuesFromInstanceIntoBuilder(Foobar instance, FoobarBuilder&lt;?, ?&gt; b) {\n\t * \tb.field(instance.field);\n\t * }\n\t * </pre>\n\t * @param setterPrefix the prefix for setter methods\n\t */\n\tprivate MethodDeclaration generateStaticFillValuesMethod(BuilderJob job, String setterPrefix) {\n\t\tMethodDeclaration out = job.createNewMethodDeclaration();\n\t\tout.selector = FILL_VALUES_STATIC_METHOD_NAME;\n\t\tout.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tout.modifiers = ClassFileConstants.AccPrivate | ClassFileConstants.AccStatic;\n\t\tout.returnType = TypeReference.baseTypeReference(TypeIds.T_void, 0);\n\t\t\n\t\tTypeReference[] wildcards = new TypeReference[] {new Wildcard(Wildcard.UNBOUND), new Wildcard(Wildcard.UNBOUND)};\n\t\tTypeReference builderType = generateParameterizedTypeReference(job.parentType, job.builderClassNameArr, false, mergeToTypeReferences(job.typeParams, wildcards), 0);\n\t\tArgument builderArgument = new Argument(BUILDER_VARIABLE_NAME, 0, builderType, Modifier.FINAL);\n\t\tTypeReference[] typerefs = null;\n\t\tif (job.typeParams.length > 0) {\n\t\t\ttyperefs = new TypeReference[job.typeParams.length];\n\t\t\tfor (int i = 0; i < job.typeParams.length; i++) typerefs[i] = new SingleTypeReference(job.typeParams[i].name, 0);\n\t\t}\n\t\t\n\t\tlong p = job.getPos();\n\t\t\n\t\tTypeReference parentArgument = typerefs == null ? generateTypeReference(job.parentType, p) : generateParameterizedTypeReference(job.parentType, typerefs, p);\n\t\tout.arguments = new Argument[] {new Argument(INSTANCE_VARIABLE_NAME, 0, parentArgument, Modifier.FINAL), builderArgument};\n\t\t\n\t\t// Add type params if there are any.\n\t\tif (job.typeParams.length > 0) out.typeParameters = copyTypeParams(job.typeParams, job.source);\n\t\t\n\t\tList<Statement> body = new ArrayList<Statement>();\n\t\t\n\t\t// Call the builder's setter methods to fill the values from the instance.\n\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\tMessageSend exec = createSetterCallWithInstanceValue(bfd, job.parentType, job.source, setterPrefix);\n\t\t\tbody.add(exec);\n\t\t}\n\t\t\n\t\tout.statements = body.isEmpty() ? null : body.toArray(new Statement[0]);\n\t\tout.traverse(new SetGeneratedByVisitor(job.source), (ClassScope) null);\n\t\t\n\t\treturn out;\n\t}\n\t\n\tprivate MessageSend createSetterCallWithInstanceValue(BuilderFieldData bfd, EclipseNode type, ASTNode source, String setterPrefix) {\n\t\tchar[] setterName = HandlerUtil.buildAccessorName(type, setterPrefix, String.valueOf(bfd.name)).toCharArray();\n\t\tMessageSend ms = new MessageSend();\n\t\tExpression[] tgt = new Expression[bfd.singularData == null ? 1 : 2];\n\t\t\n\t\tif (bfd.obtainVia == null || !bfd.obtainVia.field().isEmpty()) {\n\t\t\tchar[] fieldName = bfd.obtainVia == null ? bfd.rawName : bfd.obtainVia.field().toCharArray();\n\t\t\tfor (int i = 0; i < tgt.length; i++) {\n\t\t\t\tFieldReference fr = new FieldReference(fieldName, 0);\n\t\t\t\tfr.receiver = new SingleNameReference(INSTANCE_VARIABLE_NAME, 0);\n\t\t\t\ttgt[i] = fr;\n\t\t\t}\n\t\t} else {\n\t\t\tString obtainName = bfd.obtainVia.method();\n\t\t\tboolean obtainIsStatic = bfd.obtainVia.isStatic();\n\t\t\tfor (int i = 0; i < tgt.length; i++) {\n\t\t\t\tMessageSend obtainExpr = new MessageSend();\n\t\t\t\tobtainExpr.receiver = obtainIsStatic ? generateNameReference(type, 0) : new SingleNameReference(INSTANCE_VARIABLE_NAME, 0);\n\t\t\t\tobtainExpr.selector = obtainName.toCharArray();\n\t\t\t\tif (obtainIsStatic) obtainExpr.arguments = new Expression[] {new SingleNameReference(INSTANCE_VARIABLE_NAME, 0)};\n\t\t\t\ttgt[i] = obtainExpr;\n\t\t\t}\n\t\t}\n\t\tif (bfd.singularData == null) {\n\t\t\tms.arguments = tgt;\n\t\t} else {\n\t\t\tExpression ifNull = new EqualExpression(tgt[0], new NullLiteral(0, 0), OperatorIds.EQUAL_EQUAL);\n\t\t\tMessageSend emptyCollection = bfd.singularData.getSingularizer().getEmptyExpression(bfd.singularData.getTargetFqn(), bfd.singularData, type, source);\n\t\t\tms.arguments = new Expression[] {new ConditionalExpression(ifNull, emptyCollection, tgt[1])};\n\t\t}\n\t\tms.receiver = new SingleNameReference(BUILDER_VARIABLE_NAME, 0);\n\t\tms.selector = setterName;\n\t\treturn ms;\n\t}\n\t\n\tprivate MethodDeclaration generateAbstractSelfMethod(BuilderJob job, boolean override, String builderGenericName) {\n\t\tMethodDeclaration out = job.createNewMethodDeclaration();\n\t\tout.selector = SELF_METHOD_NAME;\n\t\tout.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tout.modifiers = ClassFileConstants.AccAbstract | ClassFileConstants.AccProtected | ExtraCompilerModifiers.AccSemicolonBody;\n\t\tAnnotation overrideAnn = override ? makeMarkerAnnotation(TypeConstants.JAVA_LANG_OVERRIDE, job.parentType.get()) : null;\n\t\tAnnotation sefAnn = job.checkerFramework.generatePure() ? generateNamedAnnotation(job.parentType.get(), CheckerFrameworkVersion.NAME__PURE): null;\n\t\tif (overrideAnn != null && sefAnn != null) out.annotations = new Annotation[] {overrideAnn, sefAnn};\n\t\telse if (overrideAnn != null) out.annotations = new Annotation[] {overrideAnn};\n\t\telse if (sefAnn != null) out.annotations = new Annotation[] {sefAnn};\n\t\tout.returnType = new SingleTypeReference(builderGenericName.toCharArray(), 0);\n\t\taddCheckerFrameworkReturnsReceiver(out.returnType, job.parentType.get(), job.checkerFramework);\n\t\treturn out;\n\t}\n\t\n\tprivate MethodDeclaration generateSelfMethod(BuilderJob job) {\n\t\tMethodDeclaration out = job.createNewMethodDeclaration();\n\t\tout.selector = SELF_METHOD_NAME;\n\t\tout.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tout.modifiers = ClassFileConstants.AccProtected;\n\t\tAnnotation overrideAnn = makeMarkerAnnotation(TypeConstants.JAVA_LANG_OVERRIDE, job.builderType.get());\n\t\tAnnotation sefAnn = job.checkerFramework.generatePure() ? generateNamedAnnotation(job.builderType.get(), CheckerFrameworkVersion.NAME__PURE) : null;\n\t\tif (sefAnn != null) out.annotations = new Annotation[] {overrideAnn, sefAnn};\n\t\telse out.annotations = new Annotation[] {overrideAnn};\n\t\tout.returnType = namePlusTypeParamsToTypeReference(job.builderType, job.typeParams, job.getPos());\n\t\taddCheckerFrameworkReturnsReceiver(out.returnType, job.parentType.get(), job.checkerFramework);\n\t\tout.statements = new Statement[] {new ReturnStatement(new ThisReference(0, 0), 0, 0)};\n\t\treturn out;\n\t}\n\t\n\tprivate MethodDeclaration generateAbstractBuildMethod(BuilderJob job, boolean override, String classGenericName) {\n\t\tMethodDeclaration out = job.createNewMethodDeclaration();\n\t\tout.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\t\n\t\tout.modifiers = ClassFileConstants.AccPublic | ClassFileConstants.AccAbstract | ExtraCompilerModifiers.AccSemicolonBody;\n\t\tout.selector = job.buildMethodName.toCharArray();\n\t\tout.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tout.returnType = new SingleTypeReference(classGenericName.toCharArray(), 0);\n\t\tAnnotation overrideAnn = override ? makeMarkerAnnotation(TypeConstants.JAVA_LANG_OVERRIDE, job.source) : null;\n\t\tAnnotation sefAnn = job.checkerFramework.generateSideEffectFree() ? generateNamedAnnotation(job.source, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE): null;\n\t\tif (overrideAnn != null && sefAnn != null) out.annotations = new Annotation[] {overrideAnn, sefAnn};\n\t\telse if (overrideAnn != null) out.annotations = new Annotation[] {overrideAnn};\n\t\telse if (sefAnn != null) out.annotations = new Annotation[] {sefAnn};\n\t\tout.receiver = HandleBuilder.generateBuildReceiver(job);\n\t\tout.traverse(new SetGeneratedByVisitor(job.source), (ClassScope) null);\n\t\treturn out;\n\t}\n\t\n\tprivate MethodDeclaration generateBuildMethod(BuilderJob job, TypeReference returnType) {\n\t\tMethodDeclaration out = job.createNewMethodDeclaration();\n\t\tout.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tList<Statement> statements = new ArrayList<Statement>();\n\t\t\n\t\tout.modifiers = ClassFileConstants.AccPublic;\n\t\tout.selector = job.buildMethodName.toCharArray();\n\t\tout.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tout.returnType = returnType;\n\t\tAnnotation overrideAnn = makeMarkerAnnotation(TypeConstants.JAVA_LANG_OVERRIDE, job.source);\n\t\tAnnotation sefAnn = job.checkerFramework.generateSideEffectFree() ? generateNamedAnnotation(job.source, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE): null;\n\t\tif (sefAnn != null) out.annotations = new Annotation[] {overrideAnn, sefAnn};\n\t\telse out.annotations = new Annotation[] {overrideAnn};\n\t\t\n\t\tAllocationExpression allocationStatement = new AllocationExpression();\n\t\tallocationStatement.type = copyType(out.returnType);\n\t\t// Use a constructor that only has this builder as parameter.\n\t\tallocationStatement.arguments = new Expression[] {new ThisReference(0, 0)};\n\t\tstatements.add(new ReturnStatement(allocationStatement, 0, 0));\n\t\tout.statements = statements.isEmpty() ? null : statements.toArray(new Statement[0]);\n\t\tout.receiver = HandleBuilder.generateBuildReceiver(job);\n\t\tcreateRelevantNonNullAnnotation(job.builderType, out);\n\t\tout.traverse(new SetGeneratedByVisitor(job.source), (ClassScope) null);\n\t\treturn out;\n\t}\n\t\n\tprivate MethodDeclaration generateCleanMethod(BuilderJob job) {\n\t\tList<Statement> statements = new ArrayList<Statement>();\n\t\t\n\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\tif (bfd.singularData != null && bfd.singularData.getSingularizer() != null) {\n\t\t\t\tbfd.singularData.getSingularizer().appendCleaningCode(bfd.singularData, job.builderType, statements);\n\t\t\t}\n\t\t}\n\t\t\n\t\tFieldReference thisUnclean = new FieldReference(CLEAN_FIELD_NAME, 0);\n\t\tthisUnclean.receiver = new ThisReference(0, 0);\n\t\tstatements.add(new Assignment(thisUnclean, new FalseLiteral(0, 0), 0));\n\t\tMethodDeclaration decl = job.createNewMethodDeclaration();\n\t\t//new MethodDeclaration(((CompilationUnitDeclaration) builderType.top().get()).compilationResult);\n\t\tdecl.selector = CLEAN_METHOD_NAME;\n\t\tdecl.modifiers = ClassFileConstants.AccPrivate;\n\t\tdecl.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tdecl.returnType = TypeReference.baseTypeReference(TypeIds.T_void, 0);\n\t\tdecl.statements = statements.toArray(new Statement[0]);\n\t\tdecl.traverse(new SetGeneratedByVisitor(job.source), (ClassScope) null);\n\t\treturn decl;\n\t}\n\t\n\tprivate void generateBuilderFields(BuilderJob job) {\n\t\tList<EclipseNode> existing = new ArrayList<EclipseNode>();\n\t\tfor (EclipseNode child : job.builderType.down()) {\n\t\t\tif (child.getKind() == Kind.FIELD) existing.add(child);\n\t\t}\n\t\t\n\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\tif (bfd.singularData != null && bfd.singularData.getSingularizer() != null) {\n\t\t\t\tbfd.createdFields.addAll(bfd.singularData.getSingularizer().generateFields(bfd.singularData, job.builderType));\n\t\t\t} else {\n\t\t\t\tEclipseNode field = null, setFlag = null;\n\t\t\t\tfor (EclipseNode exists : existing) {\n\t\t\t\t\tchar[] n = ((FieldDeclaration) exists.get()).name;\n\t\t\t\t\tif (Arrays.equals(n, bfd.builderFieldName)) field = exists;\n\t\t\t\t\tif (bfd.nameOfSetFlag != null && Arrays.equals(n, bfd.nameOfSetFlag)) setFlag = exists;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (field == null) {\n\t\t\t\t\tFieldDeclaration fd = new FieldDeclaration(bfd.builderFieldName.clone(), 0, 0);\n\t\t\t\t\tfd.bits |= Eclipse.ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\t\t\t\tfd.modifiers = ClassFileConstants.AccPrivate;\n\t\t\t\t\tfd.type = copyType(bfd.type);\n\t\t\t\t\tfd.traverse(new SetGeneratedByVisitor(job.source), (MethodScope) null);\n\t\t\t\t\tfield = injectFieldAndMarkGenerated(job.builderType, fd);\n\t\t\t\t}\n\t\t\t\tif (setFlag == null && bfd.nameOfSetFlag != null) {\n\t\t\t\t\tFieldDeclaration fd = new FieldDeclaration(bfd.nameOfSetFlag, 0, 0);\n\t\t\t\t\tfd.bits |= Eclipse.ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\t\t\t\tfd.modifiers = ClassFileConstants.AccPrivate;\n\t\t\t\t\tfd.type = TypeReference.baseTypeReference(TypeIds.T_boolean, 0);\n\t\t\t\t\tfd.traverse(new SetGeneratedByVisitor(job.source), (MethodScope) null);\n\t\t\t\t\tinjectFieldAndMarkGenerated(job.builderType, fd);\n\t\t\t\t}\n\t\t\t\tbfd.createdFields.add(field);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate void generateSetterMethodsForBuilder(BuilderJob job, BuilderFieldData bfd, final String builderGenericName, String setterPrefix) {\n\t\tboolean deprecate = isFieldDeprecated(bfd.originalFieldNode);\n\t\t\n\t\tTypeReferenceMaker returnTypeMaker = new TypeReferenceMaker() {\n\t\t\t@Override public TypeReference make() {\n\t\t\t\treturn new SingleTypeReference(builderGenericName.toCharArray(), 0);\n\t\t\t}\n\t\t};\n\t\t\n\t\tStatementMaker returnStatementMaker = new StatementMaker() {\n\t\t\t@Override public ReturnStatement make() {\n\t\t\t\tMessageSend returnCall = new MessageSend();\n\t\t\t\treturnCall.receiver = ThisReference.implicitThis();\n\t\t\t\treturnCall.selector = SELF_METHOD_NAME;\n\t\t\t\treturn new ReturnStatement(returnCall, 0, 0);\n\t\t\t}\n\t\t};\n\t\t\n\t\tif (bfd.singularData == null || bfd.singularData.getSingularizer() == null) {\n\t\t\tgenerateSimpleSetterMethodForBuilder(job, deprecate, bfd.createdFields.get(0), bfd.name, bfd.nameOfSetFlag, returnTypeMaker.make(), returnStatementMaker.make(), bfd.annotations, bfd.originalFieldNode, setterPrefix);\n\t\t} else {\n\t\t\tbfd.singularData.getSingularizer().generateMethods(job.checkerFramework, bfd.singularData, deprecate, job.builderType, true, returnTypeMaker, returnStatementMaker, AccessLevel.PUBLIC);\n\t\t}\n\t}\n\t\n\tprivate void generateSimpleSetterMethodForBuilder(BuilderJob job, boolean deprecate, EclipseNode fieldNode, char[] paramName, char[] nameOfSetFlag, TypeReference returnType, Statement returnStatement, Annotation[] annosOnParam, EclipseNode originalFieldNode, String setterPrefix) {\n\t\tTypeDeclaration td = (TypeDeclaration) job.builderType.get();\n\t\tAbstractMethodDeclaration[] existing = td.methods;\n\t\tif (existing == null) existing = EMPTY_METHODS;\n\t\tint len = existing.length;\n\t\t\n\t\tString setterName = HandlerUtil.buildAccessorName(job.sourceNode, setterPrefix, new String(paramName));\n\t\t\n\t\tfor (int i = 0; i < len; i++) {\n\t\t\tif (!(existing[i] instanceof MethodDeclaration)) continue;\n\t\t\tchar[] existingName = existing[i].selector;\n\t\t\tif (Arrays.equals(setterName.toCharArray(), existingName) && !isTolerate(fieldNode, existing[i])) return;\n\t\t}\n\t\t\n\t\tList<Annotation> methodAnnsList = Arrays.asList(EclipseHandlerUtil.findCopyableToSetterAnnotations(originalFieldNode, true));\n\t\taddCheckerFrameworkReturnsReceiver(returnType, job.source, job.checkerFramework);\n\t\tMethodDeclaration setter = HandleSetter.createSetter(td, deprecate, fieldNode, setterName, paramName, nameOfSetFlag, returnType, returnStatement, ClassFileConstants.AccPublic,\n\t\t\tjob.sourceNode, methodAnnsList, annosOnParam != null ? Arrays.asList(copyAnnotations(job.source, annosOnParam)) : Collections.<Annotation>emptyList());\n\t\tif (job.sourceNode.up().getKind() == Kind.METHOD) {\n\t\t\tcopyJavadocFromParam(originalFieldNode.up(), setter, td, paramName.toString());\n\t\t} else {\n\t\t\tcopyJavadoc(originalFieldNode, setter, td, CopyJavadoc.SETTER, true);\n\t\t}\n\t\tinjectMethod(job.builderType, setter);\n\t}\n\t\n\tprivate void addObtainVia(BuilderFieldData bfd, EclipseNode node) {\n\t\tfor (EclipseNode child : node.down()) {\n\t\t\tif (!annotationTypeMatches(ObtainVia.class, child)) continue;\n\t\t\tAnnotationValues<ObtainVia> ann = createAnnotation(ObtainVia.class, child);\n\t\t\tbfd.obtainVia = ann.getInstance();\n\t\t\tbfd.obtainViaNode = child;\n\t\t\treturn;\n\t\t}\n\t}\n\t\n\t/**\n\t * Returns the explicitly requested singular annotation on this node (field\n\t * or parameter), or null if there's no {@code @Singular} annotation on it.\n\t *\n\t * @param node The node (field or method param) to inspect for its name and potential {@code @Singular} annotation.\n\t * @param setterPrefix the prefix for setter methods \n\t */\n\tprivate SingularData getSingularData(EclipseNode node, ASTNode source, String setterPrefix) {\n\t\tfor (EclipseNode child : node.down()) {\n\t\t\tif (!annotationTypeMatches(Singular.class, child)) continue;\n\t\t\t\n\t\t\tchar[] pluralName = node.getKind() == Kind.FIELD ? removePrefixFromField(node) : ((AbstractVariableDeclaration) node.get()).name;\n\t\t\tAnnotationValues<Singular> ann = createAnnotation(Singular.class, child);\n\t\t\tSingular singularInstance = ann.getInstance();\n\t\t\tString explicitSingular = singularInstance.value();\n\t\t\tif (explicitSingular.isEmpty()) {\n\t\t\t\tif (Boolean.FALSE.equals(node.getAst().readConfiguration(ConfigurationKeys.SINGULAR_AUTO))) {\n\t\t\t\t\tnode.addError(\"The singular must be specified explicitly (e.g. @Singular(\\\"task\\\")) because auto singularization is disabled.\");\n\t\t\t\t\texplicitSingular = new String(pluralName);\n\t\t\t\t} else {\n\t\t\t\t\texplicitSingular = autoSingularize(new String(pluralName));\n\t\t\t\t\tif (explicitSingular == null) {\n\t\t\t\t\t\tnode.addError(\"Can't singularize this name; please specify the singular explicitly (i.e. @Singular(\\\"sheep\\\"))\");\n\t\t\t\t\t\texplicitSingular = new String(pluralName);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tchar[] singularName = explicitSingular.toCharArray();\n\t\t\t\n\t\t\tTypeReference type = ((AbstractVariableDeclaration) node.get()).type;\n\t\t\tTypeReference[] typeArgs = null;\n\t\t\tString typeName;\n\t\t\tif (type instanceof ParameterizedSingleTypeReference) {\n\t\t\t\ttypeArgs = ((ParameterizedSingleTypeReference) type).typeArguments;\n\t\t\t\ttypeName = new String(((ParameterizedSingleTypeReference) type).token);\n\t\t\t} else if (type instanceof ParameterizedQualifiedTypeReference) {\n\t\t\t\tTypeReference[][] tr = ((ParameterizedQualifiedTypeReference) type).typeArguments;\n\t\t\t\tif (tr != null) typeArgs = tr[tr.length - 1];\n\t\t\t\tchar[][] tokens = ((ParameterizedQualifiedTypeReference) type).tokens;\n\t\t\t\tStringBuilder sb = new StringBuilder();\n\t\t\t\tfor (int i = 0; i < tokens.length; i++) {\n\t\t\t\t\tif (i > 0) sb.append(\".\");\n\t\t\t\t\tsb.append(tokens[i]);\n\t\t\t\t}\n\t\t\t\ttypeName = sb.toString();\n\t\t\t} else {\n\t\t\t\ttypeName = type.toString();\n\t\t\t}\n\t\t\t\n\t\t\tString targetFqn = EclipseSingularsRecipes.get().toQualified(typeName);\n\t\t\tEclipseSingularizer singularizer = EclipseSingularsRecipes.get().getSingularizer(targetFqn);\n\t\t\tif (singularizer == null) {\n\t\t\t\tnode.addError(\"Lombok does not know how to create the singular-form builder methods for type '\" + typeName + \"'; they won't be generated.\");\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t\n\t\t\treturn new SingularData(child, singularName, pluralName, typeArgs == null ? Collections.<TypeReference>emptyList() : Arrays.asList(typeArgs), targetFqn, singularizer, source, singularInstance.ignoreNullCollections(), setterPrefix.toCharArray());\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\t\n\tprivate java.util.Set<String> gatherUsedTypeNames(TypeParameter[] typeParams, TypeDeclaration td) {\n\t\tjava.util.HashSet<String> usedNames = new HashSet<String>();\n\t\t\n\t\t// 1. Add type parameter names.\n\t\tfor (TypeParameter typeParam : typeParams) usedNames.add(typeParam.toString());\n\t\t\n\t\t// 2. Add class name.\n\t\tusedNames.add(String.valueOf(td.name));\n\t\t\n\t\t// 3. Add used type names.\n\t\tif (td.fields != null) {\n\t\t\tfor (FieldDeclaration field : td.fields) {\n\t\t\t\tif (field instanceof Initializer) continue; \n\t\t\t\taddFirstToken(usedNames, field.type);\n\t\t\t}\n\t\t}\n\t\t\n\t\t// 4. Add extends and implements clauses.\n\t\taddFirstToken(usedNames, td.superclass);\n\t\tif (td.superInterfaces != null) {\n\t\t\tfor (TypeReference typeReference : td.superInterfaces) {\n\t\t\t\taddFirstToken(usedNames, typeReference);\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn usedNames;\n\t}\n\t\n\tprivate void addFirstToken(java.util.Set<String> usedNames, TypeReference type) {\n\t\tif (type == null) return;\n\t\t// Add the first token, because only that can collide.\n\t\tchar[][] typeName = type.getTypeName();\n\t\tif (typeName != null && typeName.length >= 1) usedNames.add(String.valueOf(typeName[0]));\n\t}\n\t\n\tprivate String generateNonclashingNameFor(String classGenericName, java.util.Set<String> typeParamStrings) {\n\t\tif (!typeParamStrings.contains(classGenericName)) return classGenericName;\n\t\tint counter = 2;\n\t\twhile (typeParamStrings.contains(classGenericName + counter)) counter++;\n\t\treturn classGenericName + counter;\n\t}\n\t\n\tprivate TypeReference[] appendBuilderTypeReferences(TypeParameter[] typeParams, String classGenericName, String builderGenericName) {\n\t\tTypeReference[] typeReferencesToAppend = new TypeReference[2];\n\t\ttypeReferencesToAppend[typeReferencesToAppend.length - 2] = new SingleTypeReference(classGenericName.toCharArray(), 0); \n\t\ttypeReferencesToAppend[typeReferencesToAppend.length - 1] = new SingleTypeReference(builderGenericName.toCharArray(), 0);\n\t\treturn mergeToTypeReferences(typeParams, typeReferencesToAppend);\n\t}\n\t\n\tprivate TypeReference[] getTypeParametersFrom(TypeReference typeRef) {\n\t\tTypeReference[][] typeArgss = null;\n\t\tif (typeRef instanceof ParameterizedQualifiedTypeReference) {\n\t\t\ttypeArgss = ((ParameterizedQualifiedTypeReference) typeRef).typeArguments;\n\t\t} else if (typeRef instanceof ParameterizedSingleTypeReference) {\n\t\t\ttypeArgss = new TypeReference[][] {((ParameterizedSingleTypeReference) typeRef).typeArguments};\n\t\t}\n\t\tTypeReference[] typeArgs = new TypeReference[0];\n\t\tif (typeArgss != null && typeArgss.length > 0) {\n\t\t\ttypeArgs = typeArgss[typeArgss.length - 1];\n\t\t}\n\t\treturn typeArgs;\n\t}\n\t\n\tprivate static TypeReference createTypeReferenceWithTypeParameters(EclipseNode parent, String referenceName, TypeParameter[] typeParams) {\n\t\tif (typeParams.length > 0) {\n\t\t\tTypeReference[] typerefs = new TypeReference[typeParams.length];\n\t\t\tfor (int i = 0; i < typeParams.length; i++) {\n\t\t\t\ttyperefs[i] = new SingleTypeReference(typeParams[i].name, 0);\n\t\t\t}\n\t\t\treturn generateParameterizedTypeReference(parent, referenceName.toCharArray(), false, typerefs, 0);\n\t\t} else {\n\t\t\treturn generateTypeReference(parent, referenceName.toCharArray(), false, 0);\n\t\t}\n\t}\n\t\n\tprivate TypeReference[] mergeToTypeReferences(TypeParameter[] typeParams, TypeReference[] typeReferencesToAppend) {\n\t\tTypeReference[] typerefs = new TypeReference[typeParams.length + typeReferencesToAppend.length];\n\t\tfor (int i = 0; i < typeParams.length; i++) {\n\t\t\ttyperefs[i] = new SingleTypeReference(typeParams[i].name, 0);\n\t\t}\n\t\tfor (int i = 0; i < typeReferencesToAppend.length; i++) {\n\t\t\ttyperefs[typeParams.length + i] = typeReferencesToAppend[i];\n\t\t}\n\t\treturn typerefs;\n\t}\n\t\n\tprivate TypeReference[] mergeTypeReferences(TypeReference[] refs1, TypeReference[] refs2) {\n\t\tTypeReference[] result = new TypeReference[refs1.length + refs2.length];\n\t\tfor (int i = 0; i < refs1.length; i++) result[i] = refs1[i];\n\t\tfor (int i = 0; i < refs2.length; i++) result[refs1.length + i] = refs2[i];\n\t\treturn result;\n\t}\n\t\n\tprivate TypeReference[] typeParameterNames(TypeParameter[] typeParameters) {\n\t\tif (typeParameters == null) return null;\n\t\t\n\t\tTypeReference[] trs = new TypeReference[typeParameters.length];\n\t\tfor (int i = 0; i < trs.length; i++) {\n\t\t\ttrs[i] = new SingleTypeReference(typeParameters[i].name, 0);\n\t\t}\n\t\treturn trs;\n\t}\n\t\n\tprivate EclipseNode findInnerClass(EclipseNode parent, String name) {\n\t\tchar[] c = name.toCharArray();\n\t\tfor (EclipseNode child : parent.down()) {\n\t\t\tif (child.getKind() != Kind.TYPE) continue;\n\t\t\tTypeDeclaration td = (TypeDeclaration) child.get();\n\t\t\tif (Arrays.equals(td.name, c)) return child;\n\t\t}\n\t\treturn null;\n\t}\n\t\n\tprivate static final char[] prefixWith(char[] prefix, char[] name) {\n\t\tchar[] out = new char[prefix.length + name.length];\n\t\tSystem.arraycopy(prefix, 0, out, 0, prefix.length);\n\t\tSystem.arraycopy(name, 0, out, prefix.length, name.length);\n\t\treturn out;\n\t}\n\t\n\tprivate boolean constructorExists(EclipseNode type, String builderClassName) {\n\t\tif (type != null && type.get() instanceof TypeDeclaration) {\n\t\t\tTypeDeclaration typeDecl = (TypeDeclaration)type.get();\n\t\t\tif (typeDecl.methods != null) for (AbstractMethodDeclaration def : typeDecl.methods) {\n\t\t\t\tif (def instanceof ConstructorDeclaration) {\n\t\t\t\t\tif ((def.bits & ASTNode.IsDefaultConstructor) != 0) continue;\n\t\t\t\t\tif (!def.isConstructor()) continue;\n\t\t\t\t\tif (isTolerate(type, def)) continue;\n\t\t\t\t\tif (def.arguments == null || def.arguments.length != 1) continue;\n\t\t\t\t\t\n\t\t\t\t\t// Cannot use typeMatches() here, because the parameter could be fully-qualified, partially-qualified, or not qualified.\n\t\t\t\t\t// A string-compare of the last part should work. If it's a false-positive, users could still @Tolerate it.\n\t\t\t\t\tchar[] typeName = def.arguments[0].type.getLastToken();\n\t\t\t\t\tif (builderClassName.equals(String.valueOf(typeName))) return true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleSynchronized.java",
    "content": "/*\n * Copyright (C) 2009-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.eclipse.EcjAugments.ASTNode_handled;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport java.lang.reflect.Modifier;\nimport java.util.Arrays;\n\nimport lombok.ConfigurationKeys;\nimport lombok.Synchronized;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.core.AST.Kind;\nimport lombok.eclipse.DeferUntilPostDiet;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.eclipse.handlers.EclipseHandlerUtil.MemberExistsResult;\nimport lombok.spi.Provides;\n\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.ArrayAllocationExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Block;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.FieldReference;\nimport org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.SynchronizedStatement;\nimport org.eclipse.jdt.internal.compiler.ast.ThisReference;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeConstants;\n\n/**\n * Handles the {@code lombok.Synchronized} annotation for eclipse.\n */\n@Provides\n@DeferUntilPostDiet\n@HandlerPriority(value = 1024) // 2^10; @NonNull must have run first, so that we wrap around the statements generated by it.\npublic class HandleSynchronized extends EclipseAnnotationHandler<Synchronized> {\n\tprivate static final char[] INSTANCE_LOCK_NAME = \"$lock\".toCharArray();\n\tprivate static final char[] STATIC_LOCK_NAME = \"$LOCK\".toCharArray();\n\t\n\t@Override public void preHandle(AnnotationValues<Synchronized> annotation, Annotation source, EclipseNode annotationNode) {\n\t\tEclipseNode methodNode = annotationNode.up();\n\t\tif (methodNode == null || methodNode.getKind() != Kind.METHOD || !(methodNode.get() instanceof MethodDeclaration)) return;\n\t\tMethodDeclaration method = (MethodDeclaration) methodNode.get();\n\t\tif (method.isAbstract()) return;\n\t\tEclipseNode typeNode = upToTypeNode(annotationNode);\n\t\tif (isRecord(typeNode)) return;\n\t\t\n\t\tcreateLockField(annotation, annotationNode, new boolean[] {method.isStatic()}, false);\n\t\t\n\t\tif (hasParsedBody(getAnnotatedMethod(annotationNode))) {\n\t\t\t// This method has a body in diet mode, so we have to handle it now.\n\t\t\thandle(annotation, source, annotationNode);\n\t\t\tASTNode_handled.set(source, true);\n\t\t}\n\t}\n\t\n\tpublic char[] createLockField(AnnotationValues<Synchronized> annotation, EclipseNode annotationNode, boolean[] isStatic, boolean reportErrors) {\n\t\tchar[] lockName = annotation.getInstance().value().toCharArray();\n\t\tAnnotation source = (Annotation) annotationNode.get();\n\t\tboolean autoMake = false;\n\t\tif (lockName.length == 0) {\n\t\t\tautoMake = true;\n\t\t\tlockName = isStatic[0] ? STATIC_LOCK_NAME : INSTANCE_LOCK_NAME;\n\t\t}\n\t\t\n\t\tEclipseNode typeNode = upToTypeNode(annotationNode);\n\t\tMemberExistsResult exists = MemberExistsResult.NOT_EXISTS;\n\t\t\n\t\tif (typeNode != null && typeNode.get() instanceof TypeDeclaration) {\n\t\t\tTypeDeclaration typeDecl = (TypeDeclaration) typeNode.get();\n\t\t\tif (typeDecl.fields != null) for (FieldDeclaration def : typeDecl.fields) {\n\t\t\t\tchar[] fName = def.name;\n\t\t\t\tif (fName == null) continue;\n\t\t\t\tif (Arrays.equals(fName, lockName)) {\n\t\t\t\t\texists = getGeneratedBy(def) == null ? MemberExistsResult.EXISTS_BY_USER : MemberExistsResult.EXISTS_BY_LOMBOK;\n\t\t\t\t\tboolean st = def.isStatic();\n\t\t\t\t\tif (!st && isStatic[0]) {\n\t\t\t\t\t\tif (reportErrors) annotationNode.addError(String.format(\"The field %s is non-static and thus cannot be used on this static method\", new String(lockName)));\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tisStatic[0] = st;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (exists == MemberExistsResult.NOT_EXISTS) {\n\t\t\tif (!autoMake) {\n\t\t\t\tif (reportErrors) annotationNode.addError(String.format(\"The field %s does not exist\", new String(lockName)));\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tFieldDeclaration fieldDecl = new FieldDeclaration(lockName, 0, -1);\n\t\t\tsetGeneratedBy(fieldDecl, source);\n\t\t\tfieldDecl.declarationSourceEnd = -1;\n\t\t\t\n\t\t\tfieldDecl.modifiers = (isStatic[0] ? Modifier.STATIC : 0) | Modifier.FINAL | Modifier.PRIVATE;\n\t\t\t\n\t\t\t//We use 'new Object[0];' because unlike 'new Object();', empty arrays *ARE* serializable!\n\t\t\tArrayAllocationExpression arrayAlloc = new ArrayAllocationExpression();\n\t\t\tsetGeneratedBy(arrayAlloc, source);\n\t\t\tarrayAlloc.dimensions = new Expression[] { makeIntLiteral(\"0\".toCharArray(), source) };\n\t\t\tarrayAlloc.type = new QualifiedTypeReference(TypeConstants.JAVA_LANG_OBJECT, new long[] { 0, 0, 0 });\n\t\t\tsetGeneratedBy(arrayAlloc.type, source);\n\t\t\tfieldDecl.type = new QualifiedTypeReference(TypeConstants.JAVA_LANG_OBJECT, new long[] { 0, 0, 0 });\n\t\t\tsetGeneratedBy(fieldDecl.type, source);\n\t\t\tfieldDecl.initialization = arrayAlloc;\n\t\t\tinjectFieldAndMarkGenerated(annotationNode.up().up(), fieldDecl);\n\t\t}\n\t\t\n\t\treturn lockName;\n\t}\n\t\n\t@Override public void handle(AnnotationValues<Synchronized> annotation, Annotation source, EclipseNode annotationNode) {\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.SYNCHRONIZED_FLAG_USAGE, \"@Synchronized\");\n\t\t\n\t\tint p1 = source.sourceStart -1;\n\t\tint p2 = source.sourceStart -2;\n\t\tlong pos = (((long) p1) << 32) | p2;\n\t\tEclipseNode methodNode = annotationNode.up();\n\t\tif (methodNode == null || methodNode.getKind() != Kind.METHOD || !(methodNode.get() instanceof MethodDeclaration)) {\n\t\t\tannotationNode.addError(\"@Synchronized is legal only on methods.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tMethodDeclaration method = (MethodDeclaration) methodNode.get();\n\t\tif (method.isAbstract()) {\n\t\t\tannotationNode.addError(\"@Synchronized is legal only on concrete methods.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tEclipseNode typeNode = upToTypeNode(annotationNode);\n\t\tif (!isClassOrEnum(typeNode)) {\n\t\t\tannotationNode.addError(\"@Synchronized is legal only on methods in classes and enums.\");\n\t\t\treturn;\n\t\t}\n\t\tboolean[] isStatic = { method.isStatic() };\n\t\tchar[] lockName = createLockField(annotation, annotationNode, isStatic, true);\n\t\tif (lockName == null) return;\n\t\tif (method.statements == null) return;\n\t\t\n\t\tBlock block = new Block(0);\n\t\tsetGeneratedBy(block, source);\n\t\tblock.statements = method.statements;\n\t\t\n\t\t// Positions for in-method generated nodes are special\n\t\tblock.sourceEnd = method.bodyEnd;\n\t\tblock.sourceStart = method.bodyStart;\n\t\t\n\t\tExpression lockVariable;\n\t\tif (isStatic[0]) {\n\t\t\tchar[][] n = getQualifiedInnerName(typeNode, lockName);\n\t\t\tlong[] ps = new long[n.length];\n\t\t\tArrays.fill(ps, pos);\n\t\t\tlockVariable = new QualifiedNameReference(n, ps, p1, p2);\n\t\t} else {\n\t\t\tlockVariable = new FieldReference(lockName, pos);\n\t\t\tThisReference thisReference = new ThisReference(p1, p2);\n\t\t\tsetGeneratedBy(thisReference, source);\n\t\t\t((FieldReference) lockVariable).receiver = thisReference;\n\t\t}\n\t\tsetGeneratedBy(lockVariable, source);\n\t\t\n\t\tmethod.statements = new Statement[] {\n\t\t\tnew SynchronizedStatement(lockVariable, block, 0, 0)\n\t\t};\n\t\t\n\t\t// Positions for in-method generated nodes are special\n\t\tmethod.statements[0].sourceEnd = method.bodyEnd;\n\t\tmethod.statements[0].sourceStart = method.bodyStart;\n\t\t\n\t\tsetGeneratedBy(method.statements[0], source);\n\t\t\n\t\tmethodNode.rebuild();\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleToString.java",
    "content": "/*\n * Copyright (C) 2009-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.handleFlagUsage;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport java.util.Arrays;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\n\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.BinaryExpression;\nimport org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.MessageSend;\nimport org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.NameReference;\nimport org.eclipse.jdt.internal.compiler.ast.OperatorIds;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.ReturnStatement;\nimport org.eclipse.jdt.internal.compiler.ast.SingleNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.StringLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.SuperReference;\nimport org.eclipse.jdt.internal.compiler.ast.ThisReference;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeConstants;\n\nimport lombok.AccessLevel;\nimport lombok.ConfigurationKeys;\nimport lombok.ToString;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.core.configuration.CallSuperType;\nimport lombok.core.configuration.CheckerFrameworkVersion;\nimport lombok.core.handlers.HandlerUtil.FieldAccess;\nimport lombok.core.handlers.InclusionExclusionUtils;\nimport lombok.core.handlers.InclusionExclusionUtils.Included;\nimport lombok.eclipse.Eclipse;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.spi.Provides;\n\n/**\n * Handles the {@code ToString} annotation for eclipse.\n */\n@Provides\npublic class HandleToString extends EclipseAnnotationHandler<ToString> {\n\tpublic void handle(AnnotationValues<ToString> annotation, Annotation ast, EclipseNode annotationNode) {\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.TO_STRING_FLAG_USAGE, \"@ToString\");\n\t\t\n\t\tToString ann = annotation.getInstance();\n\t\tboolean onlyExplicitlyIncluded = annotationNode.getAst().getBooleanAnnotationValue(annotation, \"onlyExplicitlyIncluded\", ConfigurationKeys.TO_STRING_ONLY_EXPLICITLY_INCLUDED);\n\t\tList<Included<EclipseNode, ToString.Include>> members = InclusionExclusionUtils.handleToStringMarking(annotationNode.up(), onlyExplicitlyIncluded, annotation, annotationNode);\n\t\tif (members == null) return;\n\t\t\n\t\tBoolean callSuper = ann.callSuper();\n\t\t\n\t\tif (!annotation.isExplicit(\"callSuper\")) callSuper = null;\n\t\t\n\t\tBoolean doNotUseGettersConfiguration = annotationNode.getAst().readConfiguration(ConfigurationKeys.TO_STRING_DO_NOT_USE_GETTERS);\n\t\tboolean doNotUseGetters = annotation.isExplicit(\"doNotUseGetters\") || doNotUseGettersConfiguration == null ? ann.doNotUseGetters() : doNotUseGettersConfiguration;\n\t\tFieldAccess fieldAccess = doNotUseGetters ? FieldAccess.PREFER_FIELD : FieldAccess.GETTER;\n\t\t\n\t\tBoolean fieldNamesConfiguration = annotationNode.getAst().readConfiguration(ConfigurationKeys.TO_STRING_INCLUDE_FIELD_NAMES);\n\t\tboolean includeFieldNames = annotation.isExplicit(\"includeFieldNames\") || fieldNamesConfiguration == null ? ann.includeFieldNames() : fieldNamesConfiguration;\n\t\t\n\t\tgenerateToString(annotationNode.up(), annotationNode, members, includeFieldNames, callSuper, true, fieldAccess);\n\t}\n\t\n\tpublic void generateToStringForType(EclipseNode typeNode, EclipseNode errorNode) {\n\t\tif (hasAnnotation(ToString.class, typeNode)) {\n\t\t\t//The annotation will make it happen, so we can skip it.\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tAnnotationValues<ToString> anno = AnnotationValues.of(ToString.class);\n\t\tboolean includeFieldNames = typeNode.getAst().getBooleanAnnotationValue(anno, \"includeFieldNames\", ConfigurationKeys.TO_STRING_INCLUDE_FIELD_NAMES);\n\t\tboolean onlyExplicitlyIncluded = typeNode.getAst().getBooleanAnnotationValue(anno, \"onlyExplicitlyIncluded\", ConfigurationKeys.TO_STRING_ONLY_EXPLICITLY_INCLUDED);\n\t\t\n\t\tBoolean doNotUseGettersConfiguration = typeNode.getAst().readConfiguration(ConfigurationKeys.TO_STRING_DO_NOT_USE_GETTERS);\n\t\tFieldAccess access = doNotUseGettersConfiguration == null || !doNotUseGettersConfiguration ? FieldAccess.GETTER : FieldAccess.PREFER_FIELD;\n\t\t\n\t\tList<Included<EclipseNode, ToString.Include>> members = InclusionExclusionUtils.handleToStringMarking(typeNode, onlyExplicitlyIncluded, null, null);\n\t\tgenerateToString(typeNode, errorNode, members, includeFieldNames, null, false, access);\n\t}\n\t\n\tpublic void generateToString(EclipseNode typeNode, EclipseNode errorNode, List<Included<EclipseNode, ToString.Include>> members,\n\t\tboolean includeFieldNames, Boolean callSuper, boolean whineIfExists, FieldAccess fieldAccess) {\n\t\t\n\t\tif (!isClassOrEnum(typeNode)) {\n\t\t\terrorNode.addError(\"@ToString is only supported on a class or enum.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tswitch (methodExists(\"toString\", typeNode, 0)) {\n\t\tcase NOT_EXISTS:\n\t\t\tif (callSuper == null) {\n\t\t\t\tif (isDirectDescendantOfObject(typeNode)) {\n\t\t\t\t\tcallSuper = false;\n\t\t\t\t} else {\n\t\t\t\t\tCallSuperType cst = typeNode.getAst().readConfiguration(ConfigurationKeys.TO_STRING_CALL_SUPER);\n\t\t\t\t\tif (cst == null) cst = CallSuperType.SKIP;\n\t\t\t\t\tswitch (cst) {\n\t\t\t\t\tdefault:\n\t\t\t\t\tcase SKIP:\n\t\t\t\t\t\tcallSuper = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase WARN:\n\t\t\t\t\t\terrorNode.addWarning(\"Generating toString implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this intentional, add '@ToString(callSuper=false)' to your type.\");\n\t\t\t\t\t\tcallSuper = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase CALL:\n\t\t\t\t\t\tcallSuper = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tMethodDeclaration toString = createToString(typeNode, members, includeFieldNames, callSuper, errorNode.get(), fieldAccess);\n\t\t\tinjectMethod(typeNode, toString);\n\t\t\tbreak;\n\t\tcase EXISTS_BY_LOMBOK:\n\t\t\tbreak;\n\t\tdefault:\n\t\tcase EXISTS_BY_USER:\n\t\t\tif (whineIfExists) {\n\t\t\t\terrorNode.addWarning(\"Not generating toString(): A method with that name already exists\");\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic static MethodDeclaration createToString(EclipseNode type, Collection<Included<EclipseNode, ToString.Include>> members,\n\t\tboolean includeNames, boolean callSuper, ASTNode source, FieldAccess fieldAccess) {\n\t\t\n\t\tString typeName = getTypeName(type);\n\t\tboolean isEnum = type.isEnumType();\n\t\t\n\t\tchar[] suffix = \")\".toCharArray();\n\t\tString infixS = \", \";\n\t\tchar[] infix = infixS.toCharArray();\n\t\tint pS = source.sourceStart, pE = source.sourceEnd;\n\t\tlong p = (long) pS << 32 | pE;\n\t\tfinal int PLUS = OperatorIds.PLUS;\n\t\t\n\t\tString prefix;\n\t\t\n\t\tif (callSuper) {\n\t\t\tprefix = \"(super=\";\n\t\t} else if (members.isEmpty()) {\n\t\t\tprefix = isEnum ? \"\" : \"()\";\n\t\t} else if (includeNames) {\n\t\t\tIncluded<EclipseNode, ToString.Include> firstMember = members.iterator().next();\n\t\t\tString name = firstMember.getInc() == null ? \"\" : firstMember.getInc().name();\n\t\t\tif (name.isEmpty()) name = firstMember.getNode().getName();\n\t\t\tprefix = \"(\" + name + \"=\";\n\t\t} else {\n\t\t\tprefix = \"(\";\n\t\t}\n\t\t\n\t\tboolean first = true;\n\t\tExpression current;\n\t\tif (!isEnum) {\n\t\t\tcurrent = new StringLiteral((typeName + prefix).toCharArray(), pS, pE, 0);\n\t\t\tsetGeneratedBy(current, source);\n\t\t} else {\n\t\t\tcurrent = new StringLiteral((typeName + \".\").toCharArray(), pS, pE, 0);\n\t\t\tsetGeneratedBy(current, source);\n\n\t\t\tMessageSend thisName = new MessageSend();\n\t\t\tthisName.sourceStart = pS; thisName.sourceEnd = pE;\n\t\t\tsetGeneratedBy(thisName, source);\n\t\t\tthisName.receiver = new ThisReference(pS, pE);\n\t\t\tsetGeneratedBy(thisName.receiver, source);\n\t\t\tthisName.selector = \"name\".toCharArray();\n\t\t\tcurrent = new BinaryExpression(current, thisName, PLUS);\n\t\t\tsetGeneratedBy(current, source);\n\t\t\t\n\t\t\tif (!prefix.isEmpty()) {\n\t\t\t\tStringLiteral px = new StringLiteral(prefix.toCharArray(), pS, pE, 0);\n\t\t\t\tsetGeneratedBy(px, source);\n\t\t\t\tcurrent = new BinaryExpression(current, px, PLUS);\n\t\t\t\tcurrent.sourceStart = pS; current.sourceEnd = pE;\n\t\t\t\tsetGeneratedBy(current, source);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (callSuper) {\n\t\t\tMessageSend callToSuper = new MessageSend();\n\t\t\tcallToSuper.sourceStart = pS; callToSuper.sourceEnd = pE;\n\t\t\tsetGeneratedBy(callToSuper, source);\n\t\t\tcallToSuper.receiver = new SuperReference(pS, pE);\n\t\t\tsetGeneratedBy(callToSuper.receiver, source);\n\t\t\tcallToSuper.selector = \"toString\".toCharArray();\n\t\t\tcurrent = new BinaryExpression(current, callToSuper, PLUS);\n\t\t\tsetGeneratedBy(current, source);\n\t\t\tfirst = false;\n\t\t}\n\t\t\n\t\tfor (Included<EclipseNode, ToString.Include> member : members) {\n\t\t\tEclipseNode memberNode = member.getNode();\n\t\t\t\n\t\t\tTypeReference fieldType = getFieldType(memberNode, fieldAccess);\n\t\t\tExpression memberAccessor;\n\t\t\tif (memberNode.getKind() == Kind.METHOD) {\n\t\t\t\tmemberAccessor = createMethodAccessor(memberNode, source);\n\t\t\t} else {\n\t\t\t\tmemberAccessor = createFieldAccessor(memberNode, fieldAccess, source);\n\t\t\t}\n\t\t\t\n\t\t\t// The distinction between primitive and object will be useful if we ever add a 'hideNulls' option.\n\t\t\tboolean fieldBaseTypeIsPrimitive = BUILT_IN_TYPES.contains(new String(fieldType.getLastToken()));\n\t\t\t@SuppressWarnings(\"unused\")\n\t\t\tboolean fieldIsPrimitive = fieldType.dimensions() == 0 && fieldBaseTypeIsPrimitive;\n\t\t\tboolean fieldIsPrimitiveArray = fieldType.dimensions() == 1 && fieldBaseTypeIsPrimitive;\n\t\t\tboolean fieldIsObjectArray = fieldType.dimensions() > 0 && !fieldIsPrimitiveArray;\n\t\t\t\n\t\t\tExpression ex;\n\t\t\tif (fieldIsPrimitiveArray || fieldIsObjectArray) {\n\t\t\t\tMessageSend arrayToString = new MessageSend();\n\t\t\t\tarrayToString.sourceStart = pS; arrayToString.sourceEnd = pE;\n\t\t\t\tarrayToString.receiver = generateQualifiedNameRef(source, TypeConstants.JAVA, TypeConstants.UTIL, \"Arrays\".toCharArray());\n\t\t\t\tarrayToString.arguments = new Expression[] { memberAccessor };\n\t\t\t\tsetGeneratedBy(arrayToString.arguments[0], source);\n\t\t\t\tarrayToString.selector = (fieldIsObjectArray ? \"deepToString\" : \"toString\").toCharArray();\n\t\t\t\tex = arrayToString;\n\t\t\t} else {\n\t\t\t\tex = memberAccessor;\n\t\t\t}\n\t\t\tsetGeneratedBy(ex, source);\n\t\t\t\n\t\t\tif (first) {\n\t\t\t\tcurrent = new BinaryExpression(current, ex, PLUS);\n\t\t\t\tcurrent.sourceStart = pS; current.sourceEnd = pE;\n\t\t\t\tsetGeneratedBy(current, source);\n\t\t\t\tfirst = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tStringLiteral fieldNameLiteral;\n\t\t\tif (includeNames) {\n\t\t\t\tString n = member.getInc() == null ? \"\" : member.getInc().name();\n\t\t\t\tif (n.isEmpty()) n = memberNode.getName();\n\t\t\t\tchar[] namePlusEqualsSign = (infixS + n + \"=\").toCharArray();\n\t\t\t\tfieldNameLiteral = new StringLiteral(namePlusEqualsSign, pS, pE, 0);\n\t\t\t} else {\n\t\t\t\tfieldNameLiteral = new StringLiteral(infix, pS, pE, 0);\n\t\t\t}\n\t\t\tsetGeneratedBy(fieldNameLiteral, source);\n\t\t\tcurrent = new BinaryExpression(current, fieldNameLiteral, PLUS);\n\t\t\tsetGeneratedBy(current, source);\n\t\t\tcurrent = new BinaryExpression(current, ex, PLUS);\n\t\t\tsetGeneratedBy(current, source);\n\t\t}\n\t\tif (!first) {\n\t\t\tStringLiteral suffixLiteral = new StringLiteral(suffix, pS, pE, 0);\n\t\t\tsetGeneratedBy(suffixLiteral, source);\n\t\t\tcurrent = new BinaryExpression(current, suffixLiteral, PLUS);\n\t\t\tsetGeneratedBy(current, source);\n\t\t}\n\t\t\n\t\tReturnStatement returnStatement = new ReturnStatement(current, pS, pE);\n\t\tsetGeneratedBy(returnStatement, source);\n\t\t\n\t\tMethodDeclaration method = new MethodDeclaration(((CompilationUnitDeclaration) type.top().get()).compilationResult);\n\t\tsetGeneratedBy(method, source);\n\t\tmethod.modifiers = toEclipseModifier(AccessLevel.PUBLIC);\n\t\tmethod.returnType = new QualifiedTypeReference(TypeConstants.JAVA_LANG_STRING, new long[] {p, p, p});\n\t\tsetGeneratedBy(method.returnType, source);\n\t\tAnnotation overrideAnnotation = makeMarkerAnnotation(TypeConstants.JAVA_LANG_OVERRIDE, source);\n\t\tif (getCheckerFrameworkVersion(type).generateSideEffectFree()) {\n\t\t\tmethod.annotations = new Annotation[] { overrideAnnotation, generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE) };\n\t\t} else {\n\t\t\tmethod.annotations = new Annotation[] { overrideAnnotation };\n\t\t}\n\t\tmethod.arguments = null;\n\t\tmethod.selector = \"toString\".toCharArray();\n\t\tmethod.thrownExceptions = null;\n\t\tmethod.typeParameters = null;\n\t\tmethod.bits |= Eclipse.ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tmethod.bodyStart = method.declarationSourceStart = method.sourceStart = source.sourceStart;\n\t\tmethod.bodyEnd = method.declarationSourceEnd = method.sourceEnd = source.sourceEnd;\n\t\tmethod.statements = new Statement[] { returnStatement };\n\t\tEclipseHandlerUtil.createRelevantNonNullAnnotation(type, method);\n\t\treturn method;\n\t}\n\t\n\tpublic static String getTypeName(EclipseNode type) {\n\t\tString typeName = getSingleTypeName(type);\n\t\tEclipseNode upType = type.up();\n\t\twhile (upType.getKind() == Kind.TYPE) {\n\t\t\tString upTypeName = getSingleTypeName(upType);\n\t\t\tif (upTypeName.isEmpty()) break;\n\t\t\ttypeName = upTypeName + \".\" + typeName;\n\t\t\tupType = upType.up();\n\t\t}\n\t\treturn typeName;\n\t}\n\t\n\tpublic static String getSingleTypeName(EclipseNode type) {\n\t\tTypeDeclaration typeDeclaration = (TypeDeclaration)type.get();\n\t\tchar[] rawTypeName = typeDeclaration.name;\n\t\treturn rawTypeName == null ? \"\" : new String(rawTypeName);\n\t}\n\t\n\tprivate static final Set<String> BUILT_IN_TYPES = Collections.unmodifiableSet(new HashSet<String>(Arrays.asList(\n\t\t\t\"byte\", \"short\", \"int\", \"long\", \"char\", \"boolean\", \"double\", \"float\")));\n\t\n\tpublic static NameReference generateQualifiedNameRef(ASTNode source, char[]... varNames) {\n\t\tint pS = source.sourceStart, pE = source.sourceEnd;\n\t\tlong p = (long)pS << 32 | pE;\n\t\tNameReference ref;\n\t\tif (varNames.length > 1) ref = new QualifiedNameReference(varNames, new long[varNames.length], pS, pE);\n\t\telse ref = new SingleNameReference(varNames[0], p);\n\t\tsetGeneratedBy(ref, source);\n\t\treturn ref;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleUtilityClass.java",
    "content": "/*\n * Copyright (C) 2015-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.eclipse.Eclipse.*;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.AllocationExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.Clinit;\nimport org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.ExplicitConstructorCall;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.StringLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.ThrowStatement;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeConstants;\n\nimport lombok.ConfigurationKeys;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.core.AST.Kind;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.experimental.UtilityClass;\nimport lombok.spi.Provides;\n\n/**\n * Handles the {@code lombok.experimental.UtilityClass} annotation for eclipse.\n */\n@Provides\n@HandlerPriority(-4096) //-2^12; to ensure @FieldDefaults picks up on the 'static' we set here.\npublic class HandleUtilityClass extends EclipseAnnotationHandler<UtilityClass> {\n\t@Override public void handle(AnnotationValues<UtilityClass> annotation, Annotation ast, EclipseNode annotationNode) {\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.UTILITY_CLASS_FLAG_USAGE, \"@UtilityClass\");\n\t\t\n\t\tEclipseNode typeNode = annotationNode.up();\n\t\tif (!checkLegality(typeNode, annotationNode)) return;\n\t\tchangeModifiersAndGenerateConstructor(annotationNode.up(), annotationNode);\n\t}\n\t\n\tprivate static boolean checkLegality(EclipseNode typeNode, EclipseNode errorNode) {\n\t\tif (!isClass(typeNode)) {\n\t\t\terrorNode.addError(\"@UtilityClass is only supported on a class.\");\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\t// It might be an inner class. This is okay, but only if it is / can be a static inner class. Thus, all of its parents have to be static inner classes until the top-level.\n\t\tEclipseNode typeWalk = typeNode;\n\t\twhile (true) {\n\t\t\ttypeWalk = typeWalk.up();\n\t\t\tswitch (typeWalk.getKind()) {\n\t\t\tcase TYPE:\n\t\t\t\tif ((((TypeDeclaration) typeWalk.get()).modifiers & (ClassFileConstants.AccStatic | ClassFileConstants.AccInterface | ClassFileConstants.AccAnnotation | ClassFileConstants.AccEnum)) != 0) continue;\n\t\t\t\tif (typeWalk.up().getKind() == Kind.COMPILATION_UNIT) return true;\n\t\t\t\terrorNode.addError(\"@UtilityClass automatically makes the class static, however, this class cannot be made static.\");\n\t\t\t\treturn false;\n\t\t\tcase COMPILATION_UNIT:\n\t\t\t\treturn true;\n\t\t\tdefault:\n\t\t\t\terrorNode.addError(\"@UtilityClass cannot be placed on a method local or anonymous inner class, or any class nested in such a class.\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate void changeModifiersAndGenerateConstructor(EclipseNode typeNode, EclipseNode annotationNode) {\n\t\tTypeDeclaration classDecl = (TypeDeclaration) typeNode.get();\n\t\t\n\t\tboolean makeConstructor = true;\n\t\t\n\t\tclassDecl.modifiers |= ClassFileConstants.AccFinal;\n\t\t\n\t\tboolean markStatic = true;\n\t\tboolean requiresClInit = false;\n\t\tboolean alreadyHasClinit = false;\n\t\t\n\t\tif (typeNode.up().getKind() == Kind.COMPILATION_UNIT) markStatic = false;\n\t\tif (markStatic && typeNode.up().getKind() == Kind.TYPE) {\n\t\t\tTypeDeclaration typeDecl = (TypeDeclaration) typeNode.up().get();\n\t\t\tif ((typeDecl.modifiers & (ClassFileConstants.AccInterface | ClassFileConstants.AccAnnotation)) != 0) markStatic = false;\n\t\t}\n\t\t\n\t\tif (markStatic) classDecl.modifiers |= ClassFileConstants.AccStatic;\n\t\t\n\t\tfor (EclipseNode element : typeNode.down()) {\n\t\t\tif (element.getKind() == Kind.FIELD) {\n\t\t\t\tFieldDeclaration fieldDecl = (FieldDeclaration) element.get();\n\t\t\t\tif ((fieldDecl.modifiers & ClassFileConstants.AccStatic) == 0) {\n\t\t\t\t\trequiresClInit = true;\n\t\t\t\t\tfieldDecl.modifiers |= ClassFileConstants.AccStatic;\n\t\t\t\t}\n\t\t\t} else if (element.getKind() == Kind.METHOD) {\n\t\t\t\tAbstractMethodDeclaration amd = (AbstractMethodDeclaration) element.get();\n\t\t\t\tif (amd instanceof ConstructorDeclaration) {\n\t\t\t\t\tConstructorDeclaration constrDecl = (ConstructorDeclaration) element.get();\n\t\t\t\t\tif (getGeneratedBy(constrDecl) == null && (constrDecl.bits & ASTNode.IsDefaultConstructor) == 0) {\n\t\t\t\t\t\telement.addError(\"@UtilityClasses cannot have declared constructors.\");\n\t\t\t\t\t\tmakeConstructor = false;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t} else if (amd instanceof MethodDeclaration) {\n\t\t\t\t\tamd.modifiers |= ClassFileConstants.AccStatic;\n\t\t\t\t} else if (amd instanceof Clinit) {\n\t\t\t\t\talreadyHasClinit = true;\n\t\t\t\t}\n\t\t\t} else if (element.getKind() == Kind.TYPE) {\n\t\t\t\t((TypeDeclaration) element.get()).modifiers |= ClassFileConstants.AccStatic;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (makeConstructor) createPrivateDefaultConstructor(typeNode, annotationNode);\n\t\tif (requiresClInit && !alreadyHasClinit) classDecl.addClinit();\n\t}\n\t\n\tprivate static final char[][] JAVA_LANG_UNSUPPORTED_OPERATION_EXCEPTION = new char[][] {\n\t\tTypeConstants.JAVA, TypeConstants.LANG, \"UnsupportedOperationException\".toCharArray()\n\t};\n\t\n\tprivate static final char[] UNSUPPORTED_MESSAGE = \"This is a utility class and cannot be instantiated\".toCharArray();\n\t\n\tprivate void createPrivateDefaultConstructor(EclipseNode typeNode, EclipseNode sourceNode) {\n\t\tASTNode source = sourceNode.get();\n\t\t\n\t\tTypeDeclaration typeDeclaration = ((TypeDeclaration) typeNode.get());\n\t\t\n\t\tConstructorDeclaration constructor = new ConstructorDeclaration(((CompilationUnitDeclaration) typeNode.top().get()).compilationResult);\n\t\t\n\t\tconstructor.modifiers = ClassFileConstants.AccPrivate;\n\t\tconstructor.selector = typeDeclaration.name;\n\t\tconstructor.constructorCall = new ExplicitConstructorCall(ExplicitConstructorCall.ImplicitSuper);\n\t\tconstructor.thrownExceptions = null;\n\t\tconstructor.typeParameters = null;\n\t\tconstructor.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tconstructor.arguments = null;\n\t\t\n\t\tlong[] ps = new long[JAVA_LANG_UNSUPPORTED_OPERATION_EXCEPTION.length];\n\t\tAllocationExpression exception = new AllocationExpression();\n\t\texception.type = new QualifiedTypeReference(JAVA_LANG_UNSUPPORTED_OPERATION_EXCEPTION, ps);\n\t\texception.arguments = new Expression[] {\n\t\t\t\tnew StringLiteral(UNSUPPORTED_MESSAGE, 0, 0, 0)\n\t\t};\n\t\tThrowStatement throwStatement = new ThrowStatement(exception, 0, 0);\n\t\t\n\t\tconstructor.statements = new Statement[] {throwStatement};\n\t\t\n\t\tconstructor.traverse(new SetGeneratedByVisitor(source), typeDeclaration.scope);\n\t\tinjectMethod(typeNode, constructor);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleVal.java",
    "content": "/*\n * Copyright (C) 2010-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.handleFlagUsage;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.typeMatches;\n\nimport lombok.ConfigurationKeys;\nimport lombok.val;\nimport lombok.var;\nimport lombok.core.HandlerPriority;\nimport lombok.eclipse.DeferUntilPostDiet;\nimport lombok.eclipse.EclipseASTAdapter;\nimport lombok.eclipse.EclipseASTVisitor;\nimport lombok.eclipse.EclipseNode;\nimport lombok.spi.Provides;\n\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.ArrayInitializer;\nimport org.eclipse.jdt.internal.compiler.ast.ForStatement;\nimport org.eclipse.jdt.internal.compiler.ast.ForeachStatement;\nimport org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.NullLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\n\n/*\n * This class just handles 3 basic error cases. The real meat of eclipse 'val' support is in {@code PatchVal} and {@code PatchValEclipse}\n */\n@Provides(EclipseASTVisitor.class)\n@DeferUntilPostDiet\n@HandlerPriority(65536) // 2^16; resolution needs to work, so if the RHS expression is i.e. a call to a generated getter, we have to run after that getter has been generated.\npublic class HandleVal extends EclipseASTAdapter {\n\t@Override public void visitLocal(EclipseNode localNode, LocalDeclaration local) {\n\t\tTypeReference type = local.type;\n\t\tboolean isVal = typeMatches(val.class, localNode, type);\n\t\tboolean isVar = typeMatches(var.class, localNode, type);\n\t\tif (!(isVal || isVar)) return;\n\t\t\n\t\tif (isVal) handleFlagUsage(localNode, ConfigurationKeys.VAL_FLAG_USAGE, \"val\");\n\t\tif (isVar) handleFlagUsage(localNode, ConfigurationKeys.VAR_FLAG_USAGE, \"var\");\n\t\t\n\t\tboolean variableOfForEach = false;\n\t\t\n\t\tif (localNode.directUp().get() instanceof ForeachStatement) {\n\t\t\tForeachStatement fs = (ForeachStatement) localNode.directUp().get();\n\t\t\tvariableOfForEach = fs.elementVariable == local;\n\t\t}\n\t\t\n\t\tString annotation = isVal ? \"val\" : \"var\";\n\t\tif (local.initialization == null && !variableOfForEach) {\n\t\t\tlocalNode.addError(\"'\" + annotation + \"' on a local variable requires an initializer expression\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (local.initialization instanceof ArrayInitializer) {\n\t\t\tlocalNode.addError(\"'\" + annotation + \"' is not compatible with array initializer expressions. Use the full form (new int[] { ... } instead of just { ... })\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tASTNode parentRaw = localNode.directUp().get();\n\t\t\n\t\tif (isVal && parentRaw instanceof ForStatement) {\n\t\t\tlocalNode.addError(\"'val' is not allowed in old-style for loops\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (parentRaw instanceof ForStatement && ((ForStatement) parentRaw).initializations != null && ((ForStatement) parentRaw).initializations.length > 1) {\n\t\t\tlocalNode.addError(\"'var' is not allowed in old-style for loops if there is more than 1 initializer\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (local.initialization != null && local.initialization.getClass().getName().equals(\"org.eclipse.jdt.internal.compiler.ast.LambdaExpression\")) {\n\t\t\tlocalNode.addError(\"'\" + annotation + \"' is not allowed with lambda expressions.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif(isVar && local.initialization instanceof NullLiteral) {\n\t\t\tlocalNode.addError(\"variable initializer is 'null'\");\n\t\t\treturn;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleValue.java",
    "content": "/*\n * Copyright (C) 2012-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport java.util.Collections;\n\nimport lombok.AccessLevel;\nimport lombok.ConfigurationKeys;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.eclipse.handlers.HandleConstructor.SkipIfConstructorExists;\nimport lombok.experimental.NonFinal;\nimport lombok.spi.Provides;\nimport lombok.Value;\n\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;\n\n/**\n * Handles the {@code lombok.Value} annotation for eclipse.\n */\n@Provides\n@HandlerPriority(-512) //-2^9; to ensure @EqualsAndHashCode and such pick up on this handler making the class final and messing with the fields' access levels, run earlier.\npublic class HandleValue extends EclipseAnnotationHandler<Value> {\n\tprivate HandleFieldDefaults handleFieldDefaults = new HandleFieldDefaults();\n\tprivate HandleGetter handleGetter = new HandleGetter();\n\tprivate HandleEqualsAndHashCode handleEqualsAndHashCode = new HandleEqualsAndHashCode();\n\tprivate HandleToString handleToString = new HandleToString();\n\tprivate HandleConstructor handleConstructor = new HandleConstructor();\n\t\n\tpublic void handle(AnnotationValues<Value> annotation, Annotation ast, EclipseNode annotationNode) {\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.VALUE_FLAG_USAGE, \"@Value\");\n\t\t\n\t\tValue ann = annotation.getInstance();\n\t\tEclipseNode typeNode = annotationNode.up();\n\t\t\n\t\tif (!isClass(typeNode)) {\n\t\t\tannotationNode.addError(\"@Value is only supported on a class.\");\n\t\t\treturn;\n\t\t}\n\t\tTypeDeclaration typeDecl = (TypeDeclaration) typeNode.get();\n\t\t\n\t\t// Make class final.\n\t\tif (!hasAnnotation(NonFinal.class, typeNode)) {\n\t\t\tif ((typeDecl.modifiers & ClassFileConstants.AccFinal) == 0) {\n\t\t\t\ttypeDecl.modifiers |= ClassFileConstants.AccFinal;\n\t\t\t\ttypeNode.rebuild();\n\t\t\t}\n\t\t}\n\t\t\n\t\thandleFieldDefaults.generateFieldDefaultsForType(typeNode, annotationNode, AccessLevel.PRIVATE, true, true);\n\t\t\n\t\t//Careful: Generate the public static constructor (if there is one) LAST, so that any attempt to\n\t\t//'find callers' on the annotation node will find callers of the constructor, which is by far the\n\t\t//most useful of the many methods built by @Value. This trick won't work for the non-static constructor,\n\t\t//for whatever reason, though you can find callers of that one by focusing on the class name itself\n\t\t//and hitting 'find callers'.\n\t\t\n\t\thandleGetter.generateGetterForType(typeNode, annotationNode, AccessLevel.PUBLIC, true, Collections.<Annotation>emptyList());\n\t\thandleEqualsAndHashCode.generateEqualsAndHashCodeForType(typeNode, annotationNode);\n\t\thandleToString.generateToStringForType(typeNode, annotationNode);\n\t\thandleConstructor.generateAllArgsConstructor(typeNode, AccessLevel.PUBLIC, ann.staticConstructor(), SkipIfConstructorExists.YES,\n\t\t\t\tCollections.<Annotation>emptyList(), annotationNode);\n\t\thandleConstructor.generateExtraNoArgsConstructor(typeNode, annotationNode);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleWith.java",
    "content": "/*\n * Copyright (C) 2012-2022 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.eclipse.Eclipse.*;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.List;\n\nimport lombok.AccessLevel;\nimport lombok.ConfigurationKeys;\nimport lombok.With;\nimport lombok.core.AST.Kind;\nimport lombok.core.configuration.CheckerFrameworkVersion;\nimport lombok.core.AnnotationValues;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.experimental.Accessors;\nimport lombok.spi.Provides;\n\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.AllocationExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.Argument;\nimport org.eclipse.jdt.internal.compiler.ast.ConditionalExpression;\nimport org.eclipse.jdt.internal.compiler.ast.EqualExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.OperatorIds;\nimport org.eclipse.jdt.internal.compiler.ast.ReturnStatement;\nimport org.eclipse.jdt.internal.compiler.ast.SingleNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.ThisReference;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\nimport org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;\nimport org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers;\n\n@Provides\npublic class HandleWith extends EclipseAnnotationHandler<With> {\n\tpublic boolean generateWithForType(EclipseNode typeNode, EclipseNode pos, AccessLevel level, boolean checkForTypeLevelWith) {\n\t\tif (checkForTypeLevelWith) {\n\t\t\tif (hasAnnotation(With.class, typeNode)) {\n\t\t\t\t//The annotation will make it happen, so we can skip it.\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t\n\t\tTypeDeclaration typeDecl = null;\n\t\tif (typeNode.get() instanceof TypeDeclaration) typeDecl = (TypeDeclaration) typeNode.get();\n\t\tint modifiers = typeDecl == null ? 0 : typeDecl.modifiers;\n\t\tboolean notAClass = (modifiers &\n\t\t\t\t(ClassFileConstants.AccInterface | ClassFileConstants.AccAnnotation | ClassFileConstants.AccEnum)) != 0;\n\t\t\n\t\tif (typeDecl == null || notAClass) {\n\t\t\tpos.addError(\"@With is only supported on a class or a field.\");\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tfor (EclipseNode field : typeNode.down()) {\n\t\t\tif (field.getKind() != Kind.FIELD) continue;\n\t\t\tFieldDeclaration fieldDecl = (FieldDeclaration) field.get();\n\t\t\tif (!filterField(fieldDecl)) continue;\n\t\t\t\n\t\t\t//Skip final fields.\n\t\t\tif ((fieldDecl.modifiers & ClassFileConstants.AccFinal) != 0 && fieldDecl.initialization != null) continue;\n\t\t\t\n\t\t\tgenerateWithForField(field, pos, level);\n\t\t}\n\t\treturn true;\n\t}\n\t\n\t\n\t/**\n\t * Generates a with on the stated field.\n\t * \n\t * Used by {@link HandleValue}.\n\t * \n\t * The difference between this call and the handle method is as follows:\n\t * \n\t * If there is a {@code lombok.With} annotation on the field, it is used and the\n\t * same rules apply (e.g. warning if the method already exists, stated access level applies).\n\t * If not, the with method is still generated if it isn't already there, though there will not\n\t * be a warning if its already there. The default access level is used.\n\t */\n\tpublic void generateWithForField(EclipseNode fieldNode, EclipseNode sourceNode, AccessLevel level) {\n\t\tfor (EclipseNode child : fieldNode.down()) {\n\t\t\tif (child.getKind() == Kind.ANNOTATION) {\n\t\t\t\tif (annotationTypeMatches(With.class, child)) {\n\t\t\t\t\t//The annotation will make it happen, so we can skip it.\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tList<Annotation> empty = Collections.emptyList();\n\t\tcreateWithForField(level, fieldNode, sourceNode, false, empty, empty);\n\t}\n\t\n\t@Override public void handle(AnnotationValues<With> annotation, Annotation ast, EclipseNode annotationNode) {\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.WITH_FLAG_USAGE, \"@With\");\n\t\t\n\t\tEclipseNode node = annotationNode.up();\n\t\tAccessLevel level = annotation.getInstance().value();\n\t\tif (level == AccessLevel.NONE || node == null) return;\n\t\t\n\t\tList<Annotation> onMethod = unboxAndRemoveAnnotationParameter(ast, \"onMethod\", \"@With(onMethod\", annotationNode);\n\t\tList<Annotation> onParam = unboxAndRemoveAnnotationParameter(ast, \"onParam\", \"@With(onParam\", annotationNode);\n\t\t\n\t\tswitch (node.getKind()) {\n\t\tcase FIELD:\n\t\t\tcreateWithForFields(level, annotationNode.upFromAnnotationToFields(), annotationNode, true, onMethod, onParam);\n\t\t\tbreak;\n\t\tcase TYPE:\n\t\t\tif (!onMethod.isEmpty()) {\n\t\t\t\tannotationNode.addError(\"'onMethod' is not supported for @With on a type.\");\n\t\t\t}\n\t\t\tif (!onParam.isEmpty()) {\n\t\t\t\tannotationNode.addError(\"'onParam' is not supported for @With on a type.\");\n\t\t\t}\n\t\t\tgenerateWithForType(node, annotationNode, level, false);\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tpublic void createWithForFields(AccessLevel level, Collection<EclipseNode> fieldNodes, EclipseNode sourceNode, boolean whineIfExists, List<Annotation> onMethod, List<Annotation> onParam) {\n\t\tfor (EclipseNode fieldNode : fieldNodes) {\n\t\t\tcreateWithForField(level, fieldNode, sourceNode, whineIfExists, onMethod, onParam);\n\t\t}\n\t}\n\t\n\tpublic void createWithForField(\n\t\tAccessLevel level, EclipseNode fieldNode, EclipseNode sourceNode,\n\t\tboolean whineIfExists, List<Annotation> onMethod,\n\t\tList<Annotation> onParam) {\n\t\t\n\t\tASTNode source = sourceNode.get();\n\t\tif (fieldNode.getKind() != Kind.FIELD) {\n\t\t\tsourceNode.addError(\"@With is only supported on a class or a field.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tEclipseNode typeNode = fieldNode.up();\n\t\tboolean makeAbstract = typeNode != null && typeNode.getKind() == Kind.TYPE && (((TypeDeclaration) typeNode.get()).modifiers & ClassFileConstants.AccAbstract) != 0;\n\t\t\n\t\tFieldDeclaration field = (FieldDeclaration) fieldNode.get();\n\t\tTypeReference fieldType = copyType(field.type, source);\n\t\tboolean isBoolean = isBoolean(fieldType);\n\t\tAnnotationValues<Accessors> accessors = getAccessorsForField(fieldNode);\n\t\tString withName = toWithName(fieldNode, isBoolean, accessors);\n\t\t\n\t\tif (withName == null) {\n\t\t\tfieldNode.addWarning(\"Not generating a with method for this field: It does not fit your @Accessors prefix list.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif ((field.modifiers & ClassFileConstants.AccStatic) != 0) {\n\t\t\tfieldNode.addWarning(\"Not generating \" + withName + \" for this field: With methods cannot be generated for static fields.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif ((field.modifiers & ClassFileConstants.AccFinal) != 0 && field.initialization != null) {\n\t\t\tfieldNode.addWarning(\"Not generating \" + withName + \" for this field: With methods cannot be generated for final, initialized fields.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (field.name != null && field.name.length > 0 && field.name[0] == '$') {\n\t\t\tfieldNode.addWarning(\"Not generating \" + withName + \" for this field: With methods cannot be generated for fields starting with $.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tfor (String altName : toAllWithNames(fieldNode, isBoolean, accessors)) {\n\t\t\tswitch (methodExists(altName, fieldNode, false, 1)) {\n\t\t\tcase EXISTS_BY_LOMBOK:\n\t\t\t\treturn;\n\t\t\tcase EXISTS_BY_USER:\n\t\t\t\tif (whineIfExists) {\n\t\t\t\t\tString altNameExpl = \"\";\n\t\t\t\t\tif (!altName.equals(withName)) altNameExpl = String.format(\" (%s)\", altName);\n\t\t\t\t\tfieldNode.addWarning(\n\t\t\t\t\t\tString.format(\"Not generating %s(): A method with that name already exists%s\", withName, altNameExpl));\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\tcase NOT_EXISTS:\n\t\t\t\t//continue scanning the other alt names.\n\t\t\t}\n\t\t}\n\t\t\n\t\tint modifier = toEclipseModifier(level);\n\t\t\n\t\tMethodDeclaration method = createWith((TypeDeclaration) fieldNode.up().get(), fieldNode, withName, modifier, sourceNode, onMethod, onParam, makeAbstract);\n\t\tinjectMethod(fieldNode.up(), method);\n\t}\n\t\n\tpublic MethodDeclaration createWith(TypeDeclaration parent, EclipseNode fieldNode, String name, int modifier, EclipseNode sourceNode, List<Annotation> onMethod, List<Annotation> onParam, boolean makeAbstract) {\n\t\tASTNode source = sourceNode.get();\n\t\tif (name == null) return null;\n\t\tFieldDeclaration field = (FieldDeclaration) fieldNode.get();\n\t\tint pS = source.sourceStart, pE = source.sourceEnd;\n\t\tlong p = (long) pS << 32 | pE;\n\t\tMethodDeclaration method = new MethodDeclaration(parent.compilationResult);\n\t\tAnnotationValues<Accessors> accessors = getAccessorsForField(fieldNode);\n\t\tif (makeAbstract) modifier |= ClassFileConstants.AccAbstract | ExtraCompilerModifiers.AccSemicolonBody;\n\t\tif (shouldMakeFinal(fieldNode, accessors)) modifier |= ClassFileConstants.AccFinal;\n\t\tmethod.modifiers = modifier;\n\t\tmethod.returnType = cloneSelfType(fieldNode, source);\n\t\tif (method.returnType == null) return null;\n\t\t\n\t\tAnnotation[] deprecated = null, checkerFramework = null;\n\t\tif (isFieldDeprecated(fieldNode)) deprecated = new Annotation[] { generateDeprecatedAnnotation(source) };\n\t\tif (getCheckerFrameworkVersion(fieldNode).generateSideEffectFree()) checkerFramework = new Annotation[] { generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE) };\n\t\t\n\t\tmethod.annotations = copyAnnotations(source, onMethod.toArray(new Annotation[0]), checkerFramework, deprecated);\n\t\tArgument param = new Argument(field.name, p, copyType(field.type, source), ClassFileConstants.AccFinal);\n\t\tparam.sourceStart = pS; param.sourceEnd = pE;\n\t\tmethod.arguments = new Argument[] { param };\n\t\tmethod.selector = name.toCharArray();\n\t\tmethod.binding = null;\n\t\tmethod.thrownExceptions = null;\n\t\tmethod.typeParameters = null;\n\t\tmethod.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\t\n\t\tAnnotation[] copyableAnnotations = findCopyableAnnotations(fieldNode);\n\t\t\n\t\tif (!makeAbstract) {\n\t\t\tList<Expression> args = new ArrayList<Expression>();\n\t\t\tfor (EclipseNode child : fieldNode.up().down()) {\n\t\t\t\tif (child.getKind() != Kind.FIELD) continue;\n\t\t\t\tFieldDeclaration childDecl = (FieldDeclaration) child.get();\n\t\t\t\t// Skip fields that start with $\n\t\t\t\tif (childDecl.name != null && childDecl.name.length > 0 && childDecl.name[0] == '$') continue;\n\t\t\t\tlong fieldFlags = childDecl.modifiers;\n\t\t\t\t// Skip static fields.\n\t\t\t\tif ((fieldFlags & ClassFileConstants.AccStatic) != 0) continue;\n\t\t\t\t// Skip initialized final fields.\n\t\t\t\tif (((fieldFlags & ClassFileConstants.AccFinal) != 0) && childDecl.initialization != null) continue;\n\t\t\t\tif (child.get() == fieldNode.get()) {\n\t\t\t\t\targs.add(new SingleNameReference(field.name, p));\n\t\t\t\t} else {\n\t\t\t\t\targs.add(createFieldAccessor(child, FieldAccess.ALWAYS_FIELD, source));\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tAllocationExpression constructorCall = new AllocationExpression();\n\t\t\tconstructorCall.arguments = args.toArray(new Expression[0]);\n\t\t\tconstructorCall.type = cloneSelfType(fieldNode, source);\n\t\t\t\n\t\t\tExpression identityCheck = new EqualExpression(\n\t\t\t\t\tcreateFieldAccessor(fieldNode, FieldAccess.ALWAYS_FIELD, source),\n\t\t\t\t\tnew SingleNameReference(field.name, p),\n\t\t\t\t\tOperatorIds.EQUAL_EQUAL);\n\t\t\tThisReference thisRef = new ThisReference(pS, pE);\n\t\t\tExpression conditional = new ConditionalExpression(identityCheck, thisRef, constructorCall);\n\t\t\tStatement returnStatement = new ReturnStatement(conditional, pS, pE);\n\t\t\tmethod.bodyStart = method.declarationSourceStart = method.sourceStart = source.sourceStart;\n\t\t\tmethod.bodyEnd = method.declarationSourceEnd = method.sourceEnd = source.sourceEnd;\n\t\t\t\n\t\t\tList<Statement> statements = new ArrayList<Statement>(5);\n\t\t\tif (hasNonNullAnnotations(fieldNode)) {\n\t\t\t\tStatement nullCheck = generateNullCheck(field, sourceNode, null);\n\t\t\t\tif (nullCheck != null) statements.add(nullCheck);\n\t\t\t}\n\t\t\tstatements.add(returnStatement);\n\t\t\t\n\t\t\tmethod.statements = statements.toArray(new Statement[0]);\n\t\t}\n\t\tparam.annotations = copyAnnotations(source, copyableAnnotations, onParam.toArray(new Annotation[0]));\n\t\t\n\t\tEclipseHandlerUtil.createRelevantNonNullAnnotation(fieldNode, method);\n\t\t\n\t\tmethod.traverse(new SetGeneratedByVisitor(source), parent.scope);\n\t\tcopyJavadoc(fieldNode, method, CopyJavadoc.WITH);\n\t\treturn method;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/HandleWithBy.java",
    "content": "/*\n * Copyright (C) 2020-2022 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.handleExperimentalFlagUsage;\nimport static lombok.eclipse.Eclipse.ECLIPSE_DO_NOT_TOUCH_FLAG;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.List;\n\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.AllocationExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.Argument;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.MessageSend;\nimport org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.ParameterizedQualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.ReturnStatement;\nimport org.eclipse.jdt.internal.compiler.ast.SingleNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.SingleTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.Wildcard;\nimport org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;\nimport org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeIds;\n\nimport lombok.AccessLevel;\nimport lombok.ConfigurationKeys;\nimport lombok.core.AnnotationValues;\nimport lombok.core.AST.Kind;\nimport lombok.core.configuration.CheckerFrameworkVersion;\nimport lombok.core.handlers.HandlerUtil.FieldAccess;\nimport lombok.eclipse.Eclipse;\nimport lombok.eclipse.EclipseAnnotationHandler;\nimport lombok.eclipse.EclipseNode;\nimport lombok.experimental.Accessors;\nimport lombok.experimental.WithBy;\nimport lombok.spi.Provides;\n\n@Provides\npublic class HandleWithBy extends EclipseAnnotationHandler<WithBy> {\n\tpublic boolean generateWithByForType(EclipseNode typeNode, EclipseNode pos, AccessLevel level, boolean checkForTypeLevelWithBy) {\n\t\tif (checkForTypeLevelWithBy) {\n\t\t\tif (hasAnnotation(WithBy.class, typeNode)) {\n\t\t\t\t//The annotation will make it happen, so we can skip it.\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t\n\t\tTypeDeclaration typeDecl = null;\n\t\tif (typeNode.get() instanceof TypeDeclaration) typeDecl = (TypeDeclaration) typeNode.get();\n\t\tint modifiers = typeDecl == null ? 0 : typeDecl.modifiers;\n\t\tboolean notAClass = (modifiers &\n\t\t\t\t(ClassFileConstants.AccInterface | ClassFileConstants.AccAnnotation | ClassFileConstants.AccEnum)) != 0;\n\t\t\n\t\tif (typeDecl == null || notAClass) {\n\t\t\tpos.addError(\"@WithBy is only supported on a class or a field.\");\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tfor (EclipseNode field : typeNode.down()) {\n\t\t\tif (field.getKind() != Kind.FIELD) continue;\n\t\t\tFieldDeclaration fieldDecl = (FieldDeclaration) field.get();\n\t\t\tif (!filterField(fieldDecl)) continue;\n\t\t\t\n\t\t\t//Skip final fields.\n\t\t\tif ((fieldDecl.modifiers & ClassFileConstants.AccFinal) != 0 && fieldDecl.initialization != null) continue;\n\t\t\t\n\t\t\tgenerateWithByForField(field, pos, level);\n\t\t}\n\t\treturn true;\n\t}\n\t\n\t\n\t/**\n\t * Generates a withBy on the stated field.\n\t * \n\t * Used by {@link HandleValue}.\n\t * \n\t * The difference between this call and the handle method is as follows:\n\t * \n\t * If there is a {@code lombok.experimental.WithBy} annotation on the field, it is used and the\n\t * same rules apply (e.g. warning if the method already exists, stated access level applies).\n\t * If not, the with method is still generated if it isn't already there, though there will not\n\t * be a warning if its already there. The default access level is used.\n\t */\n\tpublic void generateWithByForField(EclipseNode fieldNode, EclipseNode sourceNode, AccessLevel level) {\n\t\tfor (EclipseNode child : fieldNode.down()) {\n\t\t\tif (child.getKind() == Kind.ANNOTATION) {\n\t\t\t\tif (annotationTypeMatches(WithBy.class, child)) {\n\t\t\t\t\t//The annotation will make it happen, so we can skip it.\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tList<Annotation> empty = Collections.emptyList();\n\t\tcreateWithByForField(level, fieldNode, sourceNode, false, empty);\n\t}\n\t\n\t@Override public void handle(AnnotationValues<WithBy> annotation, Annotation ast, EclipseNode annotationNode) {\n\t\thandleExperimentalFlagUsage(annotationNode, ConfigurationKeys.WITHBY_FLAG_USAGE, \"@WithBy\");\n\t\t\n\t\tEclipseNode node = annotationNode.up();\n\t\tAccessLevel level = annotation.getInstance().value();\n\t\tif (level == AccessLevel.NONE || node == null) return;\n\t\t\n\t\tList<Annotation> onMethod = unboxAndRemoveAnnotationParameter(ast, \"onMethod\", \"@WithBy(onMethod\", annotationNode);\n\t\t\n\t\tswitch (node.getKind()) {\n\t\tcase FIELD:\n\t\t\tcreateWithByForFields(level, annotationNode.upFromAnnotationToFields(), annotationNode, true, onMethod);\n\t\t\tbreak;\n\t\tcase TYPE:\n\t\t\tif (!onMethod.isEmpty()) {\n\t\t\t\tannotationNode.addError(\"'onMethod' is not supported for @WithBy on a type.\");\n\t\t\t}\n\t\t\tgenerateWithByForType(node, annotationNode, level, false);\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tpublic void createWithByForFields(AccessLevel level, Collection<EclipseNode> fieldNodes, EclipseNode sourceNode, boolean whineIfExists, List<Annotation> onMethod) {\n\t\tfor (EclipseNode fieldNode : fieldNodes) {\n\t\t\tcreateWithByForField(level, fieldNode, sourceNode, whineIfExists, onMethod);\n\t\t}\n\t}\n\t\n\tpublic void createWithByForField(\n\t\tAccessLevel level, EclipseNode fieldNode, EclipseNode sourceNode,\n\t\tboolean whineIfExists, List<Annotation> onMethod) {\n\t\t\n\t\tASTNode source = sourceNode.get();\n\t\tif (fieldNode.getKind() != Kind.FIELD) {\n\t\t\tsourceNode.addError(\"@WithBy is only supported on a class or a field.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tEclipseNode typeNode = fieldNode.up();\n\t\tboolean makeAbstract = typeNode != null && typeNode.getKind() == Kind.TYPE && (((TypeDeclaration) typeNode.get()).modifiers & ClassFileConstants.AccAbstract) != 0;\n\t\t\n\t\tFieldDeclaration field = (FieldDeclaration) fieldNode.get();\n\t\tTypeReference fieldType = copyType(field.type, source);\n\t\tboolean isBoolean = isBoolean(fieldType);\n\t\tAnnotationValues<Accessors> accessors = getAccessorsForField(fieldNode);\n\t\tString withName = toWithByName(fieldNode, isBoolean, accessors);\n\t\t\n\t\tif (withName == null) {\n\t\t\tfieldNode.addWarning(\"Not generating a withXBy method for this field: It does not fit your @Accessors prefix list.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif ((field.modifiers & ClassFileConstants.AccStatic) != 0) {\n\t\t\tfieldNode.addWarning(\"Not generating \" + withName + \" for this field: With methods cannot be generated for static fields.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif ((field.modifiers & ClassFileConstants.AccFinal) != 0 && field.initialization != null) {\n\t\t\tfieldNode.addWarning(\"Not generating \" + withName + \" for this field: With methods cannot be generated for final, initialized fields.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (field.name != null && field.name.length > 0 && field.name[0] == '$') {\n\t\t\tfieldNode.addWarning(\"Not generating \" + withName + \" for this field: With methods cannot be generated for fields starting with $.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tfor (String altName : toAllWithByNames(fieldNode, isBoolean, accessors)) {\n\t\t\tswitch (methodExists(altName, fieldNode, false, 1)) {\n\t\t\tcase EXISTS_BY_LOMBOK:\n\t\t\t\treturn;\n\t\t\tcase EXISTS_BY_USER:\n\t\t\t\tif (whineIfExists) {\n\t\t\t\t\tString altNameExpl = \"\";\n\t\t\t\t\tif (!altName.equals(withName)) altNameExpl = String.format(\" (%s)\", altName);\n\t\t\t\t\tfieldNode.addWarning(\n\t\t\t\t\t\tString.format(\"Not generating %s(): A method with that name already exists%s\", withName, altNameExpl));\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\tcase NOT_EXISTS:\n\t\t\t\t//continue scanning the other alt names.\n\t\t\t}\n\t\t}\n\t\t\n\t\tint modifier = toEclipseModifier(level);\n\t\t\n\t\tMethodDeclaration method = createWithBy((TypeDeclaration) fieldNode.up().get(), fieldNode, withName, modifier, sourceNode, onMethod, makeAbstract);\n\t\tinjectMethod(fieldNode.up(), method);\n\t}\n\t\n\tprivate static final char[][] NAME_JUF_FUNCTION = Eclipse.fromQualifiedName(\"java.util.function.Function\");\n\tprivate static final char[][] NAME_JUF_OP = Eclipse.fromQualifiedName(\"java.util.function.UnaryOperator\");\n\tprivate static final char[][] NAME_JUF_DOUBLEOP = Eclipse.fromQualifiedName(\"java.util.function.DoubleUnaryOperator\");\n\tprivate static final char[][] NAME_JUF_INTOP = Eclipse.fromQualifiedName(\"java.util.function.IntUnaryOperator\");\n\tprivate static final char[][] NAME_JUF_LONGOP = Eclipse.fromQualifiedName(\"java.util.function.LongUnaryOperator\");\n\tprivate static final char[] NAME_CHAR = {'c', 'h', 'a', 'r'};\n\tprivate static final char[] NAME_SHORT = {'s', 'h', 'o', 'r', 't'};\n\tprivate static final char[] NAME_BYTE = {'b', 'y', 't', 'e'};\n\tprivate static final char[] NAME_INT = {'i', 'n', 't'};\n\tprivate static final char[] NAME_LONG = {'l', 'o', 'n', 'g'};\n\tprivate static final char[] NAME_DOUBLE = {'d', 'o', 'u', 'b', 'l', 'e'};\n\tprivate static final char[] NAME_FLOAT = {'f', 'l', 'o', 'a', 't'};\n\tprivate static final char[] NAME_BOOLEAN = {'b', 'o', 'o', 'l', 'e', 'a', 'n'};\n\tprivate static final char[][] NAME_JAVA_LANG_BOOLEAN = Eclipse.fromQualifiedName(\"java.lang.Boolean\");\n\tprivate static final char[] NAME_APPLY = {'a', 'p', 'p', 'l', 'y'};\n\tprivate static final char[] NAME_APPLY_AS_INT = {'a', 'p', 'p', 'l', 'y', 'A', 's', 'I', 'n', 't'};\n\tprivate static final char[] NAME_APPLY_AS_LONG = {'a', 'p', 'p', 'l', 'y', 'A', 's', 'L', 'o', 'n', 'g'};\n\tprivate static final char[] NAME_APPLY_AS_DOUBLE = {'a', 'p', 'p', 'l', 'y', 'A', 's', 'D', 'o', 'u', 'b', 'l', 'e'};\n\tprivate static final char[] NAME_TRANSFORMER = {'t', 'r', 'a', 'n', 's', 'f', 'o', 'r', 'm', 'e', 'r'};\n\n\tpublic MethodDeclaration createWithBy(TypeDeclaration parent, EclipseNode fieldNode, String name, int modifier, EclipseNode sourceNode, List<Annotation> onMethod, boolean makeAbstract) {\n\t\tASTNode source = sourceNode.get();\n\t\tif (name == null) return null;\n\t\tFieldDeclaration field = (FieldDeclaration) fieldNode.get();\n\t\tint pS = source.sourceStart, pE = source.sourceEnd;\n\t\tlong p = (long) pS << 32 | pE;\n\t\tMethodDeclaration method = new MethodDeclaration(parent.compilationResult);\n\t\tAnnotationValues<Accessors> accessors = getAccessorsForField(fieldNode);\n\t\tif (makeAbstract) modifier |= ClassFileConstants.AccAbstract | ExtraCompilerModifiers.AccSemicolonBody;\n\t\tif (shouldMakeFinal(fieldNode, accessors)) modifier |= ClassFileConstants.AccFinal;\n\t\tmethod.modifiers = modifier;\n\t\tmethod.returnType = cloneSelfType(fieldNode, source);\n\t\tif (method.returnType == null) return null;\n\t\t\n\t\tAnnotation[] deprecated = null, checkerFramework = null;\n\t\tif (isFieldDeprecated(fieldNode)) deprecated = new Annotation[] { generateDeprecatedAnnotation(source) };\n\t\tif (getCheckerFrameworkVersion(fieldNode).generateSideEffectFree()) checkerFramework = new Annotation[] { generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE) };\n\t\t\n\t\tchar[][] functionalInterfaceName = null;\n\t\tint requiredCast = -1;\n\t\tTypeReference parameterizer = null;\n\t\tboolean superExtendsStyle = true;\n\t\tchar[] applyMethodName = NAME_APPLY;\n\t\t\n\t\tif (field.type instanceof SingleTypeReference) {\n\t\t\tchar[] token = ((SingleTypeReference) field.type).token;\n\t\t\tif (Arrays.equals(token, NAME_CHAR)) {\n\t\t\t\trequiredCast = TypeIds.T_char;\n\t\t\t\tfunctionalInterfaceName = NAME_JUF_INTOP;\n\t\t\t} else if (Arrays.equals(token, NAME_SHORT)) {\n\t\t\t\trequiredCast = TypeIds.T_short;\n\t\t\t\tfunctionalInterfaceName = NAME_JUF_INTOP;\n\t\t\t} else if (Arrays.equals(token, NAME_BYTE)) {\n\t\t\t\trequiredCast = TypeIds.T_byte;\n\t\t\t\tfunctionalInterfaceName = NAME_JUF_INTOP;\n\t\t\t} else if (Arrays.equals(token, NAME_INT)) {\n\t\t\t\tfunctionalInterfaceName = NAME_JUF_INTOP;\n\t\t\t} else if (Arrays.equals(token, NAME_LONG)) {\n\t\t\t\tfunctionalInterfaceName = NAME_JUF_LONGOP;\n\t\t\t} else if (Arrays.equals(token, NAME_FLOAT)) {\n\t\t\t\trequiredCast = TypeIds.T_float;\n\t\t\t\tfunctionalInterfaceName = NAME_JUF_DOUBLEOP;\n\t\t\t} else if (Arrays.equals(token, NAME_DOUBLE)) {\n\t\t\t\tfunctionalInterfaceName = NAME_JUF_DOUBLEOP;\n\t\t\t} else if (Arrays.equals(token, NAME_BOOLEAN)) {\n\t\t\t\tfunctionalInterfaceName = NAME_JUF_OP;\n\t\t\t\tparameterizer = new QualifiedTypeReference(NAME_JAVA_LANG_BOOLEAN, new long[] {0, 0, 0});\n\t\t\t\tsuperExtendsStyle = false;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (functionalInterfaceName == NAME_JUF_INTOP) applyMethodName = NAME_APPLY_AS_INT;\n\t\tif (functionalInterfaceName == NAME_JUF_LONGOP) applyMethodName = NAME_APPLY_AS_LONG;\n\t\tif (functionalInterfaceName == NAME_JUF_DOUBLEOP) applyMethodName = NAME_APPLY_AS_DOUBLE;\n\t\tif (functionalInterfaceName == null) {\n\t\t\tfunctionalInterfaceName = NAME_JUF_FUNCTION;\n\t\t\tparameterizer = copyType(field.type, source);\n\t\t}\n\t\t\n\t\tmethod.annotations = copyAnnotations(source, onMethod.toArray(new Annotation[0]), checkerFramework, deprecated);\n\t\tTypeReference fType = null;\n\t\tif (parameterizer != null && superExtendsStyle) {\n\t\t\tWildcard w1 = new Wildcard(Wildcard.SUPER);\n\t\t\tw1.bound = parameterizer;\n\t\t\tWildcard w2 = new Wildcard(Wildcard.EXTENDS);\n\t\t\tw2.bound = copyType(field.type, source);\n\t\t\tTypeReference[][] ta = new TypeReference[functionalInterfaceName.length][];\n\t\t\tta[functionalInterfaceName.length - 1] = new TypeReference[] {w1, w2};\n\t\t\tlong[] ps = new long[functionalInterfaceName.length];\n\t\t\tfType = new ParameterizedQualifiedTypeReference(functionalInterfaceName, ta, 0, ps);\n\t\t}\n\t\tif (parameterizer != null && !superExtendsStyle) {\n\t\t\tTypeReference[][] ta = new TypeReference[functionalInterfaceName.length][];\n\t\t\tta[functionalInterfaceName.length - 1] = new TypeReference[] {parameterizer};\n\t\t\tlong[] ps = new long[functionalInterfaceName.length];\n\t\t\tfType = new ParameterizedQualifiedTypeReference(functionalInterfaceName, ta, 0, ps);\n\t\t}\n\t\tif (parameterizer == null) {\n\t\t\tlong[] ps = new long[functionalInterfaceName.length];\n\t\t\tfType = new QualifiedTypeReference(functionalInterfaceName, ps);\n\t\t}\n\t\t\n\t\tArgument param = new Argument(NAME_TRANSFORMER, p, fType, ClassFileConstants.AccFinal);\n\t\tparam.sourceStart = pS; param.sourceEnd = pE;\n\t\tmethod.arguments = new Argument[] { param };\n\t\tmethod.selector = name.toCharArray();\n\t\tmethod.binding = null;\n\t\tmethod.thrownExceptions = null;\n\t\tmethod.typeParameters = null;\n\t\tmethod.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\t\n\t\tif (!makeAbstract) {\n\t\t\tList<Expression> args = new ArrayList<Expression>();\n\t\t\tfor (EclipseNode child : fieldNode.up().down()) {\n\t\t\t\tif (child.getKind() != Kind.FIELD) continue;\n\t\t\t\tFieldDeclaration childDecl = (FieldDeclaration) child.get();\n\t\t\t\t// Skip fields that start with $\n\t\t\t\tif (childDecl.name != null && childDecl.name.length > 0 && childDecl.name[0] == '$') continue;\n\t\t\t\tlong fieldFlags = childDecl.modifiers;\n\t\t\t\t// Skip static fields.\n\t\t\t\tif ((fieldFlags & ClassFileConstants.AccStatic) != 0) continue;\n\t\t\t\t// Skip initialized final fields.\n\t\t\t\tif (((fieldFlags & ClassFileConstants.AccFinal) != 0) && childDecl.initialization != null) continue;\n\t\t\t\tif (child.get() == fieldNode.get()) {\n\t\t\t\t\tMessageSend ms = new MessageSend();\n\t\t\t\t\tms.receiver = new SingleNameReference(NAME_TRANSFORMER, 0);\n\t\t\t\t\tms.selector = applyMethodName;\n\t\t\t\t\tms.arguments = new Expression[] {createFieldAccessor(child, FieldAccess.ALWAYS_FIELD, source)};\n\t\t\t\t\tif (requiredCast != -1) {\n\t\t\t\t\t\targs.add(makeCastExpression(ms, TypeReference.baseTypeReference(requiredCast, 0), source));\n\t\t\t\t\t} else {\n\t\t\t\t\t\targs.add(ms);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\targs.add(createFieldAccessor(child, FieldAccess.ALWAYS_FIELD, source));\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tAllocationExpression constructorCall = new AllocationExpression();\n\t\t\tconstructorCall.arguments = args.toArray(new Expression[0]);\n\t\t\tconstructorCall.type = cloneSelfType(fieldNode, source);\n\t\t\t\n\t\t\tStatement returnStatement = new ReturnStatement(constructorCall, pS, pE);\n\t\t\tmethod.bodyStart = method.declarationSourceStart = method.sourceStart = source.sourceStart;\n\t\t\tmethod.bodyEnd = method.declarationSourceEnd = method.sourceEnd = source.sourceEnd;\n\t\t\t\n\t\t\tList<Statement> statements = new ArrayList<Statement>(5);\n\t\t\tif (hasNonNullAnnotations(fieldNode)) {\n\t\t\t\tStatement nullCheck = generateNullCheck(field, sourceNode, null);\n\t\t\t\tif (nullCheck != null) statements.add(nullCheck);\n\t\t\t}\n\t\t\tstatements.add(returnStatement);\n\t\t\t\n\t\t\tmethod.statements = statements.toArray(new Statement[0]);\n\t\t}\n\t\t\n\t\tcreateRelevantNonNullAnnotation(sourceNode, param, method);\n\t\tcreateRelevantNonNullAnnotation(fieldNode, method);\n\t\t\n\t\tmethod.traverse(new SetGeneratedByVisitor(source), parent.scope);\n\t\tcopyJavadoc(fieldNode, method, CopyJavadoc.WITH_BY);\n\t\treturn method;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/SetGeneratedByVisitor.java",
    "content": "/*\n * Copyright (C) 2011-2015 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers;\n\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport java.util.Arrays;\n\nimport org.eclipse.jdt.internal.compiler.ASTVisitor;\nimport org.eclipse.jdt.internal.compiler.ast.AND_AND_Expression;\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.AllocationExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.AnnotationMethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.Argument;\nimport org.eclipse.jdt.internal.compiler.ast.ArrayAllocationExpression;\nimport org.eclipse.jdt.internal.compiler.ast.ArrayInitializer;\nimport org.eclipse.jdt.internal.compiler.ast.ArrayQualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.ArrayReference;\nimport org.eclipse.jdt.internal.compiler.ast.ArrayTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.AssertStatement;\nimport org.eclipse.jdt.internal.compiler.ast.Assignment;\nimport org.eclipse.jdt.internal.compiler.ast.BinaryExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Block;\nimport org.eclipse.jdt.internal.compiler.ast.BreakStatement;\nimport org.eclipse.jdt.internal.compiler.ast.CaseStatement;\nimport org.eclipse.jdt.internal.compiler.ast.CastExpression;\nimport org.eclipse.jdt.internal.compiler.ast.CharLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.ClassLiteralAccess;\nimport org.eclipse.jdt.internal.compiler.ast.Clinit;\nimport org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.CompoundAssignment;\nimport org.eclipse.jdt.internal.compiler.ast.ConditionalExpression;\nimport org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.ContinueStatement;\nimport org.eclipse.jdt.internal.compiler.ast.DoStatement;\nimport org.eclipse.jdt.internal.compiler.ast.DoubleLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.EmptyStatement;\nimport org.eclipse.jdt.internal.compiler.ast.EqualExpression;\nimport org.eclipse.jdt.internal.compiler.ast.ExplicitConstructorCall;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.ExtendedStringLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.FalseLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.FieldReference;\nimport org.eclipse.jdt.internal.compiler.ast.FloatLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.ForStatement;\nimport org.eclipse.jdt.internal.compiler.ast.ForeachStatement;\nimport org.eclipse.jdt.internal.compiler.ast.IfStatement;\nimport org.eclipse.jdt.internal.compiler.ast.ImportReference;\nimport org.eclipse.jdt.internal.compiler.ast.Initializer;\nimport org.eclipse.jdt.internal.compiler.ast.InstanceOfExpression;\nimport org.eclipse.jdt.internal.compiler.ast.IntLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.Javadoc;\nimport org.eclipse.jdt.internal.compiler.ast.JavadocAllocationExpression;\nimport org.eclipse.jdt.internal.compiler.ast.JavadocArgumentExpression;\nimport org.eclipse.jdt.internal.compiler.ast.JavadocArrayQualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.JavadocArraySingleTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.JavadocFieldReference;\nimport org.eclipse.jdt.internal.compiler.ast.JavadocImplicitTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.JavadocMessageSend;\nimport org.eclipse.jdt.internal.compiler.ast.JavadocQualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.JavadocReturnStatement;\nimport org.eclipse.jdt.internal.compiler.ast.JavadocSingleNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.JavadocSingleTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.LabeledStatement;\nimport org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.LongLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.MarkerAnnotation;\nimport org.eclipse.jdt.internal.compiler.ast.MemberValuePair;\nimport org.eclipse.jdt.internal.compiler.ast.MessageSend;\nimport org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.NormalAnnotation;\nimport org.eclipse.jdt.internal.compiler.ast.NullLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.OR_OR_Expression;\nimport org.eclipse.jdt.internal.compiler.ast.ParameterizedQualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.ParameterizedSingleTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.PostfixExpression;\nimport org.eclipse.jdt.internal.compiler.ast.PrefixExpression;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedAllocationExpression;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedSuperReference;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedThisReference;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.ReturnStatement;\nimport org.eclipse.jdt.internal.compiler.ast.SingleMemberAnnotation;\nimport org.eclipse.jdt.internal.compiler.ast.SingleNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.SingleTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.StringLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.StringLiteralConcatenation;\nimport org.eclipse.jdt.internal.compiler.ast.SuperReference;\nimport org.eclipse.jdt.internal.compiler.ast.SwitchStatement;\nimport org.eclipse.jdt.internal.compiler.ast.SynchronizedStatement;\nimport org.eclipse.jdt.internal.compiler.ast.ThisReference;\nimport org.eclipse.jdt.internal.compiler.ast.ThrowStatement;\nimport org.eclipse.jdt.internal.compiler.ast.TrueLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.TryStatement;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.TypeParameter;\nimport org.eclipse.jdt.internal.compiler.ast.UnaryExpression;\nimport org.eclipse.jdt.internal.compiler.ast.WhileStatement;\nimport org.eclipse.jdt.internal.compiler.ast.Wildcard;\nimport org.eclipse.jdt.internal.compiler.lookup.BlockScope;\nimport org.eclipse.jdt.internal.compiler.lookup.ClassScope;\nimport org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope;\nimport org.eclipse.jdt.internal.compiler.lookup.MethodScope;\n\npublic final class SetGeneratedByVisitor extends ASTVisitor {\n\tprivate static final long INT_TO_LONG_MASK = 0x00000000FFFFFFFFL;\n\t\n\tprivate final ASTNode source;\n\tprivate final int sourceStart;\n\tprivate final int sourceEnd;\n\tprivate final long sourcePos;\n\t\n\tpublic SetGeneratedByVisitor(ASTNode source) {\n\t\tthis.source = source;\n\t\tthis.sourceStart = this.source.sourceStart;\n\t\tthis.sourceEnd = this.source.sourceEnd;\n\t\tthis.sourcePos = (long)sourceStart << 32 | (sourceEnd & INT_TO_LONG_MASK);\n\t}\n\t\n\tprivate void fixPositions(JavadocAllocationExpression node) {\n\t\tnode.sourceEnd = sourceEnd;\n\t\tnode.sourceStart = sourceStart;\n\t\tnode.statementEnd = sourceEnd;\n\t\tnode.memberStart = sourceStart;\n\t\tnode.tagSourceEnd = sourceEnd;\n\t\tnode.tagSourceStart = sourceStart;\n\t}\n\t\n\tprivate void fixPositions(JavadocMessageSend node) {\n\t\tnode.sourceEnd = sourceEnd;\n\t\tnode.sourceStart = sourceStart;\n\t\tnode.statementEnd = sourceEnd;\n\t\tnode.nameSourcePosition = sourcePos;\n\t\tnode.tagSourceEnd = sourceEnd;\n\t\tnode.tagSourceStart = sourceStart;\n\t}\n\t\n\tprivate void fixPositions(JavadocSingleNameReference node) {\n\t\tnode.sourceEnd = sourceEnd;\n\t\tnode.sourceStart = sourceStart;\n\t\tnode.statementEnd = sourceEnd;\n\t\tnode.tagSourceEnd = sourceEnd;\n\t\tnode.tagSourceStart = sourceStart;\n\t}\n\t\n\tprivate void fixPositions(JavadocSingleTypeReference node) {\n\t\tnode.sourceEnd = sourceEnd;\n\t\tnode.sourceStart = sourceStart;\n\t\tnode.statementEnd = sourceEnd;\n\t\tnode.tagSourceEnd = sourceEnd;\n\t\tnode.tagSourceStart = sourceStart;\n\t}\n\n\tprivate void fixPositions(JavadocFieldReference node) {\n\t\tnode.sourceEnd = sourceEnd;\n\t\tnode.sourceStart = sourceStart;\n\t\tnode.statementEnd = sourceEnd;\n\t\tnode.nameSourcePosition = sourcePos;\n\t\tnode.tagSourceEnd = sourceEnd;\n\t\tnode.tagSourceStart = sourceStart;\n\t}\n\t\n\tprivate void fixPositions(JavadocArrayQualifiedTypeReference node) {\n\t\tnode.sourceEnd = sourceEnd;\n\t\tnode.sourceStart = sourceStart;\n\t\tnode.statementEnd = sourceEnd;\n\t\tif (node.sourcePositions == null || node.sourcePositions.length != node.tokens.length) node.sourcePositions = new long[node.tokens.length];\n\t\tArrays.fill(node.sourcePositions, sourcePos);\n\t\tnode.tagSourceEnd = sourceEnd;\n\t\tnode.tagSourceStart = sourceStart;\n\t}\n\t\n\tprivate void fixPositions(JavadocQualifiedTypeReference node) {\n\t\tnode.sourceEnd = sourceEnd;\n\t\tnode.sourceStart = sourceStart;\n\t\tnode.statementEnd = sourceEnd;\n\t\tif (node.sourcePositions == null || node.sourcePositions.length != node.tokens.length) node.sourcePositions = new long[node.tokens.length];\n\t\tArrays.fill(node.sourcePositions, sourcePos);\n\t\tnode.tagSourceEnd = sourceEnd;\n\t\tnode.tagSourceStart = sourceStart;\n\t}\n\t\n\tprivate void fixPositions(Annotation node) {\n\t\tnode.sourceEnd = sourceEnd;\n\t\tnode.sourceStart = sourceStart;\n\t\tnode.statementEnd = sourceEnd;\n\t\tnode.declarationSourceEnd = sourceEnd;\n\t}\n\n\tprivate void fixPositions(ArrayTypeReference node) {\n\t\tnode.sourceEnd = sourceEnd;\n\t\tnode.sourceStart = sourceStart;\n\t\tnode.statementEnd = sourceEnd;\n\t\tnode.originalSourceEnd = sourceEnd;\n\t}\n\t\n\tprivate void fixPositions(AbstractMethodDeclaration node) {\n\t\tnode.sourceEnd = sourceEnd;\n\t\tnode.sourceStart = sourceStart;\n\t\tnode.bodyEnd = sourceEnd;\n\t\tnode.bodyStart = sourceStart;\n\t\tnode.declarationSourceEnd = sourceEnd;\n\t\tnode.declarationSourceStart = sourceStart;\n\t\tnode.modifiersSourceStart = sourceStart;\n\t}\n\t\n\tprivate void fixPositions(Javadoc node) {\n\t\tnode.sourceEnd = sourceEnd;\n\t\tnode.sourceStart = sourceStart;\n\t\tnode.valuePositions = sourceStart;\n\t}\n\n\tprivate void fixPositions(Initializer node) {\n\t\tnode.sourceEnd = sourceEnd;\n\t\tnode.sourceStart = sourceStart;\n\t\tnode.declarationEnd = sourceEnd;\n\t\tnode.declarationSourceEnd = sourceEnd;\n\t\tnode.declarationSourceStart = sourceStart;\n\t\tnode.modifiersSourceStart = sourceStart;\n\t\tnode.endPart1Position = sourceEnd;\n\t\tnode.endPart2Position = sourceEnd;\n\t\tnode.bodyStart = sourceStart;\n\t\tnode.bodyEnd = sourceEnd;\n\t}\n\n\tprivate void fixPositions(TypeDeclaration node) {\n\t\tnode.sourceEnd = sourceEnd;\n\t\tnode.sourceStart = sourceStart;\n\t\tnode.bodyEnd = sourceEnd;\n\t\tnode.bodyStart = sourceStart;\n\t\tnode.declarationSourceEnd = sourceEnd;\n\t\tnode.declarationSourceStart = sourceStart;\n\t\tnode.modifiersSourceStart = sourceStart;\n\t}\n\t\n\tprivate void fixPositions(ImportReference node) {\n\t\tnode.sourceEnd = sourceEnd;\n\t\tnode.sourceStart = sourceStart;\n\t\tnode.declarationEnd = sourceEnd;\n\t\tnode.declarationSourceEnd = sourceEnd;\n\t\tnode.declarationSourceStart = sourceStart;\n\t\tif (node.sourcePositions == null || node.sourcePositions.length != node.tokens.length) node.sourcePositions = new long[node.tokens.length];\n\t\tArrays.fill(node.sourcePositions, sourcePos);\n\t}\n\t\n\tprivate void fixPositions(ASTNode node) {\n\t\tnode.sourceEnd = sourceEnd;\n\t\tnode.sourceStart = sourceStart;\n\t}\n\t\n\tprivate void fixPositions(SwitchStatement node) {\n\t\tnode.sourceEnd = sourceEnd;\n\t\tnode.sourceStart = sourceStart;\n\t\tnode.blockStart = sourceStart;\n\t}\n\t\n\tprivate void fixPositions(Expression node) {\n\t\tnode.sourceEnd = sourceEnd;\n\t\tnode.sourceStart = sourceStart;\n\t\tnode.statementEnd = sourceEnd;\n\t}\n\t\n\tprivate void fixPositions(AbstractVariableDeclaration node) {\n\t\tnode.sourceEnd = sourceEnd;\n\t\tnode.sourceStart = sourceStart;\n\t\tnode.declarationEnd = sourceEnd;\n\t\tnode.declarationSourceEnd = sourceEnd;\n\t\tnode.declarationSourceStart = sourceStart;\n\t\tnode.modifiersSourceStart = sourceStart;\n\t}\n\t\t\n\tprivate void fixPositions(FieldDeclaration node) {\n\t\tnode.sourceEnd = sourceEnd;\n\t\tnode.sourceStart = sourceStart;\n\t\tnode.declarationEnd = sourceEnd;\n\t\tnode.declarationSourceEnd = sourceEnd;\n\t\tnode.declarationSourceStart = sourceStart;\n\t\tnode.modifiersSourceStart = sourceStart;\n\t\tnode.endPart1Position = sourceEnd;\n\t\tnode.endPart2Position = sourceEnd;\n\t}\n\n\tprivate void fixPositions(FieldReference node) {\n\t\tnode.sourceEnd = sourceEnd;\n\t\tnode.sourceStart = sourceStart;\n\t\tnode.statementEnd = sourceEnd;\n\t\tnode.nameSourcePosition = sourcePos;\n\t}\n\t\n\tprivate void fixPositions(MessageSend node) {\n\t\tnode.sourceEnd = sourceEnd;\n\t\tnode.sourceStart = sourceStart;\n\t\tnode.statementEnd = sourceEnd;\n\t\tnode.nameSourcePosition = sourcePos;\n\t}\n\t\n\tprivate void fixPositions(QualifiedNameReference node) {\n\t\tnode.sourceEnd = sourceEnd;\n\t\tnode.sourceStart = sourceStart;\n\t\tnode.statementEnd = sourceEnd;\n\t\tif (node.sourcePositions == null || node.sourcePositions.length != node.tokens.length) node.sourcePositions = new long[node.tokens.length];\n\t\tArrays.fill(node.sourcePositions, sourcePos);\n\t}\n\t\n\tprivate void fixPositions(QualifiedTypeReference node) {\n\t\tnode.sourceEnd = sourceEnd;\n\t\tnode.sourceStart = sourceStart;\n\t\tnode.statementEnd = sourceEnd;\n\t\tif (node.sourcePositions == null || node.sourcePositions.length != node.tokens.length) node.sourcePositions = new long[node.tokens.length];\n\t\tArrays.fill(node.sourcePositions, sourcePos);\n\t}\n\t\n\t@Override public boolean visit(AllocationExpression node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(AND_AND_Expression node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(AnnotationMethodDeclaration node, ClassScope classScope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, classScope);\n\t}\n\n\t@Override public boolean visit(Argument node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\n\t@Override public boolean visit(Argument node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(ArrayAllocationExpression node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(ArrayInitializer node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(ArrayQualifiedTypeReference node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(ArrayQualifiedTypeReference node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(ArrayReference node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(ArrayTypeReference node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(ArrayTypeReference node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(AssertStatement node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\n\t@Override public boolean visit(Assignment node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(BinaryExpression node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(Block node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(BreakStatement node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(CaseStatement node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(CastExpression node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(CharLiteral node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(ClassLiteralAccess node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(Clinit node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(CompilationUnitDeclaration node, CompilationUnitScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\n\t@Override public boolean visit(CompoundAssignment node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(ConditionalExpression node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(ConstructorDeclaration node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(ContinueStatement node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(DoStatement node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(DoubleLiteral node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(EmptyStatement node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(EqualExpression node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(ExplicitConstructorCall node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(ExtendedStringLiteral node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(FalseLiteral node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(FieldDeclaration node, MethodScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(FieldReference node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(FieldReference node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(FloatLiteral node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(ForeachStatement node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(ForStatement node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(IfStatement node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(ImportReference node, CompilationUnitScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(Initializer node, MethodScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(InstanceOfExpression node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(IntLiteral node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(Javadoc node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\n\t@Override public boolean visit(Javadoc node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(JavadocAllocationExpression node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(JavadocAllocationExpression node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(JavadocArgumentExpression node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(JavadocArgumentExpression node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(JavadocArrayQualifiedTypeReference node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(JavadocArrayQualifiedTypeReference node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(JavadocArraySingleTypeReference node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(JavadocArraySingleTypeReference node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(JavadocFieldReference node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(JavadocFieldReference node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(JavadocImplicitTypeReference node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(JavadocImplicitTypeReference node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(JavadocMessageSend node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(JavadocMessageSend node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(JavadocQualifiedTypeReference node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(JavadocQualifiedTypeReference node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(JavadocReturnStatement node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(JavadocReturnStatement node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(JavadocSingleNameReference node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(JavadocSingleNameReference node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(JavadocSingleTypeReference node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(JavadocSingleTypeReference node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(LabeledStatement node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(LocalDeclaration node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(LongLiteral node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(MarkerAnnotation node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(MemberValuePair node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(MessageSend node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(MethodDeclaration node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(StringLiteralConcatenation node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(NormalAnnotation node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(NullLiteral node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(OR_OR_Expression node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(ParameterizedQualifiedTypeReference node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(ParameterizedQualifiedTypeReference node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(ParameterizedSingleTypeReference node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(ParameterizedSingleTypeReference node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(PostfixExpression node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(PrefixExpression node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(QualifiedAllocationExpression node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(QualifiedNameReference node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(QualifiedNameReference node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(QualifiedSuperReference node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(QualifiedSuperReference node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(QualifiedThisReference node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(QualifiedThisReference node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(QualifiedTypeReference node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(QualifiedTypeReference node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(ReturnStatement node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(SingleMemberAnnotation node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(SingleNameReference node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(SingleNameReference node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(SingleTypeReference node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(SingleTypeReference node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(StringLiteral node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(SuperReference node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(SwitchStatement node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(SynchronizedStatement node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(ThisReference node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(ThisReference node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(ThrowStatement node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(TrueLiteral node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(TryStatement node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(TypeDeclaration node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(TypeDeclaration node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(TypeDeclaration node, CompilationUnitScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(TypeParameter node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(TypeParameter node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(UnaryExpression node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(WhileStatement node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(Wildcard node, BlockScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\t\n\t@Override public boolean visit(Wildcard node, ClassScope scope) {\n\t\tfixPositions(setGeneratedBy(node, source));\n\t\treturn super.visit(node, scope);\n\t}\n\n// missing methods\n//\tpublic boolean visit(MarkerAnnotation node, ClassScope scope){ return true;}\n//\tpublic boolean visit(MemberValuePair node, ClassScope scope){ return true;}\n//\tpublic boolean visit(NormalAnnotation node, ClassScope scope){ return true;}\n//\tpublic boolean visit(SingleMemberAnnotation node, ClassScope scope){ return true;}\n\t\n// missing methods from later versions\n//\tpublic boolean visit(UnionTypeReference node, BlockScope scope){ return true;}\n//\tpublic boolean visit(UnionTypeReference node, ClassScope scope){ return true;}\n//\tpublic boolean visit(LambdaExpression node, BlockScope scope){ return true;}\n//\tpublic boolean visit(ReferenceExpression node, BlockScope scope){ return true;}\n//\tpublic boolean visit(IntersectionCastTypeReference node, ClassScope scope){ return true;}\n//\tpublic boolean visit(IntersectionCastTypeReference node, BlockScope scope){ return true;}\n}"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/package-info.java",
    "content": "/*\n * Copyright (C) 2014 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/**\n * Contains the classes that implement the transformations for all of lombok's various features on the eclipse platform.\n * \n * <strong>NB: This package is not public API in the sense that contents of this package,\n *    even public classes / methods / etc, may change in point releases.</strong>\n */\npackage lombok.eclipse.handlers;\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/singulars/EclipseGuavaMapSingularizer.java",
    "content": "/*\n * Copyright (C) 2015-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers.singulars;\n\nimport lombok.core.LombokImmutableList;\nimport lombok.eclipse.handlers.EclipseSingularsRecipes.EclipseSingularizer;\nimport lombok.spi.Provides;\n\n@Provides(EclipseSingularizer.class)\npublic class EclipseGuavaMapSingularizer extends EclipseGuavaSingularizer {\n\t// TODO cgcc.ImmutableMultimap, cgcc.ImmutableListMultimap, cgcc.ImmutableSetMultimap\n\t// TODO cgcc.ImmutableClassToInstanceMap\n\t// TODO cgcc.ImmutableRangeMap\n\t\n\tprivate static final LombokImmutableList<String> SUFFIXES =\n\t\tLombokImmutableList.of(\"key\", \"value\");\n\tprivate static final LombokImmutableList<String> SUPPORTED_TYPES = LombokImmutableList.of(\n\t\t\"com.google.common.collect.ImmutableMap\", \n\t\t\"com.google.common.collect.ImmutableBiMap\", \n\t\t\"com.google.common.collect.ImmutableSortedMap\"\n\t);\n\t\n\t@Override public LombokImmutableList<String> getSupportedTypes() {\n\t\treturn SUPPORTED_TYPES;\n\t}\n\t\n\t@Override protected LombokImmutableList<String> getArgumentSuffixes() {\n\t\treturn SUFFIXES;\n\t}\n\t\n\t@Override protected String getAddMethodName() {\n\t\treturn \"put\";\n\t}\n\t\n\t@Override protected String getAddAllTypeName() {\n\t\treturn \"java.util.Map\";\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/singulars/EclipseGuavaSetListSingularizer.java",
    "content": "/*\n * Copyright (C) 2015-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers.singulars;\n\nimport lombok.core.LombokImmutableList;\nimport lombok.eclipse.handlers.EclipseSingularsRecipes.EclipseSingularizer;\nimport lombok.spi.Provides;\n\n@Provides(EclipseSingularizer.class)\npublic class EclipseGuavaSetListSingularizer extends EclipseGuavaSingularizer {\n\t// TODO com.google.common.collect.ImmutableRangeSet\n\t// TODO com.google.common.collect.ImmutableMultiset and com.google.common.collect.ImmutableSortedMultiset\n\tprivate static final LombokImmutableList<String> SUFFIXES = LombokImmutableList.of(\"\");\n\tprivate static final LombokImmutableList<String> SUPPORTED_TYPES = LombokImmutableList.of(\n\t\t\"com.google.common.collect.ImmutableCollection\", \n\t\t\"com.google.common.collect.ImmutableList\", \n\t\t\"com.google.common.collect.ImmutableSet\", \n\t\t\"com.google.common.collect.ImmutableSortedSet\"\n\t);\n\t\n\t@Override public LombokImmutableList<String> getSupportedTypes() {\n\t\treturn SUPPORTED_TYPES;\n\t}\n\t\n\t@Override protected LombokImmutableList<String> getArgumentSuffixes() {\n\t\treturn SUFFIXES;\n\t}\n\t\n\t@Override protected String getAddMethodName() {\n\t\treturn \"add\";\n\t}\n\t\n\t@Override protected String getAddAllTypeName() {\n\t\treturn \"java.lang.Iterable\";\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/singulars/EclipseGuavaSingularizer.java",
    "content": "/*\n * Copyright (C) 2015-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers.singulars;\n\nimport static lombok.eclipse.Eclipse.*;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\n\nimport lombok.AccessLevel;\nimport lombok.core.GuavaTypeMap;\nimport lombok.core.LombokImmutableList;\nimport lombok.core.configuration.CheckerFrameworkVersion;\nimport lombok.core.handlers.HandlerUtil;\nimport lombok.eclipse.EclipseNode;\nimport lombok.eclipse.handlers.HandleNonNull;\nimport lombok.eclipse.handlers.EclipseSingularsRecipes.EclipseSingularizer;\nimport lombok.eclipse.handlers.EclipseSingularsRecipes.SingularData;\nimport lombok.eclipse.handlers.EclipseSingularsRecipes.StatementMaker;\nimport lombok.eclipse.handlers.EclipseSingularsRecipes.TypeReferenceMaker;\n\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.Argument;\nimport org.eclipse.jdt.internal.compiler.ast.Assignment;\nimport org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.ConditionalExpression;\nimport org.eclipse.jdt.internal.compiler.ast.EqualExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.FieldReference;\nimport org.eclipse.jdt.internal.compiler.ast.IfStatement;\nimport org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.MessageSend;\nimport org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.NullLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.OperatorIds;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.SingleNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.ThisReference;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\nimport org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;\n\nabstract class EclipseGuavaSingularizer extends EclipseSingularizer {\n\tprotected static final char[] OF = {'o', 'f'};\n\tprotected static final char[][] CGCC = {{'c', 'o', 'm'}, {'g', 'o', 'o', 'g', 'l', 'e'}, {'c', 'o', 'm', 'm', 'o', 'n'}, {'c', 'o', 'l', 'l', 'e', 'c', 't'}};\n\t\n\tprotected String getSimpleTargetTypeName(SingularData data) {\n\t\treturn GuavaTypeMap.getGuavaTypeName(data.getTargetFqn());\n\t}\n\t\n\tprotected char[] getBuilderMethodName(SingularData data) {\n\t\tString simpleTypeName = getSimpleTargetTypeName(data);\n\t\tif (\"ImmutableSortedSet\".equals(simpleTypeName) || \"ImmutableSortedMap\".equals(simpleTypeName)) return \"naturalOrder\".toCharArray();\n\t\treturn \"builder\".toCharArray();\n\t}\n\t\n\tprotected char[][] makeGuavaTypeName(String simpleName, boolean addBuilder) {\n\t\tchar[][] tokenizedName = new char[addBuilder ? 6 : 5][];\n\t\ttokenizedName[0] = CGCC[0];\n\t\ttokenizedName[1] = CGCC[1];\n\t\ttokenizedName[2] = CGCC[2];\n\t\ttokenizedName[3] = CGCC[3];\n\t\ttokenizedName[4] = simpleName.toCharArray();\n\t\tif (addBuilder) tokenizedName[5] = new char[] { 'B', 'u', 'i', 'l', 'd', 'e', 'r'};\n\t\treturn tokenizedName;\n\t}\n\t\n\t@Override protected char[] getEmptyMakerSelector(String targetFqn) {\n\t\treturn OF;\n\t}\n\t\n\t@Override protected char[][] getEmptyMakerReceiver(String targetFqn) {\n\t\treturn makeGuavaTypeName(GuavaTypeMap.getGuavaTypeName(targetFqn), false);\n\t}\n\t\n\t@Override public List<EclipseNode> generateFields(SingularData data, EclipseNode builderType) {\n\t\tString simpleTypeName = getSimpleTargetTypeName(data);\n\t\tchar[][] tokenizedName = makeGuavaTypeName(simpleTypeName, true);\n\t\tTypeReference type = new QualifiedTypeReference(tokenizedName, NULL_POSS);\n\t\ttype = addTypeArgs(getTypeArgumentsCount(), false, builderType, type, data.getTypeArgs());\n\t\t\n\t\tFieldDeclaration buildField = new FieldDeclaration(data.getPluralName(), 0, -1);\n\t\tbuildField.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tbuildField.modifiers = ClassFileConstants.AccPrivate;\n\t\tbuildField.declarationSourceEnd = -1;\n\t\tbuildField.type = type;\n\t\t\n\t\tdata.setGeneratedByRecursive(buildField);\n\t\treturn Collections.singletonList(injectFieldAndMarkGenerated(builderType, buildField));\n\t}\n\t\n\t@Override public void generateMethods(CheckerFrameworkVersion cfv, SingularData data, boolean deprecate, EclipseNode builderType, boolean fluent, TypeReferenceMaker returnTypeMaker, StatementMaker returnStatementMaker, AccessLevel access) {\n\t\tgenerateSingularMethod(cfv, deprecate, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, fluent, access);\n\t\tgeneratePluralMethod(cfv, deprecate, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, fluent, access);\n\t\tgenerateClearMethod(cfv, deprecate, returnTypeMaker.make(), returnStatementMaker.make(), data,  builderType, access);\n\t}\n\t\n\tvoid generateClearMethod(CheckerFrameworkVersion cfv, boolean deprecate, TypeReference returnType, Statement returnStatement, SingularData data, EclipseNode builderType, AccessLevel access) {\n\t\tMethodDeclaration md = new MethodDeclaration(((CompilationUnitDeclaration) builderType.top().get()).compilationResult);\n\t\tmd.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tmd.modifiers = toEclipseModifier(access);\n\t\t\n\t\tFieldReference thisDotField = new FieldReference(data.getPluralName(), 0L);\n\t\tthisDotField.receiver = new ThisReference(0, 0);\n\t\tAssignment a = new Assignment(thisDotField, new NullLiteral(0, 0), 0);\n\t\tmd.selector = HandlerUtil.buildAccessorName(builderType, \"clear\", new String(data.getPluralName())).toCharArray();\n\t\tmd.statements = returnStatement != null ? new Statement[] {a, returnStatement} : new Statement[] {a};\n\t\tmd.returnType = returnType;\n\t\taddCheckerFrameworkReturnsReceiver(md.returnType, data.getSource(), cfv);\n\t\tmd.annotations = generateSelfReturnAnnotations(deprecate, data.getSource());\n\t\t\n\t\tdata.setGeneratedByRecursive(md);\n\t\tif (returnStatement != null) createRelevantNonNullAnnotation(builderType, md);\n\t\tinjectMethod(builderType, md);\n\t}\n\n\tvoid generateSingularMethod(CheckerFrameworkVersion cfv, boolean deprecate, TypeReference returnType, Statement returnStatement, SingularData data, EclipseNode builderType, boolean fluent, AccessLevel access) {\n\t\tLombokImmutableList<String> suffixes = getArgumentSuffixes();\n\t\tchar[][] names = new char[suffixes.size()][];\n\t\tfor (int i = 0; i < suffixes.size(); i++) {\n\t\t\tString s = suffixes.get(i);\n\t\t\tchar[] n = data.getSingularName();\n\t\t\tnames[i] = s.isEmpty() ? n : s.toCharArray();\n\t\t}\n\t\t\n\t\tMethodDeclaration md = new MethodDeclaration(((CompilationUnitDeclaration) builderType.top().get()).compilationResult);\n\t\tmd.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tmd.modifiers = toEclipseModifier(access);\n\t\t\n\t\tList<Statement> statements = new ArrayList<Statement>();\n\t\tstatements.add(createConstructBuilderVarIfNeeded(data, builderType));\n\t\t\n\t\tFieldReference thisDotField = new FieldReference(data.getPluralName(), 0L);\n\t\tthisDotField.receiver = new ThisReference(0, 0);\n\t\tMessageSend thisDotFieldDotAdd = new MessageSend();\n\t\tthisDotFieldDotAdd.arguments = new Expression[suffixes.size()];\n\t\tfor (int i = 0; i < suffixes.size(); i++) {\n\t\t\tthisDotFieldDotAdd.arguments[i] = new SingleNameReference(names[i], 0L);\n\t\t}\n\t\tthisDotFieldDotAdd.receiver = thisDotField;\n\t\tthisDotFieldDotAdd.selector = getAddMethodName().toCharArray();\n\t\tstatements.add(thisDotFieldDotAdd);\n\t\tif (returnStatement != null) statements.add(returnStatement);\n\t\tmd.statements = statements.toArray(new Statement[0]);\n\t\tmd.arguments = new Argument[suffixes.size()];\n\t\tfor (int i = 0; i < suffixes.size(); i++) {\n\t\t\tTypeReference tr = cloneParamType(i, data.getTypeArgs(), builderType);\n\t\t\tAnnotation[] typeUseAnns = getTypeUseAnnotations(tr);\n\t\t\tremoveTypeUseAnnotations(tr);\n\t\t\tmd.arguments[i] = new Argument(names[i], 0, tr, ClassFileConstants.AccFinal);\n\t\t\tmd.arguments[i].annotations = typeUseAnns;\n\t\t}\n\t\tmd.returnType = returnType;\n\t\taddCheckerFrameworkReturnsReceiver(md.returnType, data.getSource(), cfv);\n\t\tchar[] prefixedSingularName = data.getSetterPrefix().length == 0 ? data.getSingularName() : HandlerUtil.buildAccessorName(builderType, new String(data.getSetterPrefix()), new String(data.getSingularName())).toCharArray();\n\t\tmd.selector = fluent ? prefixedSingularName : HandlerUtil.buildAccessorName(builderType, \"add\", new String(data.getSingularName())).toCharArray();\n\t\tAnnotation[] selfReturnAnnotations = generateSelfReturnAnnotations(deprecate, data.getSource());\n\t\tAnnotation[] copyToSetterAnnotations = copyAnnotations(md, findCopyableToBuilderSingularSetterAnnotations(data.getAnnotation().up()));\n\t\tmd.annotations = concat(selfReturnAnnotations, copyToSetterAnnotations, Annotation.class);\n\n\t\tif (returnStatement != null) createRelevantNonNullAnnotation(builderType, md);\n\t\tdata.setGeneratedByRecursive(md);\n\t\tHandleNonNull.INSTANCE.fix(injectMethod(builderType, md));\n\t}\n\t\n\tvoid generatePluralMethod(CheckerFrameworkVersion cfv, boolean deprecate, TypeReference returnType, Statement returnStatement, SingularData data, EclipseNode builderType, boolean fluent, AccessLevel access) {\n\t\tMethodDeclaration md = new MethodDeclaration(((CompilationUnitDeclaration) builderType.top().get()).compilationResult);\n\t\tmd.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tmd.modifiers = toEclipseModifier(access);\n\t\t\n\t\tList<Statement> statements = new ArrayList<Statement>();\n\t\tstatements.add(createConstructBuilderVarIfNeeded(data, builderType));\n\t\t\n\t\tFieldReference thisDotField = new FieldReference(data.getPluralName(), 0L);\n\t\tthisDotField.receiver = new ThisReference(0, 0);\n\t\tMessageSend thisDotFieldDotAddAll = new MessageSend();\n\t\tthisDotFieldDotAddAll.arguments = new Expression[] {new SingleNameReference(data.getPluralName(), 0L)};\n\t\tthisDotFieldDotAddAll.receiver = thisDotField;\n\t\tthisDotFieldDotAddAll.selector = (getAddMethodName() + \"All\").toCharArray();\n\t\tstatements.add(thisDotFieldDotAddAll);\n\t\t\n\t\tTypeReference paramType;\n\t\tparamType = new QualifiedTypeReference(fromQualifiedName(getAddAllTypeName()), NULL_POSS);\n\t\tparamType = addTypeArgs(getTypeArgumentsCount(), true, builderType, paramType, data.getTypeArgs());\n\t\tArgument param = new Argument(data.getPluralName(), 0, paramType, ClassFileConstants.AccFinal);\n\t\t\n\t\tnullBehaviorize(builderType, data, statements, param, md);\n\t\t\n\t\tif (returnStatement != null) statements.add(returnStatement);\n\t\t\n\t\tmd.statements = statements.toArray(new Statement[0]);\n\t\t\n\t\tmd.arguments = new Argument[] {param};\n\t\tmd.returnType = returnType;\n\t\taddCheckerFrameworkReturnsReceiver(md.returnType, data.getSource(), cfv);\n\t\tchar[] prefixedSelector = data.getSetterPrefix().length == 0 ? data.getPluralName() : HandlerUtil.buildAccessorName(builderType, new String(data.getSetterPrefix()), new String(data.getPluralName())).toCharArray();\n\t\tmd.selector = fluent ? prefixedSelector : HandlerUtil.buildAccessorName(builderType, \"addAll\", new String(data.getPluralName())).toCharArray();\n\t\tAnnotation[] selfReturnAnnotations = generateSelfReturnAnnotations(deprecate, data.getSource());\n\t\tAnnotation[] copyToSetterAnnotations = copyAnnotations(md, findCopyableToSetterAnnotations(data.getAnnotation().up(), true));\n\t\tmd.annotations = concat(selfReturnAnnotations, copyToSetterAnnotations, Annotation.class);\n\n\t\tif (returnStatement != null) createRelevantNonNullAnnotation(builderType, md);\n\t\tdata.setGeneratedByRecursive(md);\n\t\tinjectMethod(builderType, md);\n\t}\n\t\n\t@Override public void appendBuildCode(SingularData data, EclipseNode builderType, List<Statement> statements, char[] targetVariableName, String builderVariable) {\n\t\tTypeReference varType = new QualifiedTypeReference(fromQualifiedName(data.getTargetFqn()), NULL_POSS);\n\t\tString simpleTypeName = getSimpleTargetTypeName(data);\n\t\tint agrumentsCount = getTypeArgumentsCount();\n\t\tvarType = addTypeArgs(agrumentsCount, false, builderType, varType, data.getTypeArgs());\n\t\t\n\t\tMessageSend emptyInvoke; {\n\t\t\t//ImmutableX.of()\n\t\t\temptyInvoke = new MessageSend();\n\t\t\temptyInvoke.selector = new char[] {'o', 'f'};\n\t\t\temptyInvoke.receiver = new QualifiedNameReference(makeGuavaTypeName(simpleTypeName, false), NULL_POSS, 0, 0);\n\t\t\temptyInvoke.typeArguments = createTypeArgs(agrumentsCount, false, builderType, data.getTypeArgs());\n\t\t}\n\t\t\n\t\tMessageSend invokeBuild; {\n\t\t\t//this.pluralName.build();\n\t\t\tinvokeBuild = new MessageSend();\n\t\t\tinvokeBuild.selector = new char[] {'b', 'u', 'i', 'l', 'd'};\n\t\t\tFieldReference thisDotField = new FieldReference(data.getPluralName(), 0L);\n\t\t\tthisDotField.receiver = getBuilderReference(builderVariable);\n\t\t\tinvokeBuild.receiver = thisDotField;\n\t\t}\n\t\t\n\t\tExpression isNull; {\n\t\t\t//this.pluralName == null\n\t\t\tFieldReference thisDotField = new FieldReference(data.getPluralName(), 0L);\n\t\t\tthisDotField.receiver = getBuilderReference(builderVariable);\n\t\t\tisNull = new EqualExpression(thisDotField, new NullLiteral(0, 0), OperatorIds.EQUAL_EQUAL);\n\t\t}\n\t\t\n\t\tExpression init = new ConditionalExpression(isNull, emptyInvoke, invokeBuild);\n\t\tLocalDeclaration varDefStat = new LocalDeclaration(data.getPluralName(), 0, 0);\n\t\tvarDefStat.type = varType;\n\t\tvarDefStat.initialization = init;\n\t\tstatements.add(varDefStat);\n\t}\n\t\n\tprotected Statement createConstructBuilderVarIfNeeded(SingularData data, EclipseNode builderType) {\n\t\tFieldReference thisDotField = new FieldReference(data.getPluralName(), 0L);\n\t\tthisDotField.receiver = new ThisReference(0, 0);\n\t\tFieldReference thisDotField2 = new FieldReference(data.getPluralName(), 0L);\n\t\tthisDotField2.receiver = new ThisReference(0, 0);\n\t\tExpression cond = new EqualExpression(thisDotField, new NullLiteral(0, 0), OperatorIds.EQUAL_EQUAL);\n\t\t\n\t\tMessageSend createBuilderInvoke = new MessageSend();\n\t\tchar[][] tokenizedName = makeGuavaTypeName(getSimpleTargetTypeName(data), false);\n\t\tcreateBuilderInvoke.receiver = new QualifiedNameReference(tokenizedName, NULL_POSS, 0, 0);\n\t\tcreateBuilderInvoke.selector = getBuilderMethodName(data);\n\t\treturn new IfStatement(cond, new Assignment(thisDotField2, createBuilderInvoke, 0), 0, 0);\n\t}\n\t\n\tprotected abstract LombokImmutableList<String> getArgumentSuffixes();\n\tprotected abstract String getAddMethodName();\n\tprotected abstract String getAddAllTypeName();\n\t\n\t@Override protected int getTypeArgumentsCount() {\n\t\treturn getArgumentSuffixes().size();\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/singulars/EclipseGuavaTableSingularizer.java",
    "content": "/*\n * Copyright (C) 2015-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers.singulars;\n\nimport lombok.core.LombokImmutableList;\nimport lombok.eclipse.handlers.EclipseSingularsRecipes.EclipseSingularizer;\nimport lombok.spi.Provides;\n\n@Provides(EclipseSingularizer.class)\npublic class EclipseGuavaTableSingularizer extends EclipseGuavaSingularizer {\n\tprivate static final LombokImmutableList<String> SUFFIXES =\n\t\tLombokImmutableList.of(\"rowKey\", \"columnKey\", \"value\");\n\tprivate static final LombokImmutableList<String> SUPPORTED_TYPES =\n\t\tLombokImmutableList.of(\"com.google.common.collect.ImmutableTable\");\n\t\n\t@Override public LombokImmutableList<String> getSupportedTypes() {\n\t\treturn SUPPORTED_TYPES;\n\t}\n\t\n\t@Override protected LombokImmutableList<String> getArgumentSuffixes() {\n\t\treturn SUFFIXES;\n\t}\n\t\n\t@Override protected String getAddMethodName() {\n\t\treturn \"put\";\n\t}\n\t\n\t@Override protected String getAddAllTypeName() {\n\t\treturn \"com.google.common.collect.Table\";\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/singulars/EclipseJavaUtilListSetSingularizer.java",
    "content": "/*\n * Copyright (C) 2015-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers.singulars;\n\nimport static lombok.eclipse.Eclipse.ECLIPSE_DO_NOT_TOUCH_FLAG;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\n\nimport lombok.AccessLevel;\nimport lombok.core.configuration.CheckerFrameworkVersion;\nimport lombok.core.handlers.HandlerUtil;\nimport lombok.eclipse.EclipseNode;\nimport lombok.eclipse.handlers.HandleNonNull;\nimport lombok.eclipse.handlers.EclipseSingularsRecipes.SingularData;\nimport lombok.eclipse.handlers.EclipseSingularsRecipes.StatementMaker;\nimport lombok.eclipse.handlers.EclipseSingularsRecipes.TypeReferenceMaker;\n\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.Argument;\nimport org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.EqualExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.FieldReference;\nimport org.eclipse.jdt.internal.compiler.ast.IfStatement;\nimport org.eclipse.jdt.internal.compiler.ast.MessageSend;\nimport org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.NullLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.OperatorIds;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.SingleNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.ThisReference;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\nimport org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeConstants;\n\nabstract class EclipseJavaUtilListSetSingularizer extends EclipseJavaUtilSingularizer {\n\t@Override public List<char[]> listFieldsToBeGenerated(SingularData data, EclipseNode builderType) {\n\t\tif (useGuavaInstead(builderType)) {\n\t\t\treturn guavaListSetSingularizer.listFieldsToBeGenerated(data, builderType);\n\t\t}\n\t\t\n\t\treturn super.listFieldsToBeGenerated(data, builderType);\n\t}\n\t\n\t@Override public List<char[]> listMethodsToBeGenerated(SingularData data, EclipseNode builderType) {\n\t\tif (useGuavaInstead(builderType)) {\n\t\t\treturn guavaListSetSingularizer.listMethodsToBeGenerated(data, builderType);\n\t\t}\n\t\t\n\t\treturn super.listMethodsToBeGenerated(data, builderType);\n\t}\n\t\n\t@Override public List<EclipseNode> generateFields(SingularData data, EclipseNode builderType) {\n\t\tif (useGuavaInstead(builderType)) {\n\t\t\treturn guavaListSetSingularizer.generateFields(data, builderType);\n\t\t}\n\t\t\n\t\tTypeReference type = new QualifiedTypeReference(JAVA_UTIL_ARRAYLIST, NULL_POSS);\n\t\ttype = addTypeArgs(1, false, builderType, type, data.getTypeArgs());\n\t\t\n\t\tFieldDeclaration buildField = new FieldDeclaration(data.getPluralName(), 0, -1);\n\t\tbuildField.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tbuildField.modifiers = ClassFileConstants.AccPrivate;\n\t\tbuildField.declarationSourceEnd = -1;\n\t\tbuildField.type = type;\n\t\t\n\t\tdata.setGeneratedByRecursive(buildField);\n\t\treturn Collections.singletonList(injectFieldAndMarkGenerated(builderType, buildField));\n\t}\n\t\n\t@Override public void generateMethods(CheckerFrameworkVersion cfv, SingularData data, boolean deprecate, EclipseNode builderType, boolean fluent, TypeReferenceMaker returnTypeMaker, StatementMaker returnStatementMaker, AccessLevel access) {\n\t\tif (useGuavaInstead(builderType)) {\n\t\t\tguavaListSetSingularizer.generateMethods(cfv, data, deprecate, builderType, fluent, returnTypeMaker, returnStatementMaker, access);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tgenerateSingularMethod(cfv, deprecate, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, fluent, access);\n\t\tgeneratePluralMethod(cfv, deprecate, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, fluent, access);\n\t\tgenerateClearMethod(cfv, deprecate, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, access);\n\t}\n\t\n\tprivate void generateClearMethod(CheckerFrameworkVersion cfv, boolean deprecate, TypeReference returnType, Statement returnStatement, SingularData data, EclipseNode builderType, AccessLevel access) {\n\t\tMethodDeclaration md = new MethodDeclaration(((CompilationUnitDeclaration) builderType.top().get()).compilationResult);\n\t\tmd.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tmd.modifiers = toEclipseModifier(access);\n\t\t\n\t\tFieldReference thisDotField = new FieldReference(data.getPluralName(), 0L);\n\t\tthisDotField.receiver = new ThisReference(0, 0);\n\t\tFieldReference thisDotField2 = new FieldReference(data.getPluralName(), 0L);\n\t\tthisDotField2.receiver = new ThisReference(0, 0);\n\t\tmd.selector = HandlerUtil.buildAccessorName(builderType, \"clear\", new String(data.getPluralName())).toCharArray();\n\t\tMessageSend clearMsg = new MessageSend();\n\t\tclearMsg.receiver = thisDotField2;\n\t\tclearMsg.selector = \"clear\".toCharArray();\n\t\tStatement clearStatement = new IfStatement(new EqualExpression(thisDotField, new NullLiteral(0, 0), OperatorIds.NOT_EQUAL), clearMsg, 0, 0);\n\t\tmd.statements = returnStatement != null ? new Statement[] {clearStatement, returnStatement} : new Statement[] {clearStatement};\n\t\tmd.returnType = returnType;\n\t\taddCheckerFrameworkReturnsReceiver(md.returnType, data.getSource(), cfv);\n\t\tmd.annotations = generateSelfReturnAnnotations(deprecate, data.getSource());\n\t\t\n\t\tdata.setGeneratedByRecursive(md);\n\t\tif (returnStatement != null) createRelevantNonNullAnnotation(builderType, md);\n\t\tinjectMethod(builderType, md);\n\t}\n\t\n\tvoid generateSingularMethod(CheckerFrameworkVersion cfv, boolean deprecate, TypeReference returnType, Statement returnStatement, SingularData data, EclipseNode builderType, boolean fluent, AccessLevel access) {\n\t\tMethodDeclaration md = new MethodDeclaration(((CompilationUnitDeclaration) builderType.top().get()).compilationResult);\n\t\tmd.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tmd.modifiers = toEclipseModifier(access);\n\t\t\n\t\tList<Statement> statements = new ArrayList<Statement>();\n\t\tstatements.add(createConstructBuilderVarIfNeeded(data, builderType, false));\n\t\t\n\t\tFieldReference thisDotField = new FieldReference(data.getPluralName(), 0L);\n\t\tthisDotField.receiver = new ThisReference(0, 0);\n\t\tMessageSend thisDotFieldDotAdd = new MessageSend();\n\t\tthisDotFieldDotAdd.arguments = new Expression[] {new SingleNameReference(data.getSingularName(), 0L)};\n\t\tthisDotFieldDotAdd.receiver = thisDotField;\n\t\tthisDotFieldDotAdd.selector = \"add\".toCharArray();\n\t\tstatements.add(thisDotFieldDotAdd);\n\t\tif (returnStatement != null) statements.add(returnStatement);\n\t\t\n\t\tmd.statements = statements.toArray(new Statement[0]);\n\t\tTypeReference paramType = cloneParamType(0, data.getTypeArgs(), builderType);\n\t\tAnnotation[] typeUseAnns = getTypeUseAnnotations(paramType);\n\t\tremoveTypeUseAnnotations(paramType);\n\t\tArgument param = new Argument(data.getSingularName(), 0, paramType, ClassFileConstants.AccFinal);\n\t\tparam.annotations = typeUseAnns;\n\t\tmd.arguments = new Argument[] {param};\n\t\tmd.returnType = returnType;\n\t\taddCheckerFrameworkReturnsReceiver(md.returnType, data.getSource(), cfv);\n\t\tchar[] prefixedSingularName = data.getSetterPrefix().length == 0 ? data.getSingularName() : HandlerUtil.buildAccessorName(builderType, new String(data.getSetterPrefix()), new String(data.getSingularName())).toCharArray();\n\t\tmd.selector = fluent ? prefixedSingularName : HandlerUtil.buildAccessorName(builderType, \"add\", new String(data.getSingularName())).toCharArray();\n\t\tAnnotation[] selfReturnAnnotations = generateSelfReturnAnnotations(deprecate, data.getSource());\n\t\tAnnotation[] copyToSetterAnnotations = copyAnnotations(md, findCopyableToBuilderSingularSetterAnnotations(data.getAnnotation().up()));\n\t\tmd.annotations = concat(selfReturnAnnotations, copyToSetterAnnotations, Annotation.class);\n\t\t\n\t\tif (returnStatement != null) createRelevantNonNullAnnotation(builderType, md);\n\t\tdata.setGeneratedByRecursive(md);\n\t\tHandleNonNull.INSTANCE.fix(injectMethod(builderType, md));\n\t}\n\t\n\tvoid generatePluralMethod(CheckerFrameworkVersion cfv, boolean deprecate, TypeReference returnType, Statement returnStatement, SingularData data, EclipseNode builderType, boolean fluent, AccessLevel access) {\n\t\tMethodDeclaration md = new MethodDeclaration(((CompilationUnitDeclaration) builderType.top().get()).compilationResult);\n\t\tmd.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tmd.modifiers = toEclipseModifier(access);\n\t\t\n\t\tList<Statement> statements = new ArrayList<Statement>();\n\t\tstatements.add(createConstructBuilderVarIfNeeded(data, builderType, false));\n\t\t\n\t\tFieldReference thisDotField = new FieldReference(data.getPluralName(), 0L);\n\t\tthisDotField.receiver = new ThisReference(0, 0);\n\t\tMessageSend thisDotFieldDotAddAll = new MessageSend();\n\t\tthisDotFieldDotAddAll.arguments = new Expression[] {new SingleNameReference(data.getPluralName(), 0L)};\n\t\tthisDotFieldDotAddAll.receiver = thisDotField;\n\t\tthisDotFieldDotAddAll.selector = \"addAll\".toCharArray();\n\t\tstatements.add(thisDotFieldDotAddAll);\n\t\t\n\t\tTypeReference paramType = new QualifiedTypeReference(TypeConstants.JAVA_UTIL_COLLECTION, NULL_POSS);\n\t\tparamType = addTypeArgs(1, true, builderType, paramType, data.getTypeArgs());\n\t\tArgument param = new Argument(data.getPluralName(), 0, paramType, ClassFileConstants.AccFinal);\n\t\t\n\t\tnullBehaviorize(builderType, data, statements, param, md);\n\t\tif (returnStatement != null) statements.add(returnStatement);\n\t\t\n\t\tmd.statements = statements.toArray(new Statement[0]);\n\t\t\n\t\tmd.arguments = new Argument[] {param};\n\t\tmd.returnType = returnType;\n\t\taddCheckerFrameworkReturnsReceiver(md.returnType, data.getSource(), cfv);\n\t\tchar[] prefixedSelector = data.getSetterPrefix().length == 0 ? data.getPluralName() : HandlerUtil.buildAccessorName(builderType, new String(data.getSetterPrefix()), new String(data.getPluralName())).toCharArray();\n\t\tmd.selector = fluent ? prefixedSelector : HandlerUtil.buildAccessorName(builderType, \"addAll\", new String(data.getPluralName())).toCharArray();\n\t\tAnnotation[] selfReturnAnnotations = generateSelfReturnAnnotations(deprecate, data.getSource());\n\t\tAnnotation[] copyToSetterAnnotations = copyAnnotations(md, findCopyableToSetterAnnotations(data.getAnnotation().up(), true));\n\t\tmd.annotations = concat(selfReturnAnnotations, copyToSetterAnnotations, Annotation.class);\n\t\t\n\t\tif (returnStatement != null) createRelevantNonNullAnnotation(builderType, md);\n\t\tdata.setGeneratedByRecursive(md);\n\t\tinjectMethod(builderType, md);\n\t}\n\t\n\t@Override protected int getTypeArgumentsCount() {\n\t\treturn 1;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/singulars/EclipseJavaUtilListSingularizer.java",
    "content": "/*\n * Copyright (C) 2015-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers.singulars;\n\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.makeIntLiteral;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport lombok.core.LombokImmutableList;\nimport lombok.eclipse.Eclipse;\nimport lombok.eclipse.EclipseNode;\nimport lombok.eclipse.handlers.EclipseSingularsRecipes.EclipseSingularizer;\nimport lombok.eclipse.handlers.EclipseSingularsRecipes.SingularData;\nimport lombok.spi.Provides;\n\nimport org.eclipse.jdt.internal.compiler.ast.AllocationExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Assignment;\nimport org.eclipse.jdt.internal.compiler.ast.BreakStatement;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.FieldReference;\nimport org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.MessageSend;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.SingleNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.SwitchStatement;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\n\n@Provides(EclipseSingularizer.class)\npublic class EclipseJavaUtilListSingularizer extends EclipseJavaUtilListSetSingularizer {\n\t@Override public LombokImmutableList<String> getSupportedTypes() {\n\t\treturn LombokImmutableList.of(\"java.util.List\", \"java.util.Collection\", \"java.lang.Iterable\");\n\t}\n\t\n\tprivate static final char[] EMPTY_LIST = {'e', 'm', 'p', 't', 'y', 'L', 'i', 's', 't'};\n\t\n\t@Override protected char[][] getEmptyMakerReceiver(String targetFqn) {\n\t\treturn JAVA_UTIL_COLLECTIONS;\n\t}\n\t\n\t@Override protected char[] getEmptyMakerSelector(String targetFqn) {\n\t\treturn EMPTY_LIST;\n\t}\n\t\n\t@Override public void appendBuildCode(SingularData data, EclipseNode builderType, List<Statement> statements, char[] targetVariableName, String builderVariable) {\n\t\tif (useGuavaInstead(builderType)) {\n\t\t\tguavaListSetSingularizer.appendBuildCode(data, builderType, statements, targetVariableName, builderVariable);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tList<Statement> switchContents = new ArrayList<Statement>();\n\t\t\n\t\t/* case 0: (empty) break; */ {\n\t\t\tswitchContents.add(Eclipse.createCaseStatement(makeIntLiteral(new char[] {'0'}, null)));\n\t\t\tMessageSend invoke = new MessageSend();\n\t\t\tinvoke.receiver = new QualifiedNameReference(JAVA_UTIL_COLLECTIONS, NULL_POSS, 0, 0);\n\t\t\tinvoke.selector = \"emptyList\".toCharArray();\n\t\t\tswitchContents.add(new Assignment(new SingleNameReference(data.getPluralName(), 0), invoke, 0));\n\t\t\tswitchContents.add(new BreakStatement(null, 0, 0));\n\t\t}\n\t\t\n\t\t/* case 1: (singleton) break; */ {\n\t\t\tswitchContents.add(Eclipse.createCaseStatement(makeIntLiteral(new char[] {'1'}, null)));\n\t\t\tFieldReference thisDotField = new FieldReference(data.getPluralName(), 0L);\n\t\t\tthisDotField.receiver = getBuilderReference(builderVariable);\n\t\t\tMessageSend thisDotFieldGet0 = new MessageSend();\n\t\t\tthisDotFieldGet0.receiver = thisDotField;\n\t\t\tthisDotFieldGet0.selector = new char[] {'g', 'e', 't'};\n\t\t\tthisDotFieldGet0.arguments = new Expression[] {makeIntLiteral(new char[] {'0'}, null)};\n\t\t\t\n\t\t\tExpression[] args = new Expression[] {thisDotFieldGet0};\n\t\t\tMessageSend invoke = new MessageSend();\n\t\t\tinvoke.receiver = new QualifiedNameReference(JAVA_UTIL_COLLECTIONS, NULL_POSS, 0, 0);\n\t\t\tinvoke.selector = \"singletonList\".toCharArray();\n\t\t\tinvoke.arguments = args;\n\t\t\tswitchContents.add(new Assignment(new SingleNameReference(data.getPluralName(), 0), invoke, 0));\n\t\t\tswitchContents.add(new BreakStatement(null, 0, 0));\n\t\t}\n\t\t\n\t\t/* default: Create by passing builder field to constructor. */ {\n\t\t\tswitchContents.add(Eclipse.createCaseStatement(null));\n\t\t\t\n\t\t\tExpression argToUnmodifiable;\n\t\t\t/* new j.u.ArrayList<Generics>(this.pluralName); */ {\n\t\t\t\tFieldReference thisDotPluralName = new FieldReference(data.getPluralName(), 0L);\n\t\t\t\tthisDotPluralName.receiver = getBuilderReference(builderVariable);\n\t\t\t\tTypeReference targetTypeExpr = new QualifiedTypeReference(JAVA_UTIL_ARRAYLIST, NULL_POSS);\n\t\t\t\ttargetTypeExpr = addTypeArgs(1, false, builderType, targetTypeExpr, data.getTypeArgs());\n\t\t\t\tAllocationExpression constructorCall = new AllocationExpression();\n\t\t\t\tconstructorCall.type = targetTypeExpr;\n\t\t\t\tconstructorCall.arguments = new Expression[] {thisDotPluralName};\n\t\t\t\targToUnmodifiable = constructorCall;\n\t\t\t}\n\t\t\t\n\t\t\t/* pluralname = Collections.unmodifiableList(-newlist-); */ {\n\t\t\t\tMessageSend unmodInvoke = new MessageSend();\n\t\t\t\tunmodInvoke.receiver = new QualifiedNameReference(JAVA_UTIL_COLLECTIONS, NULL_POSS, 0, 0);\n\t\t\t\tunmodInvoke.selector = \"unmodifiableList\".toCharArray();\n\t\t\t\tunmodInvoke.arguments = new Expression[] {argToUnmodifiable};\n\t\t\t\tswitchContents.add(new Assignment(new SingleNameReference(data.getPluralName(), 0), unmodInvoke, 0));\n\t\t\t}\n\t\t}\n\t\t\n\t\tSwitchStatement switchStat = new SwitchStatement();\n\t\tswitchStat.statements = switchContents.toArray(new Statement[0]);\n\t\tswitchStat.expression = getSize(builderType, data.getPluralName(), true, builderVariable);\n\t\t\n\t\tTypeReference localShadowerType = new QualifiedTypeReference(Eclipse.fromQualifiedName(data.getTargetFqn()), NULL_POSS);\n\t\tlocalShadowerType = addTypeArgs(1, false, builderType, localShadowerType, data.getTypeArgs());\n\t\tLocalDeclaration varDefStat = new LocalDeclaration(data.getPluralName(), 0, 0);\n\t\tvarDefStat.type = localShadowerType;\n\t\tstatements.add(varDefStat);\n\t\tstatements.add(switchStat);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/singulars/EclipseJavaUtilMapSingularizer.java",
    "content": "/*\n * Copyright (C) 2015-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers.singulars;\n\nimport static lombok.eclipse.Eclipse.*;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\n\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.Argument;\nimport org.eclipse.jdt.internal.compiler.ast.Block;\nimport org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.EqualExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.FieldReference;\nimport org.eclipse.jdt.internal.compiler.ast.ForeachStatement;\nimport org.eclipse.jdt.internal.compiler.ast.IfStatement;\nimport org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.MessageSend;\nimport org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.NullLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.OperatorIds;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.SingleNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.ThisReference;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\nimport org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;\n\nimport lombok.AccessLevel;\nimport lombok.core.LombokImmutableList;\nimport lombok.core.configuration.CheckerFrameworkVersion;\nimport lombok.core.handlers.HandlerUtil;\nimport lombok.eclipse.EclipseNode;\nimport lombok.eclipse.handlers.EclipseSingularsRecipes.EclipseSingularizer;\nimport lombok.eclipse.handlers.EclipseSingularsRecipes.SingularData;\nimport lombok.eclipse.handlers.EclipseSingularsRecipes.StatementMaker;\nimport lombok.eclipse.handlers.EclipseSingularsRecipes.TypeReferenceMaker;\nimport lombok.eclipse.handlers.HandleNonNull;\nimport lombok.spi.Provides;\n\n@Provides(EclipseSingularizer.class)\npublic class EclipseJavaUtilMapSingularizer extends EclipseJavaUtilSingularizer {\n\t@Override public LombokImmutableList<String> getSupportedTypes() {\n\t\treturn LombokImmutableList.of(\"java.util.Map\", \"java.util.SortedMap\", \"java.util.NavigableMap\");\n\t}\n\t\n\tprivate static final char[] EMPTY_SORTED_MAP = {'e', 'm', 'p', 't', 'y', 'S', 'o', 'r', 't', 'e', 'd', 'M', 'a', 'p'};\n\tprivate static final char[] EMPTY_NAVIGABLE_MAP = {'e', 'm', 'p', 't', 'y', 'N', 'a', 'v', 'i', 'g', 'a', 'b', 'l', 'e', 'M', 'a', 'p'};\n\tprivate static final char[] EMPTY_MAP = {'e', 'm', 'p', 't', 'y', 'M', 'a', 'p'};\n\t\n\t@Override protected char[][] getEmptyMakerReceiver(String targetFqn) {\n\t\treturn JAVA_UTIL_COLLECTIONS;\n\t}\n\t\n\t@Override protected char[] getEmptyMakerSelector(String targetFqn) {\n\t\tif (targetFqn.endsWith(\"SortedMap\")) return EMPTY_SORTED_MAP;\n\t\tif (targetFqn.endsWith(\"NavigableMap\")) return EMPTY_NAVIGABLE_MAP;\n\t\treturn EMPTY_MAP;\n\t}\n\t\n\t@Override public List<char[]> listFieldsToBeGenerated(SingularData data, EclipseNode builderType) {\n\t\tif (useGuavaInstead(builderType)) {\n\t\t\treturn guavaMapSingularizer.listFieldsToBeGenerated(data, builderType);\n\t\t}\n\t\t\n\t\tchar[] p = data.getPluralName();\n\t\tint len = p.length;\n\t\tchar[] k = new char[len + 4];\n\t\tchar[] v = new char[len + 6];\n\t\tSystem.arraycopy(p, 0, k, 0, len);\n\t\tSystem.arraycopy(p, 0, v, 0, len);\n\t\tk[len] = '$';\n\t\tk[len + 1] = 'k';\n\t\tk[len + 2] = 'e';\n\t\tk[len + 3] = 'y';\n\t\tv[len] = '$';\n\t\tv[len + 1] = 'v';\n\t\tv[len + 2] = 'a';\n\t\tv[len + 3] = 'l';\n\t\tv[len + 4] = 'u';\n\t\tv[len + 5] = 'e';\n\t\treturn Arrays.asList(k, v);\n\t}\n\t\n\t@Override public List<char[]> listMethodsToBeGenerated(SingularData data, EclipseNode builderType) {\n\t\tif (useGuavaInstead(builderType)) {\n\t\t\treturn guavaMapSingularizer.listFieldsToBeGenerated(data, builderType);\n\t\t} else {\n\t\t\treturn super.listMethodsToBeGenerated(data, builderType);\n\t\t}\n\t}\n\t\n\t@Override public List<EclipseNode> generateFields(SingularData data, EclipseNode builderType) {\n\t\tif (useGuavaInstead(builderType)) {\n\t\t\treturn guavaMapSingularizer.generateFields(data, builderType);\n\t\t}\n\t\t\n\t\tchar[] keyName = (new String(data.getPluralName()) + \"$key\").toCharArray();\n\t\tchar[] valueName = (new String(data.getPluralName()) + \"$value\").toCharArray();\n\t\tFieldDeclaration buildKeyField; {\n\t\t\tTypeReference type = new QualifiedTypeReference(JAVA_UTIL_ARRAYLIST, NULL_POSS);\n\t\t\ttype = addTypeArgs(1, false, builderType, type, data.getTypeArgs());\n\t\t\tbuildKeyField = new FieldDeclaration(keyName, 0, -1);\n\t\t\tbuildKeyField.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\t\tbuildKeyField.modifiers = ClassFileConstants.AccPrivate;\n\t\t\tbuildKeyField.declarationSourceEnd = -1;\n\t\t\tbuildKeyField.type = type;\n\t\t}\n\t\tFieldDeclaration buildValueField; {\n\t\t\tTypeReference type = new QualifiedTypeReference(JAVA_UTIL_ARRAYLIST, NULL_POSS);\n\t\t\tList<TypeReference> tArgs = data.getTypeArgs();\n\t\t\tif (tArgs != null && tArgs.size() > 1) tArgs = Collections.singletonList(tArgs.get(1));\n\t\t\telse tArgs = Collections.emptyList();\n\t\t\ttype = addTypeArgs(1, false, builderType, type, tArgs);\n\t\t\tbuildValueField = new FieldDeclaration(valueName, 0, -1);\n\t\t\tbuildValueField.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\t\tbuildValueField.modifiers = ClassFileConstants.AccPrivate;\n\t\t\tbuildValueField.declarationSourceEnd = -1;\n\t\t\tbuildValueField.type = type;\n\t\t}\n\t\t\n\t\tdata.setGeneratedByRecursive(buildKeyField);\n\t\tdata.setGeneratedByRecursive(buildValueField);\n\t\tEclipseNode keyFieldNode = injectFieldAndMarkGenerated(builderType, buildKeyField);\n\t\tEclipseNode valueFieldNode = injectFieldAndMarkGenerated(builderType, buildValueField);\n\t\treturn Arrays.asList(keyFieldNode, valueFieldNode);\n\t}\n\t\n\t@Override public void generateMethods(CheckerFrameworkVersion cfv, SingularData data, boolean deprecate, EclipseNode builderType, boolean fluent, TypeReferenceMaker returnTypeMaker, StatementMaker returnStatementMaker, AccessLevel access) {\n\t\tif (useGuavaInstead(builderType)) {\n\t\t\tguavaMapSingularizer.generateMethods(cfv, data, deprecate, builderType, fluent, returnTypeMaker, returnStatementMaker, access);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tgenerateSingularMethod(cfv, deprecate, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, fluent, access);\n\t\tgeneratePluralMethod(cfv, deprecate, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, fluent, access);\n\t\tgenerateClearMethod(cfv, deprecate, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, access);\n\t}\n\t\n\tprivate void generateClearMethod(CheckerFrameworkVersion cfv, boolean deprecate, TypeReference returnType, Statement returnStatement, SingularData data, EclipseNode builderType, AccessLevel access) {\n\t\tMethodDeclaration md = new MethodDeclaration(((CompilationUnitDeclaration) builderType.top().get()).compilationResult);\n\t\tmd.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tmd.modifiers = toEclipseModifier(access);\n\t\t\n\t\tString pN = new String(data.getPluralName());\n\t\tchar[] keyFieldName = (pN + \"$key\").toCharArray();\n\t\tchar[] valueFieldName = (pN + \"$value\").toCharArray();\n\t\t\n\t\tFieldReference thisDotField = new FieldReference(keyFieldName, 0L);\n\t\tthisDotField.receiver = new ThisReference(0, 0);\n\t\tFieldReference thisDotField2 = new FieldReference(keyFieldName, 0L);\n\t\tthisDotField2.receiver = new ThisReference(0, 0);\n\t\tFieldReference thisDotField3 = new FieldReference(valueFieldName, 0L);\n\t\tthisDotField3.receiver = new ThisReference(0, 0);\n\t\tmd.selector = HandlerUtil.buildAccessorName(builderType, \"clear\", new String(data.getPluralName())).toCharArray();\n\t\tMessageSend clearMsg1 = new MessageSend();\n\t\tclearMsg1.receiver = thisDotField2;\n\t\tclearMsg1.selector = \"clear\".toCharArray();\n\t\tMessageSend clearMsg2 = new MessageSend();\n\t\tclearMsg2.receiver = thisDotField3;\n\t\tclearMsg2.selector = \"clear\".toCharArray();\n\t\tBlock clearMsgs = new Block(2);\n\t\tclearMsgs.statements = new Statement[] {clearMsg1, clearMsg2};\n\t\tStatement clearStatement = new IfStatement(new EqualExpression(thisDotField, new NullLiteral(0, 0), OperatorIds.NOT_EQUAL), clearMsgs, 0, 0);\n\t\tmd.statements = returnStatement != null ? new Statement[] {clearStatement, returnStatement} : new Statement[] {clearStatement};\n\t\tmd.returnType = returnType;\n\t\taddCheckerFrameworkReturnsReceiver(md.returnType, data.getSource(), cfv);\n\t\tmd.annotations = generateSelfReturnAnnotations(deprecate, data.getSource());\n\t\t\n\t\tif (returnStatement != null) createRelevantNonNullAnnotation(builderType, md);\n\t\tdata.setGeneratedByRecursive(md);\n\t\tinjectMethod(builderType, md);\n\t}\n\t\n\tprivate void generateSingularMethod(CheckerFrameworkVersion cfv, boolean deprecate, TypeReference returnType, Statement returnStatement, SingularData data, EclipseNode builderType, boolean fluent, AccessLevel access) {\n\t\tMethodDeclaration md = new MethodDeclaration(((CompilationUnitDeclaration) builderType.top().get()).compilationResult);\n\t\tmd.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tmd.modifiers = toEclipseModifier(access);\n\t\t\n\t\tList<Statement> statements = new ArrayList<Statement>();\n\t\tstatements.add(createConstructBuilderVarIfNeeded(data, builderType, true));\n\t\t\n\t\tString sN = new String(data.getSingularName());\n\t\tString pN = new String(data.getPluralName());\n\t\tchar[] keyParamName = (sN + \"Key\").toCharArray();\n\t\tchar[] valueParamName = (sN + \"Value\").toCharArray();\n\t\tchar[] keyFieldName = (pN + \"$key\").toCharArray();\n\t\tchar[] valueFieldName = (pN + \"$value\").toCharArray();\n\t\t\n\t\t/* this.pluralname$key.add(singularnameKey); */ {\n\t\t\tFieldReference thisDotKeyField = new FieldReference(keyFieldName, 0L);\n\t\t\tthisDotKeyField.receiver = new ThisReference(0, 0);\n\t\t\tMessageSend thisDotKeyFieldDotAdd = new MessageSend();\n\t\t\tthisDotKeyFieldDotAdd.arguments = new Expression[] {new SingleNameReference(keyParamName, 0L)};\n\t\t\tthisDotKeyFieldDotAdd.receiver = thisDotKeyField;\n\t\t\tthisDotKeyFieldDotAdd.selector = \"add\".toCharArray();\n\t\t\tstatements.add(thisDotKeyFieldDotAdd);\n\t\t}\n\t\t\n\t\t/* this.pluralname$value.add(singularnameValue); */ {\n\t\t\tFieldReference thisDotValueField = new FieldReference(valueFieldName, 0L);\n\t\t\tthisDotValueField.receiver = new ThisReference(0, 0);\n\t\t\tMessageSend thisDotValueFieldDotAdd = new MessageSend();\n\t\t\tthisDotValueFieldDotAdd.arguments = new Expression[] {new SingleNameReference(valueParamName, 0L)};\n\t\t\tthisDotValueFieldDotAdd.receiver = thisDotValueField;\n\t\t\tthisDotValueFieldDotAdd.selector = \"add\".toCharArray();\n\t\t\tstatements.add(thisDotValueFieldDotAdd);\n\t\t}\n\t\tif (returnStatement != null) statements.add(returnStatement);\n\t\t\n\t\tmd.statements = statements.toArray(new Statement[0]);\n\t\tTypeReference keyParamType = cloneParamType(0, data.getTypeArgs(), builderType);\n\t\tTypeReference valueParamType = cloneParamType(1, data.getTypeArgs(), builderType);\n\t\tAnnotation[] typeUseAnnsKey = getTypeUseAnnotations(keyParamType);\n\t\tAnnotation[] typeUseAnnsValue = getTypeUseAnnotations(valueParamType);\n\t\t\n\t\tremoveTypeUseAnnotations(keyParamType);\n\t\tremoveTypeUseAnnotations(valueParamType);\n\t\tArgument keyParam = new Argument(keyParamName, 0, keyParamType, ClassFileConstants.AccFinal);\n\t\tArgument valueParam = new Argument(valueParamName, 0, valueParamType, ClassFileConstants.AccFinal);\n\t\tkeyParam.annotations = typeUseAnnsKey;\n\t\tvalueParam.annotations = typeUseAnnsValue;\n\t\tmd.arguments = new Argument[] {keyParam, valueParam};\n\t\tmd.returnType = returnType;\n\t\taddCheckerFrameworkReturnsReceiver(md.returnType, data.getSource(), cfv);\n\t\t\n\t\tString name = new String(data.getSingularName());\n\t\tString setterPrefix = data.getSetterPrefix().length > 0 ? new String(data.getSetterPrefix()) : fluent ? \"\" : \"put\";\n\t\tString setterName = HandlerUtil.buildAccessorName(builderType, setterPrefix, name);\n\t\t\n\t\tmd.selector = setterName.toCharArray();\n\t\tAnnotation[] selfReturnAnnotations = generateSelfReturnAnnotations(deprecate, data.getSource());\n\t\tAnnotation[] copyToSetterAnnotations = copyAnnotations(md, findCopyableToBuilderSingularSetterAnnotations(data.getAnnotation().up()));\n\t\tmd.annotations = concat(selfReturnAnnotations, copyToSetterAnnotations, Annotation.class);\n\t\t\n\t\tif (returnStatement != null) createRelevantNonNullAnnotation(builderType, md);\n\t\tdata.setGeneratedByRecursive(md);\n\t\tHandleNonNull.INSTANCE.fix(injectMethod(builderType, md));\n\t}\n\t\n\tprivate void generatePluralMethod(CheckerFrameworkVersion cfv, boolean deprecate, TypeReference returnType, Statement returnStatement, SingularData data, EclipseNode builderType, boolean fluent, AccessLevel access) {\n\t\tMethodDeclaration md = new MethodDeclaration(((CompilationUnitDeclaration) builderType.top().get()).compilationResult);\n\t\tmd.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\tmd.modifiers = toEclipseModifier(access);\n\t\t\n\t\tString pN = new String(data.getPluralName());\n\t\tchar[] keyFieldName = (pN + \"$key\").toCharArray();\n\t\tchar[] valueFieldName = (pN + \"$value\").toCharArray();\n\t\t\n\t\tList<Statement> statements = new ArrayList<Statement>();\n\t\tstatements.add(createConstructBuilderVarIfNeeded(data, builderType, true));\n\t\t\n\t\tchar[] entryName = \"$lombokEntry\".toCharArray();\n\t\t\n\t\tTypeReference forEachType = new QualifiedTypeReference(JAVA_UTIL_MAP_ENTRY, NULL_POSS);\n\t\tforEachType = addTypeArgs(2, true, builderType, forEachType, data.getTypeArgs());\n\t\t\n\t\tMessageSend keyArg = new MessageSend();\n\t\tkeyArg.receiver = new SingleNameReference(entryName, 0L);\n\t\tkeyArg.selector = \"getKey\".toCharArray();\n\t\tMessageSend addKey = new MessageSend();\n\t\tFieldReference thisDotKeyField = new FieldReference(keyFieldName, 0L);\n\t\tthisDotKeyField.receiver = new ThisReference(0, 0);\n\t\taddKey.receiver = thisDotKeyField;\n\t\taddKey.selector = new char[] {'a', 'd', 'd'};\n\t\taddKey.arguments = new Expression[] {keyArg};\n\t\t\n\t\tMessageSend valueArg = new MessageSend();\n\t\tvalueArg.receiver = new SingleNameReference(entryName, 0L);\n\t\tvalueArg.selector = \"getValue\".toCharArray();\n\t\tMessageSend addValue = new MessageSend();\n\t\tFieldReference thisDotValueField = new FieldReference(valueFieldName, 0L);\n\t\tthisDotValueField.receiver = new ThisReference(0, 0);\n\t\taddValue.receiver = thisDotValueField;\n\t\taddValue.selector = new char[] {'a', 'd', 'd'};\n\t\taddValue.arguments = new Expression[] {valueArg};\n\t\t\n\t\tLocalDeclaration elementVariable = new LocalDeclaration(entryName, 0, 0);\n\t\telementVariable.type = forEachType;\n\t\tForeachStatement forEach = new ForeachStatement(elementVariable, 0);\n\t\tMessageSend invokeEntrySet = new MessageSend();\n\t\tinvokeEntrySet.selector = new char[] { 'e', 'n', 't', 'r', 'y', 'S', 'e', 't'};\n\t\tinvokeEntrySet.receiver = new SingleNameReference(data.getPluralName(), 0L);\n\t\tforEach.collection = invokeEntrySet;\n\t\tBlock forEachContent = new Block(0);\n\t\tforEachContent.statements = new Statement[] {addKey, addValue};\n\t\tforEach.action = forEachContent;\n\t\tstatements.add(forEach);\n\t\t\n\t\tTypeReference paramType = new QualifiedTypeReference(JAVA_UTIL_MAP, NULL_POSS);\n\t\tparamType = addTypeArgs(2, true, builderType, paramType, data.getTypeArgs());\n\t\tArgument param = new Argument(data.getPluralName(), 0, paramType, ClassFileConstants.AccFinal);\n\t\t\n\t\tnullBehaviorize(builderType, data, statements, param, md);\n\t\t\n\t\tif (returnStatement != null) statements.add(returnStatement);\n\t\t\n\t\tmd.statements = statements.toArray(new Statement[0]);\n\t\t\n\t\tmd.arguments = new Argument[] {param};\n\t\tmd.returnType = returnType;\n\t\taddCheckerFrameworkReturnsReceiver(md.returnType, data.getSource(), cfv);\n\t\t\n\t\tString name = new String(data.getPluralName());\n\t\tString setterPrefix = data.getSetterPrefix().length > 0 ? new String(data.getSetterPrefix()) : fluent ? \"\" : \"put\";\n\t\tString setterName = HandlerUtil.buildAccessorName(builderType, setterPrefix, name);\n\t\t\n\t\tmd.selector = setterName.toCharArray();\n\t\tAnnotation[] selfReturnAnnotations = generateSelfReturnAnnotations(deprecate, data.getSource());\n\t\tAnnotation[] copyToSetterAnnotations = copyAnnotations(md, findCopyableToSetterAnnotations(data.getAnnotation().up(), true));\n\t\tmd.annotations = concat(selfReturnAnnotations, copyToSetterAnnotations, Annotation.class);\n\t\t\n\t\tif (returnStatement != null) createRelevantNonNullAnnotation(builderType, md);\n\t\tdata.setGeneratedByRecursive(md);\n\t\tinjectMethod(builderType, md);\n\t}\n\t\n\t@Override public void appendBuildCode(SingularData data, EclipseNode builderType, List<Statement> statements, char[] targetVariableName, String builderVariable) {\n\t\tif (useGuavaInstead(builderType)) {\n\t\t\tguavaMapSingularizer.appendBuildCode(data, builderType, statements, targetVariableName, builderVariable);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (data.getTargetFqn().equals(\"java.util.Map\")) {\n\t\t\tstatements.addAll(createJavaUtilSetMapInitialCapacitySwitchStatements(data, builderType, true, \"emptyMap\", \"singletonMap\", \"LinkedHashMap\", builderVariable));\n\t\t} else {\n\t\t\tstatements.addAll(createJavaUtilSimpleCreationAndFillStatements(data, builderType, true, true, false, true, \"TreeMap\", builderVariable));\n\t\t}\n\t}\n\t\n\t@Override protected int getTypeArgumentsCount() {\n\t\treturn 2;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/singulars/EclipseJavaUtilSetSingularizer.java",
    "content": "/*\n * Copyright (C) 2015-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers.singulars;\n\nimport java.util.List;\n\nimport lombok.core.LombokImmutableList;\nimport lombok.eclipse.EclipseNode;\nimport lombok.eclipse.handlers.EclipseSingularsRecipes.EclipseSingularizer;\nimport lombok.eclipse.handlers.EclipseSingularsRecipes.SingularData;\nimport lombok.spi.Provides;\n\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\n\n@Provides(EclipseSingularizer.class)\npublic class EclipseJavaUtilSetSingularizer extends EclipseJavaUtilListSetSingularizer {\n\t@Override public LombokImmutableList<String> getSupportedTypes() {\n\t\treturn LombokImmutableList.of(\"java.util.Set\", \"java.util.SortedSet\", \"java.util.NavigableSet\");\n\t}\n\t\n\tprivate static final char[] EMPTY_SORTED_SET = {'e', 'm', 'p', 't', 'y', 'S', 'o', 'r', 't', 'e', 'd', 'S', 'e', 't'};\n\tprivate static final char[] EMPTY_NAVIGABLE_SET = {'e', 'm', 'p', 't', 'y', 'N', 'a', 'v', 'i', 'g', 'a', 'b', 'l', 'e', 'S', 'e', 't'};\n\tprivate static final char[] EMPTY_SET = {'e', 'm', 'p', 't', 'y', 'S', 'e', 't'};\n\t\n\t@Override protected char[][] getEmptyMakerReceiver(String targetFqn) {\n\t\treturn JAVA_UTIL_COLLECTIONS;\n\t}\n\t\n\t@Override protected char[] getEmptyMakerSelector(String targetFqn) {\n\t\tif (targetFqn.endsWith(\"SortedSet\")) return EMPTY_SORTED_SET;\n\t\tif (targetFqn.endsWith(\"NavigableSet\")) return EMPTY_NAVIGABLE_SET;\n\t\treturn EMPTY_SET;\n\t}\n\t\n\t@Override public void appendBuildCode(SingularData data, EclipseNode builderType, List<Statement> statements, char[] targetVariableName, String builderVariable) {\n\t\tif (useGuavaInstead(builderType)) {\n\t\t\tguavaListSetSingularizer.appendBuildCode(data, builderType, statements, targetVariableName, builderVariable);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (data.getTargetFqn().equals(\"java.util.Set\")) {\n\t\t\tstatements.addAll(createJavaUtilSetMapInitialCapacitySwitchStatements(data, builderType, false, \"emptySet\", \"singleton\", \"LinkedHashSet\", builderVariable));\n\t\t} else {\n\t\t\tstatements.addAll(createJavaUtilSimpleCreationAndFillStatements(data, builderType, false, true, false, true, \"TreeSet\", builderVariable));\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/handlers/singulars/EclipseJavaUtilSingularizer.java",
    "content": "/*\n * Copyright (C) 2015 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.handlers.singulars;\n\nimport static lombok.eclipse.Eclipse.*;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\n\nimport org.eclipse.jdt.internal.compiler.ast.AllocationExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Assignment;\nimport org.eclipse.jdt.internal.compiler.ast.BinaryExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Block;\nimport org.eclipse.jdt.internal.compiler.ast.BreakStatement;\nimport org.eclipse.jdt.internal.compiler.ast.ConditionalExpression;\nimport org.eclipse.jdt.internal.compiler.ast.EqualExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.FieldReference;\nimport org.eclipse.jdt.internal.compiler.ast.ForStatement;\nimport org.eclipse.jdt.internal.compiler.ast.IfStatement;\nimport org.eclipse.jdt.internal.compiler.ast.IntLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.MessageSend;\nimport org.eclipse.jdt.internal.compiler.ast.NullLiteral;\nimport org.eclipse.jdt.internal.compiler.ast.OperatorIds;\nimport org.eclipse.jdt.internal.compiler.ast.PostfixExpression;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.SingleNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.SwitchStatement;\nimport org.eclipse.jdt.internal.compiler.ast.ThisReference;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeConstants;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeIds;\n\nimport lombok.ConfigurationKeys;\nimport lombok.eclipse.Eclipse;\nimport lombok.eclipse.EclipseNode;\nimport lombok.eclipse.handlers.EclipseSingularsRecipes.EclipseSingularizer;\nimport lombok.eclipse.handlers.EclipseSingularsRecipes.SingularData;\n\nabstract class EclipseJavaUtilSingularizer extends EclipseSingularizer {\n\tprotected static final char[][] JAVA_UTIL_ARRAYLIST = {\n\t\t{'j', 'a', 'v', 'a'}, {'u', 't', 'i', 'l'}, {'A', 'r', 'r', 'a', 'y', 'L', 'i', 's', 't'}\n\t};\n\t\n\tprotected static final char[][] JAVA_UTIL_LIST = {\n\t\t{'j', 'a', 'v', 'a'}, {'u', 't', 'i', 'l'}, {'L', 'i', 's', 't'}\n\t};\n\t\n\tprotected static final char[][] JAVA_UTIL_MAP = {\n\t\t{'j', 'a', 'v', 'a'}, {'u', 't', 'i', 'l'}, {'M', 'a', 'p'}\n\t};\n\t\n\tprotected static final char[][] JAVA_UTIL_MAP_ENTRY = {\n\t\t{'j', 'a', 'v', 'a'}, {'u', 't', 'i', 'l'}, {'M', 'a', 'p'}, {'E', 'n', 't', 'r', 'y'}\n\t};\n\t\n\tprotected static final char[][] JAVA_UTIL_COLLECTIONS = {\n\t\t{'j', 'a', 'v', 'a'}, {'u', 't', 'i', 'l'}, {'C', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', 's'}\n\t};\n\t\n\tprotected final EclipseSingularizer guavaListSetSingularizer = new EclipseGuavaSetListSingularizer();\n\tprotected final EclipseSingularizer guavaMapSingularizer = new EclipseGuavaMapSingularizer();\n\t\n\tprotected boolean useGuavaInstead(EclipseNode node) {\n\t\treturn Boolean.TRUE.equals(node.getAst().readConfiguration(ConfigurationKeys.SINGULAR_USE_GUAVA));\n\t}\n\t\n\tprotected List<Statement> createJavaUtilSetMapInitialCapacitySwitchStatements(SingularData data, EclipseNode builderType, boolean mapMode, String emptyCollectionMethod, String singletonCollectionMethod, String targetType, String builderVariable) {\n\t\tList<Statement> switchContents = new ArrayList<Statement>();\n\t\tchar[] keyName = mapMode ? (new String(data.getPluralName()) + \"$key\").toCharArray() : data.getPluralName();\n\t\t\n\t\tif (emptyCollectionMethod != null) { // case 0: (empty); break;\n\t\t\tswitchContents.add(Eclipse.createCaseStatement(makeIntLiteral(new char[] {'0'}, null)));\n\t\t\t\n\t\t\t/* pluralName = java.util.Collections.emptyCollectionMethod(); */ {\n\t\t\t\tMessageSend invoke = new MessageSend();\n\t\t\t\tinvoke.receiver = new QualifiedNameReference(JAVA_UTIL_COLLECTIONS, NULL_POSS, 0, 0);\n\t\t\t\tinvoke.selector = emptyCollectionMethod.toCharArray();\n\t\t\t\tswitchContents.add(new Assignment(new SingleNameReference(data.getPluralName(), 0), invoke, 0));\n\t\t\t}\n\t\t\t\n\t\t\tswitchContents.add(new BreakStatement(null, 0, 0));\n\t\t}\n\t\t\n\t\tif (singletonCollectionMethod != null) { // case 1: (singleton); break;\n\t\t\tswitchContents.add(Eclipse.createCaseStatement(makeIntLiteral(new char[] {'1'}, null)));\n\t\t\t/* !mapMode: pluralName = java.util.Collections.singletonCollectionMethod(this.pluralName.get(0));\n\t\t\t   mapMode: pluralName = java.util.Collections.singletonCollectionMethod(this.pluralName$key.get(0), this.pluralName$value.get(0)); */ {\n\t\t\t\tFieldReference thisDotKey = new FieldReference(keyName, 0L);\n\t\t\t\tthisDotKey.receiver = getBuilderReference(builderVariable);\n\t\t\t\tMessageSend thisDotKeyGet0 = new MessageSend();\n\t\t\t\tthisDotKeyGet0.receiver = thisDotKey;\n\t\t\t\tthisDotKeyGet0.selector = new char[] {'g', 'e', 't'};\n\t\t\t\tthisDotKeyGet0.arguments = new Expression[] {makeIntLiteral(new char[] {'0'}, null)};\n\t\t\t\t\n\t\t\t\tExpression[] args;\n\t\t\t\tif (mapMode) {\n\t\t\t\t\tchar[] valueName = (new String(data.getPluralName()) + \"$value\").toCharArray();\n\t\t\t\t\tFieldReference thisDotValue = new FieldReference(valueName, 0L);\n\t\t\t\t\tthisDotValue.receiver = getBuilderReference(builderVariable);\n\t\t\t\t\tMessageSend thisDotValueGet0 = new MessageSend();\n\t\t\t\t\tthisDotValueGet0.receiver = thisDotValue;\n\t\t\t\t\tthisDotValueGet0.selector = new char[] {'g', 'e', 't'};\n\t\t\t\t\tthisDotValueGet0.arguments = new Expression[] {makeIntLiteral(new char[] {'0'}, null)};\n\t\t\t\t\targs = new Expression[] {thisDotKeyGet0, thisDotValueGet0};\n\t\t\t\t} else {\n\t\t\t\t\targs = new Expression[] {thisDotKeyGet0};\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tMessageSend invoke = new MessageSend();\n\t\t\t\tinvoke.receiver = new QualifiedNameReference(JAVA_UTIL_COLLECTIONS, NULL_POSS, 0, 0);\n\t\t\t\tinvoke.selector = singletonCollectionMethod.toCharArray();\n\t\t\t\tinvoke.arguments = args;\n\t\t\t\tswitchContents.add(new Assignment(new SingleNameReference(data.getPluralName(), 0), invoke, 0));\n\t\t\t}\n\t\t\tswitchContents.add(new BreakStatement(null, 0, 0));\n\t\t}\n\t\t\n\t\t{ // default:\n\t\t\tswitchContents.add(Eclipse.createCaseStatement(null));\n\t\t\tswitchContents.addAll(createJavaUtilSimpleCreationAndFillStatements(data, builderType, mapMode, false, true, emptyCollectionMethod == null, targetType, builderVariable));\n\t\t}\n\t\t\n\t\tSwitchStatement switchStat = new SwitchStatement();\n\t\tswitchStat.statements = switchContents.toArray(new Statement[0]);\n\t\tswitchStat.expression = getSize(builderType, keyName, true, builderVariable);\n\t\t\n\t\tTypeReference localShadowerType = new QualifiedTypeReference(fromQualifiedName(data.getTargetFqn()), NULL_POSS);\n\t\tlocalShadowerType = addTypeArgs(mapMode ? 2 : 1, false, builderType, localShadowerType, data.getTypeArgs());\n\t\tLocalDeclaration varDefStat = new LocalDeclaration(data.getPluralName(), 0, 0);\n\t\tvarDefStat.type = localShadowerType;\n\t\treturn Arrays.asList(varDefStat, switchStat);\n\t}\n\t\n\tprotected List<Statement> createJavaUtilSimpleCreationAndFillStatements(SingularData data, EclipseNode builderType, boolean mapMode, boolean defineVar, boolean addInitialCapacityArg, boolean nullGuard, String targetType, String builderVariable) {\n\t\tchar[] varName = mapMode ? (new String(data.getPluralName()) + \"$key\").toCharArray() : data.getPluralName();\n\t\t\n\t\tStatement createStat; {\n\t\t\t// pluralName = new java.util.TargetType(initialCap);\n\t\t\tExpression[] constructorArgs = null;\n\t\t\tif (addInitialCapacityArg) {\n\t\t\t\t// this.varName.size() < MAX_POWER_OF_2 ? 1 + this.varName.size() + (this.varName.size() - 3) / 3 : Integer.MAX_VALUE;\n\t\t\t\t// lessThanCutOff = this.varName.size() < MAX_POWER_OF_2\n\t\t\t\tExpression lessThanCutoff = new BinaryExpression(getSize(builderType, varName, nullGuard, builderVariable), makeIntLiteral(\"0x40000000\".toCharArray(), null), OperatorIds.LESS);\n\t\t\t\tFieldReference integerMaxValue = new FieldReference(\"MAX_VALUE\".toCharArray(), 0L);\n\t\t\t\tintegerMaxValue.receiver = new QualifiedNameReference(TypeConstants.JAVA_LANG_INTEGER, NULL_POSS, 0, 0);\n\t\t\t\tExpression sizeFormulaLeft = new BinaryExpression(makeIntLiteral(new char[] {'1'}, null), getSize(builderType, varName, nullGuard, builderVariable), OperatorIds.PLUS);\n\t\t\t\tExpression sizeFormulaRightLeft = new BinaryExpression(getSize(builderType, varName, nullGuard, builderVariable), makeIntLiteral(new char[] {'3'}, null), OperatorIds.MINUS);\n\t\t\t\tExpression sizeFormulaRight = new BinaryExpression(sizeFormulaRightLeft, makeIntLiteral(new char[] {'3'}, null), OperatorIds.DIVIDE);\n\t\t\t\tExpression sizeFormula = new BinaryExpression(sizeFormulaLeft, sizeFormulaRight, OperatorIds.PLUS);\n\t\t\t\tExpression cond = new ConditionalExpression(lessThanCutoff, sizeFormula, integerMaxValue);\n\t\t\t\tconstructorArgs = new Expression[] {cond};\n\t\t\t}\n\t\t\t\n\t\t\tTypeReference targetTypeRef = new QualifiedTypeReference(new char[][] {TypeConstants.JAVA, TypeConstants.UTIL, targetType.toCharArray()}, NULL_POSS);\n\t\t\ttargetTypeRef = addTypeArgs(mapMode ? 2 : 1, false, builderType, targetTypeRef, data.getTypeArgs());\n\t\t\tAllocationExpression constructorCall = new AllocationExpression();\n\t\t\tconstructorCall.type = targetTypeRef;\n\t\t\tconstructorCall.arguments = constructorArgs;\n\t\t\t\n\t\t\tif (defineVar) {\n\t\t\t\tTypeReference localShadowerType = new QualifiedTypeReference(fromQualifiedName(data.getTargetFqn()), NULL_POSS);\n\t\t\t\tlocalShadowerType = addTypeArgs(mapMode ? 2 : 1, false, builderType, localShadowerType, data.getTypeArgs());\n\t\t\t\tLocalDeclaration localShadowerDecl = new LocalDeclaration(data.getPluralName(), 0, 0);\n\t\t\t\tlocalShadowerDecl.type = localShadowerType;\n\t\t\t\tlocalShadowerDecl.initialization = constructorCall;\n\t\t\t\tcreateStat = localShadowerDecl;\n\t\t\t} else {\n\t\t\t\tcreateStat = new Assignment(new SingleNameReference(data.getPluralName(), 0L), constructorCall, 0);\n\t\t\t}\n\t\t}\n\t\t\n\t\tStatement fillStat; {\n\t\t\tif (mapMode) {\n\t\t\t\t// for (int $i = 0; $i < this.pluralname$key.size(); i++) pluralname.put(this.pluralname$key.get($i), this.pluralname$value.get($i));\n\t\t\t\tchar[] iVar = new char[] {'$', 'i'};\n\t\t\t\tMessageSend pluralnameDotPut = new MessageSend();\n\t\t\t\tpluralnameDotPut.selector = new char[] {'p', 'u', 't'};\n\t\t\t\tpluralnameDotPut.receiver = new SingleNameReference(data.getPluralName(), 0L);\n\t\t\t\tFieldReference thisDotKey = new FieldReference(varName, 0L);\n\t\t\t\tthisDotKey.receiver = getBuilderReference(builderVariable);\n\t\t\t\tFieldReference thisDotValue = new FieldReference((new String(data.getPluralName()) + \"$value\").toCharArray(), 0L);\n\t\t\t\tthisDotValue.receiver = getBuilderReference(builderVariable);\n\t\t\t\tMessageSend keyArg = new MessageSend();\n\t\t\t\tkeyArg.receiver = thisDotKey;\n\t\t\t\tkeyArg.arguments = new Expression[] {new SingleNameReference(iVar, 0L)};\n\t\t\t\tkeyArg.selector = new char[] {'g', 'e', 't'};\n\t\t\t\tMessageSend valueArg = new MessageSend();\n\t\t\t\tvalueArg.receiver = thisDotValue;\n\t\t\t\tvalueArg.arguments = new Expression[] {new SingleNameReference(iVar, 0L)};\n\t\t\t\tvalueArg.selector = new char[] {'g', 'e', 't'};\n\t\t\t\tpluralnameDotPut.arguments = new Expression[] {keyArg, valueArg};\n\t\t\t\t\n\t\t\t\tLocalDeclaration forInit = new LocalDeclaration(iVar, 0, 0);\n\t\t\t\tforInit.type = TypeReference.baseTypeReference(TypeIds.T_int, 0);\n\t\t\t\tforInit.initialization = makeIntLiteral(new char[] {'0'}, null);\n\t\t\t\tExpression checkExpr = new BinaryExpression(new SingleNameReference(iVar, 0L), getSize(builderType, varName, nullGuard, builderVariable), OperatorIds.LESS);\n\t\t\t\tExpression incrementExpr = new PostfixExpression(new SingleNameReference(iVar, 0L), IntLiteral.One, OperatorIds.PLUS, 0);\n\t\t\t\tfillStat = new ForStatement(new Statement[] {forInit}, checkExpr, new Statement[] {incrementExpr}, pluralnameDotPut, true, 0, 0);\n\t\t\t} else {\n\t\t\t\t// pluralname.addAll(this.pluralname);\n\t\t\t\tMessageSend pluralnameDotAddAll = new MessageSend();\n\t\t\t\tpluralnameDotAddAll.selector = new char[] {'a', 'd', 'd', 'A', 'l', 'l'};\n\t\t\t\tpluralnameDotAddAll.receiver = new SingleNameReference(data.getPluralName(), 0L);\n\t\t\t\tFieldReference thisDotPluralname = new FieldReference(varName, 0L);\n\t\t\t\tthisDotPluralname.receiver = getBuilderReference(builderVariable);\n\t\t\t\tpluralnameDotAddAll.arguments = new Expression[] {thisDotPluralname};\n\t\t\t\tfillStat = pluralnameDotAddAll;\n\t\t\t}\n\t\t\t\n\t\t\tif (nullGuard) {\n\t\t\t\tFieldReference thisDotField = new FieldReference(varName, 0L);\n\t\t\t\tthisDotField.receiver = getBuilderReference(builderVariable);\n\t\t\t\tExpression cond = new EqualExpression(thisDotField, new NullLiteral(0, 0), OperatorIds.NOT_EQUAL);\n\t\t\t\tfillStat = new IfStatement(cond, fillStat, 0, 0);\n\t\t\t}\n\t\t}\n\t\t\n\t\tStatement unmodifiableStat; {\n\t\t\t// pluralname = Collections.unmodifiableInterfaceType(pluralname);\n\t\t\tExpression arg = new SingleNameReference(data.getPluralName(), 0L);\n\t\t\tMessageSend invoke = new MessageSend();\n\t\t\tinvoke.arguments = new Expression[] {arg};\n\t\t\tinvoke.selector = (\"unmodifiable\" + data.getTargetSimpleType()).toCharArray();\n\t\t\tinvoke.receiver = new QualifiedNameReference(JAVA_UTIL_COLLECTIONS, NULL_POSS, 0, 0);\n\t\t\tunmodifiableStat = new Assignment(new SingleNameReference(data.getPluralName(), 0L), invoke, 0);\n\t\t}\n\t\t\n\t\treturn Arrays.asList(createStat, fillStat, unmodifiableStat);\n\t}\n\t\n\tprotected Statement createConstructBuilderVarIfNeeded(SingularData data, EclipseNode builderType, boolean mapMode) {\n\t\tchar[] v1Name, v2Name;\n\t\tif (mapMode) {\n\t\t\tString n = new String(data.getPluralName());\n\t\t\tv1Name = (n + \"$key\").toCharArray();\n\t\t\tv2Name = (n + \"$value\").toCharArray();\n\t\t} else {\n\t\t\tv1Name = data.getPluralName();\n\t\t\tv2Name = null;\n\t\t}\n\t\t\n\t\tFieldReference thisDotField = new FieldReference(v1Name, 0L);\n\t\tthisDotField.receiver = new ThisReference(0, 0);\n\t\tExpression cond = new EqualExpression(thisDotField, new NullLiteral(0, 0), OperatorIds.EQUAL_EQUAL);\n\t\t\n\t\tthisDotField = new FieldReference(v1Name, 0L);\n\t\tthisDotField.receiver = new ThisReference(0, 0);\n\t\tTypeReference v1Type = new QualifiedTypeReference(JAVA_UTIL_ARRAYLIST, NULL_POSS);\n\t\tv1Type = addTypeArgs(1, false, builderType, v1Type, data.getTypeArgs());\n\t\tAllocationExpression constructArrayList = new AllocationExpression();\n\t\tconstructArrayList.type = v1Type;\n\t\tAssignment initV1 = new Assignment(thisDotField, constructArrayList, 0);\n\t\tStatement thenPart;\n\t\tif (mapMode) {\n\t\t\tthisDotField = new FieldReference(v2Name, 0L);\n\t\t\tthisDotField.receiver = new ThisReference(0, 0);\n\t\t\tTypeReference v2Type = new QualifiedTypeReference(JAVA_UTIL_ARRAYLIST, NULL_POSS);\n\t\t\tList<TypeReference> tArgs = data.getTypeArgs();\n\t\t\tif (tArgs != null && tArgs.size() > 1) tArgs = Collections.singletonList(tArgs.get(1));\n\t\t\telse tArgs = Collections.emptyList();\n\t\t\tv2Type = addTypeArgs(1, false, builderType, v2Type, tArgs);\n\t\t\tconstructArrayList = new AllocationExpression();\n\t\t\tconstructArrayList.type = v2Type;\n\t\t\tAssignment initV2 = new Assignment(thisDotField, constructArrayList, 0);\n\t\t\tBlock b = new Block(0);\n\t\t\tb.statements = new Statement[] {initV1, initV2};\n\t\t\tthenPart = b;\n\t\t} else {\n\t\t\tthenPart = initV1;\n\t\t}\n\t\t\n\t\treturn new IfStatement(cond, thenPart, 0, 0);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/eclipse/package-info.java",
    "content": "/*\n * Copyright (C) 2009-2014 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/**\n * Includes the eclipse-specific implementations of the lombok AST and annotation introspection support.\n * \n * <strong>NB: This package is not public API in the sense that contents of this package,\n *    even public classes / methods / etc, may change in point releases.</strong>\n */\npackage lombok.eclipse;\n"
  },
  {
    "path": "src/core/lombok/experimental/Accessors.java",
    "content": "/*\n * Copyright (C) 2012-2022 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.experimental;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * A container for settings for the generation of getters, setters and \"with\"-ers.\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/experimental/Accessors\">the project lombok features page for &#64;Accessors</a>.\n * <p>\n * Using this annotation does nothing by itself; an annotation that makes lombok generate getters, setters, or \"with\"-ers\n * such as {@link lombok.Setter} or {@link lombok.Data} is also required.\n */\n@Target({ElementType.TYPE, ElementType.FIELD})\n@Retention(RetentionPolicy.SOURCE)\npublic @interface Accessors {\n\t/**\n\t * If true, accessors will be named after the field and not include a {@code get} or {@code set}\n\t * prefix. If true and {@code chain} is omitted, {@code chain} defaults to {@code true}.<br>\n\t * NB: This setting has no effect on {@code @With}; they always get a \"with\" prefix.<br>\n\t * <strong>default: false</strong>\n\t * \n\t * @return Whether or not to make fluent methods (named {@code fieldName()}, not for example {@code setFieldName}).\n\t */\n\tboolean fluent() default false;\n\t\n\t/**\n\t * If true, setters return {@code this} instead of {@code void}.\n\t * <strong>default: false</strong>, unless {@code fluent=true}, then <strong>default: true</strong>\n\t * \n\t * @return Whether or not setters should return themselves (chaining) or {@code void} (no chaining).\n\t */\n\tboolean chain() default false;\n\t\n\t/**\n\t * If true, generated accessors will be marked  {@code final}.\n\t * <strong>default: false</strong>\n\t * \n\t * @return Whether or not accessors should be marked {@code final}.\n\t */\n\tboolean makeFinal() default false;\n\t\n\t/**\n\t * If present, only fields with any of the stated prefixes are given the getter/setter treatment.\n\t * Note that a prefix only counts if the next character is NOT a lowercase character or the last\n\t * letter of the prefix is not a letter (for instance an underscore). If multiple fields\n\t * all turn into the same name when the prefix is stripped, an error will be generated.\n\t * \n\t * @return If you are in the habit of prefixing your fields (for example, you name them {@code fFieldName}, specify such prefixes here).\n\t */\n\tString[] prefix() default {};\n}\n"
  },
  {
    "path": "src/core/lombok/experimental/Delegate.java",
    "content": "/*\n * Copyright (C) 2010-2017 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.experimental;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Put on any field to make lombok generate delegate methods that forward the call to this field.\n * \n * Example:\n * <pre>\n *     private &#64;Delegate List&lt;String&gt; foo;\n * </pre>\n * \n * will generate for example an {@code boolean add(String)} method, which contains: {@code return foo.add(arg);}, as well as all other methods in {@code List}.\n * \n * All public instance methods of the field's type, as well as all public instance methods of all the field's type's superfields are delegated, except for all methods\n * that exist in {@link Object}, the {@code canEqual(Object)} method, and any methods that appear in types\n * that are listed in the {@code excludes} property.\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/experimental/Delegate\">the project lombok features page for &#64;Delegate</a>.\n */\n@Target({ElementType.FIELD, ElementType.METHOD})\n@Retention(RetentionPolicy.SOURCE)\npublic @interface Delegate {\n\t/**\n\t * Normally the type of the field is used as delegate type. However, to choose a different type to delegate, you can list one (or more) types here. Note that types with\n\t * type arguments can only be done as a field type. A solution for this is to create a private inner interface/class with the appropriate types extended, and possibly\n\t * with all methods you'd like to delegate listed, and then supply that class here. The field does not actually have to implement the type you're delegating; the\n\t * type listed here is used only to determine which delegate methods to generate.\n\t * \n\t * NB: All methods in {@code Object}, as well as {@code canEqual(Object other)} will never be delegated.\n\t * \n\t * @return For each method (not already in {@code java.lang.Object}) in these types, generate a delegate method.\n\t */\n\tClass<?>[] types() default {};\n\t\n\t/**\n\t * Each method in any of the types listed here (include supertypes) will <em>not</em> be delegated.\n\t * \n\t * NB: All methods in {@code Object}, as well as {@code canEqual(Object other)} will never be delegated.\n\t * \n\t * @return For each method (not already in {@code java.lang.Object}) in these types, skip generating a delegate method (overrides {@code types()}).\n\t */\n\tClass<?>[] excludes() default {};\n}\n"
  },
  {
    "path": "src/core/lombok/experimental/ExtensionMethod.java",
    "content": "/*\n * Copyright (C) 2012-2017 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.experimental;\n\nimport static java.lang.annotation.ElementType.*;\nimport static java.lang.annotation.RetentionPolicy.*;\n\nimport java.lang.annotation.*;\n\n/**\n * Extension methods enable you to \"add\" methods to existing types without creating a new derived type, recompiling, or\n * otherwise modifying the original type. Extension methods are a special kind of static method, but they are called as\n * if they were instance methods on the extended type.\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/experimental/ExtensionMethod\">the project lombok features page for &#64;ExtensionMethod</a>.\n * <br>\n * <p>\n * Before:\n * \n * <pre>\n * &#064;ExtensionMethod(java.util.Arrays.class)\n * class Example {\n * \tprivate void example() {\n * \t\tlong[] values = new long[] { 2, 5, 7, 9 };\n * \t\tvalues.copyOf(3).sort();\n * \t}\n * }\n * </pre>\n * \n * After:\n * \n * <pre>\n * class Example {\n * \tprivate void example() {\n * \t\tlong[] values = new long[] { 2, 5, 7, 9 };\n * \t\tjava.util.Arrays.sort(java.util.Arrays.copyOf(values, 3));\n * \t}\n * }\n * </pre>\n */\n@Target(TYPE)\n@Retention(SOURCE)\npublic @interface ExtensionMethod {\n\t/** @return All types whose static methods will be exposed as extension methods. */\n\tClass<?>[] value();\n\n\t/**\n\t * If {@code true}, an applicable extension method is used (if found) even if the method call already was compilable (this is the default).\n\t * If {@code false}, an extension method is only used if the method call is not also defined by the type itself.\n\t * \n\t * @return Whether or not to override already existing methods with the extension.\n\t */\n\tboolean suppressBaseMethods() default true;\n}\n"
  },
  {
    "path": "src/core/lombok/experimental/FieldDefaults.java",
    "content": "/*\n * Copyright (C) 2012-2017 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.experimental;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\nimport lombok.AccessLevel;\n\n/**\n * Adds modifiers to each field in the type with this annotation.\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/experimental/FieldDefaults\">the project lombok features page for &#64;FieldDefaults</a>.\n * <p>\n * If {@code makeFinal} is {@code true}, then each (instance) field that is not annotated with {@code @NonFinal} will have the {@code final} modifier added.\n * <p>\n * If {@code level} is set, then each (instance) field that is package private (i.e. no access modifier) and does not have the {@code @PackagePrivate} annotation will\n * have the appropriate access level modifier added.\n */\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.SOURCE)\npublic @interface FieldDefaults {\n\tAccessLevel level() default AccessLevel.NONE;\n\tboolean makeFinal() default false;\n}\n"
  },
  {
    "path": "src/core/lombok/experimental/FieldNameConstants.java",
    "content": "/*\n * Copyright (C) 2014-2018 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.experimental;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\nimport lombok.AccessLevel;\n\n/**\n * Generates an inner type, containing String constants containing the field name for each field. Alternatively, generates an inner enum with enum values matching each field name.\n */\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.SOURCE)\npublic @interface FieldNameConstants {\n\tlombok.AccessLevel level() default AccessLevel.PUBLIC;\n\tboolean asEnum() default false;\n\tString innerTypeName() default \"\";\n\t\n\t/**\n\t * Only include fields and methods explicitly marked with {@code @FieldNameConstants.Include}.\n\t * Normally, all (non-static) fields are included by default.\n\t * \n\t * @return If {@code true}, don't include non-static fields automatically (default: {@code false}).\n\t */\n\tboolean onlyExplicitlyIncluded() default false;\n\t\n\t/**\n\t * If present, do not include this field in the generated fieldnames inner type.\n\t */\n\t@Target(ElementType.FIELD)\n\t@Retention(RetentionPolicy.SOURCE)\n\tpublic @interface Exclude {}\n\t\n\t/**\n\t * If present, include this field in the generated fieldnames inner type (default).\n\t */\n\t@Target(ElementType.FIELD)\n\t@Retention(RetentionPolicy.SOURCE)\n\tpublic @interface Include {}\n}\n"
  },
  {
    "path": "src/core/lombok/experimental/Helper.java",
    "content": "/*\n * Copyright (C) 2015 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.experimental;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Use on a method local class to indicate that all methods inside should be exposed to the rest of\n * the method as if they were helper methods.\n */\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.SOURCE)\npublic @interface Helper {}\n"
  },
  {
    "path": "src/core/lombok/experimental/NonFinal.java",
    "content": "/*\n * Copyright (C) 2012 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.experimental;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Used to indicate the explicit intention for the annotated entity to <em>not</em> be {@code final}.\n * Currently used by {@code FieldDefaults} and {@code Value} to avoid having it make a field final.\n */\n@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE, ElementType.ANNOTATION_TYPE, ElementType.TYPE, ElementType.METHOD})\n@Retention(RetentionPolicy.SOURCE)\npublic @interface NonFinal {}\n"
  },
  {
    "path": "src/core/lombok/experimental/PackagePrivate.java",
    "content": "/*\n * Copyright (C) 2012 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.experimental;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Used to indicate the explicit intention for the annotated entity to have the <em>package private</em> access level.\n * Currently used by {@code FieldDefaults} and {@code Value} to avoid having it make a field one of {@code public}, {@code protected}, or {@code private}.\n */\n@Target({ElementType.TYPE, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.ANNOTATION_TYPE})\n@Retention(RetentionPolicy.SOURCE)\npublic @interface PackagePrivate {}\n"
  },
  {
    "path": "src/core/lombok/experimental/StandardException.java",
    "content": "/*\n * Copyright (C) 2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.experimental;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\nimport lombok.AccessLevel;\n\n/**\n * Put on any class that extends some {@code java.lang.Throwable} type to add the 4 common exception constructors.\n * \n * Specifically, all 4 constructors derived from the combinatorial explosion of {@code String message} and {@code Throwable cause}.\n * You may write any or all of these 4 constructors by hand; lombok will only generate the missing ones.\n * <p>\n * All but the full {@code (String message, Throwable cause)} constructor are implemented as a {@code this(msg, cause)} call; it is therefore\n * possibly to write code to run on construction by writing just the {@code (String message, Throwable cause)} constructor.\n */\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.SOURCE)\npublic @interface StandardException {\n\t/**\n\t * Sets the access level of the generated constuctors. By default, generated constructors are {@code public}.\n\t * Note: This does nothing if you write your own constructors (we won't change their access levels).\n\t * \n\t * @return The constructors will be generated with this access modifier.\n\t */\n\tAccessLevel access() default lombok.AccessLevel.PUBLIC;\n}\n"
  },
  {
    "path": "src/core/lombok/experimental/SuperBuilder.java",
    "content": "/*\n * Copyright (C) 2018-2025 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.experimental;\n\nimport static java.lang.annotation.ElementType.*;\nimport static java.lang.annotation.RetentionPolicy.*;\n\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.Target;\n\nimport lombok.Singular;\n\n/**\n * The SuperBuilder annotation creates a so-called 'builder' aspect to the class that is annotated with {@code @SuperBuilder}, but which works well when extending.\n * It is similar to {@code @Builder}, except it is only legal on types, is less configurable, but allows you to {@code extends} other builder-able classes.\n * <p>\n * All classes in the hierarchy must be annotated with {@code @SuperBuilder}.\n * <p>\n * Lombok generates 2 inner 'builder' classes, which extend the parent class' builder class (unless your class doesn't have an extends clause).\n * Lombok also generates a static method named {@code builder()}, and a protected constructor that takes 1 argument of the builderclass type.\n * <p>\n * The <code><strong>T</strong>Builder</code> class contains 1 method for each parameter of the annotated\n * constructor / method (each field, when annotating a class), which returns the builder itself.\n * The builder also has a {@code build()} method which returns a completed instance of the original type.\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/experimental/SuperBuilder\">the project lombok features page for &#64;SuperBuilder</a>.\n *\n * @see Singular\n */\n@Target(TYPE)\n@Retention(SOURCE)\npublic @interface SuperBuilder {\n\t/** @return Name of the method that creates a new builder instance. Default: {@code builder}. If the empty string, suppress generating the {@code builder} method. */\n\tString builderMethodName() default \"builder\";\n\n\t/** @return Name of the method in the builder class that creates an instance of your {@code @Builder}-annotated class. */\n\tString buildMethodName() default \"build\";\n\n\t/**\n\t * If {@code true}, generate an instance method to obtain a builder that is initialized with the values of this instance.\n\t * In this case, all superclasses must also have {@code toBuilder=true}.\n\t *\n\t * @return Whether to generate a {@code toBuilder()} method.\n\t */\n\tboolean toBuilder() default false;\n\n\t/**\n\t * Prefix to prepend to 'set' methods in the generated builder class. By default, generated methods do not include a prefix.\n\t *\n\t * For example, a method normally generated as {@code someField(String someField)} would instead be\n\t * generated as {@code withSomeField(String someField)} if using {@code @SuperBuilder(setterPrefix = \"with\")}.\n\t *\n\t * Note that using \"with\" to prefix builder setter methods is strongly discouraged as \"with\" normally\n\t * suggests immutable data structures, and builders by definition are mutable objects.\n\t * \n\t * For {@code @Singular} fields, the generated methods are called {@code withName}, {@code withNames}, and {@code clearNames}, instead of\n\t * the default {@code name}, {@code names}, and {@code clearNames}.\n\t * \n\t * This prefix only applies to the 'set' methods for the fields of the annotated class. \n\t * For consistency reasons, you should use the same prefix on all superclasses and subclasses that use {@code @SuperBuilder}.\n\t * \n\t * @return The prefix to prepend to generated method names.\n\t */\n\tString setterPrefix() default \"\";\n}\n"
  },
  {
    "path": "src/core/lombok/experimental/Tolerate.java",
    "content": "/*\n * Copyright (C) 2014 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.experimental;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Put on any method or constructor to make lombok pretend it doesn't exist,\n * i.e., to generate a method which would otherwise be skipped due to possible conflicts.\n */\n@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})\n@Retention(RetentionPolicy.SOURCE)\npublic @interface Tolerate {\n}\n"
  },
  {
    "path": "src/core/lombok/experimental/UtilityClass.java",
    "content": "/*\n * Copyright (C) 2015-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.experimental;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * An annotation to create utility classes.\n * \n * If a class is annotated with {@code @UtilityClass}, the following things happen to it:<ul>\n * <li>It is marked final.</li>\n * <li>If any constructors are declared in it, an error is generated. Otherwise, a private no-args constructor is generated; it throws a {@code UnsupportedOperationException}.</li>\n * <li>All methods, inner classes, and fields in the class are marked static.</li>\n * <li><em>WARNING:</em> Do not use non-star static imports to import these members; javac won't be able to figure it out. Use either:\n *    {@code import static ThisType.*;} or don't static-import.</li>\n * </ul>\n */\n@Target({ElementType.TYPE})\n@Retention(RetentionPolicy.SOURCE)\npublic @interface UtilityClass {\n}\n"
  },
  {
    "path": "src/core/lombok/experimental/WithBy.java",
    "content": "/*\n * Copyright (C) 2020 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.experimental;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\nimport lombok.AccessLevel;\n\n/**\n * Put on any field to make lombok build a 'withBy' - a withFieldNameBy method which produces a clone of this object (except for 1 field which gets a new value).\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/experimental/WithBy\">the project lombok features page for &#64;WithBy</a>.\n * <p>\n * Example:\n * <pre>\n *     private &#64;WithBy final int foo;\n *     private &#64;WithBy final String bar;\n * </pre>\n * \n * will generate:\n * \n * <pre>\n *     public SELF_TYPE withFooBy(@lombok.NonNull IntUnaryOperator operator) {\n *         int foo = operator.apply(this.foo);\n *         return this.foo == foo ? this : new SELF_TYPE(foo, bar);\n *     }\n *     public SELF_TYPE withBarBy(@lombok.NonNull Function&lt;? super String, ? extends String&gt; operator) {\n *         String bar = operator.apply(this.bar);\n *         return this.bar == bar ? this : new SELF_TYPE(foo, bar);\n *     }\n * </pre>\n * <p>\n * This annotation can also be applied to a class, in which case it'll be as if all non-static fields that don't already have\n * a {@code WithBy} annotation have the annotation.\n * <p>\n * This annotation is primarily useful for hierarchical immutable data structures. For example:\n * \n * <pre>\n *     class Movie {\n *         &#64;WithBy private final Director director;\n *     }\n *     \n *     class Director {\n *         &#64;WithBy private final LocalDate birthDate;\n *     }\n * </pre>\n * \n * Using plain old {@code @With}, to increment a movie's director's birth date by one, you would write:\n * \n * <pre>\n *     movie = movie.withDirector(movie.getDirector().withBirthDate(movie.getDirector().getBirthDate().plusDays(1)));\n * </pre>\n * \n * but with {@code @WithBy}, you'd write:\n * \n * <pre>\n *     movie = movie.withDirectorBy(d -&gt; d.withBirthDateBy(bd -&gt; bd.plusDays(1)));\n * </pre>\n */\n@Target({ElementType.FIELD, ElementType.TYPE})\n@Retention(RetentionPolicy.SOURCE)\npublic @interface WithBy {\n\t/**\n\t * If you want your with method to be non-public, you can specify an alternate access level here.\n\t * \n\t * @return The method will be generated with this access modifier.\n\t */\n\tAccessLevel value() default AccessLevel.PUBLIC;\n\t\n\t/**\n\t * Any annotations listed here are put on the generated method.\n\t * The syntax for this feature depends on JDK version (nothing we can do about that; it's to work around javac bugs).<br>\n\t * up to JDK7:<br>\n\t *  {@code @With(onMethod=@__({@AnnotationsGoHere}))}<br>\n\t * from JDK8:<br>\n\t *  {@code @With(onMethod_={@AnnotationsGohere})} // note the underscore after {@code onMethod}.\n\t * \n\t * @return List of annotations to apply to the generated method.\n\t */\n\tAnyAnnotation[] onMethod() default {};\n\t\n\t/**\n\t  * Placeholder annotation to enable the placement of annotations on the generated code.\n\t  * @deprecated Don't use this annotation, ever - Read the documentation.\n\t  */\n\t@Deprecated\n\t@Retention(RetentionPolicy.SOURCE)\n\t@Target({})\n\t@interface AnyAnnotation {}\n}\n"
  },
  {
    "path": "src/core/lombok/experimental/Wither.java",
    "content": "/*\n * Copyright (C) 2012-2019 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.experimental;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\nimport lombok.AccessLevel;\n\n/**\n * Put on any field to make lombok build a 'wither' - a withX method which produces a clone of this object (except for 1 field which gets a new value).\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/experimental/Wither\">the project lombok features page for &#64;Wither</a>.\n * <p>\n * Even though it is not listed, this annotation also has the {@code onParam} and {@code onMethod} parameter. See the full documentation for more details.\n * <p>\n * Example:\n * <pre>\n *     private &#64;Wither final int foo;\n * </pre>\n * \n * will generate:\n * \n * <pre>\n *     public SELF_TYPE withFoo(int foo) {\n *         return this.foo == foo ? this : new SELF_TYPE(otherField1, otherField2, foo);\n *     }\n * </pre>\n * <p>\n * This annotation can also be applied to a class, in which case it'll be as if all non-static fields that don't already have\n * a {@code Wither} annotation have the annotation.\n * \n * @deprecated {@link lombok.With} has been promoted to the main package, so use that one instead.\n */\n@Target({ElementType.FIELD, ElementType.TYPE})\n@Retention(RetentionPolicy.SOURCE)\npublic @interface Wither {\n\t/**\n\t * If you want your wither to be non-public, you can specify an alternate access level here.\n\t * \n\t * @return The method will be generated with this access modifier.\n\t */\n\tAccessLevel value() default AccessLevel.PUBLIC;\n\t\n\t/**\n\t * Any annotations listed here are put on the generated method.\n\t * The syntax for this feature depends on JDK version (nothing we can do about that; it's to work around javac bugs).<br>\n\t * up to JDK7:<br>\n\t *  {@code @Wither(onMethod=@__({@AnnotationsGoHere}))}<br>\n\t * from JDK8:<br>\n\t *  {@code @Wither(onMethod_={@AnnotationsGohere})} // note the underscore after {@code onMethod}.\n\t * \n\t * @return List of annotations to apply to the generated method.\n\t */\n\tAnyAnnotation[] onMethod() default {};\n\t\n\t/**\n\t * Any annotations listed here are put on the generated method's parameter.\n\t * The syntax for this feature depends on JDK version (nothing we can do about that; it's to work around javac bugs).<br>\n\t * up to JDK7:<br>\n\t *  {@code @Wither(onParam=@__({@AnnotationsGoHere}))}<br>\n\t * from JDK8:<br>\n\t *  {@code @Wither(onParam_={@AnnotationsGohere})} // note the underscore after {@code onParam}.\n\t * \n\t * @return List of annotations to apply to the generated parameter in the method.\n\t */\n\tAnyAnnotation[] onParam() default {};\n\t\n\t/**\n\t  * Placeholder annotation to enable the placement of annotations on the generated code.\n\t  * @deprecated Don't use this annotation, ever - Read the documentation.\n\t  */\n\t@Deprecated\n\t@Retention(RetentionPolicy.SOURCE)\n\t@Target({})\n\t@interface AnyAnnotation {}\n}\n"
  },
  {
    "path": "src/core/lombok/experimental/package-info.java",
    "content": "/*\n * Copyright (C) 2009-2017 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/**\n * This package contains the annotations and support classes you need as a user of lombok, for\n * all features which aren't (yet) supported as a first class feature. Features that involve the\n * annotations and support classes in this package may change or may be removed entirely in future versions,\n * and bugs may not be solved as expediently. For the status and likely future of any feature, refer\n * to the official feature documentation.\n * \n * @see lombok\n * @see <a href=\"https://projectlombok.org/features/experimental/all\">Lombok features (experimental)</a>\n */\npackage lombok.experimental;\n"
  },
  {
    "path": "src/core/lombok/experimental/var.java",
    "content": "/*\n * Copyright (C) 2010-2017 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.experimental;\n\n/**\n * like val but not final\n * \n * @deprecated {@code var} has been promoted to the main package; use {@link lombok.var} instead.\n */\n@Deprecated\npublic @interface var {\n}\n"
  },
  {
    "path": "src/core/lombok/extern/apachecommons/CommonsLog.java",
    "content": "/*\n * Copyright (C) 2010-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.extern.apachecommons;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\nimport lombok.AccessLevel;\n\n/**\n * Causes lombok to generate a logger field.\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/log\">the project lombok features page for lombok log annotations</a>.\n * <p>\n * Example:\n * <pre>\n * &#64;CommonsLog\n * public class LogExample {\n * }\n * </pre>\n * \n * will generate:\n * \n * <pre>\n * public class LogExample {\n *     private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);\n * }\n * </pre>\n * \n * This annotation is valid for classes and enumerations.<br>\n * \n * @see <a href=\"https://commons.apache.org/proper/commons-logging/apidocs/org/apache/commons/logging/Log.html\">org.apache.commons.logging.Log</a>\n * @see <a href=\"https://commons.apache.org/proper/commons-logging/apidocs/org/apache/commons/logging/LogFactory.html#getLog(java.lang.Class)\">org.apache.commons.logging.LogFactory#getLog(java.lang.Class)</a>\n * @see lombok.extern.java.Log &#64;Log\n * @see lombok.extern.log4j.Log4j &#64;Log4j\n * @see lombok.extern.log4j.Log4j2 &#64;Log4j2\n * @see lombok.extern.slf4j.Slf4j &#64;Slf4j\n * @see lombok.extern.slf4j.XSlf4j &#64;XSlf4j\n * @see lombok.extern.jbosslog.JBossLog &#64;JBossLog\n * @see lombok.extern.flogger.Flogger &#64;Flogger\n * @see lombok.CustomLog &#64;CustomLog\n */\n@Retention(RetentionPolicy.SOURCE)\n@Target(ElementType.TYPE)\npublic @interface CommonsLog {\n\t/**\n\t * Sets the access level of the generated log field.\n\t * Default: {@code AccessLevel.PRIVATE}.\n\t * \n\t * @return The constructed Logger method will be generated with this access modifier.\n\t */\n\tAccessLevel access() default AccessLevel.PRIVATE;\n\t\n\t/** @return The category of the constructed Logger. By default, it will use the type where the annotation is placed. */\n\tString topic() default \"\";\n}\n"
  },
  {
    "path": "src/core/lombok/extern/flogger/Flogger.java",
    "content": "/*\n * Copyright (C) 2018-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.extern.flogger;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\nimport lombok.AccessLevel;\n\n/**\n * Causes lombok to generate a logger field.\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/log\">the project lombok features page for lombok log annotations</a>.\n * <p>\n * Example:\n * <pre>\n * &#64;Flogger\n * public class LogExample {\n * }\n * </pre>\n * \n * will generate:\n * \n * <pre>\n * public class LogExample {\n *     private static final com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();\n * }\n * </pre>\n * \n * This annotation is valid for classes and enumerations.<br>\n * @see <a href=\"https://google.github.io/flogger/\">com.google.common.flogger</a>\n * @see lombok.extern.apachecommons.CommonsLog &#64;CommonsLog\n * @see lombok.extern.java.Log &#64;Log\n * @see lombok.extern.log4j.Log4j &#64;Log4j\n * @see lombok.extern.log4j.Log4j2 &#64;Log4j2\n * @see lombok.extern.slf4j.Slf4j &#64;Slf4j\n * @see lombok.extern.slf4j.XSlf4j &#64;XSlf4j\n * @see lombok.extern.jbosslog.JBossLog &#64;JBossLog\n * @see lombok.CustomLog &#64;CustomLog\n */\n@Retention(RetentionPolicy.SOURCE)\n@Target(ElementType.TYPE)\npublic @interface Flogger {\n\t/**\n\t * Sets the access level of the generated log field.\n\t * Default: {@code AccessLevel.PRIVATE}.\n\t * \n\t * @return The constructed Logger method will be generated with this access modifier.\n\t */\n\tAccessLevel access() default AccessLevel.PRIVATE;\n}\n"
  },
  {
    "path": "src/core/lombok/extern/jackson/Jacksonized.java",
    "content": "/*\n * Copyright (C) 2020-2025 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.extern.jackson;\n\nimport static java.lang.annotation.ElementType.*;\nimport static java.lang.annotation.RetentionPolicy.*;\n\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.Target;\n\nimport lombok.Builder;\nimport lombok.experimental.Accessors;\nimport lombok.experimental.SuperBuilder;\n\n/**\n * The {@code @Jacksonized} annotation is an add-on annotation for\n * {@code @}{@link Builder}, {@code @}{@link SuperBuilder}, and\n * {@code @}{@link Accessors}.\n * <p>\n * For {@code @}{@link Accessors}{@code (fluent = true)} on a type, it automatically\n * configures Jackson to use the generated setters and getters for\n * (de-)serialization by inserting {@code @}{@link JsonProperty} annotations.\n * (Note that {@code @Jacksonized} {@code @Accessors} on fields are not supported.) \n * <p>\n * For {@code @}{@link Builder} and {@code @}{@link SuperBuilder}, it\n * automatically configures the generated builder class to be used by Jackson's\n * deserialization. It only has an effect if present at a context where there is\n * also a {@code @Builder} or a {@code @SuperBuilder}; a warning is emitted\n * otherwise.\n * <p>\n * In particular, the annotation does the following for {@code @(Super)Builder}</code>:\n * <ul>\n * <li>Configure Jackson to use the builder for deserialization using\n * {@code @JsonDeserialize(builder=Foobar.FoobarBuilder[Impl].class)} on the\n * class (where <em>Foobar</em> is the name of the annotated class).</li>\n * <li>Copy Jackson-related configuration annotations (like\n * {@code @JsonIgnoreProperties}) from the class to the builder class. This is\n * necessary so that Jackson recognizes them when using the builder.</li>\n * <li>Insert {@code @JsonPOJOBuilder(withPrefix=\"\")} on the generated builder\n * class to override Jackson's default prefix \"with\". If you configured a\n * different prefix in lombok using {@code setterPrefix}, this value is used. If\n * you changed the name of the {@code build()} method using\n * {@code buildMethodName}, this is also made known to Jackson.</li>\n * <li>For {@code @SuperBuilder}, make the builder implementation class\n * package-private.</li>\n * </ul>\n * This annotation does <em>not</em> change the behavior of the generated\n * builder. A {@code @Jacksonized} {@code @SuperBuilder} remains fully\n * compatible to regular {@code @SuperBuilder}s.\n */\n@Target({TYPE, METHOD, CONSTRUCTOR})\n@Retention(SOURCE)\npublic @interface Jacksonized {\n}\n"
  },
  {
    "path": "src/core/lombok/extern/java/Log.java",
    "content": "/*\n * Copyright (C) 2010-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.extern.java;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\nimport lombok.AccessLevel;\n\n/**\n * Causes lombok to generate a logger field.\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/log\">the project lombok features page for lombok log annotations</a>.\n * <p>\n * Example:\n * <pre>\n * &#64;Log\n * public class LogExample {\n * }\n * </pre>\n * \n * will generate:\n * \n * <pre>\n * public class LogExample {\n *     private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());\n * }\n * </pre>\n * \n * This annotation is valid for classes and enumerations.<br>\n * @see <a href=\"https://docs.oracle.com/javase/8/docs/api/java/util/logging/Logger.html\">java.util.logging.Logger</a>\n * @see <a href=\"https://docs.oracle.com/javase/8/docs/api/java/util/logging/Logger.html#getLogger-java.lang.String-\">java.util.logging.Logger#getLogger(java.lang.String)</a>\n * @see lombok.extern.apachecommons.CommonsLog &#64;CommonsLog\n * @see lombok.extern.log4j.Log4j &#64;Log4j\n * @see lombok.extern.log4j.Log4j2 &#64;Log4j2\n * @see lombok.extern.slf4j.Slf4j &#64;Slf4j\n * @see lombok.extern.slf4j.XSlf4j &#64;XSlf4j\n * @see lombok.extern.jbosslog.JBossLog &#64;JBossLog\n * @see lombok.extern.flogger.Flogger &#64;Flogger\n * @see lombok.CustomLog &#64;CustomLog\n */\n@Retention(RetentionPolicy.SOURCE)\n@Target(ElementType.TYPE)\npublic @interface Log {\n\t/**\n\t * Sets the access level of the generated log field.\n\t * Default: {@code AccessLevel.PRIVATE}.\n\t * \n\t * @return The constructed Logger method will be generated with this access modifier.\n\t */\n\tAccessLevel access() default AccessLevel.PRIVATE;\n\t\n\t/** @return The category of the constructed Logger. By default, it will use the type where the annotation is placed. */\n\tString topic() default \"\";\n}\n"
  },
  {
    "path": "src/core/lombok/extern/jbosslog/JBossLog.java",
    "content": "/*\n * Copyright (C) 2016-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.extern.jbosslog;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\nimport lombok.AccessLevel;\n\n/**\n * Causes lombok to generate a logger field.\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/log\">the project lombok features page for lombok log annotations</a>.\n * <p>\n * Example:\n * <pre>\n * &#64;JBossLog\n * public class LogExample {\n * }\n * </pre>\n * \n * will generate:\n * \n * <pre>\n * public class LogExample {\n *     private static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LogExample.class);\n * }\n * </pre>\n * \n * This annotation is valid for classes and enumerations.<br>\n * @see <a href=\"https://docs.jboss.org/jbosslogging/latest/org/jboss/logging/Logger.html\">org.jboss.logging.Logger</a>\n * @see <a href=\"https://docs.jboss.org/jbosslogging/latest/org/jboss/logging/Logger.html#getLogger(java.lang.Class)\">org.jboss.logging.Logger#getLogger(java.lang.Class)</a>\n * @see lombok.extern.apachecommons.CommonsLog &#64;CommonsLog\n * @see lombok.extern.java.Log &#64;Log\n * @see lombok.extern.log4j.Log4j &#64;Log4j\n * @see lombok.extern.log4j.Log4j2 &#64;Log4j2\n * @see lombok.extern.slf4j.Slf4j &#64;Slf4j\n * @see lombok.extern.slf4j.XSlf4j &#64;XSlf4j\n * @see lombok.extern.flogger.Flogger &#64;Flogger\n * @see lombok.CustomLog &#64;CustomLog\n */\n@Retention(RetentionPolicy.SOURCE)\n@Target(ElementType.TYPE)\npublic @interface JBossLog {\n\t/**\n\t * Sets the access level of the generated log field.\n\t * Default: {@code AccessLevel.PRIVATE}.\n\t * \n\t * @return The constructed Logger method will be generated with this access modifier.\n\t */\n\tAccessLevel access() default AccessLevel.PRIVATE;\n\t\n\t/** @return The category of the constructed Logger. By default, it will use the type where the annotation is placed. */\n\tString topic() default \"\";\n}\n"
  },
  {
    "path": "src/core/lombok/extern/log4j/Log4j.java",
    "content": "/*\n * Copyright (C) 2010-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.extern.log4j;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\nimport lombok.AccessLevel;\n\n/**\n * Causes lombok to generate a logger field.\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/log\">the project lombok features page for lombok log annotations</a>.\n * <p>\n * Example:\n * <pre>\n * &#64;Log4j\n * public class LogExample {\n * }\n * </pre>\n * \n * will generate:\n * \n * <pre>\n * public class LogExample {\n *     private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class);\n * }\n * </pre>\n * \n * This annotation is valid for classes and enumerations.<br>\n * \n * @see <a href=\"https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Logger.html\">org.apache.log4j.Logger</a>\n * @see <a href=\"https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Logger.html#getLogger(java.lang.Class)\">org.apache.log4j.Logger#getLogger(java.lang.Class)</a>\n * @see lombok.extern.log4j.Log4j2 &#64;Log4j2\n * @see lombok.extern.apachecommons.CommonsLog &#64;CommonsLog\n * @see lombok.extern.java.Log &#64;Log\n * @see lombok.extern.slf4j.Slf4j &#64;Slf4j\n * @see lombok.extern.slf4j.XSlf4j &#64;XSlf4j\n * @see lombok.extern.jbosslog.JBossLog &#64;JBossLog\n * @see lombok.extern.flogger.Flogger &#64;Flogger\n * @see lombok.CustomLog &#64;CustomLog\n */\n@Retention(RetentionPolicy.SOURCE)\n@Target(ElementType.TYPE)\npublic @interface Log4j {\n\t/**\n\t * Sets the access level of the generated log field.\n\t * Default: {@code AccessLevel.PRIVATE}.\n\t * \n\t * @return The constructed Logger method will be generated with this access modifier.\n\t */\n\tAccessLevel access() default AccessLevel.PRIVATE;\n\t\n\t/** @return The category of the constructed Logger. By default, it will use the type where the annotation is placed. */\n\tString topic() default \"\";\n}\n"
  },
  {
    "path": "src/core/lombok/extern/log4j/Log4j2.java",
    "content": "/*\n * Copyright (C) 2013-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.extern.log4j;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\nimport lombok.AccessLevel;\n\n/**\n * Causes lombok to generate a logger field.\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/log\">the project lombok features page for lombok log annotations</a>.\n * <p>\n * Example:\n * <pre>\n * &#64;Log4j2\n * public class LogExample {\n * }\n * </pre>\n * \n * will generate:\n * \n * <pre>\n * public class LogExample {\n *     private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);\n * }\n * </pre>\n * \n * This annotation is valid for classes and enumerations.<br>\n * \n * @see <a href=\"https://logging.apache.org/log4j/2.x/log4j-api/apidocs/org/apache/logging/log4j/Logger.html\">org.apache.logging.log4j.Logger</a>\n * @see <a href=\"https://logging.apache.org/log4j/2.x/log4j-api/apidocs/org/apache/logging/log4j/LogManager.html#getLogger-java.lang.Class-\">org.apache.logging.log4j.LogManager#getLogger(java.lang.Class)</a>\n * @see lombok.extern.log4j.Log4j &#64;Log4j\n * @see lombok.extern.apachecommons.CommonsLog &#64;CommonsLog\n * @see lombok.extern.java.Log &#64;Log\n * @see lombok.extern.slf4j.Slf4j &#64;Slf4j\n * @see lombok.extern.slf4j.XSlf4j &#64;XSlf4j\n * @see lombok.extern.jbosslog.JBossLog &#64;JBossLog\n * @see lombok.extern.flogger.Flogger &#64;Flogger\n * @see lombok.CustomLog &#64;CustomLog\n */\n@Retention(RetentionPolicy.SOURCE)\n@Target(ElementType.TYPE)\npublic @interface Log4j2 {\n\t/**\n\t * Sets the access level of the generated log field.\n\t * Default: {@code AccessLevel.PRIVATE}.\n\t * \n\t * @return The constructed Logger method will be generated with this access modifier.\n\t */\n\tAccessLevel access() default AccessLevel.PRIVATE;\n\t\n\t/** @return The category of the constructed Logger. By default, it will use the type where the annotation is placed. */\n\tString topic() default \"\";\n}\n"
  },
  {
    "path": "src/core/lombok/extern/slf4j/Slf4j.java",
    "content": "/*\n * Copyright (C) 2010-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.extern.slf4j;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\nimport lombok.AccessLevel;\n\n/**\n * Causes lombok to generate a logger field.\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/log\">the project lombok features page for lombok log annotations</a>.\n * <p>\n * Example:\n * <pre>\n * &#64;Slf4j\n * public class LogExample {\n * }\n * </pre>\n * \n * will generate:\n * \n * <pre>\n * public class LogExample {\n *     private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);\n * }\n * </pre>\n * \n * This annotation is valid for classes and enumerations.<br>\n * @see <a href=\"https://www.slf4j.org/api/org/slf4j/Logger.html\">org.slf4j.Logger</a>\n * @see <a href=\"https://www.slf4j.org/api/org/slf4j/LoggerFactory.html#getLogger(java.lang.Class)\">org.slf4j.LoggerFactory#getLogger(java.lang.Class)</a>\n * @see lombok.extern.apachecommons.CommonsLog &#64;CommonsLog\n * @see lombok.extern.java.Log &#64;Log\n * @see lombok.extern.log4j.Log4j &#64;Log4j\n * @see lombok.extern.log4j.Log4j2 &#64;Log4j2\n * @see lombok.extern.slf4j.XSlf4j &#64;XSlf4j\n * @see lombok.extern.jbosslog.JBossLog &#64;JBossLog\n * @see lombok.extern.flogger.Flogger &#64;Flogger\n * @see lombok.CustomLog &#64;CustomLog\n */\n@Retention(RetentionPolicy.SOURCE)\n@Target(ElementType.TYPE)\npublic @interface Slf4j {\n\t/**\n\t * Sets the access level of the generated log field.\n\t * Default: {@code AccessLevel.PRIVATE}.\n\t * \n\t * @return The constructed Logger method will be generated with this access modifier.\n\t */\n\tAccessLevel access() default AccessLevel.PRIVATE;\n\t\n\t/** @return The category of the constructed Logger. By default, it will use the type where the annotation is placed. */\n\tString topic() default \"\";\n}\n\n"
  },
  {
    "path": "src/core/lombok/extern/slf4j/XSlf4j.java",
    "content": "/*\n * Copyright (C) 2012-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.extern.slf4j;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\nimport lombok.AccessLevel;\n\n/**\n * Causes lombok to generate a logger field.\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/log\">the project lombok features page for lombok log annotations</a>.\n * <p>\n * Example:\n * <pre>\n * &#64;XSlf4j\n * public class LogExample {\n * }\n * </pre>\n * \n * will generate:\n * \n * <pre>\n * public class LogExample {\n *     private static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);\n * }\n * </pre>\n * \n * This annotation is valid for classes and enumerations.<br>\n * @see <a href=\"https://www.slf4j.org/api/org/slf4j/ext/XLogger.html\">org.slf4j.ext.XLogger</a>\n * @see <a href=\"https://www.slf4j.org/api/org/slf4j/ext/XLoggerFactory.html#getXLogger(java.lang.Class)\">org.slf4j.ext.XLoggerFactory#getLogger(java.lang.Class)</a>\n * @see lombok.extern.apachecommons.CommonsLog &#64;CommonsLog\n * @see lombok.extern.java.Log &#64;Log\n * @see lombok.extern.log4j.Log4j &#64;Log4j\n * @see lombok.extern.log4j.Log4j2 &#64;Log4j2\n * @see lombok.extern.slf4j.Slf4j &#64;Slf4j\n * @see lombok.extern.jbosslog.JBossLog &#64;JBossLog\n * @see lombok.extern.flogger.Flogger &#64;Flogger\n * @see lombok.CustomLog &#64;CustomLog\n */\n@Retention(RetentionPolicy.SOURCE)\n@Target(ElementType.TYPE)\npublic @interface XSlf4j {\n\t/**\n\t * Sets the access level of the generated log field.\n\t * Default: {@code AccessLevel.PRIVATE}.\n\t * \n\t * @return The constructed Logger method will be generated with this access modifier.\n\t */\n\tAccessLevel access() default AccessLevel.PRIVATE;\n\t\n\t/** @return The category of the constructed Logger. By default, it will use the type where the annotation is placed. */\n\tString topic() default \"\";\n}\n"
  },
  {
    "path": "src/core/lombok/javac/CapturingDiagnosticListener.java",
    "content": "/*\n * Copyright (C) 2012-2013 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac;\n\nimport java.io.File;\nimport java.util.Collection;\nimport java.util.Iterator;\nimport java.util.Locale;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\nimport javax.tools.Diagnostic;\nimport javax.tools.Diagnostic.Kind;\nimport javax.tools.DiagnosticListener;\nimport javax.tools.JavaFileObject;\n\n/**\n * This class stores any reported errors as {@code CompilerMessage} objects and supports removing some of these.\n * Currently this class is only used for testing purposes.\n */\npublic class CapturingDiagnosticListener implements DiagnosticListener<JavaFileObject> {\n\tprivate final File file;\n\tprivate final Collection<CompilerMessage> messages;\n\t\n\tpublic CapturingDiagnosticListener(File file, Collection<CompilerMessage> messages) {\n\t\tthis.file = file;\n\t\tthis.messages = messages;\n\t}\n\t\n\t@Override public void report(Diagnostic<? extends JavaFileObject> d) {\n\t\tString msg = d.getMessage(Locale.ENGLISH);\n\t\tMatcher m = Pattern.compile(\n\t\t\t\t\"^\" + Pattern.quote(file.getAbsolutePath()) +\n\t\t\t\t\"\\\\s*:\\\\s*\\\\d+\\\\s*:\\\\s*(?:warning:\\\\s*)?(.*)$\", Pattern.DOTALL).matcher(msg);\n\t\tif (m.matches()) msg = m.group(1);\n\t\tif (msg.equals(\"deprecated item is not annotated with @Deprecated\")) {\n\t\t\t// This is new in JDK9; prior to that you don't see this. We shall ignore these.\n\t\t\treturn;\n\t\t}\n\t\tmessages.add(new CompilerMessage(d.getLineNumber(), d.getStartPosition(), d.getKind() == Kind.ERROR, msg));\n\t}\n\t\n\tpublic void suppress(int start, int end) {\n\t\tIterator<CompilerMessage> it = messages.iterator();\n\t\twhile (it.hasNext()) {\n\t\t\tlong pos = it.next().getPosition();\n\t\t\tif (pos >= start && pos < end) it.remove();\n\t\t}\n\t}\n\t\n\tpublic static final class CompilerMessage {\n\t\t/** Line Number (starting at 1) */\n\t\tprivate final long line;\n\t\t\n\t\tprivate final long position;\n\t\tprivate final boolean isError;\n\t\tprivate final String message;\n\t\t\n\t\tpublic CompilerMessage(long line, long position, boolean isError, String message) {\n\t\t\tthis.line = line;\n\t\t\tthis.position = position;\n\t\t\tthis.isError = isError;\n\t\t\tthis.message = message;\n\t\t}\n\t\t\n\t\tpublic long getLine() {\n\t\t\treturn line;\n\t\t}\n\t\t\n\t\tpublic long getPosition() {\n\t\t\treturn position;\n\t\t}\n\t\t\n\t\tpublic boolean isError() {\n\t\t\treturn isError;\n\t\t}\n\t\t\n\t\tpublic String getMessage() {\n\t\t\treturn message;\n\t\t}\n\t\t\n\t\t@Override public int hashCode() {\n\t\t\tfinal int prime = 31;\n\t\t\tint result = 1;\n\t\t\tresult = prime * result + (isError ? 1231 : 1237);\n\t\t\tresult = prime * result + (int) (line ^ (line >>> 32));\n\t\t\tresult = prime * result + ((message == null) ? 0 : message.hashCode());\n\t\t\treturn result;\n\t\t}\n\t\t\n\t\t@Override public boolean equals(Object obj) {\n\t\t\tif (this == obj) return true;\n\t\t\tif (obj == null) return false;\n\t\t\tif (getClass() != obj.getClass()) return false;\n\t\t\tCompilerMessage other = (CompilerMessage) obj;\n\t\t\tif (isError != other.isError) return false;\n\t\t\tif (line != other.line) return false;\n\t\t\tif (message == null) {\n\t\t\t\tif (other.message != null) return false;\n\t\t\t} else if (!message.equals(other.message)) return false;\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\t@Override public String toString() {\n\t\t\treturn String.format(\"%d %s %s\", line, isError ? \"ERROR\" : \"WARNING\", message);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/CompilerMessageSuppressor.java",
    "content": "/*\n * Copyright (C) 2011-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac;\n\nimport java.io.IOException;\nimport java.io.OutputStream;\nimport java.io.PrintWriter;\nimport java.lang.reflect.Constructor;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.Method;\nimport java.util.Collection;\nimport java.util.LinkedList;\nimport java.util.Map;\nimport java.util.Queue;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.ConcurrentMap;\n\nimport javax.tools.DiagnosticListener;\nimport javax.tools.JavaFileObject;\n\nimport com.sun.tools.javac.util.Context;\nimport com.sun.tools.javac.util.JCDiagnostic;\nimport com.sun.tools.javac.util.Log;\n\nimport lombok.permit.Permit;\n\n/**\n * During resolution, the resolver will emit resolution errors, but without appropriate file names and line numbers. If these resolution errors stick around\n * then they will be generated AGAIN, this time with proper names and line numbers, at the end. Therefore, we want to suppress the logger.\n */\npublic final class CompilerMessageSuppressor {\n\t\n\tprivate final Log log;\n\tprivate static final WriterField errWriterField, warnWriterField, noticeWriterField;\n\tprivate static final Field dumpOnErrorField, promptOnErrorField, diagnosticListenerField;\n\tprivate static final Field deferDiagnosticsField, deferredDiagnosticsField, diagnosticHandlerField;\n\tprivate static final ConcurrentMap<Class<?>, Field> handlerDeferredFields = new ConcurrentHashMap<Class<?>, Field>();\n\tprivate static final Field NULL_FIELD;\n\tprivate static final Class<?> DIAGNOSTIC_HANDLER;\n\tprivate static final Class<?> DISCARD_DIAGNOSTIC_HANDLER;\n\tprivate static final Method POP_DIAGNOSTIC_HANDLER;\n\tprivate static final Constructor<?> DISCARD_DIAGNOSTIC_HANDLER_CONSTRUCTOR;\n\tprivate Boolean dumpOnError, promptOnError;\n\tprivate DiagnosticListener<?> contextDiagnosticListener, logDiagnosticListener;\n\tprivate final Context context;\n\tprivate Object diagnosticHandler;\n\t\n\tprivate static final ThreadLocal<Queue<?>> queueCache = new ThreadLocal<Queue<?>>();\n\t\n\tenum Writers {\n\t\tERROR(\"errWriter\", \"ERROR\"),\n\t\tWARNING(\"warnWriter\", \"WARNING\"),\n\t\tNOTICE(\"noticeWriter\", \"NOTICE\");\n\t\t\n\t\tfinal String fieldName;\n\t\tfinal String keyName;\n\t\t\n\t\tWriters(String fieldName, String keyName) {\n\t\t\tthis.fieldName = fieldName;\n\t\t\tthis.keyName = keyName;\n\t\t}\n\t}\n\t\n\tstatic {\n\t\terrWriterField = createWriterField(Writers.ERROR);\n\t\twarnWriterField = createWriterField(Writers.WARNING);\n\t\tnoticeWriterField = createWriterField(Writers.NOTICE);\n\t\tdumpOnErrorField = getDeclaredField(Log.class, \"dumpOnError\");\n\t\tpromptOnErrorField = getDeclaredField(Log.class, \"promptOnError\");\n\t\tdiagnosticListenerField = getDeclaredField(Log.class, \"diagListener\");\n\t\tdeferDiagnosticsField = getDeclaredField(Log.class, \"deferDiagnostics\");\n\t\tdeferredDiagnosticsField = getDeclaredField(Log.class, \"deferredDiagnostics\");\n\t\t\n\t\t// javac8\n\t\tdiagnosticHandlerField = getDeclaredField(Log.class, \"diagnosticHandler\");\n\t\t\n\t\tNULL_FIELD = getDeclaredField(JavacResolution.class, \"NULL_FIELD\");\n\t\t\n\t\tDIAGNOSTIC_HANDLER = getClass(\"com.sun.tools.javac.util.Log$DiagnosticHandler\");\n\t\tDISCARD_DIAGNOSTIC_HANDLER = getClass(\"com.sun.tools.javac.util.Log$DiscardDiagnosticHandler\");\n\t\tPOP_DIAGNOSTIC_HANDLER = DIAGNOSTIC_HANDLER != null ? Permit.permissiveGetMethod(Log.class, \"popDiagnosticHandler\", DIAGNOSTIC_HANDLER) : null;\n\t\tDISCARD_DIAGNOSTIC_HANDLER_CONSTRUCTOR = DISCARD_DIAGNOSTIC_HANDLER != null ? Permit.permissiveGetConstructor(DISCARD_DIAGNOSTIC_HANDLER, Log.class) : null;\n\t}\n\t\n\tstatic Field getDeclaredField(Class<?> c, String fieldName) {\n\t\ttry {\n\t\t\treturn Permit.getField(c, fieldName);\n\t\t} catch (Throwable t) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tstatic Class<?> getClass(String name) {\n\t\ttry {\n\t\t\treturn Class.forName(name);\n\t\t} catch (Throwable t) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic CompilerMessageSuppressor(Context context) {\n\t\tthis.log = Log.instance(context);\n\t\tthis.context = context;\n\t}\n\t\n\tpublic void disableLoggers() {\n\t\tcontextDiagnosticListener = context.get(DiagnosticListener.class);\n\t\tcontext.put(DiagnosticListener.class, (DiagnosticListener<?>) null);\n\n\t\terrWriterField.pauze(log);\n\t\twarnWriterField.pauze(log);\n\t\tnoticeWriterField.pauze(log);\n\t\t\n\t\tif (deferDiagnosticsField != null) try {\n\t\t\tif (Boolean.TRUE.equals(deferDiagnosticsField.get(log))) {\n\t\t\t\tqueueCache.set((Queue<?>) deferredDiagnosticsField.get(log));\n\t\t\t\tQueue<?> empty = new LinkedList<Object>();\n\t\t\t\tdeferredDiagnosticsField.set(log, empty);\n\t\t\t}\n\t\t} catch (Exception e) {}\n\t\t\n\t\tif (dumpOnErrorField != null) try {\n\t\t\tdumpOnError = (Boolean) dumpOnErrorField.get(log);\n\t\t\tdumpOnErrorField.set(log, false);\n\t\t} catch (Exception e) {\n\t\t}\n\t\t\n\t\tif (promptOnErrorField != null) try {\n\t\t\tpromptOnError = (Boolean) promptOnErrorField.get(log);\n\t\t\tpromptOnErrorField.set(log, false);\n\t\t} catch (Exception e) {\n\t\t}\n\t\t\n\t\tif (diagnosticListenerField != null) try {\n\t\t\tlogDiagnosticListener = (DiagnosticListener<?>) diagnosticListenerField.get(log);\n\t\t\tdiagnosticListenerField.set(log, null);\n\t\t} catch (Exception e) {\n\t\t}\n\t\t\n\t\tif (DISCARD_DIAGNOSTIC_HANDLER != null) try {\n\t\t\tdiagnosticHandler = Permit.newInstance(DISCARD_DIAGNOSTIC_HANDLER_CONSTRUCTOR, log);\n\t\t} catch (Exception e) {\n\t\t}\n\t}\n\t\n\tprivate static Field getDeferredField(Object handler) {\n\t\tClass<? extends Object> key = handler.getClass();\n\t\tField field = handlerDeferredFields.get(key);\n\t\tif (field != null) {\n\t\t\treturn field == NULL_FIELD ? null : field;\n\t\t}\n\t\tField value = getDeclaredField(key, \"deferred\");\n\t\thandlerDeferredFields.put(key, value == null ? NULL_FIELD : value);\n\t\treturn getDeferredField(handler);\n\t}\n\n\tpublic void enableLoggers() {\n\t\tif (contextDiagnosticListener != null) {\n\t\t\tcontext.put(DiagnosticListener.class, contextDiagnosticListener);\n\t\t\tcontextDiagnosticListener = null;\n\t\t}\n\t\t\n\t\terrWriterField.resume(log);\n\t\twarnWriterField.resume(log);\n\t\tnoticeWriterField.resume(log);\n\t\t\n\t\tif (dumpOnError != null) try {\n\t\t\tdumpOnErrorField.set(log, dumpOnError);\n\t\t\tdumpOnError = null;\n\t\t} catch (Exception e) {}\n\t\t\n\t\tif (promptOnError != null) try {\n\t\t\tpromptOnErrorField.set(log, promptOnError);\n\t\t\tpromptOnError = null;\n\t\t} catch (Exception e) {}\n\t\t\n\t\tif (logDiagnosticListener != null) try {\n\t\t\tdiagnosticListenerField.set(log, logDiagnosticListener);\n\t\t\tlogDiagnosticListener = null;\n\t\t} catch (Exception e) {}\n\t\t\n\t\tif (deferDiagnosticsField != null && queueCache.get() != null) try {\n\t\t\tdeferredDiagnosticsField.set(log, queueCache.get());\n\t\t\tqueueCache.set(null);\n\t\t} catch (Exception e) {}\n\t\t\n\t\tif (diagnosticHandler != null) try {\n\t\t\tPermit.invoke(POP_DIAGNOSTIC_HANDLER, log, diagnosticHandler);\n\t\t} catch (Exception e) {}\n\t\tdiagnosticHandler = null;\n\t}\n\t\n\tpublic void removeAllBetween(JavaFileObject sourcefile, int startPos, int endPos) {\n\t\tDiagnosticListener<?> listener = context.get(DiagnosticListener.class);\n\t\tif (listener instanceof CapturingDiagnosticListener) {\n\t\t\t((CapturingDiagnosticListener) listener).suppress(startPos, endPos);\n\t\t}\n\t\t\n\t\tField field = null;\n\t\tObject receiver = null;\n\t\tif (deferDiagnosticsField != null) try {\n\t\t\tif (Boolean.TRUE.equals(deferDiagnosticsField.get(log))) {\n\t\t\t\tfield = deferredDiagnosticsField;\n\t\t\t\treceiver = log;\n\t\t\t}\n\t\t} catch (Exception e) {}\n\t\t\n\t\tif (diagnosticHandlerField != null) try {\n\t\t\tObject handler = diagnosticHandlerField.get(log);\n\t\t\tfield = getDeferredField(handler);\n\t\t\treceiver = handler;\n\t\t} catch (Exception e) {}\n\t\t\n\t\tif (field == null || receiver == null) return;\n\t\t\n\t\ttry {\n\t\t\tCollection<?> deferredDiagnostics = (Collection<?>) field.get(receiver);\n\t\t\tif (deferredDiagnostics.isEmpty()) return;\n\t\t\tLinkedList<Object> newDeferredDiagnostics = new LinkedList<Object>();\n\t\t\tfor (Object diag_ : deferredDiagnostics) {\n\t\t\t\tif (!(diag_ instanceof JCDiagnostic)) {\n\t\t\t\t\tnewDeferredDiagnostics.add(diag_);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tJCDiagnostic diag = (JCDiagnostic) diag_;\n\t\t\t\tlong here = diag.getStartPosition();\n\t\t\t\tif (here >= startPos && here < endPos && diag.getSource() == sourcefile) {\n\t\t\t\t\t// We eliminate it\n\t\t\t\t} else {\n\t\t\t\t\tnewDeferredDiagnostics.add(diag);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfield.set(receiver, newDeferredDiagnostics);\n\t\t} catch (Exception e) {\n\t\t\t// We do not expect failure here; if failure does occur, the best course of action is to silently continue; the result will be that the error output of\n\t\t\t// javac will contain rather a lot of messages, but this is a lot better than just crashing during compilation!\n\t\t}\n\t}\n\t\n\tprivate static WriterField createWriterField(Writers w) {\n\t\t// jdk9\n\t\ttry {\n\t\t\tField writers = getDeclaredField(Log.class, \"writer\");\n\t\t\tif (writers != null) {\n\t\t\t\tClass<?> kindsClass = Class.forName(\"com.sun.tools.javac.util.Log$WriterKind\");\n\t\t\t\tfor (Object enumConstant : kindsClass.getEnumConstants()) {\n\t\t\t\t\tif (enumConstant.toString().equals(w.keyName)) {\n\t\t\t\t\t\treturn new Java9WriterField(writers, enumConstant);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn WriterField.NONE;\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t}\n\t\t\n\t\t// jdk8\n\t\tField writerField = getDeclaredField(Log.class, w.fieldName);\n\t\tif (writerField != null) return new Java8WriterField(writerField);\n\t\t\n\t\t// other jdk\n\t\treturn WriterField.NONE;\n\t}\n\t\n\tinterface WriterField {\n\t\tfinal PrintWriter NO_WRITER = new PrintWriter(new OutputStream() {\n\t\t\t@Override public void write(int b) throws IOException {\n\t\t\t\t// Do nothing on purpose\n\t\t\t}\n\t\t});\n\n\t\tfinal WriterField NONE = new WriterField() {\n\t\t\t@Override public void pauze(Log log) {\n\t\t\t\t// do nothing\n\t\t\t}\n\t\t\t@Override public void resume(Log log) {\n\t\t\t\t// no nothing\n\t\t\t}\n\t\t};\n\t\t\n\t\tvoid pauze(Log log);\n\t\tvoid resume(Log log);\n\t}\n\t\n\tstatic class Java8WriterField implements WriterField {\n\t\tprivate final Field field;\n\t\tprivate PrintWriter writer;\n\t\t\n\t\tpublic Java8WriterField(Field field) {\n\t\t\tthis.field = field;\n\t\t}\n\n\t\t@Override public void pauze(Log log) {\n\t\t\ttry {\n\t\t\t\twriter = (PrintWriter) field.get(log);\n\t\t\t\tfield.set(log, NO_WRITER);\n\t\t\t} catch (Exception e) {\n\t\t\t}\n\t\t}\n\n\t\t@Override public void resume(Log log) {\n\t\t\tif (writer != null) {\n\t\t\t\ttry {\n\t\t\t\t\tfield.set(log, writer);\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t}\n\t\t\t}\n\t\t\twriter = null;\n\t\t}\n\t}\n\t\n\t\n\tstatic class Java9WriterField implements WriterField {\n\t\tprivate final Field field;\n\t\tprivate final Object key;\n\t\tprivate PrintWriter writer;\n\t\t\n\t\tpublic Java9WriterField(Field field, Object key) {\n\t\t\tthis.field = field;\n\t\t\tthis.key = key;\n\t\t}\n\t\t\n\t\t@Override public void pauze(Log log) {\n\t\t\ttry {\n\t\t\t\t@SuppressWarnings(\"unchecked\") Map<Object,PrintWriter> map = (Map<Object,PrintWriter>)field.get(log);\n\t\t\t\twriter = map.get(key);\n\t\t\t\tmap.put(key, NO_WRITER);\n\t\t\t} catch (Exception e) {\n\t\t\t}\n\t\t}\n\t\t\n\t\t@Override public void resume(Log log) {\n\t\t\tif (writer != null) {\n\t\t\t\ttry {\n\t\t\t\t\t@SuppressWarnings(\"unchecked\") Map<Object,PrintWriter> map = (Map<Object,PrintWriter>)field.get(log);\n\t\t\t\t\tmap.put(key, writer);\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t}\n\t\t\t}\n\t\t\twriter = null;\n\t\t}\n\t}\n}"
  },
  {
    "path": "src/core/lombok/javac/FindTypeVarScanner.java",
    "content": "/*\n * Copyright (C) 2010 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac;\n\nimport java.util.HashSet;\nimport java.util.Set;\n\nimport javax.lang.model.element.Name;\nimport javax.lang.model.type.ArrayType;\nimport javax.lang.model.type.DeclaredType;\nimport javax.lang.model.type.ErrorType;\nimport javax.lang.model.type.ExecutableType;\nimport javax.lang.model.type.NoType;\nimport javax.lang.model.type.NullType;\nimport javax.lang.model.type.PrimitiveType;\nimport javax.lang.model.type.TypeMirror;\nimport javax.lang.model.type.TypeVariable;\nimport javax.lang.model.type.WildcardType;\nimport javax.lang.model.util.AbstractTypeVisitor6;\n\nimport com.sun.tools.javac.code.Type;\n\n/**\n * scanner (i.e. visits child nodes all the way to the leaves) that accumulates type variables. Call {@code visit} on any {@code TypeMirror} object with an instance\n * to add all used type variable names such as {@code T} or {@code E} to the set that is returned by the {@link #getTypeVariables} method.\n */\npublic class FindTypeVarScanner extends AbstractTypeVisitor6<Void, Void> {\n\tprivate Set<String> typeVariables = new HashSet<String>();\n\t\n\tpublic Set<String> getTypeVariables() {\n\t\treturn typeVariables;\n\t}\n\t\n\tprivate Void subVisit(TypeMirror mirror) {\n\t\tif (mirror == null) return null;\n\t\treturn mirror.accept(this, null);\n\t}\n\t\n\t@Override public Void visitPrimitive(PrimitiveType t, Void p) {\n\t\treturn null;\n\t}\n\t\n\t@Override public Void visitNull(NullType t, Void p) {\n\t\treturn null;\n\t}\n\t\n\t\n\t@Override public Void visitNoType(NoType t, Void p) {\n\t\treturn null;\n\t}\n\t\n\t@Override public Void visitUnknown(TypeMirror t, Void p) {\n\t\treturn null;\n\t}\n\t\n\t@Override public Void visitError(ErrorType t, Void p) {\n\t\treturn null;\n\t}\n\t\n\t@Override public Void visitArray(ArrayType t, Void p) {\n\t\treturn subVisit(t.getComponentType());\n\t}\n\t\n\t@Override public Void visitDeclared(DeclaredType t, Void p) {\n\t\tfor (TypeMirror subT : t.getTypeArguments()) subVisit(subT);\n\t\treturn null;\n\t}\n\t\n\t@Override public Void visitTypeVariable(TypeVariable t, Void p) {\n\t\tName name = null;\n\t\ttry {\n\t\t\tname = ((Type) t).tsym.name;\n\t\t} catch (NullPointerException e) {}\n\t\tif (name != null) typeVariables.add(name.toString());\n\t\tsubVisit(t.getLowerBound());\n\t\tsubVisit(t.getUpperBound());\n\t\treturn null;\n\t}\n\t\n\t@Override public Void visitWildcard(WildcardType t, Void p) {\n\t\tsubVisit(t.getSuperBound());\n\t\tsubVisit(t.getExtendsBound());\n\t\treturn null;\n\t}\n\t\n\t@Override public Void visitExecutable(ExecutableType t, Void p) {\n\t\tsubVisit(t.getReturnType());\n\t\tfor (TypeMirror subT : t.getParameterTypes()) subVisit(subT);\n\t\tfor (TypeMirror subT : t.getThrownTypes()) subVisit(subT);\n\t\tfor (TypeVariable subT : t.getTypeVariables()) subVisit(subT);\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/HandlerLibrary.java",
    "content": "/*\n * Copyright (C) 2009-2018 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac;\n\nimport static lombok.javac.JavacAugments.JCTree_handled;\n\nimport java.io.IOException;\nimport java.lang.annotation.Annotation;\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.SortedSet;\nimport java.util.TreeSet;\n\nimport javax.annotation.processing.Messager;\nimport javax.tools.Diagnostic;\n\nimport lombok.core.AlreadyHandledAnnotations;\nimport lombok.core.AnnotationValues.AnnotationValueDecodeFail;\nimport lombok.core.HandlerPriority;\nimport lombok.core.SpiLoadUtil;\nimport lombok.core.TypeLibrary;\nimport lombok.core.TypeResolver;\nimport lombok.core.configuration.ConfigurationKeysLoader;\nimport lombok.javac.handlers.JavacHandlerUtil;\n\nimport com.sun.source.util.Trees;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCCompilationUnit;\n\n/**\n * This class tracks 'handlers' and knows how to invoke them for any given AST node.\n * \n * This class can find the handlers (via SPI discovery) and will set up the given AST node, such as\n * building an AnnotationValues instance.\n */\npublic class HandlerLibrary {\n\tprivate final TypeLibrary typeLibrary = new TypeLibrary();\n\tprivate final Map<String, List<AnnotationHandlerContainer<?>>> annotationHandlers = new HashMap<String, List<AnnotationHandlerContainer<?>>>();\n\tprivate final Collection<VisitorContainer> visitorHandlers = new ArrayList<VisitorContainer>();\n\tprivate final Messager messager;\n\t\n\t/**\n\t * Creates a new HandlerLibrary that will report any problems or errors to the provided messager.\n\t * You probably want to use {@link #load(Messager, Trees)} instead.\n\t */\n\tpublic HandlerLibrary(Messager messager) {\n\t\tConfigurationKeysLoader.LoaderLoader.loadAllConfigurationKeys();\n\t\tthis.messager = messager;\n\t}\n\t\n\tprivate static class VisitorContainer {\n\t\tprivate final JavacASTVisitor visitor;\n\t\tprivate final long priority;\n\t\tprivate final boolean resolutionResetNeeded;\n\t\t\n\t\tVisitorContainer(JavacASTVisitor visitor) {\n\t\t\tthis.visitor = visitor;\n\t\t\tHandlerPriority hp = visitor.getClass().getAnnotation(HandlerPriority.class);\n\t\t\tthis.priority = hp == null ? 0L : (((long) hp.value()) << 32) + hp.subValue();\n\t\t\tthis.resolutionResetNeeded = visitor.getClass().isAnnotationPresent(ResolutionResetNeeded.class);\n\t\t}\n\t\t\n\t\tpublic long getPriority() {\n\t\t\treturn priority;\n\t\t}\n\t\t\n\t\tpublic boolean isResolutionResetNeeded() {\n\t\t\treturn resolutionResetNeeded;\n\t\t}\n\t}\n\t\n\tprivate static class AnnotationHandlerContainer<T extends Annotation> {\n\t\tprivate final JavacAnnotationHandler<T> handler;\n\t\tprivate final Class<T> annotationClass;\n\t\tprivate final long priority;\n\t\tprivate final boolean resolutionResetNeeded;\n\t\tprivate final boolean evenIfAlreadyHandled;\n\t\t\n\t\tAnnotationHandlerContainer(JavacAnnotationHandler<T> handler, Class<T> annotationClass) {\n\t\t\tthis.handler = handler;\n\t\t\tthis.annotationClass = annotationClass;\n\t\t\tHandlerPriority hp = handler.getClass().getAnnotation(HandlerPriority.class);\n\t\t\tthis.priority = hp == null ? 0L : (((long) hp.value()) << 32) + hp.subValue();\n\t\t\tthis.resolutionResetNeeded = handler.getClass().isAnnotationPresent(ResolutionResetNeeded.class);\n\t\t\tthis.evenIfAlreadyHandled = handler.getClass().isAnnotationPresent(AlreadyHandledAnnotations.class);\n\t\t}\n\t\t\n\t\tpublic void handle(final JavacNode node) {\n\t\t\thandler.handle(JavacHandlerUtil.createAnnotation(annotationClass, node), (JCAnnotation) node.get(), node);\n\t\t}\n\t\t\n\t\tpublic long getPriority() {\n\t\t\treturn priority;\n\t\t}\n\t\t\n\t\tpublic boolean isResolutionResetNeeded() {\n\t\t\treturn resolutionResetNeeded;\n\t\t}\n\t\t\n\t\tpublic boolean isEvenIfAlreadyHandled() {\n\t\t\treturn evenIfAlreadyHandled;\n\t\t}\n\t}\n\t\n\tprivate SortedSet<Long> priorities;\n\tprivate SortedSet<Long> prioritiesRequiringResolutionReset;\n\t\n\tpublic SortedSet<Long> getPriorities() {\n\t\treturn priorities;\n\t}\n\t\n\tpublic SortedSet<Long> getPrioritiesRequiringResolutionReset() {\n\t\treturn prioritiesRequiringResolutionReset;\n\t}\n\t\n\tprivate void calculatePriorities() {\n\t\tSortedSet<Long> set = new TreeSet<Long>();\n\t\tSortedSet<Long> resetNeeded = new TreeSet<Long>();\n\t\tfor (List<AnnotationHandlerContainer<?>> containers : annotationHandlers.values()) {\n\t\t\tfor (AnnotationHandlerContainer<?> container : containers) {\n\t\t\t\tset.add(container.getPriority());\n\t\t\t\tif (container.isResolutionResetNeeded()) resetNeeded.add(container.getPriority());\n\t\t\t}\n\t\t}\n\t\tfor (VisitorContainer container : visitorHandlers) {\n\t\t\tset.add(container.getPriority());\n\t\t\tif (container.isResolutionResetNeeded()) resetNeeded.add(container.getPriority());\n\t\t}\n\t\tthis.priorities = Collections.unmodifiableSortedSet(set);\n\t\tthis.prioritiesRequiringResolutionReset = Collections.unmodifiableSortedSet(resetNeeded);\n\t}\n\t\n\t/**\n\t * Creates a new HandlerLibrary that will report any problems or errors to the provided messager,\n\t * then uses SPI discovery to load all annotation and visitor based handlers so that future calls\n\t * to the handle methods will defer to these handlers.\n\t */\n\tpublic static HandlerLibrary load(Messager messager, Trees trees) {\n\t\tHandlerLibrary library = new HandlerLibrary(messager);\n\t\t\n\t\ttry {\n\t\t\tloadAnnotationHandlers(library, trees);\n\t\t\tloadVisitorHandlers(library, trees);\n\t\t} catch (IOException e) {\n\t\t\tSystem.err.println(\"Lombok isn't running due to misconfigured SPI files: \" + e);\n\t\t}\n\t\t\n\t\tlibrary.calculatePriorities();\n\t\t\n\t\treturn library;\n\t}\n\t\n\t/** Uses SPI Discovery to find implementations of {@link JavacAnnotationHandler}. */\n\t@SuppressWarnings({\"rawtypes\", \"unchecked\"})\n\tprivate static void loadAnnotationHandlers(HandlerLibrary lib, Trees trees) throws IOException {\n\t\t//No, that seemingly superfluous reference to JavacAnnotationHandler's classloader is not in fact superfluous!\n\t\tfor (JavacAnnotationHandler handler : SpiLoadUtil.findServices(JavacAnnotationHandler.class, JavacAnnotationHandler.class.getClassLoader())) {\n\t\t\thandler.setTrees(trees);\n\t\t\tClass<? extends Annotation> annotationClass = handler.getAnnotationHandledByThisHandler();\n\t\t\tAnnotationHandlerContainer<?> container = new AnnotationHandlerContainer(handler, annotationClass);\n\t\t\tString annotationClassName = container.annotationClass.getName().replace(\"$\", \".\");\n\t\t\tList<AnnotationHandlerContainer<?>> list = lib.annotationHandlers.get(annotationClassName);\n\t\t\tif (list == null) lib.annotationHandlers.put(annotationClassName, list = new ArrayList<AnnotationHandlerContainer<?>>(1));\n\t\t\tlist.add(container);\n\t\t\tlib.typeLibrary.addType(container.annotationClass.getName());\n\t\t}\n\t}\n\t\n\t/** Uses SPI Discovery to find implementations of {@link JavacASTVisitor}. */\n\tprivate static void loadVisitorHandlers(HandlerLibrary lib, Trees trees) throws IOException {\n\t\t//No, that seemingly superfluous reference to JavacASTVisitor's classloader is not in fact superfluous!\n\t\tfor (JavacASTVisitor visitor : SpiLoadUtil.findServices(JavacASTVisitor.class, JavacASTVisitor.class.getClassLoader())) {\n\t\t\tvisitor.setTrees(trees);\n\t\t\tlib.visitorHandlers.add(new VisitorContainer(visitor));\n\t\t}\n\t}\n\t\n\t/** Generates a warning in the Messager that was used to initialize this HandlerLibrary. */\n\tpublic void javacWarning(String message) {\n\t\tjavacWarning(message, null);\n\t}\n\t\n\t/** Generates a warning in the Messager that was used to initialize this HandlerLibrary. */\n\tpublic void javacWarning(String message, Throwable t) {\n\t\tmessager.printMessage(Diagnostic.Kind.WARNING, message + (t == null ? \"\" : (\": \" + t)));\n\t}\n\t\n\t/** Generates an error in the Messager that was used to initialize this HandlerLibrary. */\n\tpublic void javacError(String message) {\n\t\tjavacError(message, null);\n\t}\n\t\n\t/** Generates an error in the Messager that was used to initialize this HandlerLibrary. */\n\tpublic void javacError(String message, Throwable t) {\n\t\tmessager.printMessage(Diagnostic.Kind.ERROR, message + (t == null ? \"\" : (\": \" + t)));\n\t\tif (t != null) t.printStackTrace();\n\t}\n\t\n\tprivate boolean checkAndSetHandled(JCTree node) {\n\t\treturn !JCTree_handled.getAndSet(node, true);\n\t}\n\t\n\t/**\n\t * Handles the provided annotation node by first finding a qualifying instance of\n\t * {@link JavacAnnotationHandler} and if one exists, calling it with a freshly cooked up\n\t * instance of {@link lombok.core.AnnotationValues}.\n\t * \n\t * Note that depending on the printASTOnly flag, the {@link lombok.core.PrintAST} annotation\n\t * will either be silently skipped, or everything that isn't {@code PrintAST} will be skipped.\n\t * \n\t * The HandlerLibrary will attempt to guess if the given annotation node represents a lombok annotation.\n\t * For example, if {@code lombok.*} is in the import list, then this method will guess that\n\t * {@code Getter} refers to {@code lombok.Getter}, presuming that {@link lombok.javac.handlers.HandleGetter}\n\t * has been loaded.\n\t * \n\t * @param unit The Compilation Unit that contains the Annotation AST Node.\n\t * @param node The Lombok AST Node representing the Annotation AST Node.\n\t * @param annotation 'node.get()' - convenience parameter.\n\t */\n\tpublic void handleAnnotation(JCCompilationUnit unit, JavacNode node, JCAnnotation annotation, long priority) {\n\t\tTypeResolver resolver = new TypeResolver(node.getImportList());\n\t\tString rawType = annotation.annotationType.toString();\n\t\tString fqn = resolver.typeRefToFullyQualifiedName(node, typeLibrary, rawType);\n\t\tif (fqn == null) return;\n\t\tList<AnnotationHandlerContainer<?>> containers = annotationHandlers.get(fqn);\n\t\tif (containers == null) return;\n\t\t\n\t\tfor (AnnotationHandlerContainer<?> container : containers) {\n\t\t\ttry {\n\t\t\t\tif (container.getPriority() == priority) {\n\t\t\t\t\tif (checkAndSetHandled(annotation)) {\n\t\t\t\t\t\tcontainer.handle(node);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (container.isEvenIfAlreadyHandled()) container.handle(node);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (AnnotationValueDecodeFail fail) {\n\t\t\t\tfail.owner.setError(fail.getMessage(), fail.idx);\n\t\t\t} catch (Throwable t) {\n\t\t\t\tString sourceName = \"(unknown).java\";\n\t\t\t\tif (unit != null && unit.sourcefile != null) sourceName = unit.sourcefile.getName();\n\t\t\t\tjavacError(String.format(\"Lombok annotation handler %s failed on \" + sourceName, container.handler.getClass()), t);\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/**\n\t * Will call all registered {@link JavacASTVisitor} instances.\n\t */\n\tpublic void callASTVisitors(JavacAST ast, long priority) {\n\t\tfor (VisitorContainer container : visitorHandlers) try {\n\t\t\tif (container.getPriority() == priority) ast.traverse(container.visitor);\n\t\t} catch (Throwable t) {\n\t\t\tjavacError(String.format(\"Lombok visitor handler %s failed\", container.visitor.getClass()), t);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/Javac6BasedLombokOptions.java",
    "content": "/*\n * Copyright (C) 2013 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac;\n\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\n\nimport lombok.Lombok;\nimport lombok.permit.Permit;\n\nimport com.sun.tools.javac.util.Context;\nimport com.sun.tools.javac.util.Options;\n\npublic class Javac6BasedLombokOptions extends LombokOptions {\n\tprivate static final Method optionName_valueOf;\n\tprivate static final Method options_put;\n\t\n\tstatic {\n\t\ttry {\n\t\t\tClass<?> optionNameClass = Class.forName(\"com.sun.tools.javac.main.OptionName\");\n\t\t\toptionName_valueOf = Permit.getMethod(optionNameClass, \"valueOf\", String.class);\n\t\t\toptions_put = Permit.getMethod(Class.forName(\"com.sun.tools.javac.util.Options\"), \"put\", optionNameClass, String.class);\n\t\t} catch (Exception e) {\n\t\t\tthrow new IllegalArgumentException(\"Can't initialize Javac6-based lombok options due to reflection issue.\", e);\n\t\t}\n\t}\n\t\n\tpublic static Javac6BasedLombokOptions replaceWithDelombokOptions(Context context) {\n\t\tOptions options = Options.instance(context);\n\t\tcontext.put(optionsKey, (Options)null);\n\t\tJavac6BasedLombokOptions result = new Javac6BasedLombokOptions(context);\n\t\tresult.putAll(options);\n\t\treturn result;\n\t}\n\t\n\tprivate Javac6BasedLombokOptions(Context context) {\n\t\tsuper(context);\n\t}\n\t\n\t@Override public void putJavacOption(String optionName, String value) {\n\t\ttry {\n\t\t\tPermit.invoke(options_put, this, Permit.invoke(optionName_valueOf, null, optionName), value);\n\t\t} catch (IllegalAccessException e) {\n\t\t\tthrow new IllegalArgumentException(\"Can't initialize Javac6-based lombok options due to reflection issue.\", e);\n\t\t} catch (InvocationTargetException e) {\n\t\t\tthrow Lombok.sneakyThrow(e.getCause());\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/Javac8BasedLombokOptions.java",
    "content": "/*\n * Copyright (C) 2013-2017 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac;\n\nimport com.sun.tools.javac.main.Option;\nimport com.sun.tools.javac.util.Context;\nimport com.sun.tools.javac.util.Options;\n\npublic class Javac8BasedLombokOptions extends LombokOptions {\n\tpublic static Javac8BasedLombokOptions replaceWithDelombokOptions(Context context) {\n\t\tOptions options = Options.instance(context);\n\t\tcontext.put(optionsKey, (Options) null);\n\t\tJavac8BasedLombokOptions result = new Javac8BasedLombokOptions(context);\n\t\tresult.putAll(options);\n\t\treturn result;\n\t}\n\t\n\tprivate Javac8BasedLombokOptions(Context context) {\n\t\tsuper(context);\n\t}\n\t\n\t@Override public void putJavacOption(String optionName, String value) {\n\t\tString optionText = Option.valueOf(optionName).text;\n\t\tput(optionText, value);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/Javac9BasedLombokOptions.java",
    "content": "/*\n * Copyright (C) 2017 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac;\n\nimport com.sun.tools.javac.main.Option;\nimport com.sun.tools.javac.util.Context;\nimport com.sun.tools.javac.util.Options;\n\npublic class Javac9BasedLombokOptions extends LombokOptions {\n\tpublic static Javac9BasedLombokOptions replaceWithDelombokOptions(Context context) {\n\t\tOptions options = Options.instance(context);\n\t\tcontext.put(optionsKey, (Options) null);\n\t\tJavac9BasedLombokOptions result = new Javac9BasedLombokOptions(context);\n\t\tresult.putAll(options);\n\t\treturn result;\n\t}\n\t\n\tprivate Javac9BasedLombokOptions(Context context) {\n\t\tsuper(context);\n\t}\n\t\n\t@Override public void putJavacOption(String optionName, String value) {\n\t\tif (optionName.equals(\"CLASSPATH\")) optionName = \"CLASS_PATH\";\n\t\tif (optionName.equals(\"SOURCEPATH\")) optionName = \"SOURCE_PATH\";\n\t\tif (optionName.equals(\"BOOTCLASSPATH\")) optionName = \"BOOT_CLASS_PATH\";\n\t\tString optionText = Option.valueOf(optionName).primaryName;\n\t\tput(optionText, value);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/JavacAST.java",
    "content": "/*\n * Copyright (C) 2009-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac;\n\nimport java.io.File;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.Method;\nimport java.net.URI;\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.ConcurrentMap;\n\nimport javax.annotation.processing.Messager;\nimport javax.tools.Diagnostic;\nimport javax.tools.JavaFileObject;\n\nimport lombok.core.AST;\nimport lombok.core.CleanupRegistry;\nimport lombok.core.CleanupTask;\nimport lombok.permit.Permit;\n\nimport com.sun.tools.javac.code.Lint.LintCategory;\nimport com.sun.tools.javac.code.Source;\nimport com.sun.tools.javac.code.Symtab;\nimport com.sun.tools.javac.model.JavacElements;\nimport com.sun.tools.javac.model.JavacTypes;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCArrayTypeTree;\nimport com.sun.tools.javac.tree.JCTree.JCBlock;\nimport com.sun.tools.javac.tree.JCTree.JCCatch;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCCompilationUnit;\nimport com.sun.tools.javac.tree.JCTree.JCEnhancedForLoop;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCFieldAccess;\nimport com.sun.tools.javac.tree.JCTree.JCIdent;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCStatement;\nimport com.sun.tools.javac.tree.JCTree.JCTry;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.tree.JCTree.JCWildcard;\nimport com.sun.tools.javac.tree.TreeMaker;\nimport com.sun.tools.javac.util.Context;\nimport com.sun.tools.javac.util.JCDiagnostic;\nimport com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;\nimport com.sun.tools.javac.util.Log;\nimport com.sun.tools.javac.util.Name;\nimport com.sun.tools.javac.util.Position;\n\n/**\n * Wraps around javac's internal AST view to add useful features as well as the ability to visit parents from children,\n * something javac's own AST system does not offer.\n */\npublic class JavacAST extends AST<JavacAST, JavacNode, JCTree> {\n\tprivate final CleanupRegistry cleanup;\n\tprivate final JavacElements elements;\n\tprivate final JavacTreeMaker treeMaker;\n\tprivate final Symtab symtab;\n\tprivate final JavacTypes javacTypes;\n\tprivate final ErrorLog errorLogger;\n\tprivate final Context context;\n\tprivate static final URI NOT_CALCULATED_MARKER = URI.create(\"https://projectlombok.org/not/calculated\");\n\tprivate URI memoizedAbsoluteFileLocation = NOT_CALCULATED_MARKER;\n\t\n\t/**\n\t * Creates a new JavacAST of the provided Compilation Unit.\n\t * \n\t * @param errorLog A logger for warning and error reporting.\n\t * @param context A Context object for interfacing with the compiler.\n\t * @param top The compilation unit, which serves as the top level node in the tree to be built.\n\t * @param cleanup The registry for cleanup tasks.\n\t */\n\tpublic JavacAST(ErrorLog errorLog, Context context, JCCompilationUnit top, CleanupRegistry cleanup) {\n\t\tsuper(sourceName(top), PackageName.getPackageName(top), new JavacImportList(top), statementTypes());\n\t\tsetTop(buildCompilationUnit(top));\n\t\tthis.context = context;\n\t\tthis.errorLogger = errorLog;\n\t\tthis.elements = JavacElements.instance(context);\n\t\tthis.treeMaker = new JavacTreeMaker(TreeMaker.instance(context));\n\t\tthis.symtab = Symtab.instance(context);\n\t\tthis.javacTypes = JavacTypes.instance(context);\n\t\tthis.cleanup = cleanup;\n\t\tclearChanged();\n\t}\n\t\n\t@Override public URI getAbsoluteFileLocation() {\n\t\tif (memoizedAbsoluteFileLocation == NOT_CALCULATED_MARKER) {\n\t\t\tmemoizedAbsoluteFileLocation = getAbsoluteFileLocation((JCCompilationUnit) top().get());\n\t\t}\n\t\treturn memoizedAbsoluteFileLocation;\n\t}\n\t\n\tprivate static Class<?> wrappedFileObjectClass, sbtJavaFileObjectClass, sbtMappedVirtualFileClass, sbtOptionClass;\n\tprivate static Field wrappedFileObjectField, sbtJavaFileObjectField, sbtMappedVirtualFilePathField, sbtMappedVirtualFileRootsField, sbtOptionField;\n\tprivate static Method sbtMapGetMethod;\n\t\n\tpublic static URI getAbsoluteFileLocation(JCCompilationUnit cu) {\n\t\ttry {\n\t\t\tURI uri = cu.sourcefile.toUri();\n\t\t\tString fn = uri.toString();\n\t\t\tif (fn.startsWith(\"file:\")) return uri;\n\t\t\tURI sbtUri = tryGetSbtFile(cu.sourcefile);\n\t\t\tif (sbtUri != null) return sbtUri;\n\t\t\treturn uri;\n\t\t} catch (Exception e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tprivate static URI tryGetSbtFile(JavaFileObject sourcefile) {\n\t\ttry {\n\t\t\treturn tryGetSbtFile_(sourcefile);\n\t\t} catch (Exception e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tprivate static URI tryGetSbtFile_(JavaFileObject sourcefile) throws Exception {\n\t\tClass<?> c = sourcefile.getClass();\n\t\tString cn;\n\t\t\n\t\tif (wrappedFileObjectClass == null) {\n\t\t\tif (!c.getName().equals(\"com.sun.tools.javac.api.ClientCodeWrapper$WrappedJavaFileObject\")) return null;\n\t\t\twrappedFileObjectClass = c;\n\t\t}\n\t\tif (c != wrappedFileObjectClass) return null;\n\t\t\n\t\tif (wrappedFileObjectField == null) wrappedFileObjectField = Permit.permissiveGetField(wrappedFileObjectClass.getSuperclass(), \"clientFileObject\");\n\t\tif (wrappedFileObjectField == null) return null;\n\t\tObject fileObject = wrappedFileObjectField.get(sourcefile);\n\t\tc = fileObject.getClass();\n\t\t\n\t\tif (sbtJavaFileObjectClass == null) {\n\t\t\tcn = c.getName();\n\t\t\tif (!cn.startsWith(\"sbt.\") || !cn.endsWith(\"JavaFileObject\")) return null;\n\t\t\tsbtJavaFileObjectClass = c;\n\t\t}\n\t\tif (sbtJavaFileObjectClass != c) return null;\n\t\tif (sbtJavaFileObjectField == null) sbtJavaFileObjectField = Permit.permissiveGetField(sbtJavaFileObjectClass, \"underlying\");\n\t\tif (sbtJavaFileObjectField == null) return null;\n\t\t\n\t\tObject mappedVirtualFile = sbtJavaFileObjectField.get(fileObject);\n\t\tc = mappedVirtualFile.getClass();\n\t\t\n\t\tif (sbtMappedVirtualFileClass == null) {\n\t\t\tcn = c.getName();\n\t\t\tif (!cn.startsWith(\"sbt.\") || !cn.endsWith(\"MappedVirtualFile\")) return null;\n\t\t\tsbtMappedVirtualFileClass = c;\n\t\t}\n\t\tif (sbtMappedVirtualFilePathField == null) sbtMappedVirtualFilePathField = Permit.permissiveGetField(sbtMappedVirtualFileClass, \"encodedPath\");\n\t\tif (sbtMappedVirtualFilePathField == null) return null;\n\t\tif (sbtMappedVirtualFileRootsField == null) sbtMappedVirtualFileRootsField = Permit.permissiveGetField(sbtMappedVirtualFileClass, \"rootPathsMap\");\n\t\tif (sbtMappedVirtualFileRootsField == null) return null;\n\t\t\n\t\tString encodedPath = (String) sbtMappedVirtualFilePathField.get(mappedVirtualFile);\n\t\tif (!encodedPath.startsWith(\"${\")) {\n\t\t\tFile maybeAbsoluteFile = new File(encodedPath);\n\t\t\tif (maybeAbsoluteFile.exists()) {\n\t\t\t\treturn maybeAbsoluteFile.toURI();\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\tint idx = encodedPath.indexOf('}');\n\t\tif (idx == -1) return null;\n\t\tString base = encodedPath.substring(2, idx);\n\t\tObject roots = sbtMappedVirtualFileRootsField.get(mappedVirtualFile);\n\t\tif (sbtMapGetMethod == null) sbtMapGetMethod = Permit.getMethod(roots.getClass(), \"get\", Object.class);\n\t\tif (sbtMapGetMethod == null) return null;\n\t\t\n\t\tObject option = sbtMapGetMethod.invoke(roots, base);\n\t\tc = option.getClass();\n\t\tif (sbtOptionClass == null) {\n\t\t\tif (c.getName().equals(\"scala.Some\")) sbtOptionClass = c;\n\t\t}\n\t\tif (c != sbtOptionClass) return null;\n\t\tif (sbtOptionField == null) sbtOptionField = Permit.permissiveGetField(sbtOptionClass, \"value\");\n\t\tif (sbtOptionField == null) return null;\n\t\t\n\t\tObject path = sbtOptionField.get(option);\n\t\treturn new File(path.toString() + encodedPath.substring(idx + 1)).toURI();\n\t}\n\t\n\tprivate static String sourceName(JCCompilationUnit cu) {\n\t\treturn cu.sourcefile == null ? null : cu.sourcefile.toString();\n\t}\n\t\n\tpublic Context getContext() {\n\t\treturn context;\n\t}\n\t\n\t/**\n\t * Runs through the entire AST, starting at the compilation unit, calling the provided visitor's visit methods\n\t * for each node, depth first.\n\t */\n\tpublic void traverse(JavacASTVisitor visitor) {\n\t\ttop().traverse(visitor);\n\t}\n\t\n\tvoid traverseChildren(JavacASTVisitor visitor, JavacNode node) {\n\t\tfor (JavacNode child : node.down()) child.traverse(visitor);\n\t}\n\t\n\t@Override public int getSourceVersion() {\n\t\ttry {\n\t\t\tString nm = Source.instance(context).name();\n\t\t\tint underscoreIdx = nm.indexOf('_');\n\t\t\tif (underscoreIdx > -1) return Integer.parseInt(nm.substring(underscoreIdx + 1));\n\t\t\t// assume java9+\n\t\t\treturn Integer.parseInt(nm.substring(3));\n\t\t} catch (Exception ignore) {}\n\t\treturn 6;\n\t}\n\t\n\t@Override public int getLatestJavaSpecSupported() {\n\t\treturn Javac.getJavaCompilerVersion();\n\t}\n\t\n\tpublic void cleanupTask(String key, JCTree target, CleanupTask task) {\n\t\tcleanup.registerTask(key, target, task);\n\t}\n\t\n\t/** @return A Name object generated for the proper name table belonging to this AST. */\n\tpublic Name toName(String name) {\n\t\treturn elements.getName(name);\n\t}\n\t\n\t/** @return A TreeMaker instance that you can use to create new AST nodes. */\n\tpublic JavacTreeMaker getTreeMaker() {\n\t\ttreeMaker.at(-1);\n\t\treturn treeMaker;\n\t}\n\t\n\t/** @return The symbol table used by this AST for symbols. */\n\tpublic Symtab getSymbolTable() {\n\t\treturn symtab;\n\t}\n\t\n\t/**\n\t * @return The implementation of {@link javax.lang.model.util.Types} of javac. Contains a few extra methods beyond\n\t * the ones listed in the official annotation API interface. */\n\tpublic JavacTypes getTypesUtil() {\n\t\treturn javacTypes;\n\t}\n\t\n\t/** {@inheritDoc} */\n\t@Override protected JavacNode buildTree(JCTree node, Kind kind) {\n\t\tswitch (kind) {\n\t\tcase COMPILATION_UNIT:\n\t\t\treturn buildCompilationUnit((JCCompilationUnit) node);\n\t\tcase TYPE:\n\t\t\treturn buildType((JCClassDecl) node);\n\t\tcase FIELD:\n\t\t\treturn buildField((JCVariableDecl) node);\n\t\tcase INITIALIZER:\n\t\t\treturn buildInitializer((JCBlock) node);\n\t\tcase METHOD:\n\t\t\treturn buildMethod((JCMethodDecl) node);\n\t\tcase ARGUMENT:\n\t\t\treturn buildLocalVar((JCVariableDecl) node, kind);\n\t\tcase LOCAL:\n\t\t\treturn buildLocalVar((JCVariableDecl) node, kind);\n\t\tcase STATEMENT:\n\t\t\treturn buildStatementOrExpression(node);\n\t\tcase ANNOTATION:\n\t\t\treturn buildAnnotation((JCAnnotation) node, false);\n\t\tcase TYPE_USE:\n\t\t\treturn buildTypeUse(node);\n\t\tdefault:\n\t\t\tthrow new AssertionError(\"Did not expect: \" + kind);\n\t\t}\n\t}\n\t\n\tprivate JavacNode buildCompilationUnit(JCCompilationUnit top) {\n\t\tList<JavacNode> childNodes = new ArrayList<JavacNode>();\n\t\tfor (JCTree s : top.defs) {\n\t\t\tif (s instanceof JCClassDecl) {\n\t\t\t\taddIfNotNull(childNodes, buildType((JCClassDecl) s));\n\t\t\t} // else they are import statements, which we don't care about. Or Skip objects, whatever those are.\n\t\t}\n\t\t\n\t\treturn new JavacNode(this, top, childNodes, Kind.COMPILATION_UNIT);\n\t}\n\t\n\tprivate JavacNode buildType(JCClassDecl type) {\n\t\tif (setAndGetAsHandled(type)) return null;\n\t\tList<JavacNode> childNodes = new ArrayList<JavacNode>();\n\t\t\n\t\tfor (JCAnnotation annotation : type.mods.annotations) addIfNotNull(childNodes, buildAnnotation(annotation, false));\n\t\tfor (JCTree def : type.defs) {\n\t\t\t/* A def can be:\n\t\t\t *   JCClassDecl for inner types\n\t\t\t *   JCMethodDecl for constructors and methods\n\t\t\t *   JCVariableDecl for fields\n\t\t\t *   JCBlock for (static) initializers\n\t\t\t */\n\t\t\tif (def instanceof JCMethodDecl) addIfNotNull(childNodes, buildMethod((JCMethodDecl) def));\n\t\t\telse if (def instanceof JCClassDecl) addIfNotNull(childNodes, buildType((JCClassDecl) def));\n\t\t\telse if (def instanceof JCVariableDecl) addIfNotNull(childNodes, buildField((JCVariableDecl) def));\n\t\t\telse if (def instanceof JCBlock) addIfNotNull(childNodes, buildInitializer((JCBlock) def));\n\t\t}\n\t\t\n\t\treturn putInMap(new JavacNode(this, type, childNodes, Kind.TYPE));\n\t}\n\t\n\tprivate JavacNode buildField(JCVariableDecl field) {\n\t\tif (setAndGetAsHandled(field)) return null;\n\t\tList<JavacNode> childNodes = new ArrayList<JavacNode>();\n\t\tfor (JCAnnotation annotation : field.mods.annotations) addIfNotNull(childNodes, buildAnnotation(annotation, true));\n\t\taddIfNotNull(childNodes, buildTypeUse(field.vartype));\n\t\taddIfNotNull(childNodes, buildExpression(field.init));\n\t\treturn putInMap(new JavacNode(this, field, childNodes, Kind.FIELD));\n\t}\n\t\n\tprivate JavacNode buildLocalVar(JCVariableDecl local, Kind kind) {\n\t\tif (setAndGetAsHandled(local)) return null;\n\t\tList<JavacNode> childNodes = new ArrayList<JavacNode>();\n\t\tfor (JCAnnotation annotation : local.mods.annotations) addIfNotNull(childNodes, buildAnnotation(annotation, true));\n\t\taddIfNotNull(childNodes, buildTypeUse(local.vartype));\n\t\taddIfNotNull(childNodes, buildExpression(local.init));\n\t\treturn putInMap(new JavacNode(this, local, childNodes, kind));\n\t}\n\t\n\tprivate JavacNode buildTypeUse(JCTree typeUse) {\n\t\tif (setAndGetAsHandled(typeUse)) return null;\n\t\t\n\t\tif (typeUse == null) return null;\n\t\t\n\t\tif (typeUse.getClass().getName().equals(\"com.sun.tools.javac.tree.JCTree$JCAnnotatedType\")) {\n\t\t\tinitJcAnnotatedType(typeUse.getClass());\n\t\t\tCollection<?> anns = Permit.permissiveReadField(Collection.class, JCANNOTATEDTYPE_ANNOTATIONS, typeUse);\n\t\t\tJCExpression underlying = Permit.permissiveReadField(JCExpression.class, JCANNOTATEDTYPE_UNDERLYINGTYPE, typeUse);\n\t\t\t\n\t\t\tList<JavacNode> childNodes = new ArrayList<JavacNode>();\n\t\t\tif (anns != null) for (Object annotation : anns) if (annotation instanceof JCAnnotation) addIfNotNull(childNodes, buildAnnotation((JCAnnotation) annotation, true));\n\t\t\taddIfNotNull(childNodes, buildTypeUse(underlying));\n\t\t\treturn putInMap(new JavacNode(this, typeUse, childNodes, Kind.TYPE_USE));\n\t\t}\n\t\t\n\t\tif (typeUse instanceof JCWildcard) {\n\t\t\tJCTree inner = ((JCWildcard) typeUse).inner;\n\t\t\tList<JavacNode> childNodes = inner == null ? Collections.<JavacNode>emptyList() : new ArrayList<JavacNode>();\n\t\t\tif (inner != null) addIfNotNull(childNodes, buildTypeUse(inner));\n\t\t\treturn putInMap(new JavacNode(this, typeUse, childNodes, Kind.TYPE_USE));\n\t\t}\n\t\t\n\t\tif (typeUse instanceof JCArrayTypeTree) {\n\t\t\tJCTree inner = ((JCArrayTypeTree) typeUse).elemtype;\n\t\t\tList<JavacNode> childNodes = inner == null ? Collections.<JavacNode>emptyList() : new ArrayList<JavacNode>();\n\t\t\tif (inner != null) addIfNotNull(childNodes, buildTypeUse(inner));\n\t\t\treturn putInMap(new JavacNode(this, typeUse, childNodes, Kind.TYPE_USE));\n\t\t}\n\t\t\n\t\tif (typeUse instanceof JCFieldAccess) {\n\t\t\tJCTree inner = ((JCFieldAccess) typeUse).selected;\n\t\t\tList<JavacNode> childNodes = inner == null ? Collections.<JavacNode>emptyList() : new ArrayList<JavacNode>();\n\t\t\tif (inner != null) addIfNotNull(childNodes, buildTypeUse(inner));\n\t\t\treturn putInMap(new JavacNode(this, typeUse, childNodes, Kind.TYPE_USE));\n\t\t}\n\t\t\n\t\tif (typeUse instanceof JCIdent) {\n\t\t\treturn putInMap(new JavacNode(this, typeUse, Collections.<JavacNode>emptyList(), Kind.TYPE_USE));\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\t\n\tprivate static boolean JCTRY_RESOURCES_FIELD_INITIALIZED = false;\n\tprivate static Field JCTRY_RESOURCES_FIELD;\n\t\n\t@SuppressWarnings(\"unchecked\")\n\tprivate static List<JCTree> getResourcesForTryNode(JCTry tryNode) {\n\t\tif (!JCTRY_RESOURCES_FIELD_INITIALIZED) {\n\t\t\tJCTRY_RESOURCES_FIELD = Permit.permissiveGetField(JCTry.class, \"resources\");\n\t\t\tJCTRY_RESOURCES_FIELD_INITIALIZED = true;\n\t\t}\n\t\t\n\t\tif (JCTRY_RESOURCES_FIELD == null) return Collections.emptyList();\n\t\tObject rv = null;\n\t\ttry {\n\t\t\trv = JCTRY_RESOURCES_FIELD.get(tryNode);\n\t\t} catch (Exception ignore) {}\n\t\t\n\t\tif (rv instanceof List) return (List<JCTree>) rv;\n\t\treturn Collections.emptyList();\n\t}\n\t\n\tprivate static boolean JCANNOTATEDTYPE_FIELDS_INITIALIZED = false;\n\tprivate static Field JCANNOTATEDTYPE_ANNOTATIONS, JCANNOTATEDTYPE_UNDERLYINGTYPE;\n\tprivate static void initJcAnnotatedType(Class<?> context) {\n\t\tif (JCANNOTATEDTYPE_FIELDS_INITIALIZED) return;\n\t\tJCANNOTATEDTYPE_ANNOTATIONS = Permit.permissiveGetField(context, \"annotations\");\n\t\tJCANNOTATEDTYPE_UNDERLYINGTYPE = Permit.permissiveGetField(context, \"underlyingType\");\n\t\tJCANNOTATEDTYPE_FIELDS_INITIALIZED = true;\n\t}\n\t\n\tprivate static Field JCENHANCEDFORLOOP_VARORRECORDPATTERN_FIELD = Permit.permissiveGetField(JCEnhancedForLoop.class, \"varOrRecordPattern\");\n\tprivate static JCTree getVarOrRecordPattern(JCEnhancedForLoop loop) {\n\t\tif (JCENHANCEDFORLOOP_VARORRECORDPATTERN_FIELD == null) {\n\t\t\treturn loop.var;\n\t\t}\n\t\ttry {\n\t\t\treturn (JCTree) JCENHANCEDFORLOOP_VARORRECORDPATTERN_FIELD.get(loop);\n\t\t} catch (Exception ignore) {}\n\t\treturn null;\n\t}\n\t\n\tprivate JavacNode buildTry(JCTry tryNode) {\n\t\tif (setAndGetAsHandled(tryNode)) return null;\n\t\tList<JavacNode> childNodes = new ArrayList<JavacNode>();\n\t\tfor (JCTree varDecl : getResourcesForTryNode(tryNode)) {\n\t\t\tif (varDecl instanceof JCVariableDecl) {\n\t\t\t\taddIfNotNull(childNodes, buildLocalVar((JCVariableDecl) varDecl, Kind.LOCAL));\n\t\t\t}\n\t\t}\n\t\taddIfNotNull(childNodes, buildStatement(tryNode.body));\n\t\tfor (JCCatch jcc : tryNode.catchers) addIfNotNull(childNodes, buildTree(jcc, Kind.STATEMENT));\n\t\taddIfNotNull(childNodes, buildStatement(tryNode.finalizer));\n\t\treturn putInMap(new JavacNode(this, tryNode, childNodes, Kind.STATEMENT));\n\t}\n\t\n\tprivate JavacNode buildInitializer(JCBlock initializer) {\n\t\tif (setAndGetAsHandled(initializer)) return null;\n\t\tList<JavacNode> childNodes = new ArrayList<JavacNode>();\n\t\tfor (JCStatement statement: initializer.stats) addIfNotNull(childNodes, buildStatement(statement));\n\t\treturn putInMap(new JavacNode(this, initializer, childNodes, Kind.INITIALIZER));\n\t}\n\t\n\tprivate JavacNode buildMethod(JCMethodDecl method) {\n\t\tif (setAndGetAsHandled(method)) return null;\n\t\tList<JavacNode> childNodes = new ArrayList<JavacNode>();\n\t\tfor (JCAnnotation annotation : method.mods.annotations) addIfNotNull(childNodes, buildAnnotation(annotation, false));\n\t\tfor (JCVariableDecl param : method.params) addIfNotNull(childNodes, buildLocalVar(param, Kind.ARGUMENT));\n\t\tif (method.body != null && method.body.stats != null) {\n\t\t\tfor (JCStatement statement : method.body.stats) addIfNotNull(childNodes, buildStatement(statement));\n\t\t}\n\t\treturn putInMap(new JavacNode(this, method, childNodes, Kind.METHOD));\n\t}\n\t\n\tprivate JavacNode buildAnnotation(JCAnnotation annotation, boolean varDecl) {\n\t\tboolean handled = setAndGetAsHandled(annotation);\n\t\tif (!varDecl && handled) {\n\t\t\t// @Foo int x, y; is handled in javac by putting the same annotation node on 2 JCVariableDecls.\n\t\t\treturn null;\n\t\t}\n\t\treturn putInMap(new JavacNode(this, annotation, null, Kind.ANNOTATION));\n\t}\n\t\n\tprivate JavacNode buildExpression(JCExpression expression) {\n\t\treturn buildStatementOrExpression(expression);\n\t}\n\t\n\tprivate JavacNode buildStatement(JCStatement statement) {\n\t\treturn buildStatementOrExpression(statement);\n\t}\n\t\n\tprivate JavacNode buildStatementOrExpression(JCTree statement) {\n\t\tif (statement == null) return null;\n\t\tif (statement instanceof JCAnnotation) return null;\n\t\tif (statement instanceof JCClassDecl) return buildType((JCClassDecl) statement);\n\t\tif (statement instanceof JCVariableDecl) return buildLocalVar((JCVariableDecl) statement, Kind.LOCAL);\n\t\tif (statement instanceof JCTry) return buildTry((JCTry) statement);\n\t\tif (statement.getClass().getName().equals(\"com.sun.tools.javac.tree.JCTree$JCLambda\")) return buildLambda(statement);\n\t\tif (statement instanceof JCEnhancedForLoop) return buildEnhancedForLoop((JCEnhancedForLoop) statement);\n\t\tif (setAndGetAsHandled(statement)) return null;\n\t\t\n\t\treturn drill(statement);\n\t}\n\t\n\tprivate JavacNode buildLambda(JCTree jcTree) {\n\t\treturn buildStatementOrExpression(getBody(jcTree));\n\t}\n\t\n\tprivate JCTree getBody(JCTree jcTree) {\n\t\treturn (JCTree) Permit.invokeSneaky(getBodyMethod(jcTree.getClass()), jcTree);\n\t}\n\t\n\tprivate final static ConcurrentMap<Class<?>, Method> getBodyMethods = new ConcurrentHashMap<Class<?>, Method>();\n\t\n\tprivate Method getBodyMethod(Class<?> c) {\n\t\tMethod m = getBodyMethods.get(c);\n\t\tif (m != null) {\n\t\t\treturn m;\n\t\t}\n\t\ttry {\n\t\t\tm = Permit.getMethod(c, \"getBody\");\n\t\t} catch (NoSuchMethodException e) {\n\t\t\tthrow Javac.sneakyThrow(e);\n\t\t}\n\t\tgetBodyMethods.putIfAbsent(c, m);\n\t\treturn getBodyMethods.get(c);\n\t}\n\t\n\tprivate JavacNode buildEnhancedForLoop(JCEnhancedForLoop loop) {\n\t\tif (setAndGetAsHandled(loop)) return null;\n\t\t\n\t\tList<JavacNode> childNodes = new ArrayList<JavacNode>();\n\t\t// The order of the child elements is important and must be kept\n\t\taddIfNotNull(childNodes, buildTree(getVarOrRecordPattern(loop), Kind.STATEMENT));\n\t\taddIfNotNull(childNodes, buildTree(loop.expr, Kind.STATEMENT));\n\t\taddIfNotNull(childNodes, buildStatement(loop.body));\n\t\t\n\t\treturn putInMap(new JavacNode(this, loop, childNodes, Kind.STATEMENT));\n\t}\n\t\n\tprivate JavacNode drill(JCTree statement) {\n\t\ttry {\n\t\t\tList<JavacNode> childNodes = new ArrayList<JavacNode>();\n\t\t\tfor (FieldAccess fa : fieldsOf(statement.getClass())) childNodes.addAll(buildWithField(JavacNode.class, statement, fa));\n\t\t\treturn putInMap(new JavacNode(this, statement, childNodes, Kind.STATEMENT));\n\t\t} catch (OutOfMemoryError oome) {\n\t\t\tString msg = oome.getMessage();\n\t\t\tif (msg == null) msg = \"(no original message)\";\n\t\t\tOutOfMemoryError newError = new OutOfMemoryError(getFileName() + \"@pos\" + statement.getPreferredPosition() + \": \" + msg);\n\t\t\t// We could try to set the stack trace of the new exception to the same one as the old exception, but this costs memory,\n\t\t\t// and we're already in an extremely fragile situation in regards to remaining heap space, so let's not do that.\n\t\t\tthrow newError;\n\t\t}\n\t}\n\t\n\t/* For javac, both JCExpression and JCStatement are considered as valid children types. */\n\tprivate static Collection<Class<? extends JCTree>> statementTypes() {\n\t\tCollection<Class<? extends JCTree>> collection = new ArrayList<Class<? extends JCTree>>(3);\n\t\tcollection.add(JCStatement.class);\n\t\tcollection.add(JCExpression.class);\n\t\tcollection.add(JCCatch.class);\n\t\treturn collection;\n\t}\n\t\n\tprivate static void addIfNotNull(Collection<JavacNode> nodes, JavacNode node) {\n\t\tif (node != null) nodes.add(node);\n\t}\n\t\n\t/**\n\t * Attempts to remove any compiler errors generated by java whose reporting position is located anywhere between the start and end of the supplied node.\n\t */\n\tvoid removeDeferredErrors(JavacNode node) {\n\t\tDiagnosticPosition pos = node.get().pos();\n\t\tJCCompilationUnit top = (JCCompilationUnit) top().get();\n\t\tremoveFromDeferredDiagnostics(pos.getStartPosition(), Javac.getEndPosition(pos, top));\n\t}\n\t\n\t/** Supply either a position or a node (in that case, position of the node is used) */\n\tvoid printMessage(Diagnostic.Kind kind, String message, JavacNode node, DiagnosticPosition pos, boolean attemptToRemoveErrorsInRange) {\n\t\tJavaFileObject oldSource = null;\n\t\tJavaFileObject newSource = null;\n\t\tJCTree astObject = node == null ? null : node.get();\n\t\tJCCompilationUnit top = (JCCompilationUnit) top().get();\n\t\tnewSource = top.sourcefile;\n\t\tif (newSource != null) {\n\t\t\toldSource = errorLogger.useSource(newSource);\n\t\t\tif (pos == null) pos = astObject.pos();\n\t\t}\n\t\tif (pos != null && node != null && attemptToRemoveErrorsInRange) {\n\t\t\tremoveFromDeferredDiagnostics(pos.getStartPosition(), node.getEndPosition(pos));\n\t\t}\n\t\ttry {\n\t\t\tswitch (kind) {\n\t\t\tcase ERROR:\n\t\t\t\terrorLogger.error(pos, message);\n\t\t\t\tbreak;\n\t\t\tcase WARNING:\n\t\t\t\terrorLogger.warning(pos, message);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\tcase NOTE:\n\t\t\t\terrorLogger.note(pos, message);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} finally {\n\t\t\tif (newSource != null) errorLogger.useSource(oldSource);\n\t\t}\n\t}\n\t\n\tpublic void removeFromDeferredDiagnostics(int startPos, int endPos) {\n\t\tif (startPos == Position.NOPOS || endPos == Position.NOPOS) return;\n\t\tJCCompilationUnit self = (JCCompilationUnit) top().get();\n\t\tnew CompilerMessageSuppressor(getContext()).removeAllBetween(self.sourcefile, startPos, endPos);\n\t}\n\t\n\t/** {@inheritDoc} */\n\t@Override protected void setElementInASTCollection(Field field, Object refField, List<Collection<?>> chain, Collection<?> collection, int idx, JCTree newN) throws IllegalAccessException {\n\t\tcom.sun.tools.javac.util.List<?> list = setElementInConsList(chain, collection, ((List<?>)collection).get(idx), newN);\n\t\tfield.set(refField, list);\n\t}\n\t\n\tprivate com.sun.tools.javac.util.List<?> setElementInConsList(List<Collection<?>> chain, Collection<?> current, Object oldO, Object newO) {\n\t\tcom.sun.tools.javac.util.List<?> oldL = (com.sun.tools.javac.util.List<?>) current;\n\t\tcom.sun.tools.javac.util.List<?> newL = replaceInConsList(oldL, oldO, newO);\n\t\tif (chain.isEmpty()) return newL;\n\t\tList<Collection<?>> reducedChain = new ArrayList<Collection<?>>(chain);\n\t\tCollection<?> newCurrent = reducedChain.remove(reducedChain.size() -1);\n\t\treturn setElementInConsList(reducedChain, newCurrent, oldL, newL);\n\t}\n\t\n\tprivate com.sun.tools.javac.util.List<?> replaceInConsList(com.sun.tools.javac.util.List<?> oldL, Object oldO, Object newO) {\n\t\tboolean repl = false;\n\t\tObject[] a = oldL.toArray();\n\t\tfor (int i = 0; i < a.length; i++) {\n\t\t\tif (a[i] == oldO) {\n\t\t\t\ta[i] = newO;\n\t\t\t\trepl = true;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (repl) return com.sun.tools.javac.util.List.<Object>from(a);\n\t\treturn oldL;\n\t}\n\t\n\tabstract static class ErrorLog {\n\t\tfinal Log log;\n\t\tprivate final Messager messager;\n\t\tprivate final Field errorCount;\n\t\tprivate final Field warningCount;\n\t\t\n\t\tprivate ErrorLog(Log log, Messager messager, Field errorCount, Field warningCount) {\n\t\t\tthis.log = log;\n\t\t\tthis.messager = messager;\n\t\t\tthis.errorCount = errorCount;\n\t\t\tthis.warningCount = warningCount;\n\t\t}\n\t\t\n\t\tfinal JavaFileObject useSource(JavaFileObject file) {\n\t\t\treturn log.useSource(file);\n\t\t}\n\t\t\n\t\tfinal void error(DiagnosticPosition pos, String message) {\n\t\t\tincrement(errorCount);\n\t\t\terror1(pos, message);\n\t\t}\n\t\t\n\t\tfinal void warning(DiagnosticPosition pos, String message) {\n\t\t\tincrement(warningCount);\n\t\t\twarning1(pos, message);\n\t\t}\n\t\t\n\t\tabstract void error1(DiagnosticPosition pos, String message);\n\t\tabstract void warning1(DiagnosticPosition pos, String message);\n\t\tabstract void note(DiagnosticPosition pos, String message);\n\t\t\n\t\tprivate void increment(Field field) {\n\t\t\tif (field == null) return;\n\t\t\ttry {\n\t\t\t\tint val = ((Number)field.get(messager)).intValue();\n\t\t\t\tfield.set(messager, val +1);\n\t\t\t} catch (Throwable t) {\n\t\t\t\t//Very unfortunate, but in most cases it still works fine, so we'll silently swallow it.\n\t\t\t}\n\t\t}\n\t\t\n\t\tstatic ErrorLog create(Messager messager, Context context) {\n\t\t\tField errorCount; try {\n\t\t\t\terrorCount = Permit.getField(messager.getClass(), \"errorCount\");\n\t\t\t} catch (Throwable t) {\n\t\t\t\terrorCount = null;\n\t\t\t}\n\t\t\tLog log = Log.instance(context);\n\t\t\tboolean hasMultipleErrors = false;\n\t\t\tfor (Field field : log.getClass().getFields()) {\n\t\t\t\tif (field.getName().equals(\"multipleErrors\")) {\n\t\t\t\t\thasMultipleErrors = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (hasMultipleErrors) return new JdkBefore9(log, messager, errorCount);\n\t\t\t\n\t\t\tField warningCount; try {\n\t\t\t\twarningCount = Permit.getField(messager.getClass(), \"warningCount\");\n\t\t\t} catch (Throwable t) {\n\t\t\t\twarningCount = null;\n\t\t\t}\n\t\t\t\n\t\t\treturn new Jdk9Plus(log, messager, errorCount, warningCount);\n\t\t}\n\t}\n\t\n\tstatic class JdkBefore9 extends ErrorLog {\n\t\tprivate JdkBefore9(Log log, Messager messager, Field errorCount) {\n\t\t\tsuper(log, messager, errorCount, null);\n\t\t}\n\t\t\n\t\t@Override void error1(DiagnosticPosition pos, String message) {\n\t\t\tboolean prev = log.multipleErrors;\n\t\t\tlog.multipleErrors = true;\n\t\t\ttry {\n\t\t\t\tlog.error(pos, \"proc.messager\", message);\n\t\t\t} finally {\n\t\t\t\tlog.multipleErrors = prev;\n\t\t\t}\n\t\t}\n\t\t\n\t\t@Override void warning1(DiagnosticPosition pos, String message) {\n\t\t\tlog.warning(pos, \"proc.messager\", message);\n\t\t}\n\t\t\n\t\t@Override void note(DiagnosticPosition pos, String message) {\n\t\t\tlog.note(pos, \"proc.messager\", message);\n\t\t}\n\t}\n\t\n\tstatic class Jdk9Plus extends ErrorLog {\n\t\tprivate static final String PROC_MESSAGER = \"proc.messager\";\n\t\tprivate Object multiple;\n\t\tprivate Method errorMethod, warningMethod, noteMethod;\n\t\tprivate Method errorKey, warningKey, noteKey;\n\t\tprivate JCDiagnostic.Factory diags;\n\t\t\n\t\tprivate Jdk9Plus(Log log, Messager messager, Field errorCount, Field warningCount) {\n\t\t\tsuper(log, messager, errorCount, warningCount);\n\t\t\t\n\t\t\ttry {\n\t\t\t\tfinal String jcd = \"com.sun.tools.javac.util.JCDiagnostic\";\n\t\t\t\tClass<?> df = Class.forName(jcd + \"$DiagnosticFlag\");\n\t\t\t\tfor (Object constant : df.getEnumConstants()) {\n\t\t\t\t\tif (constant.toString().equals(\"MULTIPLE\")) this.multiple = constant;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tClass<?> errorCls = Class.forName(jcd + \"$Error\");\n\t\t\t\tClass<?> warningCls = Class.forName(jcd + \"$Warning\");\n\t\t\t\tClass<?> noteCls = Class.forName(jcd + \"$Note\");\n\t\t\t\t\n\t\t\t\tClass<?> lc = log.getClass();\n\t\t\t\tthis.errorMethod = Permit.getMethod(lc, \"error\", df, DiagnosticPosition.class, errorCls);\n\t\t\t\tthis.warningMethod = Permit.getMethod(lc, \"warning\", DiagnosticPosition.class, warningCls);\n\t\t\t\tthis.noteMethod = Permit.getMethod(lc, \"note\", DiagnosticPosition.class, noteCls);\n\t\t\t\t\n\t\t\t\tField diagsField = Permit.getField(lc.getSuperclass(), \"diags\");\n\t\t\t\tthis.diags = (JCDiagnostic.Factory) diagsField.get(log);\n\t\t\t\t\n\t\t\t\tClass<?> dc = this.diags.getClass();\n\t\t\t\tthis.errorKey = Permit.getMethod(dc, \"errorKey\", String.class, Object[].class);\n\t\t\t\tthis.warningKey = Permit.permissiveGetMethod(dc, \"warningKey\", String.class, Object[].class);\n\t\t\t\tif (warningKey == null) {\n\t\t\t\t\tthis.warningKey = Permit.getMethod(dc, \"warningKey\", LintCategory.class, String.class, Object[].class);\n\t\t\t\t}\n\t\t\t\tthis.noteKey = Permit.getMethod(dc, \"noteKey\", String.class, Object[].class);\n\t\t\t} catch (Throwable t) {\n\t\t\t\t//t.printStackTrace();\n\t\t\t}\n\t\t}\n\t\t\n\t\t@Override void error1(DiagnosticPosition pos, String message) {\n\t\t\tObject error = Permit.invokeSneaky(this.errorKey, diags, PROC_MESSAGER, new Object[] { message });\n\t\t\tif (error != null) Permit.invokeSneaky(errorMethod, log, multiple, pos, error);\n\t\t}\n\t\t\n\t\t@Override\n\t\tvoid warning1(DiagnosticPosition pos, String message) {\n\t\t\tObject warning;\n\t\t\tif (this.warningKey.getParameterTypes().length == 3) {\n\t\t\t\twarning = Permit.invokeSneaky(this.warningKey, diags, null, PROC_MESSAGER, new Object[] { message });\n\t\t\t} else {\n\t\t\t\twarning = Permit.invokeSneaky(this.warningKey, diags, PROC_MESSAGER, new Object[] { message });\n\t\t\t}\n\t\t\tif (warning != null) Permit.invokeSneaky(warningMethod, log, pos, warning);\n\t\t}\n\t\t\n\t\t@Override\n\t\tvoid note(DiagnosticPosition pos, String message) {\n\t\t\tObject note = Permit.invokeSneaky(this.noteKey, diags, PROC_MESSAGER, new Object[] { message });\n\t\t\tif (note != null) Permit.invokeSneaky(noteMethod, log, pos, note);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/JavacASTAdapter.java",
    "content": "/*\n * Copyright (C) 2009-2019 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac;\n\nimport com.sun.source.util.Trees;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCBlock;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCCompilationUnit;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\n\n/**\n * Standard adapter for the {@link JavacASTVisitor} interface. Every method on that interface\n * has been implemented with an empty body. Override whichever methods you need.\n */\npublic class JavacASTAdapter implements JavacASTVisitor {\n\t/** {@inheritDoc} */\n\t@Override public void setTrees(Trees trees) {}\n\t\n\t/** {@inheritDoc} */\n\t@Override public void visitCompilationUnit(JavacNode top, JCCompilationUnit unit) {}\n\t\n\t/** {@inheritDoc} */\n\t@Override public void endVisitCompilationUnit(JavacNode top, JCCompilationUnit unit) {}\n\t\n\t/** {@inheritDoc} */\n\t@Override public void visitType(JavacNode typeNode, JCClassDecl type) {}\n\t\n\t/** {@inheritDoc} */\n\t@Override public void visitAnnotationOnType(JCClassDecl type, JavacNode annotationNode, JCAnnotation annotation) {}\n\t\n\t/** {@inheritDoc} */\n\t@Override public void endVisitType(JavacNode typeNode, JCClassDecl type) {}\n\t\n\t/** {@inheritDoc} */\n\t@Override public void visitField(JavacNode fieldNode, JCVariableDecl field) {}\n\t\n\t/** {@inheritDoc} */\n\t@Override public void visitAnnotationOnField(JCVariableDecl field, JavacNode annotationNode, JCAnnotation annotation) {}\n\t\n\t/** {@inheritDoc} */\n\t@Override public void endVisitField(JavacNode fieldNode, JCVariableDecl field) {}\n\t\n\t/** {@inheritDoc} */\n\t@Override public void visitInitializer(JavacNode initializerNode, JCBlock initializer) {}\n\t\n\t/** {@inheritDoc} */\n\t@Override public void endVisitInitializer(JavacNode initializerNode, JCBlock initializer) {}\n\t\n\t/** {@inheritDoc} */\n\t@Override public void visitMethod(JavacNode methodNode, JCMethodDecl method) {}\n\t\n\t/** {@inheritDoc} */\n\t@Override public void visitAnnotationOnMethod(JCMethodDecl method, JavacNode annotationNode, JCAnnotation annotation) {}\n\t\n\t/** {@inheritDoc} */\n\t@Override public void endVisitMethod(JavacNode methodNode, JCMethodDecl method) {}\n\t\n\t/** {@inheritDoc} */\n\t@Override public void visitMethodArgument(JavacNode argumentNode, JCVariableDecl argument, JCMethodDecl method) {}\n\t\n\t/** {@inheritDoc} */\n\t@Override public void visitAnnotationOnMethodArgument(JCVariableDecl argument, JCMethodDecl method, JavacNode annotationNode, JCAnnotation annotation) {}\n\t\n\t/** {@inheritDoc} */\n\t@Override public void endVisitMethodArgument(JavacNode argumentNode, JCVariableDecl argument, JCMethodDecl method) {}\n\t\n\t/** {@inheritDoc} */\n\t@Override public void visitLocal(JavacNode localNode, JCVariableDecl local) {}\n\t\n\t/** {@inheritDoc} */\n\t@Override public void visitAnnotationOnLocal(JCVariableDecl local, JavacNode annotationNode, JCAnnotation annotation) {}\n\t\n\t/** {@inheritDoc} */\n\t@Override public void endVisitLocal(JavacNode localNode, JCVariableDecl local) {}\n\t\n\t/** {@inheritDoc} */\n\t@Override public void visitTypeUse(JavacNode typeUseNode, JCTree typeUse) {}\n\t\n\t/** {@inheritDoc} */\n\t@Override public void visitAnnotationOnTypeUse(JCTree typeUse, JavacNode annotationNode, JCAnnotation annotation) {}\n\t\n\t/** {@inheritDoc} */\n\t@Override public void endVisitTypeUse(JavacNode typeUseNode, JCTree typeUse) {}\n\t\n\t/** {@inheritDoc} */\n\t@Override public void visitStatement(JavacNode statementNode, JCTree statement) {}\n\t\n\t/** {@inheritDoc} */\n\t@Override public void endVisitStatement(JavacNode statementNode, JCTree statement) {}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/JavacASTVisitor.java",
    "content": "/*\n * Copyright (C) 2009-2019 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac;\n\nimport java.io.PrintStream;\nimport java.lang.reflect.Field;\n\nimport com.sun.source.util.Trees;\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCBlock;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCCompilationUnit;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.util.List;\n\n/**\n * Implement so you can ask any JavacAST.LombokNode to traverse depth-first through all children,\n * calling the appropriate visit and endVisit methods.\n */\npublic interface JavacASTVisitor {\n\tvoid setTrees(Trees trees);\n\t\n\t/**\n\t * Called at the very beginning and end.\n\t */\n\tvoid visitCompilationUnit(JavacNode top, JCCompilationUnit unit);\n\tvoid endVisitCompilationUnit(JavacNode top, JCCompilationUnit unit);\n\t\n\t/**\n\t * Called when visiting a type (a class, interface, annotation, enum, etcetera).\n\t */\n\tvoid visitType(JavacNode typeNode, JCClassDecl type);\n\tvoid visitAnnotationOnType(JCClassDecl type, JavacNode annotationNode, JCAnnotation annotation);\n\tvoid endVisitType(JavacNode typeNode, JCClassDecl type);\n\t\n\t/**\n\t * Called when visiting a field of a class.\n\t */\n\tvoid visitField(JavacNode fieldNode, JCVariableDecl field);\n\tvoid visitAnnotationOnField(JCVariableDecl field, JavacNode annotationNode, JCAnnotation annotation);\n\tvoid endVisitField(JavacNode fieldNode, JCVariableDecl field);\n\t\n\t/**\n\t * Called for static and instance initializers. You can tell the difference via the isStatic() method.\n\t */\n\tvoid visitInitializer(JavacNode initializerNode, JCBlock initializer);\n\tvoid endVisitInitializer(JavacNode initializerNode, JCBlock initializer);\n\t\n\t/**\n\t * Called for both methods and constructors.\n\t */\n\tvoid visitMethod(JavacNode methodNode, JCMethodDecl method);\n\tvoid visitAnnotationOnMethod(JCMethodDecl method, JavacNode annotationNode, JCAnnotation annotation);\n\tvoid endVisitMethod(JavacNode methodNode, JCMethodDecl method);\n\t\n\t/**\n\t * Visits a method argument.\n\t */\n\tvoid visitMethodArgument(JavacNode argumentNode, JCVariableDecl argument, JCMethodDecl method);\n\tvoid visitAnnotationOnMethodArgument(JCVariableDecl argument, JCMethodDecl method, JavacNode annotationNode, JCAnnotation annotation);\n\tvoid endVisitMethodArgument(JavacNode argumentNode, JCVariableDecl argument, JCMethodDecl method);\n\t\n\t/**\n\t * Visits a local declaration - that is, something like 'int x = 10;' on the method level. Also called\n\t * for method parameters.\n\t */\n\tvoid visitLocal(JavacNode localNode, JCVariableDecl local);\n\tvoid visitAnnotationOnLocal(JCVariableDecl local, JavacNode annotationNode, JCAnnotation annotation);\n\tvoid endVisitLocal(JavacNode localNode, JCVariableDecl local);\n\t\n\t/**\n\t * Visits a node that represents a type reference. Anything from {@code int} to {@code T} to {@code foo.pkg.Bar<T>.Baz<?> @Ann []}.\n\t */\n\tvoid visitTypeUse(JavacNode typeUseNode, JCTree typeUse);\n\tvoid visitAnnotationOnTypeUse(JCTree typeUse, JavacNode annotationNode, JCAnnotation annotation);\n\tvoid endVisitTypeUse(JavacNode typeUseNode, JCTree typeUse);\n\t\n\t/**\n\t * Visits a statement that isn't any of the other visit methods (e.g. JCClassDecl).\n\t * The statement object is guaranteed to be either a JCStatement or a JCExpression.\n\t */\n\tvoid visitStatement(JavacNode statementNode, JCTree statement);\n\tvoid endVisitStatement(JavacNode statementNode, JCTree statement);\n\t\n\t/**\n\t * Prints the structure of an AST.\n\t */\n\tpublic static class Printer implements JavacASTVisitor {\n\t\tprivate final PrintStream out;\n\t\tprivate final boolean printContent;\n\t\tprivate int disablePrinting = 0;\n\t\tprivate int indent = 0;\n\t\t\n\t\t/**\n\t\t * @param printContent if true, bodies are printed directly, as java code,\n\t\t * instead of a tree listing of every AST node inside it.\n\t\t */\n\t\tpublic Printer(boolean printContent) {\n\t\t\tthis(printContent, System.out);\n\t\t}\n\t\t\n\t\t/**\n\t\t * @param printContent if true, bodies are printed directly, as java code,\n\t\t * instead of a tree listing of every AST node inside it.\n\t\t * @param out write output to this stream. You must close it yourself. flush() is called after every line.\n\t\t * \n\t\t * @see java.io.PrintStream#flush()\n\t\t */\n\t\tpublic Printer(boolean printContent, PrintStream out) {\n\t\t\tthis.printContent = printContent;\n\t\t\tthis.out = out;\n\t\t}\n\t\t\n\t\t@Override public void setTrees(Trees trees) {}\n\t\t\n\t\tprivate void forcePrint(String text, Object... params) {\n\t\t\tStringBuilder sb = new StringBuilder();\n\t\t\tfor (int i = 0; i < indent; i++) sb.append(\"  \");\n\t\t\tout.printf(sb.append(text).append('\\n').toString(), params);\n\t\t\tout.flush();\n\t\t}\n\t\t\n\t\tprivate void print(String text, Object... params) {\n\t\t\tif (disablePrinting == 0) forcePrint(text, params);\n\t\t}\n\t\t\n\t\t@Override public void visitCompilationUnit(JavacNode LombokNode, JCCompilationUnit unit) {\n\t\t\tout.println(\"---------------------------------------------------------\");\n\t\t\t\n\t\t\tprint(\"<CU %s>\", LombokNode.getFileName());\n\t\t\tindent++;\n\t\t}\n\t\t\n\t\t@Override public void endVisitCompilationUnit(JavacNode node, JCCompilationUnit unit) {\n\t\t\tindent--;\n\t\t\tprint(\"</CUD>\");\n\t\t}\n\t\t\n\t\tprivate String printFlags(long f) {\n\t\t\treturn Flags.toString(f);\n\t\t}\n\t\t\n\t\t@Override public void visitType(JavacNode node, JCClassDecl type) {\n\t\t\tprint(\"<TYPE %s> %s\", type.name, printFlags(type.mods.flags));\n\t\t\tindent++;\n\t\t\tif (printContent) {\n\t\t\t\tprint(\"%s\", type);\n\t\t\t\tdisablePrinting++;\n\t\t\t}\n\t\t}\n\t\t\n\t\t@Override public void visitAnnotationOnType(JCClassDecl type, JavacNode node, JCAnnotation annotation) {\n\t\t\tforcePrint(\"<ANNOTATION: %s />\", annotation);\n\t\t}\n\t\t\n\t\t@Override public void endVisitType(JavacNode node, JCClassDecl type) {\n\t\t\tif (printContent) disablePrinting--;\n\t\t\tindent--;\n\t\t\tprint(\"</TYPE %s>\", type.name);\n\t\t}\n\t\t\n\t\t@Override public void visitInitializer(JavacNode node, JCBlock initializer) {\n\t\t\tprint(\"<%s INITIALIZER>\",\n\t\t\t\t\tinitializer.isStatic() ? \"static\" : \"instance\");\n\t\t\tindent++;\n\t\t\tif (printContent) {\n\t\t\t\tprint(\"%s\", initializer);\n\t\t\t\tdisablePrinting++;\n\t\t\t}\n\t\t}\n\t\t\n\t\t@Override public void endVisitInitializer(JavacNode node, JCBlock initializer) {\n\t\t\tif (printContent) disablePrinting--;\n\t\t\tindent--;\n\t\t\tprint(\"</%s INITIALIZER>\", initializer.isStatic() ? \"static\" : \"instance\");\n\t\t}\n\t\t\n\t\t@Override public void visitField(JavacNode node, JCVariableDecl field) {\n\t\t\tprint(\"<FIELD %s %s> %s\", field.vartype, field.name, printFlags(field.mods.flags));\n\t\t\tindent++;\n\t\t\tif (printContent) {\n\t\t\t\tif (field.init != null) print(\"%s\", field.init);\n\t\t\t\tdisablePrinting++;\n\t\t\t}\n\t\t}\n\t\t\n\t\t@Override public void visitAnnotationOnField(JCVariableDecl field, JavacNode node, JCAnnotation annotation) {\n\t\t\tforcePrint(\"<ANNOTATION: %s />\", annotation);\n\t\t}\n\t\t\n\t\t@Override public void endVisitField(JavacNode node, JCVariableDecl field) {\n\t\t\tif (printContent) disablePrinting--;\n\t\t\tindent--;\n\t\t\tprint(\"</FIELD %s %s>\", field.vartype, field.name);\n\t\t}\n\t\t\n\t\t@Override public void visitMethod(JavacNode node, JCMethodDecl method) {\n\t\t\tfinal String type;\n\t\t\tif (method.name.contentEquals(\"<init>\")) {\n\t\t\t\tif ((method.mods.flags & Flags.GENERATEDCONSTR) != 0) {\n\t\t\t\t\ttype = \"DEFAULTCONSTRUCTOR\";\n\t\t\t\t} else type = \"CONSTRUCTOR\";\n\t\t\t} else type = \"METHOD\";\n\t\t\tprint(\"<%s %s> %s returns: %s\", type, method.name, printFlags(method.mods.flags), method.restype);\n\t\t\tindent++;\n\t\t\tJCVariableDecl recv;\n\t\t\ttry {\n\t\t\t\tField f = JCMethodDecl.class.getField(\"recvparam\");\n\t\t\t\trecv = (JCVariableDecl) f.get(method);\n\t\t\t} catch (Exception ignore) {\n\t\t\t\trecv = null;\n\t\t\t}\n\t\t\t\n\t\t\tif (recv != null) {\n\t\t\t\tList<JCAnnotation> annotations = recv.mods.annotations;\n\t\t\t\tif (recv.mods != null) annotations = recv.mods.annotations;\n\t\t\t\tboolean innerContent = annotations != null && annotations.isEmpty();\n\t\t\t\tprint(\"<RECEIVER-PARAM (%s) %s %s%s> %s\", recv.vartype == null ? \"null\" : recv.vartype.getClass().toString(), recv.vartype, recv.name, innerContent ? \"\" : \" /\", printFlags(recv.mods.flags));\n\t\t\t\tif (innerContent) {\n\t\t\t\t\tindent++;\n\t\t\t\t\tfor (JCAnnotation ann : annotations) print(\"<ANNOTATION: %s />\", ann);\n\t\t\t\t\tindent--;\n\t\t\t\t\tprint(\"</RECEIVER-PARAM>\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (printContent) {\n\t\t\t\tif (method.body == null) print(\"(ABSTRACT)\");\n\t\t\t\telse print(\"%s\", method.body);\n\t\t\t\tdisablePrinting++;\n\t\t\t}\n\t\t}\n\t\t\n\t\t@Override public void visitAnnotationOnMethod(JCMethodDecl method, JavacNode node, JCAnnotation annotation) {\n\t\t\tforcePrint(\"<ANNOTATION: %s />\", annotation);\n\t\t}\n\t\t\n\t\t@Override public void endVisitMethod(JavacNode node, JCMethodDecl method) {\n\t\t\tif (printContent) disablePrinting--;\n\t\t\tindent--;\n\t\t\tprint(\"</%s %s>\", \"METHOD\", method.name);\n\t\t}\n\t\t\n\t\t@Override public void visitMethodArgument(JavacNode node, JCVariableDecl arg, JCMethodDecl method) {\n\t\t\tprint(\"<METHODARG (%s) %s %s> %s\", arg.vartype.getClass().toString(), arg.vartype, arg.name, printFlags(arg.mods.flags));\n\t\t\tindent++;\n\t\t}\n\t\t\n\t\t@Override public void visitAnnotationOnMethodArgument(JCVariableDecl arg, JCMethodDecl method, JavacNode nodeAnnotation, JCAnnotation annotation) {\n\t\t\tforcePrint(\"<ANNOTATION: %s />\", annotation);\n\t\t}\n\t\t\n\t\t@Override public void endVisitMethodArgument(JavacNode node, JCVariableDecl arg, JCMethodDecl method) {\n\t\t\tindent--;\n\t\t\tprint(\"</METHODARG %s %s>\", arg.vartype, arg.name);\n\t\t}\n\t\t\n\t\t@Override public void visitLocal(JavacNode node, JCVariableDecl local) {\n\t\t\tprint(\"<LOCAL %s %s> %s\", local.vartype, local.name, printFlags(local.mods.flags));\n\t\t\tindent++;\n\t\t}\n\t\t\n\t\t@Override public void visitAnnotationOnLocal(JCVariableDecl local, JavacNode node, JCAnnotation annotation) {\n\t\t\tprint(\"<ANNOTATION: %s />\", annotation);\n\t\t}\n\t\t\n\t\t@Override public void endVisitLocal(JavacNode node, JCVariableDecl local) {\n\t\t\tindent--;\n\t\t\tprint(\"</LOCAL %s %s>\", local.vartype, local.name);\n\t\t}\n\t\t\n\t\t@Override public void visitTypeUse(JavacNode node, JCTree typeUse) {\n\t\t\tprint(\"<TYPE %s>\", typeUse.getClass());\n\t\t\tindent++;\n\t\t\tprint(\"%s\", typeUse);\n\t\t}\n\t\t\n\t\t@Override public void visitAnnotationOnTypeUse(JCTree typeUse, JavacNode node, JCAnnotation annotation) {\n\t\t\tprint(\"<ANNOTATION: %s />\", annotation);\n\t\t}\n\t\t\n\t\t@Override public void endVisitTypeUse(JavacNode node, JCTree typeUse) {\n\t\t\tindent--;\n\t\t\tprint(\"</TYPE %s>\", typeUse.getClass());\n\t\t}\n\t\t\n\t\t@Override public void visitStatement(JavacNode node, JCTree statement) {\n\t\t\tprint(\"<%s>\", statement.getClass());\n\t\t\tindent++;\n\t\t\tprint(\"%s\", statement);\n\t\t}\n\t\t\n\t\t@Override public void endVisitStatement(JavacNode node, JCTree statement) {\n\t\t\tindent--;\n\t\t\tprint(\"</%s>\", statement.getClass());\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/JavacAnnotationHandler.java",
    "content": "/*\n * Copyright (C) 2009-2012 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac;\n\nimport java.lang.annotation.Annotation;\n\nimport lombok.core.AnnotationValues;\nimport lombok.core.SpiLoadUtil;\n\nimport com.sun.source.util.Trees;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\n\n/**\n * Implement this interface if you want to be triggered for a specific annotation.\n * \n * You MUST replace 'T' with a specific annotation type, such as:\n * \n * {@code public class HandleGetter extends JavacAnnotationHandler<Getter>}\n * \n * Because this generics parameter is inspected to figure out which class you're interested in.\n * \n * You also need to register yourself via SPI discovery as being an implementation of {@code JavacAnnotationHandler}.\n */\npublic abstract class JavacAnnotationHandler<T extends Annotation> {\n\tprotected Trees trees;\n\t\n\t/**\n\t * Called when an annotation is found that is likely to match the annotation you're interested in.\n\t * \n\t * Be aware that you'll be called for ANY annotation node in the source that looks like a match. There is,\n\t * for example, no guarantee that the annotation node belongs to a method, even if you set your\n\t * TargetType in the annotation to methods only.\n\t * \n\t * @param annotation The actual annotation - use this object to retrieve the annotation parameters.\n\t * @param ast The javac AST node representing the annotation.\n\t * @param annotationNode The Lombok AST wrapper around the 'ast' parameter. You can use this object\n\t * to travel back up the chain (something javac AST can't do) to the parent of the annotation, as well\n\t * as access useful methods such as generating warnings or errors focused on the annotation.\n\t */\n\tpublic abstract void handle(AnnotationValues<T> annotation, JCAnnotation ast, JavacNode annotationNode);\n\t\n\t/**\n\t * This handler is a handler for the given annotation; you don't normally need to override this class\n\t * as the annotation type is extracted from your {@code extends EclipseAnnotationHandler<AnnotationTypeHere>}\n\t * signature.\n\t */\n\t@SuppressWarnings(\"unchecked\") public Class<T> getAnnotationHandledByThisHandler() {\n\t\treturn (Class<T>) SpiLoadUtil.findAnnotationClass(getClass(), JavacAnnotationHandler.class);\n\t}\n\t\n\tpublic void setTrees(Trees trees) {\n\t\tthis.trees = trees;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/JavacAugments.java",
    "content": "/*\n * Copyright (C) 2014-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac;\n\nimport lombok.core.FieldAugment;\n\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCImport;\n\npublic final class JavacAugments {\n\tprivate JavacAugments() {\n\t\t// Prevent instantiation\n\t}\n\t\n\tpublic static final FieldAugment<JCTree, Boolean> JCTree_handled = FieldAugment.augment(JCTree.class, boolean.class, \"lombok$handled\");\n\tpublic static final FieldAugment<JCTree, JCTree> JCTree_generatedNode = FieldAugment.circularSafeAugment(JCTree.class, JCTree.class, \"lombok$generatedNode\");\n\tpublic static final FieldAugment<JCImport, Boolean> JCImport_deletable = FieldAugment.circularSafeAugment(JCImport.class, Boolean.class, \"lombok$deletable\");\n\tpublic static final FieldAugment<JCTree, Boolean> JCTree_keepPosition = FieldAugment.augment(JCTree.class, boolean.class, \"lombok$keepPosition\");\n}\n"
  },
  {
    "path": "src/core/lombok/javac/JavacImportList.java",
    "content": "/*\n * Copyright (C) 2013-2020 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\n\nimport lombok.core.ImportList;\nimport lombok.core.LombokInternalAliasing;\n\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCCompilationUnit;\nimport com.sun.tools.javac.tree.JCTree.JCFieldAccess;\nimport com.sun.tools.javac.tree.JCTree.JCImport;\nimport com.sun.tools.javac.util.List;\n\npublic class JavacImportList implements ImportList {\n\tprivate final String pkgStr;\n\tprivate final List<JCTree> defs;\n\t\n\tpublic JavacImportList(JCCompilationUnit cud) {\n\t\tthis.pkgStr = PackageName.getPackageName(cud);\n\t\tthis.defs = cud.defs;\n\t}\n\t\n\t@Override public String getFullyQualifiedNameForSimpleName(String unqualified) {\n\t\tString q = getFullyQualifiedNameForSimpleNameNoAliasing(unqualified);\n\t\treturn q == null ? null : LombokInternalAliasing.processAliases(q);\n\t}\n\t\n\t@Override public String getFullyQualifiedNameForSimpleNameNoAliasing(String unqualified) {\n\t\tfor (JCTree def : defs) {\n\t\t\tif (!(def instanceof JCImport)) continue;\n\t\t\tJCTree qual = Javac.getQualid((JCImport) def);\n\t\t\tif (!(qual instanceof JCFieldAccess)) continue;\n\t\t\tString simpleName = ((JCFieldAccess) qual).name.toString();\n\t\t\tif (simpleName.equals(unqualified)) {\n\t\t\t\treturn qual.toString();\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\t\n\t@Override public boolean hasStarImport(String packageName) {\n\t\tif (pkgStr != null && pkgStr.equals(packageName)) return true;\n\t\tif (\"java.lang\".equals(packageName)) return true;\n\t\t\n\t\tfor (JCTree def : defs) {\n\t\t\tif (!(def instanceof JCImport)) continue;\n\t\t\tif (((JCImport) def).staticImport) continue;\n\t\t\tJCTree qual = Javac.getQualid((JCImport) def);\n\t\t\tif (!(qual instanceof JCFieldAccess)) continue;\n\t\t\tString simpleName = ((JCFieldAccess) qual).name.toString();\n\t\t\tif (!\"*\".equals(simpleName)) continue;\n\t\t\tString starImport = ((JCFieldAccess) qual).selected.toString();\n\t\t\tif (packageName.equals(starImport)) return true;\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\t@Override public Collection<String> applyNameToStarImports(String startsWith, String name) {\n\t\tArrayList<String> out = new ArrayList<String>();\n\t\t\n\t\tif (pkgStr != null && topLevelName(pkgStr).equals(startsWith)) out.add(pkgStr + \".\" + name);\n\t\t\n\t\tfor (JCTree def : defs) {\n\t\t\tif (!(def instanceof JCImport)) continue;\n\t\t\tif (((JCImport) def).staticImport) continue;\n\t\t\tJCTree qual = Javac.getQualid((JCImport) def);\n\t\t\tif (!(qual instanceof JCFieldAccess)) continue;\n\t\t\tString simpleName = ((JCFieldAccess) qual).name.toString();\n\t\t\tif (!\"*\".equals(simpleName)) continue;\n\t\t\t\n\t\t\tString topLevelName = topLevelName(qual);\n\t\t\tif (topLevelName.equals(startsWith)) {\n\t\t\t\tout.add(((JCFieldAccess) qual).selected.toString() + \".\" + name);\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn out;\n\t}\n\t\n\tprivate String topLevelName(JCTree tree) {\n\t\twhile (tree instanceof JCFieldAccess) tree = ((JCFieldAccess) tree).selected;\n\t\treturn tree.toString();\n\t}\n\t\n\tprivate String topLevelName(String packageName) {\n\t\tint idx = packageName.indexOf(\".\");\n\t\tif (idx == -1) return packageName;\n\t\treturn packageName.substring(0, idx);\n\t}\n\t\n\t@Override public String applyUnqualifiedNameToPackage(String unqualified) {\n\t\tif (pkgStr == null) return unqualified;\n\t\treturn pkgStr + \".\" + unqualified;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/JavacNode.java",
    "content": "/*\n * Copyright (C) 2009-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac;\n\nimport java.lang.annotation.Annotation;\nimport java.util.List;\n\nimport javax.lang.model.element.Element;\nimport javax.tools.Diagnostic;\n\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.code.Symtab;\nimport com.sun.tools.javac.model.JavacTypes;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCBlock;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCCompilationUnit;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCModifiers;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.util.Context;\nimport com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;\nimport com.sun.tools.javac.util.Name;\n\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.javac.handlers.JavacHandlerUtil;\n\n/**\n * Javac specific version of the LombokNode class.\n */\npublic class JavacNode extends lombok.core.LombokNode<JavacAST, JavacNode, JCTree> {\n\tprivate JavacAST ast;\n\t/**\n\t * Passes through to the parent constructor.\n\t */\n\tpublic JavacNode(JavacAST ast, JCTree node, List<JavacNode> children, Kind kind) {\n\t\tsuper(node, children, kind);\n\t\tthis.ast = ast;\n\t}\n\t\n\t@Override \n\tpublic JavacAST getAst() {\n\t\treturn ast;\n\t}\n\t\n\tpublic Element getElement() {\n\t\tif (node instanceof JCClassDecl) return ((JCClassDecl) node).sym;\n\t\tif (node instanceof JCMethodDecl) return ((JCMethodDecl) node).sym;\n\t\tif (node instanceof JCVariableDecl) return ((JCVariableDecl) node).sym;\n\t\treturn null;\n\t}\n\t\n\tpublic int getEndPosition(DiagnosticPosition pos) {\n\t\tJCCompilationUnit cu = (JCCompilationUnit) top().get();\n\t\treturn Javac.getEndPosition(pos, cu);\n\t}\n\t\n\tpublic int getEndPosition() {\n\t\treturn getEndPosition(node);\n\t}\n\t\n\t/**\n\t * Visits this node and all child nodes depth-first, calling the provided visitor's visit methods.\n\t */\n\tpublic void traverse(JavacASTVisitor visitor) {\n\t\tswitch (this.getKind()) {\n\t\tcase COMPILATION_UNIT:\n\t\t\tvisitor.visitCompilationUnit(this, (JCCompilationUnit) get());\n\t\t\tast.traverseChildren(visitor, this);\n\t\t\tvisitor.endVisitCompilationUnit(this, (JCCompilationUnit) get());\n\t\t\tbreak;\n\t\tcase TYPE:\n\t\t\tvisitor.visitType(this, (JCClassDecl) get());\n\t\t\tast.traverseChildren(visitor, this);\n\t\t\tvisitor.endVisitType(this, (JCClassDecl) get());\n\t\t\tbreak;\n\t\tcase FIELD:\n\t\t\tvisitor.visitField(this, (JCVariableDecl) get());\n\t\t\tast.traverseChildren(visitor, this);\n\t\t\tvisitor.endVisitField(this, (JCVariableDecl) get());\n\t\t\tbreak;\n\t\tcase METHOD:\n\t\t\tvisitor.visitMethod(this, (JCMethodDecl) get());\n\t\t\tast.traverseChildren(visitor, this);\n\t\t\tvisitor.endVisitMethod(this, (JCMethodDecl) get());\n\t\t\tbreak;\n\t\tcase INITIALIZER:\n\t\t\tvisitor.visitInitializer(this, (JCBlock) get());\n\t\t\tast.traverseChildren(visitor, this);\n\t\t\tvisitor.endVisitInitializer(this, (JCBlock) get());\n\t\t\tbreak;\n\t\tcase ARGUMENT:\n\t\t\tJCMethodDecl parentMethod = (JCMethodDecl) up().get();\n\t\t\tvisitor.visitMethodArgument(this, (JCVariableDecl) get(), parentMethod);\n\t\t\tast.traverseChildren(visitor, this);\n\t\t\tvisitor.endVisitMethodArgument(this, (JCVariableDecl) get(), parentMethod);\n\t\t\tbreak;\n\t\tcase LOCAL:\n\t\t\tvisitor.visitLocal(this, (JCVariableDecl) get());\n\t\t\tast.traverseChildren(visitor, this);\n\t\t\tvisitor.endVisitLocal(this, (JCVariableDecl) get());\n\t\t\tbreak;\n\t\tcase STATEMENT:\n\t\t\tvisitor.visitStatement(this, get());\n\t\t\tast.traverseChildren(visitor, this);\n\t\t\tvisitor.endVisitStatement(this, get());\n\t\t\tbreak;\n\t\tcase ANNOTATION:\n\t\t\tswitch (up().getKind()) {\n\t\t\tcase TYPE:\n\t\t\t\tvisitor.visitAnnotationOnType((JCClassDecl) up().get(), this, (JCAnnotation) get());\n\t\t\t\tbreak;\n\t\t\tcase FIELD:\n\t\t\t\tvisitor.visitAnnotationOnField((JCVariableDecl) up().get(), this, (JCAnnotation) get());\n\t\t\t\tbreak;\n\t\t\tcase METHOD:\n\t\t\t\tvisitor.visitAnnotationOnMethod((JCMethodDecl) up().get(), this, (JCAnnotation) get());\n\t\t\t\tbreak;\n\t\t\tcase ARGUMENT:\n\t\t\t\tJCVariableDecl argument = (JCVariableDecl) up().get();\n\t\t\t\tJCMethodDecl method = (JCMethodDecl) up().up().get();\n\t\t\t\tvisitor.visitAnnotationOnMethodArgument(argument, method, this, (JCAnnotation) get());\n\t\t\t\tbreak;\n\t\t\tcase LOCAL:\n\t\t\t\tvisitor.visitAnnotationOnLocal((JCVariableDecl) up().get(), this, (JCAnnotation) get());\n\t\t\t\tbreak;\n\t\t\tcase TYPE_USE:\n\t\t\t\tvisitor.visitAnnotationOnTypeUse(up().get(), this, (JCAnnotation) get());\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new AssertionError(\"Annotion not expected as child of a \" + up().getKind());\n\t\t\t}\n\t\t\tbreak;\n\t\tcase TYPE_USE:\n\t\t\tvisitor.visitTypeUse(this, get());\n\t\t\tast.traverseChildren(visitor, this);\n\t\t\tvisitor.endVisitTypeUse(this, get());\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new AssertionError(\"Unexpected kind during node traversal: \" + getKind());\n\t\t}\n\t}\n\t\n\t/** {@inheritDoc} */\n\t@Override public String getName() {\n\t\tfinal Name n;\n\t\t\n\t\tif (node instanceof JCClassDecl) n = ((JCClassDecl) node).name;\n\t\telse if (node instanceof JCMethodDecl) n = ((JCMethodDecl) node).name;\n\t\telse if (node instanceof JCVariableDecl) n = ((JCVariableDecl) node).name;\n\t\telse n = null;\n\t\t\n\t\treturn n == null ? null : n.toString();\n\t}\n\t\n\t/** {@inheritDoc} */\n\t@Override protected boolean calculateIsStructurallySignificant(JCTree parent) {\n\t\tif (node instanceof JCClassDecl) return true;\n\t\tif (node instanceof JCMethodDecl) return true;\n\t\tif (node instanceof JCVariableDecl) return true;\n\t\tif (node instanceof JCCompilationUnit) return true;\n\t\t//Static and instance initializers\n\t\tif (node instanceof JCBlock) return parent instanceof JCClassDecl;\n\t\t\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * Convenient shortcut to the owning JavacAST object's getTreeMaker method.\n\t * \n\t * @see JavacAST#getTreeMaker()\n\t */\n\tpublic JavacTreeMaker getTreeMaker() {\n\t\treturn ast.getTreeMaker();\n\t}\n\t\n\t/**\n\t * Convenient shortcut to the owning JavacAST object's getSymbolTable method.\n\t * \n\t * @see JavacAST#getSymbolTable()\n\t */\n\tpublic Symtab getSymbolTable() {\n\t\treturn ast.getSymbolTable();\n\t}\n\t\n\t/**\n\t * Convenient shortcut to the owning JavacAST object's getTypesUtil method.\n\t * \n\t * @see JavacAST#getTypesUtil()\n\t */\n\tpublic JavacTypes getTypesUtil() {\n\t\treturn ast.getTypesUtil();\n\t}\n\t\n\t/**\n\t * Convenient shortcut to the owning JavacAST object's getContext method.\n\t * \n\t * @see JavacAST#getContext()\n\t */\n\tpublic Context getContext() {\n\t\treturn ast.getContext();\n\t}\n\t\n\tpublic boolean shouldDeleteLombokAnnotations() {\n\t\treturn LombokOptions.shouldDeleteLombokAnnotations(ast.getContext());\n\t}\n\t\n\t/**\n\t * Convenient shortcut to the owning JavacAST object's toName method.\n\t * \n\t * @see JavacAST#toName(String)\n\t */\n\tpublic Name toName(String name) {\n\t\treturn ast.toName(name);\n\t}\n\t\n\tpublic void removeDeferredErrors() {\n\t\tast.removeDeferredErrors(this);\n\t}\n\t\n\t/**\n\t * Generates an compiler error focused on the AST node represented by this node object.\n\t */\n\t@Override public void addError(String message) {\n\t\tast.printMessage(Diagnostic.Kind.ERROR, message, this, null, true);\n\t}\n\t\n\t/**\n\t * Generates an compiler error focused on the AST node represented by this node object.\n\t */\n\tpublic void addError(String message, DiagnosticPosition pos) {\n\t\tast.printMessage(Diagnostic.Kind.ERROR, message, null, pos, true);\n\t}\n\t\n\t/**\n\t * Generates a compiler warning focused on the AST node represented by this node object.\n\t */\n\t@Override public void addWarning(String message) {\n\t\tast.printMessage(Diagnostic.Kind.WARNING, message, this, null, false);\n\t}\n\t\n\t/**\n\t * Generates a compiler warning focused on the AST node represented by this node object.\n\t */\n\tpublic void addWarning(String message, DiagnosticPosition pos) {\n\t\tast.printMessage(Diagnostic.Kind.WARNING, message, null, pos, false);\n\t}\n\t\n\t@Override public boolean hasAnnotation(Class<? extends Annotation> type) {\n\t\treturn JavacHandlerUtil.hasAnnotationAndDeleteIfNeccessary(type, this);\n\t}\n\t\n\t@Override public <Z extends Annotation> AnnotationValues<Z> findAnnotation(Class<Z> type) {\n\t\tJavacNode annotation = JavacHandlerUtil.findAnnotation(type, this, true);\n\t\tif (annotation == null) return null;\n\t\treturn JavacHandlerUtil.createAnnotation(type, annotation);\n\t}\n\t\n\tprivate JCModifiers getModifiers() {\n\t\tif (node instanceof JCClassDecl) return ((JCClassDecl) node).getModifiers();\n\t\tif (node instanceof JCMethodDecl) return ((JCMethodDecl) node).getModifiers();\n\t\tif (node instanceof JCVariableDecl) return ((JCVariableDecl) node).getModifiers();\n\t\treturn null;\n\t}\n\t\n\t@Override public boolean isStatic() {\n\t\tif (node instanceof JCClassDecl) {\n\t\t\tJCClassDecl t = (JCClassDecl) node;\n\t\t\tlong f = t.mods.flags;\n\t\t\tif (((Flags.INTERFACE | Flags.ENUM | Javac.RECORD) & f) != 0) return true;\n\t\t\tJavacNode directUp = directUp();\n\t\t\tif (directUp == null || directUp.getKind() == Kind.COMPILATION_UNIT) return true;\n\t\t\tif (!(directUp.get() instanceof JCClassDecl)) return false;\n\t\t\tJCClassDecl p = (JCClassDecl) directUp.get();\n\t\t\tf = p.mods.flags;\n\t\t\tif (((Flags.INTERFACE | Flags.ENUM) & f) != 0) return true;\n\t\t}\n\t\t\n\t\tif (node instanceof JCVariableDecl) {\n\t\t\tJavacNode directUp = directUp();\n\t\t\tif (directUp != null && directUp.get() instanceof JCClassDecl) {\n\t\t\t\tJCClassDecl p = (JCClassDecl) directUp.get();\n\t\t\t\tlong f = p.mods.flags;\n\t\t\t\tif ((Flags.INTERFACE & f) != 0) return true;\n\t\t\t}\n\t\t}\n\t\t\n\t\tJCModifiers mods = getModifiers();\n\t\tif (mods == null) return false;\n\t\treturn (mods.flags & Flags.STATIC) != 0;\n\t}\n\t\n\t@Override public boolean isFinal() {\n\t\tif (node instanceof JCVariableDecl) {\n\t\t\tJavacNode directUp = directUp();\n\t\t\tif (directUp != null && directUp.get() instanceof JCClassDecl) {\n\t\t\t\tJCClassDecl p = (JCClassDecl) directUp.get();\n\t\t\t\tlong f = p.mods.flags;\n\t\t\t\tif (((Flags.INTERFACE | Flags.ENUM) & f) != 0) return true;\n\t\t\t}\n\t\t\t\n\t\t}\n\t\tJCModifiers mods = getModifiers();\n\t\treturn mods != null && (Flags.FINAL & mods.flags) != 0;\n\t}\n\t\n\t@Override public boolean isEnumMember() {\n\t\tif (getKind() != Kind.FIELD) return false;\n\t\tJCModifiers mods = getModifiers();\n\t\treturn mods != null && (Flags.ENUM & mods.flags) != 0;\n\t}\n\t\n\t@Override public boolean isEnumType() {\n\t\tif (getKind() != Kind.TYPE) return false;\n\t\tJCModifiers mods = getModifiers();\n\t\treturn mods != null && (Flags.ENUM & mods.flags) != 0;\n\t}\n\t\n\t@Override public boolean isPrimitive() {\n\t\tif (node instanceof JCVariableDecl && !isEnumMember()) {\n\t\t\treturn Javac.isPrimitive(((JCVariableDecl) node).vartype);\n\t\t}\n\t\tif (node instanceof JCMethodDecl) {\n\t\t\treturn Javac.isPrimitive(((JCMethodDecl) node).restype);\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * {@inheritDoc}\n\t */\n\t@Override public String fieldOrMethodBaseType() {\n\t\tif (node instanceof JCVariableDecl && !isEnumMember()) {\n\t\t\treturn (((JCVariableDecl) node).vartype).toString();\n\t\t}\n\t\tif (node instanceof JCMethodDecl) {\n\t\t\treturn (((JCMethodDecl) node).restype).toString();\n\t\t}\n\t\treturn null;\n\t}\n\t\n\t@Override public boolean isTransient() {\n\t\tif (getKind() != Kind.FIELD) return false;\n\t\tJCModifiers mods = getModifiers();\n\t\treturn mods != null && (Flags.TRANSIENT & mods.flags) != 0;\n\t}\n\t\n\t@Override public int countMethodParameters() {\n\t\tif (getKind() != Kind.METHOD) return 0;\n\t\t\n\t\tcom.sun.tools.javac.util.List<JCVariableDecl> params = ((JCMethodDecl) node).params;\n\t\tif (params == null) return 0;\n\t\treturn params.size();\n\t}\n\t\n\t@Override public int getStartPos() {\n\t\treturn node.getPreferredPosition();\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/JavacResolution.java",
    "content": "/*\n * Copyright (C) 2011-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac;\n\nimport static lombok.javac.Javac.*;\nimport static lombok.javac.JavacTreeMaker.TypeTag.typeTag;\n\nimport java.lang.reflect.Field;\nimport java.lang.reflect.Method;\nimport java.util.ArrayDeque;\nimport java.util.Collection;\nimport java.util.Iterator;\nimport java.util.LinkedHashMap;\nimport java.util.Map;\nimport java.util.NoSuchElementException;\n\nimport javax.lang.model.type.TypeKind;\nimport javax.tools.JavaFileObject;\n\nimport com.sun.tools.javac.code.BoundKind;\nimport com.sun.tools.javac.code.Symbol.TypeSymbol;\nimport com.sun.tools.javac.code.Symtab;\nimport com.sun.tools.javac.code.Type;\nimport com.sun.tools.javac.code.Type.ArrayType;\nimport com.sun.tools.javac.code.Type.CapturedType;\nimport com.sun.tools.javac.code.Type.ClassType;\nimport com.sun.tools.javac.code.Type.TypeVar;\nimport com.sun.tools.javac.code.Type.WildcardType;\nimport com.sun.tools.javac.code.Types;\nimport com.sun.tools.javac.comp.ArgumentAttr;\nimport com.sun.tools.javac.comp.Attr;\nimport com.sun.tools.javac.comp.AttrContext;\nimport com.sun.tools.javac.comp.Enter;\nimport com.sun.tools.javac.comp.Env;\nimport com.sun.tools.javac.comp.MemberEnter;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCBlock;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCCompilationUnit;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.tree.JCTree.JCWildcard;\nimport com.sun.tools.javac.util.Context;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.ListBuffer;\nimport com.sun.tools.javac.util.Log;\nimport com.sun.tools.javac.util.Name;\n\nimport lombok.core.debug.AssertionLogger;\nimport lombok.permit.Permit;\n\npublic class JavacResolution {\n\tprivate final Context context;\n\tprivate final Attr attr;\n\tprivate final CompilerMessageSuppressor messageSuppressor;\n\t\n\tprivate static final Method isLocal;\n\t\n\tstatic {\n\t\tMethod local = Permit.permissiveGetMethod(TypeSymbol.class, \"isLocal\");\n\t\tif (local == null) {\n\t\t\tlocal = Permit.permissiveGetMethod(TypeSymbol.class, \"isDirectlyOrIndirectlyLocal\");\n\t\t}\n\t\tisLocal = local;\n\t}\n\t\n\tpublic JavacResolution(Context context) {\n\t\tthis.context = context;\n\t\tattr = Attr.instance(context);\n\t\tmessageSuppressor = new CompilerMessageSuppressor(context);\n\t}\n\t\n\t/*\n\t * We need to dig down to the level of the method or field declaration or (static) initializer block, then attribute that entire method/field/block using\n\t * the appropriate environment. So, we start from the top and walk down the node tree until we hit that method/field/block and stop there, recording both\n\t * the environment object (`env`) and the exact tree node (`copyAt`) at which to begin the attr process.\n\t */\n\tprivate static final class EnvFinder extends JCTree.Visitor {\n\t\tprivate Env<AttrContext> env = null;\n\t\tprivate Enter enter;\n\t\tprivate MemberEnter memberEnter;\n\t\tprivate JCTree copyAt = null;\n\t\t\n\t\tEnvFinder(Context context) {\n\t\t\tthis.enter = Enter.instance(context);\n\t\t\tthis.memberEnter = MemberEnter.instance(context);\n\t\t}\n\t\t\n\t\tEnv<AttrContext> get() {\n\t\t\treturn env;\n\t\t}\n\t\t\n\t\tJCTree copyAt() {\n\t\t\treturn copyAt;\n\t\t}\n\t\t\n\t\t@Override public void visitTopLevel(JCCompilationUnit tree) {\n\t\t\tif (copyAt != null) return;\n\t\t\tenv = enter.getTopLevelEnv(tree);\n\t\t}\n\t\t\n\t\t@Override public void visitClassDef(JCClassDecl tree) {\n\t\t\tif (copyAt != null) return;\n\t\t\tif (tree.sym != null) env = enter.getClassEnv(tree.sym);\n\t\t}\n\t\t\n\t\t@Override public void visitMethodDef(JCMethodDecl tree) {\n\t\t\tif (copyAt != null) return;\n\t\t\tenv = memberEnter.getMethodEnv(tree, env);\n\t\t\tcopyAt = tree;\n\t\t}\n\t\t\n\t\tpublic void visitVarDef(JCVariableDecl tree) {\n\t\t\tif (copyAt != null) return;\n\t\t\tenv = memberEnter.getInitEnv(tree, env);\n\t\t\tcopyAt = tree;\n\t\t}\n\t\t\n\t\t@Override public void visitBlock(JCBlock tree) {\n\t\t\tif (copyAt != null) return;\n\t\t\tcopyAt = tree;\n\t\t}\n\t\t\n\t\t@Override public void visitTree(JCTree that) {\n\t\t}\n\t}\n\t\n\tpublic Map<JCTree, JCTree> resolveMethodMember(JavacNode node) {\n\t\tArrayDeque<JCTree> stack = new ArrayDeque<JCTree>();\n\t\t\n\t\t{\n\t\t\tJavacNode n = node;\n\t\t\twhile (n != null) {\n\t\t\t\tstack.push(n.get());\n\t\t\t\tn = n.up();\n\t\t\t}\n\t\t}\n\t\t\n\t\tmessageSuppressor.disableLoggers();\n\t\ttry {\n\t\t\tEnvFinder finder = new EnvFinder(node.getContext());\n\t\t\twhile (!stack.isEmpty()) stack.pop().accept(finder);\n\t\t\t\n\t\t\tTreeMirrorMaker mirrorMaker = new TreeMirrorMaker(node.getTreeMaker(), node.getContext());\n\t\t\tJCTree copy = mirrorMaker.copy(finder.copyAt());\n\t\t\tLog log = Log.instance(node.getContext());\n\t\t\tJavaFileObject oldFileObject = log.useSource(((JCCompilationUnit) node.top().get()).getSourceFile());\n\t\t\ttry {\n\t\t\t\tmemberEnterAndAttribute(copy, finder.get(), node.getContext());\n\t\t\t\treturn mirrorMaker.getOriginalToCopyMap();\n\t\t\t} finally {\n\t\t\t\tlog.useSource(oldFileObject);\n\t\t\t}\n\t\t} finally {\n\t\t\tmessageSuppressor.enableLoggers();\n\t\t}\n\t}\n\t\n\tprivate static Field memberEnterDotEnv;\n\t\n\tprivate static Field getMemberEnterDotEnv() {\n\t\tif (memberEnterDotEnv != null) return memberEnterDotEnv;\n\t\ttry {\n\t\t\treturn memberEnterDotEnv = Permit.getField(MemberEnter.class, \"env\");\n\t\t} catch (NoSuchFieldException e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\t@SuppressWarnings(\"unchecked\")\n\tprivate static Env<AttrContext> getEnvOfMemberEnter(MemberEnter memberEnter) {\n\t\tField f = getMemberEnterDotEnv();\n\t\ttry {\n\t\t\treturn (Env<AttrContext>) f.get(memberEnter);\n\t\t} catch (Exception e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tprivate static void setEnvOfMemberEnter(MemberEnter memberEnter, Env<AttrContext> env) {\n\t\tField f = getMemberEnterDotEnv();\n\t\ttry {\n\t\t\tf.set(memberEnter, env);\n\t\t} catch (Exception e) {\n\t\t\treturn;\n\t\t}\n\t}\n\t\n\tprivate void memberEnterAndAttribute(JCTree copy, Env<AttrContext> env, Context context) {\n\t\tMemberEnter memberEnter = MemberEnter.instance(context);\n\t\tEnv<AttrContext> oldEnv = getEnvOfMemberEnter(memberEnter);\n\t\tsetEnvOfMemberEnter(memberEnter, env);\n\t\ttry {\n\t\t\tcopy.accept(memberEnter);\n\t\t} catch (Exception ignore) {\n\t\t\t// intentionally ignored; usually even if this step fails, val will work (but not for val in method local inner classes and anonymous inner classes).\n\t\t\tAssertionLogger.assertLog(\"member enter failed.\", ignore);\n\t\t} finally {\n\t\t\tsetEnvOfMemberEnter(memberEnter, oldEnv);\n\t\t}\n\t\tattrib(copy, env);\n\t}\n\t\n\tpublic void resolveClassMember(JavacNode node) {\n\t\tArrayDeque<JCTree> stack = new ArrayDeque<JCTree>();\n\t\t\n\t\t{\n\t\t\tJavacNode n = node;\n\t\t\twhile (n != null) {\n\t\t\t\tstack.push(n.get());\n\t\t\t\tn = n.up();\n\t\t\t}\n\t\t}\n\t\t\n\t\tmessageSuppressor.disableLoggers();\n\t\ttry {\n\t\t\tEnvFinder finder = new EnvFinder(node.getContext());\n\t\t\twhile (!stack.isEmpty()) stack.pop().accept(finder);\n\t\t\t\n\t\t\tattrib(node.get(), finder.get());\n\t\t} finally {\n\t\t\tmessageSuppressor.enableLoggers();\n\t\t}\n\t}\n\t\n\tprivate void attrib(JCTree tree, Env<AttrContext> env) {\n\t\ttry {\n\t\t\tif (env.enclClass.type == null) {\n\t\t\t\tif (env.enclClass.sym != null) {\n\t\t\t\t\tenv.enclClass.type = env.enclClass.sym.type;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (env.enclClass.type == null) {\n\t\t\t\tenv.enclClass.type = Type.noType;\n\t\t\t}\n\t\t} catch (Throwable ignore) {\n\t\t\t// This addresses issue #1553 which involves JDK9; if it doesn't exist, we probably don't need to set it.\n\t\t}\n\t\t\n\t\tMap<?,?> cache = null;\n\t\ttry {\n\t\t\tcache = ArgumentAttrReflect.enableTempCache(context);\n\t\t\t\n\t\t\tif (tree instanceof JCBlock) attr.attribStat(tree, env);\n\t\t\telse if (tree instanceof JCMethodDecl) attr.attribStat(((JCMethodDecl) tree).body, env);\n\t\t\telse if (tree instanceof JCVariableDecl) attr.attribStat(tree, env);\n\t\t\telse throw new IllegalStateException(\"Called with something that isn't a block, method decl, or variable decl\");\n\t\t} finally {\n\t\t\tArgumentAttrReflect.restoreCache(cache, context);\n\t\t}\n\t\t\n\t}\n\t\n\tpublic static class TypeNotConvertibleException extends Exception {\n\t\tpublic TypeNotConvertibleException(String msg) {\n\t\t\tsuper(msg);\n\t\t}\n\t}\n\t\n\tprivate static class ReflectiveAccess {\n\t\tprivate static Method UPPER_BOUND;\n\t\tprivate static Throwable initError;\n\t\t\n\t\tstatic {\n\t\t\tMethod upperBound = null;\n\t\t\ttry {\n\t\t\t\tupperBound = Permit.getMethod(Types.class, \"upperBound\", Type.class);\n\t\t\t} catch (Throwable e) {\n\t\t\t\tinitError = e;\n\t\t\t}\n\t\t\t\n\t\t\tif (upperBound == null) try {\n\t\t\t\tupperBound = Permit.getMethod(Types.class, \"wildUpperBound\", Type.class);\n\t\t\t} catch (Throwable e) {\n\t\t\t\tinitError = e;\n\t\t\t}\n\t\t\t\n\t\t\tUPPER_BOUND = upperBound;\n\t\t}\n\t\t\n\t\tpublic static Type Types_upperBound(Types types, Type type) {\n\t\t\treturn (Type) Permit.invokeSneaky(initError, UPPER_BOUND, types, type);\n\t\t}\n\t}\n\t\n\t/**\n\t * ArgumentAttr was added in Java 9 and caches some method arguments. Lombok should cleanup its changes after resolution.\n\t */\n\tprivate static class ArgumentAttrReflect {\n\t\tprivate static Field ARGUMENT_TYPE_CACHE;\n\t\t\n\t\tstatic {\n\t\t\tif (Javac.getJavaCompilerVersion() >= 9) {\n\t\t\t\ttry {\n\t\t\t\t\tARGUMENT_TYPE_CACHE = Permit.getField(ArgumentAttr.class, \"argumentTypeCache\");\n\t\t\t\t} catch (Exception ignore) {}\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic static Map<?, ?> enableTempCache(Context context) {\n\t\t\tif (ARGUMENT_TYPE_CACHE == null) return null;\n\t\t\t\n\t\t\tArgumentAttr argumentAttr = ArgumentAttr.instance(context);\n\t\t\ttry {\n\t\t\t\tMap<?, ?> cache = (Map<?, ?>) Permit.get(ARGUMENT_TYPE_CACHE, argumentAttr);\n\t\t\t\tPermit.set(ARGUMENT_TYPE_CACHE, argumentAttr, new LinkedHashMap<Object, Object>(cache));\n\t\t\t\treturn cache;\n\t\t\t} catch (Exception ignore) { }\n\t\t\t\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\tpublic static void restoreCache(Map<?, ?> cache, Context context) {\n\t\t\tif (ARGUMENT_TYPE_CACHE == null) return;\n\t\t\t\n\t\t\tArgumentAttr argumentAttr = ArgumentAttr.instance(context);\n\t\t\ttry {\n\t\t\t\tPermit.set(ARGUMENT_TYPE_CACHE, argumentAttr, cache);\n\t\t\t} catch (Exception ignore) { }\n\t\t}\n\t}\n\t\n\tpublic static Type ifTypeIsIterableToComponent(Type type, JavacAST ast) {\n\t\tif (type == null) return null;\n\t\tTypes types = Types.instance(ast.getContext());\n\t\tSymtab syms = Symtab.instance(ast.getContext());\n\t\tType boundType = ReflectiveAccess.Types_upperBound(types, type);\n//\t\tType boundType = types.upperBound(type);\n\t\tType elemTypeIfArray = types.elemtype(boundType);\n\t\tif (elemTypeIfArray != null) return elemTypeIfArray;\n\t\t\n\t\tType base = types.asSuper(boundType, syms.iterableType.tsym);\n\t\tif (base == null) return syms.objectType;\n\t\t\n\t\tList<Type> iterableParams = base.allparams();\n\t\treturn iterableParams.isEmpty() ? syms.objectType : ReflectiveAccess.Types_upperBound(types, iterableParams.head);\n\t}\n\t\n\tpublic static JCExpression typeToJCTree(Type type, JavacAST ast, boolean allowVoid) throws TypeNotConvertibleException {\n\t\treturn typeToJCTree(type, ast, false, allowVoid, false);\n\t}\n\t\n\tpublic static JCExpression createJavaLangObject(JavacAST ast) {\n\t\tJavacTreeMaker maker = ast.getTreeMaker();\n\t\tJCExpression out = maker.Ident(ast.toName(\"java\"));\n\t\tout = maker.Select(out, ast.toName(\"lang\"));\n\t\tout = maker.Select(out, ast.toName(\"Object\"));\n\t\treturn out;\n\t}\n\t\n\tprivate static JCExpression typeToJCTree(Type type, JavacAST ast, boolean allowCompound, boolean allowVoid, boolean allowCapture) throws TypeNotConvertibleException {\n\t\tint dims = 0;\n\t\tType type0 = type;\n\t\twhile (type0 instanceof ArrayType) {\n\t\t\tdims++;\n\t\t\ttype0 = ((ArrayType) type0).elemtype;\n\t\t}\n\t\t\n\t\tJCExpression result = typeToJCTree0(type0, ast, allowCompound, allowVoid, allowCapture);\n\t\twhile (dims > 0) {\n\t\t\tresult = ast.getTreeMaker().TypeArray(result);\n\t\t\tdims--;\n\t\t}\n\t\treturn result;\n\t}\n\t\n\tprivate static Iterable<? extends Type> concat(final Type t, final Collection<? extends Type> ts) {\n\t\tif (t == null) return ts;\n\t\t\n\t\treturn new Iterable<Type>() {\n\t\t\t@Override public Iterator<Type> iterator() {\n\t\t\t\treturn new Iterator<Type>() {\n\t\t\t\t\tprivate boolean first = true;\n\t\t\t\t\tprivate Iterator<? extends Type> wrap = ts == null ? null : ts.iterator();\n\t\t\t\t\t@Override public boolean hasNext() {\n\t\t\t\t\t\tif (first) return true;\n\t\t\t\t\t\tif (wrap == null) return false;\n\t\t\t\t\t\treturn wrap.hasNext();\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t@Override public Type next() {\n\t\t\t\t\t\tif (first) {\n\t\t\t\t\t\t\tfirst = false;\n\t\t\t\t\t\t\treturn t;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (wrap == null) throw new NoSuchElementException();\n\t\t\t\t\t\treturn wrap.next();\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t@Override public void remove() {\n\t\t\t\t\t\tthrow new UnsupportedOperationException();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\t\t};\n\t}\n\t\n\tprivate static int compare(Name a, Name b) {\n\t\treturn a.toString().compareTo(b.toString());\n\t}\n\t\n\tprivate static boolean isLocalType(TypeSymbol symbol) {\n\t\ttry {\n\t\t\treturn (Boolean) Permit.invoke(isLocal, symbol);\n\t\t}\n\t\tcatch (Exception e) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\tprivate static JCExpression typeToJCTree0(Type type, JavacAST ast, boolean allowCompound, boolean allowVoid, boolean allowCapture) throws TypeNotConvertibleException {\n\t\t// NB: There's such a thing as maker.Type(type), but this doesn't work very well; it screws up anonymous classes, captures, and adds an extra prefix dot for some reason too.\n\t\t//  -- so we write our own take on that here.\n\t\t\n\t\tJavacTreeMaker maker = ast.getTreeMaker();\n\t\t\n\t\tif (CTC_BOT.equals(typeTag(type))) return createJavaLangObject(ast);\n\t\tif (CTC_VOID.equals(typeTag(type))) return allowVoid ? primitiveToJCTree(type.getKind(), maker) : createJavaLangObject(ast);\n\t\tif (type.isPrimitive()) return primitiveToJCTree(type.getKind(), maker);\n\t\tif (type.isErroneous()) throw new TypeNotConvertibleException(\"Type cannot be resolved\");\n\t\t\n\t\tTypeSymbol symbol = type.asElement();\n\t\tList<Type> generics = type.getTypeArguments();\n\t\t\n\t\tJCExpression replacement = null;\n\t\t\n\t\tif (symbol == null) throw new TypeNotConvertibleException(\"Null or compound type\");\n\t\t\n\t\tif (symbol.name.length() == 0) {\n\t\t\t// Anonymous inner class\n\t\t\tif (type instanceof ClassType) {\n\t\t\t\tType winner = null;\n\t\t\t\tint winLevel = 0; // 100 = array, 50 = class, 20 = typevar, 15 = wildcard, 10 = interface, 1 = Object.\n\t\t\t\tType supertype = ((ClassType) type).supertype_field;\n\t\t\t\tList<Type> ifaces = ((ClassType) type).interfaces_field;\n\t\t\t\tfor (Type t : concat(supertype, ifaces)) {\n\t\t\t\t\tint level = 0;\n\t\t\t\t\tif (t instanceof ArrayType) level = 100;\n\t\t\t\t\telse if (t instanceof TypeVar) level = 20;\n\t\t\t\t\telse if (t instanceof WildcardType) level = 15;\n\t\t\t\t\telse if (t.isInterface()) level = 10;\n\t\t\t\t\telse if (isObject(t)) level = 1;\n\t\t\t\t\telse if (t instanceof ClassType) level = 50;\n\t\t\t\t\telse level = 5;\n\t\t\t\t\t\n\t\t\t\t\tif (winLevel > level) continue;\n\t\t\t\t\tif (winLevel < level) {\n\t\t\t\t\t\twinner = t;\n\t\t\t\t\t\twinLevel = level;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (compare(winner.tsym.getQualifiedName(), t.tsym.getQualifiedName()) > 0) winner = t;\n\t\t\t\t}\n\t\t\t\tif (winner == null) return createJavaLangObject(ast);\n\t\t\t\treturn typeToJCTree(winner, ast, allowCompound, allowVoid, allowCapture);\n\t\t\t}\n\t\t\tthrow new TypeNotConvertibleException(\"Anonymous inner class\");\n\t\t}\n\t\t\n\t\tif (type instanceof WildcardType || type instanceof CapturedType) {\n\t\t\tType lower, upper;\n\t\t\tif (type instanceof WildcardType) {\n\t\t\t\tupper = ((WildcardType) type).getExtendsBound();\n\t\t\t\tlower = ((WildcardType) type).getSuperBound();\n\t\t\t} else {\n\t\t\t\tlower = type.getLowerBound();\n\t\t\t\tupper = type.getUpperBound();\n\t\t\t\tif (allowCapture) {\n\t\t\t\t\tBoundKind bk = ((CapturedType) type).wildcard.kind;\n\t\t\t\t\tif (bk == BoundKind.UNBOUND) {\n\t\t\t\t\t\treturn maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null);\n\t\t\t\t\t} else if (bk == BoundKind.EXTENDS) {\n\t\t\t\t\t\tlower = null;\n\t\t\t\t\t\tupper = ((CapturedType) type).wildcard.type;\n\t\t\t\t\t} else if (bk == BoundKind.SUPER) {\n\t\t\t\t\t\tlower = ((CapturedType) type).wildcard.type;\n\t\t\t\t\t\tupper = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (allowCompound) {\n\t\t\t\tif (lower == null || CTC_BOT.equals(typeTag(lower))) {\n\t\t\t\t\tif (upper == null || upper.toString().equals(\"java.lang.Object\")) {\n\t\t\t\t\t\treturn maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null);\n\t\t\t\t\t}\n\t\t\t\t\tif (upper.getTypeArguments().contains(type)) {\n\t\t\t\t\t\treturn maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null);\n\t\t\t\t\t}\n\t\t\t\t\tJCExpression bound = typeToJCTree(upper, ast, false, false, true);\n\t\t\t\t\tif (bound instanceof JCWildcard) return maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null);\n\t\t\t\t\treturn maker.Wildcard(maker.TypeBoundKind(BoundKind.EXTENDS), bound);\n\t\t\t\t} else {\n\t\t\t\t\tJCExpression bound = typeToJCTree(lower, ast, false, false, true);\n\t\t\t\t\tif (bound instanceof JCWildcard) return maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null);\n\t\t\t\t\treturn maker.Wildcard(maker.TypeBoundKind(BoundKind.SUPER), bound);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (upper != null) {\n\t\t\t\tif (upper.getTypeArguments().contains(type)) {\n\t\t\t\t\treturn maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null);\n\t\t\t\t}\n\t\t\t\treturn typeToJCTree(upper, ast, allowCompound, allowVoid, true);\n\t\t\t}\n\t\t\t\n\t\t\treturn createJavaLangObject(ast);\n\t\t}\n\t\t\n\t\tString qName;\n\t\tif (isLocalType(symbol)) {\n\t\t\tqName = symbol.getSimpleName().toString();\n\t\t} else if (symbol.type != null && symbol.type.getEnclosingType() != null && typeTag(symbol.type.getEnclosingType()).equals(typeTag(\"CLASS\"))) {\n\t\t\treplacement = typeToJCTree0(type.getEnclosingType(), ast, false, false, false);\n\t\t\tqName = symbol.getSimpleName().toString();\n\t\t} else {\n\t\t\tqName = symbol.getQualifiedName().toString();\n\t\t}\n\t\t\n\t\tif (qName.isEmpty()) throw new TypeNotConvertibleException(\"unknown type\");\n\t\tif (qName.startsWith(\"<\")) throw new TypeNotConvertibleException(qName);\n\t\tString[] baseNames = qName.split(\"\\\\.\");\n\t\tint i = 0;\n\t\t\n\t\tif (replacement == null) {\n\t\t\treplacement = maker.Ident(ast.toName(baseNames[0]));\n\t\t\ti = 1;\n\t\t}\n\t\tfor (; i < baseNames.length; i++) {\n\t\t\treplacement = maker.Select(replacement, ast.toName(baseNames[i]));\n\t\t}\n\t\t\n\t\treturn genericsToJCTreeNodes(generics, ast, replacement);\n\t}\n\t\n\tprivate static boolean isObject(Type supertype) {\n\t\treturn supertype.tsym.toString().equals(\"java.lang.Object\");\n\t}\n\t\n\tprivate static JCExpression genericsToJCTreeNodes(List<Type> generics, JavacAST ast, JCExpression rawTypeNode) throws TypeNotConvertibleException {\n\t\tif (generics != null && !generics.isEmpty()) {\n\t\t\tListBuffer<JCExpression> args = new ListBuffer<JCExpression>();\n\t\t\tfor (Type t : generics) args.append(typeToJCTree(t, ast, true, false, true));\n\t\t\treturn ast.getTreeMaker().TypeApply(rawTypeNode, args.toList());\n\t\t}\n\t\t\n\t\treturn rawTypeNode;\n\t}\n\t\n\tprivate static JCExpression primitiveToJCTree(TypeKind kind, JavacTreeMaker maker) throws TypeNotConvertibleException {\n\t\tswitch (kind) {\n\t\tcase BYTE:\n\t\t\treturn maker.TypeIdent(CTC_BYTE);\n\t\tcase CHAR:\n\t\t\treturn maker.TypeIdent( CTC_CHAR);\n\t\tcase SHORT:\n\t\t\treturn maker.TypeIdent(CTC_SHORT);\n\t\tcase INT:\n\t\t\treturn maker.TypeIdent(CTC_INT);\n\t\tcase LONG:\n\t\t\treturn maker.TypeIdent(CTC_LONG);\n\t\tcase FLOAT:\n\t\t\treturn maker.TypeIdent(CTC_FLOAT);\n\t\tcase DOUBLE:\n\t\t\treturn maker.TypeIdent(CTC_DOUBLE);\n\t\tcase BOOLEAN:\n\t\t\treturn maker.TypeIdent(CTC_BOOLEAN);\n\t\tcase VOID:\n\t\t\treturn maker.TypeIdent(CTC_VOID);\n\t\tcase NULL:\n\t\tcase NONE:\n\t\tcase OTHER:\n\t\tdefault:\n\t\t\tthrow new TypeNotConvertibleException(\"Nulltype\");\n\t\t}\n\t}\n\t\n\tpublic static boolean platformHasTargetTyping() {\n\t\treturn Javac.getJavaCompilerVersion() >= 8;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/JavacTransformer.java",
    "content": "/*\n * Copyright (C) 2009-2019 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac;\n\nimport java.util.List;\nimport java.util.SortedSet;\n\nimport javax.annotation.processing.Messager;\n\nimport com.sun.source.util.Trees;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCCompilationUnit;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.util.Context;\n\nimport lombok.ConfigurationKeys;\nimport lombok.core.CleanupRegistry;\nimport lombok.core.LombokConfiguration;\n\npublic class JavacTransformer {\n\tprivate final HandlerLibrary handlers;\n\tprivate final Messager messager;\n\t\n\tpublic JavacTransformer(Messager messager, Trees trees) {\n\t\tthis.messager = messager;\n\t\tthis.handlers = HandlerLibrary.load(messager, trees);\n\t}\n\t\n\tpublic SortedSet<Long> getPriorities() {\n\t\treturn handlers.getPriorities();\n\t}\n\t\n\tpublic SortedSet<Long> getPrioritiesRequiringResolutionReset() {\n\t\treturn handlers.getPrioritiesRequiringResolutionReset();\n\t}\n\t\n\tpublic void transform(long priority, Context context, List<JCCompilationUnit> compilationUnits, CleanupRegistry cleanup) {\n\t\tif (compilationUnits.isEmpty()) {\n\t\t\treturn;\n\t\t}\n\t\tJavacAST.ErrorLog errorLog = JavacAST.ErrorLog.create(messager, context);\n\t\tfor (JCCompilationUnit unit : compilationUnits) {\n\t\t\tif (!Boolean.TRUE.equals(LombokConfiguration.read(ConfigurationKeys.LOMBOK_DISABLE, JavacAST.getAbsoluteFileLocation(unit)))) {\n\t\t\t\tJavacAST ast = new JavacAST(errorLog, context, unit, cleanup);\n\t\t\t\tast.traverse(new AnnotationVisitor(priority));\n\t\t\t\thandlers.callASTVisitors(ast, priority);\n\t\t\t\tif (ast.isChanged()) LombokOptions.markChanged(context, (JCCompilationUnit) ast.top().get());\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate class AnnotationVisitor extends JavacASTAdapter {\n\t\tprivate final long priority;\n\t\t\n\t\tAnnotationVisitor(long priority) {\n\t\t\tthis.priority = priority;\n\t\t}\n\t\t\n\t\t@Override public void visitAnnotationOnType(JCClassDecl type, JavacNode annotationNode, JCAnnotation annotation) {\n\t\t\tJCCompilationUnit top = (JCCompilationUnit) annotationNode.top().get();\n\t\t\thandlers.handleAnnotation(top, annotationNode, annotation, priority);\n\t\t}\n\t\t\n\t\t@Override public void visitAnnotationOnField(JCVariableDecl field, JavacNode annotationNode, JCAnnotation annotation) {\n\t\t\tJCCompilationUnit top = (JCCompilationUnit) annotationNode.top().get();\n\t\t\thandlers.handleAnnotation(top, annotationNode, annotation, priority);\n\t\t}\n\t\t\n\t\t@Override public void visitAnnotationOnMethod(JCMethodDecl method, JavacNode annotationNode, JCAnnotation annotation) {\n\t\t\tJCCompilationUnit top = (JCCompilationUnit) annotationNode.top().get();\n\t\t\thandlers.handleAnnotation(top, annotationNode, annotation, priority);\n\t\t}\n\t\t\n\t\t@Override public void visitAnnotationOnMethodArgument(JCVariableDecl argument, JCMethodDecl method, JavacNode annotationNode, JCAnnotation annotation) {\n\t\t\tJCCompilationUnit top = (JCCompilationUnit) annotationNode.top().get();\n\t\t\thandlers.handleAnnotation(top, annotationNode, annotation, priority);\n\t\t}\n\t\t\n\t\t@Override public void visitAnnotationOnLocal(JCVariableDecl local, JavacNode annotationNode, JCAnnotation annotation) {\n\t\t\tJCCompilationUnit top = (JCCompilationUnit) annotationNode.top().get();\n\t\t\thandlers.handleAnnotation(top, annotationNode, annotation, priority);\n\t\t}\n\t\t\n\t\t@Override public void visitAnnotationOnTypeUse(JCTree typeUse, JavacNode annotationNode, JCAnnotation annotation) {\n\t\t\tJCCompilationUnit top = (JCCompilationUnit) annotationNode.top().get();\n\t\t\thandlers.handleAnnotation(top, annotationNode, annotation, priority);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/LombokOptions.java",
    "content": "/*\n * Copyright (C) 2010-2013 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac;\n\nimport java.util.HashSet;\nimport java.util.Set;\n\nimport lombok.delombok.FormatPreferences;\nimport lombok.delombok.LombokOptionsFactory;\n\nimport com.sun.tools.javac.tree.JCTree.JCCompilationUnit;\nimport com.sun.tools.javac.util.Context;\nimport com.sun.tools.javac.util.Options;\n\npublic abstract class LombokOptions extends Options {\n\tprivate boolean deleteLombokAnnotations = false;\n\tprivate final Set<JCCompilationUnit> changed = new HashSet<JCCompilationUnit>();\n\tprivate FormatPreferences formatPreferences = new FormatPreferences(null);\n\t\n\tpublic boolean isChanged(JCCompilationUnit ast) {\n\t\treturn changed.contains(ast);\n\t}\n\t\n\tpublic void setFormatPreferences(FormatPreferences formatPreferences) {\n\t\tthis.formatPreferences = formatPreferences;\n\t}\n\t\n\tpublic FormatPreferences getFormatPreferences() {\n\t\treturn this.formatPreferences;\n\t}\n\t\n\tpublic static void markChanged(Context context, JCCompilationUnit ast) {\n\t\tLombokOptions options = LombokOptionsFactory.getDelombokOptions(context);\n\t\toptions.changed.add(ast);\n\t}\n\t\n\tpublic static boolean shouldDeleteLombokAnnotations(Context context) {\n\t\tLombokOptions options = LombokOptionsFactory.getDelombokOptions(context);\n\t\treturn options.deleteLombokAnnotations;\n\t}\n\t\n\tprotected LombokOptions(Context context) {\n\t\tsuper(context);\n\t}\n\t\n\tpublic abstract void putJavacOption(String optionName, String value);\n\t\n\tpublic void deleteLombokAnnotations() {\n\t\tthis.deleteLombokAnnotations = true;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/ResolutionResetNeeded.java",
    "content": "/*\n * Copyright (C) 2012 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n/**\n * Marks the annotated handler as needing a reset on the resolved model (resulting in generated methods' signatures from becoming part of the symbol table and such) before\n * the priority level of this handler is reached.\n */\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface ResolutionResetNeeded {\n\t\n}\n"
  },
  {
    "path": "src/core/lombok/javac/apt/InterceptingJavaFileManager.java",
    "content": "/*\n * Copyright (C) 2010-2019 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.apt;\n\nimport java.io.IOException;\n\nimport javax.tools.FileObject;\nimport javax.tools.ForwardingJavaFileManager;\nimport javax.tools.JavaFileManager;\nimport javax.tools.JavaFileObject;\nimport javax.tools.JavaFileObject.Kind;\n\nimport lombok.core.DiagnosticsReceiver;\n\nfinal class InterceptingJavaFileManager extends ForwardingJavaFileManager<JavaFileManager> {\n\tprivate final DiagnosticsReceiver diagnostics;\n\tprivate final LombokFileObjects.Compiler compiler;\n\t\n\tInterceptingJavaFileManager(JavaFileManager original, DiagnosticsReceiver diagnostics) {\n\t\tsuper(original);\n\t\tthis.compiler = LombokFileObjects.getCompiler(original);\n\t\tthis.diagnostics = diagnostics;\n\t}\n\t\n\t@Override public JavaFileObject getJavaFileForOutput(Location location, String className, final Kind kind, FileObject sibling) throws IOException {\n\t\tJavaFileObject fileObject = fileManager.getJavaFileForOutput(location, className, kind, sibling);\n\t\tif (kind != Kind.CLASS) return fileObject;\n\t\t\n\t\treturn LombokFileObjects.createIntercepting(compiler, fileObject, className, diagnostics);\n\t}\n}"
  },
  {
    "path": "src/core/lombok/javac/apt/InterceptingJavaFileObject.java",
    "content": "/*\n * Copyright (C) 2010-2011 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.apt;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.OutputStream;\nimport java.io.Reader;\nimport java.io.Writer;\nimport java.lang.reflect.Method;\nimport java.net.URI;\nimport java.nio.charset.CharsetDecoder;\n\nimport javax.lang.model.element.Modifier;\nimport javax.lang.model.element.NestingKind;\nimport javax.tools.JavaFileObject;\n\nimport lombok.core.DiagnosticsReceiver;\nimport lombok.core.PostCompiler;\nimport lombok.permit.Permit;\n\nfinal class InterceptingJavaFileObject implements LombokFileObject {\n\tprivate final JavaFileObject delegate;\n\tprivate final String fileName;\n\tprivate final DiagnosticsReceiver diagnostics;\n\tprivate final Method decoderMethod;\n\t\n\tpublic InterceptingJavaFileObject(JavaFileObject original, String fileName, DiagnosticsReceiver diagnostics, Method decoderMethod) {\n\t\tthis.delegate = original;\n\t\tthis.fileName = fileName;\n\t\tthis.diagnostics = diagnostics;\n\t\tthis.decoderMethod = decoderMethod;\n\t}\n\t\n\t@Override\n\tpublic OutputStream openOutputStream() throws IOException {\n\t\treturn PostCompiler.wrapOutputStream(delegate.openOutputStream(), fileName, diagnostics);\n\t}\n\t\n\t@Override\n\tpublic Writer openWriter() throws IOException {\n\t\tthrow new UnsupportedOperationException(\"Can't use a write for class files\");\n\t}\n\t\n\t@Override public CharsetDecoder getDecoder(boolean ignoreEncodingErrors) {\n\t\tif (decoderMethod == null) throw new UnsupportedOperationException();\n\t\treturn (CharsetDecoder) Permit.invokeSneaky(decoderMethod, delegate, ignoreEncodingErrors);\n\t}\t\n\t\n\t@Override public boolean equals(Object obj) {\n\t\tif (!(obj instanceof InterceptingJavaFileObject)) {\n\t\t\treturn false;\n\t\t}\n\t\tif (obj == this) {\n\t\t\treturn true;\n\t\t}\n\t\tInterceptingJavaFileObject other = (InterceptingJavaFileObject) obj;\n\t\treturn fileName.equals(other.fileName) && delegate.equals(other.delegate);\n\t}\n\t\n\t@Override public int hashCode() {\n\t\treturn fileName.hashCode() ^ delegate.hashCode();\n\t}\n\t\n\t\n/////////////////////// NOTHING CHANGED BELOW //////////////////////////////////////\n\t\n\t@Override\n\tpublic boolean delete() {\n\t\treturn delegate.delete();\n\t}\n\t\n\t@Override\n\tpublic Modifier getAccessLevel() {\n\t\treturn delegate.getAccessLevel();\n\t}\n\t\n\t@Override\n\tpublic CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {\n\t\treturn delegate.getCharContent(ignoreEncodingErrors);\n\t}\n\t\n\t@Override\n\tpublic Kind getKind() {\n\t\treturn delegate.getKind();\n\t}\n\t\n\t@Override\n\tpublic long getLastModified() {\n\t\treturn delegate.getLastModified();\n\t}\n\t\n\t@Override\n\t@SuppressWarnings(\"all\")\n\tpublic String getName() {\n\t\treturn delegate.getName();\n\t}\n\t\n\t@Override\n\tpublic NestingKind getNestingKind() {\n\t\treturn delegate.getNestingKind();\n\t}\n\t\n\t@Override\n\tpublic boolean isNameCompatible(String simpleName, Kind kind) {\n\t\treturn delegate.isNameCompatible(simpleName, kind);\n\t}\n\t\n\t@Override\n\tpublic InputStream openInputStream() throws IOException {\n\t\treturn delegate.openInputStream();\n\t}\n\t\n\t@Override\n\tpublic Reader openReader(boolean ignoreEncodingErrors) throws IOException {\n\t\treturn delegate.openReader(ignoreEncodingErrors);\n\t}\n\t\n\t@Override\n\tpublic URI toUri() {\n\t\treturn delegate.toUri();\n\t}\n\t\n\t@Override\n\tpublic String toString() {\n\t\treturn delegate.toString();\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/apt/Javac6BaseFileObjectWrapper.java",
    "content": "/*\n * Copyright (C) 2010-2011 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\npackage lombok.javac.apt;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.OutputStream;\nimport java.io.Reader;\nimport java.io.Writer;\nimport java.net.URI;\nimport java.nio.charset.CharsetDecoder;\n\nimport javax.lang.model.element.Modifier;\nimport javax.lang.model.element.NestingKind;\n\n// Weird SuppressWarnings, but javac doesn't understand 'all' and eclipse doesn't understand that this file contains deprecation references.\n@SuppressWarnings({\"all\", \"deprecation\"})\nclass Javac6BaseFileObjectWrapper extends com.sun.tools.javac.util.BaseFileObject {\n\tprivate final LombokFileObject delegate;\n\t\n\tpublic Javac6BaseFileObjectWrapper(LombokFileObject delegate) {\n\t\tthis.delegate = delegate;\n\t}\n\t\n\t@Override public boolean isNameCompatible(String simpleName, Kind kind) {\n\t\treturn delegate.isNameCompatible(simpleName, kind);\n\t}\n\t\n\t@Override public URI toUri() {\n\t\treturn delegate.toUri();\n\t}\n\t\n\t@Override public String getName() {\n\t\treturn delegate.getName();\n\t}\n\t\n\t@Override public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {\n\t\treturn delegate.getCharContent(ignoreEncodingErrors);\n\t}\n\t\n\t@Override public InputStream openInputStream() throws IOException {\n\t\treturn delegate.openInputStream();\n\t}\n\t\n\t@Override public Reader openReader(boolean ignoreEncodingErrors) throws IOException {\n\t\treturn delegate.openReader(ignoreEncodingErrors);\n\t}\n\t\n\t@Override public Writer openWriter() throws IOException {\n\t\treturn delegate.openWriter();\n\t}\n\t\n\t@Override public OutputStream openOutputStream() throws IOException {\n\t\treturn delegate.openOutputStream();\n\t}\n\t\n\t@Override public long getLastModified() {\n\t\treturn delegate.getLastModified();\n\t}\n\t\n\t@Override public boolean delete() {\n\t\treturn delegate.delete();\n\t}\n\t\n\t@Override public Kind getKind() {\n\t\treturn delegate.getKind();\n\t}\n\t\n\t@Override public NestingKind getNestingKind() {\n\t\treturn delegate.getNestingKind();\n\t}\n\t\n\t@Override public Modifier getAccessLevel() {\n\t\treturn delegate.getAccessLevel();\n\t}\n\t\n\tprotected CharsetDecoder getDecoder(boolean ignoreEncodingErrors) {\n\t\treturn delegate.getDecoder(ignoreEncodingErrors);\n\t}\n\t\n\t@Override public boolean equals(Object obj) {\n\t\tif (!(obj instanceof Javac6BaseFileObjectWrapper)) {\n\t\t\treturn false;\n\t\t}\n\t\treturn delegate.equals(((Javac6BaseFileObjectWrapper)obj).delegate);\n\t}\n\t\n\t@Override public int hashCode() {\n\t\treturn delegate.hashCode();\n\t}\n\t\n\t@Override public String toString() {\n\t\treturn delegate.toString();\n\t}\n}"
  },
  {
    "path": "src/core/lombok/javac/apt/Javac7BaseFileObjectWrapper.java",
    "content": "/*\n * Copyright (C) 2010-2011 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\npackage lombok.javac.apt;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.OutputStream;\nimport java.io.Reader;\nimport java.io.Writer;\nimport java.net.URI;\nimport java.nio.charset.CharsetDecoder;\n\nimport javax.lang.model.element.Modifier;\nimport javax.lang.model.element.NestingKind;\n\nclass Javac7BaseFileObjectWrapper extends com.sun.tools.javac.file.BaseFileObject {\n\tprivate final LombokFileObject delegate;\n\t\n\tpublic Javac7BaseFileObjectWrapper(LombokFileObject delegate) {\n\t\tsuper(null);\n\t\tthis.delegate = delegate;\n\t}\n\t\n\t@Override public boolean isNameCompatible(String simpleName, Kind kind) {\n\t\treturn delegate.isNameCompatible(simpleName, kind);\n\t}\n\t\n\t@Override public URI toUri() {\n\t\treturn delegate.toUri();\n\t}\n\t\n\t@SuppressWarnings(\"all\")\n\t@Override public String getName() {\n\t\treturn delegate.getName();\n\t}\n\t\n\t@Override public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {\n\t\treturn delegate.getCharContent(ignoreEncodingErrors);\n\t}\n\t\n\t@Override public InputStream openInputStream() throws IOException {\n\t\treturn delegate.openInputStream();\n\t}\n\t\n\t@Override public Reader openReader(boolean ignoreEncodingErrors) throws IOException {\n\t\treturn delegate.openReader(ignoreEncodingErrors);\n\t}\n\t\n\t@Override public Writer openWriter() throws IOException {\n\t\treturn delegate.openWriter();\n\t}\n\t\n\t@Override public OutputStream openOutputStream() throws IOException {\n\t\treturn delegate.openOutputStream();\n\t}\n\t\n\t@Override public long getLastModified() {\n\t\treturn delegate.getLastModified();\n\t}\n\t\n\t@Override public boolean delete() {\n\t\treturn delegate.delete();\n\t}\n\t\n\t@Override public Kind getKind() {\n\t\treturn delegate.getKind();\n\t}\n\t\n\t@Override public NestingKind getNestingKind() {\n\t\treturn delegate.getNestingKind();\n\t}\n\t\n\t@Override public Modifier getAccessLevel() {\n\t\treturn delegate.getAccessLevel();\n\t}\n\t\n\tprotected CharsetDecoder getDecoder(boolean ignoreEncodingErrors) {\n\t\treturn delegate.getDecoder(ignoreEncodingErrors);\n\t}\n\t\n\t@Override public boolean equals(Object obj) {\n\t\tif (!(obj instanceof Javac7BaseFileObjectWrapper)) {\n\t\t\treturn false;\n\t\t}\n\t\treturn delegate.equals(((Javac7BaseFileObjectWrapper)obj).delegate);\n\t}\n\t\n\t@Override public int hashCode() {\n\t\treturn delegate.hashCode();\n\t}\n\t\n\t@Override public String toString() {\n\t\treturn delegate.toString();\n\t}\n}"
  },
  {
    "path": "src/core/lombok/javac/apt/Javac9JavaFileObjectWrapper.java",
    "content": "/*\n * Copyright (C) 2018 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\npackage lombok.javac.apt;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.OutputStream;\nimport java.io.Reader;\nimport java.io.Writer;\nimport java.net.URI;\n\nimport javax.lang.model.element.Modifier;\nimport javax.lang.model.element.NestingKind;\n\nclass Javac9JavaFileObjectWrapper implements javax.tools.JavaFileObject {\n\tprivate final LombokFileObject delegate;\n\t\n\tpublic Javac9JavaFileObjectWrapper(LombokFileObject delegate) {\n\t\tthis.delegate = delegate;\n\t}\n\t\n\t@Override public boolean isNameCompatible(String simpleName, Kind kind) {\n\t\treturn delegate.isNameCompatible(simpleName, kind);\n\t}\n\t\n\t@Override public URI toUri() {\n\t\treturn delegate.toUri();\n\t}\n\t\n\t@SuppressWarnings(\"all\")\n\t@Override public String getName() {\n\t\treturn delegate.getName();\n\t}\n\t\n\t@Override public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {\n\t\treturn delegate.getCharContent(ignoreEncodingErrors);\n\t}\n\t\n\t@Override public InputStream openInputStream() throws IOException {\n\t\treturn delegate.openInputStream();\n\t}\n\t\n\t@Override public Reader openReader(boolean ignoreEncodingErrors) throws IOException {\n\t\treturn delegate.openReader(ignoreEncodingErrors);\n\t}\n\t\n\t@Override public Writer openWriter() throws IOException {\n\t\treturn delegate.openWriter();\n\t}\n\t\n\t@Override public OutputStream openOutputStream() throws IOException {\n\t\treturn delegate.openOutputStream();\n\t}\n\t\n\t@Override public long getLastModified() {\n\t\treturn delegate.getLastModified();\n\t}\n\t\n\t@Override public boolean delete() {\n\t\treturn delegate.delete();\n\t}\n\t\n\t@Override public Kind getKind() {\n\t\treturn delegate.getKind();\n\t}\n\t\n\t@Override public NestingKind getNestingKind() {\n\t\treturn delegate.getNestingKind();\n\t}\n\t\n\t@Override public Modifier getAccessLevel() {\n\t\treturn delegate.getAccessLevel();\n\t}\n\t\n\t@Override public boolean equals(Object obj) {\n\t\tif (!(obj instanceof Javac9JavaFileObjectWrapper)) return false;\n\t\treturn delegate.equals(((Javac9JavaFileObjectWrapper)obj).delegate);\n\t}\n\t\n\t@Override public int hashCode() {\n\t\treturn delegate.hashCode();\n\t}\n\t\n\t@Override public String toString() {\n\t\treturn delegate.toString();\n\t}\n}"
  },
  {
    "path": "src/core/lombok/javac/apt/LombokFileObject.java",
    "content": "/*\n * Copyright (C) 2010-2011 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\npackage lombok.javac.apt;\n\nimport java.nio.charset.CharsetDecoder;\n\nimport javax.tools.JavaFileObject;\n\ninterface LombokFileObject extends JavaFileObject {\n\tCharsetDecoder getDecoder(boolean ignoreEncodingErrors);\n}\n"
  },
  {
    "path": "src/core/lombok/javac/apt/LombokFileObjects.java",
    "content": "/*\n * Copyright (C) 2010-2020 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\npackage lombok.javac.apt;\n\nimport java.lang.reflect.Constructor;\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.concurrent.atomic.AtomicBoolean;\n\nimport javax.tools.JavaFileManager;\nimport javax.tools.JavaFileObject;\n\nimport lombok.core.DiagnosticsReceiver;\nimport lombok.permit.Permit;\n\n//Can't use SimpleJavaFileObject so we copy/paste most of its content here, because javac doesn't follow the interface,\n//and casts to its own BaseFileObject type. D'oh!\nfinal class LombokFileObjects {\n\t\n\tinterface Compiler {\n\t\tCompiler JAVAC6 = new Compiler() {\n\t\t\tprivate Method decoderMethod = null;\n\t\t\tprivate final AtomicBoolean decoderIsSet = new AtomicBoolean();\n\t\t\t\n\t\t\t@Override public JavaFileObject wrap(LombokFileObject fileObject) {\n\t\t\t\treturn new Javac6BaseFileObjectWrapper(fileObject);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public Method getDecoderMethod() {\n\t\t\t\tsynchronized (decoderIsSet) {\n\t\t\t\t\tif (decoderIsSet.get()) return decoderMethod;\n\t\t\t\t\tdecoderMethod = LombokFileObjects.getDecoderMethod(\"com.sun.tools.javac.util.BaseFileObject\");\n\t\t\t\t\tdecoderIsSet.set(true);\n\t\t\t\t\treturn decoderMethod;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tCompiler JAVAC7 = new Compiler() {\n\t\t\tprivate Method decoderMethod = null;\n\t\t\tprivate final AtomicBoolean decoderIsSet = new AtomicBoolean();\n\t\t\t\n\t\t\t@Override public JavaFileObject wrap(LombokFileObject fileObject) {\n\t\t\t\treturn new Javac7BaseFileObjectWrapper(fileObject);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public Method getDecoderMethod() {\n\t\t\t\tsynchronized (decoderIsSet) {\n\t\t\t\t\tif (decoderIsSet.get()) return decoderMethod;\n\t\t\t\t\tdecoderMethod = LombokFileObjects.getDecoderMethod(\"com.sun.tools.javac.file.BaseFileObject\");\n\t\t\t\t\tdecoderIsSet.set(true);\n\t\t\t\t\treturn decoderMethod;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\t\n\t\tJavaFileObject wrap(LombokFileObject fileObject);\n\t\tMethod getDecoderMethod();\n\t}\n\t\t\n\tstatic Method getDecoderMethod(String className) {\n\t\ttry {\n\t\t\treturn Permit.getMethod(Class.forName(className), \"getDecoder\", boolean.class);\n\t\t} catch (NoSuchMethodException e) {\n\t\t\t// Intentional fallthrough - getDecoder(boolean) is not always present.\n\t\t} catch (ClassNotFoundException e) {\n\t\t\t// Intentional fallthrough - getDecoder(boolean) is not always present.\n\t\t}\n\t\treturn null;\n\t}\n\t\n\tprivate LombokFileObjects() {}\n\t\n\tprivate static final List<String> KNOWN_JAVA9_FILE_MANAGERS = Arrays.asList(\n\t\t\"com.google.errorprone.MaskedClassLoader$MaskedFileManager\",\n\t\t\"com.google.devtools.build.buildjar.javac.BlazeJavacMain$ClassloaderMaskingFileManager\",\n\t\t\"com.google.devtools.build.java.turbine.javac.JavacTurbineCompiler$ClassloaderMaskingFileManager\",\n\t\t\"org.netbeans.modules.java.source.parsing.ProxyFileManager\",\n\t\t\"com.sun.tools.javac.api.ClientCodeWrapper$WrappedStandardJavaFileManager\",\n\t\t\"com.sun.tools.javac.main.DelegatingJavaFileManager$DelegatingSJFM\" // IntelliJ + JDK10\n\t);\n\t\n\tstatic Compiler getCompiler(JavaFileManager jfm) {\n\t\tString jfmClassName = jfm != null ? jfm.getClass().getName() : \"null\";\n\t\tif (jfmClassName.equals(\"com.sun.tools.javac.util.DefaultFileManager\")) return Compiler.JAVAC6;\n\t\tif (jfmClassName.equals(\"com.sun.tools.javac.util.JavacFileManager\")) return Compiler.JAVAC6;\n\t\tif (jfmClassName.equals(\"com.sun.tools.javac.file.JavacFileManager\")) {\n\t\t\ttry {\n\t\t\t\tClass<?> superType = Class.forName(\"com.sun.tools.javac.file.BaseFileManager\");\n\t\t\t\tif (superType.isInstance(jfm)) return java9Compiler(jfm);\n\t\t\t}\n\t\t\tcatch (Throwable e) {}\n\t\t\treturn Compiler.JAVAC7;\n\t\t}\n\t\tif (KNOWN_JAVA9_FILE_MANAGERS.contains(jfmClassName)) {\n\t\t\ttry {\n\t\t\t\treturn java9Compiler(jfm);\n\t\t\t}\n\t\t\tcatch (Throwable e) {}\n\t\t}\n\t\ttry {\n\t\t\tif (Class.forName(\"com.sun.tools.javac.file.PathFileObject\") == null) throw new NullPointerException();\n\t\t\treturn java9Compiler(jfm);\n\t\t} catch (Throwable e) {}\n\t\ttry {\n\t\t\tif (Class.forName(\"com.sun.tools.javac.file.BaseFileObject\") == null) throw new NullPointerException();\n\t\t\treturn Compiler.JAVAC7;\n\t\t} catch (Throwable e) {}\n\t\ttry {\n\t\t\tif (Class.forName(\"com.sun.tools.javac.util.BaseFileObject\") == null) throw new NullPointerException();\n\t\t\treturn Compiler.JAVAC6;\n\t\t} catch (Throwable e) {}\n\t\t\n\t\tStringBuilder sb = new StringBuilder(jfmClassName);\n\t\tif (jfm != null) {\n\t\t\tsb.append(\" extends \").append(jfm.getClass().getSuperclass().getName());\n\t\t\tfor (Class<?> cls : jfm.getClass().getInterfaces()) {\n\t\t\t\tsb.append(\" implements \").append(cls.getName());\n\t\t\t}\n\t\t}\n\t\tthrow new IllegalArgumentException(sb.toString());\n\t}\n\t\n\tstatic JavaFileObject createIntercepting(Compiler compiler, JavaFileObject delegate, String fileName, DiagnosticsReceiver diagnostics) {\n\t\treturn compiler.wrap(new InterceptingJavaFileObject(delegate, fileName, diagnostics, compiler.getDecoderMethod()));\n\t}\n\t\n\tprivate static Constructor<?> j9CompilerConstructor = null;\n\tprivate static Compiler java9Compiler(JavaFileManager jfm) {\n\t\ttry {\n\t\t\tif (j9CompilerConstructor == null) j9CompilerConstructor = Class.forName(\"lombok.javac.apt.Java9Compiler\").getConstructor(JavaFileManager.class);\n\t\t\treturn (Compiler) j9CompilerConstructor.newInstance(jfm);\n\t\t} catch (ClassNotFoundException e) {\n\t\t\treturn null;\n\t\t} catch (NoSuchMethodException e) {\n\t\t\treturn null;\n\t\t} catch (InvocationTargetException e) {\n\t\t\tThrowable t = e.getCause();\n\t\t\tif (t instanceof RuntimeException) throw (RuntimeException) t;\n\t\t\tif (t instanceof Error) throw (Error) t;\n\t\t\tthrow new RuntimeException(t);\n\t\t} catch (IllegalAccessException e) {\n\t\t\tthrow new RuntimeException(e);\n\t\t} catch (InstantiationException e) {\n\t\t\tthrow new RuntimeException(e);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/apt/LombokProcessor.java",
    "content": "/*\n * Copyright (C) 2009-2020 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.apt;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.InvocationHandler;\nimport java.lang.reflect.Method;\nimport java.lang.reflect.Proxy;\nimport java.net.URL;\nimport java.util.ArrayList;\nimport java.util.Enumeration;\nimport java.util.HashSet;\nimport java.util.IdentityHashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.SortedSet;\n\nimport javax.annotation.processing.AbstractProcessor;\nimport javax.annotation.processing.Messager;\nimport javax.annotation.processing.ProcessingEnvironment;\nimport javax.annotation.processing.RoundEnvironment;\nimport javax.annotation.processing.SupportedAnnotationTypes;\nimport javax.lang.model.SourceVersion;\nimport javax.lang.model.element.Element;\nimport javax.lang.model.element.TypeElement;\nimport javax.tools.Diagnostic.Kind;\nimport javax.tools.JavaFileManager;\n\nimport com.sun.source.util.TreePath;\nimport com.sun.source.util.Trees;\nimport com.sun.tools.javac.jvm.ClassWriter;\nimport com.sun.tools.javac.main.JavaCompiler;\nimport com.sun.tools.javac.processing.JavacFiler;\nimport com.sun.tools.javac.processing.JavacProcessingEnvironment;\nimport com.sun.tools.javac.tree.JCTree.JCCompilationUnit;\nimport com.sun.tools.javac.util.Context;\n\nimport lombok.Lombok;\nimport lombok.core.CleanupRegistry;\nimport lombok.core.DiagnosticsReceiver;\nimport lombok.javac.JavacTransformer;\nimport lombok.permit.Permit;\nimport lombok.permit.dummy.Parent;\nimport sun.misc.Unsafe;\n\n/**\n * This Annotation Processor is the standard injection mechanism for lombok-enabling the javac compiler.\n * \n * To actually enable lombok in a javac compilation run, this class should be in the classpath when\n * running javac; that's the only requirement.\n */\n@SupportedAnnotationTypes(\"*\")\npublic class LombokProcessor extends AbstractProcessor {\n\n\tprivate ProcessingEnvironment processingEnv;\n\tprivate JavacProcessingEnvironment javacProcessingEnv;\n\tprivate JavacFiler javacFiler;\n\tprivate JavacTransformer transformer;\n\tprivate Trees trees;\n\tprivate boolean lombokDisabled = false;\n\t\n\t/** {@inheritDoc} */\n\t@Override public void init(ProcessingEnvironment procEnv) {\n\t\tsuper.init(procEnv);\n\t\tif (System.getProperty(\"lombok.disable\") != null) {\n\t\t\tlombokDisabled = true;\n\t\t\treturn;\n\t\t}\n\n\t\tthis.processingEnv = procEnv;\n\t\tthis.javacProcessingEnv = getJavacProcessingEnvironment(procEnv);\n\t\tthis.javacFiler = getJavacFiler(procEnv.getFiler());\n\n\t\tplacePostCompileAndDontMakeForceRoundDummiesHook();\n\t\ttrees = Trees.instance(javacProcessingEnv);\n\t\ttransformer = new JavacTransformer(procEnv.getMessager(), trees);\n\t\tSortedSet<Long> p = transformer.getPriorities();\n\t\tif (p.isEmpty()) {\n\t\t\tthis.priorityLevels = new long[] {0L};\n\t\t\tthis.priorityLevelsRequiringResolutionReset = new HashSet<Long>();\n\t\t} else {\n\t\t\tthis.priorityLevels = new long[p.size()];\n\t\t\tint i = 0;\n\t\t\tfor (Long prio : p) this.priorityLevels[i++] = prio;\n\t\t\tthis.priorityLevelsRequiringResolutionReset = transformer.getPrioritiesRequiringResolutionReset();\n\t\t}\n\t}\n\t\n\tprivate static final String JPE = \"com.sun.tools.javac.processing.JavacProcessingEnvironment\";\n\tprivate static final Field javacProcessingEnvironment_discoveredProcs = getFieldAccessor(JPE, \"discoveredProcs\");\n\tprivate static final Field discoveredProcessors_procStateList = getFieldAccessor(JPE + \"$DiscoveredProcessors\", \"procStateList\");\n\tprivate static final Field processorState_processor = getFieldAccessor(JPE + \"$processor\", \"processor\");\n\t\n\tprivate static final Field getFieldAccessor(String typeName, String fieldName) {\n\t\ttry {\n\t\t\treturn Permit.getField(Class.forName(typeName), fieldName);\n\t\t} catch (ClassNotFoundException e) {\n\t\t\treturn null;\n\t\t} catch (NoSuchFieldException e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\t// The intent of this method is to have lombok emit a warning if it's not 'first in line'. However, pragmatically speaking, you're always looking at one of two cases:\n\t// (A) The other processor(s) running before lombok require lombok to have run or they crash. So, they crash, and unfortunately we are never even init-ed; the warning is never emitted.\n\t// (B) The other processor(s) don't care about it at all. So, it doesn't actually matter that lombok isn't first.\n\t// Hence, for now, no warnings.\n\t@SuppressWarnings(\"unused\")\n\tprivate String listAnnotationProcessorsBeforeOurs() {\n\t\ttry {\n\t\t\tObject discoveredProcessors = javacProcessingEnvironment_discoveredProcs.get(this.javacProcessingEnv);\n\t\t\tArrayList<?> states = (ArrayList<?>) discoveredProcessors_procStateList.get(discoveredProcessors);\n\t\t\tif (states == null || states.isEmpty()) return null;\n\t\t\tif (states.size() == 1) return processorState_processor.get(states.get(0)).getClass().getName();\n\t\t\t\n\t\t\tint idx = 0;\n\t\t\tStringBuilder out = new StringBuilder();\n\t\t\tfor (Object processState : states) {\n\t\t\t\tidx++;\n\t\t\t\tString name = processorState_processor.get(processState).getClass().getName();\n\t\t\t\tif (out.length() > 0) out.append(\", \");\n\t\t\t\tout.append(\"[\").append(idx).append(\"] \").append(name);\n\t\t\t}\n\t\t\treturn out.toString();\n\t\t} catch (Exception e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tprivate void placePostCompileAndDontMakeForceRoundDummiesHook() {\n\t\tstopJavacProcessingEnvironmentFromClosingOurClassloader();\n\t\t\n\t\tforceMultipleRoundsInNetBeansEditor();\n\t\tContext context = javacProcessingEnv.getContext();\n\t\tdisablePartialReparseInNetBeansEditor(context);\n\t\ttry {\n\t\t\tMethod keyMethod = Permit.getMethod(Context.class, \"key\", Class.class);\n\t\t\tObject key = Permit.invoke(keyMethod, context, JavaFileManager.class);\n\t\t\tField htField = Permit.getField(Context.class, \"ht\");\n\t\t\t@SuppressWarnings(\"unchecked\")\n\t\t\tMap<Object,Object> ht = (Map<Object,Object>) Permit.get(htField, context);\n\t\t\tfinal JavaFileManager originalFiler = (JavaFileManager) ht.get(key);\n\t\t\tif (!(originalFiler instanceof InterceptingJavaFileManager)) {\n\t\t\t\tfinal Messager messager = processingEnv.getMessager();\n\t\t\t\tDiagnosticsReceiver receiver = new MessagerDiagnosticsReceiver(messager);\n\t\t\t\t\n\t\t\t\tJavaFileManager newFilerManager = new InterceptingJavaFileManager(originalFiler, receiver);\n\t\t\t\tht.put(key, newFilerManager);\n\t\t\t\tField filerFileManagerField = Permit.getField(JavacFiler.class, \"fileManager\");\n\t\t\t\tfilerFileManagerField.set(javacFiler, newFilerManager);\n\t\t\t\t\n\t\t\t\tif (lombok.javac.Javac.getJavaCompilerVersion() > 8\n\t\t\t\t\t\t&& !lombok.javac.handlers.JavacHandlerUtil.inNetbeansCompileOnSave(context)) {\n\t\t\t\t\treplaceFileManagerJdk9(context, newFilerManager);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\tthrow Lombok.sneakyThrow(e);\n\t\t}\n\t}\n\n\tprivate void replaceFileManagerJdk9(Context context, JavaFileManager newFiler) {\n\t\ttry {\n\t\t\tJavaCompiler compiler = (JavaCompiler) Permit.invoke(Permit.getMethod(JavaCompiler.class, \"instance\", Context.class), null, context);\n\t\t\ttry {\n\t\t\t\tField fileManagerField = Permit.getField(JavaCompiler.class, \"fileManager\");\n\t\t\t\tPermit.set(fileManagerField, compiler, newFiler);\n\t\t\t}\n\t\t\tcatch (Exception e) {}\n\t\t\t\n\t\t\ttry {\n\t\t\t\tField writerField = Permit.getField(JavaCompiler.class, \"writer\");\n\t\t\t\tClassWriter writer = (ClassWriter) writerField.get(compiler);\n\t\t\t\tField fileManagerField = Permit.getField(ClassWriter.class, \"fileManager\");\n\t\t\t\tPermit.set(fileManagerField, writer, newFiler);\n\t\t\t}\n\t\t\tcatch (Exception e) {}\n\t\t}\n\t\tcatch (Exception e) {\n\t\t}\n\t}\n\t\n\tprivate void forceMultipleRoundsInNetBeansEditor() {\n\t\ttry {\n\t\t\tField f = Permit.getField(JavacProcessingEnvironment.class, \"isBackgroundCompilation\");\n\t\t\tf.set(javacProcessingEnv, true);\n\t\t} catch (NoSuchFieldException e) {\n\t\t\t// only NetBeans has it\n\t\t} catch (Throwable t) {\n\t\t\tthrow Lombok.sneakyThrow(t);\n\t\t}\n\t}\n\t\n\tprivate void disablePartialReparseInNetBeansEditor(Context context) {\n\t\ttry {\n\t\t\tClass<?> cancelServiceClass = Class.forName(\"com.sun.tools.javac.util.CancelService\");\n\t\t\tMethod cancelServiceInstance = Permit.getMethod(cancelServiceClass, \"instance\", Context.class);\n\t\t\tObject cancelService = Permit.invoke(cancelServiceInstance, null, context);\n\t\t\tif (cancelService == null) return;\n\t\t\tField parserField = Permit.getField(cancelService.getClass(), \"parser\");\n\t\t\tObject parser = parserField.get(cancelService);\n\t\t\tField supportsReparseField = Permit.getField(parser.getClass(), \"supportsReparse\");\n\t\t\tsupportsReparseField.set(parser, false);\n\t\t} catch (ClassNotFoundException e) {\n\t\t\t// only NetBeans has it\n\t\t} catch (NoSuchFieldException e) {\n\t\t\t// only NetBeans has it\n\t\t} catch (Throwable t) {\n\t\t\tthrow Lombok.sneakyThrow(t);\n\t\t}\n\t}\n\t\n\tprivate static ClassLoader wrapClassLoader(final ClassLoader parent) {\n\t\treturn new ClassLoader() {\n\t\t\t\n\t\t\tpublic Class<?> loadClass(String name) throws ClassNotFoundException {\n\t\t\t\treturn parent.loadClass(name);\n\t\t\t}\n\t\t\t\n\t\t\tpublic String toString() {\n\t\t\t\treturn parent.toString();\n\t\t\t}\n\t\t\t\n\t\t\tpublic URL getResource(String name) {\n\t\t\t\treturn parent.getResource(name);\n\t\t\t}\n\t\t\t\n\t\t\tpublic Enumeration<URL> getResources(String name) throws IOException {\n\t\t\t\treturn parent.getResources(name);\n\t\t\t}\n\t\t\t\n\t\t\tpublic InputStream getResourceAsStream(String name) {\n\t\t\t\treturn parent.getResourceAsStream(name);\n\t\t\t}\n\t\t\t\n\t\t\tpublic void setDefaultAssertionStatus(boolean enabled) {\n\t\t\t\tparent.setDefaultAssertionStatus(enabled);\n\t\t\t}\n\t\t\t\n\t\t\tpublic void setPackageAssertionStatus(String packageName, boolean enabled) {\n\t\t\t\tparent.setPackageAssertionStatus(packageName, enabled);\n\t\t\t}\n\t\t\t\n\t\t\tpublic void setClassAssertionStatus(String className, boolean enabled) {\n\t\t\t\tparent.setClassAssertionStatus(className, enabled);\n\t\t\t}\n\t\t\t\n\t\t\tpublic void clearAssertionStatus() {\n\t\t\t\tparent.clearAssertionStatus();\n\t\t\t}\n\t\t};\n\t}\n\t\n\tprivate void stopJavacProcessingEnvironmentFromClosingOurClassloader() {\n\t\ttry {\n\t\t\tField f = Permit.getField(JavacProcessingEnvironment.class, \"processorClassLoader\");\n\t\t\tClassLoader unwrapped = (ClassLoader) f.get(javacProcessingEnv);\n\t\t\tif (unwrapped == null) return;\n\t\t\tClassLoader wrapped = wrapClassLoader(unwrapped);\n\t\t\tf.set(javacProcessingEnv, wrapped);\n\t\t} catch (NoSuchFieldException e) {\n\t\t\t// Some versions of javac have this (and call close on it), some don't. I guess this one doesn't have it.\n\t\t} catch (Throwable t) {\n\t\t\tthrow Lombok.sneakyThrow(t);\n\t\t}\n\t}\n\t\n\tprivate final IdentityHashMap<JCCompilationUnit, Long> roots = new IdentityHashMap<JCCompilationUnit, Long>();\n\tprivate long[] priorityLevels;\n\tprivate Set<Long> priorityLevelsRequiringResolutionReset;\n\tprivate CleanupRegistry cleanup = new CleanupRegistry();\n\t\n\t/** {@inheritDoc} */\n\t@Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {\n\t\tif (lombokDisabled) return false;\n\t\tif (roundEnv.processingOver()) {\n\t\t\tcleanup.run();\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\t// We have: A sorted set of all priority levels: 'priorityLevels'\n\t\t\n\t\t// Step 1: Take all CUs which aren't already in the map. Give them the first priority level.\n\t\t\n\t\tfor (Element element : roundEnv.getRootElements()) {\n\t\t\tJCCompilationUnit unit = toUnit(element);\n\t\t\tif (unit == null) continue;\n\t\t\tif (roots.containsKey(unit)) continue;\n\t\t\troots.put(unit, priorityLevels[0]);\n\t\t}\n\t\t\n\t\twhile (true) {\n\t\t\t// Step 2: For all CUs (in the map, not the roundEnv!), run them across all handlers at their current prio level.\n\t\t\t\n\t\t\tfor (long prio : priorityLevels) {\n\t\t\t\tList<JCCompilationUnit> cusForThisRound = new ArrayList<JCCompilationUnit>();\n\t\t\t\tfor (Map.Entry<JCCompilationUnit, Long> entry : roots.entrySet()) {\n\t\t\t\t\tLong prioOfCu = entry.getValue();\n\t\t\t\t\tif (prioOfCu == null || prioOfCu != prio) continue;\n\t\t\t\t\tcusForThisRound.add(entry.getKey());\n\t\t\t\t}\n\t\t\t\ttransformer.transform(prio, javacProcessingEnv.getContext(), cusForThisRound, cleanup);\n\t\t\t}\n\t\t\t\n\t\t\t// Step 3: Push up all CUs to the next level. Set level to null if there is no next level.\n\t\t\t\n\t\t\tSet<Long> newLevels = new HashSet<Long>();\n\t\t\tfor (int i = priorityLevels.length - 1; i >= 0; i--) {\n\t\t\t\tLong curLevel = priorityLevels[i];\n\t\t\t\tLong nextLevel = (i == priorityLevels.length - 1) ? null : priorityLevels[i + 1];\n\t\t\t\tList<JCCompilationUnit> cusToAdvance = new ArrayList<JCCompilationUnit>();\n\t\t\t\tfor (Map.Entry<JCCompilationUnit, Long> entry : roots.entrySet()) {\n\t\t\t\t\tif (curLevel.equals(entry.getValue())) {\n\t\t\t\t\t\tcusToAdvance.add(entry.getKey());\n\t\t\t\t\t\tnewLevels.add(nextLevel);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (JCCompilationUnit unit : cusToAdvance) {\n\t\t\t\t\troots.put(unit, nextLevel);\n\t\t\t\t}\n\t\t\t}\n\t\t\tnewLevels.remove(null);\n\t\t\t\n\t\t\t// Step 4: If ALL values are null, quit. Else, either do another loop right now or force a resolution reset by forcing a new round in the annotation processor.\n\t\t\t\n\t\t\tif (newLevels.isEmpty()) return false;\n\t\t\tnewLevels.retainAll(priorityLevelsRequiringResolutionReset);\n\t\t\tif (!newLevels.isEmpty()) {\n\t\t\t\t// Force a new round to reset resolution. The next round will cause this method (process) to be called again.\n\t\t\t\tforceNewRound(javacFiler);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// None of the new levels need resolution, so just keep going.\n\t\t}\n\t}\n\t\n\tprivate int dummyCount = 0;\n\tprivate void forceNewRound(JavacFiler filer) {\n\t\tif (!filer.newFiles()) {\n\t\t\ttry {\n\t\t\t\tfiler.getGeneratedSourceNames().add(\"lombok.dummy.ForceNewRound\" + (dummyCount++));\n\t\t\t} catch (Exception e) {\n\t\t\t\te.printStackTrace();\n\t\t\t\tprocessingEnv.getMessager().printMessage(Kind.WARNING,\n\t\t\t\t\t\"Can't force a new processing round. Lombok won't work.\");\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate JCCompilationUnit toUnit(Element element) {\n\t\tTreePath path = null;\n\t\tif (trees != null) {\n\t\t\ttry {\n\t\t\t\tpath = trees.getPath(element);\n\t\t\t} catch (NullPointerException ignore) {\n\t\t\t\t// Happens if a package-info.java doesn't contain a package declaration.\n\t\t\t\t// https://github.com/projectlombok/lombok/issues/2184\n\t\t\t\t// We can safely ignore those, since they do not need any processing\n\t\t\t}\n\t\t}\n\t\tif (path == null) return null;\n\t\t\n\t\treturn (JCCompilationUnit) path.getCompilationUnit();\n\t}\n\t\n\t/**\n\t * We just return the latest version of whatever JDK we run on. Stupid? Yeah, but it's either that or warnings on all versions but 1.\n\t */\n\t@Override public SourceVersion getSupportedSourceVersion() {\n\t\treturn SourceVersion.latest();\n\t}\n\t\n\t/**\n\t * This class casts the given processing environment to a JavacProcessingEnvironment. In case of\n\t * gradle incremental compilation, the delegate ProcessingEnvironment of the gradle wrapper is returned.\n\t */\n\tpublic JavacProcessingEnvironment getJavacProcessingEnvironment(Object procEnv) {\n\t\taddOpensForLombok();\n\t\tif (procEnv instanceof JavacProcessingEnvironment) return (JavacProcessingEnvironment) procEnv;\n\t\t\n\t\t// try to find a \"delegate\" field in the object, and use this to try to obtain a JavacProcessingEnvironment\n\t\tfor (Class<?> procEnvClass = procEnv.getClass(); procEnvClass != null; procEnvClass = procEnvClass.getSuperclass()) {\n\t\t\tObject delegate = tryGetDelegateField(procEnvClass, procEnv);\n\t\t\tif (delegate == null) delegate = tryGetProxyDelegateToField(procEnvClass, procEnv);\n\t\t\tif (delegate == null) delegate = tryGetProcessingEnvField(procEnvClass, procEnv);\n\t\t\t\n\t\t\tif (delegate != null) return getJavacProcessingEnvironment(delegate);\n\t\t\t// delegate field was not found, try on superclass\n\t\t}\n\t\t\n\t\tprocessingEnv.getMessager().printMessage(Kind.WARNING,\n\t\t\t\"Can't get the delegate of the gradle IncrementalProcessingEnvironment. Lombok won't work.\");\n\t\treturn null;\n\t}\n\t\n\tprivate static Object getOwnModule() {\n\t\ttry {\n\t\t\tMethod m = Permit.getMethod(Class.class, \"getModule\");\n\t\t\treturn m.invoke(LombokProcessor.class);\n\t\t} catch (Exception e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tprivate static Object getJdkCompilerModule() {\n\t\t/* call public api: ModuleLayer.boot().findModule(\"jdk.compiler\").get();\n\t\t   but use reflection because we don't want this code to crash on jdk1.7 and below.\n\t\t   In that case, none of this stuff was needed in the first place, so we just exit via\n\t\t   the catch block and do nothing.\n\t\t */\n\t\t\n\t\ttry {\n\t\t\tClass<?> cModuleLayer = Class.forName(\"java.lang.ModuleLayer\");\n\t\t\tMethod mBoot = cModuleLayer.getDeclaredMethod(\"boot\");\n\t\t\tObject bootLayer = mBoot.invoke(null);\n\t\t\tClass<?> cOptional = Class.forName(\"java.util.Optional\");\n\t\t\tMethod mFindModule = cModuleLayer.getDeclaredMethod(\"findModule\", String.class);\n\t\t\tObject oCompilerO = mFindModule.invoke(bootLayer, \"jdk.compiler\");\n\t\t\treturn cOptional.getDeclaredMethod(\"get\").invoke(oCompilerO);\n\t\t} catch (Exception e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\t/** Useful from jdk9 and up; required from jdk16 and up. This code is supposed to gracefully do nothing on jdk8 and below, as this operation isn't needed there. */\n\tpublic static void addOpensForLombok() {\n\t\tClass<?> cModule;\n\t\ttry {\n\t\t\tcModule = Class.forName(\"java.lang.Module\");\n\t\t} catch (ClassNotFoundException e) {\n\t\t\treturn; //jdk8-; this is not needed.\n\t\t}\n\t\t\n\t\tUnsafe unsafe = getUnsafe();\n\t\tObject jdkCompilerModule = getJdkCompilerModule();\n\t\tObject ownModule = getOwnModule();\n\t\tString[] allPkgs = {\n\t\t\t\"com.sun.tools.javac.code\",\n\t\t\t\"com.sun.tools.javac.comp\",\n\t\t\t\"com.sun.tools.javac.file\",\n\t\t\t\"com.sun.tools.javac.main\",\n\t\t\t\"com.sun.tools.javac.model\",\n\t\t\t\"com.sun.tools.javac.parser\",\n\t\t\t\"com.sun.tools.javac.processing\",\n\t\t\t\"com.sun.tools.javac.tree\",\n\t\t\t\"com.sun.tools.javac.util\",\n\t\t\t\"com.sun.tools.javac.jvm\",\n\t\t};\n\t\t\n\t\ttry {\n\t\t\tMethod m = cModule.getDeclaredMethod(\"implAddOpens\", String.class, cModule);\n\t\t\tlong firstFieldOffset = getFirstFieldOffset(unsafe);\n\t\t\tunsafe.putBooleanVolatile(m, firstFieldOffset, true);\n\t\t\tfor (String p : allPkgs) m.invoke(jdkCompilerModule, p, ownModule);\n\t\t} catch (Exception ignore) {}\n\t}\n\t\n\tprivate static long getFirstFieldOffset(Unsafe unsafe) {\n\t\ttry {\n\t\t\treturn unsafe.objectFieldOffset(Parent.class.getDeclaredField(\"first\"));\n\t\t} catch (NoSuchFieldException e) {\n\t\t\t// can't happen.\n\t\t\tthrow new RuntimeException(e);\n\t\t} catch (SecurityException e) {\n\t\t\t// can't happen\n\t\t\tthrow new RuntimeException(e);\n\t\t}\n\t}\n\t\n\tprivate static Unsafe getUnsafe() {\n\t\ttry {\n\t\t\tField theUnsafe = Unsafe.class.getDeclaredField(\"theUnsafe\");\n\t\t\ttheUnsafe.setAccessible(true);\n\t\t\treturn (Unsafe) theUnsafe.get(null);\n\t\t} catch (Exception e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\t/**\n\t * This class returns the given filer as a JavacFiler. In case the filer is no\n\t * JavacFiler (e.g. the Gradle IncrementalFiler), its \"delegate\" field is used to get the JavacFiler\n\t * (directly or through a delegate field again)\n\t */\n\tpublic JavacFiler getJavacFiler(Object filer) {\n\t\tif (filer instanceof JavacFiler) return (JavacFiler) filer;\n\t\t\n\t\t// try to find a \"delegate\" field in the object, and use this to check for a JavacFiler\n\t\tfor (Class<?> filerClass = filer.getClass(); filerClass != null; filerClass = filerClass.getSuperclass()) {\n\t\t\tObject delegate = tryGetDelegateField(filerClass, filer);\n\t\t\tif (delegate == null) delegate = tryGetProxyDelegateToField(filerClass, filer);\n\t\t\tif (delegate == null) delegate = tryGetFilerField(filerClass, filer);\n\t\t\t\n\t\t\tif (delegate != null) return getJavacFiler(delegate);\n\t\t\t// delegate field was not found, try on superclass\n\t\t}\n\t\t\n\t\tprocessingEnv.getMessager().printMessage(Kind.WARNING,\n\t\t\t\"Can't get a JavacFiler from \" + filer.getClass().getName() + \". Lombok won't work.\");\n\t\treturn null;\n\t}\n\n\t/**\n\t * Gradle incremental processing\n\t */\n\tprivate Object tryGetDelegateField(Class<?> delegateClass, Object instance) {\n\t\ttry {\n\t\t\treturn Permit.getField(delegateClass, \"delegate\").get(instance);\n\t\t} catch (Exception e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\t/**\n\t * Kotlin incremental processing\n\t */\n\tprivate Object tryGetProcessingEnvField(Class<?> delegateClass, Object instance) {\n\t\ttry {\n\t\t\treturn Permit.getField(delegateClass, \"processingEnv\").get(instance);\n\t\t} catch (Exception e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\t/**\n\t * Kotlin incremental processing\n\t */\n\tprivate Object tryGetFilerField(Class<?> delegateClass, Object instance) {\n\t\ttry {\n\t\t\treturn Permit.getField(delegateClass, \"filer\").get(instance);\n\t\t} catch (Exception e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\t/**\n\t * IntelliJ IDEA >= 2020.3\n\t */\n\tprivate Object tryGetProxyDelegateToField(Class<?> delegateClass, Object instance) {\n\t\ttry {\n\t\t\tInvocationHandler handler = Proxy.getInvocationHandler(instance);\n\t\t\treturn Permit.getField(handler.getClass(), \"val$delegateTo\").get(handler);\n\t\t} catch (Exception e) {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/apt/MessagerDiagnosticsReceiver.java",
    "content": "/*\n * Copyright (C) 2009-2010 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.apt;\n\nimport javax.annotation.processing.Messager;\nimport javax.tools.Diagnostic.Kind;\n\nimport lombok.core.DiagnosticsReceiver;\n\npublic class MessagerDiagnosticsReceiver implements DiagnosticsReceiver {\n\tprivate final Messager messager;\n\t\n\tpublic MessagerDiagnosticsReceiver(Messager messager) {\n\t\tthis.messager = messager;\n\t}\n\t\n\t@Override public void addWarning(String message) {\n\t\tmessager.printMessage(Kind.WARNING, message);\n\t}\n\t\n\t@Override public void addError(String message) {\n\t\tmessager.printMessage(Kind.ERROR, message);\n\t}\n}"
  },
  {
    "path": "src/core/lombok/javac/apt/Processor.java",
    "content": "/*\n * Copyright (C) 2015 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.apt;\n\nimport static javax.tools.StandardLocation.*;\n\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.io.OutputStreamWriter;\nimport java.io.StringWriter;\nimport java.lang.reflect.Field;\nimport java.net.URL;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.Enumeration;\nimport java.util.Map;\nimport java.util.Properties;\nimport java.util.Set;\n\nimport javax.annotation.processing.AbstractProcessor;\nimport javax.annotation.processing.Filer;\nimport javax.annotation.processing.ProcessingEnvironment;\nimport javax.annotation.processing.RoundEnvironment;\nimport javax.annotation.processing.SupportedAnnotationTypes;\nimport javax.lang.model.SourceVersion;\nimport javax.lang.model.element.TypeElement;\nimport javax.tools.Diagnostic;\nimport javax.tools.JavaFileManager;\n\nimport com.sun.tools.javac.processing.JavacFiler;\nimport com.sun.tools.javac.processing.JavacProcessingEnvironment;\nimport com.sun.tools.javac.util.Options;\n\nimport lombok.permit.Permit;\n\n/**\n * This processor should not be used. It used to be THE processor. This class is only there to warn people that something went wrong, and for the\n * lombok developers to see if what the reason for those failures is. \n */\n@Deprecated\n@SupportedAnnotationTypes(\"*\")\npublic class Processor extends AbstractProcessor {\n\t\n\t/** {@inheritDoc} */\n\t@Override public void init(ProcessingEnvironment procEnv) {\n\t\tsuper.init(procEnv);\n\t\tif (System.getProperty(\"lombok.disable\") != null) {\n\t\t\treturn;\n\t\t}\n\t\tprocEnv.getMessager().printMessage(Diagnostic.Kind.WARNING, \"Wrong usage of 'lombok.javac.apt.Processor'. \" + report(procEnv));\n\t}\n\t\n\tprivate String report(ProcessingEnvironment procEnv) {\n\t\tString data = collectData(procEnv);\n\t\ttry {\n\t\t\treturn writeFile(data);\n\t\t} catch (Exception e) {\n\t\t\treturn \"Report:\\n\\n\" + data;\n\t\t}\n\t}\n\t\n\tprivate String writeFile(String data) throws IOException {\n\t\tFile file = File.createTempFile(\"lombok-processor-report-\", \".txt\");\n\t\tOutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file));\n\t\twriter.write(data);\n\t\twriter.close();\n\t\treturn \"Report written to '\" + file.getCanonicalPath() + \"'\\n\";\n\t}\n\n\tprivate String collectData(ProcessingEnvironment procEnv) {\n\t\tStringBuilder message = new StringBuilder();\n\t\tmessage.append(\"Problem report for usages of 'lombok.javac.apt.Processor'\\n\\n\");\n\t\tlistOptions(message, procEnv);\n\t\tfindServices(message, procEnv.getFiler());\n\t\taddStacktrace(message);\n\t\tlistProperties(message);\n\t\treturn message.toString();\n\t}\n\t\n\tprivate void listOptions(StringBuilder message, ProcessingEnvironment procEnv) {\n\t\ttry {\n\t\t\tJavacProcessingEnvironment environment = (JavacProcessingEnvironment) procEnv;\n\t\t\tOptions instance = Options.instance(environment.getContext());\n\t\t\tField field = Permit.getField(Options.class, \"values\");\n\t\t\t@SuppressWarnings(\"unchecked\") Map<String, String> values = (Map<String, String>) field.get(instance);\n\t\t\tif (values.isEmpty()) {\n\t\t\t\tmessage.append(\"Options: empty\\n\\n\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tmessage.append(\"Compiler Options:\\n\");\n\t\t\tfor (Map.Entry<String, String> value : values.entrySet()) {\n\t\t\t\tmessage.append(\"- \");\n\t\t\t\tstring(message, value.getKey());\n\t\t\t\tmessage.append(\" = \");\n\t\t\t\tstring(message, value.getValue());\n\t\t\t\tmessage.append(\"\\n\");\n\t\t\t}\n\t\t\tmessage.append(\"\\n\");\n\t\t} catch (Exception e) {\n\t\t\tmessage.append(\"No options available\\n\\n\");\n\t\t}\n\t\t\n\t}\n\n\tprivate void findServices(StringBuilder message, Filer filer) {\n\t\ttry {\n\t\t\tField filerFileManagerField = Permit.getField(JavacFiler.class, \"fileManager\");\n\t\t\tJavaFileManager jfm = (JavaFileManager) filerFileManagerField.get(filer);\n\t\t\tClassLoader processorClassLoader = jfm.hasLocation(ANNOTATION_PROCESSOR_PATH) ? jfm.getClassLoader(ANNOTATION_PROCESSOR_PATH) : jfm.getClassLoader(CLASS_PATH);\n\t\t\tEnumeration<URL> resources = processorClassLoader.getResources(\"META-INF/services/javax.annotation.processing.Processor\");\n\t\t\tif (!resources.hasMoreElements()) {\n\t\t\t\tmessage.append(\"No processors discovered\\n\\n\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tmessage.append(\"Discovered processors:\\n\");\n\t\t\twhile (resources.hasMoreElements()) {\n\t\t\t\tURL processorUrl = resources.nextElement();\n\t\t\t\tmessage.append(\"- '\").append(processorUrl).append(\"'\");\n\t\t\t\tInputStream content = (InputStream) processorUrl.getContent();\n\t\t\t\tif (content != null) try {\n\t\t\t\t\tInputStreamReader reader = new InputStreamReader(content, \"UTF-8\");\n\t\t\t\t\tStringWriter sw = new StringWriter();\n\t\t\t\t\tchar[] buffer = new char[8192];\n\t\t\t\t\tint read = 0;\n\t\t\t\t\twhile ((read = reader.read(buffer))!= -1) {\n\t\t\t\t\t\tsw.write(buffer, 0, read);\n\t\t\t\t\t}\n\t\t\t\t\tString wholeFile = sw.toString();\n\t\t\t\t\tif (wholeFile.contains(\"lombok.javac.apt.Processor\")) {\n\t\t\t\t\t\tmessage.append(\" <= problem\\n\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmessage.append(\" (ok)\\n\");\n\t\t\t\t\t}\n\t\t\t\t\tmessage.append(\"    \").append(wholeFile.replace(\"\\n\", \"\\n    \")).append(\"\\n\");\n\t\t\t\t} finally {\n\t\t\t\t\tcontent.close();\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\tmessage.append(\"Filer information unavailable\\n\");\n\t\t}\n\t\tmessage.append(\"\\n\");\n\t}\n\n\tprivate void addStacktrace(StringBuilder message) {\n\t\tStackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();\n\t\tif (stackTraceElements != null) {\n\t\t\tmessage.append(\"Called from\\n\");\n\t\t\tfor (int i = 1; i < stackTraceElements.length; i++) {\n\t\t\t\tStackTraceElement element = stackTraceElements[i];\n\t\t\t\tif (!element.getClassName().equals(\"lombok.javac.apt.Processor\")) message.append(\"- \").append(element).append(\"\\n\"); \n\t\t\t}\n\t\t} else {\n\t\t\tmessage.append(\"No stacktrace available\\n\");\n\t\t}\n\t\tmessage.append(\"\\n\");\n\t}\n\n\tprivate void listProperties(StringBuilder message) {\n\t\tProperties properties = System.getProperties();\n\t\tArrayList<String> propertyNames = new ArrayList<String>(properties.stringPropertyNames());\n\t\tCollections.sort(propertyNames);\n\t\tmessage.append(\"Properties: \\n\");\n\t\tfor (String propertyName : propertyNames) {\n\t\t\tif (propertyName.startsWith(\"user.\")) continue;\n\t\t\tmessage.append(\"- \").append(propertyName).append(\" = \");\n\t\t\tstring(message, System.getProperty(propertyName));\n\t\t\tmessage.append(\"\\n\");\n\t\t}\n\t\tmessage.append(\"\\n\");\n\t}\n\t\n\tprivate static void string(StringBuilder sb, String s) {\n\t\tif (s == null) {\n\t\t\tsb.append(\"null\");\n\t\t\treturn;\n\t\t}\n\t\tsb.append(\"\\\"\");\n\t\tfor (int i = 0; i < s.length(); i++) sb.append(escape(s.charAt(i)));\n\t\tsb.append(\"\\\"\");\n\t}\n\t\n\tprivate static String escape(char ch) {\n\t\tswitch (ch) {\n\t\tcase '\\b': return \"\\\\b\";\n\t\tcase '\\f': return \"\\\\f\";\n\t\tcase '\\n': return \"\\\\n\";\n\t\tcase '\\r': return \"\\\\r\";\n\t\tcase '\\t': return \"\\\\t\";\n\t\tcase '\\'': return \"\\\\'\";\n\t\tcase '\\\"': return \"\\\\\\\"\";\n\t\tcase '\\\\': return \"\\\\\\\\\";\n\t\tdefault:\n\t\t\tif (ch < 32) return String.format(\"\\\\%03o\", (int) ch);\n\t\t\treturn String.valueOf(ch);\n\t\t}\n\t}\n\n\t/**\n\t * We just return the latest version of whatever JDK we run on. Stupid? Yeah, but it's either that or warnings on all versions but 1.\n\t */\n\t@Override public SourceVersion getSupportedSourceVersion() {\n\t\treturn SourceVersion.latest();\n\t}\n\n\t@Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/apt/package-info.java",
    "content": "/*\n * Copyright (C) 2009 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/**\n * Contains the mechanism that instruments javac as an annotation processor.\n * \n * <strong>NB: This package is not public API in the sense that contents of this package,\n *    even public classes / methods / etc, may change in point releases.</strong>\n */\npackage lombok.javac.apt;\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleAccessors.java",
    "content": "/*\n * Copyright (C) 2012-2022 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\n\nimport lombok.ConfigurationKeys;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.experimental.Accessors;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.spi.Provides;\n\n@Provides\n@HandlerPriority(65536)\npublic class HandleAccessors extends JavacAnnotationHandler<Accessors> {\n\t@Override public void handle(AnnotationValues<Accessors> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\t// Accessors itself is handled by HandleGetter/Setter; this is just to ensure that the annotation is removed\n\t\t// from the AST when delomboking.\n\t\t\n\t\thandleExperimentalFlagUsage(annotationNode, ConfigurationKeys.ACCESSORS_FLAG_USAGE, \"@Accessors\");\n\t\t\n\t\tdeleteAnnotationIfNeccessary(annotationNode, Accessors.class);\n\t\tif (annotation.isMarking()) annotationNode.addWarning(\"Accessors on its own does nothing. Set at least one parameter\");\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleBuilder.java",
    "content": "/*\n * Copyright (C) 2013-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.javac.Javac.*;\nimport static lombok.javac.JavacTreeMaker.TypeTag.typeTag;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport java.util.ArrayList;\n\nimport javax.lang.model.element.Modifier;\n\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCArrayTypeTree;\nimport com.sun.tools.javac.tree.JCTree.JCBlock;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCFieldAccess;\nimport com.sun.tools.javac.tree.JCTree.JCIdent;\nimport com.sun.tools.javac.tree.JCTree.JCIf;\nimport com.sun.tools.javac.tree.JCTree.JCLiteral;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCMethodInvocation;\nimport com.sun.tools.javac.tree.JCTree.JCModifiers;\nimport com.sun.tools.javac.tree.JCTree.JCNewArray;\nimport com.sun.tools.javac.tree.JCTree.JCNewClass;\nimport com.sun.tools.javac.tree.JCTree.JCPrimitiveTypeTree;\nimport com.sun.tools.javac.tree.JCTree.JCReturn;\nimport com.sun.tools.javac.tree.JCTree.JCStatement;\nimport com.sun.tools.javac.tree.JCTree.JCTypeApply;\nimport com.sun.tools.javac.tree.JCTree.JCTypeParameter;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.util.Context;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.ListBuffer;\nimport com.sun.tools.javac.util.Name;\n\nimport lombok.AccessLevel;\nimport lombok.Builder;\nimport lombok.Builder.ObtainVia;\nimport lombok.ConfigurationKeys;\nimport lombok.Singular;\nimport lombok.ToString;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.core.configuration.CheckerFrameworkVersion;\nimport lombok.core.handlers.HandlerUtil;\nimport lombok.core.handlers.HandlerUtil.FieldAccess;\nimport lombok.core.handlers.InclusionExclusionUtils.Included;\nimport lombok.experimental.NonFinal;\nimport lombok.javac.Javac;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacTreeMaker;\nimport lombok.javac.handlers.HandleConstructor.SkipIfConstructorExists;\nimport lombok.javac.handlers.JavacHandlerUtil.CopyJavadoc;\nimport lombok.javac.handlers.JavacHandlerUtil.MemberExistsResult;\nimport lombok.javac.handlers.JavacSingularsRecipes.JavacSingularizer;\nimport lombok.javac.handlers.JavacSingularsRecipes.SingularData;\nimport lombok.spi.Provides;\n\n@Provides\n@HandlerPriority(-1024) //-2^10; to ensure we've picked up @FieldDefault's changes (-2048) but @Value hasn't removed itself yet (-512), so that we can error on presence of it on the builder classes.\npublic class HandleBuilder extends JavacAnnotationHandler<Builder> {\n\tprivate HandleConstructor handleConstructor = new HandleConstructor();\n\t\n\tstatic final String CLEAN_FIELD_NAME = \"$lombokUnclean\";\n\tstatic final String CLEAN_METHOD_NAME = \"$lombokClean\";\n\tstatic final String TO_BUILDER_METHOD_NAME = \"toBuilder\";\n\tstatic final String DEFAULT_PREFIX = \"$default$\";\n\tstatic final String SET_PREFIX = \"$set\";\n\tstatic final String VALUE_PREFIX = \"$value\";\n\tstatic final String BUILDER_TEMP_VAR = \"builder\";\n\tstatic final String TO_BUILDER_NOT_SUPPORTED = \"@Builder(toBuilder=true) is only supported if you return your own type.\";\n\t\n\tprivate static final boolean toBoolean(Object expr, boolean defaultValue) {\n\t\tif (expr == null) return defaultValue;\n\t\tif (expr instanceof JCLiteral) return ((Integer) ((JCLiteral) expr).value) != 0;\n\t\treturn ((Boolean) expr).booleanValue();\n\t}\n\t\n\tstatic class BuilderJob {\n\t\tCheckerFrameworkVersion checkerFramework;\n\t\tJavacNode parentType;\n\t\tString builderMethodName, buildMethodName;\n\t\tboolean isStatic;\n\t\tList<JCTypeParameter> typeParams;\n\t\tList<JCTypeParameter> builderTypeParams;\n\t\tJavacNode sourceNode;\n\t\tjava.util.List<BuilderFieldData> builderFields;\n\t\tAccessLevel accessInners, accessOuters;\n\t\tboolean oldFluent, oldChain, toBuilder;\n\t\t\n\t\tJavacNode builderType;\n\t\tString builderClassName;\n\t\t\n\t\tvoid init(AnnotationValues<Builder> annValues, Builder ann, JavacNode node) {\n\t\t\taccessOuters = ann.access();\n\t\t\tif (accessOuters == null) accessOuters = AccessLevel.PUBLIC;\n\t\t\tif (accessOuters == AccessLevel.NONE) {\n\t\t\t\tsourceNode.addError(\"AccessLevel.NONE is not valid here\");\n\t\t\t\taccessOuters = AccessLevel.PUBLIC;\n\t\t\t}\n\t\t\taccessInners = accessOuters == AccessLevel.PROTECTED ? AccessLevel.PUBLIC : accessOuters;\n\t\t\t\n\t\t\toldFluent = toBoolean(annValues.getActualExpression(\"fluent\"), true);\n\t\t\toldChain = toBoolean(annValues.getActualExpression(\"chain\"), true);\n\t\t\t\n\t\t\tbuilderMethodName = ann.builderMethodName();\n\t\t\tbuildMethodName = ann.buildMethodName();\n\t\t\tbuilderClassName = getBuilderClassNameTemplate(node, ann.builderClassName());\n\t\t\ttoBuilder = ann.toBuilder();\n\t\t\t\n\t\t\tif (builderMethodName == null) builderMethodName = \"builder\";\n\t\t\tif (buildMethodName == null) buildMethodName = \"build\";\n\t\t\tif (builderClassName == null) builderClassName = \"\";\n\t\t}\n\t\t\n\t\tstatic String getBuilderClassNameTemplate(JavacNode node, String override) {\n\t\t\tif (override != null && !override.isEmpty()) return override;\n\t\t\toverride = node.getAst().readConfiguration(ConfigurationKeys.BUILDER_CLASS_NAME);\n\t\t\tif (override != null && !override.isEmpty()) return override;\n\t\t\treturn \"*Builder\";\n\t\t}\n\t\t\n\t\tString replaceBuilderClassName(Name name) {\n\t\t\treturn replaceBuilderClassName(name.toString(), builderClassName);\n\t\t}\n\t\t\n\t\tString replaceBuilderClassName(String name, String template) {\n\t\t\tif (template.indexOf('*') == -1) return template;\n\t\t\treturn template.replace(\"*\", name);\n\t\t}\n\t\t\n\t\tJCExpression createBuilderParentTypeReference() {\n\t\t\treturn namePlusTypeParamsToTypeReference(parentType.getTreeMaker(), parentType, typeParams);\n\t\t}\n\t\t\n\t\tName getBuilderClassName() {\n\t\t\treturn parentType.toName(builderClassName);\n\t\t}\n\t\t\n\t\tList<JCTypeParameter> copyTypeParams() {\n\t\t\treturn JavacHandlerUtil.copyTypeParams(sourceNode, typeParams);\n\t\t}\n\t\t\n\t\tName toName(String name) {\n\t\t\treturn parentType.toName(name);\n\t\t}\n\t\t\n\t\tContext getContext() {\n\t\t\treturn parentType.getContext();\n\t\t}\n\t\t\n\t\tJavacTreeMaker getTreeMaker() {\n\t\t\treturn parentType.getTreeMaker();\n\t\t}\n\t}\n\t\n\tstatic class BuilderFieldData {\n\t\tList<JCAnnotation> annotations;\n\t\tJCExpression type;\n\t\tName rawName;\n\t\tName name;\n\t\tName builderFieldName;\n\t\tName nameOfDefaultProvider;\n\t\tName nameOfSetFlag;\n\t\tSingularData singularData;\n\t\tObtainVia obtainVia;\n\t\tJavacNode obtainViaNode;\n\t\tJavacNode originalFieldNode;\n\t\t\n\t\tjava.util.List<JavacNode> createdFields = new ArrayList<JavacNode>();\n\t}\n\t\n\t@Override public void handle(AnnotationValues<Builder> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\tfinal String BUILDER_NODE_NOT_SUPPORTED_ERR = \"@Builder is only supported on classes, records, constructors, and methods.\";\n\t\t\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.BUILDER_FLAG_USAGE, \"@Builder\");\n\t\tBuilderJob job = new BuilderJob();\n\t\tjob.sourceNode = annotationNode;\n\t\tjob.checkerFramework = getCheckerFrameworkVersion(annotationNode);\n\t\tjob.isStatic = true;\n\t\t\n\t\tBuilder annInstance = annotation.getInstance();\n\t\tjob.init(annotation, annInstance, annotationNode);\n\t\tjava.util.List<Name> typeArgsForToBuilder = null;\n\t\t\n\t\tboolean generateBuilderMethod;\n\t\tif (job.builderMethodName.isEmpty()) {\n\t\t\tgenerateBuilderMethod = false;\n\t\t} else if (!checkName(\"builderMethodName\", job.builderMethodName, annotationNode)) {\n\t\t\treturn;\n\t\t} else {\n\t\t\tgenerateBuilderMethod = true;\n\t\t}\n\t\t\n\t\tif (!checkName(\"buildMethodName\", job.buildMethodName, annotationNode)) return;\n\t\t\n\t\t// Do not delete the Builder annotation yet, we need it for @Jacksonized.\n\t\t\n\t\tJavacNode parent = annotationNode.up();\n\t\t\n\t\tjob.builderFields = new ArrayList<BuilderFieldData>();\n\t\tJCExpression buildMethodReturnType;\n\t\tjob.typeParams = List.nil();\n\t\tList<JCExpression> buildMethodThrownExceptions;\n\t\tName nameOfBuilderMethod;\n\t\t\n\t\tJavacNode fillParametersFrom = parent.get() instanceof JCMethodDecl ? parent : null;\n\t\tboolean addCleaning = false;\n\t\t\n\t\tArrayList<JavacNode> nonFinalNonDefaultedFields = null;\n\t\t\n\t\tif (!isStaticAllowed(upToTypeNode(parent))) {\n\t\t\tannotationNode.addError(\"@Builder is not supported on non-static nested classes.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (parent.get() instanceof JCClassDecl) {\n\t\t\tif (!isClass(parent) && !isRecord(parent)) {\n\t\t\t\tannotationNode.addError(BUILDER_NODE_NOT_SUPPORTED_ERR);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tjob.parentType = parent;\n\t\t\tJCClassDecl td = (JCClassDecl) parent.get();\n\t\t\t\n\t\t\tListBuffer<JavacNode> allFields = new ListBuffer<JavacNode>();\n\t\t\tboolean valuePresent = (hasAnnotation(lombok.Value.class, parent) || hasAnnotation(\"lombok.experimental.Value\", parent));\n\t\t\tfor (JavacNode fieldNode : HandleConstructor.findAllFields(parent, true)) {\n\t\t\t\tJCVariableDecl fd = (JCVariableDecl) fieldNode.get();\n\t\t\t\tJavacNode isDefault = findAnnotation(Builder.Default.class, fieldNode, false);\n\t\t\t\tboolean isFinal = (fd.mods.flags & Flags.FINAL) != 0 || (valuePresent && !hasAnnotation(NonFinal.class, fieldNode));\n\t\t\t\t\n\t\t\t\tBuilderFieldData bfd = new BuilderFieldData();\n\t\t\t\tbfd.rawName = fd.name;\n\t\t\t\tbfd.name = removePrefixFromField(fieldNode);\n\t\t\t\tbfd.builderFieldName = bfd.name;\n\t\t\t\tbfd.annotations = findCopyableAnnotations(fieldNode);\n\t\t\t\tbfd.type = fd.vartype;\n\t\t\t\tbfd.singularData = getSingularData(fieldNode, annInstance.setterPrefix());\n\t\t\t\tbfd.originalFieldNode = fieldNode;\n\t\t\t\t\n\t\t\t\tif (bfd.singularData != null && isDefault != null) {\n\t\t\t\t\tisDefault.addError(\"@Builder.Default and @Singular cannot be mixed.\");\n\t\t\t\t\tfindAnnotation(Builder.Default.class, fieldNode, true);\n\t\t\t\t\tisDefault = null;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (fd.init == null && isDefault != null) {\n\t\t\t\t\tisDefault.addWarning(\"@Builder.Default requires an initializing expression (' = something;').\");\n\t\t\t\t\tfindAnnotation(Builder.Default.class, fieldNode, true);\n\t\t\t\t\tisDefault = null;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (fd.init != null && isDefault == null) {\n\t\t\t\t\tif (isFinal) continue;\n\t\t\t\t\tif (nonFinalNonDefaultedFields == null) nonFinalNonDefaultedFields = new ArrayList<JavacNode>();\n\t\t\t\t\tnonFinalNonDefaultedFields.add(fieldNode);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (isDefault != null) {\n\t\t\t\t\tbfd.nameOfDefaultProvider = parent.toName(DEFAULT_PREFIX + bfd.name);\n\t\t\t\t\tbfd.nameOfSetFlag = parent.toName(bfd.name + SET_PREFIX);\n\t\t\t\t\tbfd.builderFieldName = parent.toName(bfd.name + VALUE_PREFIX);\n\t\t\t\t\tJCMethodDecl md = generateDefaultProvider(bfd.nameOfDefaultProvider, fieldNode, td.typarams, job);\n\t\t\t\t\tif (md != null) injectMethod(parent, md);\n\t\t\t\t}\n\t\t\t\taddObtainVia(bfd, fieldNode);\n\t\t\t\tjob.builderFields.add(bfd);\n\t\t\t\tallFields.append(fieldNode);\n\t\t\t}\n\t\t\t\n\t\t\tif (!isRecord(parent)) {\n\t\t\t\t// Records ship with a canonical constructor that acts as @AllArgsConstructor - just use that one.\n\t\t\t\t\n\t\t\t\thandleConstructor.generateConstructor(parent, AccessLevel.PACKAGE, List.<JCAnnotation>nil(), allFields.toList(), false, null, SkipIfConstructorExists.I_AM_BUILDER, annotationNode);\n\t\t\t}\n\t\t\t\n\t\t\tbuildMethodReturnType = namePlusTypeParamsToTypeReference(parent.getTreeMaker(), parent, td.typarams);\n\t\t\tjob.typeParams = job.builderTypeParams = td.typarams;\n\t\t\tbuildMethodThrownExceptions = List.nil();\n\t\t\tnameOfBuilderMethod = null;\n\t\t\tjob.builderClassName = job.replaceBuilderClassName(td.name);\n\t\t\tif (!checkName(\"builderClassName\", job.builderClassName, annotationNode)) return;\n\t\t} else if (fillParametersFrom != null && fillParametersFrom.getName().toString().equals(\"<init>\")) {\n\t\t\tJCMethodDecl jmd = (JCMethodDecl) fillParametersFrom.get();\n\t\t\tif (!jmd.typarams.isEmpty()) {\n\t\t\t\tannotationNode.addError(\"@Builder is not supported on constructors with constructor type parameters.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tjob.parentType = parent.up();\n\t\t\tJCClassDecl td = (JCClassDecl) job.parentType.get();\n\t\t\tjob.typeParams = job.builderTypeParams = td.typarams;\n\t\t\tbuildMethodReturnType = job.createBuilderParentTypeReference();\n\t\t\tbuildMethodThrownExceptions = jmd.thrown;\n\t\t\tnameOfBuilderMethod = null;\n\t\t\tjob.builderClassName = job.replaceBuilderClassName(td.name);\n\t\t\tif (!checkName(\"builderClassName\", job.builderClassName, annotationNode)) return;\n\t\t} else if (fillParametersFrom != null) {\n\t\t\tjob.parentType = parent.up();\n\t\t\tJCClassDecl td = (JCClassDecl) job.parentType.get();\n\t\t\tJCMethodDecl jmd = (JCMethodDecl) fillParametersFrom.get();\n\t\t\tjob.isStatic = (jmd.mods.flags & Flags.STATIC) != 0;\n\t\t\t\n\t\t\tJCExpression fullReturnType = jmd.restype;\n\t\t\tbuildMethodReturnType = fullReturnType;\n\t\t\tjob.typeParams = job.builderTypeParams = jmd.typarams;\n\t\t\tbuildMethodThrownExceptions = jmd.thrown;\n\t\t\tnameOfBuilderMethod = jmd.name;\n\t\t\tif (buildMethodReturnType instanceof JCTypeApply) {\n\t\t\t\tbuildMethodReturnType = cloneType(job.getTreeMaker(), buildMethodReturnType, annotationNode);\n\t\t\t}\n\t\t\tif (job.builderClassName.indexOf('*') > -1) {\n\t\t\t\tString replStr = returnTypeToBuilderClassName(annotationNode, td, buildMethodReturnType, job.typeParams);\n\t\t\t\tif (replStr == null) return; // shuold not happen\n\t\t\t\tjob.builderClassName = job.builderClassName.replace(\"*\", replStr);\n\t\t\t}\n\t\t\tif (job.toBuilder) {\n\t\t\t\tif (fullReturnType instanceof JCArrayTypeTree) {\n\t\t\t\t\tannotationNode.addError(TO_BUILDER_NOT_SUPPORTED);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tName simpleName;\n\t\t\t\tString pkg;\n\t\t\t\tList<JCExpression> tpOnRet = List.nil();\n\t\t\t\t\n\t\t\t\tif (fullReturnType instanceof JCTypeApply) {\n\t\t\t\t\ttpOnRet = ((JCTypeApply) fullReturnType).arguments;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tJCExpression namingType = fullReturnType;\n\t\t\t\tif (buildMethodReturnType instanceof JCTypeApply) namingType = ((JCTypeApply) buildMethodReturnType).clazz;\n\t\t\t\t\n\t\t\t\tif (namingType instanceof JCIdent) {\n\t\t\t\t\tsimpleName = ((JCIdent) namingType).name;\n\t\t\t\t\tpkg = null;\n\t\t\t\t} else if (namingType instanceof JCFieldAccess) {\n\t\t\t\t\tJCFieldAccess jcfa = (JCFieldAccess) namingType;\n\t\t\t\t\tsimpleName = jcfa.name;\n\t\t\t\t\tpkg = unpack(jcfa.selected);\n\t\t\t\t\tif (pkg.startsWith(\"ERR:\")) {\n\t\t\t\t\t\tString err = pkg.substring(4, pkg.indexOf(\"__ERR__\"));\n\t\t\t\t\t\tannotationNode.addError(err);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tannotationNode.addError(\"Expected a (parameterized) type here instead of a \" + namingType.getClass().getName());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (pkg != null && !parent.getPackageDeclaration().equals(pkg)) {\n\t\t\t\t\tannotationNode.addError(TO_BUILDER_NOT_SUPPORTED);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (!job.parentType.getName().contentEquals(simpleName)) {\n\t\t\t\t\tannotationNode.addError(TO_BUILDER_NOT_SUPPORTED);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tList<JCTypeParameter> tpOnMethod = jmd.typarams;\n\t\t\t\tList<JCTypeParameter> tpOnType = ((JCClassDecl) job.parentType.get()).typarams;\n\t\t\t\ttypeArgsForToBuilder = new ArrayList<Name>();\n\t\t\t\t\n\t\t\t\tfor (JCTypeParameter tp : tpOnMethod) {\n\t\t\t\t\tint pos = -1;\n\t\t\t\t\tint idx = -1;\n\t\t\t\t\tfor (JCExpression tOnRet : tpOnRet) {\n\t\t\t\t\t\tidx++;\n\t\t\t\t\t\tif (!(tOnRet instanceof JCIdent)) continue;\n\t\t\t\t\t\tif (((JCIdent) tOnRet).name != tp.name) continue;\n\t\t\t\t\t\tpos = idx;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (pos == -1 || tpOnType.size() <= pos) {\n\t\t\t\t\t\tannotationNode.addError(\"@Builder(toBuilder=true) requires that each type parameter on the static method is part of the typeargs of the return value. Type parameter \" + tp.name + \" is not part of the return type.\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\ttypeArgsForToBuilder.add(tpOnType.get(pos).name);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tannotationNode.addError(BUILDER_NODE_NOT_SUPPORTED_ERR);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (fillParametersFrom != null) {\n\t\t\tfor (JavacNode param : fillParametersFrom.down()) {\n\t\t\t\tif (param.getKind() != Kind.ARGUMENT) continue;\n\t\t\t\tBuilderFieldData bfd = new BuilderFieldData();\n\t\t\t\t\n\t\t\t\tJCVariableDecl raw = (JCVariableDecl) param.get();\n\t\t\t\tbfd.name = raw.name;\n\t\t\t\tbfd.builderFieldName = bfd.name;\n\t\t\t\tbfd.rawName = raw.name;\n\t\t\t\tbfd.annotations = findCopyableAnnotations(param);\n\t\t\t\tbfd.type = raw.vartype;\n\t\t\t\tbfd.singularData = getSingularData(param, annInstance.setterPrefix());\n\t\t\t\tbfd.originalFieldNode = param;\n\t\t\t\taddObtainVia(bfd, param);\n\t\t\t\tjob.builderFields.add(bfd);\n\t\t\t}\n\t\t}\n\t\t\n\t\tjob.builderType = findInnerClass(job.parentType, job.builderClassName);\n\t\tif (job.builderType == null) {\n\t\t\tjob.builderType = makeBuilderClass(job);\n\t\t\trecursiveSetGeneratedBy(job.builderType.get(), annotationNode);\n\t\t} else {\n\t\t\tJCClassDecl builderTypeDeclaration = (JCClassDecl) job.builderType.get();\n\t\t\tif (job.isStatic && !builderTypeDeclaration.getModifiers().getFlags().contains(Modifier.STATIC)) {\n\t\t\t\tannotationNode.addError(\"Existing Builder must be a static inner class.\");\n\t\t\t\treturn;\n\t\t\t} else if (!job.isStatic && builderTypeDeclaration.getModifiers().getFlags().contains(Modifier.STATIC)) {\n\t\t\t\tannotationNode.addError(\"Existing Builder must be a non-static inner class.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsanityCheckForMethodGeneratingAnnotationsOnBuilderClass(job.builderType, annotationNode);\n\t\t\t/* generate errors for @Singular BFDs that have one already defined node. */ {\n\t\t\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\t\t\tSingularData sd = bfd.singularData;\n\t\t\t\t\tif (sd == null) continue;\n\t\t\t\t\tJavacSingularizer singularizer = sd.getSingularizer();\n\t\t\t\t\tif (singularizer == null) continue;\n\t\t\t\t\tif (singularizer.checkForAlreadyExistingNodesAndGenerateError(job.builderType, sd)) {\n\t\t\t\t\t\tbfd.singularData = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\tif (bfd.singularData != null && bfd.singularData.getSingularizer() != null) {\n\t\t\t\tif (bfd.singularData.getSingularizer().requiresCleaning()) {\n\t\t\t\t\taddCleaning = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (bfd.obtainVia != null) {\n\t\t\t\tif (bfd.obtainVia.field().isEmpty() == bfd.obtainVia.method().isEmpty()) {\n\t\t\t\t\tbfd.obtainViaNode.addError(\"The syntax is either @ObtainVia(field = \\\"fieldName\\\") or @ObtainVia(method = \\\"methodName\\\").\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (bfd.obtainVia.method().isEmpty() && bfd.obtainVia.isStatic()) {\n\t\t\t\t\tbfd.obtainViaNode.addError(\"@ObtainVia(isStatic = true) is not valid unless 'method' has been set.\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tgenerateBuilderFields(job);\n\t\tif (addCleaning) {\n\t\t\tJavacTreeMaker maker = job.getTreeMaker();\n\t\t\tJCVariableDecl uncleanField = maker.VarDef(maker.Modifiers(Flags.PRIVATE), job.builderType.toName(CLEAN_FIELD_NAME), maker.TypeIdent(CTC_BOOLEAN), null);\n\t\t\tinjectFieldAndMarkGenerated(job.builderType, uncleanField);\n\t\t\trecursiveSetGeneratedBy(uncleanField, annotationNode);\n\t\t}\n\t\t\n\t\tif (constructorExists(job.builderType) == MemberExistsResult.NOT_EXISTS) {\n\t\t\tJCMethodDecl cd = HandleConstructor.createConstructor(AccessLevel.PACKAGE, List.<JCAnnotation>nil(), job.builderType, List.<JavacNode>nil(), false, annotationNode);\n\t\t\tif (cd != null) injectMethod(job.builderType, cd);\n\t\t}\n\t\t\n\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\tmakePrefixedSetterMethodsForBuilder(job, bfd, annInstance.setterPrefix());\n\t\t}\n\t\t\n\t\t{\n\t\t\tMemberExistsResult methodExists = methodExists(job.buildMethodName, job.builderType, -1);\n\t\t\tif (methodExists == MemberExistsResult.EXISTS_BY_LOMBOK) methodExists = methodExists(job.buildMethodName, job.builderType, 0);\n\t\t\tif (methodExists == MemberExistsResult.NOT_EXISTS) {\n\t\t\t\tJCMethodDecl md = generateBuildMethod(job, nameOfBuilderMethod, buildMethodReturnType, buildMethodThrownExceptions, addCleaning);\n\t\t\t\tif (md != null) {\n\t\t\t\t\trecursiveSetGeneratedBy(md, annotationNode);\n\t\t\t\t\tinjectMethod(job.builderType, md);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (methodExists(\"toString\", job.builderType, 0) == MemberExistsResult.NOT_EXISTS) {\n\t\t\tjava.util.List<Included<JavacNode, ToString.Include>> fieldNodes = new ArrayList<Included<JavacNode, ToString.Include>>();\n\t\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\t\tfor (JavacNode f : bfd.createdFields) {\n\t\t\t\t\tfieldNodes.add(new Included<JavacNode, ToString.Include>(f, null, true, false));\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tJCMethodDecl md = HandleToString.createToString(job.builderType, fieldNodes, true, false, FieldAccess.ALWAYS_FIELD, job.sourceNode);\n\t\t\tif (md != null) injectMethod(job.builderType, md);\n\t\t}\n\t\t\n\t\tif (addCleaning) injectMethod(job.builderType, generateCleanMethod(job));\n\t\t\n\t\tif (generateBuilderMethod && methodExists(job.builderMethodName, job.parentType, -1) != MemberExistsResult.NOT_EXISTS) generateBuilderMethod = false;\n\t\tif (generateBuilderMethod) {\n\t\t\tJCMethodDecl md = generateBuilderMethod(job);\n\t\t\trecursiveSetGeneratedBy(md, annotationNode);\n\t\t\tif (md != null) injectMethod(job.parentType, md);\n\t\t}\n\t\t\n\t\tif (job.toBuilder) {\n\t\t\tswitch (methodExists(TO_BUILDER_METHOD_NAME, job.parentType, 0)) {\n\t\t\tcase EXISTS_BY_USER:\n\t\t\t\tannotationNode.addWarning(\"Not generating toBuilder() as it already exists.\");\n\t\t\t\treturn;\n\t\t\tcase NOT_EXISTS:\n\t\t\t\tList<JCTypeParameter> tps = job.typeParams;\n\t\t\t\tif (typeArgsForToBuilder != null) {\n\t\t\t\t\tListBuffer<JCTypeParameter> lb = new ListBuffer<JCTypeParameter>();\n\t\t\t\t\tJavacTreeMaker maker = job.getTreeMaker();\n\t\t\t\t\tfor (Name n : typeArgsForToBuilder) {\n\t\t\t\t\t\tlb.append(maker.TypeParameter(n, List.<JCExpression>nil()));\n\t\t\t\t\t}\n\t\t\t\t\ttps = lb.toList();\n\t\t\t\t}\n\t\t\t\tJCMethodDecl md = generateToBuilderMethod(job, tps, annInstance.setterPrefix());\n\t\t\t\tif (md != null) {\n\t\t\t\t\trecursiveSetGeneratedBy(md, annotationNode);\n\t\t\t\t\tinjectMethod(job.parentType, md);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (nonFinalNonDefaultedFields != null && generateBuilderMethod) {\n\t\t\tfor (JavacNode fieldNode : nonFinalNonDefaultedFields) {\n\t\t\t\tfieldNode.addWarning(\"@Builder will ignore the initializing expression entirely. If you want the initializing expression to serve as default, add @Builder.Default. If it is not supposed to be settable during building, make the field final.\");\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic String returnTypeToBuilderClassName(JavacNode annotationNode, JCClassDecl td, JCExpression returnType, List<JCTypeParameter> typeParams) {\n\t\tString replStr = null;\n\t\tif (returnType instanceof JCFieldAccess) {\n\t\t\treplStr = ((JCFieldAccess) returnType).name.toString();\n\t\t} else if (returnType instanceof JCIdent) {\n\t\t\tName n = ((JCIdent) returnType).name;\n\t\t\t\n\t\t\tfor (JCTypeParameter tp : typeParams) {\n\t\t\t\tif (tp.name.equals(n)) {\n\t\t\t\t\tannotationNode.addError(\"@Builder requires specifying 'builderClassName' if used on methods with a type parameter as return type.\");\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t\treplStr = n.toString();\n\t\t} else if (returnType instanceof JCPrimitiveTypeTree) {\n\t\t\treplStr = returnType.toString();\n\t\t\tif (Character.isLowerCase(replStr.charAt(0))) {\n\t\t\t\treplStr = Character.toTitleCase(replStr.charAt(0)) + replStr.substring(1);\n\t\t\t}\n\t\t} else if (returnType instanceof JCTypeApply) {\n\t\t\tJCExpression clazz = ((JCTypeApply) returnType).clazz;\n\t\t\tif (clazz instanceof JCFieldAccess) {\n\t\t\t\treplStr = ((JCFieldAccess) clazz).name.toString();\n\t\t\t} else if (clazz instanceof JCIdent) {\n\t\t\t\treplStr = ((JCIdent) clazz).name.toString();\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (replStr == null || replStr.isEmpty()) {\n\t\t\t// This shouldn't happen.\n\t\t\tSystem.err.println(\"Lombok bug ID#20140614-1651: javac HandleBuilder: return type to name conversion failed: \" + returnType.getClass());\n\t\t\treplStr = td.name.toString();\n\t\t}\n\t\treturn replStr;\n\t}\n\t\n\tprivate static String unpack(JCExpression expr) {\n\t\tStringBuilder sb = new StringBuilder();\n\t\tunpack(sb, expr);\n\t\treturn sb.toString();\n\t}\n\t\n\tprivate static void unpack(StringBuilder sb, JCExpression expr) {\n\t\tif (expr instanceof JCIdent) {\n\t\t\tsb.append(((JCIdent) expr).name.toString());\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (expr instanceof JCFieldAccess) {\n\t\t\tJCFieldAccess jcfa = (JCFieldAccess) expr;\n\t\t\tunpack(sb, jcfa.selected);\n\t\t\tsb.append(\".\").append(jcfa.name.toString());\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (expr instanceof JCTypeApply) {\n\t\t\tsb.setLength(0);\n\t\t\tsb.append(\"ERR:\");\n\t\t\tsb.append(\"@Builder(toBuilder=true) is not supported if returning a type with generics applied to an intermediate.\");\n\t\t\tsb.append(\"__ERR__\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tsb.setLength(0);\n\t\tsb.append(\"ERR:\");\n\t\tsb.append(\"Expected a type of some sort, not a \" + expr.getClass().getName());\n\t\tsb.append(\"__ERR__\");\n\t}\n\t\n\tprivate JCMethodDecl generateToBuilderMethod(BuilderJob job, List<JCTypeParameter> typeParameters, String prefix) {\n\t\t// return new ThingieBuilder<A, B>().setA(this.a).setB(this.b);\n\t\tJavacTreeMaker maker = job.getTreeMaker();\n\t\t\n\t\tJCExpression call = maker.NewClass(null, List.<JCExpression>nil(), namePlusTypeParamsToTypeReference(maker, job.parentType, job.toName(job.builderClassName), !job.isStatic, job.builderTypeParams), List.<JCExpression>nil(), null);\n\t\tJCExpression invoke = call;\n\t\tListBuffer<JCStatement> preStatements = null;\n\t\tListBuffer<JCStatement> statements = new ListBuffer<JCStatement>();\n\t\t\n\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\tString setterPrefix = !prefix.isEmpty() ? prefix : job.oldFluent ? \"\" : \"set\";\n\t\t\tString prefixedSetterName = bfd.name.toString();\n\t\t\tif (!setterPrefix.isEmpty()) prefixedSetterName = HandlerUtil.buildAccessorName(job.sourceNode, setterPrefix, prefixedSetterName);\n\t\t\t\n\t\t\tName setterName = job.toName(prefixedSetterName);\n\t\t\tJCExpression[] tgt = new JCExpression[bfd.singularData == null ? 1 : 2];\n\t\t\tif (bfd.obtainVia == null || !bfd.obtainVia.field().isEmpty()) {\n\t\t\t\tfor (int i = 0; i < tgt.length; i++) {\n\t\t\t\t\ttgt[i] = maker.Select(maker.Ident(job.toName(\"this\")), bfd.obtainVia == null ? bfd.rawName : job.toName(bfd.obtainVia.field()));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tString name = bfd.obtainVia.method();\n\t\t\t\tJCMethodInvocation inv;\n\t\t\t\tif (bfd.obtainVia.isStatic()) {\n\t\t\t\t\tJCExpression c = maker.Select(maker.Ident(job.toName(job.parentType.getName())), job.toName(name));\n\t\t\t\t\tinv = maker.Apply(typeParameterNames(maker, typeParameters), c, List.<JCExpression>of(maker.Ident(job.toName(\"this\"))));\n\t\t\t\t} else {\n\t\t\t\t\tJCExpression c = maker.Select(maker.Ident(job.toName(\"this\")), job.toName(name));\n\t\t\t\t\tinv = maker.Apply(List.<JCExpression>nil(), c, List.<JCExpression>nil());\n\t\t\t\t}\n\t\t\t\tfor (int i = 0; i < tgt.length; i++) tgt[i] = maker.Ident(bfd.name);\n\t\t\t\t\n\t\t\t\t// javac appears to cache the type of JCMethodInvocation expressions based on position, meaning, if you have 2 ObtainVia-based method invokes on different types, you get bizarre type mismatch errors.\n\t\t\t\t// going via a local variable declaration solves the problem.\n\t\t\t\tJCExpression varType = JavacHandlerUtil.cloneType(maker, bfd.type, job.sourceNode);\n\t\t\t\tif (preStatements == null) preStatements = new ListBuffer<JCStatement>();\n\t\t\t\tpreStatements.append(maker.VarDef(maker.Modifiers(Flags.FINAL), bfd.name, varType, inv));\n\t\t\t}\n\t\t\t\n\t\t\tJCExpression arg;\n\t\t\tif (bfd.singularData == null) {\n\t\t\t\targ = tgt[0];\n\t\t\t\tinvoke = maker.Apply(List.<JCExpression>nil(), maker.Select(invoke, setterName), List.of(arg));\n\t\t\t} else {\n\t\t\t\tJCExpression isNotNull = maker.Binary(CTC_NOT_EQUAL, tgt[0], maker.Literal(CTC_BOT, null));\n\t\t\t\tJCExpression invokeBuilder = maker.Apply(List.<JCExpression>nil(), maker.Select(maker.Ident(job.toName(BUILDER_TEMP_VAR)), setterName), List.<JCExpression>of(tgt[1]));\n\t\t\t\tstatements.append(maker.If(isNotNull, maker.Exec(invokeBuilder), null));\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (!statements.isEmpty()) {\n\t\t\tJCExpression tempVarType = namePlusTypeParamsToTypeReference(maker, job.parentType, job.getBuilderClassName(), !job.isStatic, typeParameters);\n\t\t\tstatements.prepend(maker.VarDef(maker.Modifiers(Flags.FINAL), job.toName(BUILDER_TEMP_VAR), tempVarType, invoke));\n\t\t\tstatements.append(maker.Return(maker.Ident(job.toName(BUILDER_TEMP_VAR))));\n\t\t} else {\n\t\t\tstatements.append(maker.Return(invoke));\n\t\t}\n\t\t\n\t\tif (preStatements != null) {\n\t\t\tpreStatements.appendList(statements);\n\t\t\tstatements = preStatements;\n\t\t}\n\t\tJCBlock body = maker.Block(0, statements.toList());\n\t\tList<JCAnnotation> annsOnParamType = List.nil();\n\t\tif (job.checkerFramework.generateUnique()) annsOnParamType = List.of(maker.Annotation(genTypeRef(job.parentType, CheckerFrameworkVersion.NAME__UNIQUE), List.<JCExpression>nil()));\n\t\tJCMethodDecl methodDef = maker.MethodDef(maker.Modifiers(toJavacModifier(job.accessOuters)), job.toName(TO_BUILDER_METHOD_NAME), namePlusTypeParamsToTypeReference(maker, job.parentType, job.getBuilderClassName(), !job.isStatic, typeParameters, annsOnParamType), List.<JCTypeParameter>nil(), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), body, null);\n\t\tcreateRelevantNonNullAnnotation(job.parentType, methodDef);\n\t\treturn methodDef;\n\t}\n\t\n\tprivate JCMethodDecl generateCleanMethod(BuilderJob job) {\n\t\tJavacTreeMaker maker = job.getTreeMaker();\n\t\tListBuffer<JCStatement> statements = new ListBuffer<JCStatement>();\n\t\t\n\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\tif (bfd.singularData != null && bfd.singularData.getSingularizer() != null) {\n\t\t\t\tbfd.singularData.getSingularizer().appendCleaningCode(bfd.singularData, job.builderType, job.sourceNode, statements);\n\t\t\t}\n\t\t}\n\t\t\n\t\tstatements.append(maker.Exec(maker.Assign(maker.Select(maker.Ident(job.toName(\"this\")), job.toName(CLEAN_FIELD_NAME)), maker.Literal(CTC_BOOLEAN, 0))));\n\t\tJCBlock body = maker.Block(0, statements.toList());\n\t\tJCMethodDecl method = maker.MethodDef(maker.Modifiers(toJavacModifier(AccessLevel.PRIVATE)), job.toName(CLEAN_METHOD_NAME), maker.Type(Javac.createVoidType(job.builderType.getSymbolTable(), CTC_VOID)), List.<JCTypeParameter>nil(), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), body, null);\n\t\trecursiveSetGeneratedBy(method, job.sourceNode);\n\t\treturn method;\n\t}\n\t\n\tstatic JCVariableDecl generateReceiver(BuilderJob job) {\n\t\tif (!job.checkerFramework.generateCalledMethods()) return null;\n\t\t\n\t\tArrayList<String> mandatories = new ArrayList<String>();\n\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\tif (bfd.singularData == null && bfd.nameOfSetFlag == null) mandatories.add(bfd.name.toString());\n\t\t}\n\t\t\n\t\tJCExpression arg;\n\t\tJavacTreeMaker maker = job.getTreeMaker();\n\t\tif (mandatories.size() == 0) return null;\n\t\tif (mandatories.size() == 1) arg = maker.Literal(mandatories.get(0));\n\t\telse {\n\t\t\tList<JCExpression> elems = List.nil();\n\t\t\tfor (int i = mandatories.size() - 1; i >= 0; i--) elems = elems.prepend(maker.Literal(mandatories.get(i)));\n\t\t\targ = maker.NewArray(null, List.<JCExpression>nil(), elems);\n\t\t}\n\t\tJCAnnotation recvAnno = maker.Annotation(genTypeRef(job.builderType, CheckerFrameworkVersion.NAME__CALLED), List.of(arg));\n\t\tJCClassDecl builderTypeNode = (JCClassDecl) job.builderType.get();\n\t\tJCVariableDecl recv = maker.VarDef(maker.Modifiers(Flags.PARAMETER, List.<JCAnnotation>nil()), job.toName(\"this\"), namePlusTypeParamsToTypeReference(maker, job.builderType, builderTypeNode.typarams, List.<JCAnnotation>of(recvAnno)), null);\n\t\treturn recv;\n\t}\n\t\n\tprivate JCMethodDecl generateBuildMethod(BuilderJob job, Name staticName, JCExpression returnType, List<JCExpression> thrownExceptions, boolean addCleaning) {\n\t\tJavacTreeMaker maker = job.getTreeMaker();\n\t\t\n\t\tJCExpression call;\n\t\tListBuffer<JCStatement> statements = new ListBuffer<JCStatement>();\n\t\t\n\t\tif (addCleaning) {\n\t\t\tJCExpression notClean = maker.Unary(CTC_NOT, maker.Select(maker.Ident(job.toName(\"this\")), job.toName(CLEAN_FIELD_NAME)));\n\t\t\tJCStatement invokeClean = maker.Exec(maker.Apply(List.<JCExpression>nil(), maker.Ident(job.toName(CLEAN_METHOD_NAME)), List.<JCExpression>nil()));\n\t\t\tJCIf ifUnclean = maker.If(notClean, invokeClean, null);\n\t\t\tstatements.append(ifUnclean);\n\t\t}\n\t\t\n\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\tif (bfd.singularData != null && bfd.singularData.getSingularizer() != null) {\n\t\t\t\tbfd.singularData.getSingularizer().appendBuildCode(bfd.singularData, job.builderType, job.sourceNode, statements, bfd.builderFieldName, \"this\");\n\t\t\t}\n\t\t}\n\t\t\n\t\tListBuffer<JCExpression> args = new ListBuffer<JCExpression>();\n\t\tName thisName = job.toName(\"this\");\n\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\tif (bfd.nameOfSetFlag != null) {\n\t\t\t\tstatements.append(maker.VarDef(maker.Modifiers(0L), bfd.builderFieldName, cloneType(maker, bfd.type, job.sourceNode), maker.Select(maker.Ident(thisName), bfd.builderFieldName)));\n\t\t\t\tstatements.append(maker.If(maker.Unary(CTC_NOT, maker.Select(maker.Ident(thisName), bfd.nameOfSetFlag)), maker.Exec(maker.Assign(maker.Ident(bfd.builderFieldName), maker.Apply(typeParameterNames(maker, ((JCClassDecl) job.parentType.get()).typarams), maker.Select(maker.Ident(((JCClassDecl) job.parentType.get()).name), bfd.nameOfDefaultProvider), List.<JCExpression>nil()))), null));\n\t\t\t}\n\t\t\tif (bfd.nameOfSetFlag != null || (bfd.singularData != null && bfd.singularData.getSingularizer().shadowedDuringBuild())) {\n\t\t\t\targs.append(maker.Ident(bfd.builderFieldName));\n\t\t\t} else {\n\t\t\t\targs.append(maker.Select(maker.Ident(thisName), bfd.builderFieldName));\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (addCleaning) {\n\t\t\tstatements.append(maker.Exec(maker.Assign(maker.Select(maker.Ident(job.toName(\"this\")), job.toName(CLEAN_FIELD_NAME)), maker.Literal(CTC_BOOLEAN, 1))));\n\t\t}\n\t\t\n\t\tif (staticName == null) {\n\t\t\tcall = maker.NewClass(null, List.<JCExpression>nil(), returnType, args.toList(), null);\n\t\t\tstatements.append(maker.Return(call));\n\t\t} else {\n\t\t\tListBuffer<JCExpression> typeParams = new ListBuffer<JCExpression>();\n\t\t\tfor (JCTypeParameter tp : ((JCClassDecl) job.builderType.get()).typarams) {\n\t\t\t\ttypeParams.append(maker.Ident(tp.name));\n\t\t\t}\n\t\t\tJCExpression callee = maker.Ident(((JCClassDecl) job.parentType.get()).name);\n\t\t\tif (!job.isStatic) callee = maker.Select(callee, job.toName(\"this\"));\n\t\t\tJCExpression fn = maker.Select(callee, staticName);\n\t\t\tcall = maker.Apply(typeParams.toList(), fn, args.toList());\n\t\t\tif (returnType instanceof JCPrimitiveTypeTree && CTC_VOID.equals(typeTag(returnType))) {\n\t\t\t\tstatements.append(maker.Exec(call));\n\t\t\t} else {\n\t\t\t\tstatements.append(maker.Return(call));\n\t\t\t}\n\t\t}\n\t\t\n\t\tJCBlock body = maker.Block(0, statements.toList());\n\t\t\n\t\tList<JCAnnotation> annsOnMethod = job.checkerFramework.generateSideEffectFree() ? List.of(maker.Annotation(genTypeRef(job.builderType, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil())) : List.<JCAnnotation>nil();\n\t\tJCVariableDecl recv = generateReceiver(job);\n\t\tJCMethodDecl methodDef;\n\t\tJCExpression returnTypeCopy = cloneType(maker, returnType, job.sourceNode);\n\t\tif (recv != null && maker.hasMethodDefWithRecvParam()) {\n\t\t\tmethodDef = maker.MethodDefWithRecvParam(maker.Modifiers(toJavacModifier(job.accessInners), annsOnMethod), job.toName(job.buildMethodName), returnTypeCopy, List.<JCTypeParameter>nil(), recv, List.<JCVariableDecl>nil(), thrownExceptions, body, null);\n\t\t} else {\n\t\t\tmethodDef = maker.MethodDef(maker.Modifiers(toJavacModifier(job.accessInners), annsOnMethod), job.toName(job.buildMethodName), returnTypeCopy, List.<JCTypeParameter>nil(), List.<JCVariableDecl>nil(), thrownExceptions, body, null);\n\t\t}\n\t\tif (staticName == null) createRelevantNonNullAnnotation(job.builderType, methodDef);\n\t\treturn methodDef;\n\t}\n\t\n\tpublic static JCMethodDecl generateDefaultProvider(Name methodName, JavacNode fieldNode, List<JCTypeParameter> params, BuilderJob job) {\n\t\tJavacTreeMaker maker = fieldNode.getTreeMaker();\n\t\tJCVariableDecl field = (JCVariableDecl) fieldNode.get();\n\t\t\n\t\t// Lombok tries to keep the position of the original initializer. First we save the expression ...\n\t\tJCExpression init = field.init;\n\t\tfield.init = null;\n\t\t\n\t\t// ... then we generate an empty return statement ...\n\t\tJCReturn statement = maker.Return(null);\n\t\tJCBlock body = maker.Block(0, List.<JCStatement>of(statement));\n\t\tint modifiers = Flags.PRIVATE | Flags.STATIC;\n\t\tJCMethodDecl defaultProvider = maker.MethodDef(maker.Modifiers(modifiers), methodName, cloneType(maker, field.vartype, fieldNode), copyTypeParams(fieldNode, params), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), body, null);\n\t\t// ... then we convert short array initializers from `{1,2}` to `new int[]{1,2}` ...\n\t\tif (init instanceof JCNewArray && field.vartype instanceof JCArrayTypeTree) {\n\t\t\tJCNewArray arrayInitializer = (JCNewArray) init;\n\t\t\tJCArrayTypeTree fieldType = (JCArrayTypeTree) field.vartype;\n\t\t\tif (arrayInitializer.elemtype == null) {\n\t\t\t\tarrayInitializer.elemtype = cloneType(maker, fieldType.elemtype, fieldNode);\n\t\t\t}\n\t\t}\n\t\t// ... then we set positions for everything else ...\n\t\trecursiveSetGeneratedBy(defaultProvider, job.sourceNode);\n\t\t// ... and finally add back the original expression\n\t\tstatement.expr = init;\n\t\treturn defaultProvider;\n\t}\n\t\n\tpublic JCMethodDecl generateBuilderMethod(BuilderJob job) {\n\t\t//String builderClassName, JavacNode source, JavacNode type, List<JCTypeParameter> typeParams, AccessLevel access) {\n\t\t//builderClassName, annotationNode, tdParent, typeParams, accessForOuters);\n\t\t\n\t\tJavacTreeMaker maker = job.getTreeMaker();\n\t\t\n\t\tJCExpression call;\n\t\tif (job.isStatic) {\n\t\t\tcall = maker.NewClass(null, List.<JCExpression>nil(), namePlusTypeParamsToTypeReference(maker, job.parentType, job.toName(job.builderClassName), false, job.typeParams), List.<JCExpression>nil(), null);\n\t\t} else {\n\t\t\tcall = maker.NewClass(null, List.<JCExpression>nil(), namePlusTypeParamsToTypeReference(maker, null, job.toName(job.builderClassName), false, job.typeParams), List.<JCExpression>nil(), null);\n\t\t\t((JCNewClass) call).encl = maker.Ident(job.toName(\"this\"));\n\t\t\t\n\t\t}\n\t\tJCStatement statement = maker.Return(call);\n\t\t\n\t\tJCBlock body = maker.Block(0, List.<JCStatement>of(statement));\n\t\tint modifiers = toJavacModifier(job.accessOuters);\n\t\tif (job.isStatic) modifiers |= Flags.STATIC;\n\t\tList<JCAnnotation> annsOnMethod = List.nil();\n\t\tif (job.checkerFramework.generateSideEffectFree()) annsOnMethod = List.of(maker.Annotation(genTypeRef(job.parentType, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil()));\n\t\tList<JCAnnotation> annsOnParamType = List.nil();\n\t\tif (job.checkerFramework.generateUnique()) annsOnParamType = List.of(maker.Annotation(genTypeRef(job.parentType, CheckerFrameworkVersion.NAME__UNIQUE), List.<JCExpression>nil()));\n\t\t\n\t\tJCExpression returnType = namePlusTypeParamsToTypeReference(maker, job.parentType, job.getBuilderClassName(), !job.isStatic, job.builderTypeParams, annsOnParamType);\n\t\tJCMethodDecl methodDef = maker.MethodDef(maker.Modifiers(modifiers, annsOnMethod), job.toName(job.builderMethodName), returnType, job.copyTypeParams(), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), body, null);\n\t\tcreateRelevantNonNullAnnotation(job.parentType, methodDef);\n\t\treturn methodDef;\n\t}\n\t\n\tpublic void generateBuilderFields(BuilderJob job) {\n\t\tint len = job.builderFields.size();\n\t\tjava.util.List<JavacNode> existing = new ArrayList<JavacNode>();\n\t\tfor (JavacNode child : job.builderType.down()) {\n\t\t\tif (child.getKind() == Kind.FIELD) existing.add(child);\n\t\t}\n\t\t\n\t\tjava.util.List<JCVariableDecl> generated = new ArrayList<JCVariableDecl>();\n\t\t\n\t\tfor (int i = len - 1; i >= 0; i--) {\n\t\t\tBuilderFieldData bfd = job.builderFields.get(i);\n\t\t\tif (bfd.singularData != null && bfd.singularData.getSingularizer() != null) {\n\t\t\t\tjava.util.List<JavacNode> generateSingularFields = bfd.singularData.getSingularizer().generateFields(bfd.singularData, job.builderType, job.sourceNode);\n\t\t\t\tfor (JavacNode field : generateSingularFields) {\n\t\t\t\t\tgenerated.add((JCVariableDecl) field.get());\n\t\t\t\t}\n\t\t\t\tbfd.createdFields.addAll(generateSingularFields);\n\t\t\t} else {\n\t\t\t\tJavacNode field = null, setFlag = null;\n\t\t\t\tfor (JavacNode exists : existing) {\n\t\t\t\t\tName n = ((JCVariableDecl) exists.get()).name;\n\t\t\t\t\tif (n.equals(bfd.builderFieldName)) field = exists;\n\t\t\t\t\tif (n.equals(bfd.nameOfSetFlag)) setFlag = exists;\n\t\t\t\t}\n\t\t\t\tJavacTreeMaker maker = job.getTreeMaker();\n\t\t\t\tif (field == null) {\n\t\t\t\t\tJCModifiers mods = maker.Modifiers(Flags.PRIVATE);\n\t\t\t\t\tJCVariableDecl newField = maker.VarDef(mods, bfd.builderFieldName, cloneType(maker, bfd.type, job.sourceNode), null);\n\t\t\t\t\tfield = injectFieldAndMarkGenerated(job.builderType, newField);\n\t\t\t\t\tgenerated.add(newField);\n\t\t\t\t}\n\t\t\t\tif (setFlag == null && bfd.nameOfSetFlag != null) {\n\t\t\t\t\tJCModifiers mods = maker.Modifiers(Flags.PRIVATE);\n\t\t\t\t\tJCVariableDecl newField = maker.VarDef(mods, bfd.nameOfSetFlag, maker.TypeIdent(CTC_BOOLEAN), null);\n\t\t\t\t\tinjectFieldAndMarkGenerated(job.builderType, newField);\n\t\t\t\t\tgenerated.add(newField);\n\t\t\t\t}\n\t\t\t\tbfd.createdFields.add(field);\n\t\t\t}\n\t\t}\n\t\tfor (JCVariableDecl gen : generated) recursiveSetGeneratedBy(gen, job.sourceNode);\n\t}\n\t\n\tpublic void makePrefixedSetterMethodsForBuilder(BuilderJob job, BuilderFieldData bfd, String prefix) {\n\t\tboolean deprecate = isFieldDeprecated(bfd.originalFieldNode);\n\t\tif (bfd.singularData == null || bfd.singularData.getSingularizer() == null) {\n\t\t\tmakePrefixedSetterMethodForBuilder(job, bfd, deprecate, prefix);\n\t\t} else {\n\t\t\tbfd.singularData.getSingularizer().generateMethods(job, bfd.singularData, deprecate);\n\t\t}\n\t}\n\t\n\tprivate void makePrefixedSetterMethodForBuilder(BuilderJob job, BuilderFieldData bfd, boolean deprecate, String prefix) {\n\t\tJavacNode fieldNode = bfd.createdFields.get(0);\n\t\tString setterPrefix = !prefix.isEmpty() ? prefix : job.oldFluent ? \"\" : \"set\";\n\t\tString setterName = HandlerUtil.buildAccessorName(job.sourceNode, setterPrefix, bfd.name.toString());\n\t\tName setterName_ = job.builderType.toName(setterName);\n\t\t\n\t\tfor (JavacNode child : job.builderType.down()) {\n\t\t\tif (child.getKind() != Kind.METHOD) continue;\n\t\t\tJCMethodDecl methodDecl = (JCMethodDecl) child.get();\n\t\t\tName existingName = methodDecl.name;\n\t\t\tif (existingName.equals(setterName_) && !isTolerate(fieldNode, methodDecl)) return;\n\t\t}\n\t\t\n\t\tJavacTreeMaker maker = fieldNode.getTreeMaker();\n\t\t\n\t\tList<JCAnnotation> methodAnns = JavacHandlerUtil.findCopyableToSetterAnnotations(bfd.originalFieldNode, true);\n\t\tJCMethodDecl newMethod = HandleSetter.createSetter(toJavacModifier(job.accessInners), deprecate, fieldNode, maker, setterName, bfd.name, bfd.nameOfSetFlag, job.oldChain, job.sourceNode, methodAnns, bfd.annotations);\n\t\trecursiveSetGeneratedBy(newMethod, job.sourceNode);\n\t\tif (job.sourceNode.up().getKind() == Kind.METHOD) {\n\t\t\tcopyJavadocFromParam(bfd.originalFieldNode.up(), newMethod, bfd.name.toString());\n\t\t} else {\n\t\t\tcopyJavadoc(bfd.originalFieldNode, newMethod, CopyJavadoc.SETTER, true);\n\t\t}\n\t\t\n\t\tinjectMethod(job.builderType, newMethod);\n\t}\n\t\n\tpublic JavacNode makeBuilderClass(BuilderJob job) {\n\t\t//boolean isStatic, JavacNode source, JavacNode tdParent, String builderClassName, List<JCTypeParameter> typeParams, JCAnnotation ast, AccessLevel access) {\n\t\t//isStatic, annotationNode, tdParent, builderClassName, typeParams, ast, accessForOuters\n\t\tJavacTreeMaker maker = job.getTreeMaker();\n\t\tint modifiers = toJavacModifier(job.accessOuters);\n\t\tif (job.isStatic) modifiers |= Flags.STATIC;\n\t\tJCModifiers mods = maker.Modifiers(modifiers);\n\t\tJCClassDecl builder = maker.ClassDef(mods, job.getBuilderClassName(), job.copyTypeParams(), null, List.<JCExpression>nil(), List.<JCTree>nil());\n\t\trecursiveSetGeneratedBy(builder, job.sourceNode);\n\t\treturn injectType(job.parentType, builder);\n\t}\n\t\n\tprivate void addObtainVia(BuilderFieldData bfd, JavacNode node) {\n\t\tfor (JavacNode child : node.down()) {\n\t\t\tif (!annotationTypeMatches(ObtainVia.class, child)) continue;\n\t\t\tAnnotationValues<ObtainVia> ann = createAnnotation(ObtainVia.class, child);\n\t\t\tbfd.obtainVia = ann.getInstance();\n\t\t\tbfd.obtainViaNode = child;\n\t\t\tdeleteAnnotationIfNeccessary(child, ObtainVia.class);\n\t\t\treturn;\n\t\t}\n\t}\n\t\n\t/**\n\t * Returns the explicitly requested singular annotation on this node (field\n\t * or parameter), or null if there's no {@code @Singular} annotation on it.\n\t * \n\t * @param node The node (field or method param) to inspect for its name and potential {@code @Singular} annotation.\n\t * @param setterPrefix Explicitly requested setter prefix.\n\t */\n\tprivate SingularData getSingularData(JavacNode node, String setterPrefix) {\n\t\tfor (JavacNode child : node.down()) {\n\t\t\tif (!annotationTypeMatches(Singular.class, child)) continue;\n\t\t\tName pluralName = node.getKind() == Kind.FIELD ? removePrefixFromField(node) : ((JCVariableDecl) node.get()).name;\n\t\t\tAnnotationValues<Singular> ann = createAnnotation(Singular.class, child);\n\t\t\tSingular singularInstance = ann.getInstance();\n\t\t\tdeleteAnnotationIfNeccessary(child, Singular.class);\n\t\t\tString explicitSingular = singularInstance.value();\n\t\t\tif (explicitSingular.isEmpty()) {\n\t\t\t\tif (Boolean.FALSE.equals(node.getAst().readConfiguration(ConfigurationKeys.SINGULAR_AUTO))) {\n\t\t\t\t\tnode.addError(\"The singular must be specified explicitly (e.g. @Singular(\\\"task\\\")) because auto singularization is disabled.\");\n\t\t\t\t\texplicitSingular = pluralName.toString();\n\t\t\t\t} else {\n\t\t\t\t\texplicitSingular = autoSingularize(pluralName.toString());\n\t\t\t\t\tif (explicitSingular == null) {\n\t\t\t\t\t\tnode.addError(\"Can't singularize this name; please specify the singular explicitly (i.e. @Singular(\\\"sheep\\\"))\");\n\t\t\t\t\t\texplicitSingular = pluralName.toString();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tName singularName = node.toName(explicitSingular);\n\t\t\t\n\t\t\tJCExpression type = null;\n\t\t\tif (node.get() instanceof JCVariableDecl) {\n\t\t\t\ttype = ((JCVariableDecl) node.get()).vartype;\n\t\t\t}\n\t\t\t\n\t\t\tString name = null;\n\t\t\tList<JCExpression> typeArgs = List.nil();\n\t\t\tif (type instanceof JCTypeApply) {\n\t\t\t\ttypeArgs = ((JCTypeApply) type).arguments;\n\t\t\t\ttype = ((JCTypeApply) type).clazz;\n\t\t\t}\n\t\t\t\n\t\t\tname = type.toString();\n\t\t\t\n\t\t\tString targetFqn = JavacSingularsRecipes.get().toQualified(name);\n\t\t\tJavacSingularizer singularizer = JavacSingularsRecipes.get().getSingularizer(targetFqn, node);\n\t\t\tif (singularizer == null) {\n\t\t\t\tnode.addError(\"Lombok does not know how to create the singular-form builder methods for type '\" + name + \"'; they won't be generated.\");\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t\n\t\t\treturn new SingularData(child, singularName, pluralName, typeArgs, targetFqn, singularizer, singularInstance.ignoreNullCollections(), setterPrefix);\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleBuilderDefault.java",
    "content": "/*\n * Copyright (C) 2017-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCFieldAccess;\nimport com.sun.tools.javac.tree.JCTree.JCIdent;\n\nimport lombok.Builder;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.experimental.SuperBuilder;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.spi.Provides;\n\n@Provides\n@HandlerPriority(-1025) //HandleBuilder's level, minus one.\npublic class HandleBuilderDefault extends JavacAnnotationHandler<Builder.Default> {\n\t@Override public void handle(AnnotationValues<Builder.Default> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\tJavacNode annotatedField = annotationNode.up();\n\t\tif (annotatedField.getKind() != Kind.FIELD) return;\n\t\tJavacNode classWithAnnotatedField = annotatedField.up();\n\t\tif (!hasAnnotation(Builder.class, classWithAnnotatedField) && !hasAnnotation(\"lombok.experimental.Builder\", classWithAnnotatedField)\n\t\t\t\t&& !hasAnnotation(SuperBuilder.class, classWithAnnotatedField)) {\n\t\t\tannotationNode.addWarning(\"@Builder.Default requires @Builder or @SuperBuilder on the class for it to mean anything.\");\n\t\t\tdeleteAnnotationIfNeccessary(annotationNode, Builder.Default.class);\n\t\t}\n\t\t\n\t\t/** HandleBuilder is going to wipe out the import, at which point '@Builder.Default' is no longer clear. */\n\t\tif (ast.annotationType instanceof JCFieldAccess) {\n\t\t\tJCFieldAccess jfa = (JCFieldAccess) ast.annotationType;\n\t\t\tif (jfa.selected instanceof JCIdent && ((JCIdent) jfa.selected).name.contentEquals(\"Builder\") && jfa.name.contentEquals(\"Default\")) {\n\t\t\t\tJCFieldAccess newJfaSel = annotationNode.getTreeMaker().Select(annotationNode.getTreeMaker().Ident(annotationNode.toName(\"lombok\")), ((JCIdent) jfa.selected).name);\n\t\t\t\trecursiveSetGeneratedBy(newJfaSel, annotationNode);\n\t\t\t\tjfa.selected = newJfaSel;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleBuilderDefaultRemove.java",
    "content": "/*\n * Copyright (C) 2018-2023 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\n\nimport lombok.Builder;\nimport lombok.Builder.Default;\nimport lombok.core.AlreadyHandledAnnotations;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.spi.Provides;\n\n@Provides\n@HandlerPriority(32768)\n@AlreadyHandledAnnotations\npublic class HandleBuilderDefaultRemove extends JavacAnnotationHandler<Builder.Default> {\n\t@Override public void handle(AnnotationValues<Default> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\tdeleteAnnotationIfNeccessary(annotationNode, Builder.Default.class);\n\t\tdeleteImportFromCompilationUnit(annotationNode, Builder.class.getName());\n\t\tdeleteImportFromCompilationUnit(annotationNode, Builder.Default.class.getName());\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleBuilderRemove.java",
    "content": "/*\n * Copyright (C) 2020-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\n\nimport lombok.Builder;\nimport lombok.core.AlreadyHandledAnnotations;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.spi.Provides;\n\n@Provides\n@HandlerPriority(32768)\n@AlreadyHandledAnnotations\npublic class HandleBuilderRemove extends JavacAnnotationHandler<Builder> {\n\t@Override public void handle(AnnotationValues<Builder> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\tdeleteAnnotationIfNeccessary(annotationNode, Builder.class, \"lombok.experimental.Builder\");\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleCleanup.java",
    "content": "/*\n * Copyright (C) 2009-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\nimport static lombok.javac.Javac.*;\nimport lombok.Cleanup;\nimport lombok.ConfigurationKeys;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.delombok.LombokOptionsFactory;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacTreeMaker;\nimport lombok.spi.Provides;\n\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCAssign;\nimport com.sun.tools.javac.tree.JCTree.JCBinary;\nimport com.sun.tools.javac.tree.JCTree.JCBlock;\nimport com.sun.tools.javac.tree.JCTree.JCCase;\nimport com.sun.tools.javac.tree.JCTree.JCCatch;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCExpressionStatement;\nimport com.sun.tools.javac.tree.JCTree.JCFieldAccess;\nimport com.sun.tools.javac.tree.JCTree.JCIdent;\nimport com.sun.tools.javac.tree.JCTree.JCIf;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCMethodInvocation;\nimport com.sun.tools.javac.tree.JCTree.JCStatement;\nimport com.sun.tools.javac.tree.JCTree.JCTypeCast;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.ListBuffer;\nimport com.sun.tools.javac.util.Name;\n\n/**\n * Handles the {@code lombok.Cleanup} annotation for javac.\n */\n@Provides\npublic class HandleCleanup extends JavacAnnotationHandler<Cleanup> {\n\t@Override public void handle(AnnotationValues<Cleanup> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.CLEANUP_FLAG_USAGE, \"@Cleanup\");\n\t\t\n\t\tif (inNetbeansEditor(annotationNode)) return;\n\t\t\n\t\tdeleteAnnotationIfNeccessary(annotationNode, Cleanup.class);\n\t\tString cleanupName = annotation.getInstance().value();\n\t\tif (cleanupName.length() == 0) {\n\t\t\tannotationNode.addError(\"cleanupName cannot be the empty string.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (annotationNode.up().getKind() != Kind.LOCAL) {\n\t\t\tannotationNode.addError(\"@Cleanup is legal only on local variable declarations.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tJCVariableDecl decl = (JCVariableDecl)annotationNode.up().get();\n\t\t\n\t\tif (decl.init == null) {\n\t\t\tannotationNode.addError(\"@Cleanup variable declarations need to be initialized.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tJavacNode ancestor = annotationNode.up().directUp();\n\t\tJCTree blockNode = ancestor.get();\n\t\t\n\t\tfinal List<JCStatement> statements;\n\t\tif (blockNode instanceof JCBlock) {\n\t\t\tstatements = ((JCBlock)blockNode).stats;\n\t\t} else if (blockNode instanceof JCCase) {\n\t\t\tstatements = ((JCCase)blockNode).stats;\n\t\t} else if (blockNode instanceof JCMethodDecl) {\n\t\t\tstatements = ((JCMethodDecl)blockNode).body.stats;\n\t\t} else {\n\t\t\tannotationNode.addError(\"@Cleanup is legal only on a local variable declaration inside a block.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tboolean seenDeclaration = false;\n\t\tListBuffer<JCStatement> newStatements = new ListBuffer<JCStatement>();\n\t\tListBuffer<JCStatement> tryBlock = new ListBuffer<JCStatement>();\n\t\tfor (JCStatement statement : statements) {\n\t\t\tif (!seenDeclaration) {\n\t\t\t\tif (statement == decl) seenDeclaration = true;\n\t\t\t\tnewStatements.append(statement);\n\t\t\t} else {\n\t\t\t\ttryBlock.append(statement);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (!seenDeclaration) {\n\t\t\tannotationNode.addError(\"LOMBOK BUG: Can't find this local variable declaration inside its parent.\");\n\t\t\treturn;\n\t\t}\n\t\tdoAssignmentCheck(annotationNode, tryBlock.toList(), decl.name);\n\t\t\n\t\tJavacTreeMaker maker = annotationNode.getTreeMaker();\n\t\tJCFieldAccess cleanupMethod = maker.Select(maker.Ident(decl.name), annotationNode.toName(cleanupName));\n\t\tList<JCStatement> cleanupCall = List.<JCStatement>of(maker.Exec(\n\t\t\t\tmaker.Apply(List.<JCExpression>nil(), cleanupMethod, List.<JCExpression>nil())));\n\t\t\n\t\tJCExpression preventNullAnalysis = preventNullAnalysis(maker, annotationNode, maker.Ident(decl.name));\n\t\tJCBinary isNull = maker.Binary(CTC_NOT_EQUAL, preventNullAnalysis, maker.Literal(CTC_BOT, null));\n\t\t\n\t\tJCIf ifNotNullCleanup = maker.If(isNull, maker.Block(0, cleanupCall), null);\n\t\t\n\t\tJCBlock finalizer = recursiveSetGeneratedBy(maker.Block(0, List.<JCStatement>of(ifNotNullCleanup)), annotationNode);\n\t\t\n\t\tnewStatements.append(setGeneratedBy(maker.Try(setGeneratedBy(maker.Block(0, tryBlock.toList()), annotationNode), List.<JCCatch>nil(), finalizer), annotationNode));\n\t\t\n\t\tif (blockNode instanceof JCBlock) {\n\t\t\t((JCBlock)blockNode).stats = newStatements.toList();\n\t\t} else if (blockNode instanceof JCCase) {\n\t\t\t((JCCase)blockNode).stats = newStatements.toList();\n\t\t} else if (blockNode instanceof JCMethodDecl) {\n\t\t\t((JCMethodDecl)blockNode).body.stats = newStatements.toList();\n\t\t} else throw new AssertionError(\"Should not get here\");\n\t\t\n\t\tancestor.rebuild();\n\t}\n\t\n\tpublic JCExpression preventNullAnalysis(JavacTreeMaker maker, JavacNode node, JCExpression expression) {\n\t\tif (LombokOptionsFactory.getDelombokOptions(node.getContext()).getFormatPreferences().danceAroundIdeChecks()) {\n\t\t\tJCMethodInvocation singletonList = maker.Apply(List.<JCExpression>nil(), chainDotsString(node, \"java.util.Collections.singletonList\"), List.of(expression));\n\t\t\tJCMethodInvocation cleanedExpr = maker.Apply(List.<JCExpression>nil(), maker.Select(singletonList, node.toName(\"get\")) , List.<JCExpression>of(maker.Literal(CTC_INT, 0)));\n\t\t\treturn cleanedExpr;\n\t\t} else {\n\t\t\treturn expression;\n\t\t}\n\t}\n\t\n\tpublic void doAssignmentCheck(JavacNode node, List<JCStatement> statements, Name name) {\n\t\tfor (JCStatement statement : statements) doAssignmentCheck0(node, statement, name);\n\t}\n\t\n\tpublic void doAssignmentCheck0(JavacNode node, JCTree statement, Name name) {\n\t\tif (statement instanceof JCAssign) doAssignmentCheck0(node, ((JCAssign)statement).rhs, name);\n\t\tif (statement instanceof JCExpressionStatement) doAssignmentCheck0(node,\n\t\t\t\t((JCExpressionStatement)statement).expr, name);\n\t\tif (statement instanceof JCVariableDecl) doAssignmentCheck0(node, ((JCVariableDecl)statement).init, name);\n\t\tif (statement instanceof JCTypeCast) doAssignmentCheck0(node, ((JCTypeCast)statement).expr, name);\n\t\tif (statement instanceof JCIdent) {\n\t\t\tif (((JCIdent)statement).name.contentEquals(name)) {\n\t\t\t\tJavacNode problemNode = node.getNodeFor(statement);\n\t\t\t\tif (problemNode != null) problemNode.addWarning(\n\t\t\t\t\"You're assigning an auto-cleanup variable to something else. This is a bad idea.\");\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleConstructor.java",
    "content": "/*\n * Copyright (C) 2010-2024 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.javac.Javac.*;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCBlock;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCCompilationUnit;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCFieldAccess;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCModifiers;\nimport com.sun.tools.javac.tree.JCTree.JCPrimitiveTypeTree;\nimport com.sun.tools.javac.tree.JCTree.JCReturn;\nimport com.sun.tools.javac.tree.JCTree.JCStatement;\nimport com.sun.tools.javac.tree.JCTree.JCTypeParameter;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.ListBuffer;\nimport com.sun.tools.javac.util.Name;\n\nimport lombok.AccessLevel;\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.ConfigurationKeys;\nimport lombok.NoArgsConstructor;\nimport lombok.RequiredArgsConstructor;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.core.configuration.CheckerFrameworkVersion;\nimport lombok.delombok.LombokOptionsFactory;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacTreeMaker;\nimport lombok.javac.handlers.JavacHandlerUtil.MemberExistsResult;\nimport lombok.spi.Provides;\n\npublic class HandleConstructor {\n\t@Provides\n\tpublic static class HandleNoArgsConstructor extends JavacAnnotationHandler<NoArgsConstructor> {\n\t\tprivate static final String NAME = NoArgsConstructor.class.getSimpleName();\n\t\tprivate HandleConstructor handleConstructor = new HandleConstructor();\n\t\t\n\t\t@Override public void handle(AnnotationValues<NoArgsConstructor> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.NO_ARGS_CONSTRUCTOR_FLAG_USAGE, \"@NoArgsConstructor\", ConfigurationKeys.ANY_CONSTRUCTOR_FLAG_USAGE, \"any @xArgsConstructor\");\n\t\t\t\n\t\t\tdeleteAnnotationIfNeccessary(annotationNode, NoArgsConstructor.class);\n\t\t\tdeleteImportFromCompilationUnit(annotationNode, \"lombok.AccessLevel\");\n\t\t\tJavacNode typeNode = annotationNode.up();\n\t\t\tif (!checkLegality(typeNode, annotationNode, NAME)) return;\n\t\t\tList<JCAnnotation> onConstructor = unboxAndRemoveAnnotationParameter(ast, \"onConstructor\", \"@NoArgsConstructor(onConstructor\", annotationNode);\n\t\t\tif (!onConstructor.isEmpty()) {\n\t\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.ON_X_FLAG_USAGE, \"@NoArgsConstructor(onConstructor=...)\");\n\t\t\t}\n\t\t\tNoArgsConstructor ann = annotation.getInstance();\n\t\t\tAccessLevel level = ann.access();\n\t\t\tif (level == AccessLevel.NONE) return;\n\t\t\tString staticName = ann.staticName();\n\t\t\tboolean force = ann.force();\n\t\t\thandleConstructor.generateConstructor(typeNode, level, onConstructor, List.<JavacNode>nil(), force, staticName, SkipIfConstructorExists.NO, annotationNode);\n\t\t}\n\t}\n\t\n\t@Provides\n\tpublic static class HandleRequiredArgsConstructor extends JavacAnnotationHandler<RequiredArgsConstructor> {\n\t\tprivate static final String NAME = RequiredArgsConstructor.class.getSimpleName();\n\t\tprivate HandleConstructor handleConstructor = new HandleConstructor();\n\t\t\n\t\t@Override public void handle(AnnotationValues<RequiredArgsConstructor> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.REQUIRED_ARGS_CONSTRUCTOR_FLAG_USAGE, \"@RequiredArgsConstructor\", ConfigurationKeys.ANY_CONSTRUCTOR_FLAG_USAGE, \"any @xArgsConstructor\");\n\t\t\t\n\t\t\tdeleteAnnotationIfNeccessary(annotationNode, RequiredArgsConstructor.class);\n\t\t\tdeleteImportFromCompilationUnit(annotationNode, \"lombok.AccessLevel\");\n\t\t\tJavacNode typeNode = annotationNode.up();\n\t\t\tif (!checkLegality(typeNode, annotationNode, NAME)) return;\n\t\t\tList<JCAnnotation> onConstructor = unboxAndRemoveAnnotationParameter(ast, \"onConstructor\", \"@RequiredArgsConstructor(onConstructor\", annotationNode);\n\t\t\tif (!onConstructor.isEmpty()) {\n\t\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.ON_X_FLAG_USAGE, \"@RequiredArgsConstructor(onConstructor=...)\");\n\t\t\t}\n\t\t\tRequiredArgsConstructor ann = annotation.getInstance();\n\t\t\tAccessLevel level = ann.access();\n\t\t\tif (level == AccessLevel.NONE) return;\n\t\t\tString staticName = ann.staticName();\n\t\t\tif (annotation.isExplicit(\"suppressConstructorProperties\")) {\n\t\t\t\tannotationNode.addError(\"This deprecated feature is no longer supported. Remove it; you can create a lombok.config file with 'lombok.anyConstructor.suppressConstructorProperties = true'.\");\n\t\t\t}\n\t\t\t\n\t\t\thandleConstructor.generateConstructor(typeNode, level, onConstructor, findRequiredFields(typeNode), false, staticName, SkipIfConstructorExists.NO, annotationNode);\n\t\t}\n\t}\n\t\n\t@Provides\n\tpublic static class HandleAllArgsConstructor extends JavacAnnotationHandler<AllArgsConstructor> {\n\t\tprivate static final String NAME = AllArgsConstructor.class.getSimpleName();\n\t\tprivate HandleConstructor handleConstructor = new HandleConstructor();\n\t\t\n\t\t@Override public void handle(AnnotationValues<AllArgsConstructor> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.ALL_ARGS_CONSTRUCTOR_FLAG_USAGE, \"@AllArgsConstructor\", ConfigurationKeys.ANY_CONSTRUCTOR_FLAG_USAGE, \"any @xArgsConstructor\");\n\t\t\t\n\t\t\tdeleteAnnotationIfNeccessary(annotationNode, AllArgsConstructor.class);\n\t\t\tdeleteImportFromCompilationUnit(annotationNode, \"lombok.AccessLevel\");\n\t\t\tJavacNode typeNode = annotationNode.up();\n\t\t\tif (!checkLegality(typeNode, annotationNode, NAME)) return;\n\t\t\tList<JCAnnotation> onConstructor = unboxAndRemoveAnnotationParameter(ast, \"onConstructor\", \"@AllArgsConstructor(onConstructor\", annotationNode);\n\t\t\tif (!onConstructor.isEmpty()) {\n\t\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.ON_X_FLAG_USAGE, \"@AllArgsConstructor(onConstructor=...)\");\n\t\t\t}\n\t\t\tAllArgsConstructor ann = annotation.getInstance();\n\t\t\tAccessLevel level = ann.access();\n\t\t\tif (level == AccessLevel.NONE) return;\n\t\t\tString staticName = ann.staticName();\n\t\t\tif (annotation.isExplicit(\"suppressConstructorProperties\")) {\n\t\t\t\tannotationNode.addError(\"This deprecated feature is no longer supported. Remove it; you can create a lombok.config file with 'lombok.anyConstructor.suppressConstructorProperties = true'.\");\n\t\t\t}\n\t\t\thandleConstructor.generateConstructor(typeNode, level, onConstructor, findAllFields(typeNode), false, staticName, SkipIfConstructorExists.NO, annotationNode);\n\t\t}\n\t}\n\t\n\tpublic static List<JavacNode> findRequiredFields(JavacNode typeNode) {\n\t\treturn findFields(typeNode, true);\n\t}\n\t\n\tpublic static List<JavacNode> findFinalFields(JavacNode typeNode) {\n\t\treturn findFields(typeNode, false);\n\t}\n\t\n\tpublic static List<JavacNode> findFields(JavacNode typeNode, boolean nullMarked) {\n\t\tListBuffer<JavacNode> fields = new ListBuffer<JavacNode>();\n\t\tfor (JavacNode child : typeNode.down()) {\n\t\t\tif (child.getKind() != Kind.FIELD) continue;\n\t\t\tJCVariableDecl fieldDecl = (JCVariableDecl) child.get();\n\t\t\t//Skip fields that start with $\n\t\t\tif (fieldDecl.name.toString().startsWith(\"$\")) continue;\n\t\t\tlong fieldFlags = fieldDecl.mods.flags;\n\t\t\t//Skip static fields.\n\t\t\tif ((fieldFlags & Flags.STATIC) != 0) continue;\n\t\t\tboolean isFinal = (fieldFlags & Flags.FINAL) != 0;\n\t\t\tboolean isNonNull = nullMarked && hasNonNullAnnotations(child);\n\t\t\tif ((isFinal || isNonNull) && fieldDecl.init == null) fields.append(child);\n\t\t}\n\t\treturn fields.toList();\n\t}\n\t\n\tpublic static List<JavacNode> findAllFields(JavacNode typeNode) {\n\t\treturn findAllFields(typeNode, false);\n\t}\n\t\n\tpublic static List<JavacNode> findAllFields(JavacNode typeNode, boolean evenFinalInitialized) {\n\t\tListBuffer<JavacNode> fields = new ListBuffer<JavacNode>();\n\t\tfor (JavacNode child : typeNode.down()) {\n\t\t\tif (child.getKind() != Kind.FIELD) continue;\n\t\t\tJCVariableDecl fieldDecl = (JCVariableDecl) child.get();\n\t\t\t//Skip fields that start with $\n\t\t\tif (fieldDecl.name.toString().startsWith(\"$\")) continue;\n\t\t\tlong fieldFlags = fieldDecl.mods.flags;\n\t\t\t//Skip static fields.\n\t\t\tif ((fieldFlags & Flags.STATIC) != 0) continue;\n\t\t\t//Skip initialized final fields\n\t\t\tboolean isFinal = (fieldFlags & Flags.FINAL) != 0;\n\t\t\tif (evenFinalInitialized || !isFinal || fieldDecl.init == null) fields.append(child);\n\t\t}\n\t\treturn fields.toList();\n\t}\n\t\n\tpublic static boolean checkLegality(JavacNode typeNode, JavacNode errorNode, String name) {\n\t\tif (!isClassOrEnum(typeNode)) {\n\t\t\terrorNode.addError(name + \" is only supported on a class or an enum.\");\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\tpublic enum SkipIfConstructorExists {\n\t\tYES, NO, I_AM_BUILDER;\n\t}\n\t\n\tpublic void generateExtraNoArgsConstructor(JavacNode typeNode, JavacNode source) {\n\t\tif (!isDirectDescendantOfObject(typeNode)) return;\n\t\t\n\t\tBoolean v = typeNode.getAst().readConfiguration(ConfigurationKeys.NO_ARGS_CONSTRUCTOR_EXTRA_PRIVATE);\n\t\tif (v == null || !v) return;\n\t\t\n\t\tgenerate(typeNode, AccessLevel.PRIVATE, List.<JCAnnotation>nil(), List.<JavacNode>nil(), true, null, SkipIfConstructorExists.NO, source, true);\n\t}\n\t\n\tpublic void generateRequiredArgsConstructor(JavacNode typeNode, AccessLevel level, String staticName, SkipIfConstructorExists skipIfConstructorExists, JavacNode source) {\n\t\tgenerateConstructor(typeNode, level, List.<JCAnnotation>nil(), findRequiredFields(typeNode), false, staticName, skipIfConstructorExists, source);\n\t}\n\t\n\tpublic void generateAllArgsConstructor(JavacNode typeNode, AccessLevel level, String staticName, SkipIfConstructorExists skipIfConstructorExists, JavacNode source) {\n\t\tgenerateConstructor(typeNode, level, List.<JCAnnotation>nil(), findAllFields(typeNode), false, staticName, skipIfConstructorExists, source);\n\t}\n\t\n\tpublic void generateConstructor(JavacNode typeNode, AccessLevel level, List<JCAnnotation> onConstructor, List<JavacNode> fields, boolean allToDefault, String staticName, SkipIfConstructorExists skipIfConstructorExists, JavacNode source) {\n\t\tgenerate(typeNode, level, onConstructor, fields, allToDefault, staticName, skipIfConstructorExists, source, false);\n\t}\n\n\tprivate void generate(JavacNode typeNode, AccessLevel level, List<JCAnnotation> onConstructor, List<JavacNode> fields, boolean allToDefault, String staticName, SkipIfConstructorExists skipIfConstructorExists, JavacNode source, boolean noArgs) {\n\t\tboolean staticConstrRequired = staticName != null && !staticName.equals(\"\");\n\t\t\n\t\tif (skipIfConstructorExists != SkipIfConstructorExists.NO) {\n\t\t\tfor (JavacNode child : typeNode.down()) {\n\t\t\t\tif (child.getKind() == Kind.ANNOTATION) {\n\t\t\t\t\tboolean skipGeneration = annotationTypeMatches(NoArgsConstructor.class, child) ||\n\t\t\t\t\t\tannotationTypeMatches(AllArgsConstructor.class, child) ||\n\t\t\t\t\t\tannotationTypeMatches(RequiredArgsConstructor.class, child);\n\t\t\t\t\t\n\t\t\t\t\tif (!skipGeneration && skipIfConstructorExists == SkipIfConstructorExists.YES) {\n\t\t\t\t\t\tskipGeneration = annotationTypeMatches(Builder.class, child);\n\t\t\t\t\t}\n\t\t\t\t\tif (skipGeneration) {\n\t\t\t\t\t\tif (staticConstrRequired) {\n\t\t\t\t\t\t\t// @Data has asked us to generate a constructor, but we're going to skip this instruction, as an explicit 'make a constructor' annotation\n\t\t\t\t\t\t\t// will take care of it. However, @Data also wants a specific static name; this will be ignored; the appropriate way to do this is to use\n\t\t\t\t\t\t\t// the 'staticName' parameter of the @XArgsConstructor you've stuck on your type.\n\t\t\t\t\t\t\t// We should warn that we're ignoring @Data's 'staticConstructor' param.\n\t\t\t\t\t\t\tsource.addWarning(\"Ignoring static constructor name: explicit @XxxArgsConstructor annotation present; its `staticName` parameter will be used.\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (noArgs && noArgsConstructorExists(typeNode)) return;\n\t\t\n\t\tif (!(skipIfConstructorExists != SkipIfConstructorExists.NO && constructorExists(typeNode) != MemberExistsResult.NOT_EXISTS)) {\n\t\t\tJCMethodDecl constr = createConstructor(staticConstrRequired ? AccessLevel.PRIVATE : level, onConstructor, typeNode, fields, allToDefault, source);\n\t\t\tgenerateConstructorJavadoc(constr, typeNode, fields);\n\t\t\tinjectMethod(typeNode, constr);\n\t\t}\n\t\tgenerateStaticConstructor(staticConstrRequired, typeNode, staticName, level, allToDefault, fields, source);\n\t}\n\t\n\tprivate void generateStaticConstructor(boolean staticConstrRequired, JavacNode typeNode, String staticName, AccessLevel level, boolean allToDefault, List<JavacNode> fields, JavacNode source) {\n\t\tif (staticConstrRequired) {\n\t\t\tJCMethodDecl staticConstr = createStaticConstructor(staticName, level, typeNode, allToDefault ? List.<JavacNode>nil() : fields, source);\n\t\t\tgenerateConstructorJavadoc(staticConstr, typeNode, fields);\n\t\t\tinjectMethod(typeNode, staticConstr);\n\t\t}\n\t}\n\t\n\tprivate static boolean noArgsConstructorExists(JavacNode node) {\n\t\tnode = upToTypeNode(node);\n\t\t\n\t\tif (node != null && node.get() instanceof JCClassDecl) {\n\t\t\tfor (JCTree def : ((JCClassDecl) node.get()).defs) {\n\t\t\t\tif (def instanceof JCMethodDecl) {\n\t\t\t\t\tJCMethodDecl md = (JCMethodDecl) def;\n\t\t\t\t\tif (md.name.contentEquals(\"<init>\") && md.params.size() == 0) return true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tfor (JavacNode child : node.down()) {\n\t\t\tif (annotationTypeMatches(NoArgsConstructor.class, child)) return true;\n\t\t\tif (annotationTypeMatches(RequiredArgsConstructor.class, child) && findRequiredFields(node).isEmpty()) return true;\n\t\t\tif (annotationTypeMatches(AllArgsConstructor.class, child) && findAllFields(node).isEmpty()) return true;\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\tpublic static void addConstructorProperties(JCModifiers mods, JavacNode node, List<JavacNode> fields) {\n\t\tif (fields.isEmpty()) return;\n\t\tJavacTreeMaker maker = node.getTreeMaker();\n\t\tJCExpression constructorPropertiesType = chainDots(node, \"java\", \"beans\", \"ConstructorProperties\");\n\t\tListBuffer<JCExpression> fieldNames = new ListBuffer<JCExpression>();\n\t\tfor (JavacNode field : fields) {\n\t\t\tName fieldName = removePrefixFromField(field);\n\t\t\tfieldNames.append(maker.Literal(fieldName.toString()));\n\t\t}\n\t\tJCExpression fieldNamesArray = maker.NewArray(null, List.<JCExpression>nil(), fieldNames.toList());\n\t\tJCAnnotation annotation = maker.Annotation(constructorPropertiesType, List.of(fieldNamesArray));\n\t\tmods.annotations = mods.annotations.append(annotation);\n\t}\n\t\n\t@SuppressWarnings(\"deprecation\") public static JCMethodDecl createConstructor(AccessLevel level, List<JCAnnotation> onConstructor, JavacNode typeNode, List<JavacNode> fieldsToParam, boolean forceDefaults, JavacNode source) {\n\t\tJavacTreeMaker maker = typeNode.getTreeMaker();\n\t\t\n\t\tboolean isEnum = (((JCClassDecl) typeNode.get()).mods.flags & Flags.ENUM) != 0;\n\t\tif (isEnum) level = AccessLevel.PRIVATE;\n\t\t\n\t\tboolean addConstructorProperties;\n\t\t\n\t\tList<JavacNode> fieldsToDefault = fieldsNeedingBuilderDefaults(typeNode, fieldsToParam);\n\t\tList<JavacNode> fieldsToExplicit = forceDefaults ? fieldsNeedingExplicitDefaults(typeNode, fieldsToParam) : List.<JavacNode>nil();\n\t\t\n\t\tif (fieldsToParam.isEmpty()) {\n\t\t\taddConstructorProperties = false;\n\t\t} else {\n\t\t\tBoolean v = typeNode.getAst().readConfiguration(ConfigurationKeys.ANY_CONSTRUCTOR_ADD_CONSTRUCTOR_PROPERTIES);\n\t\t\taddConstructorProperties = v != null ? v.booleanValue() :\n\t\t\t\tBoolean.FALSE.equals(typeNode.getAst().readConfiguration(ConfigurationKeys.ANY_CONSTRUCTOR_SUPPRESS_CONSTRUCTOR_PROPERTIES));\n\t\t}\n\t\t\n\t\tListBuffer<JCStatement> nullChecks = new ListBuffer<JCStatement>();\n\t\tListBuffer<JCStatement> assigns = new ListBuffer<JCStatement>();\n\t\tListBuffer<JCVariableDecl> params = new ListBuffer<JCVariableDecl>();\n\t\t\n\t\tfor (JavacNode fieldNode : fieldsToParam) {\n\t\t\tJCVariableDecl field = (JCVariableDecl) fieldNode.get();\n\t\t\tName fieldName = removePrefixFromField(fieldNode);\n\t\t\tName rawName = field.name;\n\t\t\tList<JCAnnotation> copyableAnnotations = findCopyableAnnotations(fieldNode);\n\t\t\tlong flags = JavacHandlerUtil.addFinalIfNeeded(Flags.PARAMETER, typeNode.getContext());\n\t\t\tJCExpression pType = cloneType(fieldNode.getTreeMaker(), field.vartype, source);\n\t\t\tJCVariableDecl param = maker.VarDef(maker.Modifiers(flags, copyableAnnotations), fieldName, pType, null);\n\t\t\tparams.append(param);\n\t\t\tif (hasNonNullAnnotations(fieldNode)) {\n\t\t\t\tJCStatement nullCheck = generateNullCheck(maker, param, source);\n\t\t\t\tif (nullCheck != null) nullChecks.append(nullCheck);\n\t\t\t}\n\t\t\tJCFieldAccess thisX = maker.Select(maker.Ident(fieldNode.toName(\"this\")), rawName);\n\t\t\tJCExpression assign = maker.Assign(thisX, maker.Ident(fieldName));\n\t\t\tassigns.append(maker.Exec(assign));\n\t\t}\n\t\t\n\t\tfor (JavacNode fieldNode : fieldsToExplicit) {\n\t\t\tJCVariableDecl field = (JCVariableDecl) fieldNode.get();\n\t\t\tName rawName = field.name;\n\t\t\tJCFieldAccess thisX = maker.Select(maker.Ident(fieldNode.toName(\"this\")), rawName);\n\t\t\tJCExpression assign = maker.Assign(thisX, getDefaultExpr(maker, field.vartype));\n\t\t\tassigns.append(maker.Exec(assign));\n\t\t}\n\t\t\n\t\tfor (JavacNode fieldNode : fieldsToDefault) {\n\t\t\tJCVariableDecl field = (JCVariableDecl) fieldNode.get();\n\t\t\tName rawName = field.name;\n\t\t\tName fieldName = removePrefixFromField(fieldNode);\n\t\t\tName nameOfDefaultProvider = typeNode.toName(\"$default$\" + fieldName);\n\t\t\tJCFieldAccess thisX = maker.Select(maker.Ident(fieldNode.toName(\"this\")), rawName);\n\t\t\tJCExpression assign = maker.Assign(thisX, maker.Apply(List.<JCExpression>nil(), maker.Select(maker.Ident(((JCClassDecl) typeNode.get()).name), nameOfDefaultProvider), List.<JCExpression>nil()));\n\t\t\tassigns.append(maker.Exec(assign));\n\t\t}\n\t\t\n\t\tJCModifiers mods = maker.Modifiers(toJavacModifier(level), List.<JCAnnotation>nil());\n\t\tif (addConstructorProperties && !isLocalType(typeNode) && LombokOptionsFactory.getDelombokOptions(typeNode.getContext()).getFormatPreferences().generateConstructorProperties()) {\n\t\t\taddConstructorProperties(mods, typeNode, fieldsToParam);\n\t\t}\n\t\tif (onConstructor != null) mods.annotations = mods.annotations.appendList(copyAnnotations(onConstructor, maker));\n\t\treturn recursiveSetGeneratedBy(maker.MethodDef(mods, typeNode.toName(\"<init>\"),\n\t\t\tnull, List.<JCTypeParameter>nil(), params.toList(), List.<JCExpression>nil(),\n\t\t\tmaker.Block(0L, nullChecks.appendList(assigns).toList()), null), source);\n\t}\n\t\n\t/**\n\t * For each field which is not final and has no initializer that gets 'removed' by {@code @Builder.Default} there is no need to\n\t * write an explicit 'this.x = foo' in the constructor, so strip them away here.\n\t */\n\tprivate static List<JavacNode> fieldsNeedingBuilderDefaults(JavacNode typeNode, List<JavacNode> fieldsToParam) {\n\t\tListBuffer<JavacNode> out = new ListBuffer<JavacNode>();\n\t\ttop:\n\t\tfor (JavacNode node : typeNode.down()) {\n\t\t\tif (node.getKind() != Kind.FIELD) continue top;\n\t\t\tJCVariableDecl varDecl = (JCVariableDecl) node.get();\n\t\t\tif ((varDecl.mods.flags & Flags.STATIC) != 0) continue top;\n\t\t\tfor (JavacNode ftp : fieldsToParam) if (node == ftp) continue top;\n\t\t\tif (JavacHandlerUtil.hasAnnotation(Builder.Default.class, node)) out.append(node);\n\t\t}\n\t\treturn out.toList();\n\t}\n\t\n\t/**\n\t * Return each field which is final and has no initializer, and which is not already a parameter.\n\t */\n\tprivate static List<JavacNode> fieldsNeedingExplicitDefaults(JavacNode typeNode, List<JavacNode> fieldsToParam) {\n\t\tListBuffer<JavacNode> out = new ListBuffer<JavacNode>();\n\t\ttop:\n\t\tfor (JavacNode node : typeNode.down()) {\n\t\t\tif (node.getKind() != Kind.FIELD) continue top;\n\t\t\tJCVariableDecl varDecl = (JCVariableDecl) node.get();\n\t\t\tif (varDecl.init != null) continue top;\n\t\t\tif ((varDecl.mods.flags & Flags.FINAL) == 0) continue top;\n\t\t\tif ((varDecl.mods.flags & Flags.STATIC) != 0) continue top;\n\t\t\tfor (JavacNode ftp : fieldsToParam) if (node == ftp) continue top;\n\t\t\tif (JavacHandlerUtil.hasAnnotation(Builder.Default.class, node)) continue top;\n\t\t\tout.append(node);\n\t\t}\n\t\treturn out.toList();\n\t}\n\t\n\tprivate static JCExpression getDefaultExpr(JavacTreeMaker maker, JCExpression type) {\n\t\tif (type instanceof JCPrimitiveTypeTree) {\n\t\t\tswitch (((JCPrimitiveTypeTree) type).getPrimitiveTypeKind()) {\n\t\t\tcase BOOLEAN:\n\t\t\t\treturn maker.Literal(CTC_BOOLEAN, 0);\n\t\t\tcase CHAR:\n\t\t\t\treturn maker.Literal(CTC_CHAR, 0);\n\t\t\tdefault:\n\t\t\tcase BYTE:\n\t\t\tcase SHORT:\n\t\t\tcase INT:\n\t\t\t\treturn maker.Literal(CTC_INT, 0);\n\t\t\tcase LONG:\n\t\t\t\treturn maker.Literal(CTC_LONG, 0L);\n\t\t\tcase FLOAT:\n\t\t\t\treturn maker.Literal(CTC_FLOAT, 0F);\n\t\t\tcase DOUBLE:\n\t\t\t\treturn maker.Literal(CTC_DOUBLE, 0D);\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn maker.Literal(CTC_BOT, null);\n\t\t\n\t}\n\t\n\tpublic static boolean isLocalType(JavacNode type) {\n\t\tKind kind = type.up().getKind();\n\t\tif (kind == Kind.COMPILATION_UNIT) return false;\n\t\tif (kind == Kind.TYPE) return isLocalType(type.up());\n\t\treturn true;\n\t}\n\t\n\tpublic JCMethodDecl createStaticConstructor(String name, AccessLevel level, JavacNode typeNode, List<JavacNode> fields, JavacNode source) {\n\t\tJavacTreeMaker maker = typeNode.getTreeMaker();\n\t\tJCClassDecl type = (JCClassDecl) typeNode.get();\n\t\t\n\t\tJCModifiers mods = maker.Modifiers(Flags.STATIC | toJavacModifier(level));\n\t\t\n\t\tJCExpression returnType, constructorType;\n\t\t\n\t\tListBuffer<JCTypeParameter> typeParams = new ListBuffer<JCTypeParameter>();\n\t\tListBuffer<JCVariableDecl> params = new ListBuffer<JCVariableDecl>();\n\t\tListBuffer<JCExpression> args = new ListBuffer<JCExpression>();\n\t\t\n\t\tif (!type.typarams.isEmpty()) {\n\t\t\tfor (JCTypeParameter param : type.typarams) {\n\t\t\t\ttypeParams.append(maker.TypeParameter(param.name, cloneTypes(maker, param.bounds, source)));\n\t\t\t}\n\t\t}\n\t\tList<JCAnnotation> annsOnReturnType = List.nil();\n\t\tif (getCheckerFrameworkVersion(typeNode).generateUnique()) annsOnReturnType = List.of(maker.Annotation(genTypeRef(typeNode, CheckerFrameworkVersion.NAME__UNIQUE), List.<JCExpression>nil()));\n\t\treturnType = namePlusTypeParamsToTypeReference(maker, typeNode, type.typarams, annsOnReturnType);\n\t\tconstructorType = namePlusTypeParamsToTypeReference(maker, typeNode, type.typarams);\n\t\t\n\t\tfor (JavacNode fieldNode : fields) {\n\t\t\tJCVariableDecl field = (JCVariableDecl) fieldNode.get();\n\t\t\tName fieldName = removePrefixFromField(fieldNode);\n\t\t\tJCExpression pType = cloneType(maker, field.vartype, source);\n\t\t\tList<JCAnnotation> copyableAnnotations = findCopyableAnnotations(fieldNode);\n\t\t\tlong flags = JavacHandlerUtil.addFinalIfNeeded(Flags.PARAMETER, typeNode.getContext());\n\t\t\tJCVariableDecl param = maker.VarDef(maker.Modifiers(flags, copyableAnnotations), fieldName, pType, null);\n\t\t\tparams.append(param);\n\t\t\targs.append(maker.Ident(fieldName));\n\t\t}\n\t\tJCReturn returnStatement = maker.Return(maker.NewClass(null, List.<JCExpression>nil(), constructorType, args.toList(), null));\n\t\tJCBlock body = maker.Block(0, List.<JCStatement>of(returnStatement));\n\t\t\n\t\tJCMethodDecl methodDef = maker.MethodDef(mods, typeNode.toName(name), returnType, typeParams.toList(), params.toList(), List.<JCExpression>nil(), body, null);\n\t\tcreateRelevantNonNullAnnotation(typeNode, methodDef);\n\t\treturn recursiveSetGeneratedBy(methodDef, source);\n\t}\n\t\n\tprivate void generateConstructorJavadoc(JCMethodDecl constructor, JavacNode typeNode, List<JavacNode> fields) {\n\t\tif (fields.isEmpty()) return;\n\t\t\n\t\tJCCompilationUnit cu = ((JCCompilationUnit) typeNode.top().get());\n\t\tString constructorJavadoc = getConstructorJavadocHeader(typeNode.getName());\n\t\tboolean fieldDescriptionAdded = false;\n\t\tfor (JavacNode fieldNode : fields) {\n\t\t\tString paramName = removePrefixFromField(fieldNode).toString();\n\t\t\tString fieldJavadoc = getDocComment(cu, fieldNode.get());\n\t\t\tString paramJavadoc = getConstructorParameterJavadoc(paramName, fieldJavadoc);\n\t\t\t\n\t\t\tif (paramJavadoc == null) {\n\t\t\t\tparamJavadoc = \"@param \" + paramName;\n\t\t\t} else {\n\t\t\t\tfieldDescriptionAdded = true;\n\t\t\t}\n\t\t\t\n\t\t\tconstructorJavadoc = addJavadocLine(constructorJavadoc, paramJavadoc);\n\t\t}\n\t\tif (fieldDescriptionAdded) {\n\t\t\tsetDocComment(cu, constructor, constructorJavadoc);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleData.java",
    "content": "/*\n * Copyright (C) 2009-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\nimport lombok.AccessLevel;\nimport lombok.ConfigurationKeys;\nimport lombok.Data;\nimport lombok.core.AnnotationValues;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.javac.handlers.HandleConstructor.SkipIfConstructorExists;\nimport lombok.spi.Provides;\n\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.util.List;\n\n/**\n * Handles the {@code lombok.Data} annotation for javac.\n */\n@Provides\npublic class HandleData extends JavacAnnotationHandler<Data> {\n\tprivate HandleConstructor handleConstructor = new HandleConstructor();\n\tprivate HandleGetter handleGetter = new HandleGetter();\n\tprivate HandleSetter handleSetter = new HandleSetter();\n\tprivate HandleEqualsAndHashCode handleEqualsAndHashCode = new HandleEqualsAndHashCode();\n\tprivate HandleToString handleToString = new HandleToString();\n\t\n\t@Override public void handle(AnnotationValues<Data> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.DATA_FLAG_USAGE, \"@Data\");\n\t\t\n\t\tdeleteAnnotationIfNeccessary(annotationNode, Data.class);\n\t\tJavacNode typeNode = annotationNode.up();\n\t\t\n\t\tif (!isClass(typeNode)) {\n\t\t\tannotationNode.addError(\"@Data is only supported on a class.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tString staticConstructorName = annotation.getInstance().staticConstructor();\n\t\t\n\t\t// TODO move this to the end OR move it to the top in eclipse.\n\t\thandleConstructor.generateRequiredArgsConstructor(typeNode, AccessLevel.PUBLIC, staticConstructorName, SkipIfConstructorExists.YES, annotationNode);\n\t\thandleConstructor.generateExtraNoArgsConstructor(typeNode, annotationNode);\n\t\thandleGetter.generateGetterForType(typeNode, annotationNode, AccessLevel.PUBLIC, true, List.<JCAnnotation>nil());\n\t\thandleSetter.generateSetterForType(typeNode, annotationNode, AccessLevel.PUBLIC, true, List.<JCAnnotation>nil(), List.<JCAnnotation>nil());\n\t\thandleEqualsAndHashCode.generateEqualsAndHashCodeForType(typeNode, annotationNode);\n\t\thandleToString.generateToStringForType(typeNode, annotationNode);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleDelegate.java",
    "content": "/*\n * Copyright (C) 2010-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static com.sun.tools.javac.code.Flags.*;\nimport static lombok.core.handlers.HandlerUtil.handleExperimentalFlagUsage;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport java.lang.annotation.Annotation;\nimport java.lang.reflect.Method;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\n\nimport javax.lang.model.element.ElementKind;\nimport javax.lang.model.element.ExecutableElement;\nimport javax.lang.model.element.Modifier;\nimport javax.lang.model.element.TypeParameterElement;\nimport javax.lang.model.element.VariableElement;\nimport javax.lang.model.type.ExecutableType;\nimport javax.lang.model.type.TypeKind;\nimport javax.lang.model.type.TypeMirror;\n\nimport com.sun.tools.javac.code.Attribute.Compound;\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.code.Symbol;\nimport com.sun.tools.javac.code.Symbol.MethodSymbol;\nimport com.sun.tools.javac.code.Symbol.TypeSymbol;\nimport com.sun.tools.javac.code.Type;\nimport com.sun.tools.javac.code.Type.ClassType;\nimport com.sun.tools.javac.code.Type.TypeVar;\nimport com.sun.tools.javac.code.Types;\nimport com.sun.tools.javac.model.JavacTypes;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCBlock;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCFieldAccess;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCModifiers;\nimport com.sun.tools.javac.tree.JCTree.JCStatement;\nimport com.sun.tools.javac.tree.JCTree.JCTypeParameter;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.util.ListBuffer;\nimport com.sun.tools.javac.util.Name;\n\nimport lombok.ConfigurationKeys;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.experimental.Delegate;\nimport lombok.javac.FindTypeVarScanner;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacResolution;\nimport lombok.javac.JavacResolution.TypeNotConvertibleException;\nimport lombok.javac.JavacTreeMaker;\nimport lombok.javac.ResolutionResetNeeded;\nimport lombok.permit.Permit;\nimport lombok.spi.Provides;\n\n@Provides\n@HandlerPriority(HandleDelegate.HANDLE_DELEGATE_PRIORITY) //2^16; to make sure that we also delegate generated methods.\n@ResolutionResetNeeded\npublic class HandleDelegate extends JavacAnnotationHandler<Delegate> {\n\t\n\tprivate static final List<String> METHODS_IN_OBJECT = Collections.unmodifiableList(Arrays.asList(\n\t\t\t\"hashCode()\",\n\t\t\t\"canEqual(java.lang.Object)\",  //Not in j.l.Object, but it goes with hashCode and equals so if we ignore those two, we should ignore this one.\n\t\t\t\"equals(java.lang.Object)\",\n\t\t\t\"wait()\",\n\t\t\t\"wait(long)\",\n\t\t\t\"wait(long, int)\",\n\t\t\t\"notify()\",\n\t\t\t\"notifyAll()\",\n\t\t\t\"toString()\",\n\t\t\t\"getClass()\",\n\t\t\t\"clone()\",\n\t\t\t\"finalize()\"));\n\t\n\tprivate static final String LEGALITY_OF_DELEGATE = \"@Delegate is legal only on instance fields or no-argument instance methods.\";\n\tprivate static final String RECURSION_NOT_ALLOWED = \"@Delegate does not support recursion (delegating to a type that itself has @Delegate members). Member \\\"%s\\\" is @Delegate in type \\\"%s\\\"\";\n\tpublic static final int HANDLE_DELEGATE_PRIORITY = 65536;\n\n\t\n\t@Override public void handle(AnnotationValues<Delegate> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\thandleExperimentalFlagUsage(annotationNode, ConfigurationKeys.DELEGATE_FLAG_USAGE, \"@Delegate\");\n\t\t\n\t\t@SuppressWarnings(\"deprecation\") Class<? extends Annotation> oldDelegate = lombok.Delegate.class;\n\t\tdeleteAnnotationIfNeccessary(annotationNode, Delegate.class, oldDelegate);\n\t\t\n\t\tType delegateType;\n\t\tName delegateName = annotationNode.toName(annotationNode.up().getName());\n\t\tDelegateReceiver delegateReceiver;\n\t\tJavacResolution reso = new JavacResolution(annotationNode.getContext());\n\t\tJCTree member = annotationNode.up().get();\n\t\tif (annotationNode.up().getKind() == Kind.FIELD) {\n\t\t\tif ((((JCVariableDecl) member).mods.flags & Flags.STATIC) != 0) {\n\t\t\t\tannotationNode.addError(LEGALITY_OF_DELEGATE);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdelegateReceiver = DelegateReceiver.FIELD;\n\t\t\tdelegateType = member.type;\n\t\t\tif (delegateType == null) reso.resolveClassMember(annotationNode.up());\n\t\t\tdelegateType = member.type;\n\t\t} else if (annotationNode.up().getKind() == Kind.METHOD) {\n\t\t\tif (!(member instanceof JCMethodDecl)) {\n\t\t\t\tannotationNode.addError(LEGALITY_OF_DELEGATE);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tJCMethodDecl methodDecl = (JCMethodDecl) member;\n\t\t\tif (!methodDecl.params.isEmpty() || (methodDecl.mods.flags & Flags.STATIC) != 0) {\n\t\t\t\tannotationNode.addError(LEGALITY_OF_DELEGATE);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdelegateReceiver = DelegateReceiver.METHOD;\n\t\t\tdelegateType = methodDecl.restype.type;\n\t\t\tif (delegateType == null) reso.resolveClassMember(annotationNode.up());\n\t\t\tdelegateType = methodDecl.restype.type;\n\t\t} else {\n\t\t\t// As the annotation is legal on fields and methods only, javac itself will take care of printing an error message for this.\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tList<Object> delegateTypes = annotation.getActualExpressions(\"types\");\n\t\tList<Object> excludeTypes = annotation.getActualExpressions(\"excludes\");\n\t\tList<Type> toDelegate = new ArrayList<Type>();\n\t\tList<Type> toExclude = new ArrayList<Type>();\n\t\t\n\t\tif (delegateTypes.isEmpty()) {\n\t\t\tif (delegateType != null) toDelegate.add(delegateType); \n\t\t} else {\n\t\t\tfor (Object dt : delegateTypes) {\n\t\t\t\tif (dt instanceof JCFieldAccess && ((JCFieldAccess)dt).name.toString().equals(\"class\")) {\n\t\t\t\t\tType type = ((JCFieldAccess)dt).selected.type;\n\t\t\t\t\tif (type == null) reso.resolveClassMember(annotationNode);\n\t\t\t\t\ttype = ((JCFieldAccess)dt).selected.type;\n\t\t\t\t\tif (type != null) toDelegate.add(type);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tfor (Object et : excludeTypes) {\n\t\t\tif (et instanceof JCFieldAccess && ((JCFieldAccess)et).name.toString().equals(\"class\")) {\n\t\t\t\tType type = ((JCFieldAccess)et).selected.type;\n\t\t\t\tif (type == null) reso.resolveClassMember(annotationNode);\n\t\t\t\ttype = ((JCFieldAccess)et).selected.type;\n\t\t\t\tif (type != null) toExclude.add(type);\n\t\t\t}\n\t\t}\n\t\t\n\t\tList<MethodSig> signaturesToDelegate = new ArrayList<MethodSig>();\n\t\tList<MethodSig> signaturesToExclude = new ArrayList<MethodSig>();\n\t\tSet<String> banList = new HashSet<String>();\n\t\tbanList.addAll(METHODS_IN_OBJECT);\n\t\t\n\t\t// Add already implemented methods to ban list\n\t\tJavacNode typeNode = upToTypeNode(annotationNode);\n\t\tfor (Symbol m : ((JCClassDecl)typeNode.get()).sym.getEnclosedElements()) {\n\t\t\tif (m instanceof MethodSymbol) {\n\t\t\t\tbanList.add(printSig((ExecutableType) m.asType(), m.name, annotationNode.getTypesUtil()));\n\t\t\t}\n\t\t}\n\t\t\n\t\ttry {\n\t\t\tfor (Type t : toExclude) {\n\t\t\t\tif (t instanceof ClassType) {\n\t\t\t\t\tClassType ct = (ClassType) t;\n\t\t\t\t\taddMethodBindings(signaturesToExclude, ct, annotationNode.getTypesUtil(), banList);\n\t\t\t\t} else {\n\t\t\t\t\tannotationNode.addError(\"@Delegate can only use concrete class types, not wildcards, arrays, type variables, or primitives.\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tfor (MethodSig sig : signaturesToExclude) {\n\t\t\t\tbanList.add(printSig(sig.type, sig.name, annotationNode.getTypesUtil()));\n\t\t\t}\n\t\t\t\n\t\t\tfor (Type t : toDelegate) {\n\t\t\t\tType unannotatedType = Unannotated.unannotatedType(t);\n\t\t\t\tif (unannotatedType instanceof ClassType) {\n\t\t\t\t\tClassType ct = (ClassType) unannotatedType;\n\t\t\t\t\taddMethodBindings(signaturesToDelegate, ct, annotationNode.getTypesUtil(), banList);\n\t\t\t\t} else {\n\t\t\t\t\tannotationNode.addError(\"@Delegate can only use concrete class types, not wildcards, arrays, type variables, or primitives.\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tfor (MethodSig sig : signaturesToDelegate) generateAndAdd(sig, annotationNode, delegateName, delegateReceiver);\n\t\t} catch (DelegateRecursion e) {\n\t\t\tannotationNode.addError(String.format(RECURSION_NOT_ALLOWED, e.member, e.type));\n\t\t}\n\t}\n\t\n\tpublic void generateAndAdd(MethodSig sig, JavacNode annotation, Name delegateName, DelegateReceiver delegateReceiver) {\n\t\tList<JCMethodDecl> toAdd = new ArrayList<JCMethodDecl>();\n\t\ttry {\n\t\t\ttoAdd.add(createDelegateMethod(sig, annotation, delegateName, delegateReceiver));\n\t\t} catch (TypeNotConvertibleException e) {\n\t\t\tannotation.addError(\"Can't create delegate method for \" + sig.name + \": \" + e.getMessage());\n\t\t\treturn;\n\t\t} catch (CantMakeDelegates e) {\n\t\t\tannotation.addError(\"There's a conflict in the names of type parameters. Fix it by renaming the following type parameters of your class: \" + e.conflicted);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tfor (JCMethodDecl method : toAdd) {\n\t\t\tinjectMethod(annotation.up().up(), method);\n\t\t}\n\t}\n\t\n\tpublic static class CantMakeDelegates extends Exception {\n\t\tSet<String> conflicted;\n\t}\n\t\n\t/**\n\t * There's a rare but problematic case if a delegate method has its own type variables, and the delegated type does too, and the method uses both.\n\t * If for example the delegated type has {@code <E>}, and the method has {@code <T>}, but in our class we have a {@code <T>} at the class level, then we have two different\n\t * type variables both named {@code T}. We detect this situation and error out asking the programmer to rename their type variable.\n\t * \n\t * @throws CantMakeDelegates If there's a conflict. Conflict list is in ex.conflicted.\n\t */\n\tpublic void checkConflictOfTypeVarNames(MethodSig sig, JavacNode annotation) throws CantMakeDelegates {\n\t\t// As first step, we check if there's a conflict between the delegate method's type vars and our own class.\n\t\t\n\t\tif (sig.elem.getTypeParameters().isEmpty()) return;\n\t\tSet<String> usedInOurType = new HashSet<String>();\n\t\t\n\t\tJavacNode enclosingType = annotation;\n\t\twhile (enclosingType != null) {\n\t\t\tif (enclosingType.getKind() == Kind.TYPE) {\n\t\t\t\tList<JCTypeParameter> typarams = ((JCClassDecl)enclosingType.get()).typarams;\n\t\t\t\tif (typarams != null) for (JCTypeParameter param : typarams) {\n\t\t\t\t\tif (param.name != null) usedInOurType.add(param.name.toString());\n\t\t\t\t}\n\t\t\t}\n\t\t\tenclosingType = enclosingType.up();\n\t\t}\n\t\t\n\t\tSet<String> usedInMethodSig = new HashSet<String>();\n\t\tfor (TypeParameterElement param : sig.elem.getTypeParameters()) {\n\t\t\tusedInMethodSig.add(param.getSimpleName().toString());\n\t\t}\n\t\t\n\t\tusedInMethodSig.retainAll(usedInOurType);\n\t\tif (usedInMethodSig.isEmpty()) return;\n\t\t\n\t\t// We might be delegating a List<T>, and we are making method <T> toArray(). A conflict is possible.\n\t\t// But only if the toArray method also uses type vars from its class, otherwise we're only shadowing,\n\t\t// which is okay as we'll add a @SuppressWarnings.\n\t\tFindTypeVarScanner scanner = new FindTypeVarScanner();\n\t\tsig.elem.asType().accept(scanner, null);\n\t\tSet<String> names = new HashSet<String>(scanner.getTypeVariables());\n\t\tnames.removeAll(usedInMethodSig);\n\t\tif (!names.isEmpty()) {\n\t\t\t// We have a confirmed conflict. We could dig deeper as this may still be a false alarm, but its already an exceedingly rare case.\n\t\t\tCantMakeDelegates cmd = new CantMakeDelegates();\n\t\t\tcmd.conflicted = usedInMethodSig;\n\t\t\tthrow cmd;\n\t\t}\n\t}\n\t\n\tpublic JCMethodDecl createDelegateMethod(MethodSig sig, JavacNode annotation, Name delegateName, DelegateReceiver delegateReceiver) throws TypeNotConvertibleException, CantMakeDelegates {\n\t\t/* public <T, U, ...> ReturnType methodName(ParamType1 name1, ParamType2 name2, ...) throws T1, T2, ... {\n\t\t *      (return) delegate.<T, U>methodName(name1, name2);\n\t\t *  }\n\t\t */\n\t\t\n\t\tcheckConflictOfTypeVarNames(sig, annotation);\n\t\t\n\t\tJavacTreeMaker maker = annotation.getTreeMaker();\n\t\t\n\t\tcom.sun.tools.javac.util.List<JCAnnotation> annotations;\n\t\tif (sig.isDeprecated) {\n\t\t\tannotations = com.sun.tools.javac.util.List.of(maker.Annotation(\n\t\t\t\t\tgenJavaLangTypeRef(annotation, \"Deprecated\"),\n\t\t\t\t\tcom.sun.tools.javac.util.List.<JCExpression>nil()));\n\t\t} else {\n\t\t\tannotations = com.sun.tools.javac.util.List.nil();\n\t\t}\n\t\t\n\t\tJCModifiers mods = maker.Modifiers(PUBLIC, annotations);\n\t\tJCExpression returnType = JavacResolution.typeToJCTree((Type) sig.type.getReturnType(), annotation.getAst(), true);\n\t\tboolean useReturn = sig.type.getReturnType().getKind() != TypeKind.VOID;\n\t\tListBuffer<JCVariableDecl> params = sig.type.getParameterTypes().isEmpty() ? null : new ListBuffer<JCVariableDecl>();\n\t\tListBuffer<JCExpression> args = sig.type.getParameterTypes().isEmpty() ? null : new ListBuffer<JCExpression>();\n\t\tListBuffer<JCExpression> thrown = sig.type.getThrownTypes().isEmpty() ? null : new ListBuffer<JCExpression>();\n\t\tListBuffer<JCTypeParameter> typeParams = sig.type.getTypeVariables().isEmpty() ? null : new ListBuffer<JCTypeParameter>();\n\t\tListBuffer<JCExpression> typeArgs = sig.type.getTypeVariables().isEmpty() ? null : new ListBuffer<JCExpression>();\n\t\tTypes types = Types.instance(annotation.getContext());\n\t\t\n\t\tfor (TypeMirror param : sig.type.getTypeVariables()) {\n\t\t\tName name = ((TypeVar) param).tsym.name;\n\t\t\t\n\t\t\tListBuffer<JCExpression> bounds = new ListBuffer<JCExpression>();\n\t\t\tfor (Type type : types.getBounds((TypeVar) param)) {\n\t\t\t\tbounds.append(JavacResolution.typeToJCTree(type, annotation.getAst(), true));\n\t\t\t}\n\t\t\t\n\t\t\ttypeParams.append(maker.TypeParameter(name, bounds.toList()));\n\t\t\ttypeArgs.append(maker.Ident(name));\n\t\t}\n\t\t\n\t\tfor (TypeMirror ex : sig.type.getThrownTypes()) {\n\t\t\tthrown.append(JavacResolution.typeToJCTree((Type) ex, annotation.getAst(), true));\n\t\t}\n\t\t\n\t\tint idx = 0;\n\t\tString[] paramNames = sig.getParameterNames();\n\t\tboolean varargs = sig.elem.isVarArgs();\n\t\tfor (TypeMirror param : sig.type.getParameterTypes()) {\n\t\t\tlong flags = JavacHandlerUtil.addFinalIfNeeded(Flags.PARAMETER, annotation.getContext());\n\t\t\tJCModifiers paramMods = maker.Modifiers(flags);\n\t\t\tName name = annotation.toName(paramNames[idx++]);\n\t\t\tif (varargs && idx == paramNames.length) {\n\t\t\t\tparamMods.flags |= VARARGS;\n\t\t\t}\n\t\t\tparams.append(maker.VarDef(paramMods, name, JavacResolution.typeToJCTree((Type) param, annotation.getAst(), true), null));\n\t\t\targs.append(maker.Ident(name));\n\t\t}\n\t\t\n\t\tJCExpression delegateCall = maker.Apply(toList(typeArgs), maker.Select(delegateReceiver.get(annotation, delegateName), sig.name), toList(args));\n\t\tJCStatement body = useReturn ? maker.Return(delegateCall) : maker.Exec(delegateCall);\n\t\tJCBlock bodyBlock = maker.Block(0, com.sun.tools.javac.util.List.of(body));\n\t\t\n\t\treturn recursiveSetGeneratedBy(maker.MethodDef(mods, sig.name, returnType, toList(typeParams), toList(params), toList(thrown), bodyBlock, null), annotation);\n\t}\n\t\n\tpublic static <T> com.sun.tools.javac.util.List<T> toList(ListBuffer<T> collection) {\n\t\treturn collection == null ? com.sun.tools.javac.util.List.<T>nil() : collection.toList();\n\t}\n\t\n\tprivate static class DelegateRecursion extends Throwable {\n\t\tfinal String type, member;\n\t\t\n\t\tpublic DelegateRecursion(String type, String member) {\n\t\t\tthis.type = type;\n\t\t\tthis.member = member;\n\t\t}\n\t}\n\t\n\tpublic void addMethodBindings(List<MethodSig> signatures, ClassType ct, JavacTypes types, Set<String> banList) throws DelegateRecursion {\n\t\tTypeSymbol tsym = ct.asElement();\n\t\tif (tsym == null) return;\n\t\t\n\t\tfor (Symbol member : tsym.getEnclosedElements()) {\n\t\t\tfor (Compound am : member.getAnnotationMirrors()) {\n\t\t\t\tString name = null;\n\t\t\t\ttry {\n\t\t\t\t\tname = am.type.tsym.flatName().toString();\n\t\t\t\t} catch (Exception ignore) {}\n\t\t\t\t\n\t\t\t\tif (\"lombok.Delegate\".equals(name) || \"lombok.experimental.Delegate\".equals(name)) {\n\t\t\t\t\tthrow new DelegateRecursion(ct.tsym.name.toString(), member.name.toString());\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (member.getKind() != ElementKind.METHOD) continue;\n\t\t\tif (member.isStatic()) continue;\n\t\t\tif (member.isConstructor()) continue;\n\t\t\tExecutableElement exElem = (ExecutableElement)member;\n\t\t\tif (!exElem.getModifiers().contains(Modifier.PUBLIC)) continue;\n\t\t\tExecutableType methodType = (ExecutableType) types.asMemberOf(ct, member);\n\t\t\tString sig = printSig(methodType, member.name, types);\n\t\t\tif (!banList.add(sig)) continue; //If add returns false, it was already in there\n\t\t\tboolean isDeprecated = (member.flags() & DEPRECATED) != 0;\n\t\t\tsignatures.add(new MethodSig(member.name, methodType, isDeprecated, exElem));\n\t\t}\n\n\t\tfor (Type type : types.directSupertypes(ct)) {\n\t\t\tif (type instanceof ClassType) {\n\t\t\t\taddMethodBindings(signatures, (ClassType) type, types, banList);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic static class MethodSig {\n\t\tfinal Name name;\n\t\tfinal ExecutableType type;\n\t\tfinal boolean isDeprecated;\n\t\tfinal ExecutableElement elem;\n\t\t\n\t\tMethodSig(Name name, ExecutableType type, boolean isDeprecated, ExecutableElement elem) {\n\t\t\tthis.name = name;\n\t\t\tthis.type = type;\n\t\t\tthis.isDeprecated = isDeprecated;\n\t\t\tthis.elem = elem;\n\t\t}\n\t\t\n\t\tString[] getParameterNames() {\n\t\t\tList<? extends VariableElement> paramList = elem.getParameters();\n\t\t\tString[] paramNames = new String[paramList.size()];\n\t\t\tfor (int i = 0; i < paramNames.length; i++) {\n\t\t\t\tparamNames[i] = paramList.get(i).getSimpleName().toString();\n\t\t\t}\n\t\t\treturn paramNames;\n\t\t}\n\t\t\n\t\t@Override public String toString() {\n\t\t\treturn (isDeprecated ? \"@Deprecated \" : \"\") + name + \" \" + type;\n\t\t}\n\t}\n\t\n\tpublic static String printSig(ExecutableType method, Name name, JavacTypes types) {\n\t\tStringBuilder sb = new StringBuilder();\n\t\tsb.append(name.toString()).append(\"(\");\n\t\tboolean first = true;\n\t\tfor (TypeMirror param : method.getParameterTypes()) {\n\t\t\tif (!first) sb.append(\", \");\n\t\t\tfirst = false;\n\t\t\tsb.append(typeBindingToSignature(param, types));\n\t\t}\n\t\treturn sb.append(\")\").toString();\n\t}\n\t\n\tpublic static String typeBindingToSignature(TypeMirror binding, JavacTypes types) {\n\t\tbinding = types.erasure(binding);\n\t\treturn binding.toString();\n\t}\n\t\n\tpublic enum DelegateReceiver {\n\t\tMETHOD {\n\t\t\tpublic JCExpression get(final JavacNode node, final Name name) {\n\t\t\t\tcom.sun.tools.javac.util.List<JCExpression> nilExprs = com.sun.tools.javac.util.List.nil();\n\t\t\t\tfinal JavacTreeMaker maker = node.getTreeMaker();\n\t\t\t\treturn maker.Apply(nilExprs, maker.Select(maker.Ident(node.toName(\"this\")), name), nilExprs);\n\t\t\t}\n\t\t},\n\t\tFIELD {\n\t\t\tpublic JCExpression get(final JavacNode node, final Name name) {\n\t\t\t\tfinal JavacTreeMaker maker = node.getTreeMaker();\n\t\t\t\treturn maker.Select(maker.Ident(node.toName(\"this\")), name);\n\t\t\t}\n\t\t};\n\t\t\n\t\tpublic abstract JCExpression get(final JavacNode node, final Name name);\n\t}\n\t\n\tprivate static class Unannotated {\n\t\tprivate static final Method unannotated;\n\t\t\n\t\tstatic {\n\t\t\tMethod m = null;\n\t\t\ttry {\n\t\t\t\tm = Permit.getMethod(Type.class, \"unannotatedType\");\n\t\t\t} catch (Exception e) {/* ignore */}\n\t\t\tunannotated = m;\n\t\t}\n\t\t\n\t\tstatic Type unannotatedType(Type t) {\n\t\t\tif (unannotated == null) return t;\n\t\t\ttry {\n\t\t\t\treturn (Type) Permit.invoke(unannotated, t);\n\t\t\t} catch (Exception e) {\n\t\t\t\treturn t;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleEqualsAndHashCode.java",
    "content": "/*\n * Copyright (C) 2009-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.handleFlagUsage;\nimport static lombok.javac.Javac.*;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\n\nimport com.sun.tools.javac.code.BoundKind;\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCArrayTypeTree;\nimport com.sun.tools.javac.tree.JCTree.JCBinary;\nimport com.sun.tools.javac.tree.JCTree.JCBlock;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCExpressionStatement;\nimport com.sun.tools.javac.tree.JCTree.JCFieldAccess;\nimport com.sun.tools.javac.tree.JCTree.JCIdent;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCMethodInvocation;\nimport com.sun.tools.javac.tree.JCTree.JCModifiers;\nimport com.sun.tools.javac.tree.JCTree.JCPrimitiveTypeTree;\nimport com.sun.tools.javac.tree.JCTree.JCStatement;\nimport com.sun.tools.javac.tree.JCTree.JCTypeParameter;\nimport com.sun.tools.javac.tree.JCTree.JCUnary;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.ListBuffer;\nimport com.sun.tools.javac.util.Name;\n\nimport lombok.ConfigurationKeys;\nimport lombok.EqualsAndHashCode;\nimport lombok.EqualsAndHashCode.CacheStrategy;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.core.configuration.CallSuperType;\nimport lombok.core.configuration.CheckerFrameworkVersion;\nimport lombok.core.handlers.HandlerUtil;\nimport lombok.core.handlers.HandlerUtil.FieldAccess;\nimport lombok.core.handlers.InclusionExclusionUtils;\nimport lombok.core.handlers.InclusionExclusionUtils.Included;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacTreeMaker;\nimport lombok.javac.handlers.JavacHandlerUtil.MemberExistsResult;\nimport lombok.spi.Provides;\n\n/**\n * Handles the {@code lombok.EqualsAndHashCode} annotation for javac.\n */\n@Provides\npublic class HandleEqualsAndHashCode extends JavacAnnotationHandler<EqualsAndHashCode> {\n\tprivate static final String RESULT_NAME = \"result\";\n\tprivate static final String PRIME_NAME = \"PRIME\";\n\tprivate static final String HASH_CODE_CACHE_NAME = \"$hashCodeCache\";\n\t\n\t@Override public void handle(AnnotationValues<EqualsAndHashCode> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.EQUALS_AND_HASH_CODE_FLAG_USAGE, \"@EqualsAndHashCode\");\n\t\t\n\t\tdeleteAnnotationIfNeccessary(annotationNode, EqualsAndHashCode.class);\n\t\tdeleteImportFromCompilationUnit(annotationNode, CacheStrategy.class.getName());\n\t\tEqualsAndHashCode ann = annotation.getInstance();\n\t\tjava.util.List<Included<JavacNode, EqualsAndHashCode.Include>> members = InclusionExclusionUtils.handleEqualsAndHashCodeMarking(annotationNode.up(), annotation, annotationNode);\n\t\tJavacNode typeNode = annotationNode.up();\n\t\tList<JCAnnotation> onParam = unboxAndRemoveAnnotationParameter(ast, \"onParam\", \"@EqualsAndHashCode(onParam\", annotationNode);\n\t\t\n\t\tBoolean callSuper = ann.callSuper();\n\t\tif (!annotation.isExplicit(\"callSuper\")) callSuper = null;\n\t\t\n\t\tBoolean doNotUseGettersConfiguration = annotationNode.getAst().readConfiguration(ConfigurationKeys.EQUALS_AND_HASH_CODE_DO_NOT_USE_GETTERS);\n\t\tboolean doNotUseGetters = annotation.isExplicit(\"doNotUseGetters\") || doNotUseGettersConfiguration == null ? ann.doNotUseGetters() : doNotUseGettersConfiguration;\n\t\tFieldAccess fieldAccess = doNotUseGetters ? FieldAccess.PREFER_FIELD : FieldAccess.GETTER;\n\t\t\n\t\tboolean cacheHashCode = ann.cacheStrategy() == CacheStrategy.LAZY;\n\t\t\n\t\tgenerateMethods(typeNode, annotationNode, members, callSuper, true, cacheHashCode, fieldAccess, onParam);\n\t}\n\t\n\tpublic void generateEqualsAndHashCodeForType(JavacNode typeNode, JavacNode source) {\n\t\tif (hasAnnotation(EqualsAndHashCode.class, typeNode)) {\n\t\t\t//The annotation will make it happen, so we can skip it.\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tBoolean doNotUseGettersConfiguration = typeNode.getAst().readConfiguration(ConfigurationKeys.EQUALS_AND_HASH_CODE_DO_NOT_USE_GETTERS);\n\t\tFieldAccess access = doNotUseGettersConfiguration == null || !doNotUseGettersConfiguration ? FieldAccess.GETTER : FieldAccess.PREFER_FIELD;\n\t\t\n\t\tjava.util.List<Included<JavacNode, EqualsAndHashCode.Include>> members = InclusionExclusionUtils.handleEqualsAndHashCodeMarking(typeNode, null, null);\n\t\t\n\t\tgenerateMethods(typeNode, source, members, null, false, false, access, List.<JCAnnotation>nil());\n\t}\n\t\n\tpublic void generateMethods(JavacNode typeNode, JavacNode source, java.util.List<Included<JavacNode, EqualsAndHashCode.Include>> members,\n\t\tBoolean callSuper, boolean whineIfExists, boolean cacheHashCode, FieldAccess fieldAccess, List<JCAnnotation> onParam) {\n\t\t\n\t\tif (!isClass(typeNode)) {\n\t\t\tsource.addError(\"@EqualsAndHashCode is only supported on a class.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tboolean implicitCallSuper = callSuper == null;\n\t\tif (callSuper == null) {\n\t\t\ttry {\n\t\t\t\tcallSuper = ((Boolean) EqualsAndHashCode.class.getMethod(\"callSuper\").getDefaultValue()).booleanValue();\n\t\t\t} catch (Exception ignore) {\n\t\t\t\tthrow new InternalError(\"Lombok bug - this cannot happen - can't find callSuper field in EqualsAndHashCode annotation.\");\n\t\t\t}\n\t\t}\n\t\t\n\t\tboolean isDirectDescendantOfObject = isDirectDescendantOfObject(typeNode);\n\t\t\n\t\tboolean isFinal = (((JCClassDecl) typeNode.get()).mods.flags & Flags.FINAL) != 0;\n\t\tboolean needsCanEqual = !isFinal || !isDirectDescendantOfObject;\n\t\tMemberExistsResult equalsExists = methodExists(\"equals\", typeNode, 1);\n\t\tMemberExistsResult hashCodeExists = methodExists(\"hashCode\", typeNode, 0);\n\t\tMemberExistsResult canEqualExists = methodExists(\"canEqual\", typeNode, 1);\n\t\tswitch (Collections.max(Arrays.asList(equalsExists, hashCodeExists))) {\n\t\tcase EXISTS_BY_LOMBOK:\n\t\t\treturn;\n\t\tcase EXISTS_BY_USER:\n\t\t\tif (whineIfExists) {\n\t\t\t\tString msg = \"Not generating equals and hashCode: A method with one of those names already exists. (Either both or none of these methods will be generated).\";\n\t\t\t\tsource.addWarning(msg);\n\t\t\t} else if (equalsExists == MemberExistsResult.NOT_EXISTS || hashCodeExists == MemberExistsResult.NOT_EXISTS) {\n\t\t\t\t// This means equals OR hashCode exists and not both.\n\t\t\t\t// Even though we should suppress the message about not generating these, this is such a weird and surprising situation we should ALWAYS generate a warning.\n\t\t\t\t// The user code couldn't possibly (barring really weird subclassing shenanigans) be in a shippable state anyway; the implementations of these 2 methods are\n\t\t\t\t// all inter-related and should be written by the same entity.\n\t\t\t\tString msg = String.format(\"Not generating %s: One of equals or hashCode exists. \" +\n\t\t\t\t\t\"You should either write both of these or none of these (in the latter case, lombok generates them).\",\n\t\t\t\t\tequalsExists == MemberExistsResult.NOT_EXISTS ? \"equals\" : \"hashCode\");\n\t\t\t\tsource.addWarning(msg);\n\t\t\t}\n\t\t\treturn;\n\t\tcase NOT_EXISTS:\n\t\tdefault:\n\t\t\t//fallthrough\n\t\t}\n\t\t\n\t\tif (isDirectDescendantOfObject && callSuper) {\n\t\t\tsource.addError(\"Generating equals/hashCode with a supercall to java.lang.Object is pointless.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (implicitCallSuper && !isDirectDescendantOfObject) {\n\t\t\tCallSuperType cst = typeNode.getAst().readConfiguration(ConfigurationKeys.EQUALS_AND_HASH_CODE_CALL_SUPER);\n\t\t\tif (cst == null) cst = CallSuperType.WARN;\n\t\t\t\n\t\t\tswitch (cst) {\n\t\t\tdefault:\n\t\t\tcase WARN:\n\t\t\t\tsource.addWarning(\"Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is intentional, add '@EqualsAndHashCode(callSuper=false)' to your type.\");\n\t\t\t\tcallSuper = false;\n\t\t\t\tbreak;\n\t\t\tcase SKIP:\n\t\t\t\tcallSuper = false;\n\t\t\t\tbreak;\n\t\t\tcase CALL:\n\t\t\t\tcallSuper = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\tJCMethodDecl equalsMethod = createEquals(typeNode, members, callSuper, fieldAccess, needsCanEqual, source, copyAnnotations(onParam, typeNode.getTreeMaker()));\n\t\t\n\t\tinjectMethod(typeNode, equalsMethod);\n\t\t\n\t\tif (needsCanEqual && canEqualExists == MemberExistsResult.NOT_EXISTS) {\n\t\t\tJCMethodDecl canEqualMethod = createCanEqual(typeNode, source, copyAnnotations(onParam, typeNode.getTreeMaker()));\n\t\t\tinjectMethod(typeNode, canEqualMethod);\n\t\t}\n\t\t\n\t\tif (cacheHashCode){\n\t\t\tif (fieldExists(HASH_CODE_CACHE_NAME, typeNode) != MemberExistsResult.NOT_EXISTS) {\n\t\t\t\tString msg = String.format(\"Not caching the result of hashCode: A field named %s already exists.\", HASH_CODE_CACHE_NAME);\n\t\t\t\tsource.addWarning(msg);\n\t\t\t\tcacheHashCode = false;\n\t\t\t} else {\n\t\t\t\tcreateHashCodeCacheField(typeNode, source);\n\t\t\t}\n\t\t}\n\t\t\n\t\tJCMethodDecl hashCodeMethod = createHashCode(typeNode, members, callSuper, cacheHashCode, fieldAccess, source);\n\t\tinjectMethod(typeNode, hashCodeMethod);\n\t}\n\n\tprivate void createHashCodeCacheField(JavacNode typeNode, JavacNode source) {\n\t\tJavacTreeMaker maker = typeNode.getTreeMaker();\n\t\tJCModifiers mods = maker.Modifiers(Flags.PRIVATE | Flags.TRANSIENT);\n\t\tJCVariableDecl hashCodeCacheField = maker.VarDef(mods, typeNode.toName(HASH_CODE_CACHE_NAME), maker.TypeIdent(CTC_INT), null);\n\t\tinjectFieldAndMarkGenerated(typeNode, hashCodeCacheField);\n\t\trecursiveSetGeneratedBy(hashCodeCacheField, source);\n\t}\n\t\n\tpublic JCMethodDecl createHashCode(JavacNode typeNode, java.util.List<Included<JavacNode, EqualsAndHashCode.Include>> members, boolean callSuper, boolean cacheHashCode, FieldAccess fieldAccess, JavacNode source) {\n\t\tJavacTreeMaker maker = typeNode.getTreeMaker();\n\t\t\n\t\tJCAnnotation overrideAnnotation = maker.Annotation(genJavaLangTypeRef(typeNode, \"Override\"), List.<JCExpression>nil());\n\t\tList<JCAnnotation> annsOnMethod = List.of(overrideAnnotation);\n\t\tCheckerFrameworkVersion checkerFramework = getCheckerFrameworkVersion(typeNode);\n\t\tif (cacheHashCode && checkerFramework.generatePure()) {\n\t\t\tannsOnMethod = annsOnMethod.prepend(maker.Annotation(genTypeRef(typeNode, CheckerFrameworkVersion.NAME__PURE), List.<JCExpression>nil()));\n\t\t} else if (checkerFramework.generateSideEffectFree()) { \n\t\t\tannsOnMethod = annsOnMethod.prepend(maker.Annotation(genTypeRef(typeNode, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil()));\n\t\t}\n\t\tJCModifiers mods = maker.Modifiers(Flags.PUBLIC, annsOnMethod);\n\t\tJCExpression returnType = maker.TypeIdent(CTC_INT);\n\t\tListBuffer<JCStatement> statements = new ListBuffer<JCStatement>();\n\t\t\n\t\tName primeName = typeNode.toName(PRIME_NAME);\n\t\tName resultName = typeNode.toName(RESULT_NAME);\n\t\tlong finalFlag = JavacHandlerUtil.addFinalIfNeeded(0L, typeNode.getContext());\n\t\t\n\t\tboolean isEmpty = members.isEmpty();\n\t\t\n\t\t/* if (this.$hashCodeCache != 0) return this.$hashCodeCache; */ {\n\t\t\tif (cacheHashCode) {\n\t\t\t\tJCFieldAccess hashCodeCacheFieldAccess = createHashCodeCacheFieldAccess(typeNode, maker);\n\t\t\t\tJCExpression cacheNotZero = maker.Binary(CTC_NOT_EQUAL, hashCodeCacheFieldAccess, maker.Literal(CTC_INT, 0));\n\t\t\t\thashCodeCacheFieldAccess = createHashCodeCacheFieldAccess(typeNode, maker);\n\t\t\t\tstatements.append(maker.If(cacheNotZero, maker.Return(hashCodeCacheFieldAccess), null));\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* final int PRIME = X; */ {\n\t\t\tif (!isEmpty) {\n\t\t\t\tstatements.append(maker.VarDef(maker.Modifiers(finalFlag), primeName, maker.TypeIdent(CTC_INT), maker.Literal(HandlerUtil.primeForHashcode())));\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* int result = ... */ {\n\t\t\tfinal JCExpression init;\n\t\t\tif (callSuper) {\n\t\t\t\t/* ... super.hashCode(); */\n\t\t\t\tinit = maker.Apply(List.<JCExpression>nil(),\n\t\t\t\t\tmaker.Select(maker.Ident(typeNode.toName(\"super\")), typeNode.toName(\"hashCode\")),\n\t\t\t\t\tList.<JCExpression>nil());\n\t\t\t} else {\n\t\t\t\t/* ... 1; */\n\t\t\t\tinit = maker.Literal(1);\n\t\t\t}\n\t\t\tstatements.append(maker.VarDef(maker.Modifiers(isEmpty && !cacheHashCode ? finalFlag : 0L), resultName, maker.TypeIdent(CTC_INT), init));\n\t\t}\n\t\t\n\t\tfor (Included<JavacNode, EqualsAndHashCode.Include> member : members) {\n\t\t\tJavacNode memberNode = member.getNode();\n\t\t\tJCExpression fType = removeTypeUseAnnotations(getFieldType(memberNode, fieldAccess));\n\t\t\tboolean isMethod = memberNode.getKind() == Kind.METHOD;\n\t\t\t\n\t\t\tJCExpression fieldAccessor = isMethod ? createMethodAccessor(maker, memberNode) : createFieldAccessor(maker, memberNode, fieldAccess);\n\t\t\tif (fType instanceof JCPrimitiveTypeTree) {\n\t\t\t\tswitch (((JCPrimitiveTypeTree) fType).getPrimitiveTypeKind()) {\n\t\t\t\tcase BOOLEAN:\n\t\t\t\t\t/* this.fieldName ? X : Y */\n\t\t\t\t\tstatements.append(createResultCalculation(typeNode, maker.Parens(maker.Conditional(fieldAccessor, \n\t\t\t\t\t\tmaker.Literal(HandlerUtil.primeForTrue()), maker.Literal(HandlerUtil.primeForFalse())))));\n\t\t\t\t\tbreak;\n\t\t\t\tcase LONG: {\n\t\t\t\t\t\tName dollarFieldName = memberNode.toName((isMethod ? \"$$\" : \"$\") + memberNode.getName());\n\t\t\t\t\t\tstatements.append(maker.VarDef(maker.Modifiers(finalFlag), dollarFieldName, maker.TypeIdent(CTC_LONG), fieldAccessor));\n\t\t\t\t\t\tstatements.append(createResultCalculation(typeNode, longToIntForHashCode(maker, maker.Ident(dollarFieldName), maker.Ident(dollarFieldName))));\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase FLOAT:\n\t\t\t\t\t/* Float.floatToIntBits(this.fieldName) */\n\t\t\t\t\tstatements.append(createResultCalculation(typeNode, maker.Apply(\n\t\t\t\t\t\tList.<JCExpression>nil(),\n\t\t\t\t\t\tgenJavaLangTypeRef(typeNode, \"Float\", \"floatToIntBits\"),\n\t\t\t\t\t\tList.of(fieldAccessor))));\n\t\t\t\t\tbreak;\n\t\t\t\tcase DOUBLE: {\n\t\t\t\t\t\t/* longToIntForHashCode(Double.doubleToLongBits(this.fieldName)) */\n\t\t\t\t\tName dollarFieldName = memberNode.toName((isMethod ? \"$$\" : \"$\") + memberNode.getName());\n\t\t\t\t\t\tJCExpression init = maker.Apply(\n\t\t\t\t\t\t\tList.<JCExpression>nil(),\n\t\t\t\t\t\t\tgenJavaLangTypeRef(typeNode, \"Double\", \"doubleToLongBits\"),\n\t\t\t\t\t\t\tList.of(fieldAccessor));\n\t\t\t\t\t\tstatements.append(maker.VarDef(maker.Modifiers(finalFlag), dollarFieldName, maker.TypeIdent(CTC_LONG), init));\n\t\t\t\t\t\tstatements.append(createResultCalculation(typeNode, longToIntForHashCode(maker, maker.Ident(dollarFieldName), maker.Ident(dollarFieldName))));\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\tcase BYTE:\n\t\t\t\tcase SHORT:\n\t\t\t\tcase INT:\n\t\t\t\tcase CHAR:\n\t\t\t\t\t/* just the field */\n\t\t\t\t\tstatements.append(createResultCalculation(typeNode, fieldAccessor));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else if (fType instanceof JCArrayTypeTree) {\n\t\t\t\tJCArrayTypeTree array = (JCArrayTypeTree) fType;\n\t\t\t\t/* java.util.Arrays.deepHashCode(this.fieldName) //use just hashCode() for primitive arrays. */\n\t\t\t\tboolean multiDim = removeTypeUseAnnotations(array.elemtype) instanceof JCArrayTypeTree;\n\t\t\t\tboolean primitiveArray = removeTypeUseAnnotations(array.elemtype) instanceof JCPrimitiveTypeTree;\n\t\t\t\tboolean useDeepHC = multiDim || !primitiveArray;\n\t\t\t\t\n\t\t\t\tJCExpression hcMethod = chainDots(typeNode, \"java\", \"util\", \"Arrays\", useDeepHC ? \"deepHashCode\" : \"hashCode\");\n\t\t\t\tstatements.append(createResultCalculation(typeNode, maker.Apply(List.<JCExpression>nil(), hcMethod, List.of(fieldAccessor))));\n\t\t\t} else /* objects */ {\n\t\t\t\t/* final java.lang.Object $fieldName = this.fieldName; */\n\t\t\t\t/* ($fieldName == null ? NULL_PRIME : $fieldName.hashCode()) */\n\t\t\t\t\n\t\t\t\tName dollarFieldName = memberNode.toName((isMethod ? \"$$\" : \"$\") + memberNode.getName());\n\t\t\t\tstatements.append(maker.VarDef(maker.Modifiers(finalFlag), dollarFieldName, genJavaLangTypeRef(typeNode, \"Object\"), fieldAccessor));\n\t\t\t\t\n\t\t\t\tJCExpression hcCall = maker.Apply(List.<JCExpression>nil(), maker.Select(maker.Ident(dollarFieldName), typeNode.toName(\"hashCode\")),\n\t\t\t\t\tList.<JCExpression>nil());\n\t\t\t\tJCExpression thisEqualsNull = maker.Binary(CTC_EQUAL, maker.Ident(dollarFieldName), maker.Literal(CTC_BOT, null));\n\t\t\t\tstatements.append(createResultCalculation(typeNode, maker.Parens(maker.Conditional(thisEqualsNull, maker.Literal(HandlerUtil.primeForNull()), hcCall))));\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* \n\t\t * if (result == 0) result = Integer.MIN_VALUE;\n\t\t * this.$hashCodeCache = result;\n\t\t * \n\t\t */ {\n\t\t\tif (cacheHashCode) {\n\t\t\t\tstatements.append(maker.If(maker.Binary(CTC_EQUAL, maker.Ident(resultName), maker.Literal(CTC_INT, 0)), \n\t\t\t\t\tmaker.Exec(maker.Assign(maker.Ident(resultName), genJavaLangTypeRef(typeNode, \"Integer\", \"MIN_VALUE\"))), null));\n\t\t\t\t\n\t\t\t\tJCFieldAccess cacheHashCodeFieldAccess = createHashCodeCacheFieldAccess(typeNode, maker);\n\t\t\t\tstatements.append(maker.Exec(maker.Assign(cacheHashCodeFieldAccess, maker.Ident(resultName))));\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* return result; */ {\n\t\t\tstatements.append(maker.Return(maker.Ident(resultName)));\n\t\t}\n\t\t\n\t\tJCBlock body = maker.Block(0, statements.toList());\n\t\treturn recursiveSetGeneratedBy(maker.MethodDef(mods, typeNode.toName(\"hashCode\"), returnType,\n\t\t\tList.<JCTypeParameter>nil(), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), body, null), source);\n\t}\n\n\tprivate JCFieldAccess createHashCodeCacheFieldAccess(JavacNode typeNode, JavacTreeMaker maker) {\n\t\tJCIdent receiver = maker.Ident(typeNode.toName(\"this\"));\n\t\tJCFieldAccess cacheHashCodeFieldAccess = maker.Select(receiver, typeNode.toName(HASH_CODE_CACHE_NAME));\n\t\treturn cacheHashCodeFieldAccess;\n\t}\n\n\tpublic JCExpressionStatement createResultCalculation(JavacNode typeNode, JCExpression expr) {\n\t\t/* result = result * PRIME + expr; */\n\t\tJavacTreeMaker maker = typeNode.getTreeMaker();\n\t\tName resultName = typeNode.toName(RESULT_NAME);\n\t\tJCExpression mult = maker.Binary(CTC_MUL, maker.Ident(resultName), maker.Ident(typeNode.toName(PRIME_NAME)));\n\t\tJCExpression add = maker.Binary(CTC_PLUS, mult, expr);\n\t\treturn maker.Exec(maker.Assign(maker.Ident(resultName), add));\n\t}\n\t\n\t/** The 2 references must be clones of each other. */\n\tpublic JCExpression longToIntForHashCode(JavacTreeMaker maker, JCExpression ref1, JCExpression ref2) {\n\t\t/* (int) (ref >>> 32 ^ ref) */\n\t\tJCExpression shift = maker.Binary(CTC_UNSIGNED_SHIFT_RIGHT, ref1, maker.Literal(32));\n\t\tJCExpression xorBits = maker.Binary(CTC_BITXOR, shift, ref2);\n\t\treturn maker.TypeCast(maker.TypeIdent(CTC_INT), maker.Parens(xorBits));\n\t}\n\t\n\tpublic JCExpression createTypeReference(JavacNode type, boolean addWildcards) {\n\t\tjava.util.List<String> list = new ArrayList<String>();\n\t\tjava.util.List<Integer> genericsCount = addWildcards ? new ArrayList<Integer>() : null;\n\t\t\n\t\tlist.add(type.getName());\n\t\tif (addWildcards) genericsCount.add(((JCClassDecl) type.get()).typarams.size());\n\t\tboolean staticContext = (((JCClassDecl) type.get()).getModifiers().flags & Flags.STATIC) != 0;\n\t\tJavacNode tNode = type.up();\n\t\t\n\t\twhile (tNode != null && tNode.getKind() == Kind.TYPE && !tNode.getName().isEmpty()) {\n\t\t\tlist.add(tNode.getName());\n\t\t\tif (addWildcards) genericsCount.add(staticContext ? 0 : ((JCClassDecl) tNode.get()).typarams.size());\n\t\t\tif (!staticContext) staticContext = (((JCClassDecl) tNode.get()).getModifiers().flags & Flags.STATIC) != 0;\n\t\t\ttNode = tNode.up();\n\t\t}\n\t\tCollections.reverse(list);\n\t\tif (addWildcards) Collections.reverse(genericsCount);\n\t\t\n\t\tJavacTreeMaker maker = type.getTreeMaker();\n\t\t\n\t\tJCExpression chain = maker.Ident(type.toName(list.get(0)));\n\t\tif (addWildcards) chain = wildcardify(maker, chain, genericsCount.get(0));\n\t\t\n\t\tfor (int i = 1; i < list.size(); i++) {\n\t\t\tchain = maker.Select(chain, type.toName(list.get(i)));\n\t\t\tif (addWildcards) chain = wildcardify(maker, chain, genericsCount.get(i));\n\t\t}\n\t\t\n\t\treturn chain;\n\t}\n\t\n\tprivate JCExpression wildcardify(JavacTreeMaker maker, JCExpression expr, int count) {\n\t\tif (count == 0) return expr;\n\t\t\n\t\tListBuffer<JCExpression> wildcards = new ListBuffer<JCExpression>();\n\t\tfor (int i = 0 ; i < count ; i++) {\n\t\t\twildcards.append(maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null));\n\t\t}\n\t\t\n\t\treturn maker.TypeApply(expr, wildcards.toList());\n\t}\n\t\n\tpublic JCMethodDecl createEquals(JavacNode typeNode, java.util.List<Included<JavacNode, EqualsAndHashCode.Include>> members, boolean callSuper, FieldAccess fieldAccess, boolean needsCanEqual, JavacNode source, List<JCAnnotation> onParam) {\n\t\tJavacTreeMaker maker = typeNode.getTreeMaker();\n\t\t\n\t\tName oName = typeNode.toName(\"o\");\n\t\tName otherName = typeNode.toName(\"other\");\n\t\tName thisName = typeNode.toName(\"this\");\n\t\t\n\t\tList<JCAnnotation> annsOnParamOnMethod = List.nil();\n\t\t\n\t\tJCAnnotation overrideAnnotation = maker.Annotation(genJavaLangTypeRef(typeNode, \"Override\"), List.<JCExpression>nil());\n\t\tList<JCAnnotation> annsOnMethod = List.of(overrideAnnotation);\n\t\tCheckerFrameworkVersion checkerFramework = getCheckerFrameworkVersion(typeNode);\n\t\tif (checkerFramework.generateSideEffectFree()) {\n\t\t\tannsOnMethod = annsOnMethod.prepend(maker.Annotation(genTypeRef(typeNode, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil()));\n\t\t}\n\t\tJCModifiers mods = maker.Modifiers(Flags.PUBLIC, annsOnMethod);\n\t\tJCExpression objectType;\n\t\tif (annsOnParamOnMethod.isEmpty()) {\n\t\t\tobjectType = genJavaLangTypeRef(typeNode, \"Object\");\n\t\t} else {\n\t\t\tobjectType = chainDots(typeNode, \"java\", \"lang\", \"Object\");\n\t\t\tobjectType = maker.AnnotatedType(annsOnParamOnMethod, objectType);\n\t\t}\n\t\t\n\t\tJCExpression returnType = maker.TypeIdent(CTC_BOOLEAN);\n\t\t\n\t\tlong finalFlag = JavacHandlerUtil.addFinalIfNeeded(0L, typeNode.getContext());\n\t\t\n\t\tListBuffer<JCStatement> statements = new ListBuffer<JCStatement>();\n\t\tJCVariableDecl param = maker.VarDef(maker.Modifiers(finalFlag | Flags.PARAMETER, onParam), oName, objectType, null);\n\t\tJavacHandlerUtil.createRelevantNullableAnnotation(typeNode, param);\n\t\t\n\t\tfinal List<JCVariableDecl> params = List.of(param);\n\t\t\n\t\t/* if (o == this) return true; */ {\n\t\t\tstatements.append(maker.If(maker.Binary(CTC_EQUAL, maker.Ident(oName),\n\t\t\t\tmaker.Ident(thisName)), returnBool(maker, true), null));\n\t\t}\n\t\t\n\t\t/* if (!(o instanceof Outer.Inner.MyType)) return false; */ {\n\t\t\t \n\t\t\tJCUnary notInstanceOf = maker.Unary(CTC_NOT, maker.Parens(maker.TypeTest(maker.Ident(oName), createTypeReference(typeNode, false))));\n\t\t\tstatements.append(maker.If(notInstanceOf, returnBool(maker, false), null));\n\t\t}\n\t\t\n\t\t/* Outer.Inner.MyType<?> other = (Outer.Inner.MyType<?>) o; */ {\n\t\t\tif (!members.isEmpty() || needsCanEqual) {\n\t\t\t\tfinal JCExpression selfType1 = createTypeReference(typeNode, true), selfType2 = createTypeReference(typeNode, true);\n\t\t\t\t\n\t\t\t\tstatements.append(\n\t\t\t\t\tmaker.VarDef(maker.Modifiers(finalFlag), otherName, selfType1, maker.TypeCast(selfType2, maker.Ident(oName))));\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* if (!other.canEqual((java.lang.Object) this)) return false; */ {\n\t\t\tif (needsCanEqual) {\n\t\t\t\tList<JCExpression> exprNil = List.nil();\n\t\t\t\tJCExpression thisRef = maker.Ident(thisName);\n\t\t\t\tJCExpression castThisRef = maker.TypeCast(genJavaLangTypeRef(typeNode, \"Object\"), thisRef);\n\t\t\t\tJCExpression equalityCheck = maker.Apply(exprNil, \n\t\t\t\t\tmaker.Select(maker.Ident(otherName), typeNode.toName(\"canEqual\")),\n\t\t\t\t\tList.of(castThisRef));\n\t\t\t\tstatements.append(maker.If(maker.Unary(CTC_NOT, equalityCheck), returnBool(maker, false), null));\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* if (!super.equals(o)) return false; */\n\t\tif (callSuper) {\n\t\t\tJCMethodInvocation callToSuper = maker.Apply(List.<JCExpression>nil(),\n\t\t\t\tmaker.Select(maker.Ident(typeNode.toName(\"super\")), typeNode.toName(\"equals\")),\n\t\t\t\tList.<JCExpression>of(maker.Ident(oName)));\n\t\t\tJCUnary superNotEqual = maker.Unary(CTC_NOT, callToSuper);\n\t\t\tstatements.append(maker.If(superNotEqual, returnBool(maker, false), null));\n\t\t}\n\t\t\n\t\tfor (Included<JavacNode, EqualsAndHashCode.Include> member : members) {\n\t\t\tJavacNode memberNode = member.getNode();\n\t\t\tboolean isMethod = memberNode.getKind() == Kind.METHOD;\n\t\t\t\n\t\t\tJCExpression fType = removeTypeUseAnnotations(getFieldType(memberNode, fieldAccess));\n\t\t\tJCExpression thisFieldAccessor = isMethod ? createMethodAccessor(maker, memberNode) : createFieldAccessor(maker, memberNode, fieldAccess);\n\t\t\tJCExpression otherFieldAccessor = isMethod ? createMethodAccessor(maker, memberNode, maker.Ident(otherName)) : createFieldAccessor(maker, memberNode, fieldAccess, maker.Ident(otherName));\n\t\t\tif (fType instanceof JCPrimitiveTypeTree) {\n\t\t\t\tswitch (((JCPrimitiveTypeTree)fType).getPrimitiveTypeKind()) {\n\t\t\t\tcase FLOAT:\n\t\t\t\t\t/* if (Float.compare(this.fieldName, other.fieldName) != 0) return false; */\n\t\t\t\t\tstatements.append(generateCompareFloatOrDouble(thisFieldAccessor, otherFieldAccessor, maker, typeNode, false));\n\t\t\t\t\tbreak;\n\t\t\t\tcase DOUBLE:\n\t\t\t\t\t/* if (Double.compare(this.fieldName, other.fieldName) != 0) return false; */\n\t\t\t\t\tstatements.append(generateCompareFloatOrDouble(thisFieldAccessor, otherFieldAccessor, maker, typeNode, true));\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t/* if (this.fieldName != other.fieldName) return false; */\n\t\t\t\t\tstatements.append(\n\t\t\t\t\t\t\tmaker.If(maker.Binary(CTC_NOT_EQUAL, thisFieldAccessor, otherFieldAccessor), returnBool(maker, false), null));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else if (fType instanceof JCArrayTypeTree) {\n\t\t\t\tJCArrayTypeTree array = (JCArrayTypeTree) fType;\n\t\t\t\t/* if (!java.util.Arrays.deepEquals(this.fieldName, other.fieldName)) return false; //use equals for primitive arrays. */\n\t\t\t\tboolean multiDim = removeTypeUseAnnotations(array.elemtype) instanceof JCArrayTypeTree;\n\t\t\t\tboolean primitiveArray = removeTypeUseAnnotations(array.elemtype) instanceof JCPrimitiveTypeTree;\n\t\t\t\tboolean useDeepEquals = multiDim || !primitiveArray;\n\t\t\t\t\n\t\t\t\tJCExpression eqMethod = chainDots(typeNode, \"java\", \"util\", \"Arrays\", useDeepEquals ? \"deepEquals\" : \"equals\");\n\t\t\t\tList<JCExpression> args = List.of(thisFieldAccessor, otherFieldAccessor);\n\t\t\t\tstatements.append(maker.If(maker.Unary(CTC_NOT,\n\t\t\t\t\tmaker.Apply(List.<JCExpression>nil(), eqMethod, args)), returnBool(maker, false), null));\n\t\t\t} else /* objects */ {\n\t\t\t\t/* final java.lang.Object this$fieldName = this.fieldName; */\n\t\t\t\t/* final java.lang.Object other$fieldName = other.fieldName; */\n\t\t\t\t/* if (this$fieldName == null ? other$fieldName != null : !this$fieldName.equals(other$fieldName)) return false; */\n\t\t\t\tName thisDollarFieldName = memberNode.toName(\"this\" + (isMethod ? \"$$\" : \"$\") + memberNode.getName());\n\t\t\t\tName otherDollarFieldName = memberNode.toName(\"other\" + (isMethod ? \"$$\" : \"$\") + memberNode.getName());\n\t\t\t\t\n\t\t\t\tstatements.append(maker.VarDef(maker.Modifiers(finalFlag), thisDollarFieldName, genJavaLangTypeRef(typeNode, \"Object\"), thisFieldAccessor));\n\t\t\t\tstatements.append(maker.VarDef(maker.Modifiers(finalFlag), otherDollarFieldName, genJavaLangTypeRef(typeNode, \"Object\"), otherFieldAccessor));\n\n\t\t\t\tJCExpression thisEqualsNull = maker.Binary(CTC_EQUAL, maker.Ident(thisDollarFieldName), maker.Literal(CTC_BOT, null));\n\t\t\t\tJCExpression otherNotEqualsNull = maker.Binary(CTC_NOT_EQUAL, maker.Ident(otherDollarFieldName), maker.Literal(CTC_BOT, null));\n\t\t\t\tJCExpression thisEqualsThat = maker.Apply(List.<JCExpression>nil(),\n\t\t\t\t\tmaker.Select(maker.Ident(thisDollarFieldName), typeNode.toName(\"equals\")),\n\t\t\t\t\tList.<JCExpression>of(maker.Ident(otherDollarFieldName)));\n\t\t\t\tJCExpression fieldsAreNotEqual = maker.Conditional(thisEqualsNull, otherNotEqualsNull, maker.Unary(CTC_NOT, thisEqualsThat));\n\t\t\t\tstatements.append(maker.If(fieldsAreNotEqual, returnBool(maker, false), null));\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* return true; */ {\n\t\t\tstatements.append(returnBool(maker, true));\n\t\t}\n\t\t\n\t\tJCBlock body = maker.Block(0, statements.toList());\n\t\treturn recursiveSetGeneratedBy(maker.MethodDef(mods, typeNode.toName(\"equals\"), returnType, List.<JCTypeParameter>nil(), params, List.<JCExpression>nil(), body, null), source);\n\t}\n\n\tpublic JCMethodDecl createCanEqual(JavacNode typeNode, JavacNode source, List<JCAnnotation> onParam) {\n\t\t/* protected boolean canEqual(final java.lang.Object other) {\n\t\t *     return other instanceof Outer.Inner.MyType;\n\t\t * }\n\t\t */\n\t\tJavacTreeMaker maker = typeNode.getTreeMaker();\n\t\t\n\t\tList<JCAnnotation> annsOnMethod = List.nil();\n\t\tCheckerFrameworkVersion checkerFramework = getCheckerFrameworkVersion(typeNode);\n\t\tif (checkerFramework.generatePure()) {\n\t\t\tannsOnMethod = annsOnMethod.prepend(maker.Annotation(genTypeRef(typeNode, CheckerFrameworkVersion.NAME__PURE), List.<JCExpression>nil()));\n\t\t}\n\t\tJCModifiers mods = maker.Modifiers(Flags.PROTECTED, annsOnMethod);\n\t\tJCExpression returnType = maker.TypeIdent(CTC_BOOLEAN);\n\t\tName canEqualName = typeNode.toName(\"canEqual\");\n\t\tJCExpression objectType = genJavaLangTypeRef(typeNode, \"Object\");\n\t\tName otherName = typeNode.toName(\"other\");\n\t\tlong flags = JavacHandlerUtil.addFinalIfNeeded(Flags.PARAMETER, typeNode.getContext());\n\t\tJCVariableDecl param = maker.VarDef(maker.Modifiers(flags, onParam), otherName, objectType, null);\n\t\tcreateRelevantNullableAnnotation(typeNode, param);\n\t\tList<JCVariableDecl> params = List.of(param);\n\t\t\n\t\tJCBlock body = maker.Block(0, List.<JCStatement>of(\n\t\t\tmaker.Return(maker.TypeTest(maker.Ident(otherName), createTypeReference(typeNode, false)))));\n\t\t\n\t\treturn recursiveSetGeneratedBy(maker.MethodDef(mods, canEqualName, returnType, List.<JCTypeParameter>nil(), params, List.<JCExpression>nil(), body, null), source);\n\t}\n\t\n\tpublic JCStatement generateCompareFloatOrDouble(JCExpression thisDotField, JCExpression otherDotField,\n\t\tJavacTreeMaker maker, JavacNode node, boolean isDouble) {\n\t\t\n\t\t/* if (Float.compare(fieldName, other.fieldName) != 0) return false; */\n\t\tJCExpression clazz = genJavaLangTypeRef(node, isDouble ? \"Double\" : \"Float\");\n\t\tList<JCExpression> args = List.of(thisDotField, otherDotField);\n\t\tJCBinary compareCallEquals0 = maker.Binary(CTC_NOT_EQUAL, maker.Apply(\n\t\t\tList.<JCExpression>nil(), maker.Select(clazz, node.toName(\"compare\")), args), maker.Literal(0));\n\t\treturn maker.If(compareCallEquals0, returnBool(maker, false), null);\n\t}\n\t\n\tpublic JCStatement returnBool(JavacTreeMaker maker, boolean bool) {\n\t\treturn maker.Return(maker.Literal(CTC_BOOLEAN, bool ? 1 : 0));\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleExtensionMethod.java",
    "content": "/*\n * Copyright (C) 2012-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static com.sun.tools.javac.code.Flags.*;\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\nimport static lombok.javac.handlers.JavacResolver.*;\n\nimport java.util.ArrayList;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\n\nimport javax.lang.model.element.ElementKind;\n\nimport lombok.ConfigurationKeys;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.experimental.ExtensionMethod;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacResolution;\nimport lombok.spi.Provides;\n\nimport com.sun.source.tree.MethodInvocationTree;\nimport com.sun.source.util.TreeScanner;\nimport com.sun.tools.javac.code.Symbol;\nimport com.sun.tools.javac.code.Symbol.ClassSymbol;\nimport com.sun.tools.javac.code.Symbol.MethodSymbol;\nimport com.sun.tools.javac.code.Symbol.TypeSymbol;\nimport com.sun.tools.javac.code.Type;\nimport com.sun.tools.javac.code.Type.ClassType;\nimport com.sun.tools.javac.code.Type.ErrorType;\nimport com.sun.tools.javac.code.Type.ForAll;\nimport com.sun.tools.javac.code.Type.MethodType;\nimport com.sun.tools.javac.code.Types;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCFieldAccess;\nimport com.sun.tools.javac.tree.JCTree.JCIdent;\nimport com.sun.tools.javac.tree.JCTree.JCMethodInvocation;\n\n/**\n * Handles the {@link ExtensionMethod} annotation for javac.\n */\n@Provides\n@HandlerPriority(66560) // 2^16 + 2^10; we must run AFTER HandleVal which is at 2^16\npublic class HandleExtensionMethod extends JavacAnnotationHandler<ExtensionMethod> {\n\t@Override\n\tpublic void handle(final AnnotationValues<ExtensionMethod> annotation, final JCAnnotation source, final JavacNode annotationNode) {\n\t\thandleExperimentalFlagUsage(annotationNode, ConfigurationKeys.EXTENSION_METHOD_FLAG_USAGE, \"@ExtensionMethod\");\n\t\t\n\t\tdeleteAnnotationIfNeccessary(annotationNode, ExtensionMethod.class);\n\t\tJavacNode typeNode = annotationNode.up();\n\t\tboolean isClassEnumInterfaceOrRecord = isClassEnumInterfaceOrRecord(typeNode);\n\t\t\n\t\tif (!isClassEnumInterfaceOrRecord) {\n\t\t\tannotationNode.addError(\"@ExtensionMethod can only be used on a class, an enum, an interface or a record\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tboolean suppressBaseMethods = annotation.getInstance().suppressBaseMethods();\n\t\t\n\t\tList<Object> extensionProviders = annotation.getActualExpressions(\"value\");\n\t\tif (extensionProviders.isEmpty()) {\n\t\t\tannotationNode.addError(String.format(\"@%s has no effect since no extension types were specified.\", ExtensionMethod.class.getName()));\n\t\t\treturn;\n\t\t}\n\t\tfinal List<Extension> extensions = getExtensions(annotationNode, extensionProviders);\n\t\tif (extensions.isEmpty()) return;\n\t\t\n\t\tnew ExtensionMethodReplaceVisitor(annotationNode, extensions, suppressBaseMethods).replace();\n\t\t\n\t\tannotationNode.rebuild();\n\t}\n\t\n\t\n\tpublic List<Extension> getExtensions(final JavacNode typeNode, final List<Object> extensionProviders) {\n\t\tList<Extension> extensions = new ArrayList<Extension>();\n\t\tfor (Object extensionProvider : extensionProviders) {\n\t\t\tif (!(extensionProvider instanceof JCFieldAccess)) continue;\n\t\t\tJCFieldAccess provider = (JCFieldAccess) extensionProvider;\n\t\t\tif (!(\"class\".equals(provider.name.toString()))) continue;\n\t\t\tType providerType = CLASS.resolveMember(typeNode, provider.selected);\n\t\t\tif (providerType == null) continue;\n\t\t\tif ((providerType.tsym.flags() & (INTERFACE | ANNOTATION)) != 0) continue;\n\t\t\t\n\t\t\textensions.add(getExtension(typeNode, (ClassType) providerType));\n\t\t}\n\t\treturn extensions;\n\t}\n\t\n\tpublic Extension getExtension(final JavacNode typeNode, final ClassType extensionMethodProviderType) {\n\t\tList<MethodSymbol> extensionMethods = new ArrayList<MethodSymbol>();\n\t\tTypeSymbol tsym = extensionMethodProviderType.asElement();\n\t\tif (tsym != null) for (Symbol member : tsym.getEnclosedElements()) {\n\t\t\tif (member.getKind() != ElementKind.METHOD) continue;\n\t\t\tMethodSymbol method = (MethodSymbol) member;\n\t\t\tif ((method.flags() & STATIC) == 0) continue;\n\t\t\tif ((method.flags() & PUBLIC) == 0) continue;\n\t\t\tif (method.params().isEmpty()) continue;\n\t\t\textensionMethods.add(method);\n\t\t}\n\t\treturn new Extension(extensionMethods, tsym);\n\t}\n\t\n\tprivate static class Extension {\n\t\tfinal List<MethodSymbol> extensionMethods;\n\t\tfinal TypeSymbol extensionProvider;\n\t\t\n\t\tpublic Extension(List<MethodSymbol> extensionMethods, TypeSymbol extensionProvider) {\n\t\t\tthis.extensionMethods = extensionMethods;\n\t\t\tthis.extensionProvider = extensionProvider;\n\t\t}\n\t}\n\t\n\tprivate static class ExtensionMethodReplaceVisitor extends TreeScanner<Void, Void> {\n\t\tfinal JavacNode annotationNode;\n\t\tfinal List<Extension> extensions;\n\t\tfinal boolean suppressBaseMethods;\n\t\tfinal Set<String> names = new HashSet<String>();\n\t\t\n\t\tpublic ExtensionMethodReplaceVisitor(JavacNode annotationNode, List<Extension> extensions, boolean suppressBaseMethods) {\n\t\t\tthis.annotationNode = annotationNode;\n\t\t\tthis.extensions = extensions;\n\t\t\tthis.suppressBaseMethods = suppressBaseMethods;\n\t\t\t\n\t\t\tfor (Extension extension : extensions) {\n\t\t\t\tfor (MethodSymbol methodSymbol : extension.extensionMethods) {\n\t\t\t\t\tnames.add(methodSymbol.name.toString());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic void replace() {\n\t\t\tannotationNode.up().get().accept(this, null);\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic Void visitMethodInvocation(final MethodInvocationTree tree, final Void p) {\n\t\t\tscan(tree.getTypeArguments(), p);\n\t\t\tscan(tree.getMethodSelect(), p);\n\t\t\thandleMethodCall((JCMethodInvocation) tree);\n\t\t\tscan(tree.getArguments(), p);\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\tprivate void handleMethodCall(final JCMethodInvocation methodCall) {\n\t\t\tJavacNode methodCallNode = annotationNode.getAst().get(methodCall);\n\t\t\t\n\t\t\tif (methodCallNode == null) {\n\t\t\t\t// This should mean the node does not exist in the source at all. This is the case for generated nodes, such as implicit super() calls.\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tJavacNode surroundingType = upToTypeNode(methodCallNode);\n\t\t\t\n\t\t\tTypeSymbol surroundingTypeSymbol = ((JCClassDecl)surroundingType.get()).sym;\n\t\t\tJCExpression receiver = receiverOf(methodCall);\n\t\t\tString methodName = methodNameOf(methodCall);\n\t\t\t\n\t\t\tif (!names.contains(methodName)) return;\n\t\t\tif (\"this\".equals(receiver.toString()) || \"this\".equals(methodName) || \"super\".equals(methodName)) return;\n\t\t\tMap<JCTree, JCTree> resolution = new JavacResolution(methodCallNode.getContext()).resolveMethodMember(methodCallNode);\n\t\t\t\n\t\t\tJCTree resolvedMethodCall = resolution.get(methodCall);\n\t\t\tif (resolvedMethodCall == null || resolvedMethodCall.type == null) return;\n\t\t\tif (!suppressBaseMethods && !(resolvedMethodCall.type instanceof ErrorType)) return;\n\t\t\t\n\t\t\tJCTree resolvedReceiver = resolution.get(receiver);\n\t\t\tif (resolvedReceiver == null || resolvedReceiver.type == null) return;\n\t\t\tType receiverType = resolvedReceiver.type;\n\t\t\tif (receiverType.isErroneous()) return;\n\t\t\t\n\t\t\t// Skip static method access\n\t\t\tSymbol sym = null;\n\t\t\tif (resolvedReceiver instanceof JCIdent) {\n\t\t\t\tsym = ((JCIdent) resolvedReceiver).sym;\n\t\t\t} else if (resolvedReceiver instanceof JCFieldAccess) {\n\t\t\t\tsym = ((JCFieldAccess) resolvedReceiver).sym;\n\t\t\t}\n\t\t\tif (sym instanceof ClassSymbol) return;\n\t\t\t\n\t\t\tTypes types = Types.instance(annotationNode.getContext());\n\t\t\tfor (Extension extension : extensions) {\n\t\t\t\tTypeSymbol extensionProvider = extension.extensionProvider;\n\t\t\t\tif (surroundingTypeSymbol == extensionProvider) continue;\n\t\t\t\tfor (MethodSymbol extensionMethod : extension.extensionMethods) {\n\t\t\t\t\tif (!methodName.equals(extensionMethod.name.toString())) continue;\n\t\t\t\t\tType extensionMethodType = extensionMethod.type;\n\t\t\t\t\tif (!MethodType.class.isInstance(extensionMethodType) && !ForAll.class.isInstance(extensionMethodType)) continue;\n\t\t\t\t\tType firstArgType = types.erasure(extensionMethodType.asMethodType().argtypes.get(0));\n\t\t\t\t\tif (!types.isAssignable(receiverType, firstArgType)) continue;\n\t\t\t\t\tmethodCall.args = methodCall.args.prepend(receiver);\n\t\t\t\t\tmethodCall.meth = chainDotsString(annotationNode, extensionProvider.toString() + \".\" + methodName);\n\t\t\t\t\trecursiveSetGeneratedBy(methodCall.meth, methodCallNode);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tprivate String methodNameOf(final JCMethodInvocation methodCall) {\n\t\t\tif (methodCall.meth instanceof JCIdent) {\n\t\t\t\treturn ((JCIdent) methodCall.meth).name.toString();\n\t\t\t} else {\n\t\t\t\treturn ((JCFieldAccess) methodCall.meth).name.toString();\n\t\t\t}\n\t\t}\n\t\t\n\t\tprivate JCExpression receiverOf(final JCMethodInvocation methodCall) {\n\t\t\tif (methodCall.meth instanceof JCIdent) {\n\t\t\t\treturn annotationNode.getTreeMaker().Ident(annotationNode.toName(\"this\"));\n\t\t\t} else {\n\t\t\t\treturn ((JCFieldAccess) methodCall.meth).selected;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleFieldDefaults.java",
    "content": "/*\n * Copyright (C) 2012-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\nimport lombok.AccessLevel;\nimport lombok.ConfigurationKeys;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.experimental.FieldDefaults;\nimport lombok.experimental.NonFinal;\nimport lombok.experimental.PackagePrivate;\nimport lombok.javac.JavacASTAdapter;\nimport lombok.javac.JavacASTVisitor;\nimport lombok.javac.JavacNode;\nimport lombok.spi.Provides;\n\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\n\n/**\n * Handles the {@code lombok.FieldDefaults} annotation for javac.\n */\n@Provides(JavacASTVisitor.class)\n@HandlerPriority(-2048) //-2^11; to ensure @Value picks up on messing with the fields' 'final' state, run earlier.\npublic class HandleFieldDefaults extends JavacASTAdapter {\n\tpublic boolean generateFieldDefaultsForType(JavacNode typeNode, JavacNode errorNode, AccessLevel level, boolean makeFinal, boolean checkForTypeLevelFieldDefaults) {\n\t\tif (checkForTypeLevelFieldDefaults) {\n\t\t\tif (hasAnnotation(FieldDefaults.class, typeNode)) {\n\t\t\t\t//The annotation will make it happen, so we can skip it.\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (!isClassOrEnum(typeNode)) {\n\t\t\terrorNode.addError(\"@FieldDefaults is only supported on a class or an enum.\");\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tfor (JavacNode field : typeNode.down()) {\n\t\t\tif (field.getKind() != Kind.FIELD) continue;\n\t\t\tJCVariableDecl fieldDecl = (JCVariableDecl) field.get();\n\t\t\t//Skip fields that start with $\n\t\t\tif (fieldDecl.name.toString().startsWith(\"$\")) continue;\n\t\t\t\n\t\t\tsetFieldDefaultsForField(field, level, makeFinal);\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\tpublic void setFieldDefaultsForField(JavacNode fieldNode, AccessLevel level, boolean makeFinal) {\n\t\tJCVariableDecl field = (JCVariableDecl) fieldNode.get();\n\t\tif (level != null && level != AccessLevel.NONE) {\n\t\t\tif ((field.mods.flags & (Flags.PUBLIC | Flags.PRIVATE | Flags.PROTECTED)) == 0) {\n\t\t\t\tif (!hasAnnotationAndDeleteIfNeccessary(PackagePrivate.class, fieldNode)) {\n\t\t\t\t\tif ((field.mods.flags & Flags.STATIC) == 0) {\n\t\t\t\t\t\tfield.mods.flags |= toJavacModifier(level);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (makeFinal && (field.mods.flags & Flags.FINAL) == 0) {\n\t\t\tif (!hasAnnotationAndDeleteIfNeccessary(NonFinal.class, fieldNode)) {\n\t\t\t\tif ((field.mods.flags & Flags.STATIC) == 0) {\n\t\t\t\t\tfield.mods.flags |= Flags.FINAL;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tfieldNode.rebuild();\n\t}\n\t\n\t@Override public void visitType(JavacNode typeNode, JCClassDecl type) {\n\t\tAnnotationValues<FieldDefaults> fieldDefaults = null;\n\t\tJavacNode source = typeNode;\n\t\t\n\t\tboolean levelIsExplicit = false;\n\t\tboolean makeFinalIsExplicit = false;\n\t\tFieldDefaults fd = null;\n\t\tfor (JavacNode jn : typeNode.down()) {\n\t\t\tif (jn.getKind() != Kind.ANNOTATION) continue;\n\t\t\tJCAnnotation ann = (JCAnnotation) jn.get();\n\t\t\tJCTree typeTree = ann.annotationType;\n\t\t\tif (typeTree == null) continue;\n\t\t\tString typeTreeToString = typeTree.toString();\n\t\t\tif (!typeTreeToString.equals(\"FieldDefaults\") && !typeTreeToString.equals(\"lombok.experimental.FieldDefaults\")) continue;\n\t\t\tif (!typeMatches(FieldDefaults.class, jn, typeTree)) continue;\n\t\t\t\n\t\t\tsource = jn;\n\t\t\tfieldDefaults = createAnnotation(FieldDefaults.class, jn);\n\t\t\tlevelIsExplicit = fieldDefaults.isExplicit(\"level\");\n\t\t\tmakeFinalIsExplicit = fieldDefaults.isExplicit(\"makeFinal\");\n\t\t\t\n\t\t\thandleExperimentalFlagUsage(jn, ConfigurationKeys.FIELD_DEFAULTS_FLAG_USAGE, \"@FieldDefaults\");\n\t\t\t\n\t\t\tfd = fieldDefaults.getInstance();\n\t\t\tif (!levelIsExplicit && !makeFinalIsExplicit) {\n\t\t\t\tjn.addError(\"This does nothing; provide either level or makeFinal or both.\");\n\t\t\t}\n\t\t\t\n\t\t\tif (levelIsExplicit && fd.level() == AccessLevel.NONE) {\n\t\t\t\tjn.addError(\"AccessLevel.NONE doesn't mean anything here. Pick another value.\");\n\t\t\t\tlevelIsExplicit = false;\n\t\t\t}\n\t\t\t\n\t\t\tdeleteAnnotationIfNeccessary(jn, FieldDefaults.class);\n\t\t\tdeleteImportFromCompilationUnit(jn, \"lombok.AccessLevel\");\n\t\t\tbreak;\n\t\t}\n\t\t\n\t\tif (fd == null && (type.mods.flags & (Flags.INTERFACE | Flags.ANNOTATION)) != 0) return;\n\t\t\n\t\tboolean defaultToPrivate = levelIsExplicit ? false : Boolean.TRUE.equals(typeNode.getAst().readConfiguration(ConfigurationKeys.FIELD_DEFAULTS_PRIVATE_EVERYWHERE));\n\t\tboolean defaultToFinal = makeFinalIsExplicit ? false : Boolean.TRUE.equals(typeNode.getAst().readConfiguration(ConfigurationKeys.FIELD_DEFAULTS_FINAL_EVERYWHERE));\n\t\t\n\t\tif (!defaultToPrivate && !defaultToFinal && fieldDefaults == null) return;\n\t\t// Do not apply field defaults to records if set using the config system\n\t\tif (fieldDefaults == null && !isClassOrEnum(typeNode)) return;\n\t\tAccessLevel fdAccessLevel = (fieldDefaults != null && levelIsExplicit) ? fd.level() : defaultToPrivate ? AccessLevel.PRIVATE : null;\n\t\tboolean fdToFinal = (fieldDefaults != null && makeFinalIsExplicit) ? fd.makeFinal() : defaultToFinal;\n\t\t\n\t\tgenerateFieldDefaultsForType(typeNode, source, fdAccessLevel, fdToFinal, false);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleFieldNameConstants.java",
    "content": "/*\n * Copyright (C) 2014-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.handleExperimentalFlagUsage;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport java.util.ArrayList;\n\nimport lombok.AccessLevel;\nimport lombok.ConfigurationKeys;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.core.configuration.IdentifierName;\nimport lombok.core.handlers.HandlerUtil;\nimport lombok.experimental.FieldNameConstants;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacTreeMaker;\nimport lombok.spi.Provides;\n\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCBlock;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCModifiers;\nimport com.sun.tools.javac.tree.JCTree.JCStatement;\nimport com.sun.tools.javac.tree.JCTree.JCTypeParameter;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.Name;\n\n@Provides\npublic class HandleFieldNameConstants extends JavacAnnotationHandler<FieldNameConstants> {\n\tprivate static final IdentifierName FIELDS = IdentifierName.valueOf(\"Fields\");\n\n\tpublic void generateFieldNameConstantsForType(JavacNode typeNode, JavacNode errorNode, AccessLevel level, boolean asEnum, IdentifierName innerTypeName, boolean onlyExplicit, boolean uppercase) {\n\t\tif (!isClassEnumOrRecord(typeNode)) {\n\t\t\terrorNode.addError(\"@FieldNameConstants is only supported on a class, an enum or a record.\");\n\t\t\treturn;\n\t\t}\n\t\tif (!isStaticAllowed(typeNode)) {\n\t\t\terrorNode.addError(\"@FieldNameConstants is not supported on non-static nested classes.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tjava.util.List<JavacNode> qualified = new ArrayList<JavacNode>();\n\t\t\n\t\tfor (JavacNode field : typeNode.down()) {\n\t\t\tif (fieldQualifiesForFieldNameConstantsGeneration(field, onlyExplicit)) qualified.add(field);\n\t\t}\n\t\t\n\t\tif (qualified.isEmpty()) {\n\t\t\terrorNode.addWarning(\"No fields qualify for @FieldNameConstants, therefore this annotation does nothing\");\n\t\t} else {\n\t\t\tcreateInnerTypeFieldNameConstants(typeNode, errorNode, level, qualified, asEnum, innerTypeName, uppercase);\n\t\t}\n\t}\n\t\n\tprivate boolean fieldQualifiesForFieldNameConstantsGeneration(JavacNode field, boolean onlyExplicit) {\n\t\tif (field.getKind() != Kind.FIELD) return false;\n\t\tboolean exclAnn = JavacHandlerUtil.hasAnnotationAndDeleteIfNeccessary(FieldNameConstants.Exclude.class, field);\n\t\tboolean inclAnn = JavacHandlerUtil.hasAnnotationAndDeleteIfNeccessary(FieldNameConstants.Include.class, field);\n\t\tif (exclAnn) return false;\n\t\tif (inclAnn) return true;\n\t\tif (onlyExplicit) return false;\n\t\t\n\t\tJCVariableDecl fieldDecl = (JCVariableDecl) field.get();\n\t\tif (fieldDecl.name.toString().startsWith(\"$\")) return false;\n\t\tif ((fieldDecl.mods.flags & Flags.STATIC) != 0) return false;\n\t\treturn true;\n\t}\n\t\n\tpublic void handle(AnnotationValues<FieldNameConstants> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\thandleExperimentalFlagUsage(annotationNode, ConfigurationKeys.FIELD_NAME_CONSTANTS_FLAG_USAGE, \"@FieldNameConstants\");\n\t\t\n\t\tdeleteAnnotationIfNeccessary(annotationNode, FieldNameConstants.class);\n\t\tdeleteImportFromCompilationUnit(annotationNode, \"lombok.AccessLevel\");\n\t\tJavacNode node = annotationNode.up();\n\t\tFieldNameConstants annotationInstance = annotation.getInstance();\n\t\tAccessLevel level = annotationInstance.level();\n\t\tboolean asEnum = annotationInstance.asEnum();\n\t\tboolean usingLombokv1_18_2 = annotation.isExplicit(\"prefix\") || annotation.isExplicit(\"suffix\") || node.getKind() == Kind.FIELD;\n\t\t\n\t\tif (usingLombokv1_18_2) {\n\t\t\tannotationNode.addError(\"@FieldNameConstants has been redesigned in lombok v1.18.4; please upgrade your project dependency on lombok. See https://projectlombok.org/features/experimental/FieldNameConstants for more information.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t\n\t\tif (level == AccessLevel.NONE) {\n\t\t\tannotationNode.addWarning(\"AccessLevel.NONE is not compatible with @FieldNameConstants. If you don't want the inner type, simply remove @FieldNameConstants.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tIdentifierName innerTypeName;\n\t\ttry {\n\t\t\tinnerTypeName = IdentifierName.valueOf(annotationInstance.innerTypeName());\n\t\t} catch(IllegalArgumentException e) {\n\t\t\tannotationNode.addError(\"InnerTypeName \" + annotationInstance.innerTypeName() + \" is not a valid Java identifier.\");\n\t\t\treturn;\n\t\t}\n\t\tif (innerTypeName == null) innerTypeName = annotationNode.getAst().readConfiguration(ConfigurationKeys.FIELD_NAME_CONSTANTS_INNER_TYPE_NAME);\n\t\tif (innerTypeName == null) innerTypeName = FIELDS;\n\t\tBoolean uppercase = annotationNode.getAst().readConfiguration(ConfigurationKeys.FIELD_NAME_CONSTANTS_UPPERCASE);\n\t\tif (uppercase == null) uppercase = false;\n\t\t\n\t\tgenerateFieldNameConstantsForType(node, annotationNode, level, asEnum, innerTypeName, annotationInstance.onlyExplicitlyIncluded(), uppercase);\n\t}\n\t\n\tprivate void createInnerTypeFieldNameConstants(JavacNode typeNode, JavacNode errorNode, AccessLevel level, java.util.List<JavacNode> fields, boolean asEnum, IdentifierName innerTypeName, boolean uppercase) {\n\t\tif (fields.isEmpty()) return;\n\t\t\n\t\tJavacTreeMaker maker = typeNode.getTreeMaker();\n\t\tJCModifiers mods = maker.Modifiers(toJavacModifier(level) | (asEnum ? Flags.ENUM : Flags.STATIC | Flags.FINAL));\n\t\t\n\t\tName fieldsName = typeNode.toName(innerTypeName.getName());\n\t\t\n\t\tJavacNode fieldsType = findInnerClass(typeNode, innerTypeName.getName());\n\t\tboolean genConstr = false;\n\t\tif (fieldsType == null) {\n\t\t\tJCClassDecl innerType = maker.ClassDef(mods, fieldsName, List.<JCTypeParameter>nil(), null, List.<JCExpression>nil(), List.<JCTree>nil());\n\t\t\tfieldsType = injectType(typeNode, innerType);\n\t\t\trecursiveSetGeneratedBy(innerType, errorNode);\n\t\t\tgenConstr = true;\n\t\t} else {\n\t\t\tJCClassDecl builderTypeDeclaration = (JCClassDecl) fieldsType.get();\n\t\t\tlong f = builderTypeDeclaration.getModifiers().flags;\n\t\t\tif (asEnum && (f & Flags.ENUM) == 0) {\n\t\t\t\terrorNode.addError(\"Existing \" + innerTypeName + \" must be declared as an 'enum'.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!asEnum && (f & Flags.STATIC) == 0) {\n\t\t\t\terrorNode.addError(\"Existing \" + innerTypeName + \" must be declared as a 'static class'.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tgenConstr = constructorExists(fieldsType) == MemberExistsResult.NOT_EXISTS;\n\t\t}\n\t\t\n\t\tif (genConstr) {\n\t\t\tJCModifiers genConstrMods = maker.Modifiers(Flags.GENERATEDCONSTR | (asEnum ? 0L : Flags.PRIVATE));\n\t\t\tJCBlock genConstrBody = maker.Block(0L, List.<JCStatement>of(maker.Exec(maker.Apply(List.<JCExpression>nil(), maker.Ident(typeNode.toName(\"super\")), List.<JCExpression>nil()))));\n\t\t\tJCMethodDecl c = maker.MethodDef(genConstrMods, typeNode.toName(\"<init>\"), null, List.<JCTypeParameter>nil(), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), genConstrBody, null);\n\t\t\trecursiveSetGeneratedBy(c, errorNode);\n\t\t\tinjectMethod(fieldsType, c);\n\t\t}\n\t\t\n\t\tjava.util.List<JCVariableDecl> generated = new ArrayList<JCVariableDecl>();\n\t\tfor (JavacNode field : fields) {\n\t\t\tName fName = ((JCVariableDecl) field.get()).name;\n\t\t\tif (uppercase) fName = typeNode.toName(HandlerUtil.camelCaseToConstant(fName.toString()));\n\t\t\tif (fieldExists(fName.toString(), fieldsType) != MemberExistsResult.NOT_EXISTS) continue;\n\t\t\tJCModifiers constantValueMods = maker.Modifiers(Flags.PUBLIC | Flags.STATIC | Flags.FINAL | (asEnum ? Flags.ENUM : 0L));\n\t\t\tJCExpression returnType;\n\t\t\tJCExpression init;\n\t\t\tif (asEnum) {\n\t\t\t\treturnType = maker.Ident(fieldsName);\n\t\t\t\tinit = maker.NewClass(null, List.<JCExpression>nil(), maker.Ident(fieldsName), List.<JCExpression>nil(), null);\n\t\t\t} else {\n\t\t\t\treturnType = chainDots(field, \"java\", \"lang\", \"String\");\n\t\t\t\tinit = maker.Literal(field.getName());\n\t\t\t}\n\t\t\tJCVariableDecl constantField = maker.VarDef(constantValueMods, fName, returnType, init);\n\t\t\tinjectField(fieldsType, constantField, false, true);\n\t\t\tsetGeneratedBy(constantField, errorNode);\n\t\t\tgenerated.add(constantField);\n\t\t}\n\t\tfor (JCVariableDecl cf : generated) recursiveSetGeneratedBy(cf, errorNode);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleGetter.java",
    "content": "/*\n * Copyright (C) 2009-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.javac.Javac.*;\nimport static lombok.javac.JavacAugments.JCTree_keepPosition;\nimport static lombok.javac.JavacTreeMaker.TypeTag.*;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport lombok.AccessLevel;\nimport lombok.ConfigurationKeys;\nimport lombok.experimental.Accessors;\nimport lombok.experimental.Delegate;\nimport lombok.Getter;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.core.configuration.CheckerFrameworkVersion;\nimport lombok.delombok.LombokOptionsFactory;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacTreeMaker;\nimport lombok.javac.JavacTreeMaker.TypeTag;\nimport lombok.spi.Provides;\n\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCBinary;\nimport com.sun.tools.javac.tree.JCTree.JCBlock;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCExpressionStatement;\nimport com.sun.tools.javac.tree.JCTree.JCIf;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCMethodInvocation;\nimport com.sun.tools.javac.tree.JCTree.JCPrimitiveTypeTree;\nimport com.sun.tools.javac.tree.JCTree.JCStatement;\nimport com.sun.tools.javac.tree.JCTree.JCSynchronized;\nimport com.sun.tools.javac.tree.JCTree.JCTypeParameter;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.ListBuffer;\nimport com.sun.tools.javac.util.Name;\n\n/**\n * Handles the {@code lombok.Getter} annotation for javac.\n */\n@Provides\npublic class HandleGetter extends JavacAnnotationHandler<Getter> {\n\tprivate static final String GETTER_NODE_NOT_SUPPORTED_ERR = \"@Getter is only supported on a class, an enum, or a field.\";\n\t\n\tpublic void generateGetterForType(JavacNode typeNode, JavacNode errorNode, AccessLevel level, boolean checkForTypeLevelGetter, List<JCAnnotation> onMethod) {\n\t\tif (checkForTypeLevelGetter) {\n\t\t\tif (hasAnnotation(Getter.class, typeNode)) {\n\t\t\t\t//The annotation will make it happen, so we can skip it.\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (!isClassOrEnum(typeNode)) {\n\t\t\terrorNode.addError(GETTER_NODE_NOT_SUPPORTED_ERR);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tfor (JavacNode field : typeNode.down()) {\n\t\t\tif (fieldQualifiesForGetterGeneration(field)) generateGetterForField(field, errorNode.get(), level, false, onMethod);\n\t\t}\n\t}\n\t\n\tpublic static boolean fieldQualifiesForGetterGeneration(JavacNode field) {\n\t\tif (field.getKind() != Kind.FIELD) return false;\n\t\tJCVariableDecl fieldDecl = (JCVariableDecl) field.get();\n\t\t//Skip fields that start with $\n\t\tif (fieldDecl.name.toString().startsWith(\"$\")) return false;\n\t\t//Skip static fields.\n\t\tif ((fieldDecl.mods.flags & Flags.STATIC) != 0) return false;\n\t\treturn true;\n\t}\n\t\n\t/**\n\t * Generates a getter on the stated field.\n\t * \n\t * Used by {@link HandleData}.\n\t * \n\t * The difference between this call and the handle method is as follows:\n\t * \n\t * If there is a {@code lombok.Getter} annotation on the field, it is used and the\n\t * same rules apply (e.g. warning if the method already exists, stated access level applies).\n\t * If not, the getter is still generated if it isn't already there, though there will not\n\t * be a warning if its already there. The default access level is used.\n\t * \n\t * @param fieldNode The node representing the field you want a getter for.\n\t * @param pos The node responsible for generating the getter (the {@code @Data} or {@code @Getter} annotation).\n\t */\n\tpublic void generateGetterForField(JavacNode fieldNode, DiagnosticPosition pos, AccessLevel level, boolean lazy, List<JCAnnotation> onMethod) {\n\t\tif (hasAnnotation(Getter.class, fieldNode)) {\n\t\t\t//The annotation will make it happen, so we can skip it.\n\t\t\treturn;\n\t\t}\n\t\tcreateGetterForField(level, fieldNode, fieldNode, false, lazy, onMethod);\n\t}\n\t\n\t@Override public void handle(AnnotationValues<Getter> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.GETTER_FLAG_USAGE, \"@Getter\");\n\t\t\n\t\tCollection<JavacNode> fields = annotationNode.upFromAnnotationToFields();\n\t\tdeleteAnnotationIfNeccessary(annotationNode, Getter.class);\n\t\tdeleteImportFromCompilationUnit(annotationNode, \"lombok.AccessLevel\");\n\t\tJavacNode node = annotationNode.up();\n\t\tGetter annotationInstance = annotation.getInstance();\n\t\tAccessLevel level = annotationInstance.value();\n\t\tboolean lazy = annotationInstance.lazy();\n\t\tif (lazy) handleFlagUsage(annotationNode, ConfigurationKeys.GETTER_LAZY_FLAG_USAGE, \"@Getter(lazy=true)\");\n\t\t\n\t\tif (level == AccessLevel.NONE) {\n\t\t\tif (lazy) annotationNode.addWarning(\"'lazy' does not work with AccessLevel.NONE.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (node == null) return;\n\t\t\n\t\tList<JCAnnotation> onMethod = unboxAndRemoveAnnotationParameter(ast, \"onMethod\", \"@Getter(onMethod\", annotationNode);\n\t\tif (!onMethod.isEmpty()) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.ON_X_FLAG_USAGE, \"@Getter(onMethod=...)\");\n\t\t}\n\t\t\n\t\tswitch (node.getKind()) {\n\t\tcase FIELD:\n\t\t\tcreateGetterForFields(level, fields, annotationNode, true, lazy, onMethod);\n\t\t\tbreak;\n\t\tcase TYPE:\n\t\t\tif (lazy) annotationNode.addError(\"'lazy' is not supported for @Getter on a type.\");\n\t\t\tgenerateGetterForType(node, annotationNode, level, false, onMethod);\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tpublic void createGetterForFields(AccessLevel level, Collection<JavacNode> fieldNodes, JavacNode errorNode, boolean whineIfExists, boolean lazy, List<JCAnnotation> onMethod) {\n\t\tfor (JavacNode fieldNode : fieldNodes) {\n\t\t\tcreateGetterForField(level, fieldNode, errorNode, whineIfExists, lazy, onMethod);\n\t\t}\n\t}\n\t\n\tpublic void createGetterForField(AccessLevel level,\n\t\t\tJavacNode fieldNode, JavacNode source, boolean whineIfExists, boolean lazy, List<JCAnnotation> onMethod) {\n\t\t\n\t\tif (fieldNode.getKind() != Kind.FIELD || fieldNode.isEnumMember()) {\n\t\t\tsource.addError(GETTER_NODE_NOT_SUPPORTED_ERR);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tJCVariableDecl fieldDecl = (JCVariableDecl) fieldNode.get();\n\t\t\n\t\tif (lazy) {\n\t\t\tif ((fieldDecl.mods.flags & Flags.PRIVATE) == 0 || (fieldDecl.mods.flags & Flags.FINAL) == 0) {\n\t\t\t\tsource.addError(\"'lazy' requires the field to be private and final.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ((fieldDecl.mods.flags & Flags.TRANSIENT) != 0) {\n\t\t\t\tsource.addError(\"'lazy' is not supported on transient fields.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (fieldDecl.init == null) {\n\t\t\t\tsource.addError(\"'lazy' requires field initialization.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t\n\t\tAnnotationValues<Accessors> accessors = getAccessorsForField(fieldNode);\n\t\tString methodName = toGetterName(fieldNode, accessors);\n\t\t\n\t\tif (methodName == null) {\n\t\t\tsource.addWarning(\"Not generating getter for this field: It does not fit your @Accessors prefix list.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tfor (String altName : toAllGetterNames(fieldNode, accessors)) {\n\t\t\tswitch (methodExists(altName, fieldNode, false, 0)) {\n\t\t\tcase EXISTS_BY_LOMBOK:\n\t\t\t\treturn;\n\t\t\tcase EXISTS_BY_USER:\n\t\t\t\tif (whineIfExists) {\n\t\t\t\t\tString altNameExpl = \"\";\n\t\t\t\t\tif (!altName.equals(methodName)) altNameExpl = String.format(\" (%s)\", altName);\n\t\t\t\t\tsource.addWarning(\n\t\t\t\t\t\tString.format(\"Not generating %s(): A method with that name already exists%s\", methodName, altNameExpl));\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\tcase NOT_EXISTS:\n\t\t\t\t//continue scanning the other alt names.\n\t\t\t}\n\t\t}\n\t\t\n\t\tlong access = toJavacModifier(level) | (fieldDecl.mods.flags & Flags.STATIC);\n\t\t\n\t\tinjectMethod(fieldNode.up(), source, createGetter(access, fieldNode, fieldNode.getTreeMaker(), source, lazy, onMethod));\n\t}\n\t\n\tpublic JCMethodDecl createGetter(long access, JavacNode field, JavacTreeMaker treeMaker, JavacNode source, boolean lazy, List<JCAnnotation> onMethod) {\n\t\tJCVariableDecl fieldNode = (JCVariableDecl) field.get();\n\t\t\n\t\t// Remember the type; lazy will change it\n\t\tJCExpression methodType = copyType(treeMaker, fieldNode, source);\n\t\tAnnotationValues<Accessors> accessors = JavacHandlerUtil.getAccessorsForField(field);\n\t\t// Generate the methodName; lazy will change the field type\n\t\tName methodName = field.toName(toGetterName(field, accessors));\n\t\tboolean makeFinal = shouldMakeFinal(field, accessors);\n\t\t\n\t\tList<JCStatement> statements;\n\t\tboolean addSuppressWarningsUnchecked = false;\n\t\tif (lazy && !inNetbeansEditor(field)) {\n\t\t\tJCTree_keepPosition.set(fieldNode.init, true);\n\t\t\tstatements = createLazyGetterBody(treeMaker, field, source);\n\t\t\taddSuppressWarningsUnchecked = LombokOptionsFactory.getDelombokOptions(field.getContext()).getFormatPreferences().generateSuppressWarnings();\n\t\t} else {\n\t\t\tstatements = createSimpleGetterBody(treeMaker, field);\n\t\t}\n\t\t\n\t\tJCBlock methodBody = treeMaker.Block(0, statements);\n\t\t\n\t\tList<JCTypeParameter> methodGenericParams = List.nil();\n\t\tList<JCVariableDecl> parameters = List.nil();\n\t\tList<JCExpression> throwsClauses = List.nil();\n\t\tJCExpression annotationMethodDefaultValue = null;\n\t\t\n\t\tList<JCAnnotation> copyableAnnotations = findCopyableAnnotations(field);\n\n\t\t// Copying Jackson annotations is required for fluent accessors (otherwise Jackson would not find the accessor).\n\t\tboolean fluent = accessors.isExplicit(\"fluent\");\n\t\tBoolean fluentConfig = field.getAst().readConfiguration(ConfigurationKeys.ACCESSORS_FLUENT);\n\t\tif (fluentConfig != null && fluentConfig) fluent = fluentConfig;\n\t\tList<JCAnnotation> copyableToGetterAnnotations = copyAnnotations(findCopyableToGetterAnnotations(field, fluent), treeMaker);\n\n\t\tList<JCAnnotation> delegates = findDelegatesAndRemoveFromField(field);\n\t\tList<JCAnnotation> annsOnMethod = copyAnnotations(onMethod, treeMaker).appendList(copyableAnnotations).appendList(copyableToGetterAnnotations);\n\t\tif (field.isFinal()) {\n\t\t\tif (getCheckerFrameworkVersion(field).generatePure()) annsOnMethod = annsOnMethod.prepend(treeMaker.Annotation(genTypeRef(field, CheckerFrameworkVersion.NAME__PURE), List.<JCExpression>nil()));\n\t\t} else {\n\t\t\tif (getCheckerFrameworkVersion(field).generateSideEffectFree()) annsOnMethod = annsOnMethod.prepend(treeMaker.Annotation(genTypeRef(field, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil()));\n\t\t}\n\t\tif (isFieldDeprecated(field)) annsOnMethod = annsOnMethod.prepend(treeMaker.Annotation(genJavaLangTypeRef(field, \"Deprecated\"), List.<JCExpression>nil()));\n\t\t\n\t\tif (makeFinal) access |= Flags.FINAL;\n\t\tJCMethodDecl decl = recursiveSetGeneratedBy(treeMaker.MethodDef(treeMaker.Modifiers(access, annsOnMethod), methodName, methodType,\n\t\t\tmethodGenericParams, parameters, throwsClauses, methodBody, annotationMethodDefaultValue), source);\n\t\t\n\t\tdecl.mods.annotations = decl.mods.annotations.appendList(delegates);\n\t\tif (addSuppressWarningsUnchecked) {\n\t\t\tListBuffer<JCExpression> suppressions = new ListBuffer<JCExpression>();\n\t\t\tif (!Boolean.FALSE.equals(field.getAst().readConfiguration(ConfigurationKeys.ADD_SUPPRESSWARNINGS_ANNOTATIONS))) {\n\t\t\t\tsuppressions.append(treeMaker.Literal(\"all\"));\n\t\t\t}\n\t\t\tsuppressions.append(treeMaker.Literal(\"unchecked\"));\n\t\t\taddAnnotation(decl.mods, field, source, \"java.lang.SuppressWarnings\", treeMaker.NewArray(null, List.<JCExpression>nil(), suppressions.toList()));\n\t\t}\n\t\t\n\t\tcopyJavadoc(field, decl, CopyJavadoc.GETTER);\n\t\treturn decl;\n\t}\n\t\n\tpublic static List<JCAnnotation> findDelegatesAndRemoveFromField(JavacNode field) {\n\t\tJCVariableDecl fieldNode = (JCVariableDecl) field.get();\n\t\t\n\t\tList<JCAnnotation> delegates = List.nil();\n\t\tfor (JCAnnotation annotation : fieldNode.mods.annotations) {\n\t\t\tif (typeMatches(Delegate.class, field, annotation.annotationType)) {\n\t\t\t\tdelegates = delegates.append(annotation);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (!delegates.isEmpty()) {\n\t\t\tListBuffer<JCAnnotation> withoutDelegates = new ListBuffer<JCAnnotation>();\n\t\t\tfor (JCAnnotation annotation : fieldNode.mods.annotations) {\n\t\t\t\tif (!delegates.contains(annotation)) {\n\t\t\t\t\twithoutDelegates.append(annotation);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfieldNode.mods.annotations = withoutDelegates.toList();\n\t\t\tfield.rebuild();\n\t\t}\n\t\treturn delegates;\n\t}\n\t\n\tpublic List<JCStatement> createSimpleGetterBody(JavacTreeMaker treeMaker, JavacNode field) {\n\t\treturn List.<JCStatement>of(treeMaker.Return(createFieldAccessor(treeMaker, field, FieldAccess.ALWAYS_FIELD)));\n\t}\n\t\n\tprivate static final String AR = \"java.util.concurrent.atomic.AtomicReference\";\n\tprivate static final List<JCExpression> NIL_EXPRESSION = List.nil();\n\t\n\tpublic static final java.util.Map<TypeTag, String> TYPE_MAP;\n\tstatic {\n\t\tMap<TypeTag, String> m = new HashMap<TypeTag, String>();\n\t\tm.put(CTC_INT, \"Integer\");\n\t\tm.put(CTC_DOUBLE, \"Double\");\n\t\tm.put(CTC_FLOAT, \"Float\");\n\t\tm.put(CTC_SHORT, \"Short\");\n\t\tm.put(CTC_BYTE, \"Byte\");\n\t\tm.put(CTC_LONG, \"Long\");\n\t\tm.put(CTC_BOOLEAN, \"Boolean\");\n\t\tm.put(CTC_CHAR, \"Character\");\n\t\tTYPE_MAP = Collections.unmodifiableMap(m);\n\t}\n\t\n\tpublic List<JCStatement> createLazyGetterBody(JavacTreeMaker maker, JavacNode fieldNode, JavacNode source) {\n\t\t/*\n\t\tjava.lang.Object value = this.fieldName.get();\n\t\tif (value == null) {\n\t\t\tsynchronized (this.fieldName) {\n\t\t\t\tvalue = this.fieldName.get();\n\t\t\t\tif (value == null) {\n\t\t\t\t\tfinal RawValueType actualValue = INITIALIZER_EXPRESSION;\n\t\t\t\t\t[IF PRIMITIVE]\n\t\t\t\t\tvalue = actualValue;\n\t\t\t\t\t[ELSE]\n\t\t\t\t\tvalue = actualValue == null ? this.fieldName : actualValue;\n\t\t\t\t\t[END IF]\n\t\t\t\t\tthis.fieldName.set(value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t[IF PRIMITIVE]\n\t\treturn (BoxedValueType) value;\n\t\t[ELSE]\n\t\treturn (BoxedValueType) (value == this.fieldName ? null : value);\n\t\t[END IF]\n\t\t*/\n\t\t\n\t\tListBuffer<JCStatement> statements = new ListBuffer<JCStatement>();\n\t\t\n\t\tJCVariableDecl field = (JCVariableDecl) fieldNode.get();\n\t\tJCExpression copyOfRawFieldType = copyType(maker, field, source);\n\t\tJCExpression copyOfBoxedFieldType = null;\n\t\tfield.type = null;\n\t\tboolean isPrimitive = false;\n\t\tif (field.vartype instanceof JCPrimitiveTypeTree) {\n\t\t\tString boxed = TYPE_MAP.get(typeTag(field.vartype));\n\t\t\tif (boxed != null) {\n\t\t\t\tisPrimitive = true;\n\t\t\t\tfield.vartype = genJavaLangTypeRef(fieldNode, boxed);\n\t\t\t\tcopyOfBoxedFieldType = genJavaLangTypeRef(fieldNode, boxed);\n\t\t\t}\n\t\t}\n\t\tif (copyOfBoxedFieldType == null) copyOfBoxedFieldType = copyType(maker, field, source);\n\t\t\n\t\tName valueName = fieldNode.toName(\"$value\");\n\t\tName actualValueName = fieldNode.toName(\"actualValue\");\n\t\t\n\t\t/* java.lang.Object value = this.fieldName.get();*/ {\n\t\t\tJCExpression valueVarType = genJavaLangTypeRef(fieldNode, \"Object\");\n\t\t\tstatements.append(maker.VarDef(maker.Modifiers(0L), valueName, valueVarType, callGet(fieldNode, createFieldAccessor(maker, fieldNode, FieldAccess.ALWAYS_FIELD))));\n\t\t}\n\t\t\n\t\t/* if (value == null) { */ {\n\t\t\tJCSynchronized synchronizedStatement;\n\t\t\t/* synchronized (this.fieldName) { */ {\n\t\t\t\tListBuffer<JCStatement> synchronizedStatements = new ListBuffer<JCStatement>();\n\t\t\t\t/* value = this.fieldName.get(); */ {\n\t\t\t\t\tJCExpressionStatement newAssign = maker.Exec(maker.Assign(maker.Ident(valueName), callGet(fieldNode, createFieldAccessor(maker, fieldNode, FieldAccess.ALWAYS_FIELD))));\n\t\t\t\t\tsynchronizedStatements.append(newAssign);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/* if (value == null) { */ {\n\t\t\t\t\tListBuffer<JCStatement> innerIfStatements = new ListBuffer<JCStatement>();\n\t\t\t\t\t/* final RawValueType actualValue = INITIALIZER_EXPRESSION; */ {\n\t\t\t\t\t\tinnerIfStatements.append(maker.VarDef(maker.Modifiers(Flags.FINAL), actualValueName, copyOfRawFieldType, field.init));\n\t\t\t\t\t}\n\t\t\t\t\t/* [IF primitive] value = actualValue; */ {\n\t\t\t\t\t\tif (isPrimitive) {\n\t\t\t\t\t\t\tJCStatement statement = maker.Exec(maker.Assign(maker.Ident(valueName), maker.Ident(actualValueName)));\n\t\t\t\t\t\t\tinnerIfStatements.append(statement);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t/* [ELSE] value = actualValue == null ? this.fieldName : actualValue; */ {\n\t\t\t\t\t\tif (!isPrimitive) {\n\t\t\t\t\t\t\tJCExpression actualValueIsNull = maker.Binary(CTC_EQUAL, maker.Ident(actualValueName), maker.Literal(CTC_BOT, null));\n\t\t\t\t\t\t\tJCExpression thisDotFieldName = createFieldAccessor(maker, fieldNode, FieldAccess.ALWAYS_FIELD);\n\t\t\t\t\t\t\tJCExpression ternary = maker.Conditional(actualValueIsNull, thisDotFieldName, maker.Ident(actualValueName));\n\t\t\t\t\t\t\tJCStatement statement = maker.Exec(maker.Assign(maker.Ident(valueName), ternary));\n\t\t\t\t\t\t\tinnerIfStatements.append(statement);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t/* this.fieldName.set(value); */ {\n\t\t\t\t\t\tJCStatement statement = callSet(fieldNode, createFieldAccessor(maker, fieldNode, FieldAccess.ALWAYS_FIELD), maker.Ident(valueName));\n\t\t\t\t\t\tinnerIfStatements.append(statement);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tJCBinary isNull = maker.Binary(CTC_EQUAL, maker.Ident(valueName), maker.Literal(CTC_BOT, null));\n\t\t\t\t\tJCIf ifStatement = maker.If(isNull, maker.Block(0, innerIfStatements.toList()), null);\n\t\t\t\t\tsynchronizedStatements.append(ifStatement);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tsynchronizedStatement = maker.Synchronized(createFieldAccessor(maker, fieldNode, FieldAccess.ALWAYS_FIELD), maker.Block(0, synchronizedStatements.toList()));\n\t\t\t}\n\t\t\t\n\t\t\tJCBinary isNull = maker.Binary(CTC_EQUAL, maker.Ident(valueName), maker.Literal(CTC_BOT, null));\n\t\t\tJCIf ifStatement = maker.If(isNull, maker.Block(0, List.<JCStatement>of(synchronizedStatement)), null);\n\t\t\tstatements.append(ifStatement);\n\t\t}\n\t\t/* [IF PRIMITIVE] return (BoxedValueType) value; */ {\n\t\t\tif (isPrimitive) {\n\t\t\t\tstatements.append(maker.Return(maker.TypeCast(copyOfBoxedFieldType, maker.Ident(valueName))));\n\t\t\t}\n\t\t}\n\t\t/* [ELSE] return (BoxedValueType) (value == this.fieldName ? null : value); */ {\n\t\t\tif (!isPrimitive) {\n\t\t\t\tJCExpression valueEqualsSelf = maker.Binary(CTC_EQUAL, maker.Ident(valueName), createFieldAccessor(maker, fieldNode, FieldAccess.ALWAYS_FIELD));\n\t\t\t\tJCExpression ternary = maker.Conditional(valueEqualsSelf, maker.Literal(CTC_BOT,  null), maker.Ident(valueName));\n\t\t\t\tJCExpression typeCast = maker.TypeCast(copyOfBoxedFieldType, maker.Parens(ternary));\n\t\t\t\tstatements.append(maker.Return(typeCast));\n\t\t\t}\n\t\t}\n\t\t\n\t\t// update the field type and init last\n\t\t\n\t\t/*\tprivate final java.util.concurrent.atomic.AtomicReference<Object> fieldName = new java.util.concurrent.atomic.AtomicReference<Object>(); */ {\n\t\t\tfield.vartype = recursiveSetGeneratedBy(\n\t\t\t\tmaker.TypeApply(chainDotsString(fieldNode, AR), List.<JCExpression>of(genJavaLangTypeRef(fieldNode, \"Object\"))), source);\n\t\t\tfield.init = recursiveSetGeneratedBy(maker.NewClass(null, NIL_EXPRESSION, copyType(maker, field, source), NIL_EXPRESSION, null), source);\n\t\t}\n\t\t\n\t\treturn statements.toList();\n\t}\n\t\n\tpublic JCMethodInvocation callGet(JavacNode source, JCExpression receiver) {\n\t\tJavacTreeMaker maker = source.getTreeMaker();\n\t\treturn maker.Apply(NIL_EXPRESSION, maker.Select(receiver, source.toName(\"get\")), NIL_EXPRESSION);\n\t}\n\t\n\tpublic JCStatement callSet(JavacNode source, JCExpression receiver, JCExpression value) {\n\t\tJavacTreeMaker maker = source.getTreeMaker();\n\t\treturn maker.Exec(maker.Apply(NIL_EXPRESSION, maker.Select(receiver, source.toName(\"set\")), List.<JCExpression>of(value)));\n\t}\n\t\n\tpublic JCExpression copyType(JavacTreeMaker treeMaker, JCVariableDecl fieldNode, JavacNode source) {\n\t\treturn fieldNode.type != null ? treeMaker.Type(fieldNode.type) : cloneType(treeMaker, fieldNode.vartype, source);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleHelper.java",
    "content": "/*\n * Copyright (C) 2015-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.Iterator;\n\nimport com.sun.source.tree.MethodInvocationTree;\nimport com.sun.source.tree.TreeVisitor;\nimport com.sun.source.util.TreeScanner;\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCBlock;\nimport com.sun.tools.javac.tree.JCTree.JCCase;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCIdent;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCMethodInvocation;\nimport com.sun.tools.javac.tree.JCTree.JCStatement;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.ListBuffer;\nimport com.sun.tools.javac.util.Name;\n\nimport lombok.ConfigurationKeys;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.experimental.Helper;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacTreeMaker;\nimport lombok.spi.Provides;\n\n@Provides\npublic class HandleHelper extends JavacAnnotationHandler<Helper> {\n\tprivate List<JCStatement> getStatementsFromJcNode(JCTree tree) {\n\t\tif (tree instanceof JCBlock) return ((JCBlock) tree).stats;\n\t\tif (tree instanceof JCCase) return ((JCCase) tree).stats;\n\t\tif (tree instanceof JCMethodDecl) return ((JCMethodDecl) tree).body.stats;\n\t\treturn null;\n\t}\n\t\n\tprivate void setStatementsOfJcNode(JCTree tree, List<JCStatement> statements) {\n\t\tif (tree instanceof JCBlock) ((JCBlock) tree).stats = statements;\n\t\telse if (tree instanceof JCCase) ((JCCase) tree).stats = statements;\n\t\telse if (tree instanceof JCMethodDecl) ((JCMethodDecl) tree).body.stats = statements;\n\t\telse throw new IllegalArgumentException(\"Can't set statements on node type: \" + tree.getClass());\n\t}\n\t\n\t@Override public void handle(AnnotationValues<Helper> annotation, JCAnnotation ast, final JavacNode annotationNode) {\n\t\thandleExperimentalFlagUsage(annotationNode, ConfigurationKeys.HELPER_FLAG_USAGE, \"@Helper\");\n\t\t\n\t\tdeleteAnnotationIfNeccessary(annotationNode, Helper.class);\n\t\tJavacNode annotatedType = annotationNode.up();\n\t\tJavacNode containingBlock = annotatedType == null ? null : annotatedType.directUp();\n\t\tList<JCStatement> origStatements = getStatementsFromJcNode(containingBlock == null ? null : containingBlock.get());\n\t\t\n\t\tif (annotatedType == null || annotatedType.getKind() != Kind.TYPE || origStatements == null) {\n\t\t\tannotationNode.addError(\"@Helper is legal only on method-local classes.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tJCClassDecl annotatedType_ = (JCClassDecl) annotatedType.get();\n\t\tIterator<JCStatement> it = origStatements.iterator();\n\t\twhile (it.hasNext()) {\n\t\t\tif (it.next() == annotatedType_) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\tjava.util.List<String> knownMethodNames = new ArrayList<String>();\n\t\t\n\t\tfor (JavacNode ch : annotatedType.down()) {\n\t\t\tif (ch.getKind() != Kind.METHOD) continue;\n\t\t\tString n = ch.getName();\n\t\t\tif (n == null || n.isEmpty() || n.charAt(0) == '<') continue;\n\t\t\tknownMethodNames.add(n);\n\t\t}\n\t\t\n\t\tCollections.sort(knownMethodNames);\n\t\tfinal String[] knownMethodNames_ = knownMethodNames.toArray(new String[0]);\n\t\t\n\t\tfinal Name helperName = annotationNode.toName(\"$\" + annotatedType_.name);\n\t\tfinal boolean[] helperUsed = new boolean[1];\n\t\tfinal JavacTreeMaker maker = annotationNode.getTreeMaker();\n\t\t\n\t\tTreeVisitor<Void, Void> visitor = new TreeScanner<Void, Void>() {\n\t\t\t@Override public Void visitMethodInvocation(MethodInvocationTree node, Void p) {\n\t\t\t\tJCMethodInvocation jcmi = (JCMethodInvocation) node;\n\t\t\t\tapply(jcmi);\n\t\t\t\treturn super.visitMethodInvocation(node, p);\n\t\t\t}\n\t\t\t\n\t\t\tprivate void apply(JCMethodInvocation jcmi) {\n\t\t\t\tif (!(jcmi.meth instanceof JCIdent)) return;\n\t\t\t\tJCIdent jci = (JCIdent) jcmi.meth;\n\t\t\t\tif (Arrays.binarySearch(knownMethodNames_, jci.name.toString()) < 0) return;\n\t\t\t\tjcmi.meth = maker.Select(maker.Ident(helperName), jci.name);\n\t\t\t\trecursiveSetGeneratedBy(jcmi.meth, annotationNode);\n\t\t\t\thelperUsed[0] = true;\n\t\t\t}\n\t\t};\n\t\t\n\t\twhile (it.hasNext()) {\n\t\t\tJCStatement stat = it.next();\n\t\t\tstat.accept(visitor, null);\n\t\t}\n\t\t\n\t\tif (!helperUsed[0]) {\n\t\t\tannotationNode.addWarning(\"No methods of this helper class are ever used.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tListBuffer<JCStatement> newStatements = new ListBuffer<JCStatement>();\n\t\t\n\t\tboolean mark = false;\n\t\tfor (JCStatement stat : origStatements) {\n\t\t\tnewStatements.append(stat);\n\t\t\tif (mark || stat != annotatedType_) continue;\n\t\t\tmark = true;\n\t\t\tJCExpression init = maker.NewClass(null, List.<JCExpression>nil(), maker.Ident(annotatedType_.name), List.<JCExpression>nil(), null);\n\t\t\tJCExpression varType = maker.Ident(annotatedType_.name);\n\t\t\tJCVariableDecl decl = maker.VarDef(maker.Modifiers(Flags.FINAL), helperName, varType, init);\n\t\t\trecursiveSetGeneratedBy(decl, annotationNode);\n\t\t\tnewStatements.append(decl);\n\t\t}\n\t\tsetStatementsOfJcNode(containingBlock.get(), newStatements.toList());\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleJacksonized.java",
    "content": "/*\n * Copyright (C) 2020-2026 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.handleExperimentalFlagUsage;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport java.util.Arrays;\nimport java.util.Collection;\n\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCFieldAccess;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCTypeApply;\nimport com.sun.tools.javac.tree.JCTree.JCTypeParameter;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.ListBuffer;\n\nimport lombok.Builder;\nimport lombok.ConfigurationKeys;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.core.JacksonAnnotationType;\nimport lombok.core.configuration.JacksonVersion;\nimport lombok.core.handlers.HandlerUtil;\nimport lombok.experimental.Accessors;\nimport lombok.experimental.SuperBuilder;\nimport lombok.extern.jackson.Jacksonized;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacTreeMaker;\nimport lombok.spi.Provides;\n\n/**\n * This (javac) handler deals with {@code @Jacksonized} modifying the (already\n * generated) {@code @Builder} or {@code @SuperBuilder} to conform to Jackson's\n * needs for builders.\n */\n@Provides\n@HandlerPriority(-512) // Above Handle(Super)Builder's level (builders must be already generated), but before all handlers generating getters/setters.\npublic class HandleJacksonized extends JavacAnnotationHandler<Jacksonized> {\n\tstatic JCExpression chainDots(JavacNode node, JacksonAnnotationType annotation) {\n\t\treturn JavacHandlerUtil.chainDots(node, annotation.getQualifiedNameAsStringArray());\n\t}\n\t\n\tstatic boolean hasAnnotation(JavacNode node, JacksonAnnotationType annotation) {\n\t\treturn JavacHandlerUtil.hasAnnotation(annotation.getQualifiedName(), node);\n\t}\n\t\n\t@Override public void handle(AnnotationValues<Jacksonized> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\thandleExperimentalFlagUsage(annotationNode, ConfigurationKeys.JACKSONIZED_FLAG_USAGE, \"@Jacksonized\");\n\t\t\n\t\tJavacNode annotatedNode = annotationNode.up();\n\t\tdeleteAnnotationIfNeccessary(annotationNode, Jacksonized.class);\n\t\t\n\t\tJavacNode tdNode;\n\t\tif (annotatedNode.getKind() != Kind.TYPE) tdNode = annotatedNode.up(); // @Jacksonized on a constructor or a static factory method.\n\t\telse tdNode = annotatedNode; // @Jacksonized on the class.\n\t\tJCClassDecl td = (JCClassDecl) tdNode.get();\n\t\t\n\t\tJavacNode builderAnnotationNode = findAnnotation(Builder.class, annotatedNode);\n\t\tJavacNode superBuilderAnnotationNode = findAnnotation(SuperBuilder.class, annotatedNode);\n\t\tJavacNode accessorsAnnotationNode = findAnnotation(Accessors.class, annotatedNode);\n\t\tif (builderAnnotationNode == null && superBuilderAnnotationNode == null && accessorsAnnotationNode == null) {\n\t\t\tannotationNode.addWarning(\"@Jacksonized requires @Builder, @SuperBuilder, or @Accessors for it to mean anything.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (builderAnnotationNode != null || superBuilderAnnotationNode != null) {\n\t\t\thandleJacksonizedBuilder(annotationNode, annotatedNode, tdNode, td, builderAnnotationNode, superBuilderAnnotationNode);\n\t\t}\n\t\t\n\t\tif (accessorsAnnotationNode != null) {\n\t\t\thandleJacksonizedAccessors(annotationNode, annotatedNode, tdNode, td, accessorsAnnotationNode, builderAnnotationNode != null || superBuilderAnnotationNode != null);\n\t\t}\n\t}\n\t\n\tprivate void handleJacksonizedAccessors(JavacNode annotationNode, JavacNode annotatedNode, JavacNode tdNode, JCClassDecl td, JavacNode accessorsAnnotationNode, boolean jacksonizedBuilder) {\n\t\tAnnotationValues<Accessors> accessorsAnnotation = accessorsAnnotationNode != null ? \n\t\t\tcreateAnnotation(Accessors.class, accessorsAnnotationNode) : null;\n\t\tboolean fluent = accessorsAnnotation != null && accessorsAnnotation.getInstance().fluent();\n\t\t\n\t\tif (!fluent) {\n\t\t\t// No changes required for chained-only accessors.\n\t\t\tif (!jacksonizedBuilder)\n\t\t\t\tannotationNode.addWarning(\"@Jacksonized only affects fluent accessors (@Accessors(fluent=true)).\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t// Add @JsonProperty to all non-transient fields. It will be automatically copied to the getter/setters later.\n\t\t// Add @JsonIgnore to all transient fields. It will be automatically copied to the getter/setters later.\n\t\tfor (JavacNode javacNode : tdNode.down()) {\n\t\t\tif (javacNode.getKind() == Kind.FIELD) {\n\t\t\t\tif (hasAnnotation(javacNode, JacksonAnnotationType.JSON_PROPERTY2) ||\n\t\t\t\t\thasAnnotation(javacNode, JacksonAnnotationType.JSON_IGNORE2)) {\n\t\t\t\t\t\n\t\t\t\t\treturn;\n\t\t\t\t} else if (javacNode.isTransient()) {\n\t\t\t\t\tcreateJsonIgnoreForField(javacNode, annotationNode);\n\t\t\t\t} else {\n\t\t\t\t\tcreateJsonPropertyForField(javacNode, annotationNode);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate void createJsonPropertyForField(JavacNode fieldNode, JavacNode annotationNode) {\n\t\tJavacTreeMaker maker = fieldNode.getTreeMaker();\n\t\t\n\t\tJCExpression jsonPropertyType = chainDots(fieldNode, JacksonAnnotationType.JSON_PROPERTY2);\n\t\tJCAnnotation annotationJsonProperty = maker.Annotation(jsonPropertyType, List.<JCExpression>of(maker.Literal(fieldNode.getName())));\n\t\trecursiveSetGeneratedBy(annotationJsonProperty, annotationNode);\n\t\tJCVariableDecl fieldDecl = ((JCVariableDecl)fieldNode.get());\n\t\tfieldDecl.mods.annotations = fieldDecl.mods.annotations.append(annotationJsonProperty);\n\t}\n\t\n\tprivate void createJsonIgnoreForField(JavacNode fieldNode, JavacNode annotationNode) {\n\t\tJavacTreeMaker maker = fieldNode.getTreeMaker();\n\t\t\n\t\tJCExpression jsonPropertyType = chainDots(fieldNode, JacksonAnnotationType.JSON_IGNORE2);\n\t\tJCAnnotation annotationJsonProperty = maker.Annotation(jsonPropertyType, List.<JCExpression>nil());\n\t\trecursiveSetGeneratedBy(annotationJsonProperty, annotationNode);\n\t\tJCVariableDecl fieldDecl = ((JCVariableDecl)fieldNode.get());\n\t\tfieldDecl.mods.annotations = fieldDecl.mods.annotations.append(annotationJsonProperty);\n\t}\n\t\n\tprivate void handleJacksonizedBuilder(JavacNode annotationNode, JavacNode annotatedNode, JavacNode tdNode, JCClassDecl td, JavacNode builderAnnotationNode, JavacNode superBuilderAnnotationNode) {\n\t\tif (builderAnnotationNode != null && superBuilderAnnotationNode != null) {\n\t\t\tannotationNode.addError(\"@Jacksonized cannot process both @Builder and @SuperBuilder on the same class.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tboolean isAbstract = (td.mods.flags & Flags.ABSTRACT) != 0;\n\t\tif (isAbstract) {\n\t\t\tannotationNode.addError(\"Builders on abstract classes cannot be @Jacksonized (the builder would never be used).\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tAnnotationValues<Builder> builderAnnotation = builderAnnotationNode != null ? \n\t\t\tcreateAnnotation(Builder.class, builderAnnotationNode) : null;\n\t\tAnnotationValues<SuperBuilder> superBuilderAnnotation = superBuilderAnnotationNode != null ? \n\t\t\tcreateAnnotation(SuperBuilder.class, superBuilderAnnotationNode) : null;\n\t\t\n\t\tString setPrefix = builderAnnotation != null ? \n\t\t\tbuilderAnnotation.getInstance().setterPrefix() :\n\t\t\tsuperBuilderAnnotation.getInstance().setterPrefix();\n\t\tString buildMethodName = builderAnnotation != null ? \n\t\t\tbuilderAnnotation.getInstance().buildMethodName() :\n\t\t\tsuperBuilderAnnotation.getInstance().buildMethodName();\n\t\t\n\t\tJavacTreeMaker maker = annotatedNode.getTreeMaker();\n\t\t\n\t\t// Now lets find the generated builder class.\n\t\tString builderClassName = getBuilderClassName(annotationNode, annotatedNode, td, builderAnnotation, maker);\n\t\t\n\t\tJCClassDecl builderClass = null;\n\t\tfor (JCTree member : td.getMembers()) {\n\t\t\tif (member instanceof JCClassDecl && ((JCClassDecl) member).getSimpleName().contentEquals(builderClassName)) {\n\t\t\t\tbuilderClass = (JCClassDecl) member;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (builderClass == null) {\n\t\t\tannotationNode.addError(\"Could not find @(Super)Builder's generated builder class for @Jacksonized processing. If there are other compiler errors, fix them first.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t// Insert @JsonDeserialize on annotated class.\n\t\tif (hasAnnotation(tdNode, JacksonAnnotationType.JSON_DESERIALIZE2) || hasAnnotation(tdNode, JacksonAnnotationType.JSON_DESERIALIZE3)) {\n\t\t\tannotationNode.addError(\"@JsonDeserialize already exists on class. Either delete @JsonDeserialize, or remove @Jacksonized and manually configure Jackson.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tCollection<JacksonVersion> jacksonVersions = annotationNode.getAst().readConfigurationOr(ConfigurationKeys.JACKSONIZED_JACKSON_VERSION, Arrays.<JacksonVersion>asList());\n\t\t\n\t\tif (jacksonVersions.isEmpty()) {\n\t\t\tannotationNode.addWarning(\"Ambiguous: Jackson2 and Jackson3 exist; define which variant(s) you want in 'lombok.config'. See https://projectlombok.org/features/experimental/Jacksonized\");\n\t\t\tjacksonVersions = Arrays.asList(JacksonVersion.TWO);\n\t\t}\n\t\t\n\t\tif (jacksonVersions.contains(JacksonVersion.TWO)) {\n\t\t\tJCExpression jsonDeserializeType = chainDots(annotatedNode, JacksonAnnotationType.JSON_DESERIALIZE2);\n\t\t\tinsertJsonDeserializeAnnotation(annotationNode, annotatedNode, tdNode, td, maker, builderClassName, jsonDeserializeType);\n\t\t}\n\t\tif (jacksonVersions.contains(JacksonVersion.THREE)) {\n\t\t\tJCExpression jsonDeserializeType = chainDots(annotatedNode, JacksonAnnotationType.JSON_DESERIALIZE3);\n\t\t\tinsertJsonDeserializeAnnotation(annotationNode, annotatedNode, tdNode, td, maker, builderClassName, jsonDeserializeType);\n\t\t}\n\t\t\n\t\t// Copy annotations from the class to the builder class.\n\t\tList<JCAnnotation> copyableAnnotations = findJacksonAnnotationsOnClass(tdNode);\n\t\tList<JCAnnotation> copiedAnnotations = copyAnnotations(copyableAnnotations, maker);\n\t\tfor (JCAnnotation anno : copiedAnnotations) {\n\t\t\trecursiveSetGeneratedBy(anno, annotationNode);\n\t\t}\n\t\tbuilderClass.mods.annotations = builderClass.mods.annotations.appendList(copiedAnnotations);\n\t\t\n\t\tif (jacksonVersions.contains(JacksonVersion.TWO)) {\n\t\t\tJCExpression jsonPojoBuilderType = chainDots(annotatedNode, JacksonAnnotationType.JSON_POJO_BUILDER2);\n\t\t\tinsertJsonPojoAnnotation(annotationNode, annotatedNode, setPrefix, buildMethodName, maker, builderClass, jsonPojoBuilderType);\n\t\t}\n\t\tif (jacksonVersions.contains(JacksonVersion.THREE)) {\n\t\t\tJCExpression jsonPojoBuilderType = chainDots(annotatedNode, JacksonAnnotationType.JSON_POJO_BUILDER3);\n\t\t\tinsertJsonPojoAnnotation(annotationNode, annotatedNode, setPrefix, buildMethodName, maker, builderClass, jsonPojoBuilderType);\n\t\t}\n\t\t// @SuperBuilder? Make it package-private!\n\t\tif (superBuilderAnnotationNode != null) builderClass.mods.flags = builderClass.mods.flags & ~Flags.PRIVATE;\n\t}\n\t\n\t// Insert @JsonPojoBuilder on the builder class.\n\tprivate void insertJsonPojoAnnotation(JavacNode annotationNode, JavacNode annotatedNode, String setPrefix, String buildMethodName, JavacTreeMaker maker, JCClassDecl builderClass, JCExpression jsonPojoBuilderType) {\n\t\tJCExpression withPrefixExpr = maker.Assign(maker.Ident(annotationNode.toName(\"withPrefix\")), maker.Literal(setPrefix));\n\t\tJCExpression buildMethodNameExpr = maker.Assign(maker.Ident(annotationNode.toName(\"buildMethodName\")), maker.Literal(buildMethodName));\n\t\tJCAnnotation annotationJsonPojoBuilder = maker.Annotation(jsonPojoBuilderType, List.of(withPrefixExpr, buildMethodNameExpr));\n\t\trecursiveSetGeneratedBy(annotationJsonPojoBuilder, annotatedNode);\n\t\tbuilderClass.mods.annotations = builderClass.mods.annotations.append(annotationJsonPojoBuilder);\n\t}\n\t\n\t// Insert @JsonDeserialize on the class.\n\tprivate void insertJsonDeserializeAnnotation(JavacNode annotationNode, JavacNode annotatedNode, JavacNode tdNode, JCClassDecl td, JavacTreeMaker maker, String builderClassName, JCExpression jsonDeserializeType) {\n\t\tJCExpression builderClassExpression = namePlusTypeParamsToTypeReference(maker, tdNode, annotationNode.toName(builderClassName), false, List.<JCTypeParameter>nil());\n\t\tJCFieldAccess builderClassReference = maker.Select(builderClassExpression, annotatedNode.toName(\"class\"));\n\t\tJCExpression assign = maker.Assign(maker.Ident(annotationNode.toName(\"builder\")), builderClassReference);\n\t\tJCAnnotation annotationJsonDeserialize = maker.Annotation(jsonDeserializeType, List.of(assign));\n\t\trecursiveSetGeneratedBy(annotationJsonDeserialize, annotationNode);\n\t\ttd.mods.annotations = td.mods.annotations.append(annotationJsonDeserialize);\n\t}\n\t\n\tprivate String getBuilderClassName(JavacNode annotationNode, JavacNode annotatedNode, JCClassDecl td, AnnotationValues<Builder> builderAnnotation, JavacTreeMaker maker) {\n\t\tString builderClassName = builderAnnotation != null ? builderAnnotation.getInstance().builderClassName() : null;\n\t\tif (builderClassName == null || builderClassName.isEmpty()) {\n\t\t\tbuilderClassName = annotationNode.getAst().readConfiguration(ConfigurationKeys.BUILDER_CLASS_NAME);\n\t\t\tif (builderClassName == null || builderClassName.isEmpty()) builderClassName = \"*Builder\";\n\t\t\t\n\t\t\tJCMethodDecl fillParametersFrom = annotatedNode.get() instanceof JCMethodDecl ? (JCMethodDecl)annotatedNode.get() : null;\n\t\t\tString replacement;\n\t\t\tif (fillParametersFrom != null && !fillParametersFrom.getName().toString().equals(\"<init>\")) {\n\t\t\t\t// @Builder on a method: Use name of return type for builder class name.\n\t\t\t\tJCExpression returnType = fillParametersFrom.restype;\n\t\t\t\tList<JCTypeParameter> typeParams = fillParametersFrom.typarams;\n\t\t\t\tif (returnType instanceof JCTypeApply) {\n\t\t\t\t\treturnType = cloneType(maker, returnType, annotatedNode);\n\t\t\t\t}\n\t\t\t\treplacement = HandleBuilder.returnTypeToBuilderClassName(annotationNode, td, returnType, typeParams);\n\t\t\t} else {\n\t\t\t\t// @Builder on class or constructor: Use the class name.\n\t\t\t\treplacement = td.name.toString();\n\t\t\t}\n\t\t\tbuilderClassName = builderClassName.replace(\"*\", replacement);\n\t\t}\n\t\t\n\t\tif (builderAnnotation == null) builderClassName += \"Impl\"; // For @SuperBuilder, all Jackson annotations must be put on the BuilderImpl class.\n\t\t\n\t\treturn builderClassName;\n\t}\n\t\n\tprivate static List<JCAnnotation> findJacksonAnnotationsOnClass(JavacNode node) {\n\t\tListBuffer<JCAnnotation> result = new ListBuffer<JCAnnotation>();\n\t\tfor (JavacNode child : node.down()) {\n\t\t\tif (child.getKind() == Kind.ANNOTATION) {\n\t\t\t\tJCAnnotation annotation = (JCAnnotation) child.get();\n\t\t\t\tfor (String bn : HandlerUtil.JACKSON_COPY_TO_BUILDER_ANNOTATIONS) {\n\t\t\t\t\tif (typeMatches(bn, node, annotation.annotationType)) {\n\t\t\t\t\t\tresult.append(annotation);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result.toList();\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleLocked.java",
    "content": "/*\n * Copyright (C) 2021-2023 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.Locked;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.spi.Provides;\n\nimport static com.sun.tools.javac.tree.JCTree.*;\n\n/**\n * Handles the {@code lombok.Locked} annotation for javac.\n */\n@Provides\n@HandlerPriority(value = 1024) // 2^10; @NonNull must have run first, so that we wrap around the statements generated by it.\npublic class HandleLocked extends JavacAnnotationHandler<Locked> {\n\tprivate static final String ANNOTATION_NAME = \"@Locked\";\n\tprivate static final String[] LOCK_TYPE_CLASS = new String[]{\"java\", \"util\", \"concurrent\", \"locks\", \"Lock\"};\n\tprivate static final String[] LOCK_IMPL_CLASS = new String[]{\"java\", \"util\", \"concurrent\", \"locks\", \"ReentrantLock\"};\n\t\n\t@Override public void handle(AnnotationValues<Locked> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\tString annotationValue = annotation.getInstance().value();\n\t\tHandleLockedUtil.handle(annotationValue, ast, annotationNode, Locked.class, ANNOTATION_NAME, LOCK_TYPE_CLASS, LOCK_IMPL_CLASS);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleLockedRead.java",
    "content": "/*\n * Copyright (C) 2021-2023 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.Locked;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.spi.Provides;\n\nimport static com.sun.tools.javac.tree.JCTree.*;\n\n/**\n * Handles the {@code lombok.Locked.Read} annotation for javac.\n */\n@Provides\n@HandlerPriority(value = 1024) // 2^10; @NonNull must have run first, so that we wrap around the statements generated by it.\npublic class HandleLockedRead extends JavacAnnotationHandler<Locked.Read> {\n\tprivate static final String LOCK_METHOD = \"readLock\";\n\tprivate static final String ANNOTATION_NAME = \"@Locked.Read\";\n\tprivate static final String[] LOCK_TYPE_CLASS = new String[]{\"java\", \"util\", \"concurrent\", \"locks\", \"ReadWriteLock\"};\n\tprivate static final String[] LOCK_IMPL_CLASS = new String[]{\"java\", \"util\", \"concurrent\", \"locks\", \"ReentrantReadWriteLock\"};\n\t\n\t@Override public void handle(AnnotationValues<Locked.Read> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\tString annotationValue = annotation.getInstance().value();\n\t\tHandleLockedUtil.handle(annotationValue, ast, annotationNode, Locked.Read.class, ANNOTATION_NAME, LOCK_TYPE_CLASS, LOCK_IMPL_CLASS, LOCK_METHOD);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleLockedUtil.java",
    "content": "/*\n * Copyright (C) 2021-2023 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.util.List;\nimport lombok.core.AST;\nimport lombok.ConfigurationKeys;\nimport lombok.Locked;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacTreeMaker;\n\nimport java.lang.annotation.Annotation;\n\nimport static com.sun.tools.javac.tree.JCTree.*;\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\n/**\n * Container for static utility methods used by the Locked[.Read/Write] annotations.\n */\npublic final class HandleLockedUtil {\n\tprivate static final String INSTANCE_LOCK_NAME = \"$lock\";\n\tprivate static final String STATIC_LOCK_NAME = \"$LOCK\";\n\tprivate static final List<JCExpression> NIL_EXPRESSION = List.nil();\n\t\n\tprivate HandleLockedUtil() {\n\t\t//Prevent instantiation\n\t}\n\t\n\t/**\n\t * See {@link #handle(String, JCAnnotation, JavacNode, Class, String, String[], String[], String)} for\n\t * {@code lockableMethodName = null}.\n\t */\n\tpublic static <T extends Annotation> void handle(String annotationValue, JCTree.JCAnnotation ast, JavacNode annotationNode, Class<T> annotationClass, String annotationName, String[] lockTypeClass, String[] lockImplClass) {\n\t\thandle(annotationValue, ast, annotationNode, annotationClass, annotationName, lockTypeClass, lockImplClass, null);\n\t}\n\t\n\t/**\n\t * Called when an annotation is found that is likely to match {@link Locked}, {@link Locked.Read}, or\n\t * {@link Locked.Write}.\n\t *\n\t * Be aware that you'll be called for ANY annotation node in the source that looks like a match. There is,\n\t * for example, no guarantee that the annotation node belongs to a method, even if you set your\n\t * TargetType in the annotation to methods only.\n\t *\n\t * @param annotationValue The value of the annotation. This will be the name of the object used for locking.\n\t * @param ast The javac AST node representing the annotation.\n\t * @param annotationNode The Lombok AST wrapper around the 'ast' parameter. You can use this object\n\t * to travel back up the chain (something javac AST can't do) to the parent of the annotation, as well\n\t * as access useful methods such as generating warnings or errors focused on the annotation.\n\t * @param annotationClass The specific annotation class. This should be one of {@code Locked}, {@code Locked.Read},\n\t * or {@code Locked.Write}.\n\t * @param annotationName The name of the annotation to use when referencing it in errors.\n\t * @param lockTypeClass The type of the variable when generating a lock to use.\n\t * See {@link JavacHandlerUtil#chainDots(JavacNode, String, String, String...)}.\n\t * @param lockImplClass Call the constructor of this class to generate a lock to use.\n\t * See {@link JavacHandlerUtil#chainDots(JavacNode, String, String, String...)}.\n\t * @param lockableMethodName The name of the method in the {@code lockClass} that returns a\n\t * {@link java.util.concurrent.locks.Lock} object. When this is {@code null}, it is assumed that {@code lockClass}\n\t * itself can be locked/unlocked.\n\t * @param <T> The annotation type.\n\t */\n\tpublic static <T extends Annotation> void handle(String annotationValue, JCTree.JCAnnotation ast, JavacNode annotationNode, Class<T> annotationClass, String annotationName, String[] lockTypeClass, String[] lockImplClass, String lockableMethodName) {\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.LOCKED_FLAG_USAGE, annotationName);\n\t\t\n\t\tif (inNetbeansEditor(annotationNode)) return;\n\t\tdeleteAnnotationIfNeccessary(annotationNode, annotationClass);\n\t\t\n\t\tJavacNode methodNode = annotationNode.up();\n\t\tif (methodNode == null || methodNode.getKind() != AST.Kind.METHOD || !(methodNode.get() instanceof JCMethodDecl)) {\n\t\t\tannotationNode.addError(annotationName + \" is legal only on methods.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tJCMethodDecl method = (JCMethodDecl) methodNode.get();\n\t\tif ((method.mods.flags & Flags.ABSTRACT) != 0) {\n\t\t\tannotationNode.addError(annotationName + \" is legal only on concrete methods.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tJavacNode typeNode = upToTypeNode(annotationNode);\n\t\tif (!isClassOrEnum(typeNode)) {\n\t\t\tannotationNode.addError(annotationName + \" is legal only on methods in classes and enums.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tboolean isStatic = (method.mods.flags & Flags.STATIC) != 0;\n\t\tString lockName = annotationValue;\n\t\tboolean autoMake = false;\n\t\t\n\t\tif (lockName.length() == 0) {\n\t\t\tautoMake = true;\n\t\t\tlockName = isStatic ? STATIC_LOCK_NAME : INSTANCE_LOCK_NAME;\n\t\t}\n\t\t\n\t\tJavacTreeMaker maker = methodNode.getTreeMaker().at(ast.pos);\n\t\t\n\t\tMemberExistsResult exists = MemberExistsResult.NOT_EXISTS;\n\t\t\n\t\tJCExpression lockVarType = chainDots(methodNode, ast.pos, null, null, lockTypeClass);\n\t\t\n\t\tif (typeNode != null && typeNode.get() instanceof JCClassDecl) {\n\t\t\tfor (JCTree def : ((JCClassDecl) typeNode.get()).defs) {\n\t\t\t\tif (def instanceof JCVariableDecl) {\n\t\t\t\t\tif (((JCVariableDecl) def).name.contentEquals(lockName)) {\n\t\t\t\t\t\tJCVariableDecl varDeclDef = (JCVariableDecl) def;\n\t\t\t\t\t\texists = getGeneratedBy(varDeclDef) == null ? MemberExistsResult.EXISTS_BY_USER : MemberExistsResult.EXISTS_BY_LOMBOK;\n\t\t\t\t\t\tboolean st = ((varDeclDef.mods.flags) & Flags.STATIC) != 0;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (isStatic != st && exists == MemberExistsResult.EXISTS_BY_LOMBOK) {\n\t\t\t\t\t\t\tannotationNode.addError(\"The generated field \" + lockName + \" does not match the static status of this method\");\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tisStatic = st;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (exists == MemberExistsResult.EXISTS_BY_LOMBOK && !lockVarType.toString().equals(varDeclDef.vartype.toString())) {\n\t\t\t\t\t\t\tannotationNode.addError(\"Expected field \" + lockName + \" to be of type \" + lockVarType + \" but got type \" + varDeclDef.vartype + \". Did you mix @Locked with @Locked.Read/Write on the same generated field?\");\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (exists == MemberExistsResult.NOT_EXISTS) {\n\t\t\tif (!autoMake) {\n\t\t\t\tannotationNode.addError(\"The field \" + lockName + \" does not exist.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tJCExpression lockImplType = chainDots(methodNode, ast.pos, null, null, lockImplClass);\n\t\t\tJCNewClass lockInstance = maker.NewClass(null, NIL_EXPRESSION, lockImplType, NIL_EXPRESSION, null);\n\t\t\tJCVariableDecl newLockField = recursiveSetGeneratedBy(maker.VarDef(\n\t\t\t\tmaker.Modifiers(Flags.PRIVATE | Flags.FINAL | (isStatic ? Flags.STATIC : 0)),\n\t\t\t\tmethodNode.toName(lockName), lockVarType, lockInstance), annotationNode);\n\t\t\tinjectFieldAndMarkGenerated(methodNode.up(), newLockField);\n\t\t}\n\t\t\n\t\tif (method.body == null) return;\n\t\t\n\t\tJCExpression lockNode;\n\t\tif (isStatic) {\n\t\t\tlockNode = namePlusTypeParamsToTypeReference(maker, typeNode, methodNode.toName(lockName), false, List.<JCTypeParameter>nil());\n\t\t} else {\n\t\t\tlockNode = maker.Select(maker.Ident(methodNode.toName(\"this\")), methodNode.toName(lockName));\n\t\t}\n\t\t\n\t\tJCExpressionStatement acquireLock = maker.Exec(maker.Apply(NIL_EXPRESSION, maker.Select(getLockable(maker, typeNode, methodNode, lockableMethodName, lockNode), annotationNode.toName(\"lock\")), NIL_EXPRESSION));\n\t\tJCExpressionStatement releaseLock = maker.Exec(maker.Apply(NIL_EXPRESSION, maker.Select(getLockable(maker, typeNode, methodNode, lockableMethodName, lockNode), annotationNode.toName(\"unlock\")), NIL_EXPRESSION));\n\t\t\n\t\tJCTry tryBlock = setGeneratedBy(maker.Try(method.body, List.<JCCatch>nil(), recursiveSetGeneratedBy(maker.Block(0, List.<JCStatement>of(releaseLock)), annotationNode)), annotationNode);\n\t\t\n\t\tmethod.body = setGeneratedBy(maker.Block(0, List.<JCStatement>of(recursiveSetGeneratedBy(acquireLock, annotationNode), tryBlock)), annotationNode);\n\t\t\n\t\tmethodNode.rebuild();\n\t}\n\t\n\tprivate static JCExpression getLockable(JavacTreeMaker maker, JavacNode typeNode, JavacNode methodNode, String lockableMethodName, JCExpression lockNode) {\n\t\tif (lockableMethodName == null) {\n\t\t\treturn cloneType(maker, lockNode, typeNode);\n\t\t} else {\n\t\t\treturn maker.Apply(NIL_EXPRESSION, maker.Select(cloneType(maker, lockNode, typeNode), methodNode.toName(lockableMethodName)), NIL_EXPRESSION);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleLockedWrite.java",
    "content": "/*\n * Copyright (C) 2021-2023 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.Locked;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.spi.Provides;\n\nimport static com.sun.tools.javac.tree.JCTree.*;\n\n/**\n * Handles the {@code lombok.Locked.Write} annotation for javac.\n */\n@Provides\n@HandlerPriority(value = 1024) // 2^10; @NonNull must have run first, so that we wrap around the statements generated by it.\npublic class HandleLockedWrite extends JavacAnnotationHandler<Locked.Write> {\n\tprivate static final String LOCK_METHOD = \"writeLock\";\n\tprivate static final String ANNOTATION_NAME = \"@Locked.Write\";\n\tprivate static final String[] LOCK_TYPE_CLASS = new String[]{\"java\", \"util\", \"concurrent\", \"locks\", \"ReadWriteLock\"};\n\tprivate static final String[] LOCK_IMPL_CLASS = new String[]{\"java\", \"util\", \"concurrent\", \"locks\", \"ReentrantReadWriteLock\"};\n\t\n\t@Override public void handle(AnnotationValues<Locked.Write> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\tString annotationValue = annotation.getInstance().value();\n\t\tHandleLockedUtil.handle(annotationValue, ast, annotationNode, Locked.Write.class, ANNOTATION_NAME, LOCK_TYPE_CLASS, LOCK_IMPL_CLASS, LOCK_METHOD);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleLog.java",
    "content": "/*\n * Copyright (C) 2010-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.handleFlagUsage;\nimport static lombok.javac.Javac.CTC_BOT;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCFieldAccess;\nimport com.sun.tools.javac.tree.JCTree.JCMethodInvocation;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.Name;\n\nimport lombok.AccessLevel;\nimport lombok.ConfigurationKeys;\nimport lombok.core.AnnotationValues;\nimport lombok.core.configuration.IdentifierName;\nimport lombok.core.configuration.LogDeclaration;\nimport lombok.core.configuration.LogDeclaration.LogFactoryParameter;\nimport lombok.core.handlers.LoggingFramework;\nimport lombok.javac.Javac;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacTreeMaker;\nimport lombok.javac.handlers.JavacHandlerUtil.MemberExistsResult;\nimport lombok.spi.Provides;\n\npublic class HandleLog {\n\tprivate static final IdentifierName LOG = IdentifierName.valueOf(\"log\");\n\t\n\tprivate HandleLog() {\n\t\tthrow new UnsupportedOperationException();\n\t}\n\t\n\tpublic static void processAnnotation(LoggingFramework framework, AccessLevel access, AnnotationValues<?> annotation, JavacNode annotationNode) {\n\t\tdeleteAnnotationIfNeccessary(annotationNode, framework.getAnnotationClass());\n\t\t\n\t\tJavacNode typeNode = annotationNode.up();\n\t\tswitch (typeNode.getKind()) {\n\t\tcase TYPE:\n\t\t\tIdentifierName logFieldName = annotationNode.getAst().readConfiguration(ConfigurationKeys.LOG_ANY_FIELD_NAME);\n\t\t\tif (logFieldName == null) logFieldName = LOG;\n\t\t\t\n\t\t\tboolean useStatic = !Boolean.FALSE.equals(annotationNode.getAst().readConfiguration(ConfigurationKeys.LOG_ANY_FIELD_IS_STATIC));\n\t\t\t\n\t\t\tif ((((JCClassDecl) typeNode.get()).mods.flags & Flags.INTERFACE) != 0) {\n\t\t\t\tannotationNode.addError(framework.getAnnotationAsString() + \" is legal only on classes and enums.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (fieldExists(logFieldName.getName(), typeNode) != MemberExistsResult.NOT_EXISTS) {\n\t\t\t\tannotationNode.addWarning(\"Field '\" + logFieldName + \"' already exists.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (isRecord(typeNode) && !useStatic) {\n\t\t\t\tannotationNode.addError(\"Logger fields must be static in records.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (useStatic && !isStaticAllowed(typeNode)) {\n\t\t\t\tannotationNode.addError(framework.getAnnotationAsString() + \" is not supported on non-static nested classes.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tObject valueGuess = annotation.getValueGuess(\"topic\");\n\t\t\tJCExpression loggerTopic = (JCExpression) annotation.getActualExpression(\"topic\");\n\t\t\t\n\t\t\tif (valueGuess instanceof String && ((String) valueGuess).trim().isEmpty()) loggerTopic = null;\n\t\t\tif (framework.getDeclaration().getParametersWithTopic() == null && loggerTopic != null) {\n\t\t\t\tannotationNode.addError(framework.getAnnotationAsString() + \" does not allow a topic.\");\n\t\t\t\tloggerTopic = null;\n\t\t\t}\n\t\t\tif (framework.getDeclaration().getParametersWithoutTopic() == null && loggerTopic == null) {\n\t\t\t\tannotationNode.addError(framework.getAnnotationAsString() + \" requires a topic.\");\n\t\t\t\tloggerTopic = typeNode.getTreeMaker().Literal(\"\");\n\t\t\t}\n\t\t\t\n\t\t\tif (access == AccessLevel.NONE) break;\n\t\t\t\n\t\t\tJCFieldAccess loggingType = selfType(typeNode);\n\t\t\tcreateField(framework, access, typeNode, loggingType, annotationNode, logFieldName.getName(), useStatic, loggerTopic);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tannotationNode.addError(\"@Log is legal only on types.\");\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tpublic static JCFieldAccess selfType(JavacNode typeNode) {\n\t\tJavacTreeMaker maker = typeNode.getTreeMaker();\n\t\tName name = ((JCClassDecl) typeNode.get()).name;\n\t\treturn maker.Select(maker.Ident(name), typeNode.toName(\"class\"));\n\t}\n\t\n\t\n\tprivate static boolean createField(LoggingFramework framework, AccessLevel access, JavacNode typeNode, JCFieldAccess loggingType, JavacNode source, String logFieldName, boolean useStatic, JCExpression loggerTopic) {\n\t\tJavacTreeMaker maker = typeNode.getTreeMaker();\n\t\t\n\t\tLogDeclaration logDeclaration = framework.getDeclaration();\n\t\t// private static final <loggerType> log = <factoryMethod>(<parameter>);\n\t\tJCExpression loggerType = chainDotsString(typeNode, logDeclaration.getLoggerType().getName());\n\t\tJCExpression factoryMethod = chainDotsString(typeNode, logDeclaration.getLoggerFactoryType().getName() + \".\" + logDeclaration.getLoggerFactoryMethod().getName());\n\t\t\n\t\tjava.util.List<LogFactoryParameter> parameters = loggerTopic != null ? logDeclaration.getParametersWithTopic() : logDeclaration.getParametersWithoutTopic();\n\t\tJCExpression[] factoryParameters = createFactoryParameters(typeNode, loggingType, parameters, loggerTopic);\n\t\tJCMethodInvocation factoryMethodCall = maker.Apply(List.<JCExpression>nil(), factoryMethod, List.<JCExpression>from(factoryParameters));\n\t\t\n\t\tJCVariableDecl fieldDecl = recursiveSetGeneratedBy(maker.VarDef(\n\t\t\tmaker.Modifiers(toJavacModifier(access) | Flags.FINAL | (useStatic ? Flags.STATIC : 0)),\n\t\t\ttypeNode.toName(logFieldName), loggerType, factoryMethodCall), source);\n\t\t\n\t\tif (isRecord(typeNode) && Javac.getJavaCompilerVersion() < 16) {\n\t\t\t// This is a workaround for https://bugs.openjdk.java.net/browse/JDK-8243057 - note that the workaround is only for static fields in records, but our infra _requires_ `static` for logs in records (think about it).\n\t\t\t\n\t\t\tinjectField(typeNode, fieldDecl);\n\t\t} else {\n\t\t\tinjectFieldAndMarkGenerated(typeNode, fieldDecl);\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\tprivate static JCExpression[] createFactoryParameters(JavacNode typeNode, JCFieldAccess loggingType, java.util.List<LogFactoryParameter> parameters, JCExpression loggerTopic) {\n\t\tJCExpression[] expressions = new JCExpression[parameters.size()];\n\t\tJavacTreeMaker maker = typeNode.getTreeMaker();\n\t\t\n\t\tfor (int i = 0; i < parameters.size(); i++) {\n\t\t\tLogFactoryParameter parameter = parameters.get(i);\n\t\t\tswitch (parameter) {\n\t\t\tcase TYPE:\n\t\t\t\texpressions[i] = cloneType(maker, loggingType, typeNode);\n\t\t\t\tbreak;\n\t\t\tcase NAME:\n\t\t\t\tJCExpression method = maker.Select(loggingType, typeNode.toName(\"getName\"));\n\t\t\t\texpressions[i] = maker.Apply(List.<JCExpression>nil(), method, List.<JCExpression>nil());\n\t\t\t\tbreak;\n\t\t\tcase TOPIC:\n\t\t\t\tJCExpression topicExpression = copyExpression(loggerTopic, maker);\n\t\t\t\trecursiveSetGeneratedBy(topicExpression, typeNode);\n\t\t\t\texpressions[i] = topicExpression;\n\t\t\t\tbreak;\n\t\t\tcase NULL:\n\t\t\t\texpressions[i] = maker.Literal(CTC_BOT, null);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new IllegalStateException(\"Unknown logger factory parameter type: \" + parameter);\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn expressions;\n\t}\n\t\n\t/**\n\t * Handles the {@link lombok.extern.apachecommons.CommonsLog} annotation for javac.\n\t */\n\t@Provides\n\tpublic static class HandleCommonsLog extends JavacAnnotationHandler<lombok.extern.apachecommons.CommonsLog> {\n\t\t@Override public void handle(AnnotationValues<lombok.extern.apachecommons.CommonsLog> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.LOG_COMMONS_FLAG_USAGE, \"@apachecommons.CommonsLog\", ConfigurationKeys.LOG_ANY_FLAG_USAGE, \"any @Log\");\n\t\t\tprocessAnnotation(LoggingFramework.COMMONS, annotation.getInstance().access(), annotation, annotationNode);\n\t\t}\n\t}\n\t\n\t/**\n\t * Handles the {@link lombok.extern.java.Log} annotation for javac.\n\t */\n\t@Provides\n\tpublic static class HandleJulLog extends JavacAnnotationHandler<lombok.extern.java.Log> {\n\t\t@Override public void handle(AnnotationValues<lombok.extern.java.Log> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.LOG_JUL_FLAG_USAGE, \"@java.Log\", ConfigurationKeys.LOG_ANY_FLAG_USAGE, \"any @Log\");\n\t\t\tprocessAnnotation(LoggingFramework.JUL, annotation.getInstance().access(), annotation, annotationNode);\n\t\t}\n\t}\n\t\n\t/**\n\t * Handles the {@link lombok.extern.log4j.Log4j} annotation for javac.\n\t */\n\t@Provides\n\tpublic static class HandleLog4jLog extends JavacAnnotationHandler<lombok.extern.log4j.Log4j> {\n\t\t@Override public void handle(AnnotationValues<lombok.extern.log4j.Log4j> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.LOG_LOG4J_FLAG_USAGE, \"@Log4j\", ConfigurationKeys.LOG_ANY_FLAG_USAGE, \"any @Log\");\n\t\t\tprocessAnnotation(LoggingFramework.LOG4J, annotation.getInstance().access(), annotation, annotationNode);\n\t\t}\n\t}\n\t\n\t/**\n\t * Handles the {@link lombok.extern.log4j.Log4j2} annotation for javac.\n\t */\n\t@Provides\n\tpublic static class HandleLog4j2Log extends JavacAnnotationHandler<lombok.extern.log4j.Log4j2> {\n\t\t@Override public void handle(AnnotationValues<lombok.extern.log4j.Log4j2> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.LOG_LOG4J2_FLAG_USAGE, \"@Log4j2\", ConfigurationKeys.LOG_ANY_FLAG_USAGE, \"any @Log\");\n\t\t\tprocessAnnotation(LoggingFramework.LOG4J2, annotation.getInstance().access(), annotation, annotationNode);\n\t\t}\n\t}\n\t\n\t/**\n\t * Handles the {@link lombok.extern.slf4j.Slf4j} annotation for javac.\n\t */\n\t@Provides\n\tpublic static class HandleSlf4jLog extends JavacAnnotationHandler<lombok.extern.slf4j.Slf4j> {\n\t\t@Override public void handle(AnnotationValues<lombok.extern.slf4j.Slf4j> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.LOG_SLF4J_FLAG_USAGE, \"@Slf4j\", ConfigurationKeys.LOG_ANY_FLAG_USAGE, \"any @Log\");\n\t\t\tprocessAnnotation(LoggingFramework.SLF4J, annotation.getInstance().access(), annotation, annotationNode);\n\t\t}\n\t}\n\t\n\t/**\n\t * Handles the {@link lombok.extern.slf4j.XSlf4j} annotation for javac.\n\t */\n\t@Provides\n\tpublic static class HandleXSlf4jLog extends JavacAnnotationHandler<lombok.extern.slf4j.XSlf4j> {\n\t\t@Override public void handle(AnnotationValues<lombok.extern.slf4j.XSlf4j> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.LOG_XSLF4J_FLAG_USAGE, \"@XSlf4j\", ConfigurationKeys.LOG_ANY_FLAG_USAGE, \"any @Log\");\n\t\t\tprocessAnnotation(LoggingFramework.XSLF4J, annotation.getInstance().access(), annotation, annotationNode);\n\t\t}\n\t}\n\t\n\t/**\n\t * Handles the {@link lombok.extern.jbosslog.JBossLog} annotation for javac.\n\t */\n\t@Provides\n\tpublic static class HandleJBossLog extends JavacAnnotationHandler<lombok.extern.jbosslog.JBossLog> {\n\t\t@Override public void handle(AnnotationValues<lombok.extern.jbosslog.JBossLog> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.LOG_JBOSSLOG_FLAG_USAGE, \"@JBossLog\", ConfigurationKeys.LOG_ANY_FLAG_USAGE, \"any @Log\");\n\t\t\tprocessAnnotation(LoggingFramework.JBOSSLOG, annotation.getInstance().access(), annotation, annotationNode);\n\t\t}\n\t}\n\t\n\t/**\n\t * Handles the {@link lombok.extern.flogger.Flogger} annotation for javac.\n\t */\n\t@Provides\n\tpublic static class HandleFloggerLog extends JavacAnnotationHandler<lombok.extern.flogger.Flogger> {\n\t\t@Override public void handle(AnnotationValues<lombok.extern.flogger.Flogger> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.LOG_FLOGGER_FLAG_USAGE, \"@Flogger\", ConfigurationKeys.LOG_ANY_FLAG_USAGE, \"any @Log\");\n\t\t\tprocessAnnotation(LoggingFramework.FLOGGER, annotation.getInstance().access(), annotation, annotationNode);\n\t\t}\n\t}\n\t\n\t/**\n\t * Handles the {@link lombok.CustomLog} annotation for javac.\n\t */\n\t@Provides\n\tpublic static class HandleCustomLog extends JavacAnnotationHandler<lombok.CustomLog> {\n\t\t@Override public void handle(AnnotationValues<lombok.CustomLog> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.LOG_CUSTOM_FLAG_USAGE, \"@CustomLog\", ConfigurationKeys.LOG_ANY_FLAG_USAGE, \"any @Log\");\n\t\t\tLogDeclaration logDeclaration = annotationNode.getAst().readConfiguration(ConfigurationKeys.LOG_CUSTOM_DECLARATION);\n\t\t\tif (logDeclaration == null) {\n\t\t\t\tannotationNode.addError(\"The @CustomLog is not configured; please set lombok.log.custom.declaration in lombok.config.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tLoggingFramework framework = new LoggingFramework(lombok.CustomLog.class, logDeclaration);\n\t\t\tprocessAnnotation(framework, annotation.getInstance().access(), annotation, annotationNode);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleNonNull.java",
    "content": "/*\n * Copyright (C) 2013-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.handleFlagUsage;\nimport static lombok.javac.Javac.*;\nimport static lombok.javac.JavacTreeMaker.TreeTag.treeTag;\nimport static lombok.javac.JavacTreeMaker.TypeTag.typeTag;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport java.util.ArrayList;\n\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCAssert;\nimport com.sun.tools.javac.tree.JCTree.JCAssign;\nimport com.sun.tools.javac.tree.JCTree.JCBinary;\nimport com.sun.tools.javac.tree.JCTree.JCBlock;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCExpressionStatement;\nimport com.sun.tools.javac.tree.JCTree.JCFieldAccess;\nimport com.sun.tools.javac.tree.JCTree.JCIdent;\nimport com.sun.tools.javac.tree.JCTree.JCIf;\nimport com.sun.tools.javac.tree.JCTree.JCLiteral;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCMethodInvocation;\nimport com.sun.tools.javac.tree.JCTree.JCModifiers;\nimport com.sun.tools.javac.tree.JCTree.JCParens;\nimport com.sun.tools.javac.tree.JCTree.JCStatement;\nimport com.sun.tools.javac.tree.JCTree.JCSynchronized;\nimport com.sun.tools.javac.tree.JCTree.JCThrow;\nimport com.sun.tools.javac.tree.JCTree.JCTry;\nimport com.sun.tools.javac.tree.JCTree.JCTypeParameter;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.ListBuffer;\nimport com.sun.tools.javac.util.Name;\n\nimport lombok.AccessLevel;\nimport lombok.ConfigurationKeys;\nimport lombok.NonNull;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacTreeMaker;\nimport lombok.spi.Provides;\n\n@Provides\n@HandlerPriority(value = 512) // 2^9; onParameter=@__(@NonNull) has to run first.\npublic class HandleNonNull extends JavacAnnotationHandler<NonNull> {\n\tprivate JCMethodDecl createRecordArgslessConstructor(JavacNode typeNode, JavacNode source, JCMethodDecl existingCtr) {\n\t\tJavacTreeMaker maker = typeNode.getTreeMaker();\n\t\t\n\t\tjava.util.List<JCVariableDecl> fields = new ArrayList<JCVariableDecl>();\n\t\tfor (JavacNode child : typeNode.down()) {\n\t\t\tif (child.getKind() == Kind.FIELD) {\n\t\t\t\tJCVariableDecl v = (JCVariableDecl) child.get();\n\t\t\t\tif ((v.mods.flags & RECORD) != 0) {\n\t\t\t\t\tfields.add(v);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tListBuffer<JCVariableDecl> params = new ListBuffer<JCVariableDecl>();\n\t\t\n\t\tfor (int i = 0; i < fields.size(); i++) {\n\t\t\tJCVariableDecl arg = fields.get(i);\n\t\t\tJCModifiers mods = maker.Modifiers(GENERATED_MEMBER | Flags.PARAMETER, arg.mods.annotations);\n\t\t\tparams.append(maker.VarDef(mods, arg.name, arg.vartype, null));\n\t\t}\n\t\t\n\t\tJCModifiers mods = maker.Modifiers(toJavacModifier(AccessLevel.PUBLIC) | COMPACT_RECORD_CONSTRUCTOR, List.<JCAnnotation>nil());\n\t\tJCBlock body = maker.Block(0L, List.<JCStatement>nil());\n\t\tJCMethodDecl constuctor = existingCtr;\n\t\tif (constuctor == null) {\n\t\t\tconstuctor = maker.MethodDef(mods, typeNode.toName(\"<init>\"), null, List.<JCTypeParameter>nil(), params.toList(), List.<JCExpression>nil(), body, null);\n\t\t} else {\n\t\t\tconstuctor.mods = mods;\n\t\t\tconstuctor.body = body;\n\t\t}\n\t\trecursiveSetGeneratedBy(constuctor, source);\n\t\taddSuppressWarningsAll(constuctor.mods, typeNode, source, typeNode.getContext());\n\t\taddGenerated(constuctor.mods, typeNode, source, typeNode.getContext());\n\t\treturn constuctor;\n\t}\n\t\n\t/**\n\t * If the provided typeNode is a record, returns the compact constructor (there should only be one, but if the file is\n\t * not semantically sound there might be more). If the only one in existence is the default auto-generated one, it is removed,\n\t * a new explicit one is created, and that one is returned in a list.\n\t * \n\t * Otherwise, an empty list is returned.\n\t */\n\tprivate List<JCMethodDecl> addCompactConstructorIfNeeded(JavacNode typeNode, JavacNode source) {\n\t\tList<JCMethodDecl> answer = List.nil();\n\t\t\n\t\tif (typeNode == null || !(typeNode.get() instanceof JCClassDecl)) return answer;\n\t\t\n\t\tJCClassDecl cDecl = (JCClassDecl) typeNode.get();\n\t\tif ((cDecl.mods.flags & RECORD) == 0) return answer;\n\t\t\n\t\tboolean generateConstructor = false;\n\t\t\n\t\tJCMethodDecl existingCtr = null;\n\t\t\n\t\tfor (JCTree def : cDecl.defs) {\n\t\t\tif (def instanceof JCMethodDecl) {\n\t\t\t\tJCMethodDecl md = (JCMethodDecl) def;\n\t\t\t\tif (md.name.contentEquals(\"<init>\")) {\n\t\t\t\t\tif ((md.mods.flags & Flags.GENERATEDCONSTR) != 0) {\n\t\t\t\t\t\texistingCtr = md;\n\t\t\t\t\t\tgenerateConstructor = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (!isTolerate(typeNode, md)) {\n\t\t\t\t\t\t\tif ((md.mods.flags & COMPACT_RECORD_CONSTRUCTOR) != 0) {\n\t\t\t\t\t\t\t\tgenerateConstructor = false;\n\t\t\t\t\t\t\t\tanswer = answer.prepend(md);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (generateConstructor) {\n\t\t\tJCMethodDecl ctr;\n\t\t\tif (existingCtr != null) {\n\t\t\t\tctr = createRecordArgslessConstructor(typeNode, source, existingCtr);\n\t\t\t} else {\n\t\t\t\tctr = createRecordArgslessConstructor(typeNode, source, null);\n\t\t\t\tinjectMethod(typeNode, ctr);\n\t\t\t}\n\t\t\tanswer = answer.prepend(ctr);\n\t\t}\n\t\t\n\t\treturn answer;\n\t}\n\t\n\tprivate void addNullCheckIfNeeded(JCMethodDecl method, JavacNode paramNode, JavacNode source) {\n\t\t// Possibly, if 'declaration instanceof ConstructorDeclaration', fetch declaration.constructorCall, search it for any references to our parameter,\n\t\t// and if they exist, create a new method in the class: 'private static <T> T lombok$nullCheck(T expr, String msg) {if (expr == null) throw NPE; return expr;}' and\n\t\t// wrap all references to it in the super/this to a call to this method.\n\t\t\n\t\tJCStatement nullCheck = recursiveSetGeneratedBy(generateNullCheck(source.getTreeMaker(), paramNode, source), source);\n\t\t\n\t\tif (nullCheck == null) {\n\t\t\t// @NonNull applied to a primitive. Kinda pointless. Let's generate a warning.\n\t\t\tsource.addWarning(\"@NonNull is meaningless on a primitive.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tList<JCStatement> statements = method.body.stats;\n\t\t\n\t\tString expectedName = paramNode.getName();\n\t\t\n\t\t/* Abort if the null check is already there, delving into try and synchronized statements */ {\n\t\t\tList<JCStatement> stats = statements;\n\t\t\tint idx = 0;\n\t\t\twhile (stats.size() > idx) {\n\t\t\t\tJCStatement stat = stats.get(idx++);\n\t\t\t\tif (JavacHandlerUtil.isConstructorCall(stat)) continue;\n\t\t\t\tif (stat instanceof JCTry) {\n\t\t\t\t\tstats = ((JCTry) stat).body.stats;\n\t\t\t\t\tidx = 0;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (stat instanceof JCSynchronized) {\n\t\t\t\t\tstats = ((JCSynchronized) stat).body.stats;\n\t\t\t\t\tidx = 0;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tString varNameOfNullCheck = returnVarNameIfNullCheck(stat);\n\t\t\t\tif (varNameOfNullCheck == null) break;\n\t\t\t\tif (varNameOfNullCheck.equals(expectedName)) return;\n\t\t\t}\n\t\t}\n\t\t\n\t\tList<JCStatement> tail = statements;\n\t\tList<JCStatement> head = List.nil();\n\t\tfor (JCStatement stat : statements) {\n\t\t\tif (JavacHandlerUtil.isConstructorCall(stat) || (JavacHandlerUtil.isGenerated(stat) && isNullCheck(stat))) {\n\t\t\t\ttail = tail.tail;\n\t\t\t\thead = head.prepend(stat);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\t\n\t\tList<JCStatement> newList = tail.prepend(nullCheck);\n\t\tfor (JCStatement stat : head) newList = newList.prepend(stat);\n\t\tmethod.body.stats = newList;\n\t\tsource.getAst().setChanged();\n\t}\n\t\n\t@Override public void handle(AnnotationValues<NonNull> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.NON_NULL_FLAG_USAGE, \"@NonNull\");\n\t\t\n\t\tfinal JavacNode node;\n\t\tif (annotationNode.up().getKind() == Kind.TYPE_USE) {\n\t\t\tnode = annotationNode.directUp().directUp();\n\t\t} else {\n\t\t\tnode = annotationNode.up();\n\t\t}\n\t\t\n\t\tif (node.getKind() == Kind.FIELD) {\n\t\t\t// This is meaningless unless the field is used to generate a method (@Setter, @RequiredArgsConstructor, etc),\n\t\t\t// but in that case those handlers will take care of it. However, we DO check if the annotation is applied to\n\t\t\t// a primitive, because those handlers trigger on any annotation named @NonNull and we only want the warning\n\t\t\t// behaviour on _OUR_ 'lombok.NonNull'.\n\t\t\t\n\t\t\ttry {\n\t\t\t\tif (isPrimitive(((JCVariableDecl) node.get()).vartype)) {\n\t\t\t\t\tannotationNode.addWarning(\"@NonNull is meaningless on a primitive.\");\n\t\t\t\t}\n\t\t\t} catch (Exception ignore) {}\n\t\t\t\n\t\t\tJCVariableDecl fDecl = (JCVariableDecl) node.get();\n\t\t\tif ((fDecl.mods.flags & RECORD) != 0) {\n\t\t\t\t// well, these kinda double as parameters (of the compact constructor), so we do some work here.\n\t\t\t\t\n\t\t\t\tList<JCMethodDecl> compactConstructors = addCompactConstructorIfNeeded(node.up(), annotationNode);\n\t\t\t\tfor (JCMethodDecl ctr : compactConstructors) {\n\t\t\t\t\taddNullCheckIfNeeded(ctr, node, annotationNode);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (node.getKind() != Kind.ARGUMENT) return;\n\t\t\n\t\tJCMethodDecl declaration;\n\t\ttry {\n\t\t\tdeclaration = (JCMethodDecl) node.up().get();\n\t\t} catch (Exception e) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (declaration.body == null) {\n\t\t\t// This used to be a warning, but as @NonNull also has a documentary purpose, better to not warn about this. Since 1.16.7\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif ((declaration.mods.flags & (GENERATED_MEMBER | COMPACT_RECORD_CONSTRUCTOR)) != 0) {\n\t\t\t// The 'real' annotations are on the `record Foo(@NonNull Obj x)` part and we just see these\n\t\t\t// syntax-sugared over. We deal with it on the field declaration variant, as those are always there,\n\t\t\t// not dependent on whether you write out the compact constructor or not.\n\t\t\treturn;\n\t\t}\n\t\t\n\t\taddNullCheckIfNeeded(declaration, node, annotationNode);\n\t}\n\t\n\tpublic boolean isNullCheck(JCStatement stat) {\n\t\treturn returnVarNameIfNullCheck(stat) != null;\n\t}\n\t\n\t/**\n\t * Checks if the statement is of the form 'if (x == null) {throw WHATEVER;}' or 'assert x != null;',\n\t * where the block braces are optional. If it is of this form, returns \"x\".\n\t * If it is not of this form, returns null.\n\t */\n\tpublic String returnVarNameIfNullCheck(JCStatement stat) {\n\t\tboolean isIf = stat instanceof JCIf;\n\t\tboolean isExpression = stat instanceof JCExpressionStatement;\n\t\tif (!isIf && !(stat instanceof JCAssert) && !isExpression) return null;\n\t\t\n\t\tif (isExpression) {\n\t\t\t/* Check if the statements contains a call to checkNotNull or requireNonNull */\n\t\t\tJCExpression expression = ((JCExpressionStatement) stat).expr;\n\t\t\tif (expression instanceof JCAssign) expression = ((JCAssign) expression).rhs;\n\t\t\tif (!(expression instanceof JCMethodInvocation)) return null;\n\t\t\t\n\t\t\tJCMethodInvocation invocation = (JCMethodInvocation) expression;\n\t\t\tJCExpression method = invocation.meth;\n\t\t\tName name = null;\n\t\t\tif (method instanceof JCFieldAccess) {\n\t\t\t\tname = ((JCFieldAccess) method).name;\n\t\t\t} else if (method instanceof JCIdent) {\n\t\t\t\tname = ((JCIdent) method).name;\n\t\t\t}\n\t\t\tif (name == null || (!name.contentEquals(\"checkNotNull\") && !name.contentEquals(\"requireNonNull\"))) return null;\n\t\t\t\n\t\t\tif (invocation.args.isEmpty()) return null;\n\t\t\tJCExpression firstArgument = invocation.args.head;\n\t\t\tif (!(firstArgument instanceof JCIdent)) return null;\n\t\t\treturn firstArgument.toString();\n\t\t}\n\t\t\n\t\tif (isIf) {\n\t\t\t/* Check that the if's statement is a throw statement, possibly in a block. */\n\t\t\tJCStatement then = ((JCIf) stat).thenpart;\n\t\t\tif (then instanceof JCBlock) {\n\t\t\t\tList<JCStatement> stats = ((JCBlock) then).stats;\n\t\t\t\tif (stats.length() == 0) return null;\n\t\t\t\tthen = stats.get(0);\n\t\t\t}\n\t\t\tif (!(then instanceof JCThrow)) return null;\n\t\t}\n\t\t\n\t\t/* Check that the if's conditional is like 'x == null'. Return from this method (don't generate\n\t\t   a nullcheck) if 'x' is equal to our own variable's name: There's already a nullcheck here. */ {\n\t\t\tJCExpression cond = isIf ? ((JCIf) stat).cond : ((JCAssert) stat).cond;\n\t\t\twhile (cond instanceof JCParens) cond = ((JCParens) cond).expr;\n\t\t\tif (!(cond instanceof JCBinary)) return null;\n\t\t\tJCBinary bin = (JCBinary) cond;\n\t\t\tif (isIf) {\n\t\t\t\tif (!CTC_EQUAL.equals(treeTag(bin))) return null;\n\t\t\t} else {\n\t\t\t\tif (!CTC_NOT_EQUAL.equals(treeTag(bin))) return null;\n\t\t\t}\n\t\t\tif (!(bin.lhs instanceof JCIdent)) return null;\n\t\t\tif (!(bin.rhs instanceof JCLiteral)) return null;\n\t\t\tif (!CTC_BOT.equals(typeTag(bin.rhs))) return null;\n\t\t\treturn ((JCIdent) bin.lhs).name.toString();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandlePrintAST.java",
    "content": "/*\n * Copyright (C) 2009-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport java.io.File;\nimport java.io.FileNotFoundException;\nimport java.io.PrintStream;\n\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\n\nimport lombok.Lombok;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.core.PrintAST;\nimport lombok.javac.JavacASTVisitor;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.spi.Provides;\n\n/**\n * Handles the {@code lombok.core.PrintAST} annotation for javac.\n */\n@Provides\n@HandlerPriority(536870912) // 2^29; this handler is customarily run at the very end.\npublic class HandlePrintAST extends JavacAnnotationHandler<PrintAST> {\n\t@Override public void handle(AnnotationValues<PrintAST> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\tPrintStream stream = System.out;\n\t\tString fileName = annotation.getInstance().outfile();\n\t\tif (fileName.length() > 0) try {\n\t\t\tstream = new PrintStream(new File(fileName));\n\t\t} catch (FileNotFoundException e) {\n\t\t\tthrow Lombok.sneakyThrow(e);\n\t\t}\n\t\t\n\t\ttry {\n\t\t\tannotationNode.up().traverse(new JavacASTVisitor.Printer(annotation.getInstance().printContent(), stream));\n\t\t} finally {\n\t\t\tif (stream != System.out) {\n\t\t\t\ttry {\n\t\t\t\t\tstream.close();\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t\tthrow Lombok.sneakyThrow(e);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleSetter.java",
    "content": "/*\n * Copyright (C) 2009-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.javac.Javac.*;\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport java.util.Collection;\n\nimport lombok.AccessLevel;\nimport lombok.ConfigurationKeys;\nimport lombok.Setter;\nimport lombok.core.AST.Kind;\nimport lombok.experimental.Accessors;\nimport lombok.core.AnnotationValues;\nimport lombok.javac.Javac;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacTreeMaker;\nimport lombok.spi.Provides;\n\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCAssign;\nimport com.sun.tools.javac.tree.JCTree.JCBlock;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCReturn;\nimport com.sun.tools.javac.tree.JCTree.JCStatement;\nimport com.sun.tools.javac.tree.JCTree.JCTypeParameter;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.ListBuffer;\nimport com.sun.tools.javac.util.Name;\n\n/**\n * Handles the {@code lombok.Setter} annotation for javac.\n */\n@Provides\npublic class HandleSetter extends JavacAnnotationHandler<Setter> {\n\tprivate static final String SETTER_NODE_NOT_SUPPORTED_ERR = \"@Setter is only supported on a class or a field.\";\n\t\n\tpublic void generateSetterForType(JavacNode typeNode, JavacNode errorNode, AccessLevel level, boolean checkForTypeLevelSetter, List<JCAnnotation> onMethod, List<JCAnnotation> onParam) {\n\t\tif (checkForTypeLevelSetter) {\n\t\t\tif (hasAnnotation(Setter.class, typeNode)) {\n\t\t\t\t//The annotation will make it happen, so we can skip it.\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (!isClass(typeNode)) {\n\t\t\terrorNode.addError(SETTER_NODE_NOT_SUPPORTED_ERR);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tfor (JavacNode field : typeNode.down()) {\n\t\t\tif (field.getKind() != Kind.FIELD) continue;\n\t\t\tJCVariableDecl fieldDecl = (JCVariableDecl) field.get();\n\t\t\t//Skip fields that start with $\n\t\t\tif (fieldDecl.name.toString().startsWith(\"$\")) continue;\n\t\t\t//Skip static fields.\n\t\t\tif ((fieldDecl.mods.flags & Flags.STATIC) != 0) continue;\n\t\t\t//Skip final fields.\n\t\t\tif ((fieldDecl.mods.flags & Flags.FINAL) != 0) continue;\n\t\t\t\n\t\t\tgenerateSetterForField(field, errorNode, level, onMethod, onParam);\n\t\t}\n\t}\n\t\n\t/**\n\t * Generates a setter on the stated field.\n\t * \n\t * Used by {@link HandleData}.\n\t * \n\t * The difference between this call and the handle method is as follows:\n\t * \n\t * If there is a {@code lombok.Setter} annotation on the field, it is used and the\n\t * same rules apply (e.g. warning if the method already exists, stated access level applies).\n\t * If not, the setter is still generated if it isn't already there, though there will not\n\t * be a warning if its already there. The default access level is used.\n\t * \n\t * @param fieldNode The node representing the field you want a setter for.\n\t * @param pos The node responsible for generating the setter (the {@code @Data} or {@code @Setter} annotation).\n\t */\n\tpublic void generateSetterForField(JavacNode fieldNode, JavacNode sourceNode, AccessLevel level, List<JCAnnotation> onMethod, List<JCAnnotation> onParam) {\n\t\tif (hasAnnotation(Setter.class, fieldNode)) {\n\t\t\t//The annotation will make it happen, so we can skip it.\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tcreateSetterForField(level, fieldNode, sourceNode, false, onMethod, onParam);\n\t}\n\t\n\t@Override public void handle(AnnotationValues<Setter> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.SETTER_FLAG_USAGE, \"@Setter\");\n\t\t\n\t\tCollection<JavacNode> fields = annotationNode.upFromAnnotationToFields();\n\t\tdeleteAnnotationIfNeccessary(annotationNode, Setter.class);\n\t\tdeleteImportFromCompilationUnit(annotationNode, \"lombok.AccessLevel\");\n\t\tJavacNode node = annotationNode.up();\n\t\tAccessLevel level = annotation.getInstance().value();\n\t\t\n\t\tif (level == AccessLevel.NONE || node == null) return;\n\t\t\n\t\tList<JCAnnotation> onMethod = unboxAndRemoveAnnotationParameter(ast, \"onMethod\", \"@Setter(onMethod\", annotationNode);\n\t\tif (!onMethod.isEmpty()) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.ON_X_FLAG_USAGE, \"@Setter(onMethod=...)\");\n\t\t}\n\t\tList<JCAnnotation> onParam = unboxAndRemoveAnnotationParameter(ast, \"onParam\", \"@Setter(onParam\", annotationNode);\n\t\tif (!onParam.isEmpty()) {\n\t\t\thandleFlagUsage(annotationNode, ConfigurationKeys.ON_X_FLAG_USAGE, \"@Setter(onParam=...)\");\n\t\t}\n\t\t\n\t\tswitch (node.getKind()) {\n\t\tcase FIELD:\n\t\t\tcreateSetterForFields(level, fields, annotationNode, true, onMethod, onParam);\n\t\t\tbreak;\n\t\tcase TYPE:\n\t\t\tgenerateSetterForType(node, annotationNode, level, false, onMethod, onParam);\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tpublic void createSetterForFields(AccessLevel level, Collection<JavacNode> fieldNodes, JavacNode errorNode, boolean whineIfExists, List<JCAnnotation> onMethod, List<JCAnnotation> onParam) {\n\t\tfor (JavacNode fieldNode : fieldNodes) {\n\t\t\tcreateSetterForField(level, fieldNode, errorNode, whineIfExists, onMethod, onParam);\n\t\t}\n\t}\n\t\n\tpublic void createSetterForField(AccessLevel level, JavacNode fieldNode, JavacNode sourceNode, boolean whineIfExists, List<JCAnnotation> onMethod, List<JCAnnotation> onParam) {\n\t\tif (fieldNode.getKind() != Kind.FIELD) {\n\t\t\tfieldNode.addError(SETTER_NODE_NOT_SUPPORTED_ERR);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tAnnotationValues<Accessors> accessors = JavacHandlerUtil.getAccessorsForField(fieldNode);\n\t\tJCVariableDecl fieldDecl = (JCVariableDecl) fieldNode.get();\n\t\tString methodName = toSetterName(fieldNode, accessors);\n\t\t\n\t\tif (methodName == null) {\n\t\t\tfieldNode.addWarning(\"Not generating setter for this field: It does not fit your @Accessors prefix list.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif ((fieldDecl.mods.flags & Flags.FINAL) != 0) {\n\t\t\tfieldNode.addWarning(\"Not generating setter for this field: Setters cannot be generated for final fields.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tfor (String altName : toAllSetterNames(fieldNode, accessors)) {\n\t\t\tswitch (methodExists(altName, fieldNode, false, 1)) {\n\t\t\tcase EXISTS_BY_LOMBOK:\n\t\t\t\treturn;\n\t\t\tcase EXISTS_BY_USER:\n\t\t\t\tif (whineIfExists) {\n\t\t\t\t\tString altNameExpl = \"\";\n\t\t\t\t\tif (!altName.equals(methodName)) altNameExpl = String.format(\" (%s)\", altName);\n\t\t\t\t\tfieldNode.addWarning(\n\t\t\t\t\t\tString.format(\"Not generating %s(): A method with that name already exists%s\", methodName, altNameExpl));\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\tcase NOT_EXISTS:\n\t\t\t\t//continue scanning the other alt names.\n\t\t\t}\n\t\t}\n\t\t\n\t\tlong access = toJavacModifier(level) | (fieldDecl.mods.flags & Flags.STATIC);\n\t\t\n\t\tJCMethodDecl createdSetter = createSetter(access, fieldNode, fieldNode.getTreeMaker(), sourceNode, onMethod, onParam);\n\t\tinjectMethod(fieldNode.up(), createdSetter);\n\t}\n\t\n\tpublic static JCMethodDecl createSetter(long access, JavacNode field, JavacTreeMaker treeMaker, JavacNode source, List<JCAnnotation> onMethod, List<JCAnnotation> onParam) {\n\t\tAnnotationValues<Accessors> accessors = JavacHandlerUtil.getAccessorsForField(field);\n\t\tString setterName = toSetterName(field, accessors);\n\t\tboolean returnThis = shouldReturnThis(field, accessors);\n\t\tJCMethodDecl setter = createSetter(access, false, field, treeMaker, setterName, null, null, returnThis, source, onMethod, onParam);\n\t\treturn setter;\n\t}\n\t\n\tpublic static JCMethodDecl createSetter(long access, boolean deprecate, JavacNode field, JavacTreeMaker treeMaker, String setterName, Name paramName, Name booleanFieldToSet, boolean shouldReturnThis, JavacNode source, List<JCAnnotation> onMethod, List<JCAnnotation> onParam) {\n\t\tJCExpression returnType = null;\n\t\tJCReturn returnStatement = null;\n\t\tif (shouldReturnThis) {\n\t\t\treturnType = cloneSelfType(field);\n\t\t\treturnType = addCheckerFrameworkReturnsReceiver(returnType, treeMaker, field, getCheckerFrameworkVersion(source));\n\t\t\treturnStatement = treeMaker.Return(treeMaker.Ident(field.toName(\"this\")));\n\t\t}\n\t\t\n\t\treturn createSetter(access, deprecate, field, treeMaker, setterName, paramName, booleanFieldToSet, returnType, returnStatement, source, onMethod, onParam);\n\t}\n\t\n\tpublic static JCMethodDecl createSetterWithRecv(long access, boolean deprecate, JavacNode field, JavacTreeMaker treeMaker, String setterName, Name paramName, Name booleanFieldToSet, boolean shouldReturnThis, JavacNode source, List<JCAnnotation> onMethod, List<JCAnnotation> onParam, JCVariableDecl recv, boolean forceAnnotationCopying) {\n\t\tJCExpression returnType = null;\n\t\tJCReturn returnStatement = null;\n\t\tif (shouldReturnThis) {\n\t\t\treturnType = cloneSelfType(field);\n\t\t\treturnType = addCheckerFrameworkReturnsReceiver(returnType, treeMaker, field, getCheckerFrameworkVersion(source));\n\t\t\treturnStatement = treeMaker.Return(treeMaker.Ident(field.toName(\"this\")));\n\t\t}\n\t\t\n\t\tJCMethodDecl d = createSetterWithRecv(access, deprecate, field, treeMaker, setterName, paramName, booleanFieldToSet, returnType, returnStatement, source, onMethod, onParam, recv);\n\t\treturn d;\n\t}\n\t\n\tpublic static JCMethodDecl createSetter(long access, boolean deprecate, JavacNode field, JavacTreeMaker treeMaker, String setterName, Name paramName, Name booleanFieldToSet, JCExpression methodType, JCStatement returnStatement, JavacNode source, List<JCAnnotation> onMethod, List<JCAnnotation> onParam) {\n\t\treturn createSetterWithRecv(access, deprecate, field, treeMaker, setterName, paramName, booleanFieldToSet, methodType, returnStatement, source, onMethod, onParam, null);\n\t}\n\t\n\tpublic static JCMethodDecl createSetterWithRecv(long access, boolean deprecate, JavacNode field, JavacTreeMaker treeMaker, String setterName, Name paramName, Name booleanFieldToSet, JCExpression methodType, JCStatement returnStatement, JavacNode source, List<JCAnnotation> onMethod, List<JCAnnotation> onParam, JCVariableDecl recv) {\n\t\tif (setterName == null) return null;\n\t\t\n\t\tJCVariableDecl fieldDecl = (JCVariableDecl) field.get();\n\t\tif (paramName == null) paramName = fieldDecl.name;\n\t\t\n\t\tJCExpression fieldRef = createFieldAccessor(treeMaker, field, FieldAccess.ALWAYS_FIELD);\n\t\tJCAssign assign = treeMaker.Assign(fieldRef, treeMaker.Ident(paramName));\n\t\t\n\t\tListBuffer<JCStatement> statements = new ListBuffer<JCStatement>();\n\t\tList<JCAnnotation> copyableAnnotations = findCopyableAnnotations(field);\n\t\t\n\t\tName methodName = field.toName(setterName);\n\t\tList<JCAnnotation> annsOnParam = copyAnnotations(onParam, treeMaker).appendList(copyableAnnotations);\n\t\t\n\t\tlong flags = JavacHandlerUtil.addFinalIfNeeded(Flags.PARAMETER, field.getContext());\n\t\tJCExpression pType = cloneType(treeMaker, fieldDecl.vartype, source);\n\t\tJCVariableDecl param = treeMaker.VarDef(treeMaker.Modifiers(flags, annsOnParam), paramName, pType, null);\n\t\t\n\t\tif (!hasNonNullAnnotations(field) && !hasNonNullAnnotations(field, onParam)) {\n\t\t\tstatements.append(treeMaker.Exec(assign));\n\t\t} else {\n\t\t\tJCStatement nullCheck = generateNullCheck(treeMaker, fieldDecl.vartype, paramName, source, null);\n\t\t\tif (nullCheck != null) statements.append(nullCheck);\n\t\t\tstatements.append(treeMaker.Exec(assign));\n\t\t}\n\t\t\n\t\tif (booleanFieldToSet != null) {\n\t\t\tJCAssign setBool = treeMaker.Assign(treeMaker.Ident(booleanFieldToSet), treeMaker.Literal(CTC_BOOLEAN, 1));\n\t\t\tstatements.append(treeMaker.Exec(setBool));\n\t\t}\n\t\t\n\t\tif (methodType == null) {\n\t\t\t//WARNING: Do not use field.getSymbolTable().voidType - that field has gone through non-backwards compatible API changes within javac1.6.\n\t\t\tmethodType = treeMaker.Type(Javac.createVoidType(field.getSymbolTable(), CTC_VOID));\n\t\t\treturnStatement = null;\n\t\t}\n\t\t\n\t\tif (returnStatement != null) statements.append(returnStatement);\n\t\t\n\t\tJCBlock methodBody = treeMaker.Block(0, statements.toList());\n\t\tList<JCTypeParameter> methodGenericParams = List.nil();\n\t\tList<JCVariableDecl> parameters = List.of(param);\n\t\tList<JCExpression> throwsClauses = List.nil();\n\t\tJCExpression annotationMethodDefaultValue = null;\n\t\t\n\t\t// Copying Jackson annotations is required for fluent accessors (otherwise Jackson would not find the accessor).\n\t\tAnnotationValues<Accessors> accessors = JavacHandlerUtil.getAccessorsForField(field);\n\t\tboolean fluent = accessors.isExplicit(\"fluent\");\n\t\tBoolean fluentConfig = field.getAst().readConfiguration(ConfigurationKeys.ACCESSORS_FLUENT);\n\t\tif (fluentConfig != null && fluentConfig) fluent = fluentConfig;\n\t\t\n\t\tList<JCAnnotation> annsOnMethod = mergeAnnotations(copyAnnotations(onMethod, treeMaker), findCopyableToSetterAnnotations(field, fluent));\n\t\tif (isFieldDeprecated(field) || deprecate) {\n\t\t\tannsOnMethod = annsOnMethod.prepend(treeMaker.Annotation(genJavaLangTypeRef(field, \"Deprecated\"), List.<JCExpression>nil()));\n\t\t}\n\t\t\n\t\tif (shouldMakeFinal(field, accessors)) access |= Flags.FINAL;\n\t\tJCMethodDecl methodDef;\n\t\tif (recv != null && treeMaker.hasMethodDefWithRecvParam()) {\n\t\t\tmethodDef = treeMaker.MethodDefWithRecvParam(treeMaker.Modifiers(access, annsOnMethod), methodName, methodType,\n\t\t\t\tmethodGenericParams, recv, parameters, throwsClauses, methodBody, annotationMethodDefaultValue);\n\t\t} else {\n\t\t\tmethodDef = treeMaker.MethodDef(treeMaker.Modifiers(access, annsOnMethod), methodName, methodType,\n\t\t\t\tmethodGenericParams, parameters, throwsClauses, methodBody, annotationMethodDefaultValue);\n\t\t}\n\t\tif (returnStatement != null) createRelevantNonNullAnnotation(source, methodDef);\n\t\tJCMethodDecl decl = recursiveSetGeneratedBy(methodDef, source);\n\t\tcopyJavadoc(field, decl, CopyJavadoc.SETTER, returnStatement != null);\n\t\treturn decl;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleSingularRemove.java",
    "content": "/*\n * Copyright (C) 2023 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\n\nimport lombok.Singular;\nimport lombok.core.AlreadyHandledAnnotations;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.spi.Provides;\n\n@Provides\n@HandlerPriority(32768)\n@AlreadyHandledAnnotations\npublic class HandleSingularRemove extends JavacAnnotationHandler<Singular> {\n\t@Override public void handle(AnnotationValues<Singular> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\tdeleteAnnotationIfNeccessary(annotationNode, Singular.class);\n\t\tdeleteImportFromCompilationUnit(annotationNode, Singular.class.getName());\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleSneakyThrows.java",
    "content": "/*\n * Copyright (C) 2009-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Collections;\n\nimport lombok.ConfigurationKeys;\nimport lombok.SneakyThrows;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacTreeMaker;\nimport lombok.spi.Provides;\n\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCBlock;\nimport com.sun.tools.javac.tree.JCTree.JCCompilationUnit;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCStatement;\nimport com.sun.tools.javac.tree.JCTree.JCTry;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.util.List;\nimport lombok.javac.Javac;\n\n/**\n * Handles the {@code lombok.SneakyThrows} annotation for javac.\n */\n@Provides\n@HandlerPriority(value = 1024) // 2^10; @NonNull must have run first, so that we wrap around the statements generated by it.\npublic class HandleSneakyThrows extends JavacAnnotationHandler<SneakyThrows> {\n\t@Override public void handle(AnnotationValues<SneakyThrows> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.SNEAKY_THROWS_FLAG_USAGE, \"@SneakyThrows\");\n\t\t\n\t\tdeleteAnnotationIfNeccessary(annotationNode, SneakyThrows.class);\n\t\tCollection<String> exceptionNames = annotation.getRawExpressions(\"value\");\n\t\tif (exceptionNames.isEmpty()) {\n\t\t\texceptionNames = Collections.singleton(\"java.lang.Throwable\");\n\t\t}\n\t\t\n\t\tjava.util.List<String> exceptions = new ArrayList<String>();\n\t\tfor (String exception : exceptionNames) {\n\t\t\tif (exception.endsWith(\".class\")) exception = exception.substring(0, exception.length() - 6);\n\t\t\texceptions.add(exception);\n\t\t}\n\t\t\n\t\tJavacNode owner = annotationNode.up();\n\t\tswitch (owner.getKind()) {\n\t\tcase METHOD:\n\t\t\thandleMethod(annotationNode, (JCMethodDecl)owner.get(), exceptions);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tannotationNode.addError(\"@SneakyThrows is legal only on methods and constructors.\");\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tpublic void handleMethod(JavacNode annotation, JCMethodDecl method, Collection<String> exceptions) {\n\t\tJavacNode methodNode = annotation.up();\n\t\t\n\t\tif ( (method.mods.flags & Flags.ABSTRACT) != 0) {\n\t\t\tannotation.addError(\"@SneakyThrows can only be used on concrete methods.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (method.body == null || method.body.stats.isEmpty()) {\n\t\t\tgenerateEmptyBlockWarning(methodNode, annotation, false);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tfinal JCStatement constructorCall = method.body.stats.get(0);\n\t\tfinal boolean isConstructorCall = isConstructorCall(constructorCall);\n\t\tList<JCStatement> contents = isConstructorCall ? method.body.stats.tail : method.body.stats;\n\t\t\n\t\tif (contents == null || contents.isEmpty()) {\n\t\t\tgenerateEmptyBlockWarning(methodNode, annotation, true);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tfor (String exception : exceptions) {\n\t\t\tcontents = List.of(buildTryCatchBlock(methodNode, contents, exception, annotation));\n\t\t}\n\t\t\n\t\tmethod.body.stats = isConstructorCall ? List.of(constructorCall).appendList(contents) : contents;\n\t\tmethodNode.rebuild();\n\t}\n\t\n\tpublic void generateEmptyBlockWarning(JavacNode methodNode, JavacNode annotation, boolean hasConstructorCall) {\n\t\tif (hasConstructorCall) {\n\t\t\tannotation.addWarning(\"Calls to sibling / super constructors are always excluded from @SneakyThrows; @SneakyThrows has been ignored because there is no other code in this constructor.\");\n\t\t} else {\n\t\t\tannotation.addWarning(\"This method or constructor is empty; @SneakyThrows has been ignored.\");\n\t\t}\n\t}\n\t\n\tpublic JCStatement buildTryCatchBlock(JavacNode node, List<JCStatement> contents, String exception, JavacNode source) {\n\t\tJavacTreeMaker maker = node.getTreeMaker();\n\t\t\n\t\tJCBlock tryBlock = setGeneratedBy(maker.Block(0, contents), source);\n\t\tJCExpression varType = chainDots(node, exception.split(\"\\\\.\"));\n\t\t\n\t\tJCVariableDecl catchParam = maker.VarDef(maker.Modifiers(Flags.FINAL | Flags.PARAMETER), node.toName(\"$ex\"), varType, null);\n\t\tJCExpression lombokLombokSneakyThrowNameRef = chainDots(node, \"lombok\", \"Lombok\", \"sneakyThrow\");\n\t\tJCBlock catchBody = maker.Block(0, List.<JCStatement>of(maker.Throw(maker.Apply(\n\t\t\t\tList.<JCExpression>nil(), lombokLombokSneakyThrowNameRef,\n\t\t\t\tList.<JCExpression>of(maker.Ident(node.toName(\"$ex\")))))));\n\t\tJCTry tryStatement = maker.Try(tryBlock, List.of(recursiveSetGeneratedBy(maker.Catch(catchParam, catchBody), source)), null);\n\t\tif (JavacHandlerUtil.inNetbeansEditor(node)) {\n\t\t\t//set span (start and end position) of the try statement and the main block\n\t\t\t//this allows NetBeans to dive into the statement correctly:\n\t\t\tJCCompilationUnit top = (JCCompilationUnit) node.top().get();\n\t\t\tint startPos = contents.head.pos;\n\t\t\tint endPos = Javac.getEndPosition(contents.last().pos(), top);\n\t\t\ttryBlock.pos = startPos;\n\t\t\ttryStatement.pos = startPos;\n\t\t\tJavac.storeEnd(tryBlock, endPos, top);\n\t\t\tJavac.storeEnd(tryStatement, endPos, top);\n\t\t}\n\t\treturn setGeneratedBy(tryStatement, source);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleStandardException.java",
    "content": "/*\n * Copyright (C) 2021-2024 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.*;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.ListBuffer;\nimport com.sun.tools.javac.util.Name;\nimport lombok.AccessLevel;\nimport lombok.ConfigurationKeys;\nimport lombok.experimental.StandardException;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.delombok.LombokOptionsFactory;\nimport lombok.javac.Javac;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacTreeMaker;\nimport lombok.javac.handlers.JavacHandlerUtil.*;\nimport lombok.spi.Provides;\n\nimport static lombok.core.handlers.HandlerUtil.handleFlagUsage;\nimport static lombok.javac.Javac.*;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\n@Provides\npublic class HandleStandardException extends JavacAnnotationHandler<StandardException> {\n\t@Override\n\tpublic void handle(AnnotationValues<StandardException> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.STANDARD_EXCEPTION_FLAG_USAGE, \"@StandardException\");\n\t\tdeleteAnnotationIfNeccessary(annotationNode, StandardException.class);\n\t\tdeleteImportFromCompilationUnit(annotationNode, \"lombok.AccessLevel\");\n\t\tJavacNode typeNode = annotationNode.up();\n\t\t\n\t\tif (!isClass(typeNode)) {\n\t\t\tannotationNode.addError(\"@StandardException is only supported on a class\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tJCTree extending = Javac.getExtendsClause((JCClassDecl) typeNode.get());\n\t\tif (extending == null) {\n\t\t\tannotationNode.addError(\"@StandardException requires that you extend a Throwable type\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tAccessLevel access = annotation.getInstance().access();\n\t\tif (access == null) access = AccessLevel.PUBLIC;\n\t\tif (access == AccessLevel.NONE) {\n\t\t\tannotationNode.addError(\"AccessLevel.NONE is not valid here\");\n\t\t\taccess = AccessLevel.PUBLIC;\n\t\t}\n\t\t\n\t\tgenerateNoArgsConstructor(typeNode, access, annotationNode);\n\t\tgenerateMsgOnlyConstructor(typeNode, access, annotationNode);\n\t\tgenerateCauseOnlyConstructor(typeNode, access, annotationNode);\n\t\tgenerateFullConstructor(typeNode, access, annotationNode);\n\t}\n\t\n\tprivate void generateNoArgsConstructor(JavacNode typeNode, AccessLevel level, JavacNode source) {\n\t\tif (hasConstructor(typeNode) != MemberExistsResult.NOT_EXISTS) return;\n\t\tJavacTreeMaker maker = typeNode.getTreeMaker();\n\t\t\n\t\tJCExpression stringArgument = maker.TypeCast(genJavaLangTypeRef(typeNode, \"String\"), maker.Literal(CTC_BOT, null));\n\t\tJCExpression throwableArgument = maker.TypeCast(genJavaLangTypeRef(typeNode, \"Throwable\"), maker.Literal(CTC_BOT, null));\n\t\tList<JCExpression> args = List.<JCExpression>of(stringArgument, throwableArgument);\n\t\tJCStatement thisCall = maker.Exec(maker.Apply(List.<JCExpression>nil(), maker.Ident(typeNode.toName(\"this\")), args));\n\t\tJCMethodDecl constr = createConstructor(level, typeNode, false, false, source, List.of(thisCall));\n\t\tinjectMethod(typeNode, constr);\n\t}\n\t\n\tprivate void generateMsgOnlyConstructor(JavacNode typeNode, AccessLevel level, JavacNode source) {\n\t\tif (hasConstructor(typeNode, String.class) != MemberExistsResult.NOT_EXISTS) return;\n\t\tJavacTreeMaker maker = typeNode.getTreeMaker();\n\t\t\n\t\tJCExpression stringArgument = maker.Ident(typeNode.toName(\"message\"));\n\t\tJCExpression throwableArgument = maker.TypeCast(genJavaLangTypeRef(typeNode, \"Throwable\"), maker.Literal(CTC_BOT, null));\n\t\tList<JCExpression> args = List.<JCExpression>of(stringArgument, throwableArgument);\n\t\tJCStatement thisCall = maker.Exec(maker.Apply(List.<JCExpression>nil(), maker.Ident(typeNode.toName(\"this\")), args));\n\t\tJCMethodDecl constr = createConstructor(level, typeNode, true, false, source, List.of(thisCall));\n\t\tinjectMethod(typeNode, constr);\n\t}\n\t\n\tprivate void generateCauseOnlyConstructor(JavacNode typeNode, AccessLevel level, JavacNode source) {\n\t\tif (hasConstructor(typeNode, Throwable.class) != MemberExistsResult.NOT_EXISTS) return;\n\t\tJavacTreeMaker maker = typeNode.getTreeMaker();\n\t\tName causeName = typeNode.toName(\"cause\");\n\t\t\n\t\tJCExpression causeDotGetMessage = maker.Apply(List.<JCExpression>nil(), maker.Select(maker.Ident(causeName), typeNode.toName(\"getMessage\")), List.<JCExpression>nil());\n\t\tJCExpression msgExpression = maker.Conditional(maker.Binary(CTC_NOT_EQUAL, maker.Ident(causeName), maker.Literal(CTC_BOT, null)), causeDotGetMessage, maker.Literal(CTC_BOT, null));\n\t\t\n\t\tList<JCExpression> args = List.<JCExpression>of(msgExpression, maker.Ident(causeName));\n\t\tJCStatement thisCall = maker.Exec(maker.Apply(List.<JCExpression>nil(), maker.Ident(typeNode.toName(\"this\")), args));\n\t\tJCMethodDecl constr = createConstructor(level, typeNode, false, true, source, List.of(thisCall));\n\t\tinjectMethod(typeNode, constr);\n\t}\n\t\n\tprivate void generateFullConstructor(JavacNode typeNode, AccessLevel level, JavacNode source) {\n\t\tif (hasConstructor(typeNode, String.class, Throwable.class) != MemberExistsResult.NOT_EXISTS) return;\n\t\tJavacTreeMaker maker = typeNode.getTreeMaker();\n\t\t\n\t\tName causeName = typeNode.toName(\"cause\");\n\t\tName superName = typeNode.toName(\"super\");\n\t\t\n\t\tList<JCExpression> args = List.<JCExpression>of(maker.Ident(typeNode.toName(\"message\")));\n\t\tJCStatement superCall = maker.Exec(maker.Apply(List.<JCExpression>nil(), maker.Ident(superName), args));\n\t\tJCExpression causeNotNull = maker.Binary(CTC_NOT_EQUAL, maker.Ident(causeName), maker.Literal(CTC_BOT, null));\n\t\tJCStatement initCauseCall = maker.Exec(maker.Apply(List.<JCExpression>nil(), maker.Select(maker.Ident(superName), typeNode.toName(\"initCause\")), List.<JCExpression>of(maker.Ident(causeName))));\n\t\tJCStatement initCause = maker.If(causeNotNull, initCauseCall, null);\n\t\tJCMethodDecl constr = createConstructor(level, typeNode, true, true, source, List.of(superCall, initCause));\n\t\tinjectMethod(typeNode, constr);\n\t}\n\t\n\tprivate static MemberExistsResult hasConstructor(JavacNode node, Class<?>... paramTypes) {\n\t\tnode = upToTypeNode(node);\n\t\t\n\t\tif (node != null && node.get() instanceof JCClassDecl) {\n\t\t\tfor (JCTree def : ((JCClassDecl) node.get()).defs) {\n\t\t\t\tif (def instanceof JCMethodDecl) {\n\t\t\t\t\tJCMethodDecl md = (JCMethodDecl) def;\n\t\t\t\t\tif (md.name.contentEquals(\"<init>\") && (md.mods.flags & Flags.GENERATEDCONSTR) == 0) {\n\t\t\t\t\t\tif (!paramsMatch(node, md.params, paramTypes)) continue;\n\t\t\t\t\t\treturn getGeneratedBy(def) == null ? MemberExistsResult.EXISTS_BY_USER : MemberExistsResult.EXISTS_BY_LOMBOK;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn MemberExistsResult.NOT_EXISTS;\n\t}\n\t\n\tprivate static boolean paramsMatch(JavacNode node, List<JCVariableDecl> a, Class<?>[] b) {\n\t\tif (a == null) return b == null || b.length == 0;\n\t\tif (b == null) return a.size() == 0;\n\t\tif (a.size() != b.length) return false;\n\t\t\n\t\tfor (int i = 0; i < a.size(); i++) {\n\t\t\tJCVariableDecl param = a.get(i);\n\t\t\tClass<?> c = b[i];\n\t\t\tif (!typeMatches(c, node, param.vartype)) return false;\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\n\tprivate static void addConstructorProperties(JCModifiers mods, JavacNode node, boolean msgParam, boolean causeParam) {\n\t\tif (!msgParam && !causeParam) return;\n\t\tJavacTreeMaker maker = node.getTreeMaker();\n\t\tJCExpression constructorPropertiesType = chainDots(node, \"java\", \"beans\", \"ConstructorProperties\");\n\t\tListBuffer<JCExpression> fieldNames = new ListBuffer<JCExpression>();\n\t\tif (msgParam) fieldNames.append(maker.Literal(\"message\"));\n\t\tif (causeParam) fieldNames.append(maker.Literal(\"cause\"));\n\t\tJCExpression fieldNamesArray = maker.NewArray(null, List.<JCExpression>nil(), fieldNames.toList());\n\t\tJCAnnotation annotation = maker.Annotation(constructorPropertiesType, List.of(fieldNamesArray));\n\t\tmods.annotations = mods.annotations.append(annotation);\n\t}\n\t\n\t@SuppressWarnings(\"deprecation\") private static JCMethodDecl createConstructor(AccessLevel level, JavacNode typeNode, boolean msgParam, boolean causeParam, JavacNode source, List<JCStatement> statements) {\n\t\tJavacTreeMaker maker = typeNode.getTreeMaker();\n\t\t\n\t\tboolean addConstructorProperties;\n\t\tif ((!msgParam && !causeParam) || isLocalType(typeNode) || !LombokOptionsFactory.getDelombokOptions(typeNode.getContext()).getFormatPreferences().generateConstructorProperties()) {\n\t\t\taddConstructorProperties = false;\n\t\t} else {\n\t\t\tBoolean v = typeNode.getAst().readConfiguration(ConfigurationKeys.ANY_CONSTRUCTOR_ADD_CONSTRUCTOR_PROPERTIES);\n\t\t\taddConstructorProperties = v != null ? v.booleanValue() :\n\t\t\t\tBoolean.FALSE.equals(typeNode.getAst().readConfiguration(ConfigurationKeys.ANY_CONSTRUCTOR_SUPPRESS_CONSTRUCTOR_PROPERTIES));\n\t\t}\n\t\t\n\t\tListBuffer<JCVariableDecl> params = new ListBuffer<JCVariableDecl>();\n\t\t\n\t\tif (msgParam) {\n\t\t\tName fieldName = typeNode.toName(\"message\");\n\t\t\tlong flags = JavacHandlerUtil.addFinalIfNeeded(Flags.PARAMETER, typeNode.getContext());\n\t\t\tJCExpression pType = genJavaLangTypeRef(typeNode, \"String\");\n\t\t\tJCVariableDecl param = maker.VarDef(maker.Modifiers(flags), fieldName, pType, null);\n\t\t\tparams.append(param);\n\t\t}\n\t\t\n\t\tif (causeParam) {\n\t\t\tName fieldName = typeNode.toName(\"cause\");\n\t\t\tlong flags = JavacHandlerUtil.addFinalIfNeeded(Flags.PARAMETER, typeNode.getContext());\n\t\t\tJCExpression pType = genJavaLangTypeRef(typeNode, \"Throwable\");\n\t\t\tJCVariableDecl param = maker.VarDef(maker.Modifiers(flags), fieldName, pType, null);\n\t\t\tparams.append(param);\n\t\t}\n\t\t\n\t\tJCModifiers mods = maker.Modifiers(toJavacModifier(level), List.<JCAnnotation>nil());\n\t\tif (addConstructorProperties) addConstructorProperties(mods, typeNode, msgParam, causeParam);\n\t\treturn recursiveSetGeneratedBy(maker.MethodDef(mods, typeNode.toName(\"<init>\"),\n\t\t\tnull, List.<JCTypeParameter>nil(), params.toList(), List.<JCExpression>nil(),\n\t\t\tmaker.Block(0L, statements), null), source);\n\t}\n\t\n\tpublic static boolean isLocalType(JavacNode type) {\n\t\tKind kind = type.up().getKind();\n\t\tif (kind == Kind.COMPILATION_UNIT) return false;\n\t\tif (kind == Kind.TYPE) return isLocalType(type.up());\n\t\treturn true;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleSuperBuilder.java",
    "content": "/*\n * Copyright (C) 2013-2025 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.javac.handlers.HandleBuilder.*;\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.javac.Javac.*;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.HashSet;\n\nimport javax.lang.model.element.Modifier;\n\nimport com.sun.tools.javac.code.BoundKind;\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCArrayTypeTree;\nimport com.sun.tools.javac.tree.JCTree.JCAssign;\nimport com.sun.tools.javac.tree.JCTree.JCBlock;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCExpressionStatement;\nimport com.sun.tools.javac.tree.JCTree.JCFieldAccess;\nimport com.sun.tools.javac.tree.JCTree.JCIdent;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCMethodInvocation;\nimport com.sun.tools.javac.tree.JCTree.JCModifiers;\nimport com.sun.tools.javac.tree.JCTree.JCReturn;\nimport com.sun.tools.javac.tree.JCTree.JCStatement;\nimport com.sun.tools.javac.tree.JCTree.JCTypeApply;\nimport com.sun.tools.javac.tree.JCTree.JCTypeParameter;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.tree.JCTree.JCWildcard;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.ListBuffer;\nimport com.sun.tools.javac.util.Name;\n\nimport lombok.AccessLevel;\nimport lombok.Builder;\nimport lombok.Builder.ObtainVia;\nimport lombok.ConfigurationKeys;\nimport lombok.Singular;\nimport lombok.ToString;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.core.configuration.CheckerFrameworkVersion;\nimport lombok.core.handlers.HandlerUtil;\nimport lombok.core.handlers.HandlerUtil.FieldAccess;\nimport lombok.core.handlers.InclusionExclusionUtils.Included;\nimport lombok.experimental.NonFinal;\nimport lombok.experimental.SuperBuilder;\nimport lombok.javac.Javac;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacTreeMaker;\nimport lombok.javac.handlers.HandleBuilder.BuilderFieldData;\nimport lombok.javac.handlers.HandleBuilder.BuilderJob;\nimport lombok.javac.handlers.JavacHandlerUtil.CopyJavadoc;\nimport lombok.javac.handlers.JavacHandlerUtil.JCAnnotatedTypeReflect;\nimport lombok.javac.handlers.JavacHandlerUtil.MemberExistsResult;\nimport lombok.javac.handlers.JavacSingularsRecipes.ExpressionMaker;\nimport lombok.javac.handlers.JavacSingularsRecipes.JavacSingularizer;\nimport lombok.javac.handlers.JavacSingularsRecipes.SingularData;\nimport lombok.javac.handlers.JavacSingularsRecipes.StatementMaker;\nimport lombok.spi.Provides;\n\n@Provides\n@HandlerPriority(-1024) //-2^10; to ensure we've picked up @FieldDefault's changes (-2048) but @Value hasn't removed itself yet (-512), so that we can error on presence of it on the builder classes.\npublic class HandleSuperBuilder extends JavacAnnotationHandler<SuperBuilder> {\n\tprivate static final String SELF_METHOD = \"self\";\n\tprivate static final String FILL_VALUES_METHOD_NAME = \"$fillValuesFrom\";\n\tprivate static final String STATIC_FILL_VALUES_METHOD_NAME = \"$fillValuesFromInstanceIntoBuilder\";\n\tprivate static final String INSTANCE_VARIABLE_NAME = \"instance\";\n\tprivate static final String BUILDER_VARIABLE_NAME = \"b\";\n\t\n\tclass SuperBuilderJob extends BuilderJob {\n\t\tJavacNode builderAbstractType;\n\t\tString builderAbstractClassName;\n\t\tJavacNode builderImplType;\n\t\tString builderImplClassName;\n\t\tList<JCTypeParameter> builderTypeParams_;\n\t\t\n\t\tvoid init(AnnotationValues<SuperBuilder> annValues, SuperBuilder ann, JavacNode node) {\n\t\t\taccessOuters = accessInners = AccessLevel.PUBLIC;\n\t\t\toldFluent = true;\n\t\t\toldChain = true;\n\t\t\t\n\t\t\tbuilderMethodName = ann.builderMethodName();\n\t\t\tbuildMethodName = ann.buildMethodName();\n\t\t\ttoBuilder = ann.toBuilder();\n\t\t\t\n\t\t\tif (builderMethodName == null) builderMethodName = \"builder\";\n\t\t\tif (buildMethodName == null) buildMethodName = \"build\";\n\t\t\tbuilderClassName = getBuilderClassNameTemplate(node, null);\n\t\t}\n\t\t\n\t\tvoid setBuilderToImpl() {\n\t\t\tbuilderType = builderImplType;\n\t\t\tbuilderClassName = builderImplClassName;\n\t\t\tbuilderTypeParams = typeParams;\n\t\t}\n\t\t\n\t\tvoid setBuilderToAbstract() {\n\t\t\tbuilderType = builderAbstractType;\n\t\t\tbuilderClassName = builderAbstractClassName;\n\t\t\tbuilderTypeParams = builderTypeParams_;\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic void handle(AnnotationValues<SuperBuilder> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\thandleExperimentalFlagUsage(annotationNode, ConfigurationKeys.SUPERBUILDER_FLAG_USAGE, \"@SuperBuilder\");\n\t\tSuperBuilderJob job = new SuperBuilderJob();\n\t\tjob.sourceNode = annotationNode;\n\t\tjob.checkerFramework = getCheckerFrameworkVersion(annotationNode);\n\t\tjob.isStatic = true;\n\t\t\n\t\tSuperBuilder annInstance = annotation.getInstance();\n\t\t\n\t\tjob.init(annotation, annInstance, annotationNode);\n\t\t\n\t\tboolean generateBuilderMethod;\n\t\tif (job.builderMethodName.isEmpty()) generateBuilderMethod = false;\n\t\telse if (!checkName(\"builderMethodName\", job.builderMethodName, annotationNode)) return;\n\t\telse generateBuilderMethod = true;\n\t\t\n\t\tif (!checkName(\"buildMethodName\", job.buildMethodName, annotationNode)) return;\n\t\t\n\t\t// Do not delete the SuperBuilder annotation here, we need it for @Jacksonized.\n\t\t\n\t\tJavacNode parent = annotationNode.up();\n\t\t\n\t\tjob.builderFields = new ArrayList<BuilderFieldData>();\n\t\tjob.typeParams = List.nil();\n\t\tList<JCExpression> buildMethodThrownExceptions = List.nil();\n\t\tList<JCExpression> superclassTypeParams = List.nil();\n\t\tboolean addCleaning = false;\n\t\t\n\t\tif (!isClass(parent)) {\n\t\t\tannotationNode.addError(\"@SuperBuilder is only supported on classes.\");\n\t\t\treturn;\n\t\t}\n\t\tif (!isStaticAllowed(parent)) {\n\t\t\tannotationNode.addError(\"@SuperBuilder is not supported on non-static nested classes.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tjob.parentType = parent;\n\t\tJCClassDecl td = (JCClassDecl) parent.get();\n\t\t\n\t\t// Gather all fields of the class that should be set by the builder.\n\t\tArrayList<JavacNode> nonFinalNonDefaultedFields = null;\n\t\t\n\t\tboolean valuePresent = (hasAnnotation(lombok.Value.class, parent) || hasAnnotation(\"lombok.experimental.Value\", parent));\n\t\tfor (JavacNode fieldNode : HandleConstructor.findAllFields(parent, true)) {\n\t\t\tJCVariableDecl fd = (JCVariableDecl) fieldNode.get();\n\t\t\tJavacNode isDefault = findAnnotation(Builder.Default.class, fieldNode, false);\n\t\t\tboolean isFinal = (fd.mods.flags & Flags.FINAL) != 0 || (valuePresent && !hasAnnotation(NonFinal.class, fieldNode));\n\t\t\tBuilderFieldData bfd = new BuilderFieldData();\n\t\t\tbfd.rawName = fd.name;\n\t\t\tbfd.name = removePrefixFromField(fieldNode);\n\t\t\tbfd.builderFieldName = bfd.name;\n\t\t\tbfd.annotations = findCopyableAnnotations(fieldNode);\n\t\t\tbfd.type = fd.vartype;\n\t\t\tbfd.singularData = getSingularData(fieldNode, annInstance.setterPrefix());\n\t\t\tbfd.originalFieldNode = fieldNode;\n\t\t\t\n\t\t\tif (bfd.singularData != null && isDefault != null) {\n\t\t\t\tisDefault.addError(\"@Builder.Default and @Singular cannot be mixed.\");\n\t\t\t\tfindAnnotation(Builder.Default.class, fieldNode, true);\n\t\t\t\tisDefault = null;\n\t\t\t}\n\t\t\t\n\t\t\tif (fd.init == null && isDefault != null) {\n\t\t\t\tisDefault.addWarning(\"@Builder.Default requires an initializing expression (' = something;').\");\n\t\t\t\tfindAnnotation(Builder.Default.class, fieldNode, true);\n\t\t\t\tisDefault = null;\n\t\t\t}\n\t\t\t\n\t\t\tif (fd.init != null && isDefault == null) {\n\t\t\t\tif (isFinal) continue;\n\t\t\t\tif (nonFinalNonDefaultedFields == null) nonFinalNonDefaultedFields = new ArrayList<JavacNode>();\n\t\t\t\tnonFinalNonDefaultedFields.add(fieldNode);\n\t\t\t}\n\t\t\t\n\t\t\tif (isDefault != null) {\n\t\t\t\tbfd.nameOfDefaultProvider = parent.toName(DEFAULT_PREFIX + bfd.name);\n\t\t\t\tbfd.nameOfSetFlag = parent.toName(bfd.name + SET_PREFIX);\n\t\t\t\tbfd.builderFieldName = parent.toName(bfd.name + VALUE_PREFIX);\n\t\t\t\tJCMethodDecl md = HandleBuilder.generateDefaultProvider(bfd.nameOfDefaultProvider, fieldNode, td.typarams, job);\n\t\t\t\tif (md != null) injectMethod(parent, md);\n\t\t\t}\n\t\t\taddObtainVia(bfd, fieldNode);\n\t\t\tjob.builderFields.add(bfd);\n\t\t}\n\t\t\n\t\tjob.typeParams = job.builderTypeParams = td.typarams;\n\t\tjob.builderClassName = job.replaceBuilderClassName(td.name);\n\t\tif (!checkName(\"builderClassName\", job.builderClassName, annotationNode)) return;\n\t\t\n\t\t// <C, B> are the generics for our builder.\n\t\tString classGenericName = \"C\";\n\t\tString builderGenericName = \"B\";\n\t\t// We have to make sure that the generics' names do not collide with any generics on the annotated class,\n\t\t// the classname itself, or any member type name of the annotated class.\n\t\t// For instance, if there are generics <B, B2, C> on the annotated class, use \"C2\" and \"B3\" for our builder.\n\t\tjava.util.HashSet<String> usedNames = gatherUsedTypeNames(job.typeParams, td);\n\t\tclassGenericName = generateNonclashingNameFor(classGenericName, usedNames);\n\t\tbuilderGenericName = generateNonclashingNameFor(builderGenericName, usedNames);\n\t\t\n\t\tJavacTreeMaker maker = annotationNode.getTreeMaker();\n\t\t\n\t\t{\n\t\t\tJCExpression annotatedClass = namePlusTypeParamsToTypeReference(maker, parent, job.typeParams);\n\t\t\tJCTypeParameter c = maker.TypeParameter(parent.toName(classGenericName), List.<JCExpression>of(annotatedClass));\n\t\t\tListBuffer<JCExpression> typeParamsForBuilder = getTypeParamExpressions(job.typeParams, maker, job.sourceNode);\n\t\t\ttypeParamsForBuilder.append(maker.Ident(parent.toName(classGenericName)));\n\t\t\ttypeParamsForBuilder.append(maker.Ident(parent.toName(builderGenericName)));\n\t\t\tJCTypeApply typeApply = maker.TypeApply(namePlusTypeParamsToTypeReference(maker, parent, job.getBuilderClassName(), false, List.<JCTypeParameter>nil()), typeParamsForBuilder.toList());\n\t\t\tJCTypeParameter d = maker.TypeParameter(parent.toName(builderGenericName), List.<JCExpression>of(typeApply));\n\t\t\tif (job.typeParams == null || job.typeParams.isEmpty()) {\n\t\t\t\tjob.builderTypeParams_ = List.of(c, d);\n\t\t\t} else {\n\t\t\t\tjob.builderTypeParams_ = job.typeParams.append(c).append(d);\n\t\t\t}\n\t\t}\n\t\t\n\t\tJCTree extendsClause = Javac.getExtendsClause(td);\n\t\tJCExpression superclassBuilderClass = null;\n\t\tif (extendsClause instanceof JCTypeApply) {\n\t\t\t// Remember the type arguments, because we need them for the extends clause of our abstract builder class.\n\t\t\tsuperclassTypeParams = ((JCTypeApply) extendsClause).getTypeArguments();\n\t\t\t// A class name with a generics type, e.g., \"Superclass<A>\".\n\t\t\textendsClause = ((JCTypeApply) extendsClause).getType();\n\t\t}\n\t\tif (extendsClause instanceof JCFieldAccess) {\n\t\t\tName superclassName = ((JCFieldAccess) extendsClause).getIdentifier();\n\t\t\tString builderClassNameTemplate = BuilderJob.getBuilderClassNameTemplate(annotationNode, null);\n\t\t\tString superclassBuilderClassName = job.replaceBuilderClassName(superclassName.toString(), builderClassNameTemplate);\n\t\t\tsuperclassBuilderClass = parent.getTreeMaker().Select(cloneType(maker, (JCFieldAccess) extendsClause, annotationNode), parent.toName(superclassBuilderClassName));\n\t\t} else if (extendsClause != null) {\n\t\t\tString builderClassNameTemplate = BuilderJob.getBuilderClassNameTemplate(annotationNode, null);\n\t\t\tString superclassBuilderClassName = job.replaceBuilderClassName(extendsClause.toString(), builderClassNameTemplate);\n\t\t\tsuperclassBuilderClass = chainDots(parent, extendsClause.toString(), superclassBuilderClassName);\n\t\t}\n\t\t\n\t\t// Check validity of @ObtainVia fields, and add check if adding cleaning for @Singular is necessary.\n\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\tif (bfd.singularData != null && bfd.singularData.getSingularizer() != null) {\n\t\t\t\tif (bfd.singularData.getSingularizer().requiresCleaning()) {\n\t\t\t\t\taddCleaning = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (bfd.obtainVia != null) {\n\t\t\t\tif (bfd.obtainVia.field().isEmpty() == bfd.obtainVia.method().isEmpty()) {\n\t\t\t\t\tbfd.obtainViaNode.addError(\"The syntax is either @ObtainVia(field = \\\"fieldName\\\") or @ObtainVia(method = \\\"methodName\\\").\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (bfd.obtainVia.method().isEmpty() && bfd.obtainVia.isStatic()) {\n\t\t\t\t\tbfd.obtainViaNode.addError(\"@ObtainVia(isStatic = true) is not valid unless 'method' has been set.\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tjob.builderAbstractClassName = job.builderClassName = job.replaceBuilderClassName(td.name);\n\t\tjob.builderImplClassName = job.builderAbstractClassName + \"Impl\";\n\t\t\n\t\t// Create the abstract builder class.\n\t\tjob.builderAbstractType = findInnerClass(parent, job.builderClassName);\n\t\tif (job.builderAbstractType == null) {\n\t\t\tjob.builderAbstractType = generateBuilderAbstractClass(job, superclassBuilderClass, superclassTypeParams, classGenericName, builderGenericName);\n\t\t\trecursiveSetGeneratedBy(job.builderAbstractType.get(), annotationNode);\n\t\t} else {\n\t\t\tJCClassDecl builderTypeDeclaration = (JCClassDecl) job.builderAbstractType.get();\n\t\t\tif (!builderTypeDeclaration.getModifiers().getFlags().contains(Modifier.STATIC)\n\t\t\t\t|| !builderTypeDeclaration.getModifiers().getFlags().contains(Modifier.ABSTRACT)) {\n\t\t\t\t\n\t\t\t\tannotationNode.addError(\"Existing Builder must be an abstract static inner class.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsanityCheckForMethodGeneratingAnnotationsOnBuilderClass(job.builderAbstractType, annotationNode);\n\t\t\t// Generate errors for @Singular BFDs that have one already defined node.\n\t\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\t\tSingularData sd = bfd.singularData;\n\t\t\t\tif (sd == null) continue;\n\t\t\t\tJavacSingularizer singularizer = sd.getSingularizer();\n\t\t\t\tif (singularizer == null) continue;\n\t\t\t\tif (singularizer.checkForAlreadyExistingNodesAndGenerateError(job.builderAbstractType, sd)) bfd.singularData = null;\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Generate the fields in the abstract builder class that hold the values for the instance.\n\t\tjob.setBuilderToAbstract();\n\t\tgenerateBuilderFields(job.builderType, job.builderFields, annotationNode);\n\t\tif (addCleaning) {\n\t\t\tJCVariableDecl uncleanField = maker.VarDef(maker.Modifiers(Flags.PRIVATE), job.toName(\"$lombokUnclean\"), maker.TypeIdent(CTC_BOOLEAN), null);\n\t\t\trecursiveSetGeneratedBy(uncleanField, annotationNode);\n\t\t\tinjectFieldAndMarkGenerated(job.builderType, uncleanField);\n\t\t}\n\t\t\n\t\tif (job.toBuilder) {\n\t\t\t// Generate $fillValuesFrom() method in the abstract builder.\n\t\t\tJCMethodDecl fvm = generateFillValuesMethod(job, superclassBuilderClass != null, builderGenericName, classGenericName);\n\t\t\trecursiveSetGeneratedBy(fvm, annotationNode);\n\t\t\tinjectMethod(job.builderType, fvm);\n\t\t\t// Generate $fillValuesFromInstanceIntoBuilder() method in the builder implementation class.\n\t\t\tJCMethodDecl sfvm = generateStaticFillValuesMethod(job, annInstance.setterPrefix());\n\t\t\trecursiveSetGeneratedBy(sfvm, annotationNode);\n\t\t\tinjectMethod(job.builderType, sfvm);\n\t\t}\n\t\t\n\t\t// Create the setter methods in the abstract builder.\n\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\tgenerateSetterMethodsForBuilder(job, bfd, builderGenericName, annInstance.setterPrefix());\n\t\t}\n\t\t\n\t\t// Generate abstract self() and build() methods in the abstract builder.\n\t\tJCMethodDecl asm = generateAbstractSelfMethod(job, superclassBuilderClass != null, builderGenericName);\n\t\trecursiveSetGeneratedBy(asm, annotationNode);\n\t\tinjectMethod(job.builderType, asm);\n\t\tJCMethodDecl abm = generateAbstractBuildMethod(job, superclassBuilderClass != null, classGenericName);\n\t\trecursiveSetGeneratedBy(abm, annotationNode);\n\t\tinjectMethod(job.builderType, abm);\n\t\t\n\t\t// Create the toString() method for the abstract builder.\n\t\tjava.util.List<Included<JavacNode, ToString.Include>> fieldNodes = new ArrayList<Included<JavacNode, ToString.Include>>();\n\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\tfor (JavacNode f : bfd.createdFields) {\n\t\t\t\tfieldNodes.add(new Included<JavacNode, ToString.Include>(f, null, true, false));\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Let toString() call super.toString() if there is a superclass, so that it also shows fields from the superclass' builder.\n\t\tJCMethodDecl toStringMethod = HandleToString.createToString(job.builderType, fieldNodes, true, superclassBuilderClass != null, FieldAccess.ALWAYS_FIELD, annotationNode);\n\t\tif (toStringMethod != null) injectMethod(job.builderType, toStringMethod);\n\t\t\n\t\t// If clean methods are requested, add them now.\n\t\tif (addCleaning) {\n\t\t\tJCMethodDecl md = generateCleanMethod(job.builderFields, job.builderType, annotationNode);\n\t\t\trecursiveSetGeneratedBy(md, annotationNode);\n\t\t\tinjectMethod(job.builderType, md);\n\t\t}\n\t\t\n\t\tboolean isAbstract = (td.mods.flags & Flags.ABSTRACT) != 0;\n\t\tif (!isAbstract) {\n\t\t\t// Only non-abstract classes get the Builder implementation.\n\t\t\t\n\t\t\t// Create the builder implementation class.\n\t\t\tjob.builderImplType = findInnerClass(parent, job.builderImplClassName);\n\t\t\tif (job.builderImplType == null) {\n\t\t\t\tjob.builderImplType = generateBuilderImplClass(job);\n\t\t\t\trecursiveSetGeneratedBy(job.builderImplType.get(), annotationNode);\n\t\t\t} else {\n\t\t\t\tJCClassDecl builderImplTypeDeclaration = (JCClassDecl) job.builderImplType.get();\n\t\t\t\tif (!builderImplTypeDeclaration.getModifiers().getFlags().contains(Modifier.STATIC)\n\t\t\t\t\t\t|| builderImplTypeDeclaration.getModifiers().getFlags().contains(Modifier.ABSTRACT)) {\n\t\t\t\t\tannotationNode.addError(\"Existing BuilderImpl must be a non-abstract static inner class.\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsanityCheckForMethodGeneratingAnnotationsOnBuilderClass(job.builderImplType, annotationNode);\n\t\t\t}\n\t\t\t\n\t\t\t// Create a simple constructor for the BuilderImpl class.\n\t\t\tJCMethodDecl cd = HandleConstructor.createConstructor(AccessLevel.PRIVATE, List.<JCAnnotation>nil(), job.builderImplType, List.<JavacNode>nil(), false, annotationNode);\n\t\t\tif (cd != null) injectMethod(job.builderImplType, cd);\n\t\t\tjob.setBuilderToImpl();\n\t\t\t\n\t\t\t// Create the self() and build() methods in the BuilderImpl.\n\t\t\tJCMethodDecl selfMethod = generateSelfMethod(job);\n\t\t\trecursiveSetGeneratedBy(selfMethod, annotationNode);\n\t\t\tinjectMethod(job.builderType, selfMethod);\n\t\t\tif (methodExists(job.buildMethodName, job.builderType, -1) == MemberExistsResult.NOT_EXISTS) {\n\t\t\t\tJCMethodDecl buildMethod = generateBuildMethod(job, buildMethodThrownExceptions);\n\t\t\t\trecursiveSetGeneratedBy(buildMethod, annotationNode);\n\t\t\t\tinjectMethod(job.builderType, buildMethod);\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Generate a constructor in the annotated class that takes a builder as argument.\n\t\tif (!constructorExists(job.parentType, job.builderAbstractClassName)) {\n\t\t\tjob.setBuilderToAbstract();\n\t\t\tgenerateBuilderBasedConstructor(job, superclassBuilderClass != null);\n\t\t}\n\t\t\n\t\tif (!isAbstract) {\n\t\t\t// Only non-abstract classes get the builder() and toBuilder() methods.\n\t\t\t\n\t\t\t// Add the builder() method to the annotated class.\n\t\t\t// Allow users to specify their own builder() methods, e.g., to provide default values.\n\t\t\tif (generateBuilderMethod && methodExists(job.builderMethodName, job.parentType, -1) != MemberExistsResult.NOT_EXISTS) generateBuilderMethod = false;\n\t\t\tif (generateBuilderMethod) {\n\t\t\t\tJCMethodDecl builderMethod = generateBuilderMethod(job);\n\t\t\t\tif (builderMethod != null) {\n\t\t\t\t\trecursiveSetGeneratedBy(builderMethod, annotationNode);\n\t\t\t\t\tinjectMethod(job.parentType, builderMethod);\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Add the toBuilder() method to the annotated class.\n\t\t\tif (job.toBuilder) {\n\t\t\t\tswitch (methodExists(TO_BUILDER_METHOD_NAME, job.parentType, 0)) {\n\t\t\t\tcase EXISTS_BY_USER:\n\t\t\t\t\tbreak;\n\t\t\t\tcase NOT_EXISTS:\n\t\t\t\t\tJCMethodDecl md = generateToBuilderMethod(job);\n\t\t\t\t\tif (md != null) {\n\t\t\t\t\t\trecursiveSetGeneratedBy(md, annotationNode);\n\t\t\t\t\t\tinjectMethod(job.parentType, md);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t// Should not happen.\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (nonFinalNonDefaultedFields != null && generateBuilderMethod) {\n\t\t\tfor (JavacNode fieldNode : nonFinalNonDefaultedFields) {\n\t\t\t\tfieldNode.addWarning(\"@SuperBuilder will ignore the initializing expression entirely. If you want the initializing expression to serve as default, add @Builder.Default. If it is not supposed to be settable during building, make the field final.\");\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/**\n\t * Creates and returns the abstract builder class and injects it into the annotated class.\n\t */\n\tprivate JavacNode generateBuilderAbstractClass(SuperBuilderJob job, JCExpression superclassBuilderClass, List<JCExpression> superclassTypeParams, String classGenericName, String builderGenericName) {\n\t\tJavacTreeMaker maker = job.parentType.getTreeMaker();\n\t\tJCModifiers mods = maker.Modifiers(Flags.STATIC | Flags.ABSTRACT | Flags.PUBLIC);\n\t\t\n\t\t// Keep any type params of the annotated class.\n\t\tListBuffer<JCTypeParameter> allTypeParams = new ListBuffer<JCTypeParameter>();\n\t\tallTypeParams.appendList(copyTypeParams(job.sourceNode, job.typeParams));\n\t\t// Add builder-specific type params required for inheritable builders.\n\t\t// 1. The return type for the build() method, named \"C\", which extends the annotated class.\n\t\tJCExpression annotatedClass = namePlusTypeParamsToTypeReference(maker, job.parentType, job.typeParams);\n\t\t\n\t\tallTypeParams.append(maker.TypeParameter(job.toName(classGenericName), List.<JCExpression>of(annotatedClass)));\n\t\t// 2. The return type for all setter methods, named \"B\", which extends this builder class.\n\t\tName builderClassName = job.toName(job.builderClassName);\n\t\tListBuffer<JCExpression> typeParamsForBuilder = getTypeParamExpressions(job.typeParams, maker, job.sourceNode);\n\t\ttypeParamsForBuilder.append(maker.Ident(job.toName(classGenericName)));\n\t\ttypeParamsForBuilder.append(maker.Ident(job.toName(builderGenericName)));\n\t\tJCTypeApply typeApply = maker.TypeApply(namePlusTypeParamsToTypeReference(maker, job.parentType, builderClassName, false, List.<JCTypeParameter>nil()), typeParamsForBuilder.toList());\n\t\tallTypeParams.append(maker.TypeParameter(job.toName(builderGenericName), List.<JCExpression>of(typeApply)));\n\t\t\n\t\tJCExpression extending = null;\n\t\tif (superclassBuilderClass != null) {\n\t\t\t// If the annotated class extends another class, we want this builder to extend the builder of the superclass.\n\t\t\t// 1. Add the type parameters of the superclass.\n\t\t\ttypeParamsForBuilder = getTypeParamExpressions(superclassTypeParams, maker, job.sourceNode);\n\t\t\t// 2. Add the builder type params <C, B>.\n\t\t\ttypeParamsForBuilder.append(maker.Ident(job.toName(classGenericName)));\n\t\t\ttypeParamsForBuilder.append(maker.Ident(job.toName(builderGenericName)));\n\t\t\textending = maker.TypeApply(superclassBuilderClass, typeParamsForBuilder.toList());\n\t\t}\n\t\t\n\t\tJCClassDecl builder = maker.ClassDef(mods, builderClassName, allTypeParams.toList(), extending, List.<JCExpression>nil(), List.<JCTree>nil());\n\t\trecursiveSetGeneratedBy(builder, job.sourceNode);\n\t\treturn injectType(job.parentType, builder);\n\t}\n\t\n\t/**\n\t * Creates and returns the concrete builder implementation class and injects it into the annotated class.\n\t */\n\tprivate JavacNode generateBuilderImplClass(SuperBuilderJob job) {\n\t\tJavacTreeMaker maker = job.getTreeMaker();\n\t\tJCModifiers mods = maker.Modifiers(Flags.STATIC | Flags.PRIVATE | Flags.FINAL);\n\t\t\n\t\t// Extend the abstract builder.\n\t\tJCExpression extending = namePlusTypeParamsToTypeReference(maker, job.parentType, job.toName(job.builderAbstractClassName), false, List.<JCTypeParameter>nil());\n\t\t\n\t\t// Add builder-specific type params required for inheritable builders.\n\t\t// 1. The return type for the build() method (named \"C\" in the abstract builder), which is the annotated class.\n\t\tJCExpression annotatedClass = namePlusTypeParamsToTypeReference(maker, job.parentType, job.typeParams);\n\t\t// 2. The return type for all setter methods (named \"B\" in the abstract builder), which is this builder class.\n\t\tJCExpression builderImplClassExpression = namePlusTypeParamsToTypeReference(maker, job.parentType, job.toName(job.builderImplClassName), false, job.typeParams);\n\t\t\n\t\tListBuffer<JCExpression> typeParamsForBuilder = getTypeParamExpressions(job.typeParams, maker, job.sourceNode);\n\t\ttypeParamsForBuilder.append(annotatedClass);\n\t\ttypeParamsForBuilder.append(builderImplClassExpression);\n\t\textending = maker.TypeApply(extending, typeParamsForBuilder.toList());\n\t\t\n\t\tJCClassDecl builder = maker.ClassDef(mods, job.toName(job.builderImplClassName), copyTypeParams(job.parentType, job.typeParams), extending, List.<JCExpression>nil(), List.<JCTree>nil());\n\t\trecursiveSetGeneratedBy(builder, job.sourceNode);\n\t\treturn injectType(job.parentType, builder);\n\t}\n\t\n\t/**\n\t * Generates a constructor that has a builder as the only parameter.\n\t * The values from the builder are used to initialize the fields of new instances.\n\t *\n\t * @param callBuilderBasedSuperConstructor\n\t *            If {@code true}, the constructor will explicitly call a super\n\t *            constructor with the builder as argument. Requires\n\t *            {@code builderClassAsParameter != null}.\n\t */\n\tprivate void generateBuilderBasedConstructor(SuperBuilderJob job, boolean callBuilderBasedSuperConstructor) {\n\t\tJavacTreeMaker maker = job.getTreeMaker();\n\t\t\n\t\tAccessLevel level = AccessLevel.PROTECTED;\n\t\t\n\t\tListBuffer<JCStatement> statements = new ListBuffer<JCStatement>();\n\t\t\n\t\tName builderVariableName = job.toName(BUILDER_VARIABLE_NAME);\n\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\tJCExpression rhs;\n\t\t\tif (bfd.singularData != null && bfd.singularData.getSingularizer() != null) {\n\t\t\t\tbfd.singularData.getSingularizer().appendBuildCode(bfd.singularData, bfd.originalFieldNode, job.sourceNode, statements, bfd.builderFieldName, \"b\");\n\t\t\t\trhs = maker.Ident(bfd.singularData.getPluralName());\n\t\t\t} else {\n\t\t\t\trhs = maker.Select(maker.Ident(builderVariableName), bfd.builderFieldName);\n\t\t\t}\n\t\t\tJCFieldAccess fieldInThis = maker.Select(maker.Ident(job.toName(\"this\")), bfd.rawName);\n\t\t\t\n\t\t\tJCStatement assign = maker.Exec(maker.Assign(fieldInThis, rhs));\n\t\t\t\n\t\t\t// In case of @Builder.Default, set the value to the default if it was not set in the builder.\n\t\t\tif (bfd.nameOfSetFlag != null) {\n\t\t\t\tJCFieldAccess setField = maker.Select(maker.Ident(builderVariableName), bfd.nameOfSetFlag);\n\t\t\t\tfieldInThis = maker.Select(maker.Ident(job.toName(\"this\")), bfd.rawName);\n\t\t\t\tJCExpression parentTypeRef = namePlusTypeParamsToTypeReference(maker, job.parentType, List.<JCTypeParameter>nil());\n\t\t\t\tJCAssign assignDefault = maker.Assign(fieldInThis, maker.Apply(typeParameterNames(maker, ((JCClassDecl) job.parentType.get()).typarams), maker.Select(parentTypeRef, bfd.nameOfDefaultProvider), List.<JCExpression>nil()));\n\t\t\t\tstatements.append(maker.If(setField, assign, maker.Exec(assignDefault)));\n\t\t\t} else {\n\t\t\t\tstatements.append(assign);\n\t\t\t}\n\t\t\t\n\t\t\tif (hasNonNullAnnotations(bfd.originalFieldNode)) {\n\t\t\t\tJCStatement nullCheck = generateNullCheck(maker, bfd.originalFieldNode, job.sourceNode);\n\t\t\t\tif (nullCheck != null) statements.append(nullCheck);\n\t\t\t}\n\t\t}\n\t\t\n\t\tList<JCAnnotation> annsOnMethod = job.checkerFramework.generateSideEffectFree() ? List.of(maker.Annotation(genTypeRef(job.parentType, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil())) : List.<JCAnnotation>nil();\n\t\tJCModifiers mods = maker.Modifiers(toJavacModifier(level), annsOnMethod);\n\t\t\n\t\t// Create a constructor that has just the builder as parameter.\n\t\tListBuffer<JCVariableDecl> params = new ListBuffer<JCVariableDecl>();\n\t\tlong flags = JavacHandlerUtil.addFinalIfNeeded(Flags.PARAMETER, job.getContext());\n\t\t// First add all generics that are present on the parent type.\n\t\tListBuffer<JCExpression> typeParamsForBuilderParameter = getTypeParamExpressions(job.typeParams, maker, job.sourceNode);\n\t\t// Now add the <?, ?>.\n\t\tJCWildcard wildcard = maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null);\n\t\ttypeParamsForBuilderParameter.append(wildcard);\n\t\twildcard = maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null);\n\t\ttypeParamsForBuilderParameter.append(wildcard);\n\t\tJCTypeApply paramType = maker.TypeApply(namePlusTypeParamsToTypeReference(maker, job.parentType, job.getBuilderClassName(), false, List.<JCTypeParameter>nil()), typeParamsForBuilderParameter.toList());\n\t\tJCVariableDecl param = maker.VarDef(maker.Modifiers(flags), builderVariableName, paramType, null);\n\t\tparams.append(param);\n\t\t\n\t\tif (callBuilderBasedSuperConstructor) {\n\t\t\t// The first statement must be the call to the super constructor.\n\t\t\tJCMethodInvocation callToSuperConstructor = maker.Apply(List.<JCExpression>nil(),\n\t\t\t\tmaker.Ident(job.toName(\"super\")),\n\t\t\t\tList.<JCExpression>of(maker.Ident(builderVariableName)));\n\t\t\tstatements.prepend(maker.Exec(callToSuperConstructor));\n\t\t}\n\t\t\n\t\tJCMethodDecl constr = recursiveSetGeneratedBy(maker.MethodDef(mods, job.toName(\"<init>\"),\n\t\t\tnull, List.<JCTypeParameter>nil(), params.toList(), List.<JCExpression>nil(),\n\t\t\tmaker.Block(0L, statements.toList()), null), job.sourceNode);\n\t\t\n\t\tinjectMethod(job.parentType, constr);\n\t}\n\t\n\tprivate JCMethodDecl generateBuilderMethod(SuperBuilderJob job) {\n\t\tJavacTreeMaker maker = job.getTreeMaker();\n\t\t\n\t\tJCExpression call = maker.NewClass(null, List.<JCExpression>nil(), namePlusTypeParamsToTypeReference(maker, job.parentType, job.toName(job.builderImplClassName), false, job.typeParams), List.<JCExpression>nil(), null);\n\t\tJCStatement statement = maker.Return(call);\n\t\t\n\t\tJCBlock body = maker.Block(0, List.<JCStatement>of(statement));\n\t\tint modifiers = Flags.PUBLIC;\n\t\tmodifiers |= Flags.STATIC;\n\t\t\n\t\t// Add any type params of the annotated class to the return type.\n\t\tListBuffer<JCExpression> typeParameterNames = new ListBuffer<JCExpression>();\n\t\ttypeParameterNames.appendList(typeParameterNames(maker, job.typeParams));\n\t\t// Now add the <?, ?>.\n\t\tJCWildcard wildcard = maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null);\n\t\ttypeParameterNames.append(wildcard);\n\t\twildcard = maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null);\n\t\ttypeParameterNames.append(wildcard);\n\t\t// And return type annotations.\n\t\tList<JCAnnotation> annsOnParamType = List.nil();\n\t\tif (job.checkerFramework.generateUnique()) annsOnParamType = List.of(maker.Annotation(genTypeRef(job.parentType, CheckerFrameworkVersion.NAME__UNIQUE), List.<JCExpression>nil()));\n\t\tJCTypeApply returnType = maker.TypeApply(namePlusTypeParamsToTypeReference(maker, job.parentType, job.toName(job.builderAbstractClassName), false, List.<JCTypeParameter>nil(), annsOnParamType), typeParameterNames.toList());\n\t\t\n\t\tList<JCAnnotation> annsOnMethod = job.checkerFramework.generateSideEffectFree() ? List.of(maker.Annotation(genTypeRef(job.parentType, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil())) : List.<JCAnnotation>nil();\n\t\tJCMethodDecl methodDef = maker.MethodDef(maker.Modifiers(modifiers, annsOnMethod), job.toName(job.builderMethodName), returnType, copyTypeParams(job.sourceNode, job.typeParams), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), body, null);\n\t\tcreateRelevantNonNullAnnotation(job.parentType, methodDef);\n\t\treturn methodDef;\n\t}\n\t\n\t/**\n\t * Generates a {@code toBuilder()} method in the annotated class.\n\t * \n\t * It looks like:\n\t * <pre>\n\t * public ParentBuilder&lt;?, ?&gt; toBuilder() {\n\t *     return new <i>Foobar</i>BuilderImpl().$fillValuesFrom(this);\n\t * }\n\t * </pre>\n\t */\n\tprivate JCMethodDecl generateToBuilderMethod(SuperBuilderJob job) {\n\t\tJavacTreeMaker maker = job.getTreeMaker();\n\t\t\n\t\tJCExpression newClass = maker.NewClass(null, List.<JCExpression>nil(), namePlusTypeParamsToTypeReference(maker, job.parentType, job.toName(job.builderImplClassName), false, job.typeParams), List.<JCExpression>nil(), null);\n\t\tList<JCExpression> methodArgs = List.<JCExpression>of(maker.Ident(job.toName(\"this\")));\n\t\tJCMethodInvocation invokeFillMethod = maker.Apply(List.<JCExpression>nil(), maker.Select(newClass, job.toName(FILL_VALUES_METHOD_NAME)), methodArgs);\n\t\tJCStatement statement = maker.Return(invokeFillMethod);\n\t\t\n\t\tJCBlock body = maker.Block(0, List.<JCStatement>of(statement));\n\t\tint modifiers = Flags.PUBLIC;\n\t\t\n\t\t// Add any type params of the annotated class to the return type.\n\t\tListBuffer<JCExpression> typeParameterNames = new ListBuffer<JCExpression>();\n\t\ttypeParameterNames.appendList(typeParameterNames(maker, job.typeParams));\n\t\t// Now add the <?, ?>.\n\t\tJCWildcard wildcard = maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null);\n\t\ttypeParameterNames.append(wildcard);\n\t\twildcard = maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null);\n\t\ttypeParameterNames.append(wildcard);\n\t\tJCTypeApply returnType = maker.TypeApply(namePlusTypeParamsToTypeReference(maker, job.parentType, job.toName(job.builderAbstractClassName), false, List.<JCTypeParameter>nil()), typeParameterNames.toList());\n\t\t\n\t\tList<JCAnnotation> annsOnMethod = job.checkerFramework.generateSideEffectFree() ? List.of(maker.Annotation(genTypeRef(job.parentType, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil())) : List.<JCAnnotation>nil();\n\t\tJCMethodDecl methodDef = maker.MethodDef(maker.Modifiers(modifiers, annsOnMethod), job.toName(TO_BUILDER_METHOD_NAME), returnType, List.<JCTypeParameter>nil(), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), body, null);\n\t\tcreateRelevantNonNullAnnotation(job.parentType, methodDef);\n\t\treturn methodDef;\n\t}\n\t\n\t/**\n\t * Generates a {@code $fillValuesFrom()} method in the abstract builder class.\n\t * \n\t * It looks like:\n\t * <pre>\n\t * protected B $fillValuesFrom(final C instance) {\n\t *     super.$fillValuesFrom(instance);\n\t *     FoobarBuilder.$fillValuesFromInstanceIntoBuilder(instance, this);\n\t *     return self();\n\t * }\n\t * </pre>\n\t */\n\tprivate JCMethodDecl generateFillValuesMethod(SuperBuilderJob job, boolean inherited, String builderGenericName, String classGenericName) {\n\t\tJavacTreeMaker maker = job.getTreeMaker();\n\t\tList<JCAnnotation> annotations = List.nil();\n\t\tif (inherited) {\n\t\t\tJCAnnotation overrideAnnotation = maker.Annotation(genJavaLangTypeRef(job.builderType, \"Override\"), List.<JCExpression>nil());\n\t\t\tannotations = List.of(overrideAnnotation);\n\t\t}\n\t\tJCModifiers modifiers = maker.Modifiers(Flags.PROTECTED, annotations);\n\t\tName name = job.toName(FILL_VALUES_METHOD_NAME);\n\t\tJCExpression returnType = maker.Ident(job.toName(builderGenericName));\n\t\t\n\t\tJCExpression classGenericNameExpr = maker.Ident(job.toName(classGenericName));\n\t\tJCVariableDecl param = maker.VarDef(maker.Modifiers(Flags.PARAMETER | Flags.FINAL), job.toName(INSTANCE_VARIABLE_NAME), classGenericNameExpr, null);\n\t\t\n\t\tListBuffer<JCStatement> body = new ListBuffer<JCStatement>();\n\t\t\n\t\tif (inherited) {\n\t\t\t// Call super.\n\t\t\tJCMethodInvocation callToSuper = maker.Apply(List.<JCExpression>nil(),\n\t\t\t\tmaker.Select(maker.Ident(job.toName(\"super\")), name),\n\t\t\t\tList.<JCExpression>of(maker.Ident(job.toName(INSTANCE_VARIABLE_NAME))));\n\t\t\tbody.append(maker.Exec(callToSuper));\n\t\t}\n\t\t\n\t\t// Call the builder implemention's helper method that actually fills the values from the instance.\n\t\tJCExpression ref = namePlusTypeParamsToTypeReference(maker, job.parentType, job.getBuilderClassName(), false, List.<JCTypeParameter>nil());\n\t\tJCMethodInvocation callStaticFillValuesMethod = maker.Apply(List.<JCExpression>nil(),\n\t\t\tmaker.Select(ref, job.toName(STATIC_FILL_VALUES_METHOD_NAME)),\n\t\t\tList.<JCExpression>of(maker.Ident(job.toName(INSTANCE_VARIABLE_NAME)), maker.Ident(job.toName(\"this\"))));\n\t\tbody.append(maker.Exec(callStaticFillValuesMethod));\n\t\t\n\t\tJCReturn returnStatement = maker.Return(maker.Apply(List.<JCExpression>nil(), maker.Ident(job.toName(SELF_METHOD)), List.<JCExpression>nil()));\n\t\tbody.append(returnStatement);\n\t\tJCBlock bodyBlock = maker.Block(0, body.toList());\n\t\t\n\t\treturn maker.MethodDef(modifiers, name, returnType, List.<JCTypeParameter>nil(), List.of(param), List.<JCExpression>nil(), bodyBlock, null);\n\t}\n\t\n\t/**\n\t * Generates a {@code $fillValuesFromInstanceIntoBuilder()} method in\n\t * the builder implementation class that copies all fields from the instance\n\t * to the builder.\n\t * It looks like:\n\t * \n\t * <pre>\n\t * protected B $fillValuesFromInstanceIntoBuilder(Foobar instance, FoobarBuilder&lt;?, ?&gt; b) {\n\t * \tb.field(instance.field);\n\t * }\n\t * </pre>\n\t */\n\tprivate JCMethodDecl generateStaticFillValuesMethod(SuperBuilderJob job, String setterPrefix) {\n\t\tJavacTreeMaker maker = job.getTreeMaker();\n\t\tList<JCAnnotation> annotations = List.nil();\n\t\tJCModifiers modifiers = maker.Modifiers(Flags.PRIVATE | Flags.STATIC, annotations);\n\t\tName name = job.toName(STATIC_FILL_VALUES_METHOD_NAME);\n\t\tJCExpression returnType = maker.TypeIdent(CTC_VOID);\n\t\t\n\t\t// 1st parameter: \"Foobar instance\"\n\t\tJCVariableDecl paramInstance = maker.VarDef(maker.Modifiers(Flags.PARAMETER | Flags.FINAL), job.toName(INSTANCE_VARIABLE_NAME), cloneSelfType(job.parentType), null);\n\t\t\n\t\t// 2nd parameter: \"FoobarBuilder<?, ?> b\" (plus generics on the annotated type)\n\t\t// First add all generics that are present on the parent type.\n\t\tListBuffer<JCExpression> typeParamsForBuilderParameter = getTypeParamExpressions(job.typeParams, maker, job.sourceNode);\n\t\t// Now add the <?, ?>.\n\t\tJCWildcard wildcard = maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null);\n\t\ttypeParamsForBuilderParameter.append(wildcard);\n\t\twildcard = maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null);\n\t\ttypeParamsForBuilderParameter.append(wildcard);\n\t\tJCTypeApply builderType = maker.TypeApply(namePlusTypeParamsToTypeReference(maker, job.parentType, job.getBuilderClassName(), false, List.<JCTypeParameter>nil()), typeParamsForBuilderParameter.toList());\n\t\tJCVariableDecl paramBuilder = maker.VarDef(maker.Modifiers(Flags.PARAMETER | Flags.FINAL), job.toName(BUILDER_VARIABLE_NAME), builderType, null);\n\t\t\n\t\tListBuffer<JCStatement> body = new ListBuffer<JCStatement>();\n\t\t\n\t\t// Call the builder's setter methods to fill the values from the instance.\n\t\tfor (BuilderFieldData bfd : job.builderFields) {\n\t\t\tJCExpressionStatement exec = createSetterCallWithInstanceValue(bfd, job, setterPrefix);\n\t\t\tbody.append(exec);\n\t\t}\n\t\t\n\t\tJCBlock bodyBlock = maker.Block(0, body.toList());\n\t\t\n\t\treturn maker.MethodDef(modifiers, name, returnType, copyTypeParams(job.builderType, job.typeParams), List.of(paramInstance, paramBuilder), List.<JCExpression>nil(), bodyBlock, null);\n\t}\n\t\n\tprivate JCExpressionStatement createSetterCallWithInstanceValue(BuilderFieldData bfd, SuperBuilderJob job, String setterPrefix) {\n\t\tJavacTreeMaker maker = job.getTreeMaker();\n\t\tJCExpression[] tgt = new JCExpression[bfd.singularData == null ? 1 : 2];\n\t\tif (bfd.obtainVia == null || !bfd.obtainVia.field().isEmpty()) {\n\t\t\tfor (int i = 0; i < tgt.length; i++) {\n\t\t\t\ttgt[i] = maker.Select(maker.Ident(job.toName(INSTANCE_VARIABLE_NAME)), bfd.obtainVia == null ? bfd.rawName : job.toName(bfd.obtainVia.field()));\n\t\t\t}\n\t\t} else {\n\t\t\tif (bfd.obtainVia.isStatic()) {\n\t\t\t\tfor (int i = 0; i < tgt.length; i++) {\n\t\t\t\t\tJCExpression typeRef = namePlusTypeParamsToTypeReference(maker, job.parentType, List.<JCTypeParameter>nil());\n\t\t\t\t\tJCExpression c = maker.Select(typeRef, job.toName(bfd.obtainVia.method()));\n\t\t\t\t\ttgt[i] = maker.Apply(List.<JCExpression>nil(), c, List.<JCExpression>of(maker.Ident(job.toName(INSTANCE_VARIABLE_NAME))));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (int i = 0; i < tgt.length; i++) {\n\t\t\t\t\tJCExpression c = maker.Select(maker.Ident(job.toName(INSTANCE_VARIABLE_NAME)), job.toName(bfd.obtainVia.method()));\n\t\t\t\t\ttgt[i] = maker.Apply(List.<JCExpression>nil(), c, List.<JCExpression>nil());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tJCExpression arg;\n\t\tif (bfd.singularData == null) {\n\t\t\targ = tgt[0];\n\t\t} else {\n\t\t\tJCExpression eqNull = maker.Binary(CTC_EQUAL, tgt[0], maker.Literal(CTC_BOT, null));\n\t\t\tJCExpression emptyCollection = bfd.singularData.getSingularizer().getEmptyExpression(bfd.singularData.getTargetFqn(), maker, bfd.singularData, job.parentType, job.sourceNode);\n\t\t\targ = maker.Conditional(eqNull, emptyCollection, tgt[1]);\n\t\t}\n\t\t\n\t\tString setterName = HandlerUtil.buildAccessorName(job.sourceNode, setterPrefix, bfd.name.toString());\n\t\tJCMethodInvocation apply = maker.Apply(List.<JCExpression>nil(), maker.Select(maker.Ident(job.toName(BUILDER_VARIABLE_NAME)), job.toName(setterName)), List.of(arg));\n\t\tJCExpressionStatement exec = maker.Exec(apply);\n\t\treturn exec;\n\t}\n\t\n\tprivate JCMethodDecl generateAbstractSelfMethod(SuperBuilderJob job, boolean override, String builderGenericName) {\n\t\tJavacTreeMaker maker = job.getTreeMaker();\n\t\tList<JCAnnotation> annotations = List.nil();\n\t\tJCAnnotation overrideAnnotation = override ? maker.Annotation(genJavaLangTypeRef(job.builderType, \"Override\"), List.<JCExpression>nil()) : null;\n\t\tJCAnnotation sefAnnotation = job.checkerFramework.generatePure() ? maker.Annotation(genTypeRef(job.builderType, CheckerFrameworkVersion.NAME__PURE), List.<JCExpression>nil()) : null;\n\t\tif (sefAnnotation != null) annotations = annotations.prepend(sefAnnotation);\n\t\tif (overrideAnnotation != null) annotations = annotations.prepend(overrideAnnotation);\n\t\tJCModifiers modifiers = maker.Modifiers(Flags.PROTECTED | Flags.ABSTRACT, annotations);\n\t\tName name = job.toName(SELF_METHOD);\n\t\tJCExpression returnType = maker.Ident(job.toName(builderGenericName));\n\t\treturnType = addCheckerFrameworkReturnsReceiver(returnType, maker, job.builderType, job.checkerFramework);\n\t\t\n\t\treturn maker.MethodDef(modifiers, name, returnType, List.<JCTypeParameter>nil(), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), null, null);\n\t}\n\t\n\tprivate JCMethodDecl generateSelfMethod(SuperBuilderJob job) {\n\t\tJavacTreeMaker maker = job.getTreeMaker();\n\t\t\n\t\tJCAnnotation overrideAnnotation = maker.Annotation(genJavaLangTypeRef(job.builderType, \"Override\"), List.<JCExpression>nil());\n\t\tJCAnnotation sefAnnotation = job.checkerFramework.generatePure() ? maker.Annotation(genTypeRef(job.builderType, CheckerFrameworkVersion.NAME__PURE), List.<JCExpression>nil()) : null;\n\t\tList<JCAnnotation> annsOnMethod = List.nil();\n\t\tif (sefAnnotation != null) annsOnMethod = annsOnMethod.prepend(sefAnnotation);\n\t\tannsOnMethod = annsOnMethod.prepend(overrideAnnotation);\n\t\t\n\t\tJCModifiers modifiers = maker.Modifiers(Flags.PROTECTED, annsOnMethod);\n\t\tName name = job.toName(SELF_METHOD);\n\t\t\n\t\tJCExpression returnType = namePlusTypeParamsToTypeReference(maker, job.builderType.up(), job.getBuilderClassName(), false, job.typeParams);\n\t\treturnType = addCheckerFrameworkReturnsReceiver(returnType, maker, job.builderType, job.checkerFramework);\n\t\tJCStatement statement = maker.Return(maker.Ident(job.toName(\"this\")));\n\t\tJCBlock body = maker.Block(0, List.<JCStatement>of(statement));\n\t\t\n\t\treturn maker.MethodDef(modifiers, name, returnType, List.<JCTypeParameter>nil(), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), body, null);\n\t}\n\t\n\tprivate JCMethodDecl generateAbstractBuildMethod(SuperBuilderJob job, boolean override, String classGenericName) {\n\t\tJavacTreeMaker maker = job.getTreeMaker();\n\t\tList<JCAnnotation> annotations = List.nil();\n\t\tif (override) {\n\t\t\tJCAnnotation overrideAnnotation = maker.Annotation(genJavaLangTypeRef(job.builderType, \"Override\"), List.<JCExpression>nil());\n\t\t\tannotations = List.of(overrideAnnotation);\n\t\t}\n\t\tif (job.checkerFramework.generateSideEffectFree()) annotations = annotations.prepend(maker.Annotation(genTypeRef(job.builderType, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil()));\n\t\tJCModifiers modifiers = maker.Modifiers(Flags.PUBLIC | Flags.ABSTRACT, annotations);\n\t\tName name = job.toName(job.buildMethodName);\n\t\tJCExpression returnType = maker.Ident(job.toName(classGenericName));\n\t\t\n\t\tJCVariableDecl recv = HandleBuilder.generateReceiver(job);\n\t\tJCMethodDecl methodDef;\n\t\tif (recv != null && maker.hasMethodDefWithRecvParam()) {\n\t\t\tmethodDef = maker.MethodDefWithRecvParam(modifiers, name, returnType, List.<JCTypeParameter>nil(), recv, List.<JCVariableDecl>nil(), List.<JCExpression>nil(), null, null);\n\t\t} else {\n\t\t\tmethodDef = maker.MethodDef(modifiers, name, returnType, List.<JCTypeParameter>nil(), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), null, null);\n\t\t}\n\t\treturn methodDef;\n\t}\n\t\n\tprivate JCMethodDecl generateBuildMethod(SuperBuilderJob job, List<JCExpression> thrownExceptions) {\n\t\tJavacTreeMaker maker = job.getTreeMaker();\n\t\t\n\t\tJCExpression call;\n\t\tListBuffer<JCStatement> statements = new ListBuffer<JCStatement>();\n\t\t\n\t\t// Use a constructor that only has this builder as parameter.\n\t\tList<JCExpression> builderArg = List.<JCExpression>of(maker.Ident(job.toName(\"this\")));\n\t\tcall = maker.NewClass(null, List.<JCExpression>nil(), cloneSelfType(job.parentType), builderArg, null);\n\t\tstatements.append(maker.Return(call));\n\t\t\n\t\tJCBlock body = maker.Block(0, statements.toList());\n\t\t\n\t\tJCAnnotation overrideAnnotation = maker.Annotation(genJavaLangTypeRef(job.builderType, \"Override\"), List.<JCExpression>nil());\n\t\tList<JCAnnotation> annsOnMethod = List.of(overrideAnnotation);\n\t\tif (job.checkerFramework.generateSideEffectFree()) annsOnMethod = annsOnMethod.prepend(maker.Annotation(genTypeRef(job.builderType, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil()));\n\t\tJCModifiers modifiers = maker.Modifiers(Flags.PUBLIC, annsOnMethod);\n\t\t\n\t\tJCVariableDecl recv = HandleBuilder.generateReceiver(job);\n\t\tJCMethodDecl methodDef;\n\t\tif (recv != null && maker.hasMethodDefWithRecvParam()) {\n\t\t\tmethodDef = maker.MethodDefWithRecvParam(modifiers, job.toName(job.buildMethodName), cloneSelfType(job.parentType), List.<JCTypeParameter>nil(), recv, List.<JCVariableDecl>nil(), thrownExceptions, body, null);\n\t\t} else {\n\t\t\tmethodDef = maker.MethodDef(modifiers, job.toName(job.buildMethodName), cloneSelfType(job.parentType), List.<JCTypeParameter>nil(), List.<JCVariableDecl>nil(), thrownExceptions, body, null);\n\t\t}\n\t\tcreateRelevantNonNullAnnotation(job.builderType, methodDef);\n\t\treturn methodDef;\n\t}\n\t\n\tprivate JCMethodDecl generateCleanMethod(java.util.List<BuilderFieldData> builderFields, JavacNode type, JavacNode source) {\n\t\tJavacTreeMaker maker = type.getTreeMaker();\n\t\tListBuffer<JCStatement> statements = new ListBuffer<JCStatement>();\n\t\t\n\t\tfor (BuilderFieldData bfd : builderFields) {\n\t\t\tif (bfd.singularData != null && bfd.singularData.getSingularizer() != null) {\n\t\t\t\tbfd.singularData.getSingularizer().appendCleaningCode(bfd.singularData, type, source, statements);\n\t\t\t}\n\t\t}\n\t\t\n\t\tstatements.append(maker.Exec(maker.Assign(maker.Select(maker.Ident(type.toName(\"this\")), type.toName(\"$lombokUnclean\")), maker.Literal(CTC_BOOLEAN, 0))));\n\t\tJCBlock body = maker.Block(0, statements.toList());\n\t\treturn maker.MethodDef(maker.Modifiers(Flags.PUBLIC), type.toName(\"$lombokClean\"), maker.Type(Javac.createVoidType(type.getSymbolTable(), CTC_VOID)), List.<JCTypeParameter>nil(), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), body, null);\n\t}\n\t\n\tprivate void generateBuilderFields(JavacNode builderType, java.util.List<BuilderFieldData> builderFields, JavacNode source) {\n\t\tint len = builderFields.size();\n\t\tjava.util.List<JavacNode> existing = new ArrayList<JavacNode>();\n\t\tfor (JavacNode child : builderType.down()) {\n\t\t\tif (child.getKind() == Kind.FIELD) existing.add(child);\n\t\t}\n\t\t\n\t\tjava.util.List<JCVariableDecl> generated = new ArrayList<JCVariableDecl>();\n\t\t\n\t\tfor (int i = len - 1; i >= 0; i--) {\n\t\t\tBuilderFieldData bfd = builderFields.get(i);\n\t\t\tif (bfd.singularData != null && bfd.singularData.getSingularizer() != null) {\n\t\t\t\tjava.util.List<JavacNode> fields = bfd.singularData.getSingularizer().generateFields(bfd.singularData, builderType, source);\n\t\t\t\tfor (JavacNode field : fields) {\n\t\t\t\t\tgenerated.add((JCVariableDecl) field.get());\n\t\t\t\t}\n\t\t\t\tbfd.createdFields.addAll(fields);\n\t\t\t} else {\n\t\t\t\tJavacNode field = null, setFlag = null;\n\t\t\t\tfor (JavacNode exists : existing) {\n\t\t\t\t\tName n = ((JCVariableDecl) exists.get()).name;\n\t\t\t\t\tif (n.equals(bfd.builderFieldName)) field = exists;\n\t\t\t\t\tif (n.equals(bfd.nameOfSetFlag)) setFlag = exists;\n\t\t\t\t}\n\t\t\t\tJavacTreeMaker maker = builderType.getTreeMaker();\n\t\t\t\tif (field == null) {\n\t\t\t\t\tJCModifiers mods = maker.Modifiers(Flags.PRIVATE);\n\t\t\t\t\tJCVariableDecl newField = maker.VarDef(mods, bfd.builderFieldName, cloneType(maker, bfd.type, source), null);\n\t\t\t\t\tfield = injectFieldAndMarkGenerated(builderType, newField);\n\t\t\t\t\tgenerated.add(newField);\n\t\t\t\t}\n\t\t\t\tif (setFlag == null && bfd.nameOfSetFlag != null) {\n\t\t\t\t\tJCModifiers mods = maker.Modifiers(Flags.PRIVATE);\n\t\t\t\t\tJCVariableDecl newField = maker.VarDef(mods, bfd.nameOfSetFlag, maker.TypeIdent(CTC_BOOLEAN), null);\n\t\t\t\t\tinjectFieldAndMarkGenerated(builderType, newField);\n\t\t\t\t\tgenerated.add(newField);\n\t\t\t\t}\n\t\t\t\tbfd.createdFields.add(field);\n\t\t\t}\n\t\t}\n\t\tfor (JCVariableDecl gen : generated)  recursiveSetGeneratedBy(gen, source);\n\t}\n\t\n\tprivate void generateSetterMethodsForBuilder(final SuperBuilderJob job, BuilderFieldData fieldNode, final String builderGenericName, String setterPrefix) {\n\t\tboolean deprecate = isFieldDeprecated(fieldNode.originalFieldNode);\n\t\tfinal JavacTreeMaker maker = job.getTreeMaker();\n\t\tExpressionMaker returnTypeMaker = new ExpressionMaker() { @Override public JCExpression make() {\n\t\t\treturn maker.Ident(job.toName(builderGenericName));\n\t\t}};\n\t\t\n\t\tStatementMaker returnStatementMaker = new StatementMaker() { @Override public JCStatement make() {\n\t\t\treturn maker.Return(maker.Apply(List.<JCExpression>nil(), maker.Ident(job.toName(SELF_METHOD)), List.<JCExpression>nil()));\n\t\t}};\n\t\t\n\t\tif (fieldNode.singularData == null || fieldNode.singularData.getSingularizer() == null) {\n\t\t\tgenerateSimpleSetterMethodForBuilder(job, deprecate, fieldNode.createdFields.get(0), fieldNode.name, fieldNode.nameOfSetFlag, returnTypeMaker.make(), returnStatementMaker.make(), fieldNode.annotations, fieldNode.originalFieldNode, setterPrefix);\n\t\t} else {\n\t\t\tfieldNode.singularData.getSingularizer().generateMethods(job.checkerFramework, fieldNode.singularData, deprecate, job.builderType,\n\t\t\t\tjob.sourceNode, true, returnTypeMaker, returnStatementMaker, AccessLevel.PUBLIC);\n\t\t}\n\t}\n\t\n\tprivate void generateSimpleSetterMethodForBuilder(SuperBuilderJob job, boolean deprecate, JavacNode fieldNode, Name paramName, Name nameOfSetFlag, JCExpression returnType, JCStatement returnStatement, List<JCAnnotation> annosOnParam, JavacNode originalFieldNode, String setterPrefix) {\n\t\tString setterName = HandlerUtil.buildAccessorName(job.sourceNode, setterPrefix, paramName.toString());\n\t\tName setterName_ = job.builderType.toName(setterName);\n\t\t\n\t\tfor (JavacNode child : job.builderType.down()) {\n\t\t\tif (child.getKind() != Kind.METHOD) continue;\n\t\t\tJCMethodDecl methodDecl = (JCMethodDecl) child.get();\n\t\t\tName existingName = methodDecl.name;\n\t\t\tif (existingName.equals(setterName_) && !isTolerate(fieldNode, methodDecl)) return;\n\t\t}\n\t\t\n\t\tJavacTreeMaker maker = fieldNode.getTreeMaker();\n\t\t\n\t\tList<JCAnnotation> methodAnns = JavacHandlerUtil.findCopyableToSetterAnnotations(originalFieldNode, true);\n\t\treturnType = addCheckerFrameworkReturnsReceiver(returnType, maker, job.builderType, job.checkerFramework);\n\n\t\tJCMethodDecl newMethod = HandleSetter.createSetter(Flags.PUBLIC, deprecate, fieldNode, maker, setterName, paramName, nameOfSetFlag, returnType, returnStatement, job.sourceNode, methodAnns, annosOnParam);\n\t\tif (job.sourceNode.up().getKind() == Kind.METHOD) {\n\t\t\tcopyJavadocFromParam(originalFieldNode.up(), newMethod, paramName.toString());\n\t\t} else {\n\t\t\tcopyJavadoc(originalFieldNode, newMethod, CopyJavadoc.SETTER, true);\n\t\t}\n\t\tinjectMethod(job.builderType, newMethod);\n\t}\n\t\n\tprivate void addObtainVia(BuilderFieldData bfd, JavacNode node) {\n\t\tfor (JavacNode child : node.down()) {\n\t\t\tif (!annotationTypeMatches(ObtainVia.class, child)) continue;\n\t\t\tAnnotationValues<ObtainVia> ann = createAnnotation(ObtainVia.class, child);\n\t\t\tbfd.obtainVia = ann.getInstance();\n\t\t\tbfd.obtainViaNode = child;\n\t\t\tdeleteAnnotationIfNeccessary(child, ObtainVia.class);\n\t\t\treturn;\n\t\t}\n\t}\n\t\n\t/**\n\t * Returns the explicitly requested singular annotation on this node (field\n\t * or parameter), or null if there's no {@code @Singular} annotation on it.\n\t *\n\t * @param node The node (field or method param) to inspect for its name and potential {@code @Singular} annotation.\n\t * @param setterPrefix the prefix for setter methods\n\t */\n\tprivate SingularData getSingularData(JavacNode node, String setterPrefix) {\n\t\tfor (JavacNode child : node.down()) {\n\t\t\tif (!annotationTypeMatches(Singular.class, child)) continue;\n\t\t\tName pluralName = node.getKind() == Kind.FIELD ? removePrefixFromField(node) : ((JCVariableDecl) node.get()).name;\n\t\t\tAnnotationValues<Singular> ann = createAnnotation(Singular.class, child);\n\t\t\tSingular singularInstance = ann.getInstance();\n\t\t\tdeleteAnnotationIfNeccessary(child, Singular.class);\n\t\t\tString explicitSingular = singularInstance.value();\n\t\t\tif (explicitSingular.isEmpty()) {\n\t\t\t\tif (Boolean.FALSE.equals(node.getAst().readConfiguration(ConfigurationKeys.SINGULAR_AUTO))) {\n\t\t\t\t\tnode.addError(\"The singular must be specified explicitly (e.g. @Singular(\\\"task\\\")) because auto singularization is disabled.\");\n\t\t\t\t\texplicitSingular = pluralName.toString();\n\t\t\t\t} else {\n\t\t\t\t\texplicitSingular = autoSingularize(pluralName.toString());\n\t\t\t\t\tif (explicitSingular == null) {\n\t\t\t\t\t\tnode.addError(\"Can't singularize this name; please specify the singular explicitly (i.e. @Singular(\\\"sheep\\\"))\");\n\t\t\t\t\t\texplicitSingular = pluralName.toString();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tName singularName = node.toName(explicitSingular);\n\t\t\t\n\t\t\tJCExpression type = null;\n\t\t\tif (node.get() instanceof JCVariableDecl) type = ((JCVariableDecl) node.get()).vartype;\n\t\t\t\n\t\t\tString name = null;\n\t\t\tList<JCExpression> typeArgs = List.nil();\n\t\t\tif (type instanceof JCTypeApply) {\n\t\t\t\ttypeArgs = ((JCTypeApply) type).arguments;\n\t\t\t\ttype = ((JCTypeApply) type).clazz;\n\t\t\t}\n\t\t\t\n\t\t\tname = type.toString();\n\t\t\t\n\t\t\tString targetFqn = JavacSingularsRecipes.get().toQualified(name);\n\t\t\tJavacSingularizer singularizer = JavacSingularsRecipes.get().getSingularizer(targetFqn, node);\n\t\t\tif (singularizer == null) {\n\t\t\t\tnode.addError(\"Lombok does not know how to create the singular-form builder methods for type '\" + name + \"'; they won't be generated.\");\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t\n\t\t\treturn new SingularData(child, singularName, pluralName, typeArgs, targetFqn, singularizer, singularInstance.ignoreNullCollections(), setterPrefix);\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\t\n\tprivate java.util.HashSet<String> gatherUsedTypeNames(List<JCTypeParameter> typeParams, JCClassDecl td) {\n\t\tjava.util.HashSet<String> usedNames = new HashSet<String>();\n\t\t\n\t\t// 1. Add type parameter names.\n\t\tfor (JCTypeParameter typeParam : typeParams) usedNames.add(typeParam.getName().toString());\n\t\t\n\t\t// 2. Add class name.\n\t\tusedNames.add(td.name.toString());\n\t\t\n\t\t// 3. Add used type names.\n\t\tfor (JCTree member : td.getMembers()) {\n\t\t\tif (member.getKind() == com.sun.source.tree.Tree.Kind.VARIABLE && member instanceof JCVariableDecl) {\n\t\t\t\tJCTree type = ((JCVariableDecl)member).getType();\n\t\t\t\tif (type instanceof JCIdent) usedNames.add(((JCIdent)type).getName().toString());\n\t\t\t}\n\t\t}\n\t\t\n\t\t// 4. Add extends and implements clauses.\n\t\taddFirstToken(usedNames, Javac.getExtendsClause(td));\n\t\tfor (JCExpression impl : td.getImplementsClause()) addFirstToken(usedNames, impl);\n\t\t\n\t\treturn usedNames;\n\t}\n\t\n\tprivate void addFirstToken(java.util.Set<String> usedNames, JCTree type) {\n\t\tif (type == null) \n\t\t\treturn;\n\t\tif (type instanceof JCTypeApply) {\n\t\t\ttype = ((JCTypeApply)type).clazz;\n\t\t}\n\t\twhile (type instanceof JCFieldAccess && ((JCFieldAccess)type).selected != null) {\n\t\t\t// Add the first token, because only that can collide.\n\t\t\ttype = ((JCFieldAccess) type).selected;\n\t\t}\n\t\tusedNames.add(type.toString());\n\t}\n\t\n\tprivate String generateNonclashingNameFor(String classGenericName, java.util.HashSet<String> typeParamStrings) {\n\t\tif (!typeParamStrings.contains(classGenericName)) return classGenericName;\n\t\tint counter = 2;\n\t\twhile (typeParamStrings.contains(classGenericName + counter)) counter++;\n\t\treturn classGenericName + counter;\n\t}\n\t\n\tprivate JavacNode findInnerClass(JavacNode parent, String name) {\n\t\tfor (JavacNode child : parent.down()) {\n\t\t\tif (child.getKind() != Kind.TYPE) continue;\n\t\t\tJCClassDecl td = (JCClassDecl) child.get();\n\t\t\tif (td.name.contentEquals(name)) return child;\n\t\t}\n\t\treturn null;\n\t}\n\t\n\tprivate ListBuffer<JCExpression> getTypeParamExpressions(List<? extends JCTree> typeParams, JavacTreeMaker maker, JavacNode source) {\n\t\tListBuffer<JCExpression> typeParamsForBuilderParameter = new ListBuffer<JCExpression>();\n\t\tfor (JCTree typeParam : typeParams) {\n\t\t\tif (typeParam instanceof JCTypeParameter) {\n\t\t\t\ttypeParamsForBuilderParameter.append(maker.Ident(((JCTypeParameter) typeParam).getName()));\n\t\t\t} else if (typeParam instanceof JCIdent) {\n\t\t\t\ttypeParamsForBuilderParameter.append(maker.Ident(((JCIdent) typeParam).getName()));\n\t\t\t} else if (typeParam instanceof JCFieldAccess) {\n\t\t\t\ttypeParamsForBuilderParameter.append(copySelect(maker, (JCFieldAccess) typeParam));\n\t\t\t} else if (typeParam instanceof JCTypeApply) {\n\t\t\t\ttypeParamsForBuilderParameter.append(cloneType(maker, (JCTypeApply) typeParam, source));\n\t\t\t} else if (typeParam instanceof JCArrayTypeTree) {\n\t\t\t\ttypeParamsForBuilderParameter.append(cloneType(maker, (JCArrayTypeTree) typeParam, source));\n\t\t\t} else if (JCAnnotatedTypeReflect.is(typeParam)) {\n\t\t\t\ttypeParamsForBuilderParameter.append(cloneType(maker, (JCExpression) typeParam, source));\n\t\t\t}\n\t\t}\n\t\treturn typeParamsForBuilderParameter;\n\t}\n\t\n\tprivate JCExpression copySelect(JavacTreeMaker maker, JCFieldAccess typeParam) {\n\t\tjava.util.List<Name> chainNames = new ArrayList<Name>();\n\t\tJCExpression expression = typeParam;\n\t\twhile (expression != null) {\n\t\t\tif (expression instanceof JCFieldAccess) {\n\t\t\t\tchainNames.add(((JCFieldAccess) expression).getIdentifier());\n\t\t\t\texpression = ((JCFieldAccess) expression).getExpression();\n\t\t\t} else if (expression instanceof JCIdent) {\n\t\t\t\tchainNames.add(((JCIdent) expression).getName());\n\t\t\t\texpression = null;\n\t\t\t}\n\t\t}\n\t\t\n\t\tCollections.reverse(chainNames);\n\t\tJCExpression typeParameter = null;\n\t\tfor (Name name : chainNames) {\n\t\t\tif (typeParameter == null) {\n\t\t\t\ttypeParameter = maker.Ident(name);\n\t\t\t} else {\n\t\t\t\ttypeParameter = maker.Select(typeParameter, name);\n\t\t\t}\n\t\t}\n\t\treturn typeParameter;\n\t}\n\t\n\t/**\n\t * Checks if there is a manual constructor in the given type with a single parameter (builder).\n\t */\n\tprivate boolean constructorExists(JavacNode type, String builderClassName) {\n\t\tif (type != null && type.get() instanceof JCClassDecl) {\n\t\t\tfor (JCTree def : ((JCClassDecl)type.get()).defs) {\n\t\t\t\tif (def instanceof JCMethodDecl) {\n\t\t\t\t\tJCMethodDecl md = (JCMethodDecl) def;\n\t\t\t\t\tString name = md.name.toString();\n\t\t\t\t\tboolean matches = name.equals(\"<init>\");\n\t\t\t\t\tif (isTolerate(type, md)) continue;\n\t\t\t\t\tif (matches && md.params != null && md.params.length() == 1) {\n\t\t\t\t\t\t// Cannot use typeMatches() here, because the parameter could be fully-qualified, partially-qualified, or not qualified.\n\t\t\t\t\t\t// A string-compare of the last part should work. If it's a false-positive, users could still @Tolerate it.\n\t\t\t\t\t\tString typeName = md.params.get(0).getType().toString();\n\t\t\t\t\t\tint lastIndexOfDot = typeName.lastIndexOf('.');\n\t\t\t\t\t\tif (lastIndexOfDot >= 0) {\n\t\t\t\t\t\t\ttypeName = typeName.substring(lastIndexOfDot + 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ((builderClassName+\"<?, ?>\").equals(typeName)) return true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleSuperBuilderRemove.java",
    "content": "/*\n * Copyright (C) 2020-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\n\nimport lombok.core.AlreadyHandledAnnotations;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.experimental.SuperBuilder;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.spi.Provides;\n\n@Provides\n@HandlerPriority(32768)\n@AlreadyHandledAnnotations\npublic class HandleSuperBuilderRemove extends JavacAnnotationHandler<SuperBuilder> {\n\t@Override public void handle(AnnotationValues<SuperBuilder> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\tdeleteAnnotationIfNeccessary(annotationNode, SuperBuilder.class);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleSynchronized.java",
    "content": "/*\n * Copyright (C) 2009-2023 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.javac.Javac.*;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\nimport lombok.ConfigurationKeys;\nimport lombok.Synchronized;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacTreeMaker;\nimport lombok.javac.handlers.JavacHandlerUtil.MemberExistsResult;\nimport lombok.spi.Provides;\n\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCNewArray;\nimport com.sun.tools.javac.tree.JCTree.JCStatement;\nimport com.sun.tools.javac.tree.JCTree.JCTypeParameter;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.util.List;\n\n/**\n * Handles the {@code lombok.Synchronized} annotation for javac.\n */\n@Provides\n@HandlerPriority(value = 1024) // 2^10; @NonNull must have run first, so that we wrap around the statements generated by it.\npublic class HandleSynchronized extends JavacAnnotationHandler<Synchronized> {\n\tprivate static final String INSTANCE_LOCK_NAME = \"$lock\";\n\tprivate static final String STATIC_LOCK_NAME = \"$LOCK\";\n\t\n\t@Override public void handle(AnnotationValues<Synchronized> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.SYNCHRONIZED_FLAG_USAGE, \"@Synchronized\");\n\t\t\n\t\tif (inNetbeansEditor(annotationNode)) return;\n\t\tdeleteAnnotationIfNeccessary(annotationNode, Synchronized.class);\n\t\t\n\t\tJavacNode methodNode = annotationNode.up();\n\t\t\n\t\tif (methodNode == null || methodNode.getKind() != Kind.METHOD || !(methodNode.get() instanceof JCMethodDecl)) {\n\t\t\tannotationNode.addError(\"@Synchronized is legal only on methods.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tJCMethodDecl method = (JCMethodDecl)methodNode.get();\n\t\t\n\t\tif ((method.mods.flags & Flags.ABSTRACT) != 0) {\n\t\t\tannotationNode.addError(\"@Synchronized is legal only on concrete methods.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tJavacNode typeNode = upToTypeNode(annotationNode);\n\t\tif (!isClassOrEnum(typeNode)) {\n\t\t\tannotationNode.addError(\"@Synchronized is legal only on methods in classes and enums.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tboolean isStatic = (method.mods.flags & Flags.STATIC) != 0;\n\t\tString lockName = annotation.getInstance().value();\n\t\tboolean autoMake = false;\n\t\tif (lockName.length() == 0) {\n\t\t\tautoMake = true;\n\t\t\tlockName = isStatic ? STATIC_LOCK_NAME : INSTANCE_LOCK_NAME;\n\t\t}\n\t\t\n\t\tJavacTreeMaker maker = methodNode.getTreeMaker().at(ast.pos);\n\t\t\n\t\tMemberExistsResult exists = MemberExistsResult.NOT_EXISTS;\n\t\t\n\t\tif (typeNode != null && typeNode.get() instanceof JCClassDecl) {\n\t\t\tfor (JCTree def : ((JCClassDecl) typeNode.get()).defs) {\n\t\t\t\tif (def instanceof JCVariableDecl) {\n\t\t\t\t\tif (((JCVariableDecl) def).name.contentEquals(lockName)) {\n\t\t\t\t\t\texists = getGeneratedBy(def) == null ? MemberExistsResult.EXISTS_BY_USER : MemberExistsResult.EXISTS_BY_LOMBOK;\n\t\t\t\t\t\tboolean st = ((((JCVariableDecl) def).mods.flags) & Flags.STATIC) != 0;\n\t\t\t\t\t\tif (isStatic && !st) {\n\t\t\t\t\t\t\tannotationNode.addError(\"The field \" + lockName + \" is non-static and this cannot be used on this static method\");\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tisStatic = st;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (exists == MemberExistsResult.NOT_EXISTS) {\n\t\t\tif (!autoMake) {\n\t\t\t\tannotationNode.addError(\"The field \" + lockName + \" does not exist.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tJCExpression objectType = genJavaLangTypeRef(methodNode, ast.pos, \"Object\");\n\t\t\t//We use 'new Object[0];' because unlike 'new Object();', empty arrays *ARE* serializable!\n\t\t\tJCNewArray newObjectArray = maker.NewArray(genJavaLangTypeRef(methodNode, ast.pos, \"Object\"),\n\t\t\t\tList.<JCExpression>of(maker.Literal(CTC_INT, 0)), null);\n\t\t\tJCVariableDecl fieldDecl = recursiveSetGeneratedBy(maker.VarDef(\n\t\t\t\tmaker.Modifiers(Flags.PRIVATE | Flags.FINAL | (isStatic ? Flags.STATIC : 0)),\n\t\t\t\tmethodNode.toName(lockName), objectType, newObjectArray), annotationNode);\n\t\t\tinjectFieldAndMarkGenerated(methodNode.up(), fieldDecl);\n\t\t}\n\t\t\n\t\tif (method.body == null) return;\n\t\t\n\t\tJCExpression lockNode;\n\t\tif (isStatic) {\n\t\t\tlockNode = namePlusTypeParamsToTypeReference(maker, typeNode, methodNode.toName(lockName), false, List.<JCTypeParameter>nil());\n\t\t} else {\n\t\t\tlockNode = maker.Select(maker.Ident(methodNode.toName(\"this\")), methodNode.toName(lockName));\n\t\t}\n\t\t\n\t\trecursiveSetGeneratedBy(lockNode, annotationNode);\n\t\tmethod.body = setGeneratedBy(maker.Block(0, List.<JCStatement>of(setGeneratedBy(maker.Synchronized(lockNode, method.body), annotationNode))), annotationNode);\n\t\t\n\t\tmethodNode.rebuild();\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleToString.java",
    "content": "/*\n * Copyright (C) 2009-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\nimport static lombok.javac.Javac.*;\n\nimport java.util.Collection;\n\nimport lombok.ConfigurationKeys;\nimport lombok.ToString;\nimport lombok.core.AnnotationValues;\nimport lombok.core.configuration.CallSuperType;\nimport lombok.core.configuration.CheckerFrameworkVersion;\nimport lombok.core.AST.Kind;\nimport lombok.core.handlers.InclusionExclusionUtils;\nimport lombok.core.handlers.InclusionExclusionUtils.Included;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacTreeMaker;\nimport lombok.spi.Provides;\n\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCArrayTypeTree;\nimport com.sun.tools.javac.tree.JCTree.JCBlock;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCMethodInvocation;\nimport com.sun.tools.javac.tree.JCTree.JCModifiers;\nimport com.sun.tools.javac.tree.JCTree.JCPrimitiveTypeTree;\nimport com.sun.tools.javac.tree.JCTree.JCStatement;\nimport com.sun.tools.javac.tree.JCTree.JCTypeParameter;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.util.List;\n\n/**\n * Handles the {@code ToString} annotation for javac.\n */\n@Provides\npublic class HandleToString extends JavacAnnotationHandler<ToString> {\n\t@Override public void handle(AnnotationValues<ToString> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.TO_STRING_FLAG_USAGE, \"@ToString\");\n\t\t\n\t\tdeleteAnnotationIfNeccessary(annotationNode, ToString.class);\n\t\t\n\t\tToString ann = annotation.getInstance();\n\t\tboolean onlyExplicitlyIncluded = annotationNode.getAst().getBooleanAnnotationValue(annotation, \"onlyExplicitlyIncluded\", ConfigurationKeys.TO_STRING_ONLY_EXPLICITLY_INCLUDED);\n\t\tjava.util.List<Included<JavacNode, ToString.Include>> members = InclusionExclusionUtils.handleToStringMarking(annotationNode.up(), onlyExplicitlyIncluded, annotation, annotationNode);\n\t\tif (members == null) return;\n\t\t\n\t\tBoolean callSuper = ann.callSuper();\n\t\t\n\t\tif (!annotation.isExplicit(\"callSuper\")) callSuper = null;\n\t\t\n\t\tBoolean doNotUseGettersConfiguration = annotationNode.getAst().readConfiguration(ConfigurationKeys.TO_STRING_DO_NOT_USE_GETTERS);\n\t\tboolean doNotUseGetters = annotation.isExplicit(\"doNotUseGetters\") || doNotUseGettersConfiguration == null ? ann.doNotUseGetters() : doNotUseGettersConfiguration;\n\t\tFieldAccess fieldAccess = doNotUseGetters ? FieldAccess.PREFER_FIELD : FieldAccess.GETTER;\n\t\t\n\t\tboolean includeFieldNames = annotationNode.getAst().getBooleanAnnotationValue(annotation, \"includeFieldNames\", ConfigurationKeys.TO_STRING_INCLUDE_FIELD_NAMES);\n\t\t\n\t\tgenerateToString(annotationNode.up(), annotationNode, members, includeFieldNames, callSuper, true, fieldAccess);\n\t}\n\t\n\tpublic void generateToStringForType(JavacNode typeNode, JavacNode errorNode) {\n\t\tif (hasAnnotation(ToString.class, typeNode)) {\n\t\t\t//The annotation will make it happen, so we can skip it.\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tAnnotationValues<ToString> anno = AnnotationValues.of(ToString.class);\n\t\tboolean includeFieldNames = typeNode.getAst().getBooleanAnnotationValue(anno, \"includeFieldNames\", ConfigurationKeys.TO_STRING_INCLUDE_FIELD_NAMES);\n\t\tboolean onlyExplicitlyIncluded = typeNode.getAst().getBooleanAnnotationValue(anno, \"onlyExplicitlyIncluded\", ConfigurationKeys.TO_STRING_ONLY_EXPLICITLY_INCLUDED);\n\t\t\n\t\tBoolean doNotUseGettersConfiguration = typeNode.getAst().readConfiguration(ConfigurationKeys.TO_STRING_DO_NOT_USE_GETTERS);\n\t\tFieldAccess access = doNotUseGettersConfiguration == null || !doNotUseGettersConfiguration ? FieldAccess.GETTER : FieldAccess.PREFER_FIELD;\n\t\t\n\t\tjava.util.List<Included<JavacNode, ToString.Include>> members = InclusionExclusionUtils.handleToStringMarking(typeNode, onlyExplicitlyIncluded, null, null);\n\t\tgenerateToString(typeNode, errorNode, members, includeFieldNames, null, false, access);\n\t}\n\t\n\tpublic void generateToString(JavacNode typeNode, JavacNode source, java.util.List<Included<JavacNode, ToString.Include>> members,\n\t\tboolean includeFieldNames, Boolean callSuper, boolean whineIfExists, FieldAccess fieldAccess) {\n\t\t\n\t\tif (!isClassOrEnum(typeNode)) {\n\t\t\tsource.addError(\"@ToString is only supported on a class or enum.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tswitch (methodExists(\"toString\", typeNode, 0)) {\n\t\tcase NOT_EXISTS:\n\t\t\tif (callSuper == null) {\n\t\t\t\tif (isDirectDescendantOfObject(typeNode)) {\n\t\t\t\t\tcallSuper = false;\n\t\t\t\t} else {\n\t\t\t\t\tCallSuperType cst = typeNode.getAst().readConfiguration(ConfigurationKeys.TO_STRING_CALL_SUPER);\n\t\t\t\t\tif (cst == null) cst = CallSuperType.SKIP;\n\t\t\t\t\tswitch (cst) {\n\t\t\t\t\tdefault:\n\t\t\t\t\tcase SKIP:\n\t\t\t\t\t\tcallSuper = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase WARN:\n\t\t\t\t\t\tsource.addWarning(\"Generating toString implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is intentional, add '@ToString(callSuper=false)' to your type.\");\n\t\t\t\t\t\tcallSuper = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase CALL:\n\t\t\t\t\t\tcallSuper = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tJCMethodDecl method = createToString(typeNode, members, includeFieldNames, callSuper, fieldAccess, source);\n\t\t\tinjectMethod(typeNode, method);\n\t\t\tbreak;\n\t\tcase EXISTS_BY_LOMBOK:\n\t\t\tbreak;\n\t\tdefault:\n\t\tcase EXISTS_BY_USER:\n\t\t\tif (whineIfExists) {\n\t\t\t\tsource.addWarning(\"Not generating toString(): A method with that name already exists\");\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tstatic JCMethodDecl createToString(JavacNode typeNode, Collection<Included<JavacNode, ToString.Include>> members,\n\t\tboolean includeNames, boolean callSuper, FieldAccess fieldAccess, JavacNode source) {\n\t\t\n\t\tJavacTreeMaker maker = typeNode.getTreeMaker();\n\t\t\n\t\tJCAnnotation overrideAnnotation = maker.Annotation(genJavaLangTypeRef(typeNode, \"Override\"), List.<JCExpression>nil());\n\t\tList<JCAnnotation> annsOnMethod = List.of(overrideAnnotation);\n\t\tif (getCheckerFrameworkVersion(typeNode).generateSideEffectFree()) annsOnMethod = annsOnMethod.prepend(maker.Annotation(genTypeRef(typeNode, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil()));\n\t\tJCModifiers mods = maker.Modifiers(Flags.PUBLIC, annsOnMethod);\n\t\tJCExpression returnType = genJavaLangTypeRef(typeNode, \"String\");\n\t\t\n\t\tboolean first = true;\n\t\t\n\t\tString typeName = getTypeName(typeNode);\n\t\tboolean isEnum = typeNode.isEnumType();\n\t\t\n\t\tString infix = \", \";\n\t\tString suffix = \")\";\n\t\tString prefix;\n\t\tif (callSuper) {\n\t\t\tprefix = \"(super=\";\n\t\t} else if (members.isEmpty()) {\n\t\t\tprefix = isEnum ? \"\" : \"()\";\n\t\t} else if (includeNames) {\n\t\t\tIncluded<JavacNode, ToString.Include> firstMember = members.iterator().next();\n\t\t\tString name = firstMember.getInc() == null ? \"\" : firstMember.getInc().name();\n\t\t\tif (name.isEmpty()) name = firstMember.getNode().getName();\n\t\t\tprefix = \"(\" + name + \"=\";\n\t\t} else {\n\t\t\tprefix = \"(\";\n\t\t}\n\t\t\n\t\tJCExpression current;\n\t\tif (!isEnum) { \n\t\t\tcurrent = maker.Literal(typeName + prefix);\n\t\t} else {\n\t\t\tcurrent = maker.Binary(CTC_PLUS, maker.Literal(typeName + \".\"), maker.Apply(List.<JCExpression>nil(),\n\t\t\t\t\tmaker.Select(maker.Ident(typeNode.toName(\"this\")), typeNode.toName(\"name\")),\n\t\t\t\t\tList.<JCExpression>nil()));\n\t\t\tif (!prefix.isEmpty()) current = maker.Binary(CTC_PLUS, current, maker.Literal(prefix));\n\t\t}\n\t\t\n\t\t\n\t\tif (callSuper) {\n\t\t\tJCMethodInvocation callToSuper = maker.Apply(List.<JCExpression>nil(),\n\t\t\t\tmaker.Select(maker.Ident(typeNode.toName(\"super\")), typeNode.toName(\"toString\")),\n\t\t\t\tList.<JCExpression>nil());\n\t\t\tcurrent = maker.Binary(CTC_PLUS, current, callToSuper);\n\t\t\tfirst = false;\n\t\t}\n\t\t\n\t\tfor (Included<JavacNode, ToString.Include> member : members) {\n\t\t\tJCExpression expr;\n\t\t\t\n\t\t\tJCExpression memberAccessor;\n\t\t\tJavacNode memberNode = member.getNode();\n\t\t\tif (memberNode.getKind() == Kind.METHOD) {\n\t\t\t\tmemberAccessor = createMethodAccessor(maker, memberNode);\n\t\t\t} else {\n\t\t\t\tmemberAccessor = createFieldAccessor(maker, memberNode, fieldAccess);\n\t\t\t}\n\t\t\t\n\t\t\tJCExpression memberType = removeTypeUseAnnotations(getFieldType(memberNode, fieldAccess));\n\t\t\t\n\t\t\t// The distinction between primitive and object will be useful if we ever add a 'hideNulls' option.\n\t\t\t@SuppressWarnings(\"unused\")\n\t\t\tboolean fieldIsPrimitive = memberType instanceof JCPrimitiveTypeTree;\n\t\t\tboolean fieldIsPrimitiveArray = memberType instanceof JCArrayTypeTree && ((JCArrayTypeTree) memberType).elemtype instanceof JCPrimitiveTypeTree;\n\t\t\tboolean fieldIsObjectArray = !fieldIsPrimitiveArray && memberType instanceof JCArrayTypeTree;\n\t\t\t\n\t\t\tif (fieldIsPrimitiveArray || fieldIsObjectArray) {\n\t\t\t\tJCExpression tsMethod = chainDots(typeNode, \"java\", \"util\", \"Arrays\", fieldIsObjectArray ? \"deepToString\" : \"toString\");\n\t\t\t\texpr = maker.Apply(List.<JCExpression>nil(), tsMethod, List.<JCExpression>of(memberAccessor));\n\t\t\t} else expr = memberAccessor;\n\t\t\t\n\t\t\tif (first) {\n\t\t\t\tcurrent = maker.Binary(CTC_PLUS, current, expr);\n\t\t\t\tfirst = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tif (includeNames) {\n\t\t\t\tString n = member.getInc() == null ? \"\" : member.getInc().name();\n\t\t\t\tif (n.isEmpty()) n = memberNode.getName();\n\t\t\t\tcurrent = maker.Binary(CTC_PLUS, current, maker.Literal(infix + n + \"=\"));\n\t\t\t} else {\n\t\t\t\tcurrent = maker.Binary(CTC_PLUS, current, maker.Literal(infix));\n\t\t\t}\n\t\t\t\n\t\t\tcurrent = maker.Binary(CTC_PLUS, current, expr);\n\t\t}\n\t\t\n\t\tif (!first) current = maker.Binary(CTC_PLUS, current, maker.Literal(suffix));\n\t\t\n\t\tJCStatement returnStatement = maker.Return(current);\n\t\t\n\t\tJCBlock body = maker.Block(0, List.of(returnStatement));\n\t\t\n\t\tJCMethodDecl methodDef = maker.MethodDef(mods, typeNode.toName(\"toString\"), returnType,\n\t\t\tList.<JCTypeParameter>nil(), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), body, null);\n\t\tcreateRelevantNonNullAnnotation(typeNode, methodDef);\n\t\treturn recursiveSetGeneratedBy(methodDef, source);\n\t}\n\t\n\tpublic static String getTypeName(JavacNode typeNode) {\n\t\tString typeName = typeNode.getName();\n\t\tJavacNode upType = typeNode.up();\n\t\twhile (upType.getKind() == Kind.TYPE && !upType.getName().isEmpty()) {\n\t\t\ttypeName = upType.getName() + \".\" + typeName;\n\t\t\tupType = upType.up();\n\t\t}\n\t\treturn typeName;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleUtilityClass.java",
    "content": "/*\n * Copyright (C) 2015-2024 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.handleExperimentalFlagUsage;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.code.Symbol.ClassSymbol;\nimport com.sun.tools.javac.code.Type;\nimport com.sun.tools.javac.code.Type.ClassType;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCBlock;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCModifiers;\nimport com.sun.tools.javac.tree.JCTree.JCStatement;\nimport com.sun.tools.javac.tree.JCTree.JCTypeParameter;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.Name;\n\nimport lombok.ConfigurationKeys;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.experimental.UtilityClass;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacTreeMaker;\nimport lombok.spi.Provides;\n\n/**\n * Handles the {@code @UtilityClass} annotation for javac.\n */\n@HandlerPriority(-4096) //-2^12; to ensure @FieldDefaults picks up on the 'static' we set here.\n@Provides\npublic class HandleUtilityClass extends JavacAnnotationHandler<UtilityClass> {\n\t@Override public void handle(AnnotationValues<UtilityClass> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\thandleExperimentalFlagUsage(annotationNode, ConfigurationKeys.UTILITY_CLASS_FLAG_USAGE, \"@UtilityClass\");\n\t\t\n\t\tdeleteAnnotationIfNeccessary(annotationNode, UtilityClass.class);\n\t\t\n\t\tJavacNode typeNode = annotationNode.up();\n\t\tif (!checkLegality(typeNode, annotationNode)) return;\n\t\tchangeModifiersAndGenerateConstructor(annotationNode.up(), annotationNode);\n\t}\n\t\n\tprivate static boolean checkLegality(JavacNode typeNode, JavacNode errorNode) {\n\t\tif (!isClass(typeNode)) {\n\t\t\terrorNode.addError(\"@UtilityClass is only supported on a class.\");\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\t// It might be an inner class. This is okay, but only if it is / can be a static inner class. Thus, all of its parents have to be static inner classes until the top-level.\n\t\tJavacNode typeWalk = typeNode;\n\t\twhile (true) {\n\t\t\ttypeWalk = typeWalk.up();\n\t\t\tswitch (typeWalk.getKind()) {\n\t\t\tcase TYPE:\n\t\t\t\tJCClassDecl typeDef = (JCClassDecl) typeWalk.get();\n\t\t\t\tif ((typeDef.mods.flags & (Flags.STATIC | Flags.ANNOTATION | Flags.ENUM | Flags.INTERFACE)) != 0) continue;\n\t\t\t\tif (typeWalk.up().getKind() == Kind.COMPILATION_UNIT) return true;\n\t\t\t\terrorNode.addError(\"@UtilityClass automatically makes the class static, however, this class cannot be made static.\");\n\t\t\t\treturn false;\n\t\t\tcase COMPILATION_UNIT:\n\t\t\t\treturn true;\n\t\t\tdefault:\n\t\t\t\terrorNode.addError(\"@UtilityClass cannot be placed on a method local or anonymous inner class, or any class nested in such a class.\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate void changeModifiersAndGenerateConstructor(JavacNode typeNode, JavacNode errorNode) {\n\t\tJCClassDecl classDecl = (JCClassDecl) typeNode.get();\n\t\t\n\t\tboolean makeConstructor = true;\n\t\t\n\t\tclassDecl.mods.flags |= Flags.FINAL;\n\t\t\n\t\tboolean markStatic = true;\n\t\t\n\t\tif (typeNode.up().getKind() == Kind.COMPILATION_UNIT) markStatic = false;\n\t\tif (markStatic && typeNode.up().getKind() == Kind.TYPE) {\n\t\t\tJCClassDecl typeDecl = (JCClassDecl) typeNode.up().get();\n\t\t\tif ((typeDecl.mods.flags & (Flags.INTERFACE | Flags.ANNOTATION)) != 0) markStatic = false;\n\t\t}\n\t\t\n\t\tif (markStatic) markClassAsStatic(classDecl);\n\t\t\n\t\tfor (JavacNode element : typeNode.down()) {\n\t\t\tif (element.getKind() == Kind.FIELD) {\n\t\t\t\tJCVariableDecl fieldDecl = (JCVariableDecl) element.get();\n\t\t\t\tfieldDecl.mods.flags |= Flags.STATIC;\n\t\t\t} else if (element.getKind() == Kind.METHOD) {\n\t\t\t\tJCMethodDecl methodDecl = (JCMethodDecl) element.get();\n\t\t\t\tif (methodDecl.name.contentEquals(\"<init>\")) {\n\t\t\t\t\tif (getGeneratedBy(methodDecl) == null && (methodDecl.mods.flags & Flags.GENERATEDCONSTR) == 0) {\n\t\t\t\t\t\telement.addError(\"@UtilityClasses cannot have declared constructors.\");\n\t\t\t\t\t\tmakeConstructor = false;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tmethodDecl.mods.flags |= Flags.STATIC;\n\t\t\t} else if (element.getKind() == Kind.TYPE) {\n\t\t\t\tmarkClassAsStatic((JCClassDecl) element.get());\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (makeConstructor) createPrivateDefaultConstructor(typeNode);\n\t}\n\t\n\tprivate void markClassAsStatic(JCClassDecl classDecl) {\n\t\tclassDecl.mods.flags |= Flags.STATIC; // maybe Flags.NOOUTERTHIS too?\n\t\tClassSymbol innerClassSymbol = classDecl.sym;\n\t\tif (innerClassSymbol != null && innerClassSymbol.type instanceof ClassType) {\n\t\t\tClassType classType = (ClassType) innerClassSymbol.type;\n\t\t\tclassType.setEnclosingType(Type.noType);\n\t\t\tinnerClassSymbol.erasure_field = null;\n\t\t}\n\t}\n\t\n\tprivate void createPrivateDefaultConstructor(JavacNode typeNode) {\n\t\tJavacTreeMaker maker = typeNode.getTreeMaker();\n\t\tJCModifiers mods = maker.Modifiers(Flags.PRIVATE, List.<JCAnnotation>nil());\n\t\t\n\t\tName name = typeNode.toName(\"<init>\");\n\t\tJCBlock block = maker.Block(0L, createThrowStatement(typeNode, maker));\n\t\tJCMethodDecl methodDef = maker.MethodDef(mods, name, null, List.<JCTypeParameter>nil(), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), block, null);\n\t\tJCMethodDecl constructor = recursiveSetGeneratedBy(methodDef, typeNode);\n\t\tJavacHandlerUtil.injectMethod(typeNode, constructor);\n\t}\n\t\n\tprivate List<JCStatement> createThrowStatement(JavacNode typeNode, JavacTreeMaker maker) {\n\t\tJCExpression exceptionType = genJavaLangTypeRef(typeNode, \"UnsupportedOperationException\");\n\t\tList<JCExpression> jceBlank = List.nil();\n\t\tJCExpression message = maker.Literal(\"This is a utility class and cannot be instantiated\");\n\t\tJCExpression exceptionInstance = maker.NewClass(null, jceBlank, exceptionType, List.of(message), null);\n\t\tJCStatement throwStatement = maker.Throw(exceptionInstance);\n\t\treturn List.of(throwStatement);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleVal.java",
    "content": "/*\n * Copyright (C) 2010-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.handleFlagUsage;\nimport static lombok.javac.handlers.HandleDelegate.HANDLE_DELEGATE_PRIORITY;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport java.lang.reflect.Field;\n\nimport lombok.ConfigurationKeys;\nimport lombok.val;\nimport lombok.var;\nimport lombok.core.HandlerPriority;\nimport lombok.javac.JavacASTAdapter;\nimport lombok.javac.JavacASTVisitor;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacResolution;\nimport lombok.javac.ResolutionResetNeeded;\nimport lombok.permit.Permit;\nimport lombok.spi.Provides;\n\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.code.Symtab;\nimport com.sun.tools.javac.code.Type;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCEnhancedForLoop;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCForLoop;\nimport com.sun.tools.javac.tree.JCTree.JCLiteral;\nimport com.sun.tools.javac.tree.JCTree.JCNewArray;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.util.List;\n\n@Provides(JavacASTVisitor.class)\n@HandlerPriority(HANDLE_DELEGATE_PRIORITY + 100) // run slightly after HandleDelegate; resolution needs to work, so if the RHS expression is i.e. a call to a generated getter, we have to run after that getter has been generated.\n@ResolutionResetNeeded\npublic class HandleVal extends JavacASTAdapter {\n\t\n\tprivate static boolean eq(String typeTreeToString, String key) {\n\t\treturn typeTreeToString.equals(key) || typeTreeToString.equals(\"lombok.\" + key) || typeTreeToString.equals(\"lombok.experimental.\" + key);\n\t}\n\t\n\t@SuppressWarnings(\"deprecation\") @Override\n\tpublic void endVisitLocal(JavacNode localNode, JCVariableDecl local) {\n\t\tJCTree typeTree = local.vartype;\n\t\tif (typeTree == null) return;\n\t\tString typeTreeToString = typeTree.toString();\n\t\tJavacNode typeNode = localNode.getNodeFor(typeTree);\n\t\t\n\t\tif (!(eq(typeTreeToString, \"val\") || eq(typeTreeToString, \"var\"))) return;\n\t\tboolean isVal = typeMatches(val.class, localNode, typeTree);\n\t\tboolean isVar = typeMatches(var.class, localNode, typeTree);\n\t\tif (!(isVal || isVar)) return;\n\t\t\n\t\tif (isVal) handleFlagUsage(localNode, ConfigurationKeys.VAL_FLAG_USAGE, \"val\");\n\t\tif (isVar) handleFlagUsage(localNode, ConfigurationKeys.VAR_FLAG_USAGE, \"var\");\n\t\t\n\t\tJCTree parentRaw = localNode.directUp().get();\n\t\tif (isVal && parentRaw instanceof JCForLoop) {\n\t\t\tlocalNode.addError(\"'val' is not allowed in old-style for loops\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (parentRaw instanceof JCForLoop && ((JCForLoop) parentRaw).getInitializer().size() > 1) {\n\t\t\tlocalNode.addError(\"'var' is not allowed in old-style for loops if there is more than 1 initializer\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tJCExpression rhsOfEnhancedForLoop = null;\n\t\tif (local.init == null) {\n\t\t\tif (parentRaw instanceof JCEnhancedForLoop) {\n\t\t\t\tJCEnhancedForLoop efl = (JCEnhancedForLoop) parentRaw;\n\t\t\t\tJCTree var = EnhancedForLoopReflect.getVarOrRecordPattern(efl);\n\t\t\t\tif (var == local) rhsOfEnhancedForLoop = efl.expr;\n\t\t\t}\n\t\t}\n\t\t\n\t\tfinal String annotation = typeTreeToString;\n\t\tif (rhsOfEnhancedForLoop == null && local.init == null) {\n\t\t\tlocalNode.addError(\"'\" + annotation + \"' on a local variable requires an initializer expression\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (local.init instanceof JCNewArray && ((JCNewArray)local.init).elemtype == null) {\n\t\t\tlocalNode.addError(\"'\" + annotation + \"' is not compatible with array initializer expressions. Use the full form (new int[] { ... } instead of just { ... })\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (localNode.shouldDeleteLombokAnnotations()) {\n\t\t\tJavacHandlerUtil.deleteImportFromCompilationUnit(localNode, val.class.getName());\n\t\t\tJavacHandlerUtil.deleteImportFromCompilationUnit(localNode, lombok.experimental.var.class.getName());\n\t\t\tJavacHandlerUtil.deleteImportFromCompilationUnit(localNode, var.class.getName());\n\t\t}\n\t\t\n\t\tif (isVal) local.mods.flags |= Flags.FINAL;\n\t\t\n\t\tif (!localNode.shouldDeleteLombokAnnotations()) {\n\t\t\tJCAnnotation valAnnotation = recursiveSetGeneratedBy(localNode.getTreeMaker().Annotation(local.vartype, List.<JCExpression>nil()), typeNode);\n\t\t\tlocal.mods.annotations = local.mods.annotations == null ? List.of(valAnnotation) : local.mods.annotations.append(valAnnotation);\n\t\t}\n\t\t\n\t\tif (localNode.getSourceVersion() >= 10) {\n\t\t\tlocal.vartype = null;\n\t\t\tlocalNode.getAst().setChanged();\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (JavacResolution.platformHasTargetTyping()) {\n\t\t\tlocal.vartype = localNode.getAst().getTreeMaker().Ident(localNode.getAst().toName(\"___Lombok_VAL_Attrib__\"));\n\t\t} else {\n\t\t\tlocal.vartype = JavacResolution.createJavaLangObject(localNode.getAst());\n\t\t}\n\t\t\n\t\tType type;\n\t\ttry {\n\t\t\tif (rhsOfEnhancedForLoop == null) {\n\t\t\t\tif (local.init.type == null) {\n\t\t\t\t\tif (isVar && local.init instanceof JCLiteral && ((JCLiteral) local.init).value == null) {\n\t\t\t\t\t\tlocalNode.addError(\"variable initializer is 'null'\");\n\t\t\t\t\t}\n\t\t\t\t\tJavacResolution resolver = new JavacResolution(localNode.getContext());\n\t\t\t\t\ttry {\n\t\t\t\t\t\ttype = ((JCExpression) resolver.resolveMethodMember(localNode).get(local.init)).type;\n\t\t\t\t\t} catch (RuntimeException e) {\n\t\t\t\t\t\tSystem.err.println(\"Exception while resolving: \" + localNode + \"(\" + localNode.getFileName() + \")\");\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttype = local.init.type;\n\t\t\t\t\tif (type.isErroneous()) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tJavacResolution resolver = new JavacResolution(localNode.getContext());\n\t\t\t\t\t\t\tlocal.type = Symtab.instance(localNode.getContext()).unknownType;\n\t\t\t\t\t\t\ttype = ((JCExpression) resolver.resolveMethodMember(localNode).get(local.init)).type;\n\t\t\t\t\t\t} catch (RuntimeException e) {\n\t\t\t\t\t\t\tSystem.err.println(\"Exception while resolving: \" + localNode + \"(\" + localNode.getFileName() + \")\");\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (rhsOfEnhancedForLoop.type == null) {\n\t\t\t\t\tJavacResolution resolver = new JavacResolution(localNode.getContext());\n\t\t\t\t\ttype = ((JCExpression) resolver.resolveMethodMember(localNode.directUp()).get(rhsOfEnhancedForLoop)).type;\n\t\t\t\t} else {\n\t\t\t\t\ttype = rhsOfEnhancedForLoop.type;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\ttry {\n\t\t\t\tJCExpression replacement;\n\t\t\t\t\n\t\t\t\tif (rhsOfEnhancedForLoop != null) {\n\t\t\t\t\tType componentType = JavacResolution.ifTypeIsIterableToComponent(type, localNode.getAst());\n\t\t\t\t\tif (componentType == null) replacement = JavacResolution.createJavaLangObject(localNode.getAst());\n\t\t\t\t\telse replacement = JavacResolution.typeToJCTree(componentType, localNode.getAst(), false);\n\t\t\t\t} else {\n\t\t\t\t\treplacement = JavacResolution.typeToJCTree(type, localNode.getAst(), false);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (replacement != null) {\n\t\t\t\t\tlocal.vartype = replacement;\n\t\t\t\t} else {\n\t\t\t\t\tlocal.vartype = JavacResolution.createJavaLangObject(localNode.getAst());\n\t\t\t\t}\n\t\t\t\tlocalNode.getAst().setChanged();\n\t\t\t} catch (JavacResolution.TypeNotConvertibleException e) {\n\t\t\t\tlocalNode.addError(\"Cannot use '\" + annotation + \"' here because initializer expression does not have a representable type: \" + e.getMessage());\n\t\t\t\tlocal.vartype = JavacResolution.createJavaLangObject(localNode.getAst());\n\t\t\t}\n\t\t} catch (RuntimeException e) {\n\t\t\tlocal.vartype = JavacResolution.createJavaLangObject(localNode.getAst());\n\t\t\tthrow e;\n\t\t} finally {\n\t\t\trecursiveSetGeneratedBy(local.vartype, typeNode);\n\t\t}\n\t}\n\t\n\tprivate static class EnhancedForLoopReflect {\n\t\tprivate static final Field varOrRecordPattern = Permit.permissiveGetField(JCEnhancedForLoop.class, \"varOrRecordPattern\");\n\t\t\n\t\tprivate static JCTree getVarOrRecordPattern(JCEnhancedForLoop loop) {\n\t\t\tif (varOrRecordPattern == null) {\n\t\t\t\treturn loop.var;\n\t\t\t}\n\t\t\t\n\t\t\ttry {\n\t\t\t\treturn (JCTree) varOrRecordPattern.get(loop);\n\t\t\t} catch (Exception ignore) {}\n\t\t\treturn null;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleValue.java",
    "content": "/*\n * Copyright (C) 2012-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport lombok.AccessLevel;\nimport lombok.ConfigurationKeys;\nimport lombok.core.AnnotationValues;\nimport lombok.core.HandlerPriority;\nimport lombok.experimental.NonFinal;\nimport lombok.Value;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.javac.handlers.HandleConstructor.SkipIfConstructorExists;\nimport lombok.spi.Provides;\n\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCModifiers;\nimport com.sun.tools.javac.util.List;\n\n/**\n * Handles the {@code lombok.Value} annotation for javac.\n */\n@Provides\n@HandlerPriority(-512) //-2^9; to ensure @EqualsAndHashCode and such pick up on this handler making the class final and messing with the fields' access levels, run earlier.\npublic class HandleValue extends JavacAnnotationHandler<Value> {\n\tprivate HandleFieldDefaults handleFieldDefaults = new HandleFieldDefaults();\n\tprivate HandleConstructor handleConstructor = new HandleConstructor();\n\tprivate HandleGetter handleGetter = new HandleGetter();\n\tprivate HandleEqualsAndHashCode handleEqualsAndHashCode = new HandleEqualsAndHashCode();\n\tprivate HandleToString handleToString = new HandleToString();\n\t\n\t@Override public void handle(AnnotationValues<Value> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.VALUE_FLAG_USAGE, \"@Value\");\n\t\t\n\t\tdeleteAnnotationIfNeccessary(annotationNode, Value.class, \"lombok.experimental.Value\");\n\t\tJavacNode typeNode = annotationNode.up();\n\t\tboolean notAClass = !isClass(typeNode);\n\t\t\n\t\tif (notAClass) {\n\t\t\tannotationNode.addError(\"@Value is only supported on a class.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tString staticConstructorName = annotation.getInstance().staticConstructor();\n\t\t\n\t\tif (!hasAnnotationAndDeleteIfNeccessary(NonFinal.class, typeNode)) {\n\t\t\tJCModifiers jcm = ((JCClassDecl) typeNode.get()).mods;\n\t\t\tif ((jcm.flags & Flags.FINAL) == 0) {\n\t\t\t\tjcm.flags |= Flags.FINAL;\n\t\t\t}\n\t\t}\n\t\thandleFieldDefaults.generateFieldDefaultsForType(typeNode, annotationNode, AccessLevel.PRIVATE, true, true);\n\t\thandleConstructor.generateAllArgsConstructor(typeNode, AccessLevel.PUBLIC, staticConstructorName, SkipIfConstructorExists.YES, annotationNode);\n\t\thandleConstructor.generateExtraNoArgsConstructor(typeNode, annotationNode);\n\t\thandleGetter.generateGetterForType(typeNode, annotationNode, AccessLevel.PUBLIC, true, List.<JCAnnotation>nil());\n\t\thandleEqualsAndHashCode.generateEqualsAndHashCodeForType(typeNode, annotationNode);\n\t\thandleToString.generateToStringForType(typeNode, annotationNode);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleWith.java",
    "content": "/*\n * Copyright (C) 2012-2022 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.javac.Javac.*;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport java.util.Collection;\n\nimport lombok.AccessLevel;\nimport lombok.ConfigurationKeys;\nimport lombok.With;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.core.configuration.CheckerFrameworkVersion;\nimport lombok.experimental.Accessors;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacTreeMaker;\nimport lombok.javac.handlers.JavacHandlerUtil.CopyJavadoc;\nimport lombok.spi.Provides;\n\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCBlock;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCConditional;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCNewClass;\nimport com.sun.tools.javac.tree.JCTree.JCReturn;\nimport com.sun.tools.javac.tree.JCTree.JCStatement;\nimport com.sun.tools.javac.tree.JCTree.JCTypeParameter;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.ListBuffer;\nimport com.sun.tools.javac.util.Name;\n\n/**\n * Handles the {@code lombok.With} annotation for javac.\n */\n@Provides\npublic class HandleWith extends JavacAnnotationHandler<With> {\n\tpublic void generateWithForType(JavacNode typeNode, JavacNode errorNode, AccessLevel level, boolean checkForTypeLevelWith) {\n\t\tif (checkForTypeLevelWith) {\n\t\t\tif (hasAnnotation(With.class, typeNode)) {\n\t\t\t\t//The annotation will make it happen, so we can skip it.\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t\n\t\tJCClassDecl typeDecl = null;\n\t\tif (typeNode.get() instanceof JCClassDecl) typeDecl = (JCClassDecl) typeNode.get();\n\t\tlong modifiers = typeDecl == null ? 0 : typeDecl.mods.flags;\n\t\tboolean notAClass = (modifiers & (Flags.INTERFACE | Flags.ANNOTATION | Flags.ENUM)) != 0;\n\t\t\n\t\tif (typeDecl == null || notAClass) {\n\t\t\terrorNode.addError(\"@With is only supported on a class or a field.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tfor (JavacNode field : typeNode.down()) {\n\t\t\tif (field.getKind() != Kind.FIELD) continue;\n\t\t\tJCVariableDecl fieldDecl = (JCVariableDecl) field.get();\n\t\t\t//Skip fields that start with $\n\t\t\tif (fieldDecl.name.toString().startsWith(\"$\")) continue;\n\t\t\t//Skip static fields.\n\t\t\tif ((fieldDecl.mods.flags & Flags.STATIC) != 0) continue;\n\t\t\t//Skip final initialized fields.\n\t\t\tif ((fieldDecl.mods.flags & Flags.FINAL) != 0 && fieldDecl.init != null) continue;\n\t\t\t\n\t\t\tgenerateWithForField(field, errorNode.get(), level);\n\t\t}\n\t}\n\t\n\t/**\n\t * Generates a with on the stated field.\n\t * \n\t * Used by {@link HandleValue}.\n\t * \n\t * The difference between this call and the handle method is as follows:\n\t * \n\t * If there is a {@code lombok.With} annotation on the field, it is used and the\n\t * same rules apply (e.g. warning if the method already exists, stated access level applies).\n\t * If not, the with is still generated if it isn't already there, though there will not\n\t * be a warning if its already there. The default access level is used.\n\t * \n\t * @param fieldNode The node representing the field you want a with for.\n\t * @param pos The node responsible for generating the with (the {@code @Value} or {@code @With} annotation).\n\t */\n\tpublic void generateWithForField(JavacNode fieldNode, DiagnosticPosition pos, AccessLevel level) {\n\t\tif (hasAnnotation(With.class, fieldNode)) {\n\t\t\t//The annotation will make it happen, so we can skip it.\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tcreateWithForField(level, fieldNode, fieldNode, false, List.<JCAnnotation>nil(), List.<JCAnnotation>nil());\n\t}\n\t\n\t@Override public void handle(AnnotationValues<With> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\thandleFlagUsage(annotationNode, ConfigurationKeys.WITH_FLAG_USAGE, \"@With\");\n\t\t\n\t\tCollection<JavacNode> fields = annotationNode.upFromAnnotationToFields();\n\t\tdeleteAnnotationIfNeccessary(annotationNode, With.class, \"lombok.experimental.Wither\");\n\t\tdeleteImportFromCompilationUnit(annotationNode, \"lombok.AccessLevel\");\n\t\tJavacNode node = annotationNode.up();\n\t\tAccessLevel level = annotation.getInstance().value();\n\t\t\n\t\tif (level == AccessLevel.NONE || node == null) return;\n\t\t\n\t\tList<JCAnnotation> onMethod = unboxAndRemoveAnnotationParameter(ast, \"onMethod\", \"@With(onMethod\", annotationNode);\n\t\tList<JCAnnotation> onParam = unboxAndRemoveAnnotationParameter(ast, \"onParam\", \"@With(onParam\", annotationNode);\n\t\t\n\t\tswitch (node.getKind()) {\n\t\tcase FIELD:\n\t\t\tcreateWithForFields(level, fields, annotationNode, true, onMethod, onParam);\n\t\t\tbreak;\n\t\tcase TYPE:\n\t\t\tif (!onMethod.isEmpty()) annotationNode.addError(\"'onMethod' is not supported for @With on a type.\");\n\t\t\tif (!onParam.isEmpty()) annotationNode.addError(\"'onParam' is not supported for @With on a type.\");\n\t\t\tgenerateWithForType(node, annotationNode, level, false);\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tpublic void createWithForFields(AccessLevel level, Collection<JavacNode> fieldNodes, JavacNode errorNode, boolean whineIfExists, List<JCAnnotation> onMethod, List<JCAnnotation> onParam) {\n\t\tfor (JavacNode fieldNode : fieldNodes) {\n\t\t\tcreateWithForField(level, fieldNode, errorNode, whineIfExists, onMethod, onParam);\n\t\t}\n\t}\n\t\n\tpublic void createWithForField(AccessLevel level, JavacNode fieldNode, JavacNode source, boolean strictMode, List<JCAnnotation> onMethod, List<JCAnnotation> onParam) {\n\t\tJavacNode typeNode = fieldNode.up();\n\t\tboolean makeAbstract = typeNode != null && typeNode.getKind() == Kind.TYPE && (((JCClassDecl) typeNode.get()).mods.flags & Flags.ABSTRACT) != 0;\n\t\t\n\t\tif (fieldNode.getKind() != Kind.FIELD) {\n\t\t\tfieldNode.addError(\"@With is only supported on a class or a field.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tAnnotationValues<Accessors> accessors = getAccessorsForField(fieldNode);\n\t\tJCVariableDecl fieldDecl = (JCVariableDecl) fieldNode.get();\n\t\tString methodName = toWithName(fieldNode, accessors);\n\t\t\n\t\tif (methodName == null) {\n\t\t\tfieldNode.addWarning(\"Not generating a withX method for this field: It does not fit your @Accessors prefix list.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif ((fieldDecl.mods.flags & Flags.STATIC) != 0) {\n\t\t\tif (strictMode) {\n\t\t\t\tfieldNode.addWarning(\"Not generating \" + methodName + \" for this field: With methods cannot be generated for static fields.\");\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif ((fieldDecl.mods.flags & Flags.FINAL) != 0 && fieldDecl.init != null) {\n\t\t\tif (strictMode) {\n\t\t\t\tfieldNode.addWarning(\"Not generating \" + methodName + \" for this field: With methods cannot be generated for final, initialized fields.\");\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (fieldDecl.name.toString().startsWith(\"$\")) {\n\t\t\tif (strictMode) {\n\t\t\t\tfieldNode.addWarning(\"Not generating \" + methodName + \" for this field: With methods cannot be generated for fields starting with $.\");\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tfor (String altName : toAllWithNames(fieldNode, accessors)) {\n\t\t\tswitch (methodExists(altName, fieldNode, false, 1)) {\n\t\t\tcase EXISTS_BY_LOMBOK:\n\t\t\t\treturn;\n\t\t\tcase EXISTS_BY_USER:\n\t\t\t\tif (strictMode) {\n\t\t\t\t\tString altNameExpl = \"\";\n\t\t\t\t\tif (!altName.equals(methodName)) altNameExpl = String.format(\" (%s)\", altName);\n\t\t\t\t\tfieldNode.addWarning(\n\t\t\t\t\t\tString.format(\"Not generating %s(): A method with that name already exists%s\", methodName, altNameExpl));\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\tcase NOT_EXISTS:\n\t\t\t\t//continue scanning the other alt names.\n\t\t\t}\n\t\t}\n\t\t\n\t\tlong access = toJavacModifier(level);\n\t\t\n\t\tJCMethodDecl createdWith = createWith(access, fieldNode, fieldNode.getTreeMaker(), source, onMethod, onParam, makeAbstract);\n\t\tcreateRelevantNonNullAnnotation(fieldNode, createdWith);\n\t\trecursiveSetGeneratedBy(createdWith, source);\n\t\tinjectMethod(typeNode, createdWith);\n\t}\n\t\n\tpublic JCMethodDecl createWith(long access, JavacNode field, JavacTreeMaker maker, JavacNode source, List<JCAnnotation> onMethod, List<JCAnnotation> onParam, boolean makeAbstract) {\n\t\tString withName = toWithName(field);\n\t\tif (withName == null) return null;\n\t\t\n\t\tJCVariableDecl fieldDecl = (JCVariableDecl) field.get();\n\t\t\n\t\tList<JCAnnotation> copyableAnnotations = findCopyableAnnotations(field);\n\t\t\n\t\tName methodName = field.toName(withName);\n\t\t\n\t\tJCExpression returnType = cloneSelfType(field);\n\t\t\n\t\tJCBlock methodBody = null;\n\t\tlong flags = JavacHandlerUtil.addFinalIfNeeded(Flags.PARAMETER, field.getContext());\n\t\tList<JCAnnotation> annsOnParam = copyAnnotations(onParam, maker).appendList(copyableAnnotations);\n\t\t\n\t\tJCExpression pType = cloneType(maker, fieldDecl.vartype, source);\n\t\tJCVariableDecl param = maker.VarDef(maker.Modifiers(flags, annsOnParam), fieldDecl.name, pType, null);\n\t\t\n\t\tif (!makeAbstract) {\n\t\t\tListBuffer<JCStatement> statements = new ListBuffer<JCStatement>();\n\t\t\t\n\t\t\tJCExpression selfType = cloneSelfType(field);\n\t\t\tif (selfType == null) return null;\n\t\t\t\n\t\t\tListBuffer<JCExpression> args = new ListBuffer<JCExpression>();\n\t\t\tfor (JavacNode child : field.up().down()) {\n\t\t\t\tif (child.getKind() != Kind.FIELD) continue;\n\t\t\t\tJCVariableDecl childDecl = (JCVariableDecl) child.get();\n\t\t\t\t// Skip fields that start with $\n\t\t\t\tif (childDecl.name.toString().startsWith(\"$\")) continue;\n\t\t\t\tlong fieldFlags = childDecl.mods.flags;\n\t\t\t\t// Skip static fields.\n\t\t\t\tif ((fieldFlags & Flags.STATIC) != 0) continue;\n\t\t\t\t// Skip initialized final fields.\n\t\t\t\tif (((fieldFlags & Flags.FINAL) != 0) && childDecl.init != null) continue;\n\t\t\t\tif (child.get() == field.get()) {\n\t\t\t\t\targs.append(maker.Ident(fieldDecl.name));\n\t\t\t\t} else {\n\t\t\t\t\targs.append(createFieldAccessor(maker, child, FieldAccess.ALWAYS_FIELD));\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tJCNewClass newClass = maker.NewClass(null, List.<JCExpression>nil(), selfType, args.toList(), null);\n\t\t\tJCExpression identityCheck = maker.Binary(CTC_EQUAL, createFieldAccessor(maker, field, FieldAccess.ALWAYS_FIELD), maker.Ident(fieldDecl.name));\n\t\t\tJCConditional conditional = maker.Conditional(identityCheck, maker.Ident(field.toName(\"this\")), newClass);\n\t\t\tJCReturn returnStatement = maker.Return(conditional);\n\t\t\t\n\t\t\tif (!hasNonNullAnnotations(field)) {\n\t\t\t\tstatements.append(returnStatement);\n\t\t\t} else {\n\t\t\t\tJCStatement nullCheck = generateNullCheck(maker, field, source);\n\t\t\t\tif (nullCheck != null) statements.append(nullCheck);\n\t\t\t\tstatements.append(returnStatement);\n\t\t\t}\n\t\t\t\n\t\t\tmethodBody = maker.Block(0, statements.toList());\n\t\t}\n\t\tList<JCTypeParameter> methodGenericParams = List.nil();\n\t\tList<JCVariableDecl> parameters = List.of(param);\n\t\tList<JCExpression> throwsClauses = List.nil();\n\t\tJCExpression annotationMethodDefaultValue = null;\n\t\t\n\t\tList<JCAnnotation> annsOnMethod = copyAnnotations(onMethod, maker);\n\t\tCheckerFrameworkVersion checkerFramework = getCheckerFrameworkVersion(source);\n\t\tif (checkerFramework.generateSideEffectFree()) annsOnMethod = annsOnMethod.prepend(maker.Annotation(genTypeRef(source, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil()));\n\t\t\n\t\tif (isFieldDeprecated(field)) annsOnMethod = annsOnMethod.prepend(maker.Annotation(genJavaLangTypeRef(field, \"Deprecated\"), List.<JCExpression>nil()));\n\t\t\n\t\tif (makeAbstract) access |= Flags.ABSTRACT;\n\t\tAnnotationValues<Accessors> accessors = JavacHandlerUtil.getAccessorsForField(field);\n\t\tboolean makeFinal = shouldMakeFinal(field, accessors);\n\t\tif (makeFinal) access |= Flags.FINAL;\n\t\tJCMethodDecl decl = recursiveSetGeneratedBy(maker.MethodDef(maker.Modifiers(access, annsOnMethod), methodName, returnType,\n\t\t\tmethodGenericParams, parameters, throwsClauses, methodBody, annotationMethodDefaultValue), source);\n\t\tcopyJavadoc(field, decl, CopyJavadoc.WITH);\n\t\treturn decl;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/HandleWithBy.java",
    "content": "/*\n * Copyright (C) 2020-2022 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport java.util.Collection;\n\nimport javax.lang.model.type.TypeKind;\n\nimport lombok.AccessLevel;\nimport lombok.ConfigurationKeys;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.core.LombokImmutableList;\nimport lombok.core.configuration.CheckerFrameworkVersion;\nimport lombok.experimental.Accessors;\nimport lombok.experimental.WithBy;\nimport lombok.javac.Javac;\nimport lombok.javac.JavacAnnotationHandler;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacTreeMaker;\nimport lombok.javac.JavacTreeMaker.TypeTag;\nimport lombok.javac.handlers.JavacHandlerUtil.CopyJavadoc;\nimport lombok.spi.Provides;\n\nimport com.sun.tools.javac.code.BoundKind;\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCBlock;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCNewClass;\nimport com.sun.tools.javac.tree.JCTree.JCPrimitiveTypeTree;\nimport com.sun.tools.javac.tree.JCTree.JCReturn;\nimport com.sun.tools.javac.tree.JCTree.JCStatement;\nimport com.sun.tools.javac.tree.JCTree.JCTypeParameter;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.ListBuffer;\nimport com.sun.tools.javac.util.Name;\n\n/**\n * Handles the {@code lombok.With} annotation for javac.\n */\n@Provides\npublic class HandleWithBy extends JavacAnnotationHandler<WithBy> {\n\tpublic void generateWithByForType(JavacNode typeNode, JavacNode errorNode, AccessLevel level, boolean checkForTypeLevelWithBy) {\n\t\tif (checkForTypeLevelWithBy) {\n\t\t\tif (hasAnnotation(WithBy.class, typeNode)) {\n\t\t\t\t//The annotation will make it happen, so we can skip it.\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t\n\t\tJCClassDecl typeDecl = null;\n\t\tif (typeNode.get() instanceof JCClassDecl) typeDecl = (JCClassDecl) typeNode.get();\n\t\tlong modifiers = typeDecl == null ? 0 : typeDecl.mods.flags;\n\t\tboolean notAClass = (modifiers & (Flags.INTERFACE | Flags.ANNOTATION | Flags.ENUM)) != 0;\n\t\t\n\t\tif (typeDecl == null || notAClass) {\n\t\t\terrorNode.addError(\"@WithBy is only supported on a class or a field.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tfor (JavacNode field : typeNode.down()) {\n\t\t\tif (field.getKind() != Kind.FIELD) continue;\n\t\t\tJCVariableDecl fieldDecl = (JCVariableDecl) field.get();\n\t\t\t//Skip fields that start with $\n\t\t\tif (fieldDecl.name.toString().startsWith(\"$\")) continue;\n\t\t\t//Skip static fields.\n\t\t\tif ((fieldDecl.mods.flags & Flags.STATIC) != 0) continue;\n\t\t\t//Skip final initialized fields.\n\t\t\tif ((fieldDecl.mods.flags & Flags.FINAL) != 0 && fieldDecl.init != null) continue;\n\t\t\t\n\t\t\tgenerateWithByForField(field, errorNode.get(), level);\n\t\t}\n\t}\n\t\n\t/**\n\t * Generates a withBy on the stated field.\n\t * \n\t * The difference between this call and the handle method is as follows:\n\t * \n\t * If there is a {@code lombok.experimental.WithBy} annotation on the field, it is used and the\n\t * same rules apply (e.g. warning if the method already exists, stated access level applies).\n\t * If not, the with is still generated if it isn't already there, though there will not\n\t * be a warning if its already there. The default access level is used.\n\t * \n\t * @param fieldNode The node representing the field you want a with for.\n\t * @param pos The node responsible for generating the {@code @WithBy} annotation.\n\t */\n\tpublic void generateWithByForField(JavacNode fieldNode, DiagnosticPosition pos, AccessLevel level) {\n\t\tif (hasAnnotation(WithBy.class, fieldNode)) {\n\t\t\t//The annotation will make it happen, so we can skip it.\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tcreateWithByForField(level, fieldNode, fieldNode, false, List.<JCAnnotation>nil());\n\t}\n\t\n\t@Override public void handle(AnnotationValues<WithBy> annotation, JCAnnotation ast, JavacNode annotationNode) {\n\t\thandleExperimentalFlagUsage(annotationNode, ConfigurationKeys.WITHBY_FLAG_USAGE, \"@WithBy\");\n\t\t\n\t\tdeleteAnnotationIfNeccessary(annotationNode, WithBy.class);\n\t\tdeleteImportFromCompilationUnit(annotationNode, \"lombok.AccessLevel\");\n\t\tJavacNode node = annotationNode.up();\n\t\tAccessLevel level = annotation.getInstance().value();\n\t\t\n\t\tif (level == AccessLevel.NONE || node == null) return;\n\t\t\n\t\tList<JCAnnotation> onMethod = unboxAndRemoveAnnotationParameter(ast, \"onMethod\", \"@WithBy(onMethod\", annotationNode);\n\t\t\n\t\tswitch (node.getKind()) {\n\t\tcase FIELD:\n\t\t\tcreateWithByForFields(level, annotationNode.upFromAnnotationToFields(), annotationNode, true, onMethod);\n\t\t\tbreak;\n\t\tcase TYPE:\n\t\t\tif (!onMethod.isEmpty()) annotationNode.addError(\"'onMethod' is not supported for @WithBy on a type.\");\n\t\t\tgenerateWithByForType(node, annotationNode, level, false);\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tpublic void createWithByForFields(AccessLevel level, Collection<JavacNode> fieldNodes, JavacNode errorNode, boolean whineIfExists, List<JCAnnotation> onMethod) {\n\t\tfor (JavacNode fieldNode : fieldNodes) {\n\t\t\tcreateWithByForField(level, fieldNode, errorNode, whineIfExists, onMethod);\n\t\t}\n\t}\n\t\n\tpublic void createWithByForField(AccessLevel level, JavacNode fieldNode, JavacNode source, boolean strictMode, List<JCAnnotation> onMethod) {\n\t\tJavacNode typeNode = fieldNode.up();\n\t\tboolean makeAbstract = typeNode != null && typeNode.getKind() == Kind.TYPE && (((JCClassDecl) typeNode.get()).mods.flags & Flags.ABSTRACT) != 0;\n\t\t\n\t\tif (fieldNode.getKind() != Kind.FIELD) {\n\t\t\tfieldNode.addError(\"@WithBy is only supported on a class or a field.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tAnnotationValues<Accessors> accessors = JavacHandlerUtil.getAccessorsForField(fieldNode);\n\t\tJCVariableDecl fieldDecl = (JCVariableDecl) fieldNode.get();\n\t\tString methodName = toWithByName(fieldNode, accessors);\n\t\t\n\t\tif (methodName == null) {\n\t\t\tfieldNode.addWarning(\"Not generating a withXBy method for this field: It does not fit your @Accessors prefix list.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif ((fieldDecl.mods.flags & Flags.STATIC) != 0) {\n\t\t\tif (strictMode) fieldNode.addWarning(\"Not generating \" + methodName + \" for this field: WithBy methods cannot be generated for static fields.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif ((fieldDecl.mods.flags & Flags.FINAL) != 0 && fieldDecl.init != null) {\n\t\t\tif (strictMode) fieldNode.addWarning(\"Not generating \" + methodName + \" for this field: WithBy methods cannot be generated for final, initialized fields.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (fieldDecl.name.toString().startsWith(\"$\")) {\n\t\t\tif (strictMode) fieldNode.addWarning(\"Not generating \" + methodName + \" for this field: WithBy methods cannot be generated for fields starting with $.\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tfor (String altName : toAllWithByNames(fieldNode, accessors)) {\n\t\t\tswitch (methodExists(altName, fieldNode, false, 1)) {\n\t\t\tcase EXISTS_BY_LOMBOK:\n\t\t\t\treturn;\n\t\t\tcase EXISTS_BY_USER:\n\t\t\t\tif (strictMode) {\n\t\t\t\t\tString altNameExpl = \"\";\n\t\t\t\t\tif (!altName.equals(methodName)) altNameExpl = String.format(\" (%s)\", altName);\n\t\t\t\t\tfieldNode.addWarning(\n\t\t\t\t\t\tString.format(\"Not generating %s(): A method with that name already exists%s\", methodName, altNameExpl));\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\tcase NOT_EXISTS:\n\t\t\t\t//continue scanning the other alt names.\n\t\t\t}\n\t\t}\n\t\t\n\t\tlong access = toJavacModifier(level);\n\t\t\n\t\tJCMethodDecl createdWithBy = createWithBy(access, fieldNode, fieldNode.getTreeMaker(), source, onMethod, makeAbstract);\n\t\trecursiveSetGeneratedBy(createdWithBy, source);\n\t\tinjectMethod(typeNode, createdWithBy);\n\t}\n\t\n\tprivate static final LombokImmutableList<String> NAME_JUF_FUNCTION = LombokImmutableList.of(\"java\", \"util\", \"function\", \"Function\");\n\tprivate static final LombokImmutableList<String> NAME_JUF_OP = LombokImmutableList.of(\"java\", \"util\", \"function\", \"UnaryOperator\");\n\tprivate static final LombokImmutableList<String> NAME_JUF_DOUBLEOP = LombokImmutableList.of(\"java\", \"util\", \"function\", \"DoubleUnaryOperator\");\n\tprivate static final LombokImmutableList<String> NAME_JUF_INTOP = LombokImmutableList.of(\"java\", \"util\", \"function\", \"IntUnaryOperator\");\n\tprivate static final LombokImmutableList<String> NAME_JUF_LONGOP = LombokImmutableList.of(\"java\", \"util\", \"function\", \"LongUnaryOperator\");\n\t\n\tpublic JCMethodDecl createWithBy(long access, JavacNode field, JavacTreeMaker maker, JavacNode source, List<JCAnnotation> onMethod, boolean makeAbstract) {\n\t\tString withByName = toWithByName(field);\n\t\tif (withByName == null) return null;\n\t\t\n\t\tJCVariableDecl fieldDecl = (JCVariableDecl) field.get();\n\t\t\n\t\tName methodName = field.toName(withByName);\n\t\t\n\t\tJCExpression returnType = cloneSelfType(field);\n\t\t\n\t\tJCBlock methodBody = null;\n\t\tlong flags = JavacHandlerUtil.addFinalIfNeeded(Flags.PARAMETER, field.getContext());\n\t\t\n\t\tLombokImmutableList<String> functionalInterfaceName = null;\n\t\tTypeTag requiredCast = null;\n\t\tJCExpression parameterizer = null;\n\t\tboolean superExtendsStyle = true;\n\t\tString applyMethodName = \"apply\";\n\t\t\n\t\tif (fieldDecl.vartype instanceof JCPrimitiveTypeTree) {\n\t\t\tTypeKind kind = ((JCPrimitiveTypeTree) fieldDecl.vartype).getPrimitiveTypeKind();\n\t\t\tif (kind == TypeKind.CHAR) {\n\t\t\t\trequiredCast = Javac.CTC_CHAR;\n\t\t\t\tfunctionalInterfaceName = NAME_JUF_INTOP;\n\t\t\t} else if (kind == TypeKind.SHORT) {\n\t\t\t\trequiredCast = Javac.CTC_SHORT;\n\t\t\t\tfunctionalInterfaceName = NAME_JUF_INTOP;\n\t\t\t} else if (kind == TypeKind.BYTE) {\n\t\t\t\trequiredCast = Javac.CTC_BYTE;\n\t\t\t\tfunctionalInterfaceName = NAME_JUF_INTOP;\n\t\t\t} else if (kind == TypeKind.INT) {\n\t\t\t\tfunctionalInterfaceName = NAME_JUF_INTOP;\n\t\t\t} else if (kind == TypeKind.LONG) {\n\t\t\t\tfunctionalInterfaceName = NAME_JUF_LONGOP;\n\t\t\t} else if (kind == TypeKind.FLOAT) {\n\t\t\t\tfunctionalInterfaceName = NAME_JUF_DOUBLEOP;\n\t\t\t\trequiredCast = Javac.CTC_FLOAT;\n\t\t\t} else if (kind == TypeKind.DOUBLE) {\n\t\t\t\tfunctionalInterfaceName = NAME_JUF_DOUBLEOP;\n\t\t\t} else if (kind == TypeKind.BOOLEAN) {\n\t\t\t\tfunctionalInterfaceName = NAME_JUF_OP;\n\t\t\t\tparameterizer = JavacHandlerUtil.genJavaLangTypeRef(field, \"Boolean\");\n\t\t\t\tsuperExtendsStyle = false;\n\t\t\t}\n\t\t}\n\t\tif (functionalInterfaceName == null) {\n\t\t\tfunctionalInterfaceName = NAME_JUF_FUNCTION;\n\t\t\tparameterizer = cloneType(maker, fieldDecl.vartype, source);\n\t\t}\n\t\tif (functionalInterfaceName == NAME_JUF_INTOP) applyMethodName = \"applyAsInt\";\n\t\tif (functionalInterfaceName == NAME_JUF_LONGOP) applyMethodName = \"applyAsLong\";\n\t\tif (functionalInterfaceName == NAME_JUF_DOUBLEOP) applyMethodName = \"applyAsDouble\";\n\t\t\n\t\tJCExpression varType = chainDots(field, functionalInterfaceName);\n\t\tif (parameterizer != null && superExtendsStyle) {\n\t\t\tJCExpression parameterizer1 = parameterizer;\n\t\t\tJCExpression parameterizer2 = cloneType(maker, parameterizer, source);\n\t\t\t// TODO: Apply copyable annotations to 'parameterizer' and 'parameterizer2'.\n\t\t\tJCExpression arg1 = maker.Wildcard(maker.TypeBoundKind(BoundKind.SUPER), parameterizer1);\n\t\t\tJCExpression arg2 = maker.Wildcard(maker.TypeBoundKind(BoundKind.EXTENDS), parameterizer2);\n\t\t\tvarType = maker.TypeApply(varType, List.of(arg1, arg2));\n\t\t}\n\t\tif (parameterizer != null && !superExtendsStyle) {\n\t\t\tvarType = maker.TypeApply(varType, List.of(parameterizer));\n\t\t}\n\t\tName paramName = field.toName(\"transformer\");\n\t\t\n\t\tJCVariableDecl param = maker.VarDef(maker.Modifiers(flags), paramName, varType, null);\n\t\t\n\t\tif (!makeAbstract) {\n\t\t\tListBuffer<JCStatement> statements = new ListBuffer<JCStatement>();\n\t\t\t\n\t\t\tJCExpression selfType = cloneSelfType(field);\n\t\t\tif (selfType == null) return null;\n\t\t\t\n\t\t\tListBuffer<JCExpression> args = new ListBuffer<JCExpression>();\n\t\t\tfor (JavacNode child : field.up().down()) {\n\t\t\t\tif (child.getKind() != Kind.FIELD) continue;\n\t\t\t\tJCVariableDecl childDecl = (JCVariableDecl) child.get();\n\t\t\t\t// Skip fields that start with $\n\t\t\t\tif (childDecl.name.toString().startsWith(\"$\")) continue;\n\t\t\t\tlong fieldFlags = childDecl.mods.flags;\n\t\t\t\t// Skip static fields.\n\t\t\t\tif ((fieldFlags & Flags.STATIC) != 0) continue;\n\t\t\t\t// Skip initialized final fields.\n\t\t\t\tif (((fieldFlags & Flags.FINAL) != 0) && childDecl.init != null) continue;\n\t\t\t\tif (child.get() == field.get()) {\n\t\t\t\t\tJCExpression invoke = maker.Apply(List.<JCExpression>nil(), maker.Select(maker.Ident(paramName), field.toName(applyMethodName)), List.<JCExpression>of(createFieldAccessor(maker, child, FieldAccess.ALWAYS_FIELD)));\n\t\t\t\t\tif (requiredCast != null) invoke = maker.TypeCast(maker.TypeIdent(requiredCast), invoke);\n\t\t\t\t\targs.append(invoke);\n\t\t\t\t} else {\n\t\t\t\t\targs.append(createFieldAccessor(maker, child, FieldAccess.ALWAYS_FIELD));\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tJCNewClass newClass = maker.NewClass(null, List.<JCExpression>nil(), selfType, args.toList(), null);\n\t\t\tJCReturn returnStatement = maker.Return(newClass);\n\t\t\t\n\t\t\tstatements.append(returnStatement);\n\t\t\t\n\t\t\tmethodBody = maker.Block(0, statements.toList());\n\t\t}\n\t\tList<JCTypeParameter> methodGenericParams = List.nil();\n\t\tList<JCVariableDecl> parameters = List.of(param);\n\t\tList<JCExpression> throwsClauses = List.nil();\n\t\tJCExpression annotationMethodDefaultValue = null;\n\t\t\n\t\tList<JCAnnotation> annsOnMethod = copyAnnotations(onMethod, maker);\n\t\tCheckerFrameworkVersion checkerFramework = getCheckerFrameworkVersion(source);\n\t\tif (checkerFramework.generateSideEffectFree()) annsOnMethod = annsOnMethod.prepend(maker.Annotation(genTypeRef(source, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil()));\n\t\t\n\t\tif (isFieldDeprecated(field)) annsOnMethod = annsOnMethod.prepend(maker.Annotation(genJavaLangTypeRef(field, \"Deprecated\"), List.<JCExpression>nil()));\n\t\t\n\t\tif (makeAbstract) access = access | Flags.ABSTRACT;\n\t\tAnnotationValues<Accessors> accessors = JavacHandlerUtil.getAccessorsForField(field);\n\t\tboolean makeFinal = shouldMakeFinal(field, accessors);\n\t\tif (makeFinal) access |= Flags.FINAL;\n\t\tcreateRelevantNonNullAnnotation(source, param);\n\t\tJCMethodDecl decl = recursiveSetGeneratedBy(maker.MethodDef(maker.Modifiers(access, annsOnMethod), methodName, returnType,\n\t\t\tmethodGenericParams, parameters, throwsClauses, methodBody, annotationMethodDefaultValue), source);\n\t\tcopyJavadoc(field, decl, CopyJavadoc.WITH_BY);\n\t\tcreateRelevantNonNullAnnotation(source, decl);\n\t\treturn decl;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/JavacHandlerUtil.java",
    "content": "/*\n * Copyright (C) 2009-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static com.sun.tools.javac.code.Flags.GENERATEDCONSTR;\nimport static lombok.core.handlers.HandlerUtil.*;\nimport static lombok.javac.Javac.*;\nimport static lombok.javac.JavacAugments.JCTree_generatedNode;\nimport static lombok.javac.JavacAugments.JCTree_keepPosition;\n\nimport java.lang.annotation.Annotation;\nimport java.lang.reflect.Constructor;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.Method;\nimport java.lang.reflect.Modifier;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.regex.Pattern;\n\nimport com.sun.source.tree.TreeVisitor;\nimport com.sun.tools.javac.code.Attribute;\nimport com.sun.tools.javac.code.BoundKind;\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.code.Scope;\nimport com.sun.tools.javac.code.Symbol;\nimport com.sun.tools.javac.code.Symbol.ClassSymbol;\nimport com.sun.tools.javac.code.Symbol.TypeSymbol;\nimport com.sun.tools.javac.code.Type;\nimport com.sun.tools.javac.comp.Annotate;\nimport com.sun.tools.javac.comp.AttrContext;\nimport com.sun.tools.javac.comp.Enter;\nimport com.sun.tools.javac.comp.Env;\nimport com.sun.tools.javac.comp.MemberEnter;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCArrayTypeTree;\nimport com.sun.tools.javac.tree.JCTree.JCAssign;\nimport com.sun.tools.javac.tree.JCTree.JCBlock;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCCompilationUnit;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCExpressionStatement;\nimport com.sun.tools.javac.tree.JCTree.JCFieldAccess;\nimport com.sun.tools.javac.tree.JCTree.JCIdent;\nimport com.sun.tools.javac.tree.JCTree.JCImport;\nimport com.sun.tools.javac.tree.JCTree.JCLiteral;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCMethodInvocation;\nimport com.sun.tools.javac.tree.JCTree.JCModifiers;\nimport com.sun.tools.javac.tree.JCTree.JCNewArray;\nimport com.sun.tools.javac.tree.JCTree.JCPrimitiveTypeTree;\nimport com.sun.tools.javac.tree.JCTree.JCStatement;\nimport com.sun.tools.javac.tree.JCTree.JCTypeApply;\nimport com.sun.tools.javac.tree.JCTree.JCTypeParameter;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.tree.JCTree.JCWildcard;\nimport com.sun.tools.javac.tree.JCTree.TypeBoundKind;\nimport com.sun.tools.javac.tree.TreeCopier;\nimport com.sun.tools.javac.tree.TreeMaker;\nimport com.sun.tools.javac.tree.TreeScanner;\nimport com.sun.tools.javac.util.Context;\nimport com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.ListBuffer;\nimport com.sun.tools.javac.util.Name;\nimport com.sun.tools.javac.util.Options;\n\nimport lombok.AccessLevel;\nimport lombok.ConfigurationKeys;\nimport lombok.Data;\nimport lombok.Getter;\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.core.AnnotationValues.AnnotationValue;\nimport lombok.core.CleanupTask;\nimport lombok.core.LombokImmutableList;\nimport lombok.core.TypeResolver;\nimport lombok.core.configuration.CheckerFrameworkVersion;\nimport lombok.core.configuration.NullAnnotationLibrary;\nimport lombok.core.configuration.NullCheckExceptionType;\nimport lombok.core.configuration.TypeName;\nimport lombok.core.handlers.HandlerUtil;\nimport lombok.core.handlers.HandlerUtil.FieldAccess;\nimport lombok.delombok.LombokOptionsFactory;\nimport lombok.experimental.Accessors;\nimport lombok.experimental.Tolerate;\nimport lombok.javac.Javac;\nimport lombok.javac.JavacAugments;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacTreeMaker;\nimport lombok.javac.JavacTreeMaker.TypeTag;\nimport lombok.permit.Permit;\n\n/**\n * Container for static utility methods useful to handlers written for javac.\n */\npublic class JavacHandlerUtil {\n\tprivate JavacHandlerUtil() {\n\t\t//Prevent instantiation\n\t}\n\t\n\tprivate static class MarkingScanner extends TreeScanner {\n\t\tprivate final JavacNode source;\n\t\t\n\t\tMarkingScanner(JavacNode source) {\n\t\t\tthis.source = source;\n\t\t}\n\t\t\n\t\t@Override public void scan(JCTree tree) {\n\t\t\tif (tree == null) return;\n\t\t\tif (JCTree_keepPosition.get(tree)) return;\n\t\t\tsetGeneratedBy(tree, source);\n\t\t\tsuper.scan(tree);\n\t\t}\n\t}\n\t\n\t/**\n\t * Contributed by Jan Lahoda; many lombok transformations should not be run (or a lite version should be run) when the netbeans editor\n\t * is running javac on the open source file to find inline errors and such. As class files are compiled separately this does not affect\n\t * actual runtime behaviour or file output of the netbeans IDE.\n\t */\n\tpublic static boolean inNetbeansEditor(JavacNode node) {\n\t\treturn inNetbeansEditor(node.getContext());\n\t}\n\t\n\tpublic static boolean inNetbeansEditor(Context context) {\n\t\tOptions options = Options.instance(context);\n\t\treturn (options.keySet().contains(\"ide\") && !options.keySet().contains(\"backgroundCompilation\"));\n\t}\n\t\n\tpublic static boolean inNetbeansCompileOnSave(Context context) {\n\t\tOptions options = Options.instance(context);\n\t\treturn (options.keySet().contains(\"ide\") && options.keySet().contains(\"backgroundCompilation\"));\n\t}\n\t\n\tpublic static JCTree getGeneratedBy(JCTree node) {\n\t\treturn JCTree_generatedNode.get(node);\n\t}\n\t\n\tpublic static boolean isGenerated(JCTree node) {\n\t\treturn getGeneratedBy(node) != null;\n\t}\n\t\n\tpublic static <T extends JCTree> T recursiveSetGeneratedBy(T node, JavacNode source) {\n\t\tif (node == null) return null;\n\t\tsetGeneratedBy(node, source);\n\t\tnode.accept(new MarkingScanner(source));\n\t\treturn node;\n\t}\n\t\n\tpublic static <T extends JCTree> T setGeneratedBy(T node, JavacNode sourceNode) {\n\t\tif (node == null) return null;\n\t\tif (sourceNode == null) {\n\t\t\tJCTree_generatedNode.clear(node);\n\t\t\treturn node;\n\t\t}\n\t\tJCTree_generatedNode.set(node, sourceNode.get());\n\t\t\n\t\tif (JCTree_keepPosition.get(node)) return node;\n\t\tif (inNetbeansEditor(sourceNode.getContext()) && !isParameter(node)) return node;\n\t\t\n\t\tnode.pos = sourceNode.getStartPos();\n\t\tstoreEnd(node, sourceNode.getEndPosition(), (JCCompilationUnit) sourceNode.top().get());\n\t\treturn node;\n\t}\n\n\tpublic static boolean isParameter(JCTree node) {\n\t\treturn node instanceof JCVariableDecl && (((JCVariableDecl) node).mods.flags & Flags.PARAMETER) != 0;\n\t}\n\t\n\tpublic static boolean hasAnnotation(String type, JavacNode node) {\n\t\treturn hasAnnotation(type, node, false);\n\t}\n\t\n\tpublic static boolean hasAnnotation(Class<? extends Annotation> type, JavacNode node) {\n\t\treturn hasAnnotation(type, node, false);\n\t}\n\t\n\tpublic static boolean hasAnnotationAndDeleteIfNeccessary(Class<? extends Annotation> type, JavacNode node) {\n\t\treturn hasAnnotation(type, node, true);\n\t}\n\t\n\tprivate static boolean hasAnnotation(Class<? extends Annotation> type, JavacNode node, boolean delete) {\n\t\tif (node == null) return false;\n\t\tif (type == null) return false;\n\t\tswitch (node.getKind()) {\n\t\tcase ARGUMENT:\n\t\tcase FIELD:\n\t\tcase LOCAL:\n\t\tcase TYPE:\n\t\tcase METHOD:\n\t\t\tfor (JavacNode child : node.down()) {\n\t\t\t\tif (annotationTypeMatches(type, child)) {\n\t\t\t\t\tif (delete) deleteAnnotationIfNeccessary(child, type);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// intentional fallthrough\n\t\tdefault:\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\tprivate static boolean hasAnnotation(String type, JavacNode node, boolean delete) {\n\t\tif (node == null) return false;\n\t\tif (type == null) return false;\n\t\tswitch (node.getKind()) {\n\t\tcase ARGUMENT:\n\t\tcase FIELD:\n\t\tcase LOCAL:\n\t\tcase TYPE:\n\t\tcase METHOD:\n\t\t\tfor (JavacNode child : node.down()) {\n\t\t\t\tif (annotationTypeMatches(type, child)) {\n\t\t\t\t\tif (delete) deleteAnnotationIfNeccessary(child, type);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// intentional fallthrough\n\t\tdefault:\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\tpublic static JavacNode findInnerClass(JavacNode parent, String name) {\n\t\tfor (JavacNode child : parent.down()) {\n\t\t\tif (child.getKind() != Kind.TYPE) continue;\n\t\t\tJCClassDecl td = (JCClassDecl) child.get();\n\t\t\tif (td.name.contentEquals(name)) return child;\n\t\t}\n\t\treturn null;\n\t}\n\t\n\tpublic static JavacNode findAnnotation(Class<? extends Annotation> type, JavacNode node) {\n\t\treturn findAnnotation(type, node, false);\n\t}\n\t\n\tpublic static JavacNode findAnnotation(Class<? extends Annotation> type, JavacNode node, boolean delete) {\n\t\tif (node == null) return null;\n\t\tif (type == null) return null;\n\t\tswitch (node.getKind()) {\n\t\tcase ARGUMENT:\n\t\tcase FIELD:\n\t\tcase LOCAL:\n\t\tcase TYPE:\n\t\tcase METHOD:\n\t\t\tfor (JavacNode child : node.down()) {\n\t\t\t\tif (annotationTypeMatches(type, child)) {\n\t\t\t\t\tif (delete) deleteAnnotationIfNeccessary(child, type);\n\t\t\t\t\treturn child;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// intentional fallthrough\n\t\tdefault:\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\t/**\n\t * Checks if the Annotation AST Node provided is likely to be an instance of the provided annotation type.\n\t * \n\t * @param type An actual annotation type, such as {@code lombok.Getter.class}.\n\t * @param node A Lombok AST node representing an annotation in source code.\n\t */\n\tpublic static boolean annotationTypeMatches(Class<? extends Annotation> type, JavacNode node) {\n\t\tif (node.getKind() != Kind.ANNOTATION) return false;\n\t\treturn typeMatches(type, node, ((JCAnnotation) node.get()).annotationType);\n\t}\n\t\n\t/**\n\t * Checks if the Annotation AST Node provided is likely to be an instance of the provided annotation type.\n\t * \n\t * @param type An actual annotation type, such as {@code lombok.Getter.class}.\n\t * @param node A Lombok AST node representing an annotation in source code.\n\t */\n\tpublic static boolean annotationTypeMatches(String type, JavacNode node) {\n\t\tif (node.getKind() != Kind.ANNOTATION) return false;\n\t\treturn typeMatches(type, node, ((JCAnnotation) node.get()).annotationType);\n\t}\n\t\n\t/**\n\t * Checks if the given TypeReference node is likely to be a reference to the provided class.\n\t * \n\t * @param type An actual type. This method checks if {@code typeNode} is likely to be a reference to this type.\n\t * @param node A Lombok AST node. Any node in the appropriate compilation unit will do (used to get access to import statements).\n\t * @param typeNode A type reference to check.\n\t */\n\tpublic static boolean typeMatches(Class<?> type, JavacNode node, JCTree typeNode) {\n\t\treturn typeMatches(type.getName(), node, typeNode);\n\t}\n\t\n\t/**\n\t * Checks if the given TypeReference node is likely to be a reference to the provided class.\n\t * \n\t * @param type An actual type. This method checks if {@code typeNode} is likely to be a reference to this type.\n\t * @param node A Lombok AST node. Any node in the appropriate compilation unit will do (used to get access to import statements).\n\t * @param typeNode A type reference to check.\n\t */\n\tpublic static boolean typeMatches(String type, JavacNode node, JCTree typeNode) {\n\t\tString typeName = getTypeName(typeNode);\n\t\treturn typeMatches(type, node, typeName);\n\t}\n\n\tprivate static boolean typeMatches(String type, JavacNode node, String typeName) {\n\t\tif (typeName == null || typeName.length() == 0) return false;\n\t\tint lastIndexA = typeName.lastIndexOf('.') + 1;\n\t\tint lastIndexB = Math.max(type.lastIndexOf('.'), type.lastIndexOf('$')) + 1;\n\t\tint len = typeName.length() - lastIndexA;\n\t\tif (len != type.length() - lastIndexB) return false;\n\t\tfor (int i = 0; i < len; i++) if (typeName.charAt(i + lastIndexA) != type.charAt(i + lastIndexB)) return false;\n\t\tTypeResolver resolver = node.getImportListAsTypeResolver();\n\t\treturn resolver.typeMatches(node, type, typeName);\n\t}\n\n\tprivate static String getTypeName(JCTree typeNode) {\n\t\treturn typeNode == null ? null : typeNode.toString();\n\t}\n\n\t/**\n\t * Returns if a field is marked deprecated, either by {@code @Deprecated} or in javadoc\n\t * @param field the field to check\n\t * @return {@code true} if a field is marked deprecated, either by {@code @Deprecated} or in javadoc, otherwise {@code false}\n\t */\n\tpublic static boolean isFieldDeprecated(JavacNode field) {\n\t\tif (!(field.get() instanceof JCVariableDecl)) return false;\n\t\tJCVariableDecl fieldNode = (JCVariableDecl) field.get();\n\t\tif ((fieldNode.mods.flags & Flags.DEPRECATED) != 0) {\n\t\t\treturn true;\n\t\t}\n\t\tfor (JavacNode child : field.down()) {\n\t\t\tif (annotationTypeMatches(Deprecated.class, child)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t\n\tpublic static CheckerFrameworkVersion getCheckerFrameworkVersion(JavacNode node) {\n\t\tCheckerFrameworkVersion cfv = node.getAst().readConfiguration(ConfigurationKeys.CHECKER_FRAMEWORK);\n\t\treturn cfv == null ? CheckerFrameworkVersion.NONE : cfv;\n\t}\n\t\n\t/**\n\t * Returns if a node is marked deprecated (as picked up on by the parser).\n\t * @param node the node to check (type, method, or field decl).\n\t */\n\tpublic static boolean nodeHasDeprecatedFlag(JCTree node) {\n\t\tif (node instanceof JCVariableDecl) return (((JCVariableDecl) node).mods.flags & Flags.DEPRECATED) != 0;\n\t\tif (node instanceof JCMethodDecl) return (((JCMethodDecl) node).mods.flags & Flags.DEPRECATED) != 0;\n\t\tif (node instanceof JCClassDecl) return (((JCClassDecl) node).mods.flags & Flags.DEPRECATED) != 0;\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * Creates an instance of {@code AnnotationValues} for the provided AST Node.\n\t * \n\t * @param type An annotation class type, such as {@code lombok.Getter.class}.\n\t * @param node A Lombok AST node representing an annotation in source code.\n\t */\n\tpublic static <A extends Annotation> AnnotationValues<A> createAnnotation(Class<A> type, final JavacNode node) {\n\t\treturn createAnnotation(type, (JCAnnotation) node.get(), node);\n\t}\n\t\n\t/**\n\t * Creates an instance of {@code AnnotationValues} for the provided AST Node\n\t * and Annotation expression.\n\t *\n\t * @param type An annotation class type, such as {@code lombok.Getter.class}.\n\t * @param anno the annotation expression\n\t * @param node A Lombok AST node representing an annotation in source code.\n\t */\n\tpublic static <A extends Annotation> AnnotationValues<A> createAnnotation(Class<A> type, JCAnnotation anno, final JavacNode node) {\n\t\tMap<String, AnnotationValue> values = new HashMap<String, AnnotationValue>();\n\t\tList<JCExpression> arguments = anno.getArguments();\n\t\t\n\t\tfor (JCExpression arg : arguments) {\n\t\t\tString mName;\n\t\t\tJCExpression rhs;\n\t\t\tjava.util.List<String> raws = new ArrayList<String>();\n\t\t\tjava.util.List<Object> guesses = new ArrayList<Object>();\n\t\t\tjava.util.List<Object> expressions = new ArrayList<Object>();\n\t\t\tfinal java.util.List<DiagnosticPosition> positions = new ArrayList<DiagnosticPosition>();\n\t\t\t\n\t\t\tif (arg instanceof JCAssign) {\n\t\t\t\tJCAssign assign = (JCAssign) arg;\n\t\t\t\tmName = assign.lhs.toString();\n\t\t\t\trhs = assign.rhs;\n\t\t\t} else {\n\t\t\t\trhs = arg;\n\t\t\t\tmName = \"value\";\n\t\t\t}\n\t\t\t\n\t\t\tif (rhs instanceof JCNewArray) {\n\t\t\t\tList<JCExpression> elems = ((JCNewArray) rhs).elems;\n\t\t\t\tfor (JCExpression inner : elems) {\n\t\t\t\t\traws.add(inner.toString());\n\t\t\t\t\texpressions.add(inner);\n\t\t\t\t\tif (inner instanceof JCAnnotation) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t@SuppressWarnings(\"unchecked\")\n\t\t\t\t\t\t\tClass<A> innerClass = (Class<A>) Class.forName(inner.type.toString());\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tguesses.add(createAnnotation(innerClass, (JCAnnotation) inner, node));\n\t\t\t\t\t\t} catch (ClassNotFoundException ex) {\n\t\t\t\t\t\t\tguesses.add(calculateGuess(inner));\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tguesses.add(calculateGuess(inner));\n\t\t\t\t\t}\n\t\t\t\t\tpositions.add(inner.pos());\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\traws.add(rhs.toString());\n\t\t\t\texpressions.add(rhs);\n\t\t\t\tif (rhs instanceof JCAnnotation) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t@SuppressWarnings(\"unchecked\")\n\t\t\t\t\t\tClass<A> innerClass = (Class<A>) Class.forName(rhs.type.toString());\n\t\t\t\t\t\t\n\t\t\t\t\t\tguesses.add(createAnnotation(innerClass, (JCAnnotation) rhs, node));\n\t\t\t\t\t} catch (ClassNotFoundException ex) {\n\t\t\t\t\t\tguesses.add(calculateGuess(rhs));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tguesses.add(calculateGuess(rhs));\n\t\t\t\t}\n\t\t\t\tpositions.add(rhs.pos());\n\t\t\t}\n\t\t\t\n\t\t\tvalues.put(mName, new AnnotationValue(node, raws, expressions, guesses, true) {\n\t\t\t\t@Override public void setError(String message, int valueIdx) {\n\t\t\t\t\tif (valueIdx < 0) node.addError(message);\n\t\t\t\t\telse node.addError(message, positions.get(valueIdx));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t@Override public void setWarning(String message, int valueIdx) {\n\t\t\t\t\tif (valueIdx < 0) node.addWarning(message);\n\t\t\t\t\telse node.addWarning(message, positions.get(valueIdx));\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t\n\t\tfor (Method m : type.getDeclaredMethods()) {\n\t\t\tif (!Modifier.isPublic(m.getModifiers())) continue;\n\t\t\tString name = m.getName();\n\t\t\tif (!values.containsKey(name)) {\n\t\t\t\tvalues.put(name, new AnnotationValue(node, new ArrayList<String>(), new ArrayList<Object>(), new ArrayList<Object>(), false) {\n\t\t\t\t\t@Override public void setError(String message, int valueIdx) {\n\t\t\t\t\t\tnode.addError(message);\n\t\t\t\t\t}\n\t\t\t\t\t@Override public void setWarning(String message, int valueIdx) {\n\t\t\t\t\t\tnode.addWarning(message);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn new AnnotationValues<A>(type, values, node);\n\t}\n\t\n\t/**\n\t * Removes the annotation from javac's AST (it remains in lombok's AST),\n\t * then removes any import statement that imports this exact annotation (not star imports).\n\t * Only does this if the DeleteLombokAnnotations class is in the context.\n\t */\n\tpublic static void deleteAnnotationIfNeccessary(JavacNode annotation, String annotationType) {\n\t\tdeleteAnnotationIfNeccessary0(annotation, annotationType);\n\t}\n\t\n\t/**\n\t * Removes the annotation from javac's AST (it remains in lombok's AST),\n\t * then removes any import statement that imports this exact annotation (not star imports).\n\t * Only does this if the DeleteLombokAnnotations class is in the context.\n\t */\n\tpublic static void deleteAnnotationIfNeccessary(JavacNode annotation, Class<? extends Annotation> annotationType) {\n\t\tdeleteAnnotationIfNeccessary0(annotation, annotationType.getName());\n\t}\n\t\n\t/**\n\t * Removes the annotation from javac's AST (it remains in lombok's AST),\n\t * then removes any import statement that imports this exact annotation (not star imports).\n\t * Only does this if the DeleteLombokAnnotations class is in the context.\n\t */\n\tpublic static void deleteAnnotationIfNeccessary(JavacNode annotation, Class<? extends Annotation> annotationType1, Class<? extends Annotation> annotationType2) {\n\t\tdeleteAnnotationIfNeccessary0(annotation, annotationType1.getName(), annotationType2.getName());\n\t}\n\t\n\t/**\n\t * Removes the annotation from javac's AST (it remains in lombok's AST),\n\t * then removes any import statement that imports this exact annotation (not star imports).\n\t * Only does this if the DeleteLombokAnnotations class is in the context.\n\t */\n\tpublic static void deleteAnnotationIfNeccessary(JavacNode annotation, Class<? extends Annotation> annotationType1, String annotationType2) {\n\t\tdeleteAnnotationIfNeccessary0(annotation, annotationType1.getName(), annotationType2);\n\t}\n\t\n\tprivate static void deleteAnnotationIfNeccessary0(JavacNode annotation, String... annotationTypes) {\n\t\tif (inNetbeansEditor(annotation)) return;\n\t\tif (!annotation.shouldDeleteLombokAnnotations()) return;\n\t\tJavacNode parentNode = annotation.directUp();\n\t\tswitch (parentNode.getKind()) {\n\t\tcase FIELD:\n\t\tcase ARGUMENT:\n\t\tcase LOCAL:\n\t\t\tJCVariableDecl variable = (JCVariableDecl) parentNode.get();\n\t\t\tvariable.mods.annotations = filterList(variable.mods.annotations, annotation.get());\n\t\t\t\n\t\t\tif ((variable.mods.flags & GENERATED_MEMBER) != 0) {\n\t\t\t\tJavacNode typeNode = upToTypeNode(annotation);\n\t\t\t\tif (isRecord(typeNode)) {\n\t\t\t\t\tRecordComponentReflect.deleteAnnotation((JCClassDecl) typeNode.get(), variable, annotation.get());\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase METHOD:\n\t\t\tJCMethodDecl method = (JCMethodDecl) parentNode.get();\n\t\t\tmethod.mods.annotations = filterList(method.mods.annotations, annotation.get());\n\t\t\tbreak;\n\t\tcase TYPE:\n\t\t\ttry {\n\t\t\t\tJCClassDecl type = (JCClassDecl) parentNode.get();\n\t\t\t\ttype.mods.annotations = filterList(type.mods.annotations, annotation.get());\n\t\t\t} catch (ClassCastException e) {\n\t\t\t\t//something rather odd has been annotated. Better to just break only delombok instead of everything.\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t//This really shouldn't happen, but if it does, better just break delombok instead of breaking everything.\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tparentNode.getAst().setChanged();\n\t\tfor (String annotationType : annotationTypes) {\n\t\t\tdeleteImportFromCompilationUnit(annotation, annotationType);\n\t\t}\n\t}\n\t\n\tpublic static void deleteImportFromCompilationUnit(JavacNode node, String name) {\n\t\tif (inNetbeansEditor(node)) return;\n\t\tif (!node.shouldDeleteLombokAnnotations()) return;\n\t\t\n\t\tJCCompilationUnit unit = (JCCompilationUnit) node.top().get();\n\t\t\n\t\tfor (JCTree def : unit.defs) {\n\t\t\tif (!(def instanceof JCImport)) continue;\n\t\t\tJCImport imp0rt = (JCImport) def;\n\t\t\tif (imp0rt.staticImport) continue;\n\t\t\tif (!Javac.getQualid(imp0rt).toString().equals(name)) continue;\n\t\t\tJavacAugments.JCImport_deletable.set(imp0rt, true);\n\t\t}\n\t}\n\t\n\tprivate static List<JCAnnotation> filterList(List<JCAnnotation> annotations, JCTree jcTree) {\n\t\tListBuffer<JCAnnotation> newAnnotations = new ListBuffer<JCAnnotation>();\n\t\tfor (JCAnnotation ann : annotations) {\n\t\t\tif (jcTree != ann) newAnnotations.append(ann);\n\t\t}\n\t\treturn newAnnotations.toList();\n\t}\n\t\n\tprivate static List<JCAnnotation> filterListByPos(List<JCAnnotation> annotations, JCTree jcTree) {\n\t\tListBuffer<JCAnnotation> newAnnotations = new ListBuffer<JCAnnotation>();\n\t\tfor (JCAnnotation ann : annotations) {\n\t\t\tif (jcTree.pos != ann.pos) newAnnotations.append(ann);\n\t\t}\n\t\treturn newAnnotations.toList();\n\t}\n\t\n\t\n\tstatic class RecordComponentReflect {\n\t\t\n\t\tprivate static final Field astField;\n\t\tprivate static final Field originalAnnos;\n\t\tprivate static final Method getRecordComponents = Permit.permissiveGetMethod(ClassSymbol.class, \"getRecordComponents\");\n\t\t\n\t\tstatic {\n\t\t\tField a = null;\n\t\t\tField o = null;\n\t\t\ttry {\n\t\t\t\tClass<?> forName = Class.forName(\"com.sun.tools.javac.code.Symbol$RecordComponent\");\n\t\t\t\ta = Permit.permissiveGetField(forName, \"ast\");\n\t\t\t\to = Permit.permissiveGetField(forName, \"originalAnnos\");\n\t\t\t} catch (Throwable e) {\n\t\t\t\t// Ignore\n\t\t\t}\n\t\t\tastField = a;\n\t\t\toriginalAnnos = o;\n\t\t}\n\t\t\n\t\tstatic void deleteAnnotation(JCClassDecl record, JCVariableDecl component, JCTree annotation) {\n\t\t\tif ((astField == null && originalAnnos == null) || getRecordComponents == null) return;\n\t\t\t\n\t\t\ttry {\n\t\t\t\tList<?> recordComponents = (List<?>) Permit.invokeSneaky(getRecordComponents, record.sym);\n\t\t\t\t\n\t\t\t\tfor (Object recordComponent : recordComponents) {\n\t\t\t\t\tName recordComponentName = ((Symbol) recordComponent).name;\n\t\t\t\t\tif (!recordComponentName.equals(component.name)) continue;\n\t\t\t\t\t\n\t\t\t\t\tif (astField != null) {\n\t\t\t\t\t\t// OpenJDK\n\t\t\t\t\t\tJCVariableDecl variable = Permit.get(astField, recordComponent);\n\t\t\t\t\t\tvariable.mods.annotations =  filterListByPos(variable.mods.annotations, annotation);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Zulu JDK 17\n\t\t\t\t\t\tList<JCAnnotation> annotations = Permit.get(originalAnnos, recordComponent);\n\t\t\t\t\t\tPermit.set(originalAnnos, recordComponent, filterListByPos(annotations, annotation));\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch (Throwable e) {\n\t\t\t\t// Ignore\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/** Serves as return value for the methods that check for the existence of fields and methods. */\n\tpublic enum MemberExistsResult {\n\t\tNOT_EXISTS, EXISTS_BY_LOMBOK, EXISTS_BY_USER;\n\t}\n\t\n\t/**\n\t * Translates the given field into all possible getter names.\n\t * Convenient wrapper around {@link HandlerUtil#toAllGetterNames(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static java.util.List<String> toAllGetterNames(JavacNode field) {\n\t\treturn HandlerUtil.toAllGetterNames(field.getAst(), getAccessorsForField(field), field.getName(), isBoolean(field));\n\t}\n\t\n\t/**\n\t * Translates the given field into all possible getter names.\n\t * Convenient wrapper around {@link HandlerUtil#toAllGetterNames(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static java.util.List<String> toAllGetterNames(JavacNode field, AnnotationValues<Accessors> accessors) {\n\t\treturn HandlerUtil.toAllGetterNames(field.getAst(), accessors, field.getName(), isBoolean(field));\n\t}\n\t\n\t/**\n\t * @return the likely getter name for the stated field. (e.g. private boolean foo; to isFoo).\n\t * \n\t * Convenient wrapper around {@link HandlerUtil#toGetterName(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static String toGetterName(JavacNode field) {\n\t\treturn HandlerUtil.toGetterName(field.getAst(), getAccessorsForField(field), field.getName(), isBoolean(field));\n\t}\n\t\n\t/**\n\t * @return the likely getter name for the stated field. (e.g. private boolean foo; to isFoo).\n\t * \n\t * Convenient wrapper around {@link HandlerUtil#toGetterName(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static String toGetterName(JavacNode field, AnnotationValues<Accessors> accessors) {\n\t\treturn HandlerUtil.toGetterName(field.getAst(), accessors, field.getName(), isBoolean(field));\n\t}\n\t\n\t/**\n\t * Translates the given field into all possible setter names.\n\t * Convenient wrapper around {@link HandlerUtil#toAllSetterNames(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static java.util.List<String> toAllSetterNames(JavacNode field) {\n\t\treturn HandlerUtil.toAllSetterNames(field.getAst(), getAccessorsForField(field), field.getName(), isBoolean(field));\n\t}\n\t\n\t/**\n\t * Translates the given field into all possible setter names.\n\t * Convenient wrapper around {@link HandlerUtil#toAllSetterNames(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static java.util.List<String> toAllSetterNames(JavacNode field, AnnotationValues<Accessors> accessors) {\n\t\treturn HandlerUtil.toAllSetterNames(field.getAst(), accessors, field.getName(), isBoolean(field));\n\t}\n\t\n\t/**\n\t * @return the likely setter name for the stated field. (e.g. private boolean foo; to setFoo).\n\t * \n\t * Convenient wrapper around {@link HandlerUtil#toSetterName(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static String toSetterName(JavacNode field) {\n\t\treturn HandlerUtil.toSetterName(field.getAst(), getAccessorsForField(field), field.getName(), isBoolean(field));\n\t}\n\t\n\t/**\n\t * @return the likely setter name for the stated field. (e.g. private boolean foo; to setFoo).\n\t * \n\t * Convenient wrapper around {@link HandlerUtil#toSetterName(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static String toSetterName(JavacNode field, AnnotationValues<Accessors> accessors) {\n\t\treturn HandlerUtil.toSetterName(field.getAst(), accessors, field.getName(), isBoolean(field));\n\t}\n\t\n\t/**\n\t * Translates the given field into all possible with names.\n\t * Convenient wrapper around {@link HandlerUtil#toAllWithNames(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static java.util.List<String> toAllWithNames(JavacNode field) {\n\t\treturn HandlerUtil.toAllWithNames(field.getAst(), getAccessorsForField(field), field.getName(), isBoolean(field));\n\t}\n\t\n\t/**\n\t * Translates the given field into all possible with names.\n\t * Convenient wrapper around {@link HandlerUtil#toAllWithNames(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static java.util.List<String> toAllWithNames(JavacNode field, AnnotationValues<Accessors> accessors) {\n\t\treturn HandlerUtil.toAllWithNames(field.getAst(), accessors, field.getName(), isBoolean(field));\n\t}\n\t\n\t/**\n\t * Translates the given field into all possible withBy names.\n\t * Convenient wrapper around {@link HandlerUtil#toAllWithByNames(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static java.util.List<String> toAllWithByNames(JavacNode field) {\n\t\treturn HandlerUtil.toAllWithByNames(field.getAst(), getAccessorsForField(field), field.getName(), isBoolean(field));\n\t}\n\t\n\t/**\n\t * Translates the given field into all possible withBy names.\n\t * Convenient wrapper around {@link HandlerUtil#toAllWithByNames(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static java.util.List<String> toAllWithByNames(JavacNode field, AnnotationValues<Accessors> accessors) {\n\t\treturn HandlerUtil.toAllWithByNames(field.getAst(), accessors, field.getName(), isBoolean(field));\n\t}\n\t\n\t/**\n\t * @return the likely with name for the stated field. (e.g. private boolean foo; to withFoo).\n\t * \n\t * Convenient wrapper around {@link HandlerUtil#toWithName(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static String toWithName(JavacNode field) {\n\t\treturn HandlerUtil.toWithName(field.getAst(), getAccessorsForField(field), field.getName(), isBoolean(field));\n\t}\n\t\n\t/**\n\t * @return the likely with name for the stated field. (e.g. private boolean foo; to withFoo).\n\t * \n\t * Convenient wrapper around {@link HandlerUtil#toWithName(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static String toWithName(JavacNode field, AnnotationValues<Accessors> accessors) {\n\t\treturn HandlerUtil.toWithName(field.getAst(), accessors, field.getName(), isBoolean(field));\n\t}\n\t\n\t/**\n\t * @return the likely withBy name for the stated field. (e.g. private boolean foo; to withFooBy).\n\t * \n\t * Convenient wrapper around {@link HandlerUtil#toWithByName(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static String toWithByName(JavacNode field) {\n\t\treturn HandlerUtil.toWithByName(field.getAst(), getAccessorsForField(field), field.getName(), isBoolean(field));\n\t}\n\t\n\t/**\n\t * @return the likely withBy name for the stated field. (e.g. private boolean foo; to withFooBy).\n\t * \n\t * Convenient wrapper around {@link HandlerUtil#toWithByName(lombok.core.AnnotationValues, CharSequence, boolean)}.\n\t */\n\tpublic static String toWithByName(JavacNode field, AnnotationValues<Accessors> accessors) {\n\t\treturn HandlerUtil.toWithByName(field.getAst(), accessors, field.getName(), isBoolean(field));\n\t}\n\t\n\t/**\n\t * When generating a setter, the setter either returns void (beanspec) or Self (fluent).\n\t * This method scans for the {@code Accessors} annotation to figure that out.\n\t */\n\tpublic static boolean shouldReturnThis(JavacNode field, AnnotationValues<Accessors> accessors) {\n\t\tif ((((JCVariableDecl) field.get()).mods.flags & Flags.STATIC) != 0) return false;\n\t\t\n\t\treturn HandlerUtil.shouldReturnThis0(accessors, field.getAst());\n\t}\n\t\n\t/**\n\t * When generating a setter/getter/wither, should it be made final?\n\t */\n\tpublic static boolean shouldMakeFinal(JavacNode field, AnnotationValues<Accessors> accessors) {\n\t\tif ((((JCVariableDecl) field.get()).mods.flags & Flags.STATIC) != 0) return false;\n\t\t\n\t\treturn HandlerUtil.shouldMakeFinal0(accessors, field.getAst());\n\t}\n\t\n\tpublic static JCExpression cloneSelfType(JavacNode childOfType) {\n\t\tJavacNode typeNode = childOfType;\n\t\tJavacTreeMaker maker = childOfType.getTreeMaker();\n\t\twhile (typeNode != null && typeNode.getKind() != Kind.TYPE) typeNode = typeNode.up();\n\t\treturn JavacHandlerUtil.namePlusTypeParamsToTypeReference(maker, typeNode, ((JCClassDecl) typeNode.get()).typarams);\n\t}\n\t\n\tpublic static boolean isBoolean(JavacNode field) {\n\t\tJCExpression varType = ((JCVariableDecl) field.get()).vartype;\n\t\treturn isBoolean(varType);\n\t}\n\t\n\tpublic static boolean isBoolean(JCExpression varType) {\n\t\treturn varType != null && varType.toString().equals(\"boolean\");\n\t}\n\t\n\tpublic static Name removePrefixFromField(JavacNode field) {\n\t\tjava.util.List<String> prefixes = null;\n\t\tfor (JavacNode node : field.down()) {\n\t\t\tif (annotationTypeMatches(Accessors.class, node)) {\n\t\t\t\tAnnotationValues<Accessors> ann = createAnnotation(Accessors.class, node);\n\t\t\t\tif (ann.isExplicit(\"prefix\")) prefixes = Arrays.asList(ann.getInstance().prefix());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (prefixes == null) {\n\t\t\tJavacNode current = field.up();\n\t\t\touter:\n\t\t\twhile (current != null) {\n\t\t\t\tfor (JavacNode node : current.down()) {\n\t\t\t\t\tif (annotationTypeMatches(Accessors.class, node)) {\n\t\t\t\t\t\tAnnotationValues<Accessors> ann = createAnnotation(Accessors.class, node);\n\t\t\t\t\t\tif (ann.isExplicit(\"prefix\")) prefixes = Arrays.asList(ann.getInstance().prefix());\n\t\t\t\t\t\tbreak outer;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcurrent = current.up();\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (prefixes == null) prefixes = field.getAst().readConfiguration(ConfigurationKeys.ACCESSORS_PREFIX);\n\t\t\n\t\tif (!prefixes.isEmpty()) {\n\t\t\tCharSequence newName = removePrefix(field.getName(), prefixes);\n\t\t\tif (newName != null) return field.toName(newName.toString());\n\t\t}\n\t\t\n\t\treturn ((JCVariableDecl) field.get()).name;\n\t}\n\t\n\tpublic static AnnotationValues<Accessors> getAccessorsForField(JavacNode field) {\n\t\tAnnotationValues<Accessors> values = null;\n\t\t\n\t\tfor (JavacNode node : field.down()) {\n\t\t\tif (annotationTypeMatches(Accessors.class, node)) {\n\t\t\t\tvalues = createAnnotation(Accessors.class, node);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\tJavacNode current = field.up();\n\t\twhile (current != null) {\n\t\t\tfor (JavacNode node : current.down()) {\n\t\t\t\tif (annotationTypeMatches(Accessors.class, node)) {\n\t\t\t\t\tAnnotationValues<Accessors> onType = createAnnotation(Accessors.class, node);\n\t\t\t\t\tvalues = values == null ? onType : values.integrate(onType);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcurrent = current.up();\n\t\t}\n\t\t\n\t\treturn values == null ? AnnotationValues.of(Accessors.class, field) : values;\n\t}\n\t\n\t/**\n\t * Checks if there is a field with the provided name.\n\t * \n\t * @param fieldName the field name to check for.\n\t * @param node Any node that represents the Type (JCClassDecl) to look in, or any child node thereof.\n\t */\n\tpublic static MemberExistsResult fieldExists(String fieldName, JavacNode node) {\n\t\tnode = upToTypeNode(node);\n\t\t\n\t\tif (node != null && node.get() instanceof JCClassDecl) {\n\t\t\tfor (JCTree def : ((JCClassDecl)node.get()).defs) {\n\t\t\t\tif (def instanceof JCVariableDecl) {\n\t\t\t\t\tif (((JCVariableDecl)def).name.contentEquals(fieldName)) {\n\t\t\t\t\t\treturn getGeneratedBy(def) == null ? MemberExistsResult.EXISTS_BY_USER : MemberExistsResult.EXISTS_BY_LOMBOK;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn MemberExistsResult.NOT_EXISTS;\n\t}\n\t\n\tpublic static MemberExistsResult methodExists(String methodName, JavacNode node, int params) {\n\t\treturn methodExists(methodName, node, true, params);\n\t}\n\t\n\t/**\n\t * Checks if there is a method with the provided name. In case of multiple methods (overloading), only\n\t * the first method decides if EXISTS_BY_USER or EXISTS_BY_LOMBOK is returned.\n\t * \n\t * @param methodName the method name to check for.\n\t * @param node Any node that represents the Type (JCClassDecl) to look in, or any child node thereof.\n\t * @param caseSensitive If the search should be case sensitive.\n\t * @param params The number of parameters the method should have; varargs count as 0-*. Set to -1 to find any method with the appropriate name regardless of parameter count.\n\t */\n\tpublic static MemberExistsResult methodExists(String methodName, JavacNode node, boolean caseSensitive, int params) {\n\t\tnode = upToTypeNode(node);\n\t\t\n\t\tif (node != null && node.get() instanceof JCClassDecl) {\n\t\t\ttop: for (JCTree def : ((JCClassDecl)node.get()).defs) {\n\t\t\t\tif (def instanceof JCMethodDecl) {\n\t\t\t\t\tJCMethodDecl md = (JCMethodDecl) def;\n\t\t\t\t\tString name = md.name.toString();\n\t\t\t\t\tboolean matches = caseSensitive ? name.equals(methodName) : name.equalsIgnoreCase(methodName);\n\t\t\t\t\tif (matches) {\n\t\t\t\t\t\tif (params > -1) {\n\t\t\t\t\t\t\tList<JCVariableDecl> ps = md.params;\n\t\t\t\t\t\t\tint minArgs = 0;\n\t\t\t\t\t\t\tint maxArgs = 0;\n\t\t\t\t\t\t\tif (ps != null && ps.length() > 0) {\n\t\t\t\t\t\t\t\tminArgs = ps.length();\n\t\t\t\t\t\t\t\tif ((ps.last().mods.flags & Flags.VARARGS) != 0) {\n\t\t\t\t\t\t\t\t\tmaxArgs = Integer.MAX_VALUE;\n\t\t\t\t\t\t\t\t\tminArgs--;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tmaxArgs = minArgs;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (params < minArgs || params > maxArgs) continue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (isTolerate(node, md)) continue top;\n\t\t\t\t\t\t\n\t\t\t\t\t\treturn getGeneratedBy(def) == null ? MemberExistsResult.EXISTS_BY_USER : MemberExistsResult.EXISTS_BY_LOMBOK;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn MemberExistsResult.NOT_EXISTS;\n\t}\n\t\n\tpublic static boolean isTolerate(JavacNode node, JCTree.JCMethodDecl md) {\n\t\tList<JCAnnotation> annotations = md.getModifiers().getAnnotations();\n\t\tif (annotations != null) for (JCTree.JCAnnotation anno : annotations) {\n\t\t\tif (typeMatches(Tolerate.class, node, anno.getAnnotationType())) return true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * Checks if there is a (non-default) constructor. In case of multiple constructors (overloading), only\n\t * the first constructor decides if EXISTS_BY_USER or EXISTS_BY_LOMBOK is returned.\n\t * \n\t * @param node Any node that represents the Type (JCClassDecl) to look in, or any child node thereof.\n\t */\n\tpublic static MemberExistsResult constructorExists(JavacNode node) {\n\t\tnode = upToTypeNode(node);\n\t\t\n\t\tif (node != null && node.get() instanceof JCClassDecl) {\n\t\t\tfor (JCTree def : ((JCClassDecl) node.get()).defs) {\n\t\t\t\tif (def instanceof JCMethodDecl) {\n\t\t\t\t\tJCMethodDecl md = (JCMethodDecl) def;\n\t\t\t\t\tif (md.name.contentEquals(\"<init>\")) {\n\t\t\t\t\t\tif ((md.mods.flags & Flags.GENERATEDCONSTR) != 0) continue;\n\t\t\t\t\t\tif (isTolerate(node, md)) continue;\n\t\t\t\t\t\treturn getGeneratedBy(def) == null ? MemberExistsResult.EXISTS_BY_USER : MemberExistsResult.EXISTS_BY_LOMBOK;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn MemberExistsResult.NOT_EXISTS;\n\t}\n\t\n\tpublic static boolean isConstructorCall(final JCStatement statement) {\n\t\tif (!(statement instanceof JCExpressionStatement)) return false;\n\t\tJCExpression expr = ((JCExpressionStatement) statement).expr;\n\t\tif (!(expr instanceof JCMethodInvocation)) return false;\n\t\tJCExpression invocation = ((JCMethodInvocation) expr).meth;\n\t\tString name;\n\t\tif (invocation instanceof JCFieldAccess) {\n\t\t\tname = ((JCFieldAccess) invocation).name.toString();\n\t\t} else if (invocation instanceof JCIdent) {\n\t\t\tname = ((JCIdent) invocation).name.toString();\n\t\t} else {\n\t\t\tname = \"\";\n\t\t}\n\t\t\n\t\treturn \"super\".equals(name) || \"this\".equals(name);\n\t}\n\t\n\t/**\n\t * Turns an {@code AccessLevel} instance into the flag bit used by javac.\n\t */\n\t@SuppressWarnings(\"deprecation\") // We have to use MODULE here to make it act according to spec, which is to treat it like `PACKAGE`.\n\tpublic static int toJavacModifier(AccessLevel accessLevel) {\n\t\tswitch (accessLevel) {\n\t\tcase MODULE:\n\t\tcase PACKAGE:\n\t\t\treturn 0;\n\t\tdefault:\n\t\tcase PUBLIC:\n\t\t\treturn Flags.PUBLIC;\n\t\tcase NONE:\n\t\tcase PRIVATE:\n\t\t\treturn Flags.PRIVATE;\n\t\tcase PROTECTED:\n\t\t\treturn Flags.PROTECTED;\n\t\t}\n\t}\n\t\n\tprivate static class GetterMethod {\n\t\tprivate final Name name;\n\t\tprivate final JCExpression type;\n\t\t\n\t\tGetterMethod(Name name, JCExpression type) {\n\t\t\tthis.name = name;\n\t\t\tthis.type = type;\n\t\t}\n\t}\n\t\n\tprivate static GetterMethod findGetter(JavacNode field) {\n\t\tJCVariableDecl decl = (JCVariableDecl)field.get();\n\t\tJavacNode typeNode = field.up();\n\t\tfor (String potentialGetterName : toAllGetterNames(field)) {\n\t\t\tfor (JavacNode potentialGetter : typeNode.down()) {\n\t\t\t\tif (potentialGetter.getKind() != Kind.METHOD) continue;\n\t\t\t\tJCMethodDecl method = (JCMethodDecl) potentialGetter.get();\n\t\t\t\tif (!method.name.toString().equalsIgnoreCase(potentialGetterName)) continue;\n\t\t\t\t/** static getX() methods don't count. */\n\t\t\t\tif ((method.mods.flags & Flags.STATIC) != 0) continue;\n\t\t\t\t/** Nor do getters with a non-empty parameter list. */\n\t\t\t\tif (method.params != null && method.params.size() > 0) continue;\n\t\t\t\treturn new GetterMethod(method.name, method.restype);\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Check if the field has a @Getter annotation.\n\t\t\n\t\tboolean hasGetterAnnotation = false;\n\t\t\n\t\tfor (JavacNode child : field.down()) {\n\t\t\tif (child.getKind() == Kind.ANNOTATION && annotationTypeMatches(Getter.class, child)) {\n\t\t\t\tAnnotationValues<Getter> ann = createAnnotation(Getter.class, child);\n\t\t\t\tif (ann.getInstance().value() == AccessLevel.NONE) return null;   //Definitely WONT have a getter.\n\t\t\t\thasGetterAnnotation = true;\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Check if the class has a @Getter annotation.\n\t\t\n\t\tif (!hasGetterAnnotation && HandleGetter.fieldQualifiesForGetterGeneration(field)) {\n\t\t\t//Check if the class has @Getter or @Data annotation.\n\t\t\t\n\t\t\tJavacNode containingType = field.up();\n\t\t\tif (containingType != null) for (JavacNode child : containingType.down()) {\n\t\t\t\tif (child.getKind() == Kind.ANNOTATION && annotationTypeMatches(Data.class, child)) hasGetterAnnotation = true;\n\t\t\t\tif (child.getKind() == Kind.ANNOTATION && annotationTypeMatches(Getter.class, child)) {\n\t\t\t\t\tAnnotationValues<Getter> ann = createAnnotation(Getter.class, child);\n\t\t\t\t\tif (ann.getInstance().value() == AccessLevel.NONE) return null;   //Definitely WONT have a getter.\n\t\t\t\t\thasGetterAnnotation = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (hasGetterAnnotation) {\n\t\t\tString getterName = toGetterName(field);\n\t\t\tif (getterName == null) return null;\n\t\t\treturn new GetterMethod(field.toName(getterName), decl.vartype);\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\t\n\tstatic boolean lookForGetter(JavacNode field, FieldAccess fieldAccess) {\n\t\tif (fieldAccess == FieldAccess.GETTER) return true;\n\t\tif (fieldAccess == FieldAccess.ALWAYS_FIELD) return false;\n\t\t\n\t\t// If @Getter(lazy = true) is used, then using it is mandatory.\n\t\tfor (JavacNode child : field.down()) {\n\t\t\tif (child.getKind() != Kind.ANNOTATION) continue;\n\t\t\tif (annotationTypeMatches(Getter.class, child)) {\n\t\t\t\tAnnotationValues<Getter> ann = createAnnotation(Getter.class, child);\n\t\t\t\tif (ann.getInstance().lazy()) return true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * Returns the type of the field, unless a getter exists for this field, in which case the return type of the getter is returned.\n\t * \n\t * @see #createFieldAccessor(TreeMaker, JavacNode, FieldAccess)\n\t */\n\tstatic JCExpression getFieldType(JavacNode field, FieldAccess fieldAccess) {\n\t\tif (field.getKind() == Kind.METHOD) return ((JCMethodDecl) field.get()).restype;\n\t\t\n\t\tboolean lookForGetter = lookForGetter(field, fieldAccess);\n\t\t\n\t\tGetterMethod getter = lookForGetter ? findGetter(field) : null;\n\t\t\n\t\tif (getter == null) {\n\t\t\treturn ((JCVariableDecl) field.get()).vartype;\n\t\t}\n\t\t\n\t\treturn getter.type;\n\t}\n\t\n\t/**\n\t * Creates an expression that reads the field. Will either be {@code this.field} or {@code this.getField()} depending on whether or not there's a getter.\n\t */\n\tstatic JCExpression createFieldAccessor(JavacTreeMaker maker, JavacNode field, FieldAccess fieldAccess) {\n\t\treturn createFieldAccessor(maker, field, fieldAccess, null);\n\t}\n\t\n\tstatic JCExpression createFieldAccessor(JavacTreeMaker maker, JavacNode field, FieldAccess fieldAccess, JCExpression receiver) {\n\t\tboolean lookForGetter = lookForGetter(field, fieldAccess);\n\t\t\n\t\tGetterMethod getter = lookForGetter ? findGetter(field) : null;\n\t\tJCVariableDecl fieldDecl = (JCVariableDecl) field.get();\n\t\t\n\t\tif (getter == null) {\n\t\t\tif (receiver == null) {\n\t\t\t\tif ((fieldDecl.mods.flags & Flags.STATIC) == 0) {\n\t\t\t\t\treceiver = maker.Ident(field.toName(\"this\"));\n\t\t\t\t} else {\n\t\t\t\t\tJavacNode containerNode = field.up();\n\t\t\t\t\tif (containerNode != null && containerNode.get() instanceof JCClassDecl) {\n\t\t\t\t\t\tJCClassDecl container = (JCClassDecl) field.up().get();\n\t\t\t\t\t\treceiver = maker.Ident(container.name);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn receiver == null ? maker.Ident(fieldDecl.name) : maker.Select(receiver, fieldDecl.name);\n\t\t}\n\t\t\n\t\tif (receiver == null) receiver = maker.Ident(field.toName(\"this\"));\n\t\tJCMethodInvocation call = maker.Apply(List.<JCExpression>nil(),\n\t\t\tmaker.Select(receiver, getter.name), List.<JCExpression>nil());\n\t\treturn call;\n\t}\n\t\n\tstatic JCExpression createMethodAccessor(JavacTreeMaker maker, JavacNode method) {\n\t\treturn createMethodAccessor(maker, method, null);\n\t}\n\t\n\tstatic JCExpression createMethodAccessor(JavacTreeMaker maker, JavacNode method, JCExpression receiver) {\n\t\tJCMethodDecl methodDecl = (JCMethodDecl) method.get();\n\t\t\n\t\tif (receiver == null && (methodDecl.mods.flags & Flags.STATIC) == 0) {\n\t\t\treceiver = maker.Ident(method.toName(\"this\"));\n\t\t} else if (receiver == null) {\n\t\t\tJavacNode containerNode = method.up();\n\t\t\tif (containerNode != null && containerNode.get() instanceof JCClassDecl) {\n\t\t\t\tJCClassDecl container = (JCClassDecl) method.up().get();\n\t\t\t\treceiver = maker.Ident(container.name);\n\t\t\t}\n\t\t}\n\t\t\n\t\tJCMethodInvocation call = maker.Apply(List.<JCExpression>nil(),\n\t\t\treceiver == null ? maker.Ident(methodDecl.name) : maker.Select(receiver, methodDecl.name), List.<JCExpression>nil());\n\t\treturn call;\n\t}\n\t\n\t/**\n\t * Adds the given new field declaration to the provided type AST Node.\n\t * The field carries the &#64;{@link SuppressWarnings}(\"all\") annotation.\n\t * Also takes care of updating the JavacAST.\n\t */\n\tpublic static JavacNode injectFieldAndMarkGenerated(JavacNode typeNode, JCVariableDecl field) {\n\t\treturn injectField(typeNode, field, true);\n\t}\n\t\n\t/**\n\t * Adds the given new field declaration to the provided type AST Node.\n\t * \n\t * Also takes care of updating the JavacAST.\n\t */\n\tpublic static JavacNode injectField(JavacNode typeNode, JCVariableDecl field) {\n\t\treturn injectField(typeNode, field, false);\n\t}\n\t\n\tpublic static JavacNode injectField(JavacNode typeNode, JCVariableDecl field, boolean addGenerated) {\n\t\treturn injectField(typeNode, field, addGenerated, false);\n\t}\n\t\n\tpublic static JavacNode injectField(JavacNode typeNode, JCVariableDecl field, boolean addGenerated, boolean specialEnumHandling) {\n\t\tJCClassDecl type = (JCClassDecl) typeNode.get();\n\t\t\n\t\tif (addGenerated) {\n\t\t\taddSuppressWarningsAll(field.mods, typeNode, typeNode.getNodeFor(getGeneratedBy(field)), typeNode.getContext());\n\t\t\taddGenerated(field.mods, typeNode, typeNode.getNodeFor(getGeneratedBy(field)), typeNode.getContext());\n\t\t}\n\t\t\n\t\tList<JCTree> insertAfter = null;\n\t\tList<JCTree> insertBefore = type.defs;\n\t\twhile (true) {\n\t\t\tboolean skip = false;\n\t\t\tif (insertBefore.head instanceof JCVariableDecl) {\n\t\t\t\tJCVariableDecl f = (JCVariableDecl) insertBefore.head;\n\t\t\t\tif ((!specialEnumHandling && isEnumConstant(f)) || isGenerated(f)) skip = true;\n\t\t\t} else if (insertBefore.head instanceof JCMethodDecl) {\n\t\t\t\tif ((((JCMethodDecl) insertBefore.head).mods.flags & GENERATEDCONSTR) != 0) skip = true;\n\t\t\t}\n\t\t\tif (skip) {\n\t\t\t\tinsertAfter = insertBefore;\n\t\t\t\tinsertBefore = insertBefore.tail;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tList<JCTree> fieldEntry = List.<JCTree>of(field);\n\t\tfieldEntry.tail = insertBefore;\n\t\tif (insertAfter == null) {\n\t\t\ttype.defs = fieldEntry;\n\t\t} else {\n\t\t\tinsertAfter.tail = fieldEntry;\n\t\t}\n\t\t\n\t\tEnterReflect.memberEnter(field, typeNode);\n\t\t\n\t\treturn typeNode.add(field, Kind.FIELD);\n\t}\n\t\n\tpublic static boolean isEnumConstant(final JCVariableDecl field) {\n\t\treturn (field.mods.flags & Flags.ENUM) != 0;\n\t}\n\t\n\tstatic class JCAnnotatedTypeReflect {\n\t\tprivate static final Class<?> TYPE;\n\t\tprivate static final Constructor<?> CONSTRUCTOR;\n\t\tprivate static final Field ANNOTATIONS, UNDERLYING_TYPE;\n\t\t\n\t\tstatic {\n\t\t\tClass<?> t = null;\n\t\t\tConstructor<?> c = null;\n\t\t\tField a = null;\n\t\t\tField u = null;\n\t\t\t\n\t\t\ttry {\n\t\t\t\tt = Class.forName(\"com.sun.tools.javac.tree.JCTree$JCAnnotatedType\");\n\t\t\t\tc = Permit.getConstructor(t, List.class, JCExpression.class);\n\t\t\t\ta = Permit.permissiveGetField(t, \"annotations\");\n\t\t\t\tu = Permit.permissiveGetField(t, \"underlyingType\");\n\t\t\t} catch (Exception e) {\n\t\t\t\t// Ignore\n\t\t\t}\n\t\t\t\n\t\t\tTYPE = t;\n\t\t\tCONSTRUCTOR = c;\n\t\t\tANNOTATIONS = a;\n\t\t\tUNDERLYING_TYPE = u;\n\t\t}\n\t\t\n\t\tstatic boolean is(JCTree obj) {\n\t\t\tif (obj == null) return false;\n\t\t\treturn obj.getClass() == TYPE;\n\t\t}\n\t\t\n\t\t@SuppressWarnings(\"unchecked\")\n\t\tstatic List<JCAnnotation> getAnnotations(JCTree obj) {\n\t\t\tif (ANNOTATIONS == null) return List.nil();\n\t\t\ttry {\n\t\t\t\treturn (List<JCAnnotation>) ANNOTATIONS.get(obj);\n\t\t\t} catch (Exception e) {\n\t\t\t\treturn List.nil();\n\t\t\t}\n\t\t}\n\t\t\n\t\tstatic void setAnnotations(JCTree obj, List<JCAnnotation> anns) {\n\t\t\tif (ANNOTATIONS == null) return;\n\t\t\ttry {\n\t\t\t\tANNOTATIONS.set(obj, anns);\n\t\t\t} catch (Exception e) {\n\t\t\t\t// Ignore\n\t\t\t}\n\t\t}\n\t\t\n\t\tstatic JCExpression getUnderlyingType(JCTree obj) {\n\t\t\tif (UNDERLYING_TYPE == null) return null;\n\t\t\ttry {\n\t\t\t\treturn (JCExpression) UNDERLYING_TYPE.get(obj);\n\t\t\t} catch (Exception e) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\t\n\t\tstatic JCExpression create(List<JCAnnotation> annotations, JCExpression underlyingType) {\n\t\t\tif (CONSTRUCTOR == null) return underlyingType;\n\t\t\ttry {\n\t\t\t\treturn (JCExpression) CONSTRUCTOR.newInstance(annotations, underlyingType);\n\t\t\t} catch (Exception e) {\n\t\t\t\treturn underlyingType;\n\t\t\t}\n\t\t}\n\t}\n\t\n\tstatic class JCAnnotationReflect {\n\t\tprivate static final Field ATTRIBUTE;\n\n\t\tstatic {\n\t\t\tATTRIBUTE = Permit.permissiveGetField(JCAnnotation.class, \"attribute\");\n\t\t}\n\n\t\tstatic Attribute.Compound getAttribute(JCAnnotation jcAnnotation) {\n\t\t\tif (ATTRIBUTE != null) {\n\t\t\t\ttry {\n\t\t\t\t\treturn (Attribute.Compound) ATTRIBUTE.get(jcAnnotation);\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t// Ignore\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\tstatic void setAttribute(JCAnnotation jcAnnotation, Attribute.Compound attribute) {\n\t\t\tif (ATTRIBUTE != null) {\n\t\t\t\ttry {\n\t\t\t\t\tPermit.set(ATTRIBUTE, jcAnnotation, attribute);\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t// Ignore\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// jdk9 support, types have changed, names stay the same\n\tstatic class ClassSymbolMembersField {\n\t\tprivate static final Field membersField;\n\t\tprivate static final Method removeMethod;\n\t\tprivate static final Method enterMethod;\n\t\t\n\t\tstatic {\n\t\t\tField f = null;\n\t\t\tMethod r = null;\n\t\t\tMethod e = null;\n\t\t\ttry {\n\t\t\t\tf = Permit.getField(ClassSymbol.class, \"members_field\");\n\t\t\t\tr = Permit.getMethod(f.getType(), \"remove\", Symbol.class);\n\t\t\t\te = Permit.getMethod(f.getType(), \"enter\", Symbol.class);\n\t\t\t} catch (Exception ex) {}\n\t\t\tmembersField = f;\n\t\t\tremoveMethod = r;\n\t\t\tenterMethod = e;\n\t\t}\n\t\t\n\t\tstatic void remove(ClassSymbol from, Symbol toRemove) {\n\t\t\tif (from == null) return;\n\t\t\ttry {\n\t\t\t\tScope scope = (Scope) membersField.get(from);\n\t\t\t\tif (scope == null) return;\n\t\t\t\tPermit.invoke(removeMethod, scope, toRemove);\n\t\t\t} catch (Exception e) {}\n\t\t}\n\t\t\n\t\tstatic void enter(ClassSymbol from, Symbol toEnter) {\n\t\t\tif (from == null) return;\n\t\t\ttry {\n\t\t\t\tScope scope = (Scope) membersField.get(from);\n\t\t\t\tif (scope == null) return;\n\t\t\t\tPermit.invoke(enterMethod, scope, toEnter);\n\t\t\t} catch (Exception e) {}\n\t\t}\n\t}\n\t\n\t/**\n\t * Adds the given new method declaration to the provided type AST Node.\n\t * Can also inject constructors.\n\t * \n\t * Also takes care of updating the JavacAST.\n\t */\n\tpublic static void injectMethod(JavacNode typeNode, JCMethodDecl method) {\n\t\tJavacNode source = typeNode.getNodeFor(getGeneratedBy(method));\n\t\tinjectMethod(typeNode, source, method);\n\t}\n\t\n\t/**\n\t * Adds the given new method declaration to the provided type AST Node.\n\t * Can also inject constructors.\n\t * \n\t * Also takes care of updating the JavacAST.\n\t * \n\t * Ordinarily the 'source' is determined automatically. In rare cases generally involving combinations between\n\t * annotations, some of which require re-attribution such as {@code @Delegate}, that doesn't work. This method\n\t * exists if you explicitly have the source.\n\t */\n\tpublic static void injectMethod(JavacNode typeNode, JavacNode source, JCMethodDecl method) {\n\t\tJCClassDecl type = (JCClassDecl) typeNode.get();\n\t\t\n\t\tif (method.getName().contentEquals(\"<init>\")) {\n\t\t\t//Scan for default constructor, and remove it.\n\t\t\tint idx = 0;\n\t\t\tfor (JCTree def : type.defs) {\n\t\t\t\tif (def instanceof JCMethodDecl) {\n\t\t\t\t\tif ((((JCMethodDecl) def).mods.flags & Flags.GENERATEDCONSTR) != 0) {\n\t\t\t\t\t\tJavacNode tossMe = typeNode.getNodeFor(def);\n\t\t\t\t\t\tif (tossMe != null) tossMe.up().removeChild(tossMe);\n\t\t\t\t\t\ttype.defs = addAllButOne(type.defs, idx);\n\t\t\t\t\t\tClassSymbolMembersField.remove(type.sym, ((JCMethodDecl) def).sym);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tidx++;\n\t\t\t}\n\t\t}\n\t\t\n\t\taddSuppressWarningsAll(method.mods, typeNode, typeNode.getNodeFor(getGeneratedBy(method)), typeNode.getContext());\n\t\taddGenerated(method.mods, typeNode, source, typeNode.getContext());\n\t\ttype.defs = type.defs.append(method);\n\t\t\n\t\tEnterReflect.memberEnter(method, typeNode);\n\t\t\n\t\ttypeNode.add(method, Kind.METHOD);\n\t}\n\n\t/**\n\t * Adds an inner type (class, interface, enum) to the given type. Cannot inject top-level types.\n\t * \n\t * @param typeNode parent type to inject new type into\n\t * @param type New type (class, interface, etc) to inject.\n\t * @return \n\t */\n\tpublic static JavacNode injectType(JavacNode typeNode, final JCClassDecl type) {\n\t\tJCClassDecl typeDecl = (JCClassDecl) typeNode.get();\n\t\taddSuppressWarningsAll(type.mods, typeNode, typeNode.getNodeFor(getGeneratedBy(type)), typeNode.getContext());\n\t\taddGenerated(type.mods, typeNode, typeNode.getNodeFor(getGeneratedBy(type)), typeNode.getContext());\n\t\ttypeDecl.defs = typeDecl.defs.append(type);\n\t\t\n\t\tEnterReflect.classEnter(type, typeNode);\n\t\t\n\t\treturn typeNode.add(type, Kind.TYPE);\n\t}\n\t\n\tstatic class EnterReflect {\n\t\tprivate static final Method classEnter;\n\t\tprivate static final Method memberEnter;\n\t\tprivate static final Method blockAnnotations;\n\t\tprivate static final Method unblockAnnotations;\n\t\t\n\t\tstatic {\n\t\t\tclassEnter = Permit.permissiveGetMethod(Enter.class, \"classEnter\", JCTree.class, Env.class);\n\t\t\tmemberEnter = Permit.permissiveGetMethod(MemberEnter.class, \"memberEnter\", JCTree.class, Env.class);\n\t\t\t\n\t\t\tMethod block = Permit.permissiveGetMethod(Annotate.class, \"blockAnnotations\");\n\t\t\tif (block == null) block = Permit.permissiveGetMethod(Annotate.class, \"enterStart\");\n\t\t\tblockAnnotations = block;\n\t\t\t\n\t\t\tMethod unblock = Permit.permissiveGetMethod(Annotate.class, \"unblockAnnotations\");\n\t\t\tif (unblock == null) unblock = Permit.permissiveGetMethod(Annotate.class, \"enterDone\");\n\t\t\tunblockAnnotations = unblock;\n\t\t}\n\t\t\n\t\tstatic Type classEnter(JCTree tree, JavacNode parent) {\n\t\t\tEnter enter = Enter.instance(parent.getContext());\n\t\t\tEnv<AttrContext> classEnv = enter.getEnv((TypeSymbol) parent.getElement());\n\t\t\tif (classEnv == null) return null;\n\t\t\tType type = (Type) Permit.invokeSneaky(classEnter, enter, tree, classEnv);\n\t\t\tif (type == null) return null;\n\t\t\ttype.complete();\n\t\t\treturn type;\n\t\t}\n\t\t\n\t\tstatic void memberEnter(JCTree tree, JavacNode parent) {\n\t\t\tContext context = parent.getContext();\n\t\t\tMemberEnter me = MemberEnter.instance(context);\n\t\t\tAnnotate annotate = Annotate.instance(context);\n\t\t\tEnter enter = Enter.instance(context);\n\t\t\t\n\t\t\tEnv<AttrContext> classEnv = enter.getEnv((TypeSymbol) parent.getElement());\n\t\t\tif (classEnv == null) return;\n\t\t\t\n\t\t\tPermit.invokeSneaky(blockAnnotations, annotate);\n\t\t\tPermit.invokeSneaky(memberEnter, me, tree, classEnv);\n\t\t\tPermit.invokeSneaky(unblockAnnotations, annotate);\n\t\t}\n\t}\n\t\n\tpublic static long addFinalIfNeeded(long flags, Context context) {\n\t\tboolean addFinal = LombokOptionsFactory.getDelombokOptions(context).getFormatPreferences().generateFinalParams();\n\t\t\n\t\tif (addFinal) flags |= Flags.FINAL;\n\t\treturn flags;\n\t}\n\t\n\tpublic static JCExpression genTypeRef(JavacNode node, String complexName) {\n\t\tString[] parts = complexName.split(\"\\\\.\");\n\t\tif (parts.length > 2 && parts[0].equals(\"java\") && parts[1].equals(\"lang\")) {\n\t\t\tString[] subParts = new String[parts.length - 2];\n\t\t\tSystem.arraycopy(parts, 2, subParts, 0, subParts.length);\n\t\t\treturn genJavaLangTypeRef(node, subParts);\n\t\t}\n\t\t\n\t\treturn chainDots(node, parts);\n\t}\n\t\n\tpublic static JCExpression genJavaLangTypeRef(JavacNode node, String... simpleNames) {\n\t\tif (LombokOptionsFactory.getDelombokOptions(node.getContext()).getFormatPreferences().javaLangAsFqn()) {\n\t\t\treturn chainDots(node, \"java\", \"lang\", simpleNames);\n\t\t} else {\n\t\t\treturn chainDots(node, null, null, simpleNames);\n\t\t}\n\t}\n\t\n\tpublic static JCExpression genJavaLangTypeRef(JavacNode node, int pos, String... simpleNames) {\n\t\tif (LombokOptionsFactory.getDelombokOptions(node.getContext()).getFormatPreferences().javaLangAsFqn()) {\n\t\t\treturn chainDots(node, pos, \"java\", \"lang\", simpleNames);\n\t\t} else {\n\t\t\treturn chainDots(node, pos, null, null, simpleNames);\n\t\t}\n\t}\n\t\n\tpublic static void addSuppressWarningsAll(JCModifiers mods, JavacNode node, JavacNode source, Context context) {\n\t\tif (!LombokOptionsFactory.getDelombokOptions(context).getFormatPreferences().generateSuppressWarnings()) return;\n\t\t\n\t\tboolean addJLSuppress = !Boolean.FALSE.equals(node.getAst().readConfiguration(ConfigurationKeys.ADD_SUPPRESSWARNINGS_ANNOTATIONS));\n\t\t\n\t\tif (addJLSuppress) {\n\t\t\tfor (JCAnnotation ann : mods.annotations) {\n\t\t\t\tJCTree type = ann.getAnnotationType();\n\t\t\t\tName n = null;\n\t\t\t\tif (type instanceof JCIdent) n = ((JCIdent) type).name;\n\t\t\t\telse if (type instanceof JCFieldAccess) n = ((JCFieldAccess) type).name;\n\t\t\t\tif (n != null && n.contentEquals(\"SuppressWarnings\")) {\n\t\t\t\t\taddJLSuppress = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (addJLSuppress) addAnnotation(mods, node, source, \"java.lang.SuppressWarnings\", node.getTreeMaker().Literal(\"all\"));\n\t\t\n\t\tif (Boolean.TRUE.equals(node.getAst().readConfiguration(ConfigurationKeys.ADD_FINDBUGS_SUPPRESSWARNINGS_ANNOTATIONS))) {\n\t\t\tJavacTreeMaker maker = node.getTreeMaker();\n\t\t\tJCExpression arg = maker.Assign(maker.Ident(node.toName(\"justification\")), maker.Literal(\"generated code\"));\n\t\t\taddAnnotation(mods, node, source, \"edu.umd.cs.findbugs.annotations.SuppressFBWarnings\", arg);\n\t\t}\n\t}\n\t\n\tpublic static void addGenerated(JCModifiers mods, JavacNode node, JavacNode source, Context context) {\n\t\tif (!LombokOptionsFactory.getDelombokOptions(context).getFormatPreferences().generateGenerated()) return;\n\t\t\n\t\tif (HandlerUtil.shouldAddGenerated(node)) {\n\t\t\taddAnnotation(mods, node, source, \"javax.annotation.Generated\", node.getTreeMaker().Literal(\"lombok\"));\n\t\t}\n\t\tif (Boolean.TRUE.equals(node.getAst().readConfiguration(ConfigurationKeys.ADD_JAKARTA_GENERATED_ANNOTATIONS))) {\n\t\t\taddAnnotation(mods, node, source, \"jakarta.annotation.Generated\", node.getTreeMaker().Literal(\"lombok\"));\n\t\t}\n\t\tif (!Boolean.FALSE.equals(node.getAst().readConfiguration(ConfigurationKeys.ADD_LOMBOK_GENERATED_ANNOTATIONS))) {\n\t\t\taddAnnotation(mods, node, source, \"lombok.Generated\", null);\n\t\t}\n\t}\n\t\n\tpublic static void addAnnotation(JCModifiers mods, JavacNode node, JavacNode source, String annotationTypeFqn, JCExpression arg) {\n\t\tboolean isJavaLangBased;\n\t\tString simpleName; {\n\t\t\tint idx = annotationTypeFqn.lastIndexOf('.');\n\t\t\tsimpleName = idx == -1 ? annotationTypeFqn : annotationTypeFqn.substring(idx + 1);\n\t\t\t\n\t\t\tisJavaLangBased = idx == 9 && annotationTypeFqn.regionMatches(0, \"java.lang.\", 0, 10);\n\t\t}\n\t\t\n\t\tfor (JCAnnotation ann : mods.annotations) {\n\t\t\tJCTree annType = ann.getAnnotationType();\n\t\t\tif (annType instanceof JCIdent) {\n\t\t\t\tName lastPart = ((JCIdent) annType).name;\n\t\t\t\tif (lastPart.contentEquals(simpleName)) return;\n\t\t\t}\n\t\t\t\n\t\t\tif (annType instanceof JCFieldAccess) {\n\t\t\t\tif (annType.toString().equals(annotationTypeFqn)) return;\n\t\t\t}\n\t\t}\n\t\t\n\t\tJavacTreeMaker maker = node.getTreeMaker();\n\t\tJCExpression annType = isJavaLangBased ? genJavaLangTypeRef(node, simpleName) : chainDotsString(node, annotationTypeFqn);\n\t\tList<JCExpression> argList = arg != null ? List.of(arg) : List.<JCExpression>nil();\n\t\tJCAnnotation annotation = recursiveSetGeneratedBy(maker.Annotation(annType, argList), source);\n\t\tmods.annotations = mods.annotations.append(annotation);\n\t}\n\t\n\tstatic JCExpression addCheckerFrameworkReturnsReceiver(JCExpression returnType, JavacTreeMaker maker, JavacNode typeNode, CheckerFrameworkVersion cfv) {\n\t\tif (cfv.generateReturnsReceiver()) {\n\t\t\tJCAnnotation rrAnnotation = maker.Annotation(genTypeRef(typeNode, CheckerFrameworkVersion.NAME__RETURNS_RECEIVER), List.<JCExpression>nil());\n\t\t\treturnType = maker.AnnotatedType(List.of(rrAnnotation), returnType);\n\t\t}\n\t\treturn returnType;\n\t}\n\t\n\tprivate static List<JCTree> addAllButOne(List<JCTree> defs, int idx) {\n\t\tListBuffer<JCTree> out = new ListBuffer<JCTree>();\n\t\tint i = 0;\n\t\tfor (JCTree def : defs) {\n\t\t\tif (i++ != idx) out.append(def);\n\t\t}\n\t\treturn out.toList();\n\t}\n\t\n\t/**\n\t * In javac, dotted access of any kind, from {@code java.lang.String} to {@code var.methodName}\n\t * is represented by a fold-left of {@code Select} nodes with the leftmost string represented by\n\t * a {@code Ident} node. This method generates such an expression.\n\t * <p>\n\t * The position of the generated node(s) will be unpositioned (-1).\n\t * \n\t * For example, maker.Select(maker.Select(maker.Ident(NAME[java]), NAME[lang]), NAME[String]).\n\t * \n\t * @see com.sun.tools.javac.tree.JCTree.JCIdent\n\t * @see com.sun.tools.javac.tree.JCTree.JCFieldAccess\n\t */\n\tpublic static JCExpression chainDots(JavacNode node, String elem1, String elem2, String... elems) {\n\t\treturn chainDots(node, -1, elem1, elem2, elems);\n\t}\n\t\n\tpublic static JCExpression chainDots(JavacNode node, String[] elems) {\n\t\treturn chainDots(node, -1, null, null, elems);\n\t}\n\t\n\tpublic static JCExpression chainDots(JavacNode node, LombokImmutableList<String> elems) {\n\t\tassert elems != null;\n\t\t\n\t\tJavacTreeMaker maker = node.getTreeMaker();\n\t\tJCExpression e = null;\n\t\tfor (String elem : elems) {\n\t\t\tif (e == null) e = maker.Ident(node.toName(elem));\n\t\t\telse e = maker.Select(e, node.toName(elem));\n\t\t}\n\t\treturn e;\n\t}\n\t\n\t/**\n\t * In javac, dotted access of any kind, from {@code java.lang.String} to {@code var.methodName}\n\t * is represented by a fold-left of {@code Select} nodes with the leftmost string represented by\n\t * a {@code Ident} node. This method generates such an expression.\n\t * <p>\n\t * The position of the generated node(s) will be equal to the {@code pos} parameter.\n\t *\n\t * For example, maker.Select(maker.Select(maker.Ident(NAME[java]), NAME[lang]), NAME[String]).\n\t * \n\t * @see com.sun.tools.javac.tree.JCTree.JCIdent\n\t * @see com.sun.tools.javac.tree.JCTree.JCFieldAccess\n\t */\n\tpublic static JCExpression chainDots(JavacNode node, int pos, String elem1, String elem2, String... elems) {\n\t\tassert elems != null;\n\t\t\n\t\tJavacTreeMaker maker = node.getTreeMaker();\n\t\tif (pos != -1) maker = maker.at(pos);\n\t\tJCExpression e = null;\n\t\tif (elem1 != null) e = maker.Ident(node.toName(elem1));\n\t\tif (elem2 != null) e = e == null ? maker.Ident(node.toName(elem2)) : maker.Select(e, node.toName(elem2));\n\t\tfor (int i = 0 ; i < elems.length ; i++) {\n\t\t\te = e == null ? maker.Ident(node.toName(elems[i])) : maker.Select(e, node.toName(elems[i]));\n\t\t}\n\t\t\n\t\tassert e != null;\n\t\t\n\t\treturn e;\n\t}\n\t\n\t/**\n\t * In javac, dotted access of any kind, from {@code java.lang.String} to {@code var.methodName}\n\t * is represented by a fold-left of {@code Select} nodes with the leftmost string represented by\n\t * a {@code Ident} node. This method generates such an expression.\n\t * \n\t * For example, maker.Select(maker.Select(maker.Ident(NAME[java]), NAME[lang]), NAME[String]).\n\t * \n\t * @see com.sun.tools.javac.tree.JCTree.JCIdent\n\t * @see com.sun.tools.javac.tree.JCTree.JCFieldAccess\n\t */\n\tpublic static JCExpression chainDotsString(JavacNode node, String elems) {\n\t\treturn chainDots(node, null, null, elems.split(\"\\\\.\"));\n\t}\n\t\n\t/**\n\t * Searches the given field node for annotations and returns each one that matches the provided regular expression pattern.\n\t * \n\t * Only the simple name is checked - the package and any containing class are ignored.\n\t */\n\tpublic static List<JCAnnotation> findAnnotations(JavacNode fieldNode, Pattern namePattern) {\n\t\tListBuffer<JCAnnotation> result = new ListBuffer<JCAnnotation>();\n\t\tfor (JavacNode child : fieldNode.down()) {\n\t\t\tif (child.getKind() == Kind.ANNOTATION) {\n\t\t\t\tJCAnnotation annotation = (JCAnnotation) child.get();\n\t\t\t\tString name = annotation.annotationType.toString();\n\t\t\t\tint idx = name.lastIndexOf(\".\");\n\t\t\t\tString suspect = idx == -1 ? name : name.substring(idx + 1);\n\t\t\t\tif (namePattern.matcher(suspect).matches()) {\n\t\t\t\t\tresult.append(annotation);\n\t\t\t\t}\n\t\t\t}\n\t\t}\t\n\t\treturn result.toList();\n\t}\n\t\n\tpublic static String scanForNearestAnnotation(JavacNode node, String... anns) {\n\t\twhile (node != null) {\n\t\t\tfor (JavacNode ann : node.down()) {\n\t\t\t\tif (ann.getKind() != Kind.ANNOTATION) continue;\n\t\t\t\tJCAnnotation a = (JCAnnotation) ann.get();\n\t\t\t\tfor (String annToFind : anns) if (typeMatches(annToFind, node, a.annotationType)) return annToFind;\n\t\t\t}\n\t\t\tnode = node.up();\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\t\n\tpublic static boolean hasNonNullAnnotations(JavacNode node) {\n\t\tfor (JavacNode child : node.down()) {\n\t\t\tif (child.getKind() == Kind.ANNOTATION) {\n\t\t\t\tJCAnnotation annotation = (JCAnnotation) child.get();\n\t\t\t\tString annotationTypeName = getTypeName(annotation.annotationType);\n\t\t\t\tfor (String nn : NONNULL_ANNOTATIONS) if (typeMatches(nn, node, annotationTypeName)) return true;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\tpublic static boolean hasNonNullAnnotations(JavacNode node, List<JCAnnotation> anns) {\n\t\tif (anns == null) return false;\n\t\tfor (JCAnnotation ann : anns) {\n\t\t\tString annotationTypeName = getTypeName(ann.annotationType);\n\t\t\tfor (String nn : NONNULL_ANNOTATIONS) if (typeMatches(nn, node, annotationTypeName)) return true;\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * Searches the given field node for annotations and returns each one that is 'copyable' (either via configuration or from the base list).\n\t */\n\tpublic static List<JCAnnotation> findCopyableAnnotations(JavacNode node) {\n\t\tjava.util.List<TypeName> configuredCopyable = node.getAst().readConfiguration(ConfigurationKeys.COPYABLE_ANNOTATIONS);\n\t\t\n\t\tListBuffer<JCAnnotation> result = new ListBuffer<JCAnnotation>();\n\t\tfor (JavacNode child : node.down()) {\n\t\t\tif (child.getKind() == Kind.ANNOTATION) {\n\t\t\t\tJCAnnotation annotation = (JCAnnotation) child.get();\n\t\t\t\tString annotationTypeName = getTypeName(annotation.annotationType);\n\t\t\t\tboolean match = false;\n\t\t\t\tfor (TypeName cn : configuredCopyable) if (cn != null && typeMatches(cn.toString(), node, annotationTypeName)) {\n\t\t\t\t\tresult.append(annotation);\n\t\t\t\t\tmatch = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (!match) for (String bn : BASE_COPYABLE_ANNOTATIONS) if (typeMatches(bn, node, annotationTypeName)) {\n\t\t\t\t\tresult.append(annotation);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn copyAnnotations(result.toList(), node.getTreeMaker());\n\t}\n\t\n\t/**\n\t * Searches the given field node for annotations that are specifically intended to be copied to the getter.\n\t * \n\t * @param forceCopyJacksonAnnotations If {@code true}, always copy the annotations regardless of lombok configuration key {@code lombok.copyJacksonAnnotationsToAccessors}.\n\t */\n\tpublic static List<JCAnnotation> findCopyableToGetterAnnotations(JavacNode node, boolean forceCopyJacksonAnnotations) {\n\t\tif (!forceCopyJacksonAnnotations) {\n\t\t\tBoolean copyAnnotations = node.getAst().readConfiguration(ConfigurationKeys.COPY_JACKSON_ANNOTATIONS_TO_ACCESSORS);\n\t\t\tif (copyAnnotations == null || !copyAnnotations) return List.nil();\n\t\t}\n\t\treturn findAnnotationsInList(node, JACKSON_COPY_TO_GETTER_ANNOTATIONS);\n\t}\n\n\t/**\n\t * Searches the given field node for annotations that are specifically intended to be copied to the setter.\n\t * \n\t * @param forceCopyJacksonAnnotations If {@code true}, always copy the annotations regardless of lombok configuration key {@code lombok.copyJacksonAnnotationsToAccessors}.\n\t */\n\tpublic static List<JCAnnotation> findCopyableToSetterAnnotations(JavacNode node, boolean forceCopyJacksonAnnotations) {\n\t\tif (!forceCopyJacksonAnnotations) {\n\t\t\tBoolean copyAnnotations = node.getAst().readConfiguration(ConfigurationKeys.COPY_JACKSON_ANNOTATIONS_TO_ACCESSORS);\n\t\t\tif (copyAnnotations == null || !copyAnnotations) return List.nil();\n\t\t}\n\t\treturn findAnnotationsInList(node, JACKSON_COPY_TO_SETTER_ANNOTATIONS);\n\t}\n\n\t/**\n\t * Searches the given field node for annotations that are specifically intended to be copied to the builder's singular method.\n\t */\n\tpublic static List<JCAnnotation> findCopyableToBuilderSingularSetterAnnotations(JavacNode node) {\n\t\treturn findAnnotationsInList(node, JACKSON_COPY_TO_BUILDER_SINGULAR_SETTER_ANNOTATIONS);\n\t}\n\t\n\t/**\n\t * Searches the given field node for annotations that are in the given list, and returns those.\n\t */\n\tprivate static List<JCAnnotation> findAnnotationsInList(JavacNode node, java.util.List<String> annotationsToFind) {\n\t\tJCAnnotation anno = null;\n\t\tString annoName = null;\n\t\tfor (JavacNode child : node.down()) {\n\t\t\tif (child.getKind() == Kind.ANNOTATION) {\n\t\t\t\tif (anno != null) {\n\t\t\t\t\tannoName = \"\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tJCAnnotation annotation = (JCAnnotation) child.get();\n\t\t\t\tannoName = annotation.annotationType.toString();\n\t\t\t\tanno = annotation;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (annoName == null) return List.nil();\n\t\t\n\t\tif (!annoName.isEmpty()) {\n\t\t\tfor (String bn : annotationsToFind) if (typeMatches(bn, node, annoName)) return copyAnnotations(List.of(anno), node.getTreeMaker());\n\t\t}\n\t\t\n\t\tListBuffer<JCAnnotation> result = new ListBuffer<JCAnnotation>();\n\t\tfor (JavacNode child : node.down()) {\n\t\t\tif (child.getKind() == Kind.ANNOTATION) {\n\t\t\t\tJCAnnotation annotation = (JCAnnotation) child.get();\n\t\t\t\tString annotationTypeName = getTypeName(annotation.annotationType);\n\t\t\t\tboolean match = false;\n\t\t\t\tif (!match) for (String bn : annotationsToFind) if (typeMatches(bn, node, annotationTypeName)) {\n\t\t\t\t\tresult.append(annotation);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn copyAnnotations(result.toList(), node.getTreeMaker());\n\t}\n\t\n\t/**\n\t * Generates a new statement that checks if the given variable is null, and if so, throws a configured exception with the\n\t * variable name as message.\n\t */\n\tpublic static JCStatement generateNullCheck(JavacTreeMaker maker, JavacNode variable, JavacNode source) {\n\t\treturn generateNullCheck(maker, (JCVariableDecl) variable.get(), source);\n\t}\n\t\n\t/**\n\t * Generates a new statement that checks if the given local is null, and if so, throws a configured exception with the\n\t * local variable name as message. \n\t */\n\tpublic static JCStatement generateNullCheck(JavacTreeMaker maker, JCExpression typeNode, Name varName, JavacNode source, String customMessage) {\n\t\tNullCheckExceptionType exceptionType = source.getAst().readConfiguration(ConfigurationKeys.NON_NULL_EXCEPTION_TYPE);\n\t\tif (exceptionType == null) exceptionType = NullCheckExceptionType.NULL_POINTER_EXCEPTION;\n\t\t\n\t\tif (typeNode != null && isPrimitive(typeNode)) return null;\n\t\tJCLiteral message = maker.Literal(exceptionType.toExceptionMessage(varName.toString(), customMessage));\n\t\t\n\t\tLombokImmutableList<String> method = exceptionType.getMethod();\n\t\tif (method != null) {\n\t\t\treturn maker.Exec(maker.Apply(List.<JCExpression>nil(), chainDots(source, method), List.of(maker.Ident(varName), message)));\n\t\t}\n\t\t\n\t\tif (exceptionType == NullCheckExceptionType.ASSERTION) {\n\t\t\treturn maker.Assert(maker.Binary(CTC_NOT_EQUAL, maker.Ident(varName), maker.Literal(CTC_BOT, null)), message);\n\t\t}\n\t\t\n\t\tJCExpression exType = genTypeRef(source, exceptionType.getExceptionType());\n\t\tJCExpression exception = maker.NewClass(null, List.<JCExpression>nil(), exType, List.<JCExpression>of(message), null);\n\t\tJCStatement throwStatement = maker.Throw(exception);\n\t\tJCBlock throwBlock = maker.Block(0, List.of(throwStatement));\n\t\treturn maker.If(maker.Binary(CTC_EQUAL, maker.Ident(varName), maker.Literal(CTC_BOT, null)), throwBlock, null);\n\t}\n\t\n\t/**\n\t * Generates a new statement that checks if the given variable is null, and if so, throws a configured exception with the\n\t * variable name as message. \n\t * \n\t * This is a special case method reserved for use when the provided declaration differs from the\n\t * variable's declaration, i.e. in a constructor or setter where the local parameter is named the same but with the prefix\n\t * stripped as a result of @Accessors.prefix.\n\t */\n\tpublic static JCStatement generateNullCheck(JavacTreeMaker maker, JCVariableDecl varDecl, JavacNode source) {\n\t\treturn generateNullCheck(maker, varDecl.vartype, varDecl.name, source, null);\n\t}\n\t\n\t/**\n\t * Given a list of field names and a node referring to a type, finds each name in the list that does not match a field within the type.\n\t */\n\tpublic static List<Integer> createListOfNonExistentFields(List<String> list, JavacNode type, boolean excludeStandard, boolean excludeTransient) {\n\t\tboolean[] matched = new boolean[list.size()];\n\t\t\n\t\tfor (JavacNode child : type.down()) {\n\t\t\tif (list.isEmpty()) break;\n\t\t\tif (child.getKind() != Kind.FIELD) continue;\n\t\t\tJCVariableDecl field = (JCVariableDecl)child.get();\n\t\t\tif (excludeStandard) {\n\t\t\t\tif ((field.mods.flags & Flags.STATIC) != 0) continue;\n\t\t\t\tif (field.name.toString().startsWith(\"$\")) continue;\n\t\t\t}\n\t\t\tif (excludeTransient && (field.mods.flags & Flags.TRANSIENT) != 0) continue;\n\t\t\t\n\t\t\tint idx = list.indexOf(child.getName());\n\t\t\tif (idx > -1) matched[idx] = true;\n\t\t}\n\t\t\n\t\tListBuffer<Integer> problematic = new ListBuffer<Integer>();\n\t\tfor (int i = 0 ; i < list.size() ; i++) {\n\t\t\tif (!matched[i]) problematic.append(i);\n\t\t}\n\t\t\n\t\treturn problematic.toList();\n\t}\n\t\n\tstatic List<JCAnnotation> unboxAndRemoveAnnotationParameter(JCAnnotation ast, String parameterName, String errorName, JavacNode annotationNode) {\n\t\tListBuffer<JCExpression> params = new ListBuffer<JCExpression>();\n\t\tListBuffer<JCAnnotation> result = new ListBuffer<JCAnnotation>();\n\t\t\n\t\touter:\n\t\tfor (JCExpression param : ast.args) {\n\t\t\tboolean allowRaw;\n\t\t\tString nameOfParam = \"value\";\n\t\t\tJCExpression valueOfParam = null;\n\t\t\tif (param instanceof JCAssign) {\n\t\t\t\tJCAssign assign = (JCAssign) param;\n\t\t\t\tif (assign.lhs instanceof JCIdent) {\n\t\t\t\t\tJCIdent ident = (JCIdent) assign.lhs;\n\t\t\t\t\tnameOfParam = ident.name.toString();\n\t\t\t\t}\n\t\t\t\tvalueOfParam = assign.rhs;\n\t\t\t}\n\t\t\t\n\t\t\t/* strip trailing underscores */ {\n\t\t\t\tint lastIdx;\n\t\t\t\tfor (lastIdx = nameOfParam.length() ; lastIdx > 0; lastIdx--) {\n\t\t\t\t\tif (nameOfParam.charAt(lastIdx - 1) != '_') break;\n\t\t\t\t}\n\t\t\t\tallowRaw = lastIdx < nameOfParam.length();\n\t\t\t\tnameOfParam = nameOfParam.substring(0, lastIdx);\n\t\t\t}\n\t\t\t\n\t\t\tif (!parameterName.equals(nameOfParam)) {\n\t\t\t\tparams.append(param);\n\t\t\t\tcontinue outer;\n\t\t\t}\n\t\t\t\n\t\t\tint endPos = Javac.getEndPosition(param.pos(), (JCCompilationUnit) annotationNode.top().get());\n\t\t\tannotationNode.getAst().removeFromDeferredDiagnostics(param.pos, endPos);\n\t\t\t\n\t\t\tif (valueOfParam instanceof JCAnnotation) {\n\t\t\t\tString dummyAnnotationName = ((JCAnnotation) valueOfParam).annotationType.toString();\n\t\t\t\tdummyAnnotationName = dummyAnnotationName.replace(\"_\", \"\").replace(\"$\", \"\").replace(\"x\", \"\").replace(\"X\", \"\");\n\t\t\t\tif (dummyAnnotationName.length() > 0) {\n\t\t\t\t\tif (allowRaw) {\n\t\t\t\t\t\tresult.append((JCAnnotation) valueOfParam);\n\t\t\t\t\t} else {\n\t\t\t\t\t\taddError(errorName, annotationNode);\n\t\t\t\t\t\tcontinue outer;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor (JCExpression expr : ((JCAnnotation) valueOfParam).args) {\n\t\t\t\t\t\tif (expr instanceof JCAssign && ((JCAssign) expr).lhs instanceof JCIdent) {\n\t\t\t\t\t\t\tJCIdent id = (JCIdent) ((JCAssign) expr).lhs;\n\t\t\t\t\t\t\tif (\"value\".equals(id.name.toString())) {\n\t\t\t\t\t\t\t\texpr = ((JCAssign) expr).rhs;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\taddError(errorName, annotationNode);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (expr instanceof JCAnnotation) {\n\t\t\t\t\t\t\tresult.append((JCAnnotation) expr);\n\t\t\t\t\t\t} else if (expr instanceof JCNewArray) {\n\t\t\t\t\t\t\tfor (JCExpression expr2 : ((JCNewArray) expr).elems) {\n\t\t\t\t\t\t\t\tif (expr2 instanceof JCAnnotation) {\n\t\t\t\t\t\t\t\t\tresult.append((JCAnnotation) expr2);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\taddError(errorName, annotationNode);\n\t\t\t\t\t\t\t\t\tcontinue outer;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\taddError(errorName, annotationNode);\n\t\t\t\t\t\t\tcontinue outer;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (valueOfParam instanceof JCNewArray) {\n\t\t\t\tJCNewArray arr = (JCNewArray) valueOfParam;\n\t\t\t\tif (arr.elems.isEmpty()) {\n\t\t\t\t\t// Just remove it, this is always fine.\n\t\t\t\t} else if (allowRaw) {\n\t\t\t\t\tfor (JCExpression jce : arr.elems) {\n\t\t\t\t\t\tif (jce instanceof JCAnnotation) result.append((JCAnnotation) jce);\n\t\t\t\t\t\telse addError(errorName, annotationNode);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\taddError(errorName, annotationNode);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\taddError(errorName, annotationNode);\n\t\t\t}\n\t\t}\n\t\tfor (JCAnnotation annotation : result) {\n\t\t\tclearTypes(annotation);\n\t\t}\n\t\tast.args = params.toList();\n\t\treturn result.toList();\n\t}\n\t\n\t/**\n\t * Removes all type information from the provided tree.\n\t */\n\tprivate static void clearTypes(JCTree tree) {\n\t\ttree.accept(new TreeScanner() {\n\t\t\t@Override public void scan(JCTree tree) {\n\t\t\t\tif (tree == null) return;\n\t\t\t\ttree.type = null;\n\t\t\t\tsuper.scan(tree);\n\t\t\t}\n\t\t\t@Override public void visitClassDef(JCClassDecl tree) {\n\t\t\t\ttree.sym = null;\n\t\t\t\tsuper.visitClassDef(tree);\n\t\t\t}\n\t\t\t@Override public void visitMethodDef(JCMethodDecl tree) {\n\t\t\t\ttree.sym = null;\n\t\t\t\tsuper.visitMethodDef(tree);\n\t\t\t}\n\t\t\t@Override public void visitVarDef(JCVariableDecl tree) {\n\t\t\t\ttree.sym = null;\n\t\t\t\tsuper.visitVarDef(tree);\n\t\t\t}\n\t\t\t@Override public void visitSelect(JCFieldAccess tree) {\n\t\t\t\ttree.sym = null;\n\t\t\t\tsuper.visitSelect(tree);\n\t\t\t}\n\t\t\t@Override public void visitIdent(JCIdent tree) {\n\t\t\t\ttree.sym = null;\n\t\t\t\tsuper.visitIdent(tree);\n\t\t\t}\n\t\t\t@Override public void visitAnnotation(JCAnnotation tree) {\n\t\t\t\tJCAnnotationReflect.setAttribute(tree, null);\n\t\t\t\tsuper.visitAnnotation(tree);\n\t\t\t}\n\t\t});\n\t}\n\t\n\tprivate static void addError(String errorName, JavacNode node) {\n\t\tif (node.getLatestJavaSpecSupported() < 8) {\n\t\t\tnode.addError(\"The correct format up to JDK7 is \" + errorName + \"=@__({@SomeAnnotation, @SomeOtherAnnotation}))\");\n\t\t} else {\n\t\t\tnode.addError(\"The correct format for JDK8+ is \" + errorName + \"_={@SomeAnnotation, @SomeOtherAnnotation})\");\n\t\t}\n\t}\n\t\n\tpublic static List<JCTypeParameter> copyTypeParams(JavacNode source, List<JCTypeParameter> params) {\n\t\tif (params == null || params.isEmpty()) return params;\n\t\tListBuffer<JCTypeParameter> out = new ListBuffer<JCTypeParameter>();\n\t\tJavacTreeMaker maker = source.getTreeMaker();\n\t\tfor (JCTypeParameter tp : params) {\n\t\t\tList<JCExpression> bounds = tp.bounds;\n\t\t\tif (bounds != null && !bounds.isEmpty()) {\n\t\t\t\tListBuffer<JCExpression> boundsCopy = new ListBuffer<JCExpression>();\n\t\t\t\tfor (JCExpression expr : tp.bounds) {\n\t\t\t\t\tboundsCopy.append(cloneType(maker, expr, source));\n\t\t\t\t}\n\t\t\t\tbounds = boundsCopy.toList();\n\t\t\t}\n\t\t\tout.append(maker.TypeParameter(tp.name, bounds));\n\t\t}\n\t\treturn out.toList();\n\t}\n\t\n\tpublic static List<JCAnnotation> getTypeUseAnnotations(JCExpression from) {\n\t\tif (!JCAnnotatedTypeReflect.is(from)) return List.nil();\n\t\treturn JCAnnotatedTypeReflect.getAnnotations(from);\n\t}\n\t\n\tpublic static JCExpression removeTypeUseAnnotations(JCExpression from) {\n\t\tif (!JCAnnotatedTypeReflect.is(from)) return from;\n\t\treturn JCAnnotatedTypeReflect.getUnderlyingType(from);\n\t}\n\t\n\tpublic static JCExpression namePlusTypeParamsToTypeReference(JavacTreeMaker maker, JavacNode type, List<JCTypeParameter> params) {\n\t\tJCClassDecl td = (JCClassDecl) type.get();\n\t\tboolean instance = !type.isStatic();\n\t\treturn namePlusTypeParamsToTypeReference(maker, type.up(), td.name, instance, params, List.<JCAnnotation>nil());\n\t}\n\t\n\tpublic static JCExpression namePlusTypeParamsToTypeReference(JavacTreeMaker maker, JavacNode type, List<JCTypeParameter> params, List<JCAnnotation> annotations) {\n\t\tJCClassDecl td = (JCClassDecl) type.get();\n\t\tboolean instance = !type.isStatic();\n\t\treturn namePlusTypeParamsToTypeReference(maker, type.up(), td.name, instance, params, annotations);\n\t}\n\t\n\tpublic static JCExpression namePlusTypeParamsToTypeReference(JavacTreeMaker maker, JavacNode parentType, Name typeName, boolean instance, List<JCTypeParameter> params) {\n\t\treturn namePlusTypeParamsToTypeReference(maker, parentType, typeName, instance, params, List.<JCAnnotation>nil());\n\t}\n\t\n\tpublic static JCExpression namePlusTypeParamsToTypeReference(JavacTreeMaker maker, JavacNode parentType, Name typeName, boolean instance, List<JCTypeParameter> params, List<JCAnnotation> annotations) {\n\t\tJCExpression r = null;\n\t\tif (parentType != null && parentType.getKind() == Kind.TYPE && !parentType.getName().isEmpty()) {\n\t\t\tJCClassDecl td = (JCClassDecl) parentType.get();\n\t\t\tboolean outerInstance = instance && !parentType.isStatic();\n\t\t\tList<JCTypeParameter> outerParams = instance ? td.typarams : List.<JCTypeParameter>nil();\n\t\t\tr = namePlusTypeParamsToTypeReference(maker, parentType.up(), td.name, outerInstance, outerParams, List.<JCAnnotation>nil());\n\t\t}\n\t\t\n\t\tr = r == null ? maker.Ident(typeName) : maker.Select(r, typeName);\n\t\tif (!annotations.isEmpty()) r = JCAnnotatedTypeReflect.create(annotations, r);\n\t\tif (!params.isEmpty()) r = maker.TypeApply(r, typeParameterNames(maker, params));\n\t\treturn r;\n\t}\n\t\n\tpublic static List<JCExpression> typeParameterNames(JavacTreeMaker maker, List<JCTypeParameter> params) {\n\t\tListBuffer<JCExpression> typeArgs = new ListBuffer<JCExpression>();\n\t\tfor (JCTypeParameter param : params) {\n\t\t\ttypeArgs.append(maker.Ident(param.name));\n\t\t}\n\t\treturn typeArgs.toList();\n\t}\n\t\n\tpublic static void sanityCheckForMethodGeneratingAnnotationsOnBuilderClass(JavacNode typeNode, JavacNode errorNode) {\n\t\tList<String> disallowed = List.nil();\n\t\tfor (JavacNode child : typeNode.down()) {\n\t\t\tfor (String annType : INVALID_ON_BUILDERS) {\n\t\t\t\tif (annotationTypeMatches(annType, child)) {\n\t\t\t\t\tint lastIndex = annType.lastIndexOf('.');\n\t\t\t\t\tdisallowed = disallowed.append(lastIndex == -1 ? annType : annType.substring(lastIndex + 1));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tint size = disallowed.size();\n\t\tif (size == 0) return;\n\t\tif (size == 1) {\n\t\t\terrorNode.addError(\"@\" + disallowed.head + \" is not allowed on builder classes.\");\n\t\t\treturn;\n\t\t}\n\t\tStringBuilder out = new StringBuilder();\n\t\tfor (String a : disallowed) out.append(\"@\").append(a).append(\", \");\n\t\tout.setLength(out.length() - 2);\n\t\terrorNode.addError(out.append(\" are not allowed on builder classes.\").toString());\n\t}\n\t\n\tstatic List<JCAnnotation> copyAnnotations(List<? extends JCExpression> in, JavacTreeMaker maker) {\n\t\tListBuffer<JCAnnotation> out = new ListBuffer<JCAnnotation>();\n\t\tfor (JCExpression expr : in) {\n\t\t\tif (!(expr instanceof JCAnnotation)) continue;\n\t\t\tout.append(copyExpression((JCAnnotation) expr, maker));\n\t\t}\n\t\treturn out.toList();\n\t}\n\t\n\t@SuppressWarnings(\"unchecked\")\n\tstatic <T extends JCExpression> T copyExpression(T expression, JavacTreeMaker maker) {\n\t\tTreeVisitor<JCTree, Void> visitor = new TreeCopier<Void>(maker.getUnderlyingTreeMaker());\n\t\treturn (T) expression.accept(visitor, null);\n\t}\n\t\n\tstatic List<JCAnnotation> mergeAnnotations(List<JCAnnotation> a, List<JCAnnotation> b) {\n\t\tif (a == null || a.isEmpty()) return b;\n\t\tif (b == null || b.isEmpty()) return a;\n\t\tListBuffer<JCAnnotation> out = new ListBuffer<JCAnnotation>();\n\t\tfor (JCAnnotation ann : a) out.append(ann);\n\t\tfor (JCAnnotation ann : b) out.append(ann);\n\t\treturn out.toList();\n\t}\n\t\n\t/**\n\t * Returns {@code true} if the provided node is an actual class and not some other type declaration (so, not an annotation definition, interface, enum, or record).\n\t */\n\tpublic static boolean isClass(JavacNode typeNode) {\n\t\treturn isClassAndDoesNotHaveFlags(typeNode, Flags.INTERFACE | Flags.ENUM | Flags.ANNOTATION | RECORD);\n\t}\n\t\n\t/**\n\t * Returns {@code true} if the provided node is an actual class or enum and not some other type declaration (so, not an annotation definition, interface, or record).\n\t */\n\tpublic static boolean isClassOrEnum(JavacNode typeNode) {\n\t\treturn isClassAndDoesNotHaveFlags(typeNode, Flags.INTERFACE | Flags.ANNOTATION | RECORD);\n\t}\n\t\n\t/**\n\t * Returns {@code true} if the provided node is an actual class an enum or an interface and not some other type declaration (so, not an annotation definition, or record).\n\t */\n\tpublic static boolean isClassEnumOrInterface(JavacNode typeNode) {\n\t\treturn isClassAndDoesNotHaveFlags(typeNode, Flags.ANNOTATION | RECORD);\n\t}\n\t\n\t/**\n\t * Returns {@code true} if the provided node is an actual class, an enum, an interface or a record and not some other type declaration (so, not an annotation definition).\n\t */\n\tpublic static boolean isClassEnumInterfaceOrRecord(JavacNode typeNode) {\n\t\treturn isClassAndDoesNotHaveFlags(typeNode, Flags.ANNOTATION);\n\t}\n\t\n\t/**\n\t * Returns {@code true} if the provided node is an actual class, an enum or a record and not some other type declaration (so, not an annotation definition or interface).\n\t */\n\tpublic static boolean isClassEnumOrRecord(JavacNode typeNode) {\n\t\treturn isClassAndDoesNotHaveFlags(typeNode, Flags.INTERFACE | Flags.ANNOTATION);\n\t}\n\t\n\t/**\n\t * Returns {@code true} if the provided node is a record declaration (so, not an annotation definition, interface, enum, or plain class).\n\t */\n\tpublic static boolean isRecord(JavacNode typeNode) {\n\t\treturn typeNode.getKind() == Kind.TYPE && (((JCClassDecl) typeNode.get()).mods.flags & RECORD) != 0;\n\t}\n\t\n\tpublic static boolean isClassAndDoesNotHaveFlags(JavacNode typeNode, long flags) {\n\t\tJCClassDecl typeDecl = null;\n\t\tif (typeNode.get() instanceof JCClassDecl) typeDecl = (JCClassDecl) typeNode.get();\n\t\telse return false;\n\t\t\n\t\tlong typeDeclflags = typeDecl == null ? 0 : typeDecl.mods.flags;\n\t\treturn (typeDeclflags & flags) == 0;\n\t}\n\t\n\t/**\n\t * Returns {@code true} if the provided node supports static methods and types (top level or static class)\n\t */\n\tpublic static boolean isStaticAllowed(JavacNode typeNode) {\n\t\treturn typeNode.isStatic() || typeNode.up() == null || typeNode.up().getKind() == Kind.COMPILATION_UNIT || isRecord(typeNode);\n\t}\n\t\n\tpublic static JavacNode upToTypeNode(JavacNode node) {\n\t\tif (node == null) throw new NullPointerException(\"node\");\n\t\twhile ((node != null) && !(node.get() instanceof JCClassDecl)) node = node.up();\n\t\t\n\t\treturn node;\n\t}\n\t\n\tpublic static List<JCExpression> cloneTypes(JavacTreeMaker maker, List<JCExpression> in, JavacNode source) {\n\t\tif (in.isEmpty()) return List.nil();\n\t\tif (in.size() == 1) return List.of(cloneType(maker, in.get(0), source));\n\t\tListBuffer<JCExpression> lb = new ListBuffer<JCExpression>();\n\t\tfor (JCExpression expr : in) lb.append(cloneType(maker, expr, source));\n\t\treturn lb.toList();\n\t}\n\t\n\t/**\n\t * Creates a full clone of a given javac AST type node. Every part is cloned (every identifier, every select, every wildcard, every type apply, every type_use annotation).\n\t * \n\t * If there's any node in the tree that we don't know how to clone, that part isn't cloned. However, we wouldn't know what could possibly show up that we\n\t * can't currently clone; that's just a safeguard.\n\t * \n\t * This should be used if the type looks the same in the code, but resolves differently. For example, a static method that has some generics in it named after\n\t * the class's own parameter, but as its a static method, the static method's notion of {@code T} is different from the class notion of {@code T}. If you're duplicating\n\t * a type used in the class context, you need to use this method.\n\t */\n\tpublic static JCExpression cloneType(JavacTreeMaker maker, JCExpression in, JavacNode source) {\n\t\tJCExpression out = cloneType0(maker, in);\n\t\tif (out != null) recursiveSetGeneratedBy(out, source);\n\t\treturn out;\n\t}\n\t\n\tprivate static JCExpression cloneType0(JavacTreeMaker maker, JCTree in) {\n\t\tif (in == null) return null;\n\t\t\n\t\tif (in instanceof JCPrimitiveTypeTree) {\n\t\t\treturn maker.TypeIdent(TypeTag.typeTag(in));\n\t\t}\n\t\t\n\t\tif (in instanceof JCIdent) {\n\t\t\treturn maker.Ident(((JCIdent) in).name);\n\t\t}\n\t\t\n\t\tif (in instanceof JCFieldAccess) {\n\t\t\tJCFieldAccess fa = (JCFieldAccess) in;\n\t\t\treturn maker.Select(cloneType0(maker, fa.selected), fa.name);\n\t\t}\n\t\t\n\t\tif (in instanceof JCArrayTypeTree) {\n\t\t\tJCArrayTypeTree att = (JCArrayTypeTree) in;\n\t\t\treturn maker.TypeArray(cloneType0(maker, att.elemtype));\n\t\t}\n\t\t\n\t\tif (in instanceof JCTypeApply) {\n\t\t\tJCTypeApply ta = (JCTypeApply) in;\n\t\t\tListBuffer<JCExpression> lb = new ListBuffer<JCExpression>();\n\t\t\tfor (JCExpression typeArg : ta.arguments) {\n\t\t\t\tlb.append(cloneType0(maker, typeArg));\n\t\t\t}\n\t\t\treturn maker.TypeApply(cloneType0(maker, ta.clazz), lb.toList());\n\t\t}\n\t\t\n\t\tif (in instanceof JCWildcard) {\n\t\t\tJCWildcard w = (JCWildcard) in;\n\t\t\tJCExpression newInner = cloneType0(maker, w.inner);\n\t\t\tTypeBoundKind newKind;\n\t\t\tswitch (w.getKind()) {\n\t\t\tcase SUPER_WILDCARD:\n\t\t\t\tnewKind = maker.TypeBoundKind(BoundKind.SUPER);\n\t\t\t\tbreak;\n\t\t\tcase EXTENDS_WILDCARD:\n\t\t\t\tnewKind = maker.TypeBoundKind(BoundKind.EXTENDS);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\tcase UNBOUNDED_WILDCARD:\n\t\t\t\tnewKind = maker.TypeBoundKind(BoundKind.UNBOUND);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\treturn maker.Wildcard(newKind, newInner);\n\t\t}\n\t\t\n\t\tif (JCAnnotatedTypeReflect.is(in)) {\n\t\t\tJCExpression underlyingType = cloneType0(maker, JCAnnotatedTypeReflect.getUnderlyingType(in));\n\t\t\tList<JCAnnotation> anns = copyAnnotations(JCAnnotatedTypeReflect.getAnnotations(in), maker);\n\t\t\treturn JCAnnotatedTypeReflect.create(anns, underlyingType);\n\t\t}\n\t\t\n\t\t// This is somewhat unsafe, but it's better than outright throwing an exception here. Returning null will just cause an exception down the pipeline.\n\t\treturn (JCExpression) in;\n\t}\n\t\n\tpublic static enum CopyJavadoc {\n\t\tVERBATIM {\n\t\t\t@Override public String apply(final JCCompilationUnit cu, final JavacNode node) {\n\t\t\t\treturn Javac.getDocComment(cu, node.get());\n\t\t\t}\n\t\t},\n\t\tGETTER {\n\t\t\t@Override public String apply(final JCCompilationUnit cu, final JavacNode node) {\n\t\t\t\tfinal JCTree n = node.get();\n\t\t\t\tString javadoc = Javac.getDocComment(cu, n);\n\t\t\t\t// step 1: Check if there is a 'GETTER' section. If yes, that becomes the new method's javadoc.\n\t\t\t\tString out = getJavadocSection(javadoc, \"GETTER\");\n\t\t\t\tfinal boolean sectionBased = out != null;\n\t\t\t\tif (!sectionBased) {\n\t\t\t\t\tout = stripLinesWithTagFromJavadoc(stripSectionsFromJavadoc(javadoc), JavadocTag.PARAM);\n\t\t\t\t}\n\t\t\t\tnode.getAst().cleanupTask(\"javadocfilter-getter\", n, new CleanupTask() {\n\t\t\t\t\t@Override public void cleanup() {\n\t\t\t\t\t\tString javadoc = Javac.getDocComment(cu, n);\n\t\t\t\t\t\tif (javadoc == null || javadoc.isEmpty()) return;\n\t\t\t\t\t\tjavadoc = stripSectionsFromJavadoc(javadoc);\n\t\t\t\t\t\tif (!sectionBased) {\n\t\t\t\t\t\t\tjavadoc = stripLinesWithTagFromJavadoc(stripSectionsFromJavadoc(javadoc), JavadocTag.RETURN);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tJavac.setDocComment(cu, n, javadoc);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn out;\n\t\t\t}\n\t\t},\n\t\tSETTER {\n\t\t\t@Override public String apply(final JCCompilationUnit cu, final JavacNode node) {\n\t\t\t\treturn applySetter(cu, node, \"SETTER\");\n\t\t\t}\n\t\t},\n\t\tWITH {\n\t\t\t@Override public String apply(final JCCompilationUnit cu, final JavacNode node) {\n\t\t\t\treturn addReturnsUpdatedSelfIfNeeded(applySetter(cu, node, \"WITH|WITHER\"));\n\t\t\t}\n\t\t},\n\t\tWITH_BY {\n\t\t\t@Override public String apply(final JCCompilationUnit cu, final JavacNode node) {\n\t\t\t\treturn applySetter(cu, node, \"WITHBY|WITH_BY\");\n\t\t\t}\n\t\t};\n\t\t\n\t\tpublic abstract String apply(final JCCompilationUnit cu, final JavacNode node);\n\t\t\n\t\tprivate static String applySetter(final JCCompilationUnit cu, JavacNode node, String sectionName) {\n\t\t\tfinal JCTree n = node.get();\n\t\t\tString javadoc = Javac.getDocComment(cu, n);\n\t\t\t// step 1: Check if there is a 'SETTER' section. If yes, that becomes the new method's javadoc.\n\t\t\tString out = getJavadocSection(javadoc, sectionName);\n\t\t\tfinal boolean sectionBased = out != null;\n\t\t\tif (!sectionBased) {\n\t\t\t\tout = stripLinesWithTagFromJavadoc(stripSectionsFromJavadoc(javadoc), JavadocTag.RETURN);\n\t\t\t}\n\t\t\tnode.getAst().cleanupTask(\"javadocfilter-setter\", n, new CleanupTask() {\n\t\t\t\t@Override public void cleanup() {\n\t\t\t\t\tString javadoc = Javac.getDocComment(cu, n);\n\t\t\t\t\tif (javadoc == null || javadoc.isEmpty()) return;\n\t\t\t\t\tjavadoc = stripSectionsFromJavadoc(javadoc);\n\t\t\t\t\tif (!sectionBased) {\n\t\t\t\t\t\tjavadoc = stripLinesWithTagFromJavadoc(stripSectionsFromJavadoc(javadoc), JavadocTag.PARAM);\n\t\t\t\t\t}\n\t\t\t\t\tJavac.setDocComment(cu, n, javadoc);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn shouldReturnThis(node, JavacHandlerUtil.getAccessorsForField(node)) ? addReturnsThisIfNeeded(out) : out;\n\t\t}\n\t}\n\t\n\tpublic static void copyJavadoc(JavacNode from, JCTree to, CopyJavadoc copyMode) {\n\t\tcopyJavadoc(from, to, copyMode, false);\n\t}\n\t\n\t/**\n\t * Copies javadoc on one node to the other.\n\t * \n\t * in 'GETTER' copyMode, first a 'GETTER' segment is searched for. If it exists, that will become the javadoc for the 'to' node, and this section is\n\t * stripped out of the 'from' node. If no 'GETTER' segment is found, then the entire javadoc is taken minus any {@code @param} lines and other sections.\n\t * any {@code @return} lines are stripped from 'from'.\n\t * \n\t * in 'SETTER' mode, stripping works similarly to 'GETTER' mode, except {@code param} are copied and stripped from the original and {@code @return} are skipped.\n\t */\n\tpublic static void copyJavadoc(JavacNode from, JCTree to, CopyJavadoc copyMode, boolean forceAddReturn) {\n\t\tif (copyMode == null) copyMode = CopyJavadoc.VERBATIM;\n\t\ttry {\n\t\t\tJCCompilationUnit cu = ((JCCompilationUnit) from.top().get());\n\t\t\tString newJavadoc = copyMode.apply(cu, from);\n\t\t\tif (forceAddReturn) {\n\t\t\t\tnewJavadoc = addReturnsThisIfNeeded(newJavadoc);\n\t\t\t}\n\t\t\tJavac.setDocComment(cu, to, newJavadoc);\n\t\t} catch (Exception ignore) {}\n\t}\n\t\n\tpublic static void copyJavadocFromParam(JavacNode from, JCMethodDecl to, String paramName) {\n\t\ttry {\n\t\t\tJCCompilationUnit cu = ((JCCompilationUnit) from.top().get());\n\t\t\tString methodComment = Javac.getDocComment(cu, from.get());\n\t\t\tString newJavadoc = addReturnsThisIfNeeded(getParamJavadoc(methodComment, paramName));\n\t\t\tJavac.setDocComment(cu, to, newJavadoc);\n\t\t} catch (Exception ignore) {}\n\t}\n\t\n\tpublic static boolean isDirectDescendantOfObject(JavacNode typeNode) {\n\t\tif (!(typeNode.get() instanceof JCClassDecl)) throw new IllegalArgumentException(\"not a type node\");\n\t\tJCTree extending = Javac.getExtendsClause((JCClassDecl) typeNode.get());\n\t\tif (extending == null) return true;\n\t\tString p = extending.toString();\n\t\treturn p.equals(\"Object\") || p.equals(\"java.lang.Object\");\n\t}\n\t\n\tpublic static void createRelevantNullableAnnotation(JavacNode typeNode, JCMethodDecl mth) {\n\t\tNullAnnotationLibrary lib = typeNode.getAst().readConfiguration(ConfigurationKeys.ADD_NULL_ANNOTATIONS);\n\t\tif (lib == null) return;\n\t\tapplyAnnotationToMethodDecl(typeNode, mth, lib.getNullableAnnotation(), lib.isTypeUse());\n\t}\n\t\n\tpublic static void createRelevantNonNullAnnotation(JavacNode typeNode, JCMethodDecl mth) {\n\t\tNullAnnotationLibrary lib = typeNode.getAst().readConfiguration(ConfigurationKeys.ADD_NULL_ANNOTATIONS);\n\t\tif (lib == null) return;\n\t\tapplyAnnotationToMethodDecl(typeNode, mth, lib.getNonNullAnnotation(), lib.isTypeUse());\n\t}\n\t\n\tpublic static void createRelevantNonNullAnnotation(JavacNode typeNode, JCVariableDecl arg) {\n\t\tNullAnnotationLibrary lib = typeNode.getAst().readConfiguration(ConfigurationKeys.ADD_NULL_ANNOTATIONS);\n\t\tif (lib == null) return;\n\t\t\n\t\tapplyAnnotationToVarDecl(typeNode, arg, lib.getNonNullAnnotation(), lib.isTypeUse());\n\t}\n\t\n\tpublic static void createRelevantNullableAnnotation(JavacNode typeNode, JCVariableDecl arg) {\n\t\tNullAnnotationLibrary lib = typeNode.getAst().readConfiguration(ConfigurationKeys.ADD_NULL_ANNOTATIONS);\n\t\tif (lib == null) return;\n\t\t\n\t\tapplyAnnotationToVarDecl(typeNode, arg, lib.getNullableAnnotation(), lib.isTypeUse());\n\t}\n\t\n\tprivate static void applyAnnotationToMethodDecl(JavacNode typeNode, JCMethodDecl mth, String annType, boolean typeUse) {\n\t\tif (annType == null) return;\n\t\tJavacTreeMaker maker = typeNode.getTreeMaker();\n\t\t\n\t\tJCAnnotation m = maker.Annotation(genTypeRef(typeNode, annType), List.<JCExpression>nil());\n\t\tif (typeUse) {\n\t\t\tJCExpression resType = mth.restype;\n\t\t\tif (resType instanceof JCTypeApply) {\n\t\t\t\tJCTypeApply ta = (JCTypeApply) resType;\n\t\t\t\tif (ta.clazz instanceof JCFieldAccess) {\n\t\t\t\t\tmth.restype = maker.TypeApply(maker.AnnotatedType(List.of(m), ta.clazz), ta.arguments);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tresType = ta.clazz;\n\t\t\t}\n\t\t\t\n\t\t\tif (resType instanceof JCFieldAccess || resType instanceof JCArrayTypeTree) {\n\t\t\t\tmth.restype = maker.AnnotatedType(List.of(m), resType);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (JCAnnotatedTypeReflect.is(resType)) {\n\t\t\t\tList<JCAnnotation> annotations = JCAnnotatedTypeReflect.getAnnotations(resType);\n\t\t\t\tJCAnnotatedTypeReflect.setAnnotations(resType, annotations.prepend(m));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (resType instanceof JCPrimitiveTypeTree || resType instanceof JCIdent) {\n\t\t\t\tmth.mods.annotations = mth.mods.annotations == null ? List.of(m) : mth.mods.annotations.prepend(m);\n\t\t\t}\n\t\t} else {\n\t\t\tmth.mods.annotations = mth.mods.annotations == null ? List.of(m) : mth.mods.annotations.prepend(m);\n\t\t}\n\t}\n\t\n\tprivate static void applyAnnotationToVarDecl(JavacNode typeNode, JCVariableDecl arg, String annType, boolean typeUse) {\n\t\tif (annType == null) return;\n\t\tJavacTreeMaker maker = typeNode.getTreeMaker();\n\t\t\n\t\tJCAnnotation m = maker.Annotation(genTypeRef(typeNode, annType), List.<JCExpression>nil());\n\t\tif (typeUse) {\n\t\t\tJCExpression varType = arg.vartype;\n\t\t\tJCTypeApply ta = null;\n\t\t\tif (varType instanceof JCTypeApply) {\n\t\t\t\tta = (JCTypeApply) varType;\n\t\t\t\tvarType = ta.clazz;\n\t\t\t}\n\t\t\t\n\t\t\tif (varType instanceof JCFieldAccess || varType instanceof JCArrayTypeTree) {\n\t\t\t\tvarType = maker.AnnotatedType(List.of(m), varType);\n\t\t\t\tif (ta != null) ta.clazz = varType;\n\t\t\t\telse arg.vartype = varType;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (JCAnnotatedTypeReflect.is(varType)) {\n\t\t\t\tList<JCAnnotation> annotations = JCAnnotatedTypeReflect.getAnnotations(varType);\n\t\t\t\tJCAnnotatedTypeReflect.setAnnotations(varType, annotations.prepend(m));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (varType instanceof JCPrimitiveTypeTree || varType instanceof JCIdent) {\n\t\t\t\targ.mods.annotations = arg.mods.annotations == null ? List.of(m) : arg.mods.annotations.prepend(m);\n\t\t\t}\n\t\t} else {\n\t\t\targ.mods.annotations = arg.mods.annotations == null ? List.of(m) : arg.mods.annotations.prepend(m);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/JavacResolver.java",
    "content": "/*\n * Copyright (C) 2012 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacResolution;\n\nimport com.sun.tools.javac.code.Type;\nimport com.sun.tools.javac.tree.JCTree.JCBlock;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\n\npublic enum JavacResolver {\n\tCLASS {\n\t\t@Override\n\t\tpublic Type resolveMember(JavacNode node, JCExpression expr) {\n\t\t\tType type = expr.type;\n\t\t\tif (type == null) {\n\t\t\t\ttry {\n\t\t\t\t\tnew JavacResolution(node.getContext()).resolveClassMember(node);\n\t\t\t\t\ttype = expr.type;\n\t\t\t\t} catch (Exception ignore) {\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn type;\n\t\t}\n\t},\n\tMETHOD {\n\t\tpublic Type resolveMember(JavacNode node, JCExpression expr) {\n\t\t\tType type = expr.type;\n\t\t\tif (type == null) {\n\t\t\t\ttry {\n\t\t\t\t\tJCExpression resolvedExpression = ((JCExpression) new JavacResolution(node.getContext()).resolveMethodMember(node).get(expr));\n\t\t\t\t\tif (resolvedExpression != null) type = resolvedExpression.type;\n\t\t\t\t} catch (Exception ignore) {\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn type;\n\t\t}\n\t},\n\tCLASS_AND_METHOD {\n\t\t@Override\n\t\tpublic Type resolveMember(JavacNode node, JCExpression expr) {\n\t\t\tType type = METHOD.resolveMember(node, expr);\n\t\t\tif (type == null) {\n\t\t\t\tJavacNode classNode = node;\n\t\t\t\twhile (classNode != null && noneOf(classNode.get(), JCBlock.class, JCMethodDecl.class, JCVariableDecl.class)) {\n\t\t\t\t\tclassNode = classNode.up();\n\t\t\t\t}\n\t\t\t\tif (classNode != null) {\n\t\t\t\t\ttype = CLASS.resolveMember(classNode, expr);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn type;\n\t\t}\n\t\t\n\t\tprivate boolean noneOf(Object o, Class<?>... clazzes) {\n\t\t\tfor (Class<?> clazz : clazzes) {\n\t\t\t\tif (clazz.isInstance(o)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t};\n\t\n\t\n\n\tpublic abstract Type resolveMember(final JavacNode node, final JCExpression expr);\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/JavacSingularsRecipes.java",
    "content": "/*\n * Copyright (C) 2015-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers;\n\nimport static lombok.javac.Javac.*;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport java.io.IOException;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport com.sun.source.tree.Tree.Kind;\nimport com.sun.tools.javac.code.BoundKind;\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCBlock;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCModifiers;\nimport com.sun.tools.javac.tree.JCTree.JCStatement;\nimport com.sun.tools.javac.tree.JCTree.JCTypeParameter;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.tree.JCTree.JCWildcard;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.ListBuffer;\nimport com.sun.tools.javac.util.Name;\n\nimport lombok.AccessLevel;\nimport lombok.ConfigurationKeys;\nimport lombok.core.LombokImmutableList;\nimport lombok.core.SpiLoadUtil;\nimport lombok.core.TypeLibrary;\nimport lombok.core.configuration.CheckerFrameworkVersion;\nimport lombok.core.handlers.HandlerUtil;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacTreeMaker;\nimport lombok.javac.handlers.HandleBuilder.BuilderJob;\n\npublic class JavacSingularsRecipes {\n\tpublic interface ExpressionMaker {\n\t\tJCExpression make();\n\t}\n\t\n\tpublic interface StatementMaker {\n\t\tJCStatement make();\n\t}\n\t\n\tprivate static final JavacSingularsRecipes INSTANCE = new JavacSingularsRecipes();\n\tprivate final Map<String, JavacSingularizer> singularizers = new HashMap<String, JavacSingularizer>();\n\tprivate final TypeLibrary singularizableTypes = new TypeLibrary();\n\t\n\tprivate JavacSingularsRecipes() {\n\t\ttry {\n\t\t\tloadAll(singularizableTypes, singularizers);\n\t\t\tsingularizableTypes.lock();\n\t\t} catch (IOException e) {\n\t\t\tSystem.err.println(\"Lombok's @Singularizable feature is broken due to misconfigured SPI files: \" + e);\n\t\t}\n\t}\n\t\n\tprivate static void loadAll(TypeLibrary library, Map<String, JavacSingularizer> map) throws IOException {\n\t\tfor (JavacSingularizer handler : SpiLoadUtil.findServices(JavacSingularizer.class, JavacSingularizer.class.getClassLoader())) {\n\t\t\tfor (String type : handler.getSupportedTypes()) {\n\t\t\t\tJavacSingularizer existingSingularizer = map.get(type);\n\t\t\t\tif (existingSingularizer != null) {\n\t\t\t\t\tJavacSingularizer toKeep = existingSingularizer.getClass().getName().compareTo(handler.getClass().getName()) > 0 ? handler : existingSingularizer;\n\t\t\t\t\tSystem.err.println(\"Multiple singularizers found for type \" + type + \"; the alphabetically first class is used: \" + toKeep.getClass().getName());\n\t\t\t\t\tmap.put(type, toKeep);\n\t\t\t\t} else {\n\t\t\t\t\tmap.put(type, handler);\n\t\t\t\t\tlibrary.addType(type);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic static JavacSingularsRecipes get() {\n\t\treturn INSTANCE;\n\t}\n\t\n\tpublic String toQualified(String typeReference) {\n\t\tjava.util.List<String> q = singularizableTypes.toQualifieds(typeReference);\n\t\tif (q.isEmpty()) return null;\n\t\treturn q.get(0);\n\t}\n\t\n\tpublic JavacSingularizer getSingularizer(String fqn, JavacNode node) {\n\t\tfinal JavacSingularizer singularizer = singularizers.get(fqn);\n\t\tfinal boolean useGuavaInstead = Boolean.TRUE.equals(node.getAst().readConfiguration(ConfigurationKeys.SINGULAR_USE_GUAVA));\n\t\treturn useGuavaInstead ? singularizer.getGuavaInstead(node) : singularizer;\n\t}\n\t\n\tpublic static final class SingularData {\n\t\tprivate final JavacNode annotation;\n\t\tprivate final Name singularName;\n\t\tprivate final Name pluralName;\n\t\tprivate final List<JCExpression> typeArgs;\n\t\tprivate final String targetFqn;\n\t\tprivate final JavacSingularizer singularizer;\n\t\tprivate final String setterPrefix;\n\t\tprivate final boolean ignoreNullCollections;\n\t\t\n\t\tpublic SingularData(JavacNode annotation, Name singularName, Name pluralName, List<JCExpression> typeArgs, String targetFqn, JavacSingularizer singularizer, boolean ignoreNullCollections) {\n\t\t\tthis(annotation, singularName, pluralName, typeArgs, targetFqn, singularizer, ignoreNullCollections, \"\");\n\t\t}\n\t\t\n\t\tpublic SingularData(JavacNode annotation, Name singularName, Name pluralName, List<JCExpression> typeArgs, String targetFqn, JavacSingularizer singularizer, boolean ignoreNullCollections, String setterPrefix) {\n\t\t\tthis.annotation = annotation;\n\t\t\tthis.singularName = singularName;\n\t\t\tthis.pluralName = pluralName;\n\t\t\tthis.typeArgs = typeArgs;\n\t\t\tthis.targetFqn = targetFqn;\n\t\t\tthis.singularizer = singularizer;\n\t\t\tthis.setterPrefix = setterPrefix;\n\t\t\tthis.ignoreNullCollections = ignoreNullCollections;\n\t\t}\n\t\t\n\t\tpublic JavacNode getAnnotation() {\n\t\t\treturn annotation;\n\t\t}\n\t\t\n\t\tpublic Name getSingularName() {\n\t\t\treturn singularName;\n\t\t}\n\t\t\n\t\tpublic Name getPluralName() {\n\t\t\treturn pluralName;\n\t\t}\n\t\t\n\t\tpublic String getSetterPrefix() {\n\t\t\treturn setterPrefix;\n\t\t}\n\t\t\n\t\tpublic List<JCExpression> getTypeArgs() {\n\t\t\treturn typeArgs;\n\t\t}\n\t\t\n\t\tpublic String getTargetFqn() {\n\t\t\treturn targetFqn;\n\t\t}\n\t\t\n\t\tpublic JavacSingularizer getSingularizer() {\n\t\t\treturn singularizer;\n\t\t}\n\t\t\n\t\tpublic boolean isIgnoreNullCollections() {\n\t\t\treturn ignoreNullCollections;\n\t\t}\n\t\t\n\t\tpublic String getTargetSimpleType() {\n\t\t\tint idx = targetFqn.lastIndexOf(\".\");\n\t\t\treturn idx == -1 ? targetFqn : targetFqn.substring(idx + 1);\n\t\t}\n\t}\n\t\n\tpublic static abstract class JavacSingularizer {\n\t\tpublic abstract LombokImmutableList<String> getSupportedTypes();\n\t\t\n\t\tprotected JavacSingularizer getGuavaInstead(JavacNode node) {\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\tprotected JCModifiers makeMods(JavacTreeMaker maker, JavacNode node, boolean deprecate, AccessLevel access, List<JCAnnotation> methodAnnotations) {\n\t\t\tJCAnnotation deprecateAnn = deprecate ? maker.Annotation(genJavaLangTypeRef(node, \"Deprecated\"), List.<JCExpression>nil()) : null;\n\t\t\t\n\t\t\tList<JCAnnotation> annsOnMethod = (deprecateAnn != null) ? List.of(deprecateAnn) : List.<JCAnnotation>nil();\n\t\t\tannsOnMethod = mergeAnnotations(annsOnMethod,methodAnnotations);\n\t\t\treturn maker.Modifiers(toJavacModifier(access), annsOnMethod);\n\t\t}\n\t\t\n\t\t/** Checks if any of the to-be-generated nodes (fields, methods) already exist. If so, errors on these (singulars don't support manually writing some of it, and returns true). */\n\t\tpublic boolean checkForAlreadyExistingNodesAndGenerateError(JavacNode builderType, SingularData data) {\n\t\t\tfor (JavacNode child : builderType.down()) {\n\t\t\t\tswitch (child.getKind()) {\n\t\t\t\tcase FIELD: {\n\t\t\t\t\tJCVariableDecl field = (JCVariableDecl) child.get();\n\t\t\t\t\tName name = field.name;\n\t\t\t\t\tif (name == null) break;\n\t\t\t\t\tif (getGeneratedBy(field) != null) continue;\n\t\t\t\t\tfor (Name fieldToBeGenerated : listFieldsToBeGenerated(data, builderType)) {\n\t\t\t\t\t\tif (!fieldToBeGenerated.equals(name)) continue;\n\t\t\t\t\t\tchild.addError(\"Manually adding a field that @Singular @Builder would generate is not supported. If you want to manually manage the builder aspect for this field/parameter, don't use @Singular.\");\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase METHOD: {\n\t\t\t\t\tJCMethodDecl method = (JCMethodDecl) child.get();\n\t\t\t\t\tName name = method.name;\n\t\t\t\t\tif (name == null) break;\n\t\t\t\t\tif (getGeneratedBy(method) != null) continue;\n\t\t\t\t\tfor (Name methodToBeGenerated : listMethodsToBeGenerated(data, builderType)) {\n\t\t\t\t\t\tif (!methodToBeGenerated.equals(name)) continue;\n\t\t\t\t\t\tchild.addError(\"Manually adding a method that @Singular @Builder would generate is not supported. If you want to manually manage the builder aspect for this field/parameter, don't use @Singular.\");\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}}\n\t\t\t}\n\t\t\t\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tpublic java.util.List<Name> listFieldsToBeGenerated(SingularData data, JavacNode builderType) {\n\t\t\treturn Collections.singletonList(data.pluralName);\n\t\t}\n\t\t\n\t\tpublic java.util.List<Name> listMethodsToBeGenerated(SingularData data, JavacNode builderType) {\n\t\t\tName p = data.pluralName;\n\t\t\tName s = data.singularName;\n\t\t\tif (p.equals(s)) return Collections.singletonList(p);\n\t\t\treturn Arrays.asList(p, s);\n\t\t}\n\t\t\n\t\tpublic abstract java.util.List<JavacNode> generateFields(SingularData data, JavacNode builderType, JavacNode source);\n\t\t\n\t\t/**\n\t\t * Generates the singular, plural, and clear methods for the given {@link SingularData}.\n\t\t * Uses the given {@code builderType} as return type if {@code chain == true}, {@code void} otherwise.\n\t\t * If you need more control over the return type and value, use\n\t\t * {@link #generateMethods(SingularData, boolean, JavacNode, JCTree, boolean, ExpressionMaker, StatementMaker)}.\n\t\t */\n\t\tpublic void generateMethods(final BuilderJob job, SingularData data, boolean deprecate) {\n\t\t\t//job.checkerFramework, job.builderType, job.source, job.oldFluent, job.oldChain, job.accessInners\n\t\t\t//CheckerFrameworkVersion cfv, final JavacNode builderType, JavacNode source, boolean fluent, final boolean chain, AccessLevel access) {\n\t\t\tfinal JavacTreeMaker maker = job.builderType.getTreeMaker();\n\t\t\t\n\t\t\tExpressionMaker returnTypeMaker = new ExpressionMaker() { @Override public JCExpression make() {\n\t\t\t\treturn job.oldChain ? \n\t\t\t\t\tcloneSelfType(job.builderType) : \n\t\t\t\t\tmaker.Type(createVoidType(job.builderType.getSymbolTable(), CTC_VOID));\n\t\t\t}};\n\t\t\t\n\t\t\tStatementMaker returnStatementMaker = new StatementMaker() { @Override public JCStatement make() {\n\t\t\t\treturn job.oldChain ? maker.Return(maker.Ident(job.builderType.toName(\"this\"))) : null;\n\t\t\t}};\n\t\t\t\n\t\t\tgenerateMethods(job.checkerFramework, data, deprecate, job.builderType, job.sourceNode, job.oldFluent, returnTypeMaker, returnStatementMaker, job.accessInners);\n\t\t}\n\t\t\n\t\t/**\n\t\t * Generates the singular, plural, and clear methods for the given {@link SingularData}.\n\t\t * Uses the given {@code returnTypeMaker} and {@code returnStatementMaker} for the generated methods.\n\t\t */\n\t\tpublic abstract void generateMethods(CheckerFrameworkVersion cfv, SingularData data, boolean deprecate, JavacNode builderType, JavacNode source, boolean fluent, ExpressionMaker returnTypeMaker, StatementMaker returnStatementMaker, AccessLevel access);\n\t\t\n\t\tprotected void doGenerateMethods(CheckerFrameworkVersion cfv, SingularData data, boolean deprecate, JavacNode builderType, JavacNode source, boolean fluent, ExpressionMaker returnTypeMaker, StatementMaker returnStatementMaker, AccessLevel access) {\n\t\t\tJavacTreeMaker maker = builderType.getTreeMaker();\n\t\t\tgenerateSingularMethod(cfv, deprecate, maker, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, source, fluent, access);\n\t\t\tgeneratePluralMethod(cfv, deprecate, maker, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, source, fluent, access);\n\t\t\tgenerateClearMethod(cfv, deprecate, maker, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, source, access);\n\t\t}\n\t\t\n\t\tprivate void finishAndInjectMethod(CheckerFrameworkVersion cfv, JavacTreeMaker maker, JCExpression returnType, JCStatement returnStatement, SingularData data, JavacNode builderType, JavacNode source, boolean deprecate, ListBuffer<JCStatement> statements, Name methodName, List<JCVariableDecl> jcVariableDecls, List<JCAnnotation> methodAnnotations, AccessLevel access, Boolean ignoreNullCollections) {\n\t\t\tif (returnStatement != null) statements.append(returnStatement);\n\t\t\tJCBlock body = maker.Block(0, statements.toList());\n\t\t\tJCModifiers mods = makeMods(maker, builderType, deprecate, access, methodAnnotations);\n\t\t\tList<JCTypeParameter> typeParams = List.nil();\n\t\t\tList<JCExpression> thrown = List.nil();\n\t\t\t\n\t\t\tif (ignoreNullCollections != null) {\n\t\t\t\tif (ignoreNullCollections.booleanValue()) {\n\t\t\t\t\tfor (JCVariableDecl d : jcVariableDecls) createRelevantNullableAnnotation(builderType, d);\n\t\t\t\t} else {\n\t\t\t\t\tfor (JCVariableDecl d : jcVariableDecls) createRelevantNonNullAnnotation(builderType, d);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturnType = addCheckerFrameworkReturnsReceiver(returnType, maker, builderType, cfv);\n\t\t\tJCMethodDecl method = maker.MethodDef(mods, methodName, returnType, typeParams, jcVariableDecls, thrown, body, null);\n\t\t\tif (returnStatement != null) createRelevantNonNullAnnotation(builderType, method);\n\t\t\trecursiveSetGeneratedBy(method, source);\n\t\t\tinjectMethod(builderType, method);\n\t\t}\n\t\t\n\t\tprivate void generateClearMethod(CheckerFrameworkVersion cfv, boolean deprecate, JavacTreeMaker maker, JCExpression returnType, JCStatement returnStatement, SingularData data, JavacNode builderType, JavacNode source, AccessLevel access) {\n\t\t\tJCStatement clearStatement = generateClearStatements(maker, data, builderType);\n\t\t\tListBuffer<JCStatement> statements = new ListBuffer<JCStatement>();\n\t\t\tstatements.append(clearStatement);\n\t\t\t\n\t\t\tName methodName = builderType.toName(HandlerUtil.buildAccessorName(source, \"clear\", data.getPluralName().toString()));\n\t\t\tfinishAndInjectMethod(cfv, maker, returnType, returnStatement, data, builderType, source, deprecate, statements, methodName, List.<JCVariableDecl>nil(), List.<JCAnnotation>nil(), access, null);\n\t\t}\n\t\t\n\t\tprotected abstract JCStatement generateClearStatements(JavacTreeMaker maker, SingularData data, JavacNode builderType);\n\t\t\n\t\tprivate void generateSingularMethod(CheckerFrameworkVersion cfv, boolean deprecate, JavacTreeMaker maker, JCExpression returnType, JCStatement returnStatement, SingularData data, JavacNode builderType, JavacNode source, boolean fluent, AccessLevel access) {\n\t\t\tListBuffer<JCStatement> statements = generateSingularMethodStatements(maker, data, builderType, source);\n\t\t\tList<JCVariableDecl> params = generateSingularMethodParameters(maker, data, builderType, source);\n\t\t\tName name = data.getSingularName();\n\t\t\tString setterPrefix = data.getSetterPrefix();\n\t\t\tif (setterPrefix.isEmpty() && !fluent) setterPrefix = getAddMethodName();\n\t\t\tif (!setterPrefix.isEmpty()) name = builderType.toName(HandlerUtil.buildAccessorName(source, setterPrefix, name.toString()));\n\t\t\t\n\t\t\tstatements.prepend(createConstructBuilderVarIfNeeded(maker, data, builderType, source));\n\t\t\tList<JCAnnotation> methodAnnotations = copyAnnotations(findCopyableToBuilderSingularSetterAnnotations(data.annotation.up()), maker);\n\t\t\tfinishAndInjectMethod(cfv, maker, returnType, returnStatement, data, builderType, source, deprecate, statements, name, params, methodAnnotations, access, null);\n\t\t}\n\t\t\n\t\tprotected JCVariableDecl generateSingularMethodParameter(int typeIndex, JavacTreeMaker maker, SingularData data, JavacNode builderType, JavacNode source, Name name) {\n\t\t\tlong flags = JavacHandlerUtil.addFinalIfNeeded(Flags.PARAMETER, builderType.getContext());\n\t\t\tJCExpression type = cloneParamType(typeIndex, maker, data.getTypeArgs(), builderType, source);\n\t\t\tList<JCAnnotation> typeUseAnns = getTypeUseAnnotations(type);\n\t\t\ttype = removeTypeUseAnnotations(type);\n\t\t\tJCModifiers mods = typeUseAnns.isEmpty() ? maker.Modifiers(flags) : maker.Modifiers(flags, typeUseAnns);\n\t\t\treturn maker.VarDef(mods, name, type, null);\n\t\t}\n\t\t\n\t\tprotected JCStatement generateSingularMethodAddStatement(JavacTreeMaker maker, JavacNode builderType, Name argumentName, String builderFieldName) {\n\t\t\tJCExpression thisDotFieldDotAdd = chainDots(builderType, \"this\", builderFieldName, \"add\");\n\t\t\tJCExpression invokeAdd = maker.Apply(List.<JCExpression>nil(), thisDotFieldDotAdd, List.<JCExpression>of(maker.Ident(argumentName)));\n\t\t\treturn maker.Exec(invokeAdd);\n\t\t}\n\t\t\n\t\tprotected abstract ListBuffer<JCStatement> generateSingularMethodStatements(JavacTreeMaker maker, SingularData data, JavacNode builderType, JavacNode source);\n\t\t\n\t\tprotected abstract List<JCVariableDecl> generateSingularMethodParameters(JavacTreeMaker maker, SingularData data, JavacNode builderType, JavacNode source);\n\t\t\n\t\tprivate void generatePluralMethod(CheckerFrameworkVersion cfv, boolean deprecate, JavacTreeMaker maker, JCExpression returnType, JCStatement returnStatement, SingularData data, JavacNode builderType, JavacNode source, boolean fluent, AccessLevel access) {\n\t\t\tListBuffer<JCStatement> statements = generatePluralMethodStatements(maker, data, builderType, source);\n\t\t\t\n\t\t\tName name = data.getPluralName();\n\t\t\tString setterPrefix = data.getSetterPrefix();\n\t\t\tif (setterPrefix.isEmpty() && !fluent) setterPrefix = getAddMethodName() + \"All\";\n\t\t\tif (!setterPrefix.isEmpty()) name = builderType.toName(HandlerUtil.buildAccessorName(source, setterPrefix, name.toString()));\n\t\t\tJCExpression paramType = getPluralMethodParamType(builderType);\n\t\t\tparamType = addTypeArgs(getTypeArgumentsCount(), true, builderType, paramType, data.getTypeArgs(), source);\n\t\t\tlong paramFlags = JavacHandlerUtil.addFinalIfNeeded(Flags.PARAMETER, builderType.getContext());\n\t\t\tboolean ignoreNullCollections = data.isIgnoreNullCollections();\n\t\t\tJCModifiers paramMods = maker.Modifiers(paramFlags);\n\t\t\tJCVariableDecl param = maker.VarDef(paramMods, data.getPluralName(), paramType, null);\n\t\t\tstatements.prepend(createConstructBuilderVarIfNeeded(maker, data, builderType, source));\n\t\t\t\n\t\t\tif (ignoreNullCollections) {\n\t\t\t\tJCExpression incomingIsNotNull = maker.Binary(CTC_NOT_EQUAL, maker.Ident(data.getPluralName()), maker.Literal(CTC_BOT, null));\n\t\t\t\tJCStatement onNotNull = maker.Block(0, statements.toList());\n\t\t\t\tstatements = new ListBuffer<JCStatement>();\n\t\t\t\tstatements.append(maker.If(incomingIsNotNull, onNotNull, null));\n\t\t\t} else {\n\t\t\t\tstatements.prepend(JavacHandlerUtil.generateNullCheck(maker, null, data.getPluralName(), builderType, \"%s cannot be null\"));\n\t\t\t}\n\n\t\t\tList<JCAnnotation> methodAnnotations = copyAnnotations(findCopyableToSetterAnnotations(data.annotation.up(), true), maker);\n\t\t\t\n\t\t\tfinishAndInjectMethod(cfv, maker, returnType, returnStatement, data, builderType, source, deprecate, statements, name, List.of(param), methodAnnotations, access, ignoreNullCollections);\n\t\t}\n\t\t\n\t\tprotected ListBuffer<JCStatement> generatePluralMethodStatements(JavacTreeMaker maker, SingularData data, JavacNode builderType, JavacNode source) {\n\t\t\tListBuffer<JCStatement> statements = new ListBuffer<JCStatement>();\n\t\t\t\n\t\t\tJCExpression thisDotFieldDotAdd = chainDots(builderType, \"this\", data.getPluralName().toString(), getAddMethodName() + \"All\");\n\t\t\tJCExpression invokeAdd = maker.Apply(List.<JCExpression>nil(), thisDotFieldDotAdd, List.<JCExpression>of(maker.Ident(data.getPluralName())));\n\t\t\tstatements.append(maker.Exec(invokeAdd));\n\t\t\t\n\t\t\treturn statements;\n\t\t}\n\t\t\n\t\tprotected abstract JCExpression getPluralMethodParamType(JavacNode builderType);\n\t\t\n\t\tprotected abstract JCStatement createConstructBuilderVarIfNeeded(JavacTreeMaker maker, SingularData data, JavacNode builderType, JavacNode source);\n\t\t\n\t\tpublic abstract void appendBuildCode(SingularData data, JavacNode builderType, JavacNode source, ListBuffer<JCStatement> statements, Name targetVariableName, String builderVariable);\n\t\t\n\t\tpublic boolean shadowedDuringBuild() {\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\tpublic boolean requiresCleaning() {\n\t\t\ttry {\n\t\t\t\treturn !getClass().getMethod(\"appendCleaningCode\", SingularData.class, JavacNode.class, JCTree.class, ListBuffer.class).getDeclaringClass().equals(JavacSingularizer.class);\n\t\t\t} catch (NoSuchMethodException e) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic void appendCleaningCode(SingularData data, JavacNode builderType, JavacNode source, ListBuffer<JCStatement> statements) {\n\t\t}\n\t\t\n\t\t// -- Utility methods --\n\t\t\n\t\t/**\n\t\t * Adds the requested number of type arguments to the provided type, copying each argument in {@code typeArgs}. If typeArgs is too long, the extra elements are ignored.\n\t\t * If {@code typeArgs} is null or too short, {@code java.lang.Object} will be substituted for each missing type argument.\n\t\t * \n\t\t * @param count The number of type arguments requested.\n\t\t * @param addExtends If {@code true}, all bounds are either '? extends X' or just '?'. If false, the reverse is applied, and '? extends Foo' is converted to Foo, '?' to Object, etc.\n\t\t * @param node Some node in the same AST. Just used to obtain makers and contexts and such.\n\t\t * @param type The type to add generics to.\n\t\t * @param typeArgs the list of type args to clone.\n\t\t * @param source The source annotation that is the root cause of this code generation.\n\t\t */\n\t\tprotected JCExpression addTypeArgs(int count, boolean addExtends, JavacNode node, JCExpression type, List<JCExpression> typeArgs, JavacNode source) {\n\t\t\tJavacTreeMaker maker = node.getTreeMaker();\n\t\t\tList<JCExpression> clonedAndFixedTypeArgs = createTypeArgs(count, addExtends, node, typeArgs, source);\n\t\t\t\n\t\t\treturn maker.TypeApply(type, clonedAndFixedTypeArgs);\n\t\t}\n\t\t\n\t\tprotected List<JCExpression> createTypeArgs(int count, boolean addExtends, JavacNode node, List<JCExpression> typeArgs, JavacNode source) {\n\t\t\tJavacTreeMaker maker = node.getTreeMaker();\n\t\t\t\n\t\t\tif (count < 0) throw new IllegalArgumentException(\"count is negative\");\n\t\t\tif (count == 0) return List.nil();\n\t\t\tListBuffer<JCExpression> arguments = new ListBuffer<JCExpression>();\n\t\t\t\n\t\t\tif (typeArgs != null) for (JCExpression orig : typeArgs) {\n\t\t\t\tif (!addExtends) {\n\t\t\t\t\tif (orig.getKind() == Kind.UNBOUNDED_WILDCARD || orig.getKind() == Kind.SUPER_WILDCARD) {\n\t\t\t\t\t\targuments.append(genJavaLangTypeRef(node, \"Object\"));\n\t\t\t\t\t} else if (orig.getKind() == Kind.EXTENDS_WILDCARD) {\n\t\t\t\t\t\tJCExpression inner;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tinner = (JCExpression) ((JCWildcard) orig).inner;\n\t\t\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t\t\tinner = genJavaLangTypeRef(node, \"Object\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\targuments.append(cloneType(maker, inner, source));\n\t\t\t\t\t} else {\n\t\t\t\t\t\targuments.append(cloneType(maker, orig, source));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (orig.getKind() == Kind.UNBOUNDED_WILDCARD || orig.getKind() == Kind.SUPER_WILDCARD) {\n\t\t\t\t\t\targuments.append(maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null));\n\t\t\t\t\t} else if (orig.getKind() == Kind.EXTENDS_WILDCARD) {\n\t\t\t\t\t\targuments.append(cloneType(maker, orig, source));\n\t\t\t\t\t} else {\n\t\t\t\t\t\targuments.append(maker.Wildcard(maker.TypeBoundKind(BoundKind.EXTENDS), cloneType(maker, orig, source)));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (--count == 0) break;\n\t\t\t}\n\t\t\t\n\t\t\twhile (count-- > 0) {\n\t\t\t\tif (addExtends) {\n\t\t\t\t\targuments.append(maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null));\n\t\t\t\t} else {\n\t\t\t\t\targuments.append(genJavaLangTypeRef(node, \"Object\"));\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn arguments.toList();\n\t\t}\n\t\t\n\t\t/** Generates '<em>builderVariable</em>.<em>name</em>.size()' as an expression; if nullGuard is true, it's this.name == null ? 0 : this.name.size(). */\n\t\tprotected JCExpression getSize(JavacTreeMaker maker, JavacNode builderType, Name name, boolean nullGuard, boolean parens, String builderVariable) {\n\t\t\tName thisName = builderType.toName(builderVariable);\n\t\t\tJCExpression fn = maker.Select(maker.Select(maker.Ident(thisName), name), builderType.toName(\"size\"));\n\t\t\tJCExpression sizeInvoke = maker.Apply(List.<JCExpression>nil(), fn, List.<JCExpression>nil());\n\t\t\tif (nullGuard) {\n\t\t\t\tJCExpression isNull = maker.Binary(CTC_EQUAL, maker.Select(maker.Ident(thisName), name), maker.Literal(CTC_BOT, null));\n\t\t\t\tJCExpression out = maker.Conditional(isNull, maker.Literal(CTC_INT, 0), sizeInvoke);\n\t\t\t\tif (parens) return maker.Parens(out);\n\t\t\t\treturn out;\n\t\t\t}\n\t\t\treturn sizeInvoke;\n\t\t}\n\t\t\n\t\tprotected JCExpression cloneParamType(int index, JavacTreeMaker maker, List<JCExpression> typeArgs, JavacNode builderType, JavacNode source) {\n\t\t\tif (typeArgs == null || typeArgs.size() <= index) {\n\t\t\t\treturn genJavaLangTypeRef(builderType, \"Object\");\n\t\t\t} else {\n\t\t\t\tJCExpression originalType = typeArgs.get(index);\n\t\t\t\tif (originalType.getKind() == Kind.UNBOUNDED_WILDCARD || originalType.getKind() == Kind.SUPER_WILDCARD) {\n\t\t\t\t\treturn genJavaLangTypeRef(builderType, \"Object\");\n\t\t\t\t} else if (originalType.getKind() == Kind.EXTENDS_WILDCARD) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn cloneType(maker, (JCExpression) ((JCWildcard) originalType).inner, source);\n\t\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t\treturn genJavaLangTypeRef(builderType, \"Object\");\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treturn cloneType(maker, originalType, source);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tprotected abstract String getAddMethodName();\n\t\t\n\t\tprotected abstract int getTypeArgumentsCount();\n\t\t\n\t\tprotected abstract String getEmptyMaker(String target);\n\t\t\n\t\tpublic JCExpression getEmptyExpression(String target, JavacTreeMaker maker, SingularData data, JavacNode builderType, JavacNode source) {\n\t\t\tString emptyMaker = getEmptyMaker(target);\n\t\t\tList<JCExpression> typeArgs = createTypeArgs(getTypeArgumentsCount(), false, builderType, data.getTypeArgs(), source);\n\t\t\treturn maker.Apply(typeArgs, chainDots(builderType, emptyMaker.split(\"\\\\.\")), List.<JCExpression>nil());\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/package-info.java",
    "content": "/*\n * Copyright (C) 2009-2014 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/**\n * Contains the classes that implement the transformations for all of lombok's various features on the javac v1.6 platform.\n * \n * <strong>NB: This package is not public API in the sense that contents of this package,\n *    even public classes / methods / etc, may change in point releases.</strong>\n */\npackage lombok.javac.handlers;\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/singulars/JavacGuavaMapSingularizer.java",
    "content": "/*\n * Copyright (C) 2015-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers.singulars;\n\nimport lombok.core.LombokImmutableList;\nimport lombok.javac.handlers.JavacSingularsRecipes.JavacSingularizer;\nimport lombok.spi.Provides;\n\n@Provides(JavacSingularizer.class)\npublic class JavacGuavaMapSingularizer extends JavacGuavaSingularizer {\n\t// TODO cgcc.ImmutableMultimap, cgcc.ImmutableListMultimap, cgcc.ImmutableSetMultimap\n\t// TODO cgcc.ImmutableClassToInstanceMap\n\t// TODO cgcc.ImmutableRangeMap\n\t\n\tprivate static final LombokImmutableList<String> SUFFIXES =\n\t\tLombokImmutableList.of(\"key\", \"value\");\n\tprivate static final LombokImmutableList<String> SUPPORTED_TYPES = LombokImmutableList.of(\n\t\t\"com.google.common.collect.ImmutableMap\", \n\t\t\"com.google.common.collect.ImmutableBiMap\", \n\t\t\"com.google.common.collect.ImmutableSortedMap\"\n\t);\n\t\n\t@Override public LombokImmutableList<String> getSupportedTypes() {\n\t\treturn SUPPORTED_TYPES;\n\t}\n\t\n\t@Override protected LombokImmutableList<String> getArgumentSuffixes() {\n\t\treturn SUFFIXES;\n\t}\n\t\n\t@Override protected String getAddMethodName() {\n\t\treturn \"put\";\n\t}\n\t\n\t@Override protected String getAddAllTypeName() {\n\t\treturn \"java.util.Map\";\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/singulars/JavacGuavaSetListSingularizer.java",
    "content": "/*\n * Copyright (C) 2015-2021 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers.singulars;\n\nimport lombok.core.LombokImmutableList;\nimport lombok.javac.handlers.JavacSingularsRecipes.JavacSingularizer;\nimport lombok.spi.Provides;\n\n@Provides(JavacSingularizer.class)\npublic class JavacGuavaSetListSingularizer extends JavacGuavaSingularizer {\n\t// TODO com.google.common.collect.ImmutableRangeSet\n\t// TODO com.google.common.collect.ImmutableMultiset and com.google.common.collect.ImmutableSortedMultiset\n\tprivate static final LombokImmutableList<String> SUFFIXES = LombokImmutableList.of(\"\");\n\tprivate static final LombokImmutableList<String> SUPPORTED_TYPES = LombokImmutableList.of(\n\t\t\"com.google.common.collect.ImmutableCollection\", \n\t\t\"com.google.common.collect.ImmutableList\", \n\t\t\"com.google.common.collect.ImmutableSet\", \n\t\t\"com.google.common.collect.ImmutableSortedSet\"\n\t);\n\t\n\t@Override public LombokImmutableList<String> getSupportedTypes() {\n\t\treturn SUPPORTED_TYPES;\n\t}\n\t\n\t@Override protected LombokImmutableList<String> getArgumentSuffixes() {\n\t\treturn SUFFIXES;\n\t}\n\t\n\t@Override protected String getAddMethodName() {\n\t\treturn \"add\";\n\t}\n\t\n\t@Override protected String getAddAllTypeName() {\n\t\treturn \"java.lang.Iterable\";\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/singulars/JavacGuavaSingularizer.java",
    "content": "/*\n * Copyright (C) 2015-2020 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers.singulars;\n\nimport static lombok.javac.Javac.*;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport java.util.Collections;\n\nimport lombok.AccessLevel;\nimport lombok.core.GuavaTypeMap;\nimport lombok.core.LombokImmutableList;\nimport lombok.core.configuration.CheckerFrameworkVersion;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacTreeMaker;\nimport lombok.javac.handlers.JavacHandlerUtil;\nimport lombok.javac.handlers.JavacSingularsRecipes.ExpressionMaker;\nimport lombok.javac.handlers.JavacSingularsRecipes.JavacSingularizer;\nimport lombok.javac.handlers.JavacSingularsRecipes.SingularData;\nimport lombok.javac.handlers.JavacSingularsRecipes.StatementMaker;\n\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCStatement;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.ListBuffer;\nimport com.sun.tools.javac.util.Name;\n\nabstract class JavacGuavaSingularizer extends JavacSingularizer {\n\tprotected String getSimpleTargetTypeName(SingularData data) {\n\t\treturn GuavaTypeMap.getGuavaTypeName(data.getTargetFqn());\n\t}\n\t\n\t@Override protected String getEmptyMaker(String target) {\n\t\treturn \"com.google.common.collect.\" + GuavaTypeMap.getGuavaTypeName(target) + \".of\";\n\t}\n\t\n\tprotected String getBuilderMethodName(SingularData data) {\n\t\tString simpleTypeName = getSimpleTargetTypeName(data);\n\t\tif (\"ImmutableSortedSet\".equals(simpleTypeName) || \"ImmutableSortedMap\".equals(simpleTypeName)) return \"naturalOrder\";\n\t\treturn \"builder\";\n\t}\n\t\n\t@Override public java.util.List<JavacNode> generateFields(SingularData data, JavacNode builderType, JavacNode source) {\n\t\tJavacTreeMaker maker = builderType.getTreeMaker();\n\t\tString simpleTypeName = getSimpleTargetTypeName(data);\n\t\tJCExpression type = JavacHandlerUtil.chainDots(builderType, \"com\", \"google\", \"common\", \"collect\", simpleTypeName, \"Builder\");\n\t\ttype = addTypeArgs(getTypeArgumentsCount(), false, builderType, type, data.getTypeArgs(), source);\n\t\t\n\t\tJCVariableDecl buildField = maker.VarDef(maker.Modifiers(Flags.PRIVATE), data.getPluralName(), type, null);\n\t\treturn Collections.singletonList(injectFieldAndMarkGenerated(builderType, buildField));\n\t}\n\t\n\t@Override public void generateMethods(CheckerFrameworkVersion cfv, SingularData data, boolean deprecate, JavacNode builderType, JavacNode source, boolean fluent, ExpressionMaker returnTypeMaker, StatementMaker returnStatementMaker, AccessLevel access) {\n\t\tdoGenerateMethods(cfv, data, deprecate, builderType, source, fluent, returnTypeMaker, returnStatementMaker, access);\n\t}\n\t\n\t@Override\n\tprotected JCStatement generateClearStatements(JavacTreeMaker maker, SingularData data, JavacNode builderType) {\n\t\tJCExpression thisDotField = maker.Select(maker.Ident(builderType.toName(\"this\")), data.getPluralName());\n\t\treturn maker.Exec(maker.Assign(thisDotField, maker.Literal(CTC_BOT, null)));\n\t}\n\t\n\t@Override\n\tprotected List<JCVariableDecl> generateSingularMethodParameters(JavacTreeMaker maker, SingularData data, JavacNode builderType, JavacNode source) {\n\t\tName[] names = generateSingularMethodParameterNames(data, builderType);\n\t\tListBuffer<JCVariableDecl> params = new ListBuffer<JCVariableDecl>();\n\t\tfor (int i = 0; i < names.length; i++) {\n\t\t\tparams.append(generateSingularMethodParameter(i, maker, data, builderType, source, names[i]));\n\t\t}\n\t\treturn params.toList();\n\t}\n\t\n\t@Override\n\tprotected ListBuffer<JCStatement> generateSingularMethodStatements(JavacTreeMaker maker, SingularData data, JavacNode builderType, JavacNode source) {\n\t\tName[] names = generateSingularMethodParameterNames(data, builderType);\n\t\t\n\t\tJCExpression thisDotFieldDotAdd = chainDots(builderType, \"this\", data.getPluralName().toString(), getAddMethodName());\n\t\tListBuffer<JCExpression> invokeAddExprBuilder = new ListBuffer<JCExpression>();\n\t\tfor (Name name : names) {\n\t\t\tinvokeAddExprBuilder.append(maker.Ident(name));\n\t\t}\n\t\tList<JCExpression> invokeAddExpr = invokeAddExprBuilder.toList();\n\t\tJCExpression invokeAdd = maker.Apply(List.<JCExpression>nil(), thisDotFieldDotAdd, invokeAddExpr);\n\t\tJCStatement st = maker.Exec(invokeAdd);\n\t\t\n\t\treturn new ListBuffer<JCStatement>().append(st);\n\t}\n\t\n\tprivate Name[] generateSingularMethodParameterNames(SingularData data, JavacNode builderType) {\n\t\tLombokImmutableList<String> suffixes = getArgumentSuffixes();\n\t\tName[] names = new Name[suffixes.size()];\n\t\tfor (int i = 0; i < names.length; i++) {\n\t\t\tString s = suffixes.get(i);\n\t\t\tName n = data.getSingularName();\n\t\t\tnames[i] = s.isEmpty() ? n : builderType.toName(s);\n\t\t}\n\t\treturn names;\n\t}\n\t\n\t@Override\n\tprotected JCExpression getPluralMethodParamType(JavacNode builderType) {\n\t\treturn genTypeRef(builderType, getAddAllTypeName());\n\t}\n\t\n\t@Override public void appendBuildCode(SingularData data, JavacNode builderType, JavacNode source, ListBuffer<JCStatement> statements, Name targetVariableName, String builderVariable) {\n\t\tJavacTreeMaker maker = builderType.getTreeMaker();\n\t\tList<JCExpression> jceBlank = List.nil();\n\t\t\n\t\tJCExpression varType = chainDotsString(builderType, data.getTargetFqn());\n\t\tint argumentsCount = getTypeArgumentsCount();\n\t\tvarType = addTypeArgs(argumentsCount, false, builderType, varType, data.getTypeArgs(), source);\n\t\t\n\t\tJCExpression empty; {\n\t\t\t//ImmutableX.of()\n\t\t\tJCExpression emptyMethod = chainDots(builderType, \"com\", \"google\", \"common\", \"collect\", getSimpleTargetTypeName(data), \"of\");\n\t\t\tList<JCExpression> invokeTypeArgs = createTypeArgs(argumentsCount, false, builderType, data.getTypeArgs(), source);\n\t\t\tempty = maker.Apply(invokeTypeArgs, emptyMethod, jceBlank);\n\t\t}\n\t\t\n\t\tJCExpression invokeBuild; {\n\t\t\t//this.pluralName.build();\n\t\t\tinvokeBuild = maker.Apply(jceBlank, chainDots(builderType, builderVariable, data.getPluralName().toString(), \"build\"), jceBlank);\n\t\t}\n\t\t\n\t\tJCExpression isNull; {\n\t\t\t//this.pluralName == null\n\t\t\tisNull = maker.Binary(CTC_EQUAL, maker.Select(maker.Ident(builderType.toName(builderVariable)), data.getPluralName()), maker.Literal(CTC_BOT, null));\n\t\t}\n\t\t\n\t\tJCExpression init = maker.Conditional(isNull, empty, invokeBuild); // this.pluralName == null ? ImmutableX.of() : this.pluralName.build()\n\t\t\n\t\tJCStatement jcs = maker.VarDef(maker.Modifiers(0L), data.getPluralName(), varType, init);\n\t\tstatements.append(jcs);\n\t}\n\n\t@Override\n\tprotected JCStatement createConstructBuilderVarIfNeeded(JavacTreeMaker maker, SingularData data, JavacNode builderType, JavacNode source) {\n\t\tList<JCExpression> jceBlank = List.nil();\n\t\t\n\t\tJCExpression thisDotField = maker.Select(maker.Ident(builderType.toName(\"this\")), data.getPluralName());\n\t\tJCExpression thisDotField2 = maker.Select(maker.Ident(builderType.toName(\"this\")), data.getPluralName());\n\t\tJCExpression cond = maker.Binary(CTC_EQUAL, thisDotField, maker.Literal(CTC_BOT, null));\n\t\t\n\t\tJCExpression create = maker.Apply(jceBlank, chainDots(builderType, \"com\", \"google\", \"common\", \"collect\", getSimpleTargetTypeName(data), getBuilderMethodName(data)), jceBlank);\n\t\tJCStatement thenPart = maker.Exec(maker.Assign(thisDotField2, create));\n\t\t\n\t\treturn maker.If(cond, thenPart, null);\n\t}\n\t\n\tprotected abstract LombokImmutableList<String> getArgumentSuffixes();\n\t\n\tprotected abstract String getAddAllTypeName();\n\t\n\t@Override\n\tprotected int getTypeArgumentsCount() {\n\t\treturn getArgumentSuffixes().size();\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/singulars/JavacGuavaTableSingularizer.java",
    "content": "/*\n * Copyright (C) 2015-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers.singulars;\n\nimport lombok.core.LombokImmutableList;\nimport lombok.javac.handlers.JavacSingularsRecipes.JavacSingularizer;\nimport lombok.spi.Provides;\n\n@Provides(JavacSingularizer.class)\npublic class JavacGuavaTableSingularizer extends JavacGuavaSingularizer {\n\tprivate static final LombokImmutableList<String> SUFFIXES =\n\t\tLombokImmutableList.of(\"rowKey\", \"columnKey\", \"value\");\n\tprivate static final LombokImmutableList<String> SUPPORTED_TYPES =\n\t\tLombokImmutableList.of(\"com.google.common.collect.ImmutableTable\");\n\t\n\t@Override public LombokImmutableList<String> getSupportedTypes() {\n\t\treturn SUPPORTED_TYPES;\n\t}\n\t\n\t@Override protected LombokImmutableList<String> getArgumentSuffixes() {\n\t\treturn SUFFIXES;\n\t}\n\t\n\t@Override protected String getAddMethodName() {\n\t\treturn \"put\";\n\t}\n\t\n\t@Override protected String getAddAllTypeName() {\n\t\treturn \"com.google.common.collect.Table\";\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/singulars/JavacJavaUtilListSetSingularizer.java",
    "content": "/*\n * Copyright (C) 2015-2019 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers.singulars;\n\nimport static lombok.javac.Javac.*;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport java.util.Collections;\n\nimport lombok.AccessLevel;\nimport lombok.core.configuration.CheckerFrameworkVersion;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacTreeMaker;\nimport lombok.javac.handlers.JavacHandlerUtil;\nimport lombok.javac.handlers.JavacSingularsRecipes.ExpressionMaker;\nimport lombok.javac.handlers.JavacSingularsRecipes.JavacSingularizer;\nimport lombok.javac.handlers.JavacSingularsRecipes.SingularData;\nimport lombok.javac.handlers.JavacSingularsRecipes.StatementMaker;\n\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCStatement;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.ListBuffer;\nimport com.sun.tools.javac.util.Name;\n\nabstract class JavacJavaUtilListSetSingularizer extends JavacJavaUtilSingularizer {\n\t@Override protected JavacSingularizer getGuavaInstead(JavacNode node) {\n\t\treturn new JavacGuavaSetListSingularizer();\n\t}\n\t\n\t@Override public java.util.List<Name> listFieldsToBeGenerated(SingularData data, JavacNode builderType) {\n\t\treturn super.listFieldsToBeGenerated(data, builderType);\n\t}\n\t\n\t@Override public java.util.List<Name> listMethodsToBeGenerated(SingularData data, JavacNode builderType) {\n\t\treturn super.listMethodsToBeGenerated(data, builderType);\n\t}\n\t\n\t@Override public java.util.List<JavacNode> generateFields(SingularData data, JavacNode builderType, JavacNode source) {\n\t\tJavacTreeMaker maker = builderType.getTreeMaker();\n\t\tJCExpression type = JavacHandlerUtil.chainDots(builderType, \"java\", \"util\", \"ArrayList\");\n\t\ttype = addTypeArgs(1, false, builderType, type, data.getTypeArgs(), source);\n\t\t\n\t\tJCVariableDecl buildField = maker.VarDef(maker.Modifiers(Flags.PRIVATE), data.getPluralName(), type, null);\n\t\treturn Collections.singletonList(injectFieldAndMarkGenerated(builderType, buildField));\n\t}\n\t\n\t@Override public void generateMethods(CheckerFrameworkVersion cfv, SingularData data, boolean deprecate, JavacNode builderType, JavacNode source, boolean fluent, ExpressionMaker returnTypeMaker, StatementMaker returnStatementMaker, AccessLevel access) {\n\t\tdoGenerateMethods(cfv, data, deprecate, builderType, source, fluent, returnTypeMaker, returnStatementMaker, access);\n\t}\n\t\n\t@Override\n\tprotected JCStatement generateClearStatements(JavacTreeMaker maker, SingularData data, JavacNode builderType) {\n\t\tList<JCExpression> jceBlank = List.nil();\n\t\tJCExpression thisDotField = maker.Select(maker.Ident(builderType.toName(\"this\")), data.getPluralName());\n\t\tJCExpression thisDotFieldDotClear = maker.Select(maker.Select(maker.Ident(builderType.toName(\"this\")), data.getPluralName()), builderType.toName(\"clear\"));\n\t\t\n\t\tJCStatement clearCall = maker.Exec(maker.Apply(jceBlank, thisDotFieldDotClear, jceBlank));\n\t\tJCExpression cond = maker.Binary(CTC_NOT_EQUAL, thisDotField, maker.Literal(CTC_BOT, null));\n\t\t\n\t\treturn maker.If(cond, clearCall, null);\n\t}\n\t\n\t@Override\n\tprotected ListBuffer<JCStatement> generateSingularMethodStatements(JavacTreeMaker maker, SingularData data, JavacNode builderType, JavacNode source) {\n\t\treturn new ListBuffer<JCStatement>()\n\t\t\t.append(generateSingularMethodAddStatement(maker, builderType, data.getSingularName(), data.getPluralName().toString()));\n\t}\n\t\n\t@Override\n\tprotected List<JCVariableDecl> generateSingularMethodParameters(JavacTreeMaker maker, SingularData data, JavacNode builderType, JavacNode source) {\n\t\tJCVariableDecl param = generateSingularMethodParameter(0, maker, data, builderType, source, data.getSingularName());\n\t\treturn List.of(param);\n\t}\n\t\n\t@Override\n\tprotected JCExpression getPluralMethodParamType(JavacNode builderType) {\n\t\treturn chainDots(builderType, \"java\", \"util\", \"Collection\");\n\t}\n\t\n\t@Override\n\tprotected JCStatement createConstructBuilderVarIfNeeded(JavacTreeMaker maker, SingularData data, JavacNode builderType, JavacNode source) {\n\t\treturn createConstructBuilderVarIfNeeded(maker, data, builderType, false, source);\n\t}\n\t\n\t@Override\n\tprotected String getAddMethodName() {\n\t\treturn \"add\";\n\t}\n\t\n\t@Override\n\tprotected int getTypeArgumentsCount() {\n\t\treturn 1;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/singulars/JavacJavaUtilListSingularizer.java",
    "content": "/*\n * Copyright (C) 2015-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers.singulars;\n\nimport static lombok.javac.Javac.*;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport lombok.core.LombokImmutableList;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacTreeMaker;\nimport lombok.javac.handlers.JavacSingularsRecipes.JavacSingularizer;\nimport lombok.javac.handlers.JavacSingularsRecipes.SingularData;\nimport lombok.spi.Provides;\n\nimport com.sun.tools.javac.tree.JCTree.JCCase;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCStatement;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.ListBuffer;\nimport com.sun.tools.javac.util.Name;\n\n@Provides(JavacSingularizer.class)\npublic class JavacJavaUtilListSingularizer extends JavacJavaUtilListSetSingularizer {\n\t@Override public LombokImmutableList<String> getSupportedTypes() {\n\t\treturn LombokImmutableList.of(\"java.util.List\", \"java.util.Collection\", \"java.lang.Iterable\");\n\t}\n\t\n\t@Override protected String getEmptyMaker(String target) {\n\t\treturn \"java.util.Collections.emptyList\";\n\t}\n\t\n\t@Override public void appendBuildCode(SingularData data, JavacNode builderType, JavacNode source, ListBuffer<JCStatement> statements, Name targetVariableName, String builderVariable) {\n\t\tJavacTreeMaker maker = builderType.getTreeMaker();\n\t\tList<JCExpression> jceBlank = List.nil();\n\t\tListBuffer<JCCase> cases = new ListBuffer<JCCase>();\n\t\t\n\t\t/* case 0: (empty); break; */ {\n\t\t\tJCStatement assignStat; {\n\t\t\t\t// pluralName = java.util.Collections.emptyList();\n\t\t\t\tJCExpression invoke = maker.Apply(jceBlank, chainDots(builderType, \"java\", \"util\", \"Collections\", \"emptyList\"), jceBlank);\n\t\t\t\tassignStat = maker.Exec(maker.Assign(maker.Ident(data.getPluralName()), invoke));\n\t\t\t}\n\t\t\tJCStatement breakStat = maker.Break(null);\n\t\t\tJCCase emptyCase = maker.Case(maker.Literal(CTC_INT, 0), List.of(assignStat, breakStat));\n\t\t\tcases.append(emptyCase);\n\t\t}\n\t\t\n\t\t/* case 1: (singletonList); break; */ {\n\t\t\tJCStatement assignStat; {\n\t\t\t\t// pluralName = java.util.Collections.singletonList(this.pluralName.get(0));\n\t\t\t\tJCExpression zeroLiteral = maker.Literal(CTC_INT, 0);\n\t\t\t\tJCExpression arg = maker.Apply(jceBlank, chainDots(builderType, builderVariable, data.getPluralName().toString(), \"get\"), List.of(zeroLiteral));\n\t\t\t\tList<JCExpression> args = List.of(arg);\n\t\t\t\tJCExpression invoke = maker.Apply(jceBlank, chainDots(builderType, \"java\", \"util\", \"Collections\", \"singletonList\"), args);\n\t\t\t\tassignStat = maker.Exec(maker.Assign(maker.Ident(data.getPluralName()), invoke));\n\t\t\t}\n\t\t\tJCStatement breakStat = maker.Break(null);\n\t\t\tJCCase singletonCase = maker.Case(maker.Literal(CTC_INT, 1), List.of(assignStat, breakStat));\n\t\t\tcases.append(singletonCase);\n\t\t}\n\t\t\n\t\t/* default: Create with right size, then addAll */ {\n\t\t\tList<JCStatement> defStats = createListCopy(maker, data, builderType, source, builderVariable);\n\t\t\tJCCase defaultCase = maker.Case(null, defStats);\n\t\t\tcases.append(defaultCase);\n\t\t}\n\t\t\n\t\tJCStatement switchStat = maker.Switch(getSize(maker,  builderType, data.getPluralName(), true, false, builderVariable), cases.toList());\n\t\tJCExpression localShadowerType = chainDotsString(builderType, data.getTargetFqn());\n\t\tlocalShadowerType = addTypeArgs(1, false, builderType, localShadowerType, data.getTypeArgs(), source);\n\t\tJCStatement varDefStat = maker.VarDef(maker.Modifiers(0L), data.getPluralName(), localShadowerType, null);\n\t\tstatements.append(varDefStat);\n\t\tstatements.append(switchStat);\n\t}\n\t\n\tprivate List<JCStatement> createListCopy(JavacTreeMaker maker, SingularData data, JavacNode builderType, JavacNode source, String builderVariable) {\n\t\tList<JCExpression> jceBlank = List.nil();\n\t\tName thisName = builderType.toName(builderVariable);\n\t\t\n\t\tJCExpression argToUnmodifiable; {\n\t\t\t // new java.util.ArrayList<Generics>(this.pluralName);\n\t\t\tList<JCExpression> constructorArgs = List.nil();\n\t\t\tJCExpression thisDotPluralName = maker.Select(maker.Ident(thisName), data.getPluralName());\n\t\t\tconstructorArgs = List.<JCExpression>of(thisDotPluralName);\n\t\t\tJCExpression targetTypeExpr = chainDots(builderType, \"java\", \"util\", \"ArrayList\");\n\t\t\ttargetTypeExpr = addTypeArgs(1, false, builderType, targetTypeExpr, data.getTypeArgs(), source);\n\t\t\targToUnmodifiable = maker.NewClass(null, jceBlank, targetTypeExpr, constructorArgs, null);\n\t\t}\n\t\t\n\t\tJCStatement unmodifiableStat; {\n\t\t\t// pluralname = Collections.unmodifiableInterfaceType(-newlist-);\n\t\t\tJCExpression invoke = maker.Apply(jceBlank, chainDots(builderType, \"java\", \"util\", \"Collections\", \"unmodifiableList\"), List.of(argToUnmodifiable));\n\t\t\tunmodifiableStat = maker.Exec(maker.Assign(maker.Ident(data.getPluralName()), invoke));\n\t\t}\n\t\t\n\t\treturn List.of(unmodifiableStat);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/singulars/JavacJavaUtilMapSingularizer.java",
    "content": "/*\n * Copyright (C) 2015-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers.singulars;\n\nimport static lombok.javac.Javac.*;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport java.util.Arrays;\n\nimport lombok.AccessLevel;\nimport lombok.core.LombokImmutableList;\nimport lombok.core.configuration.CheckerFrameworkVersion;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacTreeMaker;\nimport lombok.javac.handlers.JavacHandlerUtil;\nimport lombok.javac.handlers.JavacSingularsRecipes.ExpressionMaker;\nimport lombok.javac.handlers.JavacSingularsRecipes.JavacSingularizer;\nimport lombok.javac.handlers.JavacSingularsRecipes.SingularData;\nimport lombok.javac.handlers.JavacSingularsRecipes.StatementMaker;\nimport lombok.spi.Provides;\n\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.tree.JCTree.JCBlock;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCStatement;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.ListBuffer;\nimport com.sun.tools.javac.util.Name;\n\n@Provides(JavacSingularizer.class)\npublic class JavacJavaUtilMapSingularizer extends JavacJavaUtilSingularizer {\n\t@Override public LombokImmutableList<String> getSupportedTypes() {\n\t\treturn LombokImmutableList.of(\"java.util.Map\", \"java.util.SortedMap\", \"java.util.NavigableMap\");\n\t}\n\t\n\t@Override protected String getEmptyMaker(String target) {\n\t\tif (target.endsWith(\"NavigableMap\")) return \"java.util.Collections.emptyNavigableMap\";\n\t\tif (target.endsWith(\"SortedMap\")) return \"java.util.Collections.emptySortedMap\";\n\t\treturn \"java.util.Collections.emptyMap\";\n\t}\n\t\n\t@Override protected JavacSingularizer getGuavaInstead(JavacNode node) {\n\t\treturn new JavacGuavaMapSingularizer();\n\t}\n\t\n\t@Override public java.util.List<Name> listFieldsToBeGenerated(SingularData data, JavacNode builderType) {\n\t\tString p = data.getPluralName().toString();\n\t\treturn Arrays.asList(builderType.toName(p + \"$key\"), builderType.toName(p + \"$value\"));\n\t}\n\t\n\t@Override public java.util.List<Name> listMethodsToBeGenerated(SingularData data, JavacNode builderType) {\n\t\treturn super.listMethodsToBeGenerated(data, builderType);\n\t}\n\t\n\t@Override public java.util.List<JavacNode> generateFields(SingularData data, JavacNode builderType, JavacNode source) {\n\t\tJavacTreeMaker maker = builderType.getTreeMaker();\n\t\t\n\t\tJCVariableDecl buildKeyField; {\n\t\t\tJCExpression type = JavacHandlerUtil.chainDots(builderType, \"java\", \"util\", \"ArrayList\");\n\t\t\ttype = addTypeArgs(1, false, builderType, type, data.getTypeArgs(), source);\n\t\t\tbuildKeyField = maker.VarDef(maker.Modifiers(Flags.PRIVATE), builderType.toName(data.getPluralName() + \"$key\"), type, null);\n\t\t}\n\t\t\n\t\tJCVariableDecl buildValueField; {\n\t\t\tJCExpression type = JavacHandlerUtil.chainDots(builderType, \"java\", \"util\", \"ArrayList\");\n\t\t\tList<JCExpression> tArgs = data.getTypeArgs();\n\t\t\tif (tArgs != null && tArgs.size() > 1) tArgs = tArgs.tail;\n\t\t\telse tArgs = List.nil();\n\t\t\ttype = addTypeArgs(1, false, builderType, type, tArgs, source);\n\t\t\tbuildValueField = maker.VarDef(maker.Modifiers(Flags.PRIVATE), builderType.toName(data.getPluralName() + \"$value\"), type, null);\n\t\t}\n\t\t\n\t\tJavacNode valueFieldNode = injectFieldAndMarkGenerated(builderType, buildValueField);\n\t\tJavacNode keyFieldNode = injectFieldAndMarkGenerated(builderType, buildKeyField);\n\t\t\n\t\treturn Arrays.asList(keyFieldNode, valueFieldNode);\n\t}\n\t\n\t@Override public void generateMethods(CheckerFrameworkVersion cfv, SingularData data, boolean deprecate, JavacNode builderType, JavacNode source, boolean fluent, ExpressionMaker returnTypeMaker, StatementMaker returnStatementMaker, AccessLevel access) {\n\t\tdoGenerateMethods(cfv, data, deprecate, builderType, source, fluent, returnTypeMaker, returnStatementMaker, access);\n\t}\n\t\n\t@Override\n\tprotected JCStatement generateClearStatements(JavacTreeMaker maker, SingularData data, JavacNode builderType) {\n\t\tList<JCExpression> jceBlank = List.nil();\n\t\t\n\t\tJCExpression thisDotKeyField = chainDots(builderType, \"this\", data.getPluralName() + \"$key\");\n\t\tJCExpression thisDotKeyFieldDotClear = chainDots(builderType, \"this\", data.getPluralName() + \"$key\", \"clear\");\n\t\tJCExpression thisDotValueFieldDotClear = chainDots(builderType, \"this\", data.getPluralName() + \"$value\", \"clear\");\n\t\tJCStatement clearKeyCall = maker.Exec(maker.Apply(jceBlank, thisDotKeyFieldDotClear, jceBlank));\n\t\tJCStatement clearValueCall = maker.Exec(maker.Apply(jceBlank, thisDotValueFieldDotClear, jceBlank));\n\t\tJCExpression cond = maker.Binary(CTC_NOT_EQUAL, thisDotKeyField, maker.Literal(CTC_BOT, null));\n\t\tJCBlock clearCalls = maker.Block(0, List.of(clearKeyCall, clearValueCall));\n\t\treturn maker.If(cond, clearCalls, null);\n\t}\n\t\n\t@Override\n\tprotected ListBuffer<JCStatement> generateSingularMethodStatements(JavacTreeMaker maker, SingularData data, JavacNode builderType, JavacNode source) {\n\t\tName keyName = builderType.toName(data.getSingularName().toString() + \"Key\");\n\t\tName valueName = builderType.toName(data.getSingularName().toString() + \"Value\");\n\t\t\n\t\tListBuffer<JCStatement> statements = new ListBuffer<JCStatement>();\n\t\t/* Generates: this.pluralname$key.add(singularnameKey); */\n\t\tstatements.append(generateSingularMethodAddStatement(maker, builderType, keyName, data.getPluralName() + \"$key\"));\n\t\t/* Generates: this.pluralname$value.add(singularnameValue); */\n\t\tstatements.append(generateSingularMethodAddStatement(maker, builderType, valueName, data.getPluralName() + \"$value\"));\n\t\treturn statements;\n\t}\n\t\n\t@Override\n\tprotected List<JCVariableDecl> generateSingularMethodParameters(JavacTreeMaker maker, SingularData data, JavacNode builderType, JavacNode source) {\n\t\tName keyName = builderType.toName(data.getSingularName().toString() + \"Key\");\n\t\tName valueName = builderType.toName(data.getSingularName().toString() + \"Value\");\n\t\tJCVariableDecl paramKey = generateSingularMethodParameter(0, maker, data, builderType, source, keyName);\n\t\tJCVariableDecl paramValue = generateSingularMethodParameter(1, maker, data, builderType, source, valueName);\n\t\treturn List.of(paramKey, paramValue);\n\t}\n\t\n\t@Override\n\tprotected ListBuffer<JCStatement> generatePluralMethodStatements(JavacTreeMaker maker, SingularData data, JavacNode builderType, JavacNode source) {\n\t\tList<JCExpression> jceBlank = List.nil();\n\t\tListBuffer<JCStatement> statements = new ListBuffer<JCStatement>();\n\t\tlong baseFlags = JavacHandlerUtil.addFinalIfNeeded(0, builderType.getContext());\n\t\tName entryName = builderType.toName(\"$lombokEntry\");\n\t\t\n\t\tJCExpression forEachType = chainDots(builderType, \"java\", \"util\", \"Map\", \"Entry\");\n\t\tforEachType = addTypeArgs(2, true, builderType, forEachType, data.getTypeArgs(), source);\n\t\tJCExpression keyArg = maker.Apply(List.<JCExpression>nil(), maker.Select(maker.Ident(entryName), builderType.toName(\"getKey\")), List.<JCExpression>nil());\n\t\tJCExpression valueArg = maker.Apply(List.<JCExpression>nil(), maker.Select(maker.Ident(entryName), builderType.toName(\"getValue\")), List.<JCExpression>nil());\n\t\tJCExpression addKey = maker.Apply(List.<JCExpression>nil(), chainDots(builderType, \"this\", data.getPluralName() + \"$key\", \"add\"), List.of(keyArg));\n\t\tJCExpression addValue = maker.Apply(List.<JCExpression>nil(), chainDots(builderType, \"this\", data.getPluralName() + \"$value\", \"add\"), List.of(valueArg));\n\t\tJCBlock forEachBody = maker.Block(0, List.<JCStatement>of(maker.Exec(addKey), maker.Exec(addValue)));\n\t\tJCExpression entrySetInvocation = maker.Apply(jceBlank, maker.Select(maker.Ident(data.getPluralName()), builderType.toName(\"entrySet\")), jceBlank);\n\t\tJCStatement forEach = maker.ForeachLoop(maker.VarDef(maker.Modifiers(baseFlags), entryName, forEachType, null), entrySetInvocation, forEachBody);\n\t\tstatements.append(forEach);\n\t\treturn statements;\n\t}\n\t\n\t@Override\n\tprotected JCExpression getPluralMethodParamType(JavacNode builderType) {\n\t\treturn chainDots(builderType, \"java\", \"util\", \"Map\");\n\t}\n\t\n\t@Override\n\tprotected JCStatement createConstructBuilderVarIfNeeded(JavacTreeMaker maker, SingularData data, JavacNode builderType, JavacNode source) {\n\t\treturn createConstructBuilderVarIfNeeded(maker, data, builderType, true, source);\n\t}\n\t\n\t@Override public void appendBuildCode(SingularData data, JavacNode builderType, JavacNode source, ListBuffer<JCStatement> statements, Name targetVariableName, String builderVariable) {\n\t\tJavacTreeMaker maker = builderType.getTreeMaker();\n\t\t\n\t\tif (data.getTargetFqn().equals(\"java.util.Map\")) {\n\t\t\tstatements.appendList(createJavaUtilSetMapInitialCapacitySwitchStatements(maker, data, builderType, true, \"emptyMap\", \"singletonMap\", \"LinkedHashMap\", source, builderVariable));\n\t\t} else {\n\t\t\tstatements.appendList(createJavaUtilSimpleCreationAndFillStatements(maker, data, builderType, true, true, false, true, \"TreeMap\", source, builderVariable));\n\t\t}\n\t}\n\t\n\t@Override\n\tprotected String getAddMethodName() {\n\t\treturn \"put\";\n\t}\n\t\n\t@Override\n\tprotected int getTypeArgumentsCount() {\n\t\treturn 2;\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/singulars/JavacJavaUtilSetSingularizer.java",
    "content": "/*\n * Copyright (C) 2015-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers.singulars;\n\nimport lombok.core.LombokImmutableList;\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacTreeMaker;\nimport lombok.javac.handlers.JavacSingularsRecipes.JavacSingularizer;\nimport lombok.javac.handlers.JavacSingularsRecipes.SingularData;\nimport lombok.spi.Provides;\n\nimport com.sun.tools.javac.tree.JCTree.JCStatement;\nimport com.sun.tools.javac.util.ListBuffer;\nimport com.sun.tools.javac.util.Name;\n\n@Provides(JavacSingularizer.class)\npublic class JavacJavaUtilSetSingularizer extends JavacJavaUtilListSetSingularizer {\n\t@Override public LombokImmutableList<String> getSupportedTypes() {\n\t\treturn LombokImmutableList.of(\"java.util.Set\", \"java.util.SortedSet\", \"java.util.NavigableSet\");\n\t}\n\t\n\t@Override protected String getEmptyMaker(String target) {\n\t\tif (target.endsWith(\"SortedSet\")) return \"java.util.Collections.emptySortedSet\";\n\t\tif (target.endsWith(\"NavigableSet\")) return \"java.util.Collections.emptyNavigableSet\";\n\t\treturn \"java.util.Collections.emptySet\";\n\t}\n\t\n\t@Override public void appendBuildCode(SingularData data, JavacNode builderType, JavacNode source, ListBuffer<JCStatement> statements, Name targetVariableName, String builderVariable) {\n\t\tJavacTreeMaker maker = builderType.getTreeMaker();\n\t\t\n\t\tif (data.getTargetFqn().equals(\"java.util.Set\")) {\n\t\t\tstatements.appendList(createJavaUtilSetMapInitialCapacitySwitchStatements(maker, data, builderType, false, \"emptySet\", \"singleton\", \"LinkedHashSet\", source, builderVariable));\n\t\t} else {\n\t\t\tstatements.appendList(createJavaUtilSimpleCreationAndFillStatements(maker, data, builderType, false, true, false, true, \"TreeSet\", source, builderVariable));\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/handlers/singulars/JavacJavaUtilSingularizer.java",
    "content": "/*\n * Copyright (C) 2015-2019 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.handlers.singulars;\n\nimport static lombok.javac.Javac.*;\nimport static lombok.javac.handlers.JavacHandlerUtil.*;\n\nimport com.sun.tools.javac.tree.JCTree.JCCase;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCStatement;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.ListBuffer;\nimport com.sun.tools.javac.util.Name;\n\nimport lombok.javac.JavacNode;\nimport lombok.javac.JavacTreeMaker;\nimport lombok.javac.handlers.JavacSingularsRecipes.JavacSingularizer;\nimport lombok.javac.handlers.JavacSingularsRecipes.SingularData;\n\nabstract class JavacJavaUtilSingularizer extends JavacSingularizer {\n\tprotected List<JCStatement> createJavaUtilSetMapInitialCapacitySwitchStatements(JavacTreeMaker maker, SingularData data, JavacNode builderType, boolean mapMode, String emptyCollectionMethod, String singletonCollectionMethod, String targetType, JavacNode source, String builderVariable) {\n\t\tList<JCExpression> jceBlank = List.nil();\n\t\tListBuffer<JCCase> cases = new ListBuffer<JCCase>();\n\t\t\n\t\tif (emptyCollectionMethod != null) { // case 0: (empty); break;\n\t\t\tJCStatement assignStat; {\n\t\t\t\t// pluralName = java.util.Collections.emptyCollectionMethod();\n\t\t\t\tJCExpression invoke = maker.Apply(jceBlank, chainDots(builderType, \"java\", \"util\", \"Collections\", emptyCollectionMethod), jceBlank);\n\t\t\t\tassignStat = maker.Exec(maker.Assign(maker.Ident(data.getPluralName()), invoke));\n\t\t\t}\n\t\t\tJCStatement breakStat = maker.Break(null);\n\t\t\tJCCase emptyCase = maker.Case(maker.Literal(CTC_INT, 0), List.of(assignStat, breakStat));\n\t\t\tcases.append(emptyCase);\n\t\t}\n\t\t\n\t\tif (singletonCollectionMethod != null) { // case 1: (singleton); break;\n\t\t\tJCStatement assignStat; {\n\t\t\t\t// !mapMode: pluralName = java.util.Collections.singletonCollectionMethod(this.pluralName.get(0));\n\t\t\t\t//  mapMode: pluralName = java.util.Collections.singletonCollectionMethod(this.pluralName$key.get(0), this.pluralName$value.get(0));\n\t\t\t\tJCExpression zeroLiteral = maker.Literal(CTC_INT, 0);\n\t\t\t\tJCExpression arg = maker.Apply(jceBlank, chainDots(builderType, builderVariable, data.getPluralName() + (mapMode ? \"$key\" : \"\"), \"get\"), List.of(zeroLiteral));\n\t\t\t\tList<JCExpression> args;\n\t\t\t\tif (mapMode) {\n\t\t\t\t\tJCExpression zeroLiteralClone = maker.Literal(CTC_INT, 0);\n\t\t\t\t\tJCExpression arg2 = maker.Apply(jceBlank, chainDots(builderType, builderVariable, data.getPluralName() + (mapMode ? \"$value\" : \"\"), \"get\"), List.of(zeroLiteralClone));\n\t\t\t\t\targs = List.of(arg, arg2);\n\t\t\t\t} else {\n\t\t\t\t\targs = List.of(arg);\n\t\t\t\t}\n\t\t\t\tJCExpression invoke = maker.Apply(jceBlank, chainDots(builderType, \"java\", \"util\", \"Collections\", singletonCollectionMethod), args);\n\t\t\t\tassignStat = maker.Exec(maker.Assign(maker.Ident(data.getPluralName()), invoke));\n\t\t\t}\n\t\t\tJCStatement breakStat = maker.Break(null);\n\t\t\tJCCase singletonCase = maker.Case(maker.Literal(CTC_INT, 1), List.of(assignStat, breakStat));\n\t\t\tcases.append(singletonCase);\n\t\t}\n\t\t\n\t\t{ // default:\n\t\t\tList<JCStatement> statements = createJavaUtilSimpleCreationAndFillStatements(maker, data, builderType, mapMode, false, true, emptyCollectionMethod == null, targetType, source, builderVariable);\n\t\t\tJCCase defaultCase = maker.Case(null, statements);\n\t\t\tcases.append(defaultCase);\n\t\t}\n\t\t\n\t\tJCStatement switchStat = maker.Switch(getSize(maker,  builderType, mapMode ? builderType.toName(data.getPluralName() + \"$key\") : data.getPluralName(), true, false, builderVariable), cases.toList());\n\t\tJCExpression localShadowerType = chainDotsString(builderType, data.getTargetFqn());\n\t\tlocalShadowerType = addTypeArgs(mapMode ? 2 : 1, false, builderType, localShadowerType, data.getTypeArgs(), source);\n\t\tJCStatement varDefStat = maker.VarDef(maker.Modifiers(0L), data.getPluralName(), localShadowerType, null);\n\t\treturn List.of(varDefStat, switchStat);\n\t}\n\t\n\tprotected JCStatement createConstructBuilderVarIfNeeded(JavacTreeMaker maker, SingularData data, JavacNode builderType, boolean mapMode, JavacNode source) {\n\t\tList<JCExpression> jceBlank = List.nil();\n\t\t\n\t\tName v1Name = mapMode ? builderType.toName(data.getPluralName() + \"$key\") : data.getPluralName();\n\t\tName v2Name = mapMode ? builderType.toName(data.getPluralName() + \"$value\") : null;\n\t\tJCExpression thisDotField = maker.Select(maker.Ident(builderType.toName(\"this\")), v1Name);\n\t\tJCExpression cond = maker.Binary(CTC_EQUAL, thisDotField, maker.Literal(CTC_BOT, null));\n\t\tthisDotField = maker.Select(maker.Ident(builderType.toName(\"this\")), v1Name);\n\t\tJCExpression v1Type = chainDots(builderType, \"java\", \"util\", \"ArrayList\");\n\t\tv1Type = addTypeArgs(1, false, builderType, v1Type, data.getTypeArgs(), source);\n\t\tJCExpression constructArrayList = maker.NewClass(null, jceBlank, v1Type, jceBlank, null);\n\t\tJCStatement initV1 = maker.Exec(maker.Assign(thisDotField, constructArrayList));\n\t\tJCStatement thenPart;\n\t\tif (mapMode) {\n\t\t\tthisDotField = maker.Select(maker.Ident(builderType.toName(\"this\")), v2Name);\n\t\t\tJCExpression v2Type = chainDots(builderType, \"java\", \"util\", \"ArrayList\");\n\t\t\tList<JCExpression> tArgs = data.getTypeArgs();\n\t\t\tif (tArgs != null && tArgs.tail != null) tArgs = tArgs.tail;\n\t\t\telse tArgs = List.nil();\n\t\t\tv2Type = addTypeArgs(1, false, builderType, v2Type, tArgs, source);\n\t\t\tconstructArrayList = maker.NewClass(null, jceBlank, v2Type, jceBlank, null);\n\t\t\tJCStatement initV2 = maker.Exec(maker.Assign(thisDotField, constructArrayList));\n\t\t\tthenPart = maker.Block(0, List.of(initV1, initV2));\n\t\t} else {\n\t\t\tthenPart = initV1;\n\t\t}\n\t\treturn maker.If(cond, thenPart, null);\n\t}\n\t\n\tprotected List<JCStatement> createJavaUtilSimpleCreationAndFillStatements(JavacTreeMaker maker, SingularData data, JavacNode builderType, boolean mapMode, boolean defineVar, boolean addInitialCapacityArg, boolean nullGuard, String targetType, JavacNode source, String builderVariable) {\n\t\tList<JCExpression> jceBlank = List.nil();\n\t\tName thisName = builderType.toName(builderVariable);\n\t\t\n\t\tJCStatement createStat; {\n\t\t\t // pluralName = new java.util.TargetType(initialCap);\n\t\t\tList<JCExpression> constructorArgs = List.nil();\n\t\t\tif (addInitialCapacityArg) {\n\t\t\t\tName varName = mapMode ? builderType.toName(data.getPluralName() + \"$key\") : data.getPluralName();\n\t\t\t\t// this.varName.size() < MAX_POWER_OF_2 ? 1 + this.varName.size() + (this.varName.size() - 3) / 3 : Integer.MAX_VALUE;\n\t\t\t\t// lessThanCutOff = this.varName.size() < MAX_POWER_OF_2\n\t\t\t\tJCExpression lessThanCutoff = maker.Binary(CTC_LESS_THAN, getSize(maker, builderType, varName, nullGuard, true, builderVariable), maker.Literal(CTC_INT, 0x40000000));\n\t\t\t\tJCExpression integerMaxValue = genJavaLangTypeRef(builderType, \"Integer\", \"MAX_VALUE\");\n\t\t\t\tJCExpression sizeFormulaLeft = maker.Binary(CTC_PLUS, maker.Literal(CTC_INT, 1), getSize(maker, builderType, varName, nullGuard, true, builderVariable));\n\t\t\t\tJCExpression sizeFormulaRightLeft = maker.Parens(maker.Binary(CTC_MINUS, getSize(maker, builderType, varName, nullGuard, true, builderVariable), maker.Literal(CTC_INT, 3)));\n\t\t\t\tJCExpression sizeFormulaRight = maker.Binary(CTC_DIV, sizeFormulaRightLeft, maker.Literal(CTC_INT, 3));\n\t\t\t\tJCExpression sizeFormula = maker.Binary(CTC_PLUS, sizeFormulaLeft, sizeFormulaRight);\n\t\t\t\tconstructorArgs = List.<JCExpression>of(maker.Conditional(lessThanCutoff, sizeFormula, integerMaxValue));\n\t\t\t}\n\t\t\t\n\t\t\tJCExpression targetTypeExpr = chainDots(builderType, \"java\", \"util\", targetType);\n\t\t\ttargetTypeExpr = addTypeArgs(mapMode ? 2 : 1, false, builderType, targetTypeExpr, data.getTypeArgs(), source);\n\t\t\tJCExpression constructorCall = maker.NewClass(null, jceBlank, targetTypeExpr, constructorArgs, null);\n\t\t\tif (defineVar) {\n\t\t\t\tJCExpression localShadowerType = chainDotsString(builderType, data.getTargetFqn());\n\t\t\t\tlocalShadowerType = addTypeArgs(mapMode ? 2 : 1, false, builderType, localShadowerType, data.getTypeArgs(), source);\n\t\t\t\tcreateStat = maker.VarDef(maker.Modifiers(0L), data.getPluralName(), localShadowerType, constructorCall);\n\t\t\t} else {\n\t\t\t\tcreateStat = maker.Exec(maker.Assign(maker.Ident(data.getPluralName()), constructorCall));\n\t\t\t}\n\t\t}\n\t\t\n\t\tJCStatement fillStat; {\n\t\t\tif (mapMode) {\n\t\t\t\t// for (int $i = 0; $i < this.pluralname$key.size(); i++) pluralname.put(this.pluralname$key.get($i), this.pluralname$value.get($i));\n\t\t\t\tName ivar = builderType.toName(\"$i\");\n\t\t\t\tName keyVarName = builderType.toName(data.getPluralName() + \"$key\");\n\t\t\t\tJCExpression pluralnameDotPut = maker.Select(maker.Ident(data.getPluralName()), builderType.toName(\"put\"));\n\t\t\t\tJCExpression arg1 = maker.Apply(jceBlank, chainDots(builderType, builderVariable, data.getPluralName() + \"$key\", \"get\"), List.<JCExpression>of(maker.Ident(ivar)));\n\t\t\t\tJCExpression arg2 = maker.Apply(jceBlank, chainDots(builderType, builderVariable, data.getPluralName() + \"$value\", \"get\"), List.<JCExpression>of(maker.Ident(ivar)));\n\t\t\t\t// [jdk9] We add an unneccessary (V) cast here. Not doing so gives an error in javac (build 9-ea+156-jigsaw-nightly-h6072-20170212):\n\t\t\t\t//   error: method put in interface Map<K#2,V#2> cannot be applied to given types;\n\t\t\t\targ2 = maker.TypeCast(createTypeArgs(2, false, builderType, data.getTypeArgs(), source).get(1), arg2);\n\t\t\t\tJCStatement putStatement = maker.Exec(maker.Apply(jceBlank, pluralnameDotPut, List.of(arg1, arg2)));\n\t\t\t\tJCStatement forInit = maker.VarDef(maker.Modifiers(0L), ivar, maker.TypeIdent(CTC_INT), maker.Literal(CTC_INT, 0));\n\t\t\t\tJCExpression checkExpr = maker.Binary(CTC_LESS_THAN, maker.Ident(ivar), getSize(maker, builderType, keyVarName, nullGuard, true, builderVariable));\n\t\t\t\tJCExpression incrementExpr = maker.Unary(CTC_POSTINC, maker.Ident(ivar));\n\t\t\t\tfillStat = maker.ForLoop(List.of(forInit), checkExpr, List.of(maker.Exec(incrementExpr)), putStatement);\n\t\t\t} else {\n\t\t\t\t// pluralname.addAll(this.pluralname);\n\t\t\t\tJCExpression thisDotPluralName = maker.Select(maker.Ident(thisName), data.getPluralName());\n\t\t\t\tfillStat = maker.Exec(maker.Apply(jceBlank, maker.Select(maker.Ident(data.getPluralName()), builderType.toName(\"addAll\")), List.of(thisDotPluralName)));\n\t\t\t}\n\t\t\tif (nullGuard) {\n\t\t\t\tJCExpression thisDotField = maker.Select(maker.Ident(thisName), mapMode ? builderType.toName(data.getPluralName() + \"$key\") : data.getPluralName());\n\t\t\t\tJCExpression nullCheck = maker.Binary(CTC_NOT_EQUAL, thisDotField, maker.Literal(CTC_BOT, null));\n\t\t\t\tfillStat = maker.If(nullCheck, fillStat, null);\n\t\t\t}\n\t\t}\n\t\tJCStatement unmodifiableStat; {\n\t\t\t// pluralname = Collections.unmodifiableInterfaceType(pluralname);\n\t\t\tJCExpression arg = maker.Ident(data.getPluralName());\n\t\t\tJCExpression invoke = maker.Apply(jceBlank, chainDots(builderType, \"java\", \"util\", \"Collections\", \"unmodifiable\" + data.getTargetSimpleType()), List.of(arg));\n\t\t\tunmodifiableStat = maker.Exec(maker.Assign(maker.Ident(data.getPluralName()), invoke));\n\t\t}\n\t\t\n\t\treturn List.of(createStat, fillStat, unmodifiableStat);\n\t}\n}\n"
  },
  {
    "path": "src/core/lombok/javac/package-info.java",
    "content": "/*\n * Copyright (C) 2009-2014 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/**\n * Includes the javac specific implementations of the lombok AST and annotation introspection support.\n * \n * <strong>NB: This package is not public API in the sense that contents of this package,\n *    even public classes / methods / etc, may change in point releases.</strong>\n */\npackage lombok.javac;\n"
  },
  {
    "path": "src/core/lombok/package-info.java",
    "content": "/*\n * Copyright (C) 2009-2017 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/**\n * This package contains all the annotations and support classes you need as a user of lombok.\n * All other packages are only relevant to those who are extending lombok for their own uses, except:\n * \n * <ul>\n * <li>{@code lombok.extern.*} – These packages contains lombok annotations that solve boilerplate issues for libraries not part of the JRE itself.\n * <li>{@code lombok.experimental} – This package contains lombok features that are new or likely to change before committing to long-term support.\n * </ul>\n * \n * @see <a href=\"https://projectlombok.org/features/all\">Lombok features</a>\n */\npackage lombok;\n"
  },
  {
    "path": "src/core/lombok/val.java",
    "content": "/*\n * Copyright (C) 2010-2017 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\n/**\n * Use {@code val} as the type of any local variable declaration (even in a for-each statement), and the type will be inferred from the initializing expression.\n * For example: {@code val x = 10.0;} will infer {@code double}, and {@code val y = new ArrayList<String>();} will infer {@code ArrayList<String>}. The local variable\n * will also be made final.\n * <p>\n * Note that this is an annotation type because {@code val x = 10;} will be desugared to {@code @val final int x = 10;}\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/val\">the project lombok features page for &#64;val</a>.\n */\npublic @interface val {\n}\n"
  },
  {
    "path": "src/core/lombok/var.java",
    "content": "/*\n * Copyright (C) 2010-2018 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\n/**\n * Use {@code var} as the type of any local variable declaration (even in a {@code for} statement), and the type will be inferred from the initializing expression\n * (any further assignments to the variable are not involved in this type inference).\n * <p>\n * For example: {@code var x = 10.0;} will infer {@code double}, and {@code var y = new ArrayList<String>();} will infer {@code ArrayList<String>}.\n * <p>\n * Note that this is an annotation type because {@code var x = 10;} will be desugared to {@code @var int x = 10;}\n * <p>\n * Complete documentation is found at <a href=\"https://projectlombok.org/features/var\">the project lombok features page for &#64;var</a>.\n */\npublic @interface var {\n}\n"
  },
  {
    "path": "src/core8/lombok/javac/apt/Javac9BaseFileObjectWrapper.java",
    "content": "/*\n * Copyright (C) 2010-2018 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\npackage lombok.javac.apt;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.OutputStream;\nimport java.io.Reader;\nimport java.io.Writer;\nimport java.net.URI;\nimport java.nio.file.Path;\n\nimport javax.lang.model.element.Modifier;\nimport javax.lang.model.element.NestingKind;\n\nimport com.sun.tools.javac.file.BaseFileManager;\n\nclass Javac9BaseFileObjectWrapper extends com.sun.tools.javac.file.PathFileObject {\n\tprivate final LombokFileObject delegate;\n\t\n\tpublic Javac9BaseFileObjectWrapper(BaseFileManager fileManager, Path path, LombokFileObject delegate) {\n\t\tsuper(fileManager, path);\n\t\tthis.delegate = delegate;\n\t}\n\t\n\t@Override public boolean isNameCompatible(String simpleName, Kind kind) {\n\t\treturn delegate.isNameCompatible(simpleName, kind);\n\t}\n\t\n\t@Override public URI toUri() {\n\t\treturn delegate.toUri();\n\t}\n\t\n\t@SuppressWarnings(\"all\")\n\t@Override public String getName() {\n\t\treturn delegate.getName();\n\t}\n\t\n\t@Override public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {\n\t\treturn delegate.getCharContent(ignoreEncodingErrors);\n\t}\n\t\n\t@Override public InputStream openInputStream() throws IOException {\n\t\treturn delegate.openInputStream();\n\t}\n\t\n\t@Override public Reader openReader(boolean ignoreEncodingErrors) throws IOException {\n\t\treturn delegate.openReader(ignoreEncodingErrors);\n\t}\n\t\n\t@Override public Writer openWriter() throws IOException {\n\t\treturn delegate.openWriter();\n\t}\n\t\n\t@Override public OutputStream openOutputStream() throws IOException {\n\t\treturn delegate.openOutputStream();\n\t}\n\t\n\t@Override public long getLastModified() {\n\t\treturn delegate.getLastModified();\n\t}\n\t\n\t@Override public boolean delete() {\n\t\treturn delegate.delete();\n\t}\n\t\n\t@Override public Kind getKind() {\n\t\treturn delegate.getKind();\n\t}\n\t\n\t@Override public NestingKind getNestingKind() {\n\t\treturn delegate.getNestingKind();\n\t}\n\t\n\t@Override public Modifier getAccessLevel() {\n\t\treturn delegate.getAccessLevel();\n\t}\n\t\n\t@Override public boolean equals(Object obj) {\n\t\tif (!(obj instanceof Javac9BaseFileObjectWrapper)) return false;\n\t\treturn delegate.equals(((Javac9BaseFileObjectWrapper)obj).delegate);\n\t}\n\t\n\t@Override public int hashCode() {\n\t\treturn delegate.hashCode();\n\t}\n\t\n\t@Override public String toString() {\n\t\treturn delegate.toString();\n\t}\n}"
  },
  {
    "path": "src/core8/lombok/javac/apt/Javac9Compiler.java",
    "content": "/*\n * Copyright (C) 2010-2020 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\npackage lombok.javac.apt;\n\nimport java.io.IOException;\nimport java.lang.reflect.Method;\nimport java.net.URI;\nimport java.nio.file.Path;\nimport java.nio.file.Paths;\nimport java.util.Iterator;\nimport java.util.Set;\n\nimport javax.tools.FileObject;\nimport javax.tools.JavaFileManager;\nimport javax.tools.JavaFileObject;\nimport javax.tools.JavaFileObject.Kind;\n\nimport com.sun.tools.javac.file.BaseFileManager;\n\nclass Java9Compiler implements lombok.javac.apt.LombokFileObjects.Compiler {\n\tprivate final BaseFileManager fileManager;\n\t\n\tpublic Java9Compiler(JavaFileManager jfm) {\n\t\tfileManager = asBaseFileManager(jfm);\n\t}\n\t\n\t@Override public JavaFileObject wrap(LombokFileObject fileObject) {\n\t\tPath p; try {\n\t\t\tp = toPath(fileObject);\n\t\t} catch (Exception e) {\n\t\t\tp = null;\n\t\t}\n\t\t\n\t\t// J9BFOW extends javac's internal file base impl of javax.tools.JavaFileObject.\n\t\t// J9JFOW just straight implements it. Probably J9JFOW is fine, but we decided to extend java's internal impl possibly for a reason.\n\t\t// Some exotic build environments don't _have_ file objects and crash with FileNotFoundEx, so if that happens, let's try the alternative.\n\t\tif (p != null) return new Javac9BaseFileObjectWrapper(fileManager, p, fileObject);\n\t\treturn new Javac9JavaFileObjectWrapper(fileObject);\n\t}\n\t\n\t@Override public Method getDecoderMethod() {\n\t\treturn null;\n\t}\n\t\n\tprivate static Path toPath(LombokFileObject fileObject) {\n\t\tURI uri = fileObject.toUri();\n\t\tif (uri.getScheme() == null) {\n\t\t\turi = URI.create(\"file:///\" + uri);\n\t\t}\n\t\ttry {\n\t\t\treturn Paths.get(uri);\n\t\t} catch (IllegalArgumentException e) {\n\t\t\tthrow new IllegalArgumentException(\"Problems in URI '\" + uri + \"' (\" + fileObject.toUri() + \")\", e);\n\t\t}\n\t}\n\t\n\tprivate static BaseFileManager asBaseFileManager(JavaFileManager jfm) {\n\t\tif (jfm instanceof BaseFileManager) {\n\t\t\treturn (BaseFileManager) jfm;\n\t\t}\n\t\treturn new FileManagerWrapper(jfm);\n\t}\n\t\n\tstatic class FileManagerWrapper extends BaseFileManager {\n\t\tJavaFileManager manager;\n\t\t\n\t\tpublic FileManagerWrapper(JavaFileManager manager) {\n\t\t\tsuper(null);\n\t\t\tthis.manager = manager;\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic int isSupportedOption(String option) {\n\t\t\treturn manager.isSupportedOption(option);\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic ClassLoader getClassLoader(Location location) {\n\t\t\treturn manager.getClassLoader(location);\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic Iterable<JavaFileObject> list(Location location, String packageName, Set<Kind> kinds, boolean recurse) throws IOException {\n\t\t\treturn manager.list(location, packageName, kinds, recurse);\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic String inferBinaryName(Location location, JavaFileObject file) {\n\t\t\treturn manager.inferBinaryName(location, file);\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic boolean isSameFile(FileObject a, FileObject b) {\n\t\t\treturn manager.isSameFile(a, b);\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic boolean handleOption(String current, Iterator<String> remaining) {\n\t\t\treturn manager.handleOption(current, remaining);\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic boolean hasLocation(Location location) {\n\t\t\treturn manager.hasLocation(location);\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic JavaFileObject getJavaFileForInput(Location location, String className, Kind kind) throws IOException {\n\t\t\treturn manager.getJavaFileForInput(location, className, kind);\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic JavaFileObject getJavaFileForOutput(Location location, String className, Kind kind, FileObject sibling) throws IOException {\n\t\t\treturn manager.getJavaFileForOutput(location, className, kind, sibling);\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic FileObject getFileForInput(Location location, String packageName, String relativeName) throws IOException {\n\t\t\treturn manager.getFileForInput(location, packageName, relativeName);\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic FileObject getFileForOutput(Location location, String packageName, String relativeName, FileObject sibling) throws IOException {\n\t\t\treturn manager.getFileForOutput(location, packageName, relativeName, sibling);\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic void flush() throws IOException {\n\t\t\tmanager.flush();\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic void close() throws IOException {\n\t\t\tmanager.close();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/core9/module-info.java",
    "content": "/*\n * Copyright (C) 2018 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nmodule lombok {\n\trequires java.compiler;\n\trequires java.instrument;\n\trequires jdk.unsupported;\n\t\n\texports lombok;\n\texports lombok.experimental;\n\texports lombok.extern.apachecommons;\n\texports lombok.extern.flogger;\n\texports lombok.extern.jackson;\n\texports lombok.extern.java;\n\texports lombok.extern.jbosslog;\n\texports lombok.extern.log4j;\n\texports lombok.extern.slf4j;\n\t\n\texports lombok.launch to lombok.mapstruct;\n\t\n\tprovides javax.annotation.processing.Processor with lombok.launch.AnnotationProcessorHider.AnnotationProcessor;\n}\n"
  },
  {
    "path": "src/delombok/lombok/delombok/Delombok.java",
    "content": "/*\n * Copyright (C) 2009-2019 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.delombok;\n\nimport java.io.BufferedWriter;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.io.OutputStream;\nimport java.io.OutputStreamWriter;\nimport java.io.PrintStream;\nimport java.io.UnsupportedEncodingException;\nimport java.io.Writer;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.Method;\nimport java.net.URI;\nimport java.net.URLDecoder;\nimport java.nio.charset.Charset;\nimport java.nio.charset.UnsupportedCharsetException;\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.IdentityHashMap;\nimport java.util.LinkedHashMap;\nimport java.util.LinkedHashSet;\nimport java.util.List;\nimport java.util.ListIterator;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.regex.Pattern;\n\nimport javax.annotation.processing.AbstractProcessor;\nimport javax.tools.DiagnosticListener;\nimport javax.tools.JavaFileManager;\nimport javax.tools.JavaFileObject;\n\nimport lombok.Lombok;\nimport lombok.javac.CommentCatcher;\nimport lombok.javac.Javac;\nimport lombok.javac.JavacAugments;\nimport lombok.javac.LombokOptions;\nimport lombok.javac.apt.LombokProcessor;\nimport lombok.permit.Permit;\n\nimport com.sun.tools.javac.code.Symtab;\nimport com.sun.tools.javac.comp.Todo;\nimport com.sun.tools.javac.file.BaseFileManager;\nimport com.sun.tools.javac.main.Arguments;\nimport com.sun.tools.javac.main.JavaCompiler;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCCompilationUnit;\nimport com.sun.tools.javac.tree.JCTree.JCImport;\nimport com.sun.tools.javac.util.Context;\nimport com.sun.tools.javac.util.ListBuffer;\nimport com.zwitserloot.cmdreader.CmdReader;\nimport com.zwitserloot.cmdreader.Description;\nimport com.zwitserloot.cmdreader.Excludes;\nimport com.zwitserloot.cmdreader.FullName;\nimport com.zwitserloot.cmdreader.InvalidCommandLineException;\nimport com.zwitserloot.cmdreader.Mandatory;\nimport com.zwitserloot.cmdreader.Sequential;\nimport com.zwitserloot.cmdreader.Shorthand;\n\npublic class Delombok {\n\tprivate Charset charset = Charset.defaultCharset();\n\tprivate Context context = new Context();\n\tprivate Writer presetWriter;\n\t\n\tpublic void setWriter(Writer writer) {\n\t\tthis.presetWriter = writer;\n\t}\n\t\n\tprivate PrintStream feedback = System.err;\n\tprivate boolean verbose;\n\tprivate boolean noCopy;\n\tprivate boolean onlyChanged;\n\tprivate boolean force = false;\n\tprivate boolean disablePreview;\n\tprivate String classpath, sourcepath, bootclasspath, modulepath;\n\tprivate LinkedHashMap<File, File> fileToBase = new LinkedHashMap<File, File>();\n\tprivate List<File> filesToParse = new ArrayList<File>();\n\tprivate Map<String, String> formatPrefs = new HashMap<String, String>();\n\tprivate List<AbstractProcessor> preLombokProcessors = new ArrayList<AbstractProcessor>();\n\tprivate List<AbstractProcessor> additionalAnnotationProcessors = new ArrayList<AbstractProcessor>();\n\t\n\t/** If null, output to standard out. */\n\tprivate File output = null;\n\t\n\tprivate static class CmdArgs {\n\t\t@Shorthand(\"v\")\n\t\t@Description(\"Print the name of each file as it is being delombok-ed.\")\n\t\t@Excludes(\"quiet\")\n\t\tprivate boolean verbose;\n\t\t\n\t\t@Shorthand(\"f\")\n\t\t@Description(\"Sets formatting rules. Use --format-help to list all available rules. Unset format rules are inferred by scanning the source for usages.\")\n\t\tprivate List<String> format = new ArrayList<String>();\n\t\t\n\t\t@FullName(\"format-help\")\n\t\tprivate boolean formatHelp;\n\t\t\n\t\t@Shorthand(\"q\")\n\t\t@Description(\"No warnings or errors will be emitted to standard error\")\n\t\t@Excludes(\"verbose\")\n\t\tprivate boolean quiet;\n\t\t\n\t\t@Shorthand(\"e\")\n\t\t@Description(\"Sets the encoding of your source files. Defaults to the system default charset. Example: \\\"UTF-8\\\"\")\n\t\tprivate String encoding;\n\t\t\n\t\t@Shorthand(\"p\")\n\t\t@Description(\"Print delombok-ed code to standard output instead of saving it in target directory\")\n\t\tprivate boolean print;\n\t\t\n\t\t@Shorthand(\"d\")\n\t\t@Description(\"Directory to save delomboked files to\")\n\t\t@Mandatory(onlyIfNot={\"print\", \"help\", \"format-help\"})\n\t\tprivate String target;\n\t\t\n\t\t@Shorthand(\"c\")\n\t\t@Description(\"Classpath (analogous to javac -cp option)\")\n\t\tprivate String classpath;\n\t\t\n\t\t@Shorthand(\"s\")\n\t\t@Description(\"Sourcepath (analogous to javac -sourcepath option)\")\n\t\tprivate String sourcepath;\n\t\t\n\t\t@Description(\"override Bootclasspath (analogous to javac -bootclasspath option)\")\n\t\tprivate String bootclasspath;\n\t\t\n\t\t@Description(\"Module path (analogous to javac --module-path option)\")\n\t\t@FullName(\"module-path\")\n\t\tprivate String modulepath;\n\t\t\n\t\t@Description(\"Files to delombok. Provide either a file, or a directory. If you use a directory, all files in it (recursive) are delombok-ed\")\n\t\t@Sequential\n\t\tprivate List<String> input = new ArrayList<String>();\n\t\t\n\t\t@Description(\"Lombok will only delombok source files. Without this option, non-java, non-class files are copied to the target directory.\")\n\t\t@Shorthand(\"n\")\n\t\tprivate boolean nocopy;\n\t\t\n\t\t@Description(\"Output only changed files (implies -n)\")\n\t\tprivate boolean onlyChanged;\n\t\t\n\t\t@Description(\"By default lombok enables preview features if available (introduced in JDK 12). With this option, lombok won't do that.\")\n\t\t@FullName(\"disable-preview\")\n\t\tprivate boolean disablePreview;\n\t\t\n\t\tprivate boolean help;\n\t}\n\t\n\tstatic {\n\t\tLombokProcessor.addOpensForLombok();\n\t}\n\t\n\tprivate static String indentAndWordbreak(String in, int indent, int maxLen) {\n\t\tStringBuilder out = new StringBuilder();\n\t\tStringBuilder line = new StringBuilder();\n\t\tStringBuilder word = new StringBuilder();\n\t\tint len = in.length();\n\t\tfor (int i = 0; i < (len + 1); i++) {\n\t\t\tchar c = i == len ? ' ' : in.charAt(i);\n\t\t\tif (c == ' ') {\n\t\t\t\tif (line.length() + word.length() < maxLen) {\n\t\t\t\t\tline.append(word);\n\t\t\t\t} else {\n\t\t\t\t\tif (out.length() > 0) out.append(\"\\n\");\n\t\t\t\t\tfor (int j = 0; j < indent; j++) out.append(\" \");\n\t\t\t\t\tout.append(line);\n\t\t\t\t\tline.setLength(0);\n\t\t\t\t\tline.append(word.toString().trim());\n\t\t\t\t}\n\t\t\t\tword.setLength(0);\n\t\t\t}\n\t\t\tif (i < len) word.append(c);\n\t\t}\n\t\tif (line.length() > 0) {\n\t\t\tif (out.length() > 0) out.append(\"\\n\");\n\t\t\tfor (int j = 0; j < indent; j++) out.append(\" \");\n\t\t\tout.append(line);\n\t\t}\n\t\t\n\t\treturn out.toString();\n\t}\n\t\n\tstatic String getPathOfSelf() {\n\t\tString url = Delombok.class.getResource(\"Delombok.class\").toString();\n\t\tif (url.endsWith(\"lombok/delombok/Delombok.class\")) {\n\t\t\turl = urlDecode(url.substring(0, url.length() - \"lombok/delombok/Delombok.class\".length()));\n\t\t} else if (url.endsWith(\"lombok/delombok/Delombok.SCL.lombok\")) {\n\t\t\turl = urlDecode(url.substring(0, url.length() - \"lombok/delombok/Delombok.SCL.lombok\".length()));\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t\tif (url.startsWith(\"jar:file:\") && url.endsWith(\"!/\")) return url.substring(9, url.length() - 2);\n\t\tif (url.startsWith(\"file:\")) return url.substring(5);\n\t\treturn null;\n\t}\n\t\n\tprivate static String urlDecode(String in) {\n\t\ttry {\n\t\t\treturn URLDecoder.decode(in, \"UTF-8\");\n\t\t} catch (UnsupportedEncodingException e) {\n\t\t\tthrow new InternalError(\"UTF-8 not supported\");\n\t\t}\n\t}\n\t\n\tpublic static void main(String[] rawArgs) {\n\t\ttry {\n\t\t\trawArgs = fileExpand(rawArgs);\n\t\t} catch (IOException e) {\n\t\t\tSystem.out.println(e.getMessage());\n\t\t\tSystem.exit(1);\n\t\t}\n\t\t\n\t\tCmdReader<CmdArgs> reader = CmdReader.of(CmdArgs.class);\n\t\tCmdArgs args;\n\t\ttry {\n\t\t\targs = reader.make(rawArgs);\n\t\t} catch (InvalidCommandLineException e) {\n\t\t\tSystem.err.println(\"ERROR: \" + e.getMessage());\n\t\t\tSystem.err.println(cmdHelp(reader));\n\t\t\tSystem.exit(1);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (args.help || (args.input.isEmpty() && !args.formatHelp)) {\n\t\t\tif (!args.help) System.err.println(\"ERROR: no files or directories to delombok specified.\");\n\t\t\tSystem.err.println(cmdHelp(reader));\n\t\t\tSystem.exit(args.help ? 0 : 1);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tDelombok delombok = new Delombok();\n\t\t\n\t\tif (args.quiet) delombok.setFeedback(new PrintStream(new OutputStream() {\n\t\t\t@Override public void write(int b) throws IOException {\n\t\t\t\t//dummy - do nothing.\n\t\t\t}\n\t\t}));\n\t\t\n\t\tif (args.formatHelp) {\n\t\t\tSystem.out.println(\"Available format keys (to use, -f key:value -f key2:value2 -f ... ):\");\n\t\t\tfor (Map.Entry<String, String> e : FormatPreferences.getKeysAndDescriptions().entrySet()) {\n\t\t\t\tSystem.out.print(\"  \");\n\t\t\t\tSystem.out.print(e.getKey());\n\t\t\t\tSystem.out.println(\":\");\n\t\t\t\tSystem.out.println(indentAndWordbreak(e.getValue(), 4, 70));\n\t\t\t}\n\t\t\tSystem.out.println(\"Example: -f indent:4 -f emptyLines:indent\");\n\t\t\tSystem.out.println(\"The '-f pretty' option is shorthand for '-f suppressWarnings:skip -f generated:skip -f danceAroundIdeChecks:skip -f generateDelombokComment:skip -f javaLangAsFQN:skip'\");\n\t\t\tSystem.exit(0);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\ttry {\n\t\t\tdelombok.setFormatPreferences(formatOptionsToMap(args.format));\n\t\t} catch (InvalidFormatOptionException e) {\n\t\t\tSystem.out.println(e.getMessage() + \" Try --format-help.\");\n\t\t\tSystem.exit(1);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (args.encoding != null) {\n\t\t\ttry {\n\t\t\t\tdelombok.setCharset(args.encoding);\n\t\t\t} catch (UnsupportedCharsetException e) {\n\t\t\t\tSystem.err.println(\"ERROR: Not a known charset: \" + args.encoding);\n\t\t\t\tSystem.exit(1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (args.verbose) delombok.setVerbose(true);\n\t\tif (args.nocopy || args.onlyChanged) delombok.setNoCopy(true);\n\t\tif (args.disablePreview) delombok.setDisablePreview(true);\n\t\tif (args.onlyChanged) delombok.setOnlyChanged(true);\n\t\tif (args.print) {\n\t\t\tdelombok.setOutputToStandardOut();\n\t\t} else {\n\t\t\tdelombok.setOutput(new File(args.target));\n\t\t}\n\t\t\n\t\tif (args.classpath != null) delombok.setClasspath(args.classpath);\n\t\tif (args.sourcepath != null) delombok.setSourcepath(args.sourcepath);\n\t\tif (args.bootclasspath != null) delombok.setBootclasspath(args.bootclasspath);\n\t\tif (args.modulepath != null) delombok.setModulepath(args.modulepath);\n\t\t\n\t\ttry {\n\t\t\tfor (String in : args.input) {\n\t\t\t\tFile f = new File(in).getAbsoluteFile();\n\t\t\t\tif (f.isFile()) {\n\t\t\t\t\tdelombok.addFile(f.getParentFile(), f.getName());\n\t\t\t\t} else if (f.isDirectory()) {\n\t\t\t\t\tdelombok.addDirectory(f);\n\t\t\t\t} else if (!f.exists()) {\n\t\t\t\t\tif (!args.quiet) System.err.println(\"WARNING: does not exist - skipping: \" + f);\n\t\t\t\t} else {\n\t\t\t\t\tif (!args.quiet) System.err.println(\"WARNING: not a standard file or directory - skipping: \" + f);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tdelombok.delombok();\n\t\t} catch (Exception e) {\n\t\t\tif (!args.quiet) {\n\t\t\t\tString msg = e.getMessage();\n\t\t\t\tif (msg != null && msg.startsWith(\"DELOMBOK: \")) System.err.println(msg.substring(\"DELOMBOK: \".length()));\n\t\t\t\telse e.printStackTrace();\n\t\t\t\tSystem.exit(1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate static String cmdHelp(CmdReader<CmdArgs> reader) {\n\t\tString x = reader.generateCommandLineHelp(\"delombok\");\n\t\tint idx = x.indexOf('\\n');\n\t\treturn x.substring(0, idx) + \"\\n You can use @filename.args to read arguments from the file 'filename.args'.\\n\" + x.substring(idx);\n\t}\n\t\n\tprivate static String[] fileExpand(String[] rawArgs) throws IOException {\n\t\tString[] out = rawArgs;\n\t\tint offset = 0;\n\t\tfor (int i = 0; i < rawArgs.length; i++) {\n\t\t\tif (rawArgs[i].length() > 0 && rawArgs[i].charAt(0) == '@') {\n\t\t\t\tString[] parts = readArgsFromFile(rawArgs[i].substring(1));\n\t\t\t\tString[] newOut = new String[out.length + parts.length - 1];\n\t\t\t\tSystem.arraycopy(out, 0, newOut, 0, i + offset);\n\t\t\t\tSystem.arraycopy(parts, 0, newOut, i + offset, parts.length);\n\t\t\t\tSystem.arraycopy(out, i + offset + 1, newOut, i + offset + parts.length, out.length - (i + offset + 1));\n\t\t\t\toffset += parts.length - 1;\n\t\t\t\tout = newOut;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn out;\n\t}\n\t\n\tprivate static String[] readArgsFromFile(String file) throws IOException {\n\t\tInputStream in = new FileInputStream(file);\n\t\tStringBuilder s = new StringBuilder();\n\t\ttry {\n\t\t\tInputStreamReader isr = new InputStreamReader(in, \"UTF-8\");\n\t\t\ttry {\n\t\t\t\tchar[] c = new char[4096];\n\t\t\t\twhile (true) {\n\t\t\t\t\tint r = isr.read(c);\n\t\t\t\t\tif (r == -1) break;\n\t\t\t\t\ts.append(c, 0, r);\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tisr.close();\n\t\t\t}\n\t\t} finally {\n\t\t\tin.close();\n\t\t}\n\t\t\n\t\tList<String> x = new ArrayList<String>();\n\t\tStringBuilder a = new StringBuilder();\n\t\tint state = 1;\n\t\tfor (int i = 0; i < s.length(); i++) {\n\t\t\tchar c = s.charAt(i);\n\t\t\tif (state < 0) {\n\t\t\t\tstate = -state;\n\t\t\t\tif (c != '\\n') a.append(c);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (state == 1) {\n\t\t\t\tif (c == '\\\\') {\n\t\t\t\t\tstate = -1;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (c == '\"') {\n\t\t\t\t\tstate = 2;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (c == '\\'') {\n\t\t\t\t\tstate = 3;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (Character.isWhitespace(c)) {\n\t\t\t\t\tString aa = a.toString();\n\t\t\t\t\tif (!aa.isEmpty()) x.add(aa);\n\t\t\t\t\ta.setLength(0);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\ta.append(c);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (state == 2) {\n\t\t\t\tif (c == '\\\\') {\n\t\t\t\t\tstate = -2;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (c == '\"') {\n\t\t\t\t\tstate = 1;\n\t\t\t\t\tx.add(a.toString());\n\t\t\t\t\ta.setLength(0);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\ta.append(c);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (state == 3) {\n\t\t\t\tif (c == '\\'') {\n\t\t\t\t\tstate = 1;\n\t\t\t\t\tx.add(a.toString());\n\t\t\t\t\ta.setLength(0);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\ta.append(c);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tif (state == 1) {\n\t\t\tString aa = a.toString();\n\t\t\tif (!aa.isEmpty()) x.add(aa);\n\t\t} else if (state < 0) {\n\t\t\tthrow new IOException(\"Unclosed backslash escape in @ file\");\n\t\t} else if (state == 2) {\n\t\t\tthrow new IOException(\"Unclosed \\\" in @ file\");\n\t\t} else if (state == 3) {\n\t\t\tthrow new IOException(\"Unclosed ' in @ file\");\n\t\t}\n\t\t\n\t\treturn x.toArray(new String[0]);\n\t}\n\t\n\tpublic static class InvalidFormatOptionException extends Exception {\n\t\tpublic InvalidFormatOptionException(String msg) {\n\t\t\tsuper(msg);\n\t\t}\n\t}\n\t\n\tpublic static Map<String, String> formatOptionsToMap(List<String> formatOptions) throws InvalidFormatOptionException {\n\t\tboolean prettyEnabled = false;\n\t\tMap<String, String> formatPrefs = new HashMap<String, String>();\n\t\tfor (String format : formatOptions) {\n\t\t\tint idx = format.indexOf(':');\n\t\t\tif (idx == -1) {\n\t\t\t\tif (format.equalsIgnoreCase(\"pretty\")) {\n\t\t\t\t\tprettyEnabled = true;\n\t\t\t\t\tcontinue;\n\t\t\t\t} else {\n\t\t\t\t\tthrow new InvalidFormatOptionException(\"Format keys need to be 2 values separated with a colon.\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tString key = format.substring(0, idx);\n\t\t\tString value = format.substring(idx + 1);\n\t\t\tboolean valid = false;\n\t\t\tfor (String k : FormatPreferences.getKeysAndDescriptions().keySet()) {\n\t\t\t\tif (k.equalsIgnoreCase(key)) {\n\t\t\t\t\tvalid = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!valid) throw new InvalidFormatOptionException(\"Unknown format key: '\" + key + \"'.\");\n\t\t\tformatPrefs.put(key.toLowerCase(), value);\n\t\t}\n\t\t\n\t\tif (prettyEnabled) {\n\t\t\tif (!formatPrefs.containsKey(\"suppresswarnings\")) formatPrefs.put(\"suppresswarnings\", \"skip\");\n\t\t\tif (!formatPrefs.containsKey(\"generated\")) formatPrefs.put(\"generated\", \"skip\");\n\t\t\tif (!formatPrefs.containsKey(\"dancearoundidechecks\")) formatPrefs.put(\"dancearoundidechecks\", \"skip\");\n\t\t\tif (!formatPrefs.containsKey(\"generatedelombokcomment\")) formatPrefs.put(\"generatedelombokcomment\", \"skip\");\n\t\t\tif (!formatPrefs.containsKey(\"javalangasfqn\")) formatPrefs.put(\"javalangasfqn\", \"skip\");\n\t\t}\n\t\t\n\t\treturn formatPrefs;\n\t}\n\t\n\tpublic void setFormatPreferences(Map<String, String> prefs) {\n\t\tthis.formatPrefs = prefs;\n\t}\n\t\n\tpublic void setCharset(String charsetName) throws UnsupportedCharsetException {\n\t\tif (charsetName == null) {\n\t\t\tcharset = Charset.defaultCharset();\n\t\t\treturn;\n\t\t}\n\t\tcharset = Charset.forName(charsetName);\n\t}\n\t\n\tpublic void setDiagnosticsListener(DiagnosticListener<JavaFileObject> diagnostics) {\n\t\tif (diagnostics != null) context.put(DiagnosticListener.class, diagnostics);\n\t}\n\t\n\tpublic void setForceProcess(boolean force) {\n\t\tthis.force = force;\n\t}\n\t\n\tpublic void setFeedback(PrintStream feedback) {\n\t\tthis.feedback = feedback;\n\t}\n\t\n\tpublic void setClasspath(String classpath) {\n\t\tthis.classpath = classpath;\n\t}\n\t\n\tpublic void setSourcepath(String sourcepath) {\n\t\tthis.sourcepath = sourcepath;\n\t}\n\t\n\tpublic void setBootclasspath(String bootclasspath) {\n\t\tthis.bootclasspath = bootclasspath;\n\t}\n\t\n\tpublic void setVerbose(boolean verbose) {\n\t\tthis.verbose = verbose;\n\t}\n\t\n\tpublic void setNoCopy(boolean noCopy) {\n\t\tthis.noCopy = noCopy;\n\t}\n\t\n\tpublic void setDisablePreview(boolean disablePreview) {\n\t\tthis.disablePreview = disablePreview;\n\t}\n\t\n\tpublic void setOnlyChanged(boolean onlyChanged) {\n\t\tthis.onlyChanged = onlyChanged;\n\t}\n\t\n\tpublic void setOutput(File dir) {\n\t\tif (dir.isFile() || (!dir.isDirectory() && dir.getName().endsWith(\".java\"))) throw new IllegalArgumentException(\n\t\t\t\t\"DELOMBOK: delombok will only write to a directory. \" +\n\t\t\t\t\"If you want to delombok a single file, use -p to output to standard output, then redirect this to a file:\\n\" +\n\t\t\t\t\"delombok MyJavaFile.java -p >MyJavaFileDelombok.java\");\n\t\toutput = dir;\n\t}\n\t\n\tpublic void setOutputToStandardOut() {\n\t\tthis.output = null;\n\t}\n\t\n\tpublic void setModulepath(String modulepath) {\n\t\tthis.modulepath = modulepath;\n\t}\n\t\n\tpublic void addDirectory(File base) throws IOException {\n\t\taddDirectory0(false, base, \"\", 0);\n\t}\n\t\n\tpublic void addDirectory1(boolean copy, File base, String name) throws IOException {\n\t\tFile f = new File(base, name);\n\t\tif (f.isFile()) {\n\t\t\tString extension = getExtension(f);\n\t\t\tif (extension.equals(\"java\")) addFile(base, name);\n\t\t\telse if (extension.equals(\"class\")) skipClass(name);\n\t\t\telse copy(copy, base, name);\n\t\t} else if (!f.exists()) {\n\t\t\tfeedback.printf(\"Skipping %s because it does not exist.\\n\", canonical(f));\n\t\t} else if (!f.isDirectory()) {\n\t\t\tfeedback.printf(\"Skipping %s because it is a special file type.\\n\", canonical(f));\n\t\t}\n\t}\n\t\n\tprivate void addDirectory0(boolean inHiddenDir, File base, String suffix, int loop) throws IOException {\n\t\tFile dir = suffix.isEmpty() ? base : new File(base, suffix);\n\t\t\n\t\tif (dir.isDirectory()) {\n\t\t\tboolean thisDirIsHidden = !inHiddenDir && new File(canonical(dir)).getName().startsWith(\".\");\n\t\t\tif (loop >= 100) {\n\t\t\t\tfeedback.printf(\"Over 100 subdirectories? I'm guessing there's a loop in your directory structure. Skipping: %s\\n\", suffix);\n\t\t\t} else {\n\t\t\t\tFile[] list = dir.listFiles();\n\t\t\t\tif (list.length > 0) {\n\t\t\t\t\tif (thisDirIsHidden && !noCopy && output != null) {\n\t\t\t\t\t\tfeedback.printf(\"Only processing java files (not copying non-java files) in %s because it's a hidden directory.\\n\", canonical(dir));\n\t\t\t\t\t}\n\t\t\t\t\tfor (File f : list) {\n\t\t\t\t\t\taddDirectory0(inHiddenDir || thisDirIsHidden, base, suffix + (suffix.isEmpty() ? \"\" : File.separator) + f.getName(), loop + 1);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (!thisDirIsHidden && !noCopy && !inHiddenDir && output != null && !suffix.isEmpty()) {\n\t\t\t\t\t\tFile emptyDir = new File(output, suffix);\n\t\t\t\t\t\temptyDir.mkdirs();\n\t\t\t\t\t\tif (verbose) feedback.printf(\"Creating empty directory: %s\\n\", canonical(emptyDir));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\taddDirectory1(!inHiddenDir && !noCopy, base, suffix);\n\t\t}\n\t}\n\t\n\tprivate void skipClass(String fileName) {\n\t\tif (verbose) feedback.printf(\"Skipping class file: %s\\n\", fileName);\n\t}\n\t\n\tprivate void copy(boolean copy, File base, String fileName) throws IOException {\n\t\tif (output == null) {\n\t\t\tfeedback.printf(\"Skipping resource file: %s\\n\", fileName);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (!copy) {\n\t\t\tif (verbose) feedback.printf(\"Skipping resource file: %s\\n\", fileName);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (verbose) feedback.printf(\"Copying resource file: %s\\n\", fileName);\n\t\tbyte[] b = new byte[65536];\n\t\tFile inFile = new File(base, fileName);\n\t\tFileInputStream in = new FileInputStream(inFile);\n\t\ttry {\n\t\t\tFile outFile = new File(output, fileName);\n\t\t\toutFile.getParentFile().mkdirs();\n\t\t\tFileOutputStream out = new FileOutputStream(outFile);\n\t\t\ttry {\n\t\t\t\twhile (true) {\n\t\t\t\t\tint r = in.read(b);\n\t\t\t\t\tif (r == -1) break;\n\t\t\t\t\tout.write(b, 0, r);\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tout.close();\n\t\t\t}\n\t\t} finally {\n\t\t\tin.close();\n\t\t}\n\t}\n\t\n\tpublic void addFile(File base, String fileName) throws IOException {\n\t\tif (output != null && canonical(base).equals(canonical(output))) throw new IOException(\n\t\t\t\t\"DELOMBOK: Output file and input file refer to the same filesystem location. Specify a separate path for output.\");\n\t\t\n\t\tFile f = new File(base, fileName);\n\t\tfilesToParse.add(f);\n\t\tfileToBase.put(f, base);\n\t}\n\t\n\tpublic void addPreLombokProcessors(AbstractProcessor processor) {\n\t\tpreLombokProcessors.add(processor);\n\t}\n\n\tpublic void addAdditionalAnnotationProcessor(AbstractProcessor processor) {\n\t\tadditionalAnnotationProcessors.add(processor);\n\t}\n\t\n\tprivate static <T> com.sun.tools.javac.util.List<T> toJavacList(List<T> list) {\n\t\tcom.sun.tools.javac.util.List<T> out = com.sun.tools.javac.util.List.nil();\n\t\tListIterator<T> li = list.listIterator(list.size());\n\t\twhile (li.hasPrevious()) out = out.prepend(li.previous());\n\t\treturn out;\n\t}\n\t\n\tprivate static final Field MODULE_FIELD = getModuleField();\n\tprivate static Field getModuleField() {\n\t\ttry {\n\t\t\treturn Permit.getField(JCCompilationUnit.class, \"modle\");\n\t\t} catch (NoSuchFieldException e) {\n\t\t\treturn null;\n\t\t} catch (SecurityException e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic boolean delombok() throws IOException {\n\t\tLombokOptions options = LombokOptionsFactory.getDelombokOptions(context);\n\t\toptions.deleteLombokAnnotations();\n\t\toptions.putJavacOption(\"ENCODING\", charset.name());\n\t\tif (classpath != null) options.putJavacOption(\"CLASSPATH\", unpackClasspath(classpath));\n\t\tif (sourcepath != null) options.putJavacOption(\"SOURCEPATH\", sourcepath);\n\t\tif (bootclasspath != null) options.putJavacOption(\"BOOTCLASSPATH\", unpackClasspath(bootclasspath));\n\t\toptions.setFormatPreferences(new FormatPreferences(formatPrefs));\n\t\toptions.put(\"compilePolicy\", \"check\");\n\t\t\n\t\tif (Javac.getJavaCompilerVersion() >= 9) {\n\t\t\tArguments args = Arguments.instance(context);\n\t\t\tList<String> argsList = new ArrayList<String>();\n\t\t\tif (classpath != null) {\n\t\t\t\targsList.add(\"--class-path\");\n\t\t\t\targsList.add(options.get(\"--class-path\"));\n\t\t\t}\n\t\t\tif (sourcepath != null) {\n\t\t\t\targsList.add(\"--source-path\");\n\t\t\t\targsList.add(options.get(\"--source-path\"));\n\t\t\t}\n\t\t\tif (bootclasspath != null) {\n\t\t\t\targsList.add(\"--boot-class-path\");\n\t\t\t\targsList.add(options.get(\"--boot-class-path\"));\n\t\t\t}\n\t\t\tif (charset != null) {\n\t\t\t\targsList.add(\"-encoding\");\n\t\t\t\targsList.add(charset.name());\n\t\t\t}\n\t\t\tString pathToSelfJar = getPathOfSelf();\n\t\t\tif (pathToSelfJar != null) {\n\t\t\t\targsList.add(\"--module-path\");\n\t\t\t\targsList.add((modulepath == null || modulepath.isEmpty()) ? pathToSelfJar : (pathToSelfJar + File.pathSeparator + modulepath));\n\t\t\t} else if (modulepath != null && !modulepath.isEmpty()) {\n\t\t\t\targsList.add(\"--module-path\");\n\t\t\t\targsList.add(modulepath);\n\t\t\t}\n\t\t\t\n\t\t\tif (!disablePreview && Javac.getJavaCompilerVersion() >= 11) argsList.add(\"--enable-preview\");\n\t\t\tif (Javac.getJavaCompilerVersion() >= 21) argsList.add(\"-proc:full\");\n\t\t\t\n\t\t\tif (Javac.getJavaCompilerVersion() < 15) {\n\t\t\t\tString[] argv = argsList.toArray(new String[0]);\n\t\t\t\targs.init(\"javac\", argv);\n\t\t\t} else {\n\t\t\t\targs.init(\"javac\", argsList);\n\t\t\t}\n\t\t\toptions.put(\"diags.legacy\", \"TRUE\");\n\t\t\toptions.put(\"allowStringFolding\", \"FALSE\");\n\t\t} else {\n\t\t\tif (modulepath != null && !modulepath.isEmpty()) throw new IllegalStateException(\"DELOMBOK: Option --module-path requires usage of JDK9 or higher.\");\n\t\t}\n\t\t\n\t\tCommentCatcher catcher = CommentCatcher.create(context, Javac.getJavaCompilerVersion() >= 13);\n\t\tJavaCompiler compiler = catcher.getCompiler();\n\t\t\n\t\tList<JCCompilationUnit> roots = new ArrayList<JCCompilationUnit>();\n\t\tMap<JCCompilationUnit, File> baseMap = new IdentityHashMap<JCCompilationUnit, File>();\n\t\t\n\t\tSet<AbstractProcessor> processors = new LinkedHashSet<AbstractProcessor>();\n\t\tprocessors.addAll(preLombokProcessors);\n\t\tprocessors.add(new lombok.javac.apt.LombokProcessor());\n\t\tprocessors.addAll(additionalAnnotationProcessors);\n\t\t\n\t\tif (Javac.getJavaCompilerVersion() >= 9) {\n\t\t\tJavaFileManager jfm_ = context.get(JavaFileManager.class);\n\t\t\tif (jfm_ instanceof BaseFileManager) {\n\t\t\t\tArguments args = Arguments.instance(context);\n\t\t\t\t((BaseFileManager) jfm_).setContext(context); // reinit with options\n\t\t\t\t((BaseFileManager) jfm_).handleOptions(args.getDeferredFileManagerOptions());\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (Javac.getJavaCompilerVersion() < 9) {\n\t\t\tcompiler.initProcessAnnotations(processors);\n\t\t} else {\n\t\t\tcompiler.initProcessAnnotations(processors, Collections.<JavaFileObject>emptySet(), Collections.<String>emptySet());\n\t\t}\n\t\t\n\t\tObject unnamedModule = null;\n\t\tif (Javac.getJavaCompilerVersion() >= 9) unnamedModule = Symtab.instance(context).unnamedModule;\n\t\t\n\t\tfor (File fileToParse : filesToParse) {\n\t\t\tJCCompilationUnit unit = compiler.parse(fileToParse.getAbsolutePath());\n\t\t\tif (Javac.getJavaCompilerVersion() >= 9) try {\n\t\t\t\tMODULE_FIELD.set(unit, unnamedModule);\n\t\t\t} catch (IllegalAccessException e) {\n\t\t\t\tthrow new RuntimeException(e);\n\t\t\t}\n\t\t\tbaseMap.put(unit, fileToBase.get(fileToParse));\n\t\t\troots.add(unit);\n\t\t}\n\t\tif (compiler.errorCount() > 0) {\n\t\t\t// At least one parse error. No point continuing (a real javac run doesn't either).\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tfor (JCCompilationUnit unit : roots) {\n\t\t\tcatcher.setComments(unit, new DocCommentIntegrator().integrate(catcher.getComments(unit), unit));\n\t\t}\n\t\t\n\t\tif (Javac.getJavaCompilerVersion() >= 9) {\n\t\t\tcompiler.initModules(com.sun.tools.javac.util.List.from(roots.toArray(new JCCompilationUnit[0])));\n\t\t}\n\t\tcom.sun.tools.javac.util.List<JCCompilationUnit> trees = compiler.enterTrees(toJavacList(roots));\n\t\t\n\t\tJavaCompiler delegate;\n\t\tif (Javac.getJavaCompilerVersion() < 9) {\n\t\t\tdelegate = compiler.processAnnotations(trees, com.sun.tools.javac.util.List.<String>nil());\n\t\t} else {\n\t\t\tdelegate = compiler;\n\t\t\tCollection<String> c = com.sun.tools.javac.util.List.nil();\n\t\t\tcompiler.processAnnotations(trees, c);\n\t\t}\n\t\t\n\t\tObject care = callAttributeMethodOnJavaCompiler(delegate, delegate.todo);\n\t\t\n\t\tcallFlowMethodOnJavaCompiler(delegate, care);\n\t\t\n\t\tFormatPreferences fps = new FormatPreferences(formatPrefs);\n\t\tfor (JCCompilationUnit unit : roots) {\n\t\t\tDelombokResult result = new DelombokResult(catcher.getComments(unit), catcher.getTextBlockStarts(unit), unit, force || options.isChanged(unit), fps);\n\t\t\tif (onlyChanged && !result.isChanged() && !options.isChanged(unit)) {\n\t\t\t\tif (verbose) feedback.printf(\"File: %s [%s]\\n\", unit.sourcefile.getName(), \"unchanged (skipped)\");\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tListBuffer<JCTree> newDefs = new ListBuffer<JCTree>();\n\t\t\tfor (JCTree def : unit.defs) {\n\t\t\t\tif (def instanceof JCImport) {\n\t\t\t\t\tBoolean b = JavacAugments.JCImport_deletable.get((JCImport) def);\n\t\t\t\t\tif (b == null || !b.booleanValue()) newDefs.append(def);\n\t\t\t\t} else {\n\t\t\t\t\tnewDefs.append(def);\n\t\t\t\t}\n\t\t\t}\n\t\t\tunit.defs = newDefs.toList();\n\t\t\tif (verbose) feedback.printf(\"File: %s [%s%s]\\n\", unit.sourcefile.getName(), result.isChanged() ? \"delomboked\" : \"unchanged\", force && !options.isChanged(unit) ? \" (forced)\" : \"\");\n\t\t\tWriter rawWriter;\n\t\t\tif (presetWriter != null) rawWriter = createUnicodeEscapeWriter(presetWriter);\n\t\t\telse if (output == null) rawWriter = createStandardOutWriter();\n\t\t\telse rawWriter = createFileWriter(output, baseMap.get(unit), unit.sourcefile.toUri());\n\t\t\tBufferedWriter writer = new BufferedWriter(rawWriter);\n\t\t\ttry {\n\t\t\t\tresult.print(writer);\n\t\t\t} finally {\n\t\t\t\tif (output != null) {\n\t\t\t\t\twriter.close();\n\t\t\t\t} else {\n\t\t\t\t\twriter.flush();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdelegate.close();\n\t\t\n\t\treturn true;\n\t}\n\t\n\tprivate String unpackClasspath(String cp) {\n\t\tString[] parts = cp.split(Pattern.quote(File.pathSeparator));\n\t\tStringBuilder out = new StringBuilder();\n\t\tfor (String p : parts) {\n\t\t\tif (!p.endsWith(\"*\")) {\n\t\t\t\tif (out.length() > 0) out.append(File.pathSeparator);\n\t\t\t\tout.append(p);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tFile f = new File(p.substring(0, p.length() - 2));\n\t\t\tFile[] files = f.listFiles();\n\t\t\tif (files == null) continue;\n\t\t\tfor (File file : files) {\n\t\t\t\tif (file.isFile()) {\n\t\t\t\t\tif (out.length() > 0) out.append(File.pathSeparator);\n\t\t\t\t\tout.append(p, 0, p.length() - 1);\n\t\t\t\t\tout.append(file.getName());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn out.toString();\n\t}\n\t\n\tprivate static Method attributeMethod;\n\t/** Method is needed because the call signature has changed between javac6 and javac7; no matter what we compile against, using delombok in the other means VerifyErrors. */\n\tprivate static Object callAttributeMethodOnJavaCompiler(JavaCompiler compiler, Todo arg) {\n\t\tif (attributeMethod == null) {\n\t\t\ttry {\n\t\t\t\tattributeMethod = Permit.getMethod(JavaCompiler.class, \"attribute\", java.util.Queue.class);\n\t\t\t} catch (NoSuchMethodException e) {\n\t\t\t\ttry {\n\t\t\t\t\tattributeMethod = Permit.getMethod(JavaCompiler.class, \"attribute\", com.sun.tools.javac.util.ListBuffer.class);\n\t\t\t\t} catch (NoSuchMethodException e2) {\n\t\t\t\t\tthrow Lombok.sneakyThrow(e2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn Permit.invokeSneaky(attributeMethod, compiler, arg);\n\t}\n\t\n\tprivate static Method flowMethod;\n\t/** Method is needed because the call signature has changed between javac6 and javac7; no matter what we compile against, using delombok in the other means VerifyErrors. */\n\tprivate static void callFlowMethodOnJavaCompiler(JavaCompiler compiler, Object arg) {\n\t\tif (flowMethod == null) {\n\t\t\ttry {\n\t\t\t\tflowMethod = Permit.getMethod(JavaCompiler.class, \"flow\", java.util.Queue.class);\n\t\t\t} catch (NoSuchMethodException e) {\n\t\t\t\ttry {\n\t\t\t\t\tflowMethod = Permit.getMethod(JavaCompiler.class, \"flow\", com.sun.tools.javac.util.List.class);\n\t\t\t\t} catch (NoSuchMethodException e2) {\n\t\t\t\t\tthrow Lombok.sneakyThrow(e2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tPermit.invokeSneaky(flowMethod, compiler, arg);\n\t}\n\t\n\tprivate static String canonical(File dir) {\n\t\ttry {\n\t\t\treturn dir.getCanonicalPath();\n\t\t} catch (Exception e) {\n\t\t\treturn dir.getAbsolutePath();\n\t\t}\n\t}\n\t\n\tprivate static String getExtension(File dir) {\n\t\tString name = dir.getName();\n\t\tint idx = name.lastIndexOf('.');\n\t\treturn idx == -1 ? \"\" : name.substring(idx+1);\n\t}\n\t\n\tprivate Writer createFileWriter(File outBase, File inBase, URI file) throws IOException {\n\t\tURI base = inBase.toURI();\n\t\tURI relative = base.relativize(base.resolve(file));\n\t\tFile outFile;\n\t\tif (relative.isAbsolute()) {\n\t\t\toutFile = new File(outBase, new File(relative).getName());\n\t\t} else {\n\t\t\toutFile = new File(outBase, relative.getPath());\n\t\t}\n\t\t\n\t\toutFile.getParentFile().mkdirs();\n\t\tFileOutputStream out = new FileOutputStream(outFile);\n\t\treturn createUnicodeEscapeWriter(out);\n\t}\n\t\n\tprivate Writer createStandardOutWriter() {\n\t\treturn createUnicodeEscapeWriter(System.out);\n\t}\n\t\n\tprivate Writer createUnicodeEscapeWriter(Writer writer) {\n\t\treturn new UnicodeEscapeWriter(writer, charset);\n\t}\n\t\n\tprivate Writer createUnicodeEscapeWriter(OutputStream out) {\n\t\treturn new UnicodeEscapeWriter(new OutputStreamWriter(out, charset), charset);\n\t}\n}\n"
  },
  {
    "path": "src/delombok/lombok/delombok/DelombokApp.java",
    "content": "/*\n * Copyright (C) 2009-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.delombok;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.lang.reflect.InvocationTargetException;\nimport java.net.MalformedURLException;\nimport java.net.URL;\nimport java.util.Arrays;\nimport java.util.Enumeration;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.jar.JarEntry;\nimport java.util.jar.JarFile;\n\nimport lombok.core.LombokApp;\nimport lombok.permit.Permit;\nimport lombok.spi.Provides;\n\n@Provides\npublic class DelombokApp extends LombokApp {\n\t@Override public int runApp(List<String> args) throws Exception {\n\t\ttry {\n\t\t\tClass.forName(\"com.sun.tools.javac.main.JavaCompiler\");\n\t\t\trunDirectly(args);\n\t\t\treturn 0;\n\t\t} catch (ClassNotFoundException e) {\n\t\t\tClass<?> delombokClass = loadDelombok(args);\n\t\t\tif (delombokClass == null) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tPermit.invoke(Permit.getMethod(loadDelombok(args), \"main\", String[].class), null, new Object[] {args.toArray(new String[0])});\n\t\t\t} catch (InvocationTargetException e1) {\n\t\t\t\tThrowable t = e1.getCause();\n\t\t\t\tif (t instanceof Error) throw (Error) t;\n\t\t\t\tif (t instanceof Exception) throw (Exception) t;\n\t\t\t\tthrow e1;\n\t\t\t}\n\t\t\treturn 0;\n\t\t}\n\t}\n\t\n\tpublic static Class<?> loadDelombok(List<String> args) throws Exception {\n\t\t//tools.jar is probably not on the classpath. We're going to try and find it, and then load the rest via a ClassLoader that includes tools.jar.\n\t\tfinal File toolsJar = findToolsJar();\n\t\tif (toolsJar == null) {\n\t\t\tString examplePath = \"/path/to/tools.jar\";\n\t\t\tif (File.separator.equals(\"\\\\\")) examplePath = \"C:\\\\path\\\\to\\\\tools.jar\";\n\t\t\tStringBuilder sb = new StringBuilder();\n\t\t\tfor (String arg : args) {\n\t\t\t\tif (sb.length() > 0) sb.append(' ');\n\t\t\t\tif (arg.contains(\" \")) {\n\t\t\t\t\tsb.append('\"').append(arg).append('\"');\n\t\t\t\t} else {\n\t\t\t\t\tsb.append(arg);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tSystem.err.printf(\"Can't find tools.jar. Rerun delombok as: java -cp lombok.jar%1$s%2$s lombok.launch.Main delombok %3$s\\n\",\n\t\t\t\t\tFile.pathSeparator, examplePath, sb.toString());\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\t// The jar file is used for the lifetime of the classLoader, therefore the lifetime of delombok.\n\t\t// Since we only read from it, not closing it should not be a problem.\n\t\t@SuppressWarnings({\"resource\", \"all\"}) final JarFile toolsJarFile = new JarFile(toolsJar);\n\t\t\n\t\tClassLoader loader = new ClassLoader(DelombokApp.class.getClassLoader()) {\n\t\t\tprivate Class<?> loadStreamAsClass(String name, boolean resolve, InputStream in) throws ClassNotFoundException {\n\t\t\t\ttry {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tbyte[] b = new byte[65536];\n\t\t\t\t\t\tByteArrayOutputStream out = new ByteArrayOutputStream();\n\t\t\t\t\t\twhile (true) {\n\t\t\t\t\t\t\tint r = in.read(b);\n\t\t\t\t\t\t\tif (r == -1) break;\n\t\t\t\t\t\t\tout.write(b, 0, r);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tin.close();\n\t\t\t\t\t\tbyte[] data = out.toByteArray();\n\t\t\t\t\t\tClass<?> c = defineClass(name, data, 0, data.length);\n\t\t\t\t\t\tif (resolve) resolveClass(c);\n\t\t\t\t\t\treturn c;\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tin.close();\n\t\t\t\t\t}\n\t\t\t\t} catch (Exception e2) {\n\t\t\t\t\tthrow new ClassNotFoundException(name, e2);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t@Override protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {\n\t\t\t\tString rawName, altName; {\n\t\t\t\t\tString binName = name.replace(\".\", \"/\");\n\t\t\t\t\trawName = binName + \".class\";\n\t\t\t\t\taltName = binName + \".SCL.lombok\";\n\t\t\t\t}\n\t\t\t\tJarEntry entry = toolsJarFile.getJarEntry(rawName);\n\t\t\t\tif (entry == null) {\n\t\t\t\t\tif (name.startsWith(\"lombok.\")) {\n\t\t\t\t\t\tInputStream res = getParent().getResourceAsStream(rawName);\n\t\t\t\t\t\tif (res == null) res = getParent().getResourceAsStream(altName);\n\t\t\t\t\t\treturn loadStreamAsClass(name, resolve, res);\n\t\t\t\t\t}\n\t\t\t\t\treturn super.loadClass(name, resolve);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\ttry {\n\t\t\t\t\treturn loadStreamAsClass(name, resolve, toolsJarFile.getInputStream(entry));\n\t\t\t\t} catch (IOException e2) {\n\t\t\t\t\tthrow new ClassNotFoundException(name, e2);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t@Override public URL getResource(String name) {\n\t\t\t\tJarEntry entry = toolsJarFile.getJarEntry(name);\n\t\t\t\tif (entry == null) return super.getResource(name);\n\t\t\t\ttry {\n\t\t\t\t\treturn new URL(\"jar:file:\" + toolsJar.getAbsolutePath() + \"!\" + name);\n\t\t\t\t} catch (MalformedURLException ignore) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t@Override public Enumeration<URL> getResources(final String name) throws IOException {\n\t\t\t\tJarEntry entry = toolsJarFile.getJarEntry(name);\n\t\t\t\tfinal Enumeration<URL> parent = super.getResources(name);\n\t\t\t\tif (entry == null) return super.getResources(name);\n\t\t\t\treturn new Enumeration<URL>() {\n\t\t\t\t\tprivate boolean first = false;\n\t\t\t\t\t@Override public boolean hasMoreElements() {\n\t\t\t\t\t\treturn !first || parent.hasMoreElements();\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t@Override public URL nextElement() {\n\t\t\t\t\t\tif (!first) {\n\t\t\t\t\t\t\tfirst = true;\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\treturn new URL(\"jar:file:\" + toolsJar.getAbsolutePath() + \"!\" + name);\n\t\t\t\t\t\t\t} catch (MalformedURLException ignore) {\n\t\t\t\t\t\t\t\treturn parent.nextElement();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn parent.nextElement();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\t\t};\n\t\treturn loader.loadClass(\"lombok.delombok.Delombok\");\n\t}\n\t\n\tprivate void runDirectly(List<String> args) {\n\t\tDelombok.main(args.toArray(new String[0]));\n\t}\n\t\n\tprivate static File findToolsJar() {\n\t\ttry {\n\t\t\tFile toolsJar = findToolsJarViaRT();\n\t\t\tif (toolsJar != null) return toolsJar;\n\t\t} catch (Throwable ignore) {\n\t\t\t//fallthrough\n\t\t}\n\t\t\n\t\ttry {\n\t\t\tFile toolsJar = findToolsJarViaProperties();\n\t\t\tif (toolsJar != null) return toolsJar;\n\t\t} catch (Throwable ignore) {\n\t\t\t//fallthrough\n\t\t}\n\t\t\n\t\ttry {\n\t\t\tFile toolsJar = findToolsJarViaEnvironment();\n\t\t\treturn toolsJar;\n\t\t} catch (Throwable ignore) {\n\t\t\t//fallthrough\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\t\n\tprivate static File findToolsJarViaEnvironment() {\n\t\tfor (Map.Entry<String, String> s : System.getenv().entrySet()) {\n\t\t\tif (\"JAVA_HOME\".equalsIgnoreCase(s.getKey())) {\n\t\t\t\treturn extensiveCheckToolsJar(new File(s.getValue()));\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\t\n\tprivate static File findToolsJarViaProperties() {\n\t\tFile home = new File(System.getProperty(\"java.home\", \".\"));\n\t\treturn extensiveCheckToolsJar(home);\n\t}\n\t\n\tprivate static File extensiveCheckToolsJar(File base) {\n\t\tFile toolsJar = checkToolsJar(base);\n\t\tif (toolsJar != null) return toolsJar;\n\t\ttoolsJar = checkToolsJar(new File(base, \"lib\"));\n\t\tif (toolsJar != null) return toolsJar;\n\t\ttoolsJar = checkToolsJar(new File(base.getParentFile(), \"lib\"));\n\t\tif (toolsJar != null) return toolsJar;\n\t\ttoolsJar = checkToolsJar(new File(new File(base, \"jdk\"), \"lib\"));\n\t\tif (toolsJar != null) return toolsJar;\n\t\treturn null;\n\t}\n\t\n\tprivate static File findToolsJarViaRT() {\n\t\tString url = ClassLoader.getSystemClassLoader().getResource(\"java/lang/String.class\").toString();\n\t\tif (!url.startsWith(\"jar:file:\")) return null;\n\t\turl = url.substring(\"jar:file:\".length());\n\t\tint idx = url.indexOf('!');\n\t\tif (idx == -1) return null;\n\t\turl = url.substring(0, idx);\n\t\t\n\t\tFile toolsJar = checkToolsJar(new File(url).getParentFile());\n\t\tif (toolsJar != null) return toolsJar;\n\t\ttoolsJar = checkToolsJar(new File(new File(url).getParentFile().getParentFile().getParentFile(), \"lib\"));\n\t\tif (toolsJar != null) return toolsJar;\n\t\treturn null;\n\t}\n\t\n\tprivate static File checkToolsJar(File d) {\n\t\tif (d.getName().equals(\"tools.jar\") && d.isFile() && d.canRead()) return d;\n\t\td = new File(d, \"tools.jar\");\n\t\tif (d.getName().equals(\"tools.jar\") && d.isFile() && d.canRead()) return d;\n\t\treturn null;\n\t}\n\t\n\t@Override public String getAppName() {\n\t\treturn \"delombok\";\n\t}\n\t\n\t@Override public List<String> getAppAliases() {\n\t\treturn Arrays.asList(\"unlombok\");\n\t}\n\t\n\t@Override public String getAppDescription() {\n\t\treturn \"Applies lombok transformations without compiling your\\njava code (so, 'unpacks' lombok annotations and such).\";\n\t}\n}\n\n"
  },
  {
    "path": "src/delombok/lombok/delombok/DelombokResult.java",
    "content": "/*\n * Copyright (C) 2009-2019 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.delombok;\n\nimport java.io.IOException;\nimport java.io.Writer;\nimport java.util.Date;\nimport java.util.List;\n\nimport javax.tools.JavaFileObject;\n\nimport lombok.javac.CommentInfo;\n\nimport com.sun.tools.javac.tree.JCTree.JCCompilationUnit;\n\npublic class DelombokResult {\n\tprivate final List<CommentInfo> comments;\n\tprivate final List<Integer> textBlockStarts;\n\tprivate final JCCompilationUnit compilationUnit;\n\tprivate final boolean changed;\n\tprivate final FormatPreferences formatPreferences;\n\t\n\tpublic DelombokResult(List<CommentInfo> comments, List<Integer> textBlockStarts, JCCompilationUnit compilationUnit, boolean changed, FormatPreferences formatPreferences) {\n\t\tthis.comments = comments;\n\t\tthis.textBlockStarts = textBlockStarts;\n\t\tthis.compilationUnit = compilationUnit;\n\t\tthis.changed = changed;\n\t\tthis.formatPreferences = formatPreferences;\n\t}\n\t\n\tpublic void print(Writer out) throws IOException {\n\t\tif (!changed) {\n\t\t\tCharSequence content = getContent();\n\t\t\tif (content != null) {\n\t\t\t\tout.write(content.toString());\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (formatPreferences.generateDelombokComment()) {\n\t\t\tout.write(\"// Generated by delombok at \");\n\t\t\tout.write(String.valueOf(new Date()));\n\t\t\tout.write(System.getProperty(\"line.separator\"));\n\t\t}\n\t\t\n\t\tcom.sun.tools.javac.util.List<CommentInfo> comments_;\n\t\tint[] textBlockStarts_;\n\t\tif (comments instanceof com.sun.tools.javac.util.List) comments_ = (com.sun.tools.javac.util.List<CommentInfo>) comments;\n\t\telse comments_ = com.sun.tools.javac.util.List.from(comments.toArray(new CommentInfo[0]));\n\t\ttextBlockStarts_ = new int[textBlockStarts.size()];\n\t\tint idx = 0;\n\t\tfor (int tbs : textBlockStarts) textBlockStarts_[idx++] = tbs;\n\t\tFormatPreferences preferences = new FormatPreferenceScanner().scan(formatPreferences, getContent());\n\t\t//compilationUnit.accept(new PrettyCommentsPrinter(out, compilationUnit, comments_, preferences));\n\t\tcompilationUnit.accept(new PrettyPrinter(out, compilationUnit, comments_, textBlockStarts_, preferences));\n\t}\n\n\tprivate CharSequence getContent() throws IOException {\n\t\tJavaFileObject sourceFile = compilationUnit.getSourceFile();\n\t\tif (sourceFile == null) return null;\n\t\treturn sourceFile.getCharContent(true);\n\t}\n\t\n\tpublic boolean isChanged() {\n\t\treturn changed;\n\t}\n}"
  },
  {
    "path": "src/delombok/lombok/delombok/DocCommentIntegrator.java",
    "content": "/*\n * Copyright (C) 2009-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.delombok;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.NavigableMap;\nimport java.util.TreeMap;\nimport java.util.regex.Pattern;\n\nimport com.sun.tools.javac.parser.Tokens.Comment;\nimport com.sun.tools.javac.tree.DocCommentTable;\nimport com.sun.tools.javac.tree.EndPosTable;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCCompilationUnit;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;\nimport com.sun.tools.javac.tree.TreeScanner;\n\nimport lombok.javac.CommentInfo;\nimport lombok.javac.Javac;\nimport lombok.javac.handlers.JavacHandlerUtil;\n\npublic class DocCommentIntegrator {\n\t/**\n\t * Returns the same comment list as when this integrator was created, minus all doc comments that have been successfully integrated into the compilation unit.\n\t */\n\tpublic List<CommentInfo> integrate(List<CommentInfo> comments, JCCompilationUnit unit) {\n\t\tList<CommentInfo> out = new ArrayList<CommentInfo>();\n\t\tCommentInfo lastExcisedComment = null;\n\t\tJCTree lastNode = null;\n\t\t\n\t\tNavigableMap<Integer, JCTree> positionMap = buildNodePositionMap(unit);\n\t\t\n\t\tfor (CommentInfo cmt : comments) {\n\t\t\tif (!cmt.isJavadoc()) {\n\t\t\t\tout.add(cmt);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tEntry<Integer, JCTree> entry = positionMap.ceilingEntry(cmt.endPos);\n\t\t\tif (entry == null) {\n\t\t\t\tout.add(cmt);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tJCTree node = entry.getValue();\n\t\t\tif (node == lastNode) {\n\t\t\t\tout.add(lastExcisedComment);\n\t\t\t}\n\t\t\tif (!attach(unit, node, cmt)) {\n\t\t\t\tout.add(cmt);\n\t\t\t} else {\n\t\t\t\tlastNode = node;\n\t\t\t\tlastExcisedComment = cmt;\n\t\t\t}\n\t\t}\n\t\treturn out;\n\t}\n\n\tprivate NavigableMap<Integer, JCTree> buildNodePositionMap(JCCompilationUnit unit) {\n\t\tfinal NavigableMap<Integer, JCTree> positionMap = new TreeMap<Integer, JCTree>();\n\t\tunit.accept(new TreeScanner() {\n\t\t\t@Override\n\t\t\tpublic void visitClassDef(JCClassDecl tree) {\n\t\t\t\tpositionMap.put(tree.pos, tree);\n\t\t\t\tsuper.visitClassDef(tree);\n\t\t\t}\n\t\t\t@Override\n\t\t\tpublic void visitMethodDef(JCMethodDecl tree) {\n\t\t\t\tpositionMap.put(tree.pos, tree);\n\t\t\t\tsuper.visitMethodDef(tree);\n\t\t\t}\n\t\t\t@Override\n\t\t\tpublic void visitVarDef(JCVariableDecl tree) {\n\t\t\t\tpositionMap.put(tree.pos, tree);\n\t\t\t\tsuper.visitVarDef(tree);\n\t\t\t}\n\t\t});\n\t\treturn positionMap;\n\t}\n\t\n\tprivate static final Pattern CONTENT_STRIPPER = Pattern.compile(\"^(?:\\\\s*\\\\*)?(.*?)$\", Pattern.MULTILINE);\n\t@SuppressWarnings(\"unchecked\") private boolean attach(JCCompilationUnit top, final JCTree node, CommentInfo cmt) {\n\t\tString docCommentContent = cmt.content;\n\t\tif (docCommentContent.startsWith(\"/**\")) docCommentContent = docCommentContent.substring(3);\n\t\tif (docCommentContent.endsWith(\"*/\")) docCommentContent = docCommentContent.substring(0, docCommentContent.length() - 2);\n\t\tdocCommentContent = CONTENT_STRIPPER.matcher(docCommentContent).replaceAll(\"$1\");\n\t\tdocCommentContent = docCommentContent.trim();\n\t\t\n\t\tif (Javac.getDocComments(top) == null) Javac.initDocComments(top);\n\t\t\n\t\tObject map_ = Javac.getDocComments(top);\n\t\tif (map_ instanceof Map) {\n\t\t\t((Map<JCTree, String>) map_).put(node, docCommentContent);\n\t\t\treturn true;\n\t\t} else if (Javac.instanceOfDocCommentTable(map_)) {\n\t\t\tCommentAttacher_8.attach(node, docCommentContent, cmt.pos, map_);\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\t/* Container for code which will cause class loader exceptions on javac below 8. By being in a separate class, we avoid the problem. */\n\tprivate static class CommentAttacher_8 {\n\t\tstatic void attach(final JCTree node, String docCommentContent, final int pos, Object map_) {\n\t\t\tfinal String docCommentContent_ = docCommentContent;\n\t\t\t((DocCommentTable) map_).putComment(node, new Comment() {\n\t\t\t\t@Override public String getText() {\n\t\t\t\t\treturn docCommentContent_;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t@Override public Comment stripIndent() {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t@Override public DiagnosticPosition getPos() {\n\t\t\t\t\treturn new DiagnosticPosition() {\n\t\t\t\t\t\tpublic JCTree getTree() {\n\t\t\t\t\t\t\treturn node;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tpublic int getStartPosition() {\n\t\t\t\t\t\t\treturn pos;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tpublic int getPreferredPosition() {\n\t\t\t\t\t\t\treturn pos;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t@SuppressWarnings(\"unused\") // We compile against very old versions of javac intentionally (to support old stuff), but this is the method for newer impls.\n\t\t\t\t\t\tpublic int getEndPosition(EndPosTable endPosTable) {\n\t\t\t\t\t\t\tint end = endPosTable == null ? 0 : endPosTable.getEndPos(node);\n\t\t\t\t\t\t\tif (end > pos) return end;\n\t\t\t\t\t\t\treturn pos + docCommentContent_.length();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tpublic int getEndPosition(Map<JCTree, Integer> endPosTable) {\n\t\t\t\t\t\t\tInteger end = endPosTable.get(node);\n\t\t\t\t\t\t\tif (end != null && end.intValue() > pos) return end.intValue();\n\t\t\t\t\t\t\treturn pos + docCommentContent_.length();\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t@Override public int getSourcePos(int index) {\n\t\t\t\t\treturn pos + index;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t@Override public CommentStyle getStyle() {\n\t\t\t\t\treturn (CommentStyle) Javac.getCommentStyle();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t@Override public boolean isDeprecated() {\n\t\t\t\t\treturn JavacHandlerUtil.nodeHasDeprecatedFlag(node);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/delombok/lombok/delombok/FormatPreferenceScanner.java",
    "content": "/*\n * Copyright (C) 2013 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.delombok;\n\nimport java.io.CharArrayReader;\nimport java.io.IOException;\nimport java.io.Reader;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * Scans a java source file to figure out certain format preferences.\n * Currently:<ul>\n * <li>Indent style (tab or 2-8 spaces are supported). Default: tab</li>\n * <li>Empty lines still carry the appropriate indent, vs. empty lines are empty. Default: empty</li>\n */\npublic class FormatPreferenceScanner {\n\t/** Checks validity of preferences, and returns with a non-null value if ALL format keys are available, thus negating the need for a scan. */\n\tprivate FormatPreferences tryEasy(FormatPreferences preferences, boolean force) {\n\t\tint count = 0;\n\t\tfor (Map.Entry<String, String> e : preferences.rawMap.entrySet()) {\n\t\t\tif (!\"scan\".equalsIgnoreCase(e.getValue())) count++;\n\t\t}\n\t\tif (force || count >= FormatPreferences.KEYS.size()) return preferences;\n\t\treturn null;\n\t}\n\t\n\tpublic FormatPreferences scan(FormatPreferences preferences, final CharSequence source) {\n\t\tFormatPreferences fps = tryEasy(preferences, source == null);\n\t\tif (fps != null) return fps;\n\t\t\n\t\ttry {\n\t\t\treturn scan_(preferences, new Reader() {\n\t\t\t\tint pos = 0;\n\t\t\t\tint max = source.length();\n\t\t\t\t\n\t\t\t\t@Override public void close() throws IOException {\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t@Override public int read(char[] b, int p, int len) throws IOException {\n\t\t\t\t\tint read = 0;\n\t\t\t\t\tif (pos >= max) return -1;\n\t\t\t\t\tfor (int i = p; i < p + len; i++) {\n\t\t\t\t\t\tb[i] = source.charAt(pos++);\n\t\t\t\t\t\tread++;\n\t\t\t\t\t\tif (pos == max) return read;\n\t\t\t\t\t}\n\t\t\t\t\treturn len;\n\t\t\t\t}\n\t\t\t});\n\t\t} catch (IOException e) {\n\t\t\tthrow new RuntimeException(e); //Can't happen; CAR doesn't throw these.\n\t\t}\n\t}\n\t\n\tpublic FormatPreferences scan(FormatPreferences preferences, char[] source) {\n\t\tFormatPreferences fps = tryEasy(preferences, source == null);\n\t\tif (fps != null) return fps;\n\t\t\n\t\ttry {\n\t\t\treturn scan_(preferences, new CharArrayReader(source));\n\t\t} catch (IOException e) {\n\t\t\tthrow new RuntimeException(e); //Can't happen; CAR doesn't throw these.\n\t\t}\n\t}\n\t\n\tpublic FormatPreferences scan(FormatPreferences preferences, Reader in) throws IOException {\n\t\tFormatPreferences fps = tryEasy(preferences, in == null);\n\t\tif (fps != null) return fps;\n\t\t\n\t\treturn scan_(preferences, in);\n\t}\n\t\n\tprivate static FormatPreferences scan_(FormatPreferences preferences, Reader in) throws IOException {\n\t\tint filledEmpties = 0;\n\t\tList<String> indents = new ArrayList<String>();\n\t\t\n\t\tchar[] buffer = new char[32700];\n\t\tint pos = 1;\n\t\tint end = 0;\n\t\t\n\t\tStringBuilder indentSoFar = new StringBuilder();\n\t\tboolean inIndent = true;\n\t\tboolean inComment = false;\n\t\tchar lastChar = ' ';\n\t\t\n\t\twhile (true) {\n\t\t\tif (pos >= end) {\n\t\t\t\tint r = in.read(buffer);\n\t\t\t\tif (r == -1) break;\n\t\t\t\tpos = 0;\n\t\t\t\tend = r;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tchar c = buffer[pos++];\n\t\t\tif (inComment) {\n\t\t\t\tif (lastChar == '*' && c == '/') inComment = false;\n\t\t\t\tlastChar = c;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tif (lastChar == '/' && c == '*') {\n\t\t\t\tinComment = true;\n\t\t\t\tlastChar = ' ';\n\t\t\t\tindentSoFar.setLength(0);\n\t\t\t\tinIndent = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tif (inIndent) {\n\t\t\t\tboolean w = Character.isWhitespace(c);\n\t\t\t\tif (c == '\\n') {\n\t\t\t\t\tif (indentSoFar.length() > 0 && indentSoFar.charAt(indentSoFar.length() -1) == '\\r') {\n\t\t\t\t\t\tindentSoFar.setLength(indentSoFar.length() - 1);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (indentSoFar.length() > 0) {\n\t\t\t\t\t\tfilledEmpties++;\n\t\t\t\t\t} else {\n\t\t\t\t\t}\n\t\t\t\t\tindents.add(indentSoFar.toString());\n\t\t\t\t\tindentSoFar.setLength(0);\n\t\t\t\t\tlastChar = c;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (w) {\n\t\t\t\t\tindentSoFar.append(c);\n\t\t\t\t\tlastChar = c;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (indentSoFar.length() > 0) {\n\t\t\t\t\tindents.add(indentSoFar.toString());\n\t\t\t\t\tindentSoFar.setLength(0);\n\t\t\t\t}\n\t\t\t\tlastChar = c;\n\t\t\t\tinIndent = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tlastChar = c;\n\t\t\tif (c == '\\n') {\n\t\t\t\tinIndent = true;\n\t\t\t\tindentSoFar.setLength(0);\n\t\t\t}\n\t\t}\n\t\t\n\t\tString indent = null;\n\t\tint lowestSpaceCount = Integer.MAX_VALUE;\n\t\tfor (String ind : indents) {\n\t\t\tif (ind.indexOf('\\t') > -1) {\n\t\t\t\tindent = \"\\t\";\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (ind.length() < 2 || ind.length() > 8) continue;\n\t\t\tif (ind.length() < lowestSpaceCount) lowestSpaceCount = ind.length();\n\t\t}\n\t\t\n\t\tif (lowestSpaceCount == Integer.MAX_VALUE) indent = \"\\t\";\n\t\t\n\t\tif (indent == null) {\n\t\t\tchar[] id = new char[lowestSpaceCount];\n\t\t\tArrays.fill(id, ' ');\n\t\t\tindent = new String(id);\n\t\t}\n\t\t\n\t\treturn new FormatPreferences(preferences.rawMap, indent, filledEmpties > 0);\n\t}\n}\n"
  },
  {
    "path": "src/delombok/lombok/delombok/FormatPreferences.java",
    "content": "/*\n * Copyright (C) 2013-2015 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.delombok;\n\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.LinkedHashMap;\nimport java.util.Map;\n\npublic final class FormatPreferences {\n\tprivate final String indent;\n\tprivate final Boolean filledEmpties;\n\tprivate final boolean generateFinalParams;\n\tprivate final boolean generateConstructorProperties;\n\tprivate final boolean generateSuppressWarnings, danceAroundIdeChecks, generateDelombokComment, javaLangAsFqn;\n\tfinal Map<String, String> rawMap;\n\tprivate final boolean generateGenerated;\n\t\n\tstatic final Map<String, String> KEYS;\n\t\n\tstatic {\n\t\tMap<String, String> keys = new LinkedHashMap<String, String>();\n\t\tkeys.put(\"indent\", \"The indent to use. 'tab' can be used to represent 1 tab. A number means that many spaces. Default: 'tab'\");\n\t\tkeys.put(\"emptyLines\", \"Either 'indent' or 'blank'. indent means: Indent an empty line to the right level. Default: 'blank'\");\n\t\tkeys.put(\"finalParams\", \"Either 'generate' or 'skip'. generate means: All lombok-generated methods set all parameters to final. Default: 'generate'\");\n\t\tkeys.put(\"constructorProperties\", \"Either 'generate' or 'skip'. generate means: All lombok-generated constructors with 1 or more arguments get an @ConstructorProperties annotation. Default: 'generate'\");\n\t\tkeys.put(\"suppressWarnings\", \"Either 'generate' or 'skip'. generate means: All lombok-generated methods, types, and fields get a @SuppressWarnings annotation. Default: 'generate'\");\n\t\tkeys.put(\"generated\", \"Either 'generate' or 'skip'. generate means: All lombok-generated methods, types, and fields get a @javax.annotation.Generated(\\\"lombok\\\") annotation. Default: 'generate'\");\n\t\tkeys.put(\"danceAroundIdeChecks\", \"Either 'generate' or 'skip'. generate means: Lombok will intentionally obfuscate some generated code to avoid IDE warnings. Default: 'generate'\");\n\t\tkeys.put(\"generateDelombokComment\", \"Either 'generate' or 'skip'. generate means: Any file modified by delombok will have a comment stating this at the top. Default: 'generate'\");\n\t\tkeys.put(\"javaLangAsFQN\", \"Either 'generate' or 'skip'. generate means: Any generated reference to java.lang classes are prefixed with `java.lang.`. Default: 'generate'\");\n\t\tKEYS = Collections.unmodifiableMap(keys);\n\t}\n\t\n\tpublic FormatPreferences(Map<String, String> preferences) {\n\t\tthis(preferences, null, null);\n\t}\n\t\n\tpublic FormatPreferences(Map<String, String> preferences, String indent, Boolean filledEmpties) {\n\t\tthis.rawMap = preferences;\n\t\tif (preferences == null) preferences = Collections.emptyMap();\n\t\t\n\t\tString indent_ = preferences.get(\"indent\");\n\t\tif (indent_ != null && !\"scan\".equalsIgnoreCase(indent_)) {\n\t\t\ttry {\n\t\t\t\tint id = Integer.parseInt(indent_);\n\t\t\t\tif (id > 0 && id < 32) {\n\t\t\t\t\tchar[] c = new char[id];\n\t\t\t\t\tArrays.fill(c, ' ');\n\t\t\t\t\tindent_ = new String(c);\n\t\t\t\t}\n\t\t\t} catch (NumberFormatException ignore) {}\n\t\t\tindent = indent_.replace(\"\\\\t\", \"\\t\").replace(\"tab\", \"\\t\");\n\t\t}\n\t\tString empties_ = preferences.get(\"emptyLines\".toLowerCase());\n\t\tif (\"indent\".equalsIgnoreCase(empties_)) filledEmpties = true;\n\t\telse if (\"blank\".equalsIgnoreCase(empties_)) filledEmpties = false;\n\t\telse if (empties_ != null && !\"scan\".equalsIgnoreCase(empties_)) {\n\t\t\tthrow new IllegalArgumentException(\"Legal values for 'emptyLines' are 'scan', 'indent', or 'blank'.\");\n\t\t}\n\t\t\n\t\tthis.indent = indent;\n\t\tthis.filledEmpties = filledEmpties;\n\t\t\n\t\tthis.generateFinalParams = unrollBoolean(preferences, \"finalParams\", \"generate\", \"skip\", true);\n\t\tthis.generateConstructorProperties = unrollBoolean(preferences, \"constructorProperties\", \"generate\", \"skip\", true);\n\t\tthis.generateSuppressWarnings = unrollBoolean(preferences, \"suppressWarnings\", \"generate\", \"skip\", true);\n\t\tthis.generateGenerated = unrollBoolean(preferences, \"generated\", \"generate\", \"skip\", true);\n\t\tthis.danceAroundIdeChecks = unrollBoolean(preferences, \"danceAroundIdeChecks\", \"generate\", \"skip\", true);\n\t\tthis.generateDelombokComment = unrollBoolean(preferences, \"generateDelombokComment\", \"generate\", \"skip\", true);\n\t\tthis.javaLangAsFqn = unrollBoolean(preferences, \"javaLangAsFQN\", \"generate\", \"skip\", true);\n\t}\n\t\n\tprivate static boolean unrollBoolean(Map<String, String> preferences, String name, String trueStr, String falseStr, boolean defaultVal) {\n\t\tString v_ = preferences.get(name.toLowerCase());\n\t\tif (v_ == null) return defaultVal;\n\t\tif (trueStr.equalsIgnoreCase(v_)) return true;\n\t\tif (falseStr.equalsIgnoreCase(v_)) return false;\n\t\tthrow new IllegalArgumentException(\"Legal values for '\" + name + \"' are '\" + trueStr + \"', or '\" + falseStr + \"'.\");\n\t}\n\t\n\tpublic static Map<String, String> getKeysAndDescriptions() {\n\t\treturn KEYS;\n\t}\n\t\n\t/** If true, empty lines should still be appropriately indented. If false, empty lines should be completely blank. */\n\tpublic boolean fillEmpties() {\n\t\treturn filledEmpties == null ? false : filledEmpties;\n\t}\n\t\n\tpublic String indent() {\n\t\treturn indent == null ? \"\\t\" : indent;\n\t}\n\t\n\tpublic boolean generateSuppressWarnings() {\n\t\treturn generateSuppressWarnings;\n\t}\n\t\n\tpublic boolean generateGenerated() {\n\t\treturn generateGenerated;\n\t}\n\t\n\tpublic boolean generateFinalParams() {\n\t\treturn generateFinalParams;\n\t}\n\t\n\tpublic boolean danceAroundIdeChecks() {\n\t\treturn danceAroundIdeChecks;\n\t}\n\t\n\tpublic boolean generateDelombokComment() {\n\t\treturn generateDelombokComment;\n\t}\n\t\n\tpublic boolean javaLangAsFqn() {\n\t\treturn javaLangAsFqn;\n\t}\n\t\n\tpublic boolean generateConstructorProperties() {\n\t\treturn generateConstructorProperties;\n\t}\n\t\n\t@Override public String toString() {\n\t\treturn rawMap.toString();\n\t}\n}\n"
  },
  {
    "path": "src/delombok/lombok/delombok/LombokOptionsFactory.java",
    "content": "/*\n * Copyright (C) 2013 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.delombok;\n\nimport lombok.javac.Javac;\nimport lombok.javac.Javac6BasedLombokOptions;\nimport lombok.javac.Javac8BasedLombokOptions;\nimport lombok.javac.Javac9BasedLombokOptions;\nimport lombok.javac.LombokOptions;\n\nimport com.sun.tools.javac.util.Context;\nimport com.sun.tools.javac.util.Options;\n\npublic class LombokOptionsFactory {\n\tenum LombokOptionCompilerVersion {\n\t\tJDK7_AND_LOWER {\n\t\t\t@Override LombokOptions createAndRegisterOptions(Context context) {\n\t\t\t\treturn Javac6BasedLombokOptions.replaceWithDelombokOptions(context);\n\t\t\t}\n\t\t},\n\t\t\n\t\tJDK8 {\n\t\t\t@Override LombokOptions createAndRegisterOptions(Context context) {\n\t\t\t\treturn Javac8BasedLombokOptions.replaceWithDelombokOptions(context);\n\t\t\t}\n\t\t},\n\t\t\n\t\tJDK9 {\n\t\t\t@Override LombokOptions createAndRegisterOptions(Context context) {\n\t\t\t\treturn Javac9BasedLombokOptions.replaceWithDelombokOptions(context);\n\t\t\t}\n\t\t};\n\t\t\n\t\tabstract LombokOptions createAndRegisterOptions(Context context);\n\t}\n\t\n\tpublic static LombokOptions getDelombokOptions(Context context) {\n\t\tOptions rawOptions = Options.instance(context);\n\t\tif (rawOptions instanceof LombokOptions) return (LombokOptions) rawOptions;\n\t\t\n\t\tLombokOptions options;\n\t\tif (Javac.getJavaCompilerVersion() < 8) {\n\t\t\toptions = LombokOptionCompilerVersion.JDK7_AND_LOWER.createAndRegisterOptions(context);\n\t\t} else if (Javac.getJavaCompilerVersion() == 8) {\n\t\t\toptions = LombokOptionCompilerVersion.JDK8.createAndRegisterOptions(context);\n\t\t} else {\n\t\t\toptions = LombokOptionCompilerVersion.JDK9.createAndRegisterOptions(context);\n\t\t}\n\t\treturn options;\n\t}\n}\n"
  },
  {
    "path": "src/delombok/lombok/delombok/PrettyPrinter.java",
    "content": "/*\n * Copyright (C) 2016-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.delombok;\n\nimport static com.sun.tools.javac.code.Flags.*;\nimport static lombok.javac.Javac.*;\nimport static lombok.javac.JavacTreeMaker.TreeTag.treeTag;\nimport static lombok.javac.JavacTreeMaker.TypeTag.typeTag;\n\nimport java.io.IOException;\nimport java.io.Writer;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.Method;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport com.sun.tools.javac.tree.DocCommentTable;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCArrayAccess;\nimport com.sun.tools.javac.tree.JCTree.JCArrayTypeTree;\nimport com.sun.tools.javac.tree.JCTree.JCAssert;\nimport com.sun.tools.javac.tree.JCTree.JCAssign;\nimport com.sun.tools.javac.tree.JCTree.JCAssignOp;\nimport com.sun.tools.javac.tree.JCTree.JCBinary;\nimport com.sun.tools.javac.tree.JCTree.JCBlock;\nimport com.sun.tools.javac.tree.JCTree.JCBreak;\nimport com.sun.tools.javac.tree.JCTree.JCCase;\nimport com.sun.tools.javac.tree.JCTree.JCCatch;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCCompilationUnit;\nimport com.sun.tools.javac.tree.JCTree.JCConditional;\nimport com.sun.tools.javac.tree.JCTree.JCContinue;\nimport com.sun.tools.javac.tree.JCTree.JCDoWhileLoop;\nimport com.sun.tools.javac.tree.JCTree.JCEnhancedForLoop;\nimport com.sun.tools.javac.tree.JCTree.JCErroneous;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCExpressionStatement;\nimport com.sun.tools.javac.tree.JCTree.JCFieldAccess;\nimport com.sun.tools.javac.tree.JCTree.JCForLoop;\nimport com.sun.tools.javac.tree.JCTree.JCIdent;\nimport com.sun.tools.javac.tree.JCTree.JCIf;\nimport com.sun.tools.javac.tree.JCTree.JCImport;\nimport com.sun.tools.javac.tree.JCTree.JCInstanceOf;\nimport com.sun.tools.javac.tree.JCTree.JCLabeledStatement;\nimport com.sun.tools.javac.tree.JCTree.JCLiteral;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCMethodInvocation;\nimport com.sun.tools.javac.tree.JCTree.JCModifiers;\nimport com.sun.tools.javac.tree.JCTree.JCNewArray;\nimport com.sun.tools.javac.tree.JCTree.JCNewClass;\nimport com.sun.tools.javac.tree.JCTree.JCParens;\nimport com.sun.tools.javac.tree.JCTree.JCPrimitiveTypeTree;\nimport com.sun.tools.javac.tree.JCTree.JCReturn;\nimport com.sun.tools.javac.tree.JCTree.JCSkip;\nimport com.sun.tools.javac.tree.JCTree.JCStatement;\nimport com.sun.tools.javac.tree.JCTree.JCSwitch;\nimport com.sun.tools.javac.tree.JCTree.JCSynchronized;\nimport com.sun.tools.javac.tree.JCTree.JCThrow;\nimport com.sun.tools.javac.tree.JCTree.JCTry;\nimport com.sun.tools.javac.tree.JCTree.JCTypeApply;\nimport com.sun.tools.javac.tree.JCTree.JCTypeCast;\nimport com.sun.tools.javac.tree.JCTree.JCTypeParameter;\nimport com.sun.tools.javac.tree.JCTree.JCUnary;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.tree.JCTree.JCWhileLoop;\nimport com.sun.tools.javac.tree.JCTree.JCWildcard;\nimport com.sun.tools.javac.tree.JCTree.TypeBoundKind;\nimport com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.Name;\nimport com.sun.tools.javac.util.Position;\n\nimport lombok.javac.CommentInfo;\nimport lombok.javac.CommentInfo.EndConnection;\nimport lombok.javac.CommentInfo.StartConnection;\nimport lombok.javac.Javac;\nimport lombok.javac.JavacTreeMaker.TreeTag;\nimport lombok.javac.JavacTreeMaker.TypeTag;\nimport lombok.javac.PackageName;\nimport lombok.permit.Permit;\n\npublic class PrettyPrinter extends JCTree.Visitor {\n\tprivate static final String LINE_SEP = System.getProperty(\"line.separator\");\n\tprivate static final Map<TreeTag, String> OPERATORS;\n\t\n\tstatic {\n\t\tMap<TreeTag, String> map = new HashMap<TreeTag, String>();\n\t\t\n\t\tmap.put(treeTag(\"POS\"), \"+\");\n\t\tmap.put(treeTag(\"NEG\"), \"-\");\n\t\tmap.put(treeTag(\"NOT\"), \"!\");\n\t\tmap.put(treeTag(\"COMPL\"), \"~\");\n\t\tmap.put(treeTag(\"PREINC\"), \"++\");\n\t\tmap.put(treeTag(\"PREDEC\"), \"--\");\n\t\tmap.put(treeTag(\"POSTINC\"), \"++\");\n\t\tmap.put(treeTag(\"POSTDEC\"), \"--\");\n\t\tmap.put(treeTag(\"NULLCHK\"), \"<*nullchk*>\");\n\t\tmap.put(treeTag(\"OR\"), \"||\");\n\t\tmap.put(treeTag(\"AND\"), \"&&\");\n\t\tmap.put(treeTag(\"EQ\"), \"==\");\n\t\tmap.put(treeTag(\"NE\"), \"!=\");\n\t\tmap.put(treeTag(\"LT\"), \"<\");\n\t\tmap.put(treeTag(\"GT\"), \">\");\n\t\tmap.put(treeTag(\"LE\"), \"<=\");\n\t\tmap.put(treeTag(\"GE\"), \">=\");\n\t\tmap.put(treeTag(\"BITOR\"), \"|\");\n\t\tmap.put(treeTag(\"BITXOR\"), \"^\");\n\t\tmap.put(treeTag(\"BITAND\"), \"&\");\n\t\tmap.put(treeTag(\"SL\"), \"<<\");\n\t\tmap.put(treeTag(\"SR\"), \">>\");\n\t\tmap.put(treeTag(\"USR\"), \">>>\");\n\t\tmap.put(treeTag(\"PLUS\"), \"+\");\n\t\tmap.put(treeTag(\"MINUS\"), \"-\");\n\t\tmap.put(treeTag(\"MUL\"), \"*\");\n\t\tmap.put(treeTag(\"DIV\"), \"/\");\n\t\tmap.put(treeTag(\"MOD\"), \"%\");\n\t\t\n\t\tmap.put(treeTag(\"BITOR_ASG\"), \"|=\");\n\t\tmap.put(treeTag(\"BITXOR_ASG\"), \"^=\");\n\t\tmap.put(treeTag(\"BITAND_ASG\"), \"&=\");\n\t\tmap.put(treeTag(\"SL_ASG\"), \"<<=\");\n\t\tmap.put(treeTag(\"SR_ASG\"), \">>=\");\n\t\tmap.put(treeTag(\"USR_ASG\"), \">>>=\");\n\t\tmap.put(treeTag(\"PLUS_ASG\"), \"+=\");\n\t\tmap.put(treeTag(\"MINUS_ASG\"), \"-=\");\n\t\tmap.put(treeTag(\"MUL_ASG\"), \"*=\");\n\t\tmap.put(treeTag(\"DIV_ASG\"), \"/=\");\n\t\tmap.put(treeTag(\"MOD_ASG\"), \"%=\");\n\t\t\n\t\tOPERATORS = map;\n\t}\n\t\n\tprivate final Writer out;\n\tprivate final JCCompilationUnit compilationUnit;\n\tprivate List<CommentInfo> comments;\n\tprivate final int[] textBlockStarts;\n\tprivate final FormatPreferences formatPreferences;\n\t\n\tprivate final Map<JCTree, String> docComments;\n\tprivate final DocCommentTable docTable;\n\tprivate int indent = 0;\n\t\n\t@SuppressWarnings({\"unchecked\", \"rawtypes\"})\n\tpublic PrettyPrinter(Writer out, JCCompilationUnit cu, List<CommentInfo> comments, int[] textBlockStarts, FormatPreferences preferences) {\n\t\tthis.out = out;\n\t\tthis.comments = comments;\n\t\tthis.textBlockStarts = textBlockStarts;\n\t\tthis.compilationUnit = cu;\n\t\tthis.formatPreferences = preferences;\n\t\t\n\t\t/* load doc comments */ {\n\t\t\tObject dc = getDocComments(compilationUnit);\n\t\t\tif (dc instanceof Map<?, ?>) {\n\t\t\t\tthis.docComments = (Map) dc;\n\t\t\t\tthis.docTable = null;\n\t\t\t} else if (dc instanceof DocCommentTable) {\n\t\t\t\tthis.docComments = null;\n\t\t\t\tthis.docTable = (DocCommentTable) dc;\n\t\t\t} else {\n\t\t\t\tthis.docComments = null;\n\t\t\t\tthis.docTable = null;\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate int endPos(JCTree tree) {\n\t\treturn getEndPosition(tree, compilationUnit);\n\t}\n\t\n\tprivate boolean needsAlign, needsNewLine, onNewLine = true, needsSpace, aligned;\n\t\n\tpublic static final class UncheckedIOException extends RuntimeException {\n\t\tUncheckedIOException(IOException source) {\n\t\t\tsuper(toMsg(source));\n\t\t\tsetStackTrace(source.getStackTrace());\n\t\t}\n\t\t\n\t\tprivate static String toMsg(Throwable t) {\n\t\t\tString msg = t.getMessage();\n\t\t\tString n = t.getClass().getSimpleName();\n\t\t\tif (msg == null || msg.isEmpty()) return n;\n\t\t\treturn n + \": \" + msg;\n\t\t}\n\t}\n\t\n\tprivate void align() {\n\t\tif (!onNewLine) return;\n\t\ttry {\n\t\t\tfor (int i = 0; i < indent; i++) out.write(formatPreferences.indent());\n\t\t} catch (IOException e) {\n\t\t\tthrow new UncheckedIOException(e);\n\t\t}\n\t\t\n\t\tonNewLine = false;\n\t\taligned = true;\n\t\tneedsAlign = false;\n\t}\n\t\n\tprivate void print(JCTree tree) {\n\t\tif (tree == null) {\n\t\t\tprint(\"/*missing*/\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tconsumeComments(tree);\n\t\ttree.accept(this);\n\t\tconsumeTrailingComments(endPos(tree));\n\t}\n\t\n\tprivate void print(List<? extends JCTree> trees, String infix) {\n\t\tboolean first = true;\n\t\tJCTree prev = null;\n\t\tfor (JCTree tree : trees) {\n\t\t\tif (suppress(tree)) continue;\n\t\t\tif (!first && infix != null && !infix.isEmpty()) {\n\t\t\t\tif (\"\\n\".equals(infix)) println(prev);\n\t\t\t\telse print(infix);\n\t\t\t}\n\t\t\tfirst = false;\n\t\t\tprint(tree);\n\t\t\tprev = tree;\n\t\t}\n\t}\n\t\n\tprivate boolean suppress(JCTree tree) {\n\t\tif (tree instanceof JCBlock) {\n\t\t\tJCBlock block = (JCBlock) tree;\n\t\t\treturn (Position.NOPOS == block.pos) && block.stats.isEmpty();\n\t\t}\n\t\t\n\t\tif (tree instanceof JCExpressionStatement) {\n\t\t\tJCExpression expr = ((JCExpressionStatement)tree).expr;\n\t\t\tif (expr instanceof JCMethodInvocation) {\n\t\t\t\tJCMethodInvocation inv = (JCMethodInvocation) expr;\n\t\t\t\tif (!inv.typeargs.isEmpty() || !inv.args.isEmpty()) return false;\n\t\t\t\tif (!(inv.meth instanceof JCIdent)) return false;\n\t\t\t\tif (tree.pos != expr.pos) return false; // Explicit super call\n\t\t\t\treturn ((JCIdent) inv.meth).name.toString().equals(\"super\");\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\tprivate void print(Name name) {\n\t\tif (name.isEmpty()) {\n\t\t\tprint(\"_\");\n\t\t} else {\n\t\t\tprint(name.toString());\n\t\t}\n\t}\n\t\n\tprivate void print(CharSequence s) {\n\t\tboolean align = needsAlign;\n\t\tif (needsNewLine && !onNewLine) println();\n\t\tif (align && !aligned) align();\n\t\ttry {\n\t\t\tif (needsSpace && !onNewLine && !aligned) out.write(' ');\n\t\t\tout.write(s.toString());\n\t\t} catch (IOException e) {\n\t\t\tthrow new UncheckedIOException(e);\n\t\t}\n\t\t\n\t\tneedsSpace = false;\n\t\tonNewLine = false;\n\t\taligned = false;\n\t}\n\t\n\tprivate void println() {\n\t\ttry {\n\t\t\tout.write(LINE_SEP);\n\t\t} catch (IOException e) {\n\t\t\tthrow new UncheckedIOException(e);\n\t\t}\n\t\t\n\t\tonNewLine = true;\n\t\taligned = false;\n\t\tneedsNewLine = false;\n\t}\n\t\n\tprivate void println(JCTree completed) {\n\t\tif (completed != null) {\n\t\t\tint endPos = endPos(completed);\n\t\t\tconsumeTrailingComments(endPos);\n\t\t}\n\t\ttry {\n\t\t\tout.write(LINE_SEP);\n\t\t} catch (IOException e) {\n\t\t\tthrow new UncheckedIOException(e);\n\t\t}\n\t\t\n\t\tonNewLine = true;\n\t\taligned = false;\n\t\tneedsNewLine = false;\n\t}\n\t\n\tprivate void println(CharSequence s) {\n\t\tprint(s);\n\t\tprintln();\n\t}\n\t\n\tprivate void println(CharSequence s, JCTree completed) {\n\t\tprint(s);\n\t\tprintln(completed);\n\t}\n\t\n\tprivate void aPrint(CharSequence s) {\n\t\talign();\n\t\tprint(s);\n\t}\n\t\n\tprivate void aPrintln(CharSequence s) {\n\t\talign();\n\t\tprint(s);\n\t\tprintln();\n\t}\n\t\n\tprivate void aPrintln(CharSequence s, JCTree completed) {\n\t\talign();\n\t\tprint(s);\n\t\tprintln(completed);\n\t}\n\t\n\tprivate void consumeComments(int until) {\n\t\tCommentInfo head = comments.head;\n\t\twhile (comments.nonEmpty() && head.pos < until) {\n\t\t\tprintComment(head);\n\t\t\tcomments = comments.tail;\n\t\t\thead = comments.head;\n\t\t}\n\t}\n\t\n\tprivate void consumeComments(JCTree tree) {\n\t\tconsumeComments(tree.pos);\n\t}\n\t\n\tprivate void consumeTrailingComments(int from) {\n\t\tboolean prevNewLine = onNewLine;\n\t\tCommentInfo head = comments.head;\n\t\tboolean stop = false;\n\t\t\n\t\twhile (comments.nonEmpty() && head.prevEndPos == from && !stop && !(head.start == StartConnection.ON_NEXT_LINE || head.start == StartConnection.START_OF_LINE)) {\n\t\t\tfrom = head.endPos;\n\t\t\tprintComment(head);\n\t\t\tstop = (head.end == EndConnection.ON_NEXT_LINE);\n\t\t\tcomments = comments.tail;\n\t\t\thead = comments.head;\n\t\t}\n\t\t\n\t\tif (!onNewLine && prevNewLine) {\n\t\t\tprintln();\n\t\t}\n\t}\n\t\n\tprivate String getJavadocFor(JCTree node) {\n\t\tif (docComments != null) return docComments.get(node);\n\t\tif (docTable != null) return docTable.getCommentText(node);\n\t\treturn null;\n\t}\n\t\n\tprivate int dims(JCExpression vartype) {\n\t\tif (vartype instanceof JCArrayTypeTree) {\n\t\t\treturn 1 + dims(((JCArrayTypeTree) vartype).elemtype);\n\t\t} else if (isJcAnnotatedType(vartype)) {\n\t\t\tJCTree underlyingType = readObject(vartype, \"underlyingType\", (JCTree) null);\n\t\t\tif (underlyingType instanceof JCArrayTypeTree) return 1 + dims (((JCArrayTypeTree) underlyingType).elemtype);\n\t\t}\n\t\t\n\t\treturn 0;\n\t}\n\t\n\tprivate void printComment(CommentInfo comment) {\n\t\tswitch (comment.start) {\n\t\tcase DIRECT_AFTER_PREVIOUS:\n\t\t\tneedsSpace = false;\n\t\t\tbreak;\n\t\tcase AFTER_PREVIOUS:\n\t\t\tneedsSpace = true;\n\t\t\tbreak;\n\t\tcase START_OF_LINE:\n\t\t\tneedsNewLine = true;\n\t\t\tneedsAlign = false;\n\t\t\tbreak;\n\t\tcase ON_NEXT_LINE:\n\t\t\tif (!onNewLine) {\n\t\t\t\tneedsNewLine = true;\n\t\t\t\tneedsAlign = true;\n\t\t\t} else if (!aligned) {\n\t\t\t\tneedsAlign = true;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\t\n\t\tif (onNewLine && !aligned && comment.start != StartConnection.START_OF_LINE) needsAlign = true;\n\t\t\n\t\tprint(comment.content);\n\t\t\n\t\tswitch (comment.end) {\n\t\tcase ON_NEXT_LINE:\n\t\t\tif (!aligned) {\n\t\t\t\tneedsNewLine = true;\n\t\t\t\tneedsAlign = true;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase AFTER_COMMENT:\n\t\t\tneedsSpace = true;\n\t\t\tbreak;\n\t\tcase DIRECT_AFTER_COMMENT:\n\t\t\t// do nothing\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tprivate void printDocComment(JCTree tree) {\n\t\tString dc = getJavadocFor(tree);\n\t\tif (dc == null) return;\n\t\t\n\t\taPrintln(\"/**\");\n\t\tboolean atStart = true;\n\t\t\n\t\tfor (String line : dc.split(\"\\\\r?\\\\n\")) {\n\t\t\tif (atStart && line.trim().isEmpty()) {\n\t\t\t\tatStart = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tatStart = false;\n\t\t\taPrint(\" *\");\n\t\t\tif (!line.isEmpty() && !Character.isWhitespace(line.charAt(0))) {\n\t\t\t\tprint(\" \");\n\t\t\t}\n\t\t\t\n\t\t\tprintln(line);\n\t\t}\n\t\t\n\t\taPrintln(\" */\");\n\t}\n\t\n\tprivate Name __INIT__, __VALUE__;\n\tprivate Name name_init(Name someName) {\n\t\tif (__INIT__ == null) __INIT__ = someName.table.fromChars(\"<init>\".toCharArray(), 0, 6);\n\t\treturn __INIT__;\n\t}\n\tprivate Name name_value(Name someName) {\n\t\tif (__VALUE__ == null) __VALUE__ = someName.table.fromChars(\"value\".toCharArray(), 0, 5);\n\t\treturn __VALUE__;\n\t}\n\t\n\t@Override public void visitTopLevel(JCCompilationUnit tree) {\n\t\tprintDocComment(tree);\n\t\tJCTree n = PackageName.getPackageNode(tree);\n\t\tif (n != null) {\n\t\t\tconsumeComments(tree);\n\t\t\taPrint(\"package \");\n\t\t\tprint(n);\n\t\t\tprintln(\";\", n);\n\t\t}\n\t\t\n\t\tboolean first = true;\n\t\t\n\t\tfor (JCTree child : tree.defs) {\n\t\t\tif (!(child instanceof JCImport)) continue;\n\t\t\tif (first) println();\n\t\t\tfirst = false;\n\t\t\tprint(child);\n\t\t}\n\t\t\n\t\tfor (JCTree child : tree.defs) {\n\t\t\tif (child instanceof JCImport) continue;\n\t\t\tprint(child);\n\t\t}\n\t\tconsumeComments(Integer.MAX_VALUE);\n\t}\n\t\n\t@Override public void visitImport(JCImport tree) {\n\t\tJCTree qualid = Javac.getQualid(tree);\n\t\tif (qualid instanceof JCFieldAccess) {\n\t\t\tJCFieldAccess fa = ((JCFieldAccess) qualid);\n\t\t\tif (fa.name.length() == 1 && fa.name.contentEquals(\"*\")) {\n\t\t\t\tif (fa.selected instanceof JCFieldAccess) {\n\t\t\t\t\tJCFieldAccess lombokExperimental = (JCFieldAccess) fa.selected;\n\t\t\t\t\tif (lombokExperimental.name.contentEquals(\"experimental\") && lombokExperimental.selected instanceof JCIdent && ((JCIdent) lombokExperimental.selected).name.contentEquals(\"lombok\")) {\n\t\t\t\t\t\t// do not ever print lombok.experimental.*.\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\taPrint(\"import \");\n\t\tif (tree.staticImport) print(\"static \");\n\t\tprint(qualid);\n\t\tprintln(\";\", tree);\n\t}\n\t\n\tvoid printModuleImport(JCTree tree) {\n\t\tJCExpression qualid = readObject(tree, \"module\", null);\n\t\t\n\t\taPrint(\"import module \");\n\t\tprint(qualid);\n\t\tprintln(\";\", tree);\n\t}\n\t\n\tprivate Name currentTypeName;\n\t@Override public void visitClassDef(JCClassDecl tree) {\n\t\tif ((tree.mods.flags & IMPLICIT_CLASS) != 0) {\n\t\t\tprintClassMembers(tree.defs, false, false);\n\t\t\tconsumeComments(endPos(tree));\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tprintln();\n\t\tprintDocComment(tree);\n\t\talign();\n\t\tprint(tree.mods);\n\t\t\n\t\tboolean isInterface = (tree.mods.flags & INTERFACE) != 0;\n\t\tboolean isAnnotationInterface = isInterface && (tree.mods.flags & ANNOTATION) != 0;\n\t\tboolean isEnum = (tree.mods.flags & ENUM) != 0;\n\t\tboolean isRecord = (tree.mods.flags & RECORD) != 0;\n\t\t\n\t\tif (isAnnotationInterface) print(\"@interface \");\n\t\telse if (isInterface) print(\"interface \");\n\t\telse if (isEnum) print(\"enum \");\n\t\telse if (isRecord) print(\"record \");\n\t\telse print(\"class \");\n\t\t\n\t\tprint(tree.name);\n\t\tName prevTypeName = currentTypeName;\n\t\tcurrentTypeName = tree.name;\n\t\t\n\t\tif (tree.typarams.nonEmpty()) {\n\t\t\tprint(\"<\");\n\t\t\tprint(tree.typarams, \", \");\n\t\t\tprint(\">\");\n\t\t}\n\t\t\n\t\tif (isRecord) printRecordConstructor(tree.defs);\n\t\t\n\t\tJCTree extendsClause = getExtendsClause(tree);\n\t\tif (extendsClause != null) {\n\t\t\tprint(\" extends \");\n\t\t\tprint(extendsClause);\n\t\t}\n\t\t\n\t\tif (tree.implementing.nonEmpty()) {\n\t\t\tprint(isInterface ? \" extends \" : \" implements \");\n\t\t\tprint(tree.implementing, \", \");\n\t\t}\n\t\t\n\t\tList<JCExpression> permitting = readObject(tree, \"permitting\", List.<JCExpression>nil());\n\t\tif (permitting.nonEmpty()) {\n\t\t\tprint(\" permits \");\n\t\t\tprint(permitting, \", \");\n\t\t}\n\t\t\n\t\tprintln(\" {\");\n\t\tindent++;\n\t\tprintClassMembers(tree.defs, isEnum, isInterface);\n\t\tconsumeComments(endPos(tree));\n\t\tindent--;\n\t\taPrintln(\"}\", tree);\n\t\tcurrentTypeName = prevTypeName;\n\t}\n\t\n\tprivate void printRecordConstructor(List<JCTree> members) {\n\t\tboolean first = true;\n\t\tprint(\"(\");\n\t\tfor (JCTree member : members) {\n\t\t\tif (member instanceof JCVariableDecl) {\n\t\t\tJCVariableDecl variableDecl = (JCVariableDecl) member;\n\t\t\t\tif ((variableDecl.mods.flags & GENERATED_MEMBER) != 0) {\n\t\t\t\t\tif (!first) print(\", \");\n\t\t\t\t\tfirst = false;\n\t\t\t\t\tprintAnnotations(variableDecl.mods.annotations, false);\n\t\t\t\t\tprintVarDef0(variableDecl);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tprint(\")\");\n\t}\n\t\n\tprivate void printClassMembers(List<JCTree> members, boolean isEnum, boolean isInterface) {\n\t\tClass<?> prefType = null;\n\t\tint typeOfPrevEnumMember = isEnum ? 3 : 0; // 1 = normal, 2 = with body, 3 = no enum field yet.\n\t\tboolean prevWasEnumMember = isEnum;\n\t\t\n\t\tfor (JCTree member : members) {\n\t\t\tif (typeOfPrevEnumMember == 3 && member instanceof JCMethodDecl && (((JCMethodDecl) member).mods.flags & GENERATEDCONSTR) != 0) continue;\n\t\t\tboolean isEnumVar = isEnum && member instanceof JCVariableDecl && (((JCVariableDecl) member).mods.flags & ENUM) != 0;\n\t\t\tif (!isEnumVar && prevWasEnumMember) {\n\t\t\t\tprevWasEnumMember = false;\n\t\t\t\tif (typeOfPrevEnumMember == 3) align();\n\t\t\t\tprintln(\";\");\n\t\t\t}\n\t\t\t\n\t\t\tif (isEnumVar) {\n\t\t\t\tif (prefType != null && prefType != JCVariableDecl.class) println();\n\t\t\t\tswitch (typeOfPrevEnumMember) {\n\t\t\t\tcase 1:\n\t\t\t\t\tprint(\", \");\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\tprintln(\",\");\n\t\t\t\t\talign();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tprint(member);\n\t\t\t\tJCTree init = ((JCVariableDecl) member).init;\n\t\t\t\ttypeOfPrevEnumMember = init instanceof JCNewClass && ((JCNewClass) init).def != null ? 2 : 1;\n\t\t\t} else if (member instanceof JCVariableDecl) {\n\t\t\t\tif ((((JCVariableDecl) member).mods.flags & GENERATED_MEMBER) != 0) continue;\n\t\t\t\tif (prefType != null && prefType != JCVariableDecl.class) println();\n\t\t\t\tif (isInterface) flagMod = -1L & ~(PUBLIC | STATIC | FINAL);\n\t\t\t\tprint(member);\n\t\t\t} else if (member instanceof JCMethodDecl) {\n\t\t\t\tif ((((JCMethodDecl) member).mods.flags & GENERATEDCONSTR) != 0) continue;\n\t\t\t\tif (prefType != null) println();\n\t\t\t\tif (isInterface) flagMod = -1L & ~(PUBLIC | ABSTRACT);\n\t\t\t\tprint(member);\n\t\t\t} else if (member instanceof JCClassDecl) {\n\t\t\t\tif (prefType != null) println();\n\t\t\t\tif (isInterface) flagMod = -1L & ~(PUBLIC | STATIC);\n\t\t\t\tprint(member);\n\t\t\t} else {\n\t\t\t\tif (prefType != null) println();\n\t\t\t\tprint(member);\n\t\t\t}\n\t\t\t\n\t\t\tprefType = member.getClass();\n\t\t}\n\t\t\n\t\tif (prevWasEnumMember) {\n\t\t\tprevWasEnumMember = false;\n\t\t\tif (typeOfPrevEnumMember == 3) align();\n\t\t\tprintln(\";\");\n\t\t}\n\t}\n\t\n\t@Override public void visitTypeParameter(JCTypeParameter tree) {\n\t\tList<JCExpression> annotations = readObject(tree, \"annotations\", List.<JCExpression>nil());\n\t\tif (!annotations.isEmpty()) {\n\t\t\tprint(annotations, \" \");\n\t\t\tprint(\" \");\n\t\t}\n\t\tprint(tree.name);\n\t\tif (tree.bounds.nonEmpty()) {\n\t\t\tprint(\" extends \");\n\t\t\tprint(tree.bounds, \" & \");\n\t\t}\n\t\tconsumeComments(tree);\n\t}\n\t\n\t@Override public void visitVarDef(JCVariableDecl tree) {\n\t\tprintDocComment(tree);\n\t\talign();\n\t\tif ((tree.mods.flags & ENUM) != 0) {\n\t\t\tprintEnumMember(tree);\n\t\t\treturn;\n\t\t}\n\t\tprintAnnotations(tree.mods.annotations, true);\n\t\tprintModifierKeywords(tree.mods);\n\t\tprintVarDef0(tree);\n\t\tprintln(\";\", tree);\n\t}\n\t\n\tprivate void printVarDefInline(JCVariableDecl tree) {\n\t\tprintAnnotations(tree.mods.annotations, false);\n\t\tprintModifierKeywords(tree.mods);\n\t\tprintVarDef0(tree);\n\t}\n\t\n\tprivate boolean innermostArrayBracketsAreVarargs = false;\n\tprivate void printVarDef0(JCVariableDecl tree) {\n\t\tboolean varargs = (tree.mods.flags & VARARGS) != 0;\n\t\t\n\t\t/* story time!\n\t\t \n\t\t in 'new int[5][6];', the 5 is the outermost and the 6 is the innermost: That means: 5 int arrays, each capable of containing 6 elements.\n\t\t But that's actually a crazy way to read it; you'd think that in FOO[], you should interpret that as 'an array of FOO', but that's not correct;\n\t\t if FOO is for example 'int[]', it's: \"Modify the component type of FOO to be an array of whatever it was before.. unless FOO isn't an array, in which case,\n\t\t this is an array of FOO\". Which is weird.\n\t\t \n\t\t This is particularly poignant with vargs. In: \"int[]... x\", the ... are actually the _INNER_ type even though varargs by definition is a modification of\n\t\t how to interpret the outer. The JLS just sort of lets that be: To indicate varargs, replace the lexically last [] with dots even though that's the wrong\n\t\t [] to modify!\n\t\t \n\t\t This becomes an utter shambles when annotations-on-arrays become involved. The annotation on the INNER most type is to be placed right before the ...;\n\t\t and because of that, we have to do crazy stuff with this innermostArrayBracketsAreVarargs flag.\n\t\t */\n\t\ttry {\n\t\t\tinnermostArrayBracketsAreVarargs = varargs;\n\t\t\tif (tree.vartype == null || tree.vartype.pos == -1 || endPos(tree.vartype) == -1) {\n\t\t\t\tprint(\"var\");\n\t\t\t} else {\n\t\t\t\tprint(tree.vartype);\n\t\t\t}\n\t\t} finally {\n\t\t\tinnermostArrayBracketsAreVarargs = false;\n\t\t}\n\t\tprint(\" \");\n\t\tprint(tree.name);\n\t\tif (tree.init != null) {\n\t\t\tprint(\" = \");\n\t\t\tprint(tree.init);\n\t\t}\n\t}\n\t\n\tprivate void printEnumMember(JCVariableDecl tree) {\n\t\tprintAnnotations(tree.mods.annotations, true);\n\t\tprint(tree.name);\n\t\tif (tree.init instanceof JCNewClass) {\n\t\t\tJCNewClass constructor = (JCNewClass) tree.init;\n\t\t\tif (constructor.args != null && constructor.args.nonEmpty()) {\n\t\t\t\tprint(\"(\");\n\t\t\t\tprint(constructor.args, \", \");\n\t\t\t\tprint(\")\");\n\t\t\t}\n\t\t\t\n\t\t\tif (constructor.def != null && constructor.def.defs != null) {\n\t\t\t\tprintln(\" {\");\n\t\t\t\tindent++;\n\t\t\t\tprintClassMembers(constructor.def.defs, false, false);\n\t\t\t\tconsumeComments(endPos(tree));\n\t\t\t\tindent--;\n\t\t\t\taPrint(\"}\");\n\t\t\t}\n\t\t}\n\t}\n\t\n\t// TODO: Test postfix syntax for methods (?), for decls. Multiline vardefs, possibly with comments. enums with bodies. constructor-local generics, method-local generics, also do/while, finally, try-with-resources, lambdas, annotations in java8 places...\n\t// TODO: Whatever is JCAnnotatedType? We handle it in the 7+ bucket in the old one...\n\t\n\t@Override public void visitTypeApply(JCTypeApply tree) {\n\t\tprint(tree.clazz);\n\t\tprint(\"<\");\n\t\tboolean temp = innermostArrayBracketsAreVarargs;\n\t\tinnermostArrayBracketsAreVarargs = false;\n\t\tprint(tree.arguments, \", \");\n\t\tinnermostArrayBracketsAreVarargs = temp;\n\t\tprint(\">\");\n\t}\n\t\n\t@Override public void visitWildcard(JCWildcard tree) {\n\t\tswitch (tree.getKind()) {\n\t\tdefault:\n\t\tcase UNBOUNDED_WILDCARD:\n\t\t\tprint(\"?\");\n\t\t\treturn;\n\t\tcase EXTENDS_WILDCARD:\n\t\t\tprint(\"? extends \");\n\t\t\tprint(tree.inner);\n\t\t\treturn;\n\t\tcase SUPER_WILDCARD:\n\t\t\tprint(\"? super \");\n\t\t\tprint(tree.inner);\n\t\t\treturn;\n\t\t}\n\t}\n\t\n\t@Override public void visitLiteral(JCLiteral tree) {\n\t\tTypeTag typeTag = typeTag(tree);\n\t\tif (CTC_INT.equals(typeTag)) print(\"\" + tree.value);\n\t\telse if (CTC_LONG.equals(typeTag)) print(tree.value + \"L\");\n\t\telse if (CTC_FLOAT.equals(typeTag)) print(tree.value + \"F\");\n\t\telse if (CTC_DOUBLE.equals(typeTag)) print(\"\" + tree.value);\n\t\telse if (CTC_CHAR.equals(typeTag)) {\n\t\t\tprint(\"\\'\" + quoteChar((char)((Number)tree.value).intValue()) + \"\\'\");\n\t\t}\n\t\telse if (CTC_BOOLEAN.equals(typeTag)) print(((Number)tree.value).intValue() == 1 ? \"true\" : \"false\");\n\t\telse if (CTC_BOT.equals(typeTag)) print(\"null\");\n\t\telse {\n\t\t\tif (Arrays.binarySearch(textBlockStarts, tree.pos) < 0) {\n\t\t\t\tprint(\"\\\"\" + quoteChars(tree.value.toString()) + \"\\\"\");\n\t\t\t} else {\n\t\t\t\tprintTextBlock(tree.value.toString());\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate void printTextBlock(String s) {\n\t\tprintln(\"\\\"\\\"\\\"\");\n\t\tneedsAlign = true;\n\t\tindent++;\n\t\tStringBuilder sb = new StringBuilder();\n\t\tboolean lineStart = true;\n\t\tfor (int i = 0; i < s.length(); i++) {\n\t\t\tchar c = s.charAt(i);\n\t\t\tif (c != ' ' && c != '\\t') lineStart = false;\n\t\t\tif (c == '\\n') {\n\t\t\t\tprintln(sb);\n\t\t\t\tsb.setLength(0);\n\t\t\t\tneedsAlign = true;\n\t\t\t\tlineStart = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (c == '\\t' && lineStart) sb.append(\"\\t\");\n\t\t\telse sb.append(quoteChar(s.charAt(i)));\n\t\t}\n\t\tprint(sb);\n\t\tprint(\"\\\"\\\"\\\"\");\n\t\tindent--;\n\t}\n\t\n\t@Override public void visitMethodDef(JCMethodDecl tree) {\n\t\tboolean isConstructor = tree.name == name_init(tree.name);\n\t\tif (isConstructor && (tree.mods.flags & GENERATEDCONSTR) != 0) return;\n\t\tprintDocComment(tree);\n\t\talign();\n\t\tprint(tree.mods);\n\t\tif (tree.typarams != null && tree.typarams.nonEmpty()) {\n\t\t\tprint(\"<\");\n\t\t\tprint(tree.typarams, \", \");\n\t\t\tprint(\"> \");\n\t\t}\n\t\t\n\t\tif (isConstructor) {\n\t\t\tprint(currentTypeName == null ? \"<init>\" : currentTypeName);\n\t\t} else {\n\t\t\tprint(tree.restype);\n\t\t\tprint(\" \");\n\t\t\tprint(tree.name);\n\t\t}\n\t\t\n\t\tboolean argsLessConstructor = false;\n\t\tif (isConstructor && (tree.mods.flags & COMPACT_RECORD_CONSTRUCTOR) != 0) {\n\t\t\targsLessConstructor = true;\n\t\t}\n\t\t\n\t\tboolean first = true;\n\t\tif (!argsLessConstructor) {\n\t\t\tprint(\"(\");\n\t\t\t\n\t\t\tJCVariableDecl recvparam = readObject(tree, \"recvparam\", null);\n\t\t\tif (recvparam != null) {\n\t\t\t\tprintVarDefInline(recvparam);\n\t\t\t\tfirst = false;\n\t\t\t}\n\t\t\t\n\t\t\tfor (JCVariableDecl param : tree.params) {\n\t\t\t\tif (!first) print(\", \");\n\t\t\t\tfirst = false;\n\t\t\t\tprintVarDefInline(param);\n\t\t\t}\n\t\t\tprint(\")\");\n\t\t}\n\t\t\n\t\tif (tree.thrown.nonEmpty()) {\n\t\t\tprint(\" throws \");\n\t\t\tprint(tree.thrown, \", \");\n\t\t}\n\t\t\n\t\tif (tree.defaultValue != null) {\n\t\t\tprint(\" default \");\n\t\t\tprint(tree.defaultValue);\n\t\t}\n\t\t\n\t\tif (tree.body != null) {\n\t\t\tprint(\" \");\n\t\t\tprint(tree.body);\n\t\t} else println(\";\", tree);\n\t}\n\t\n\t@Override public void visitSkip(JCSkip that) {\n\t\tif (onNewLine && !aligned) {\n\t\t\talign();\n\t\t}\n\t\tprintln(\";\");\n\t}\n\t\n\t@Override public void visitAnnotation(JCAnnotation tree) {\n\t\tprint(\"@\");\n\t\tprint(tree.annotationType);\n\t\tif (tree.args.isEmpty()) return;\n\t\tprint(\"(\");\n\t\tboolean done = false;\n\t\tif (tree.args.length() == 1 && tree.args.get(0) instanceof JCAssign) {\n\t\t\tJCAssign arg1 = (JCAssign) tree.args.get(0);\n\t\t\tJCIdent arg1Name = arg1.lhs instanceof JCIdent ? ((JCIdent) arg1.lhs) : null;\n\t\t\tif (arg1Name != null && arg1Name.name == name_value(arg1Name.name)) {\n\t\t\t\tprint(arg1.rhs);\n\t\t\t\tdone = true;\n\t\t\t}\n\t\t}\n\t\tif (!done) print(tree.args, \", \");\n\t\tprint(\")\");\n\t}\n\t\n\t@Override public void visitTypeArray(JCArrayTypeTree tree) {\n\t\tprintTypeArray0(tree);\n\t}\n\t\n\t@Override public void visitNewArray(JCNewArray tree) {\n\t\tJCTree elem = tree.elemtype;\n\t\tint dims = 0;\n\t\tif (elem != null) {\n\t\t\tprint(\"new \");\n\t\t\t\n\t\t\twhile (elem instanceof JCArrayTypeTree) {\n\t\t\t\tdims++;\n\t\t\t\telem = ((JCArrayTypeTree) elem).elemtype;\n\t\t\t}\n\t\t\tprint(elem);\n\t\t\t\n\t\t\tfor (JCExpression expr : tree.dims) {\n\t\t\t\tprint(\"[\");\n\t\t\t\tprint(expr);\n\t\t\t\tprint(\"]\");\n\t\t\t}\n\t\t}\n\t\t\n\t\tfor (int i = 0; i < dims; i++) print(\"[]\");\n\t\t\n\t\tif (tree.elems != null) {\n\t\t\tif (elem != null) print(\"[] \");\n\t\t\tprint(\"{\");\n\t\t\tprint(tree.elems, \", \");\n\t\t\tprint(\"}\");\n\t\t}\n\t}\n\t\n\t@Override public void visitNewClass(JCNewClass tree) {\n\t\tif (tree.encl != null) {\n\t\t\tprint(tree.encl);\n\t\t\tprint(\".\");\n\t\t}\n\t\tboolean moveFirstParameter = tree.args.nonEmpty() && tree.args.head instanceof JCUnary && tree.args.head.toString().startsWith(\"<*nullchk*>\");\n\t\tif (moveFirstParameter) {\n\t\t\tprint(((JCUnary) tree.args.head).arg);\n\t\t\tprint(\".\");\n\t\t}\n\t\t\n\t\tprint(\"new \");\n\t\tif (!tree.typeargs.isEmpty()) {\n\t\t\tprint(\"<\");\n\t\t\tprint(tree.typeargs, \", \");\n\t\t\tprint(\">\");\n\t\t}\n\t\tprint(tree.clazz);\n\t\tprint(\"(\");\n\t\tif (moveFirstParameter) {\n\t\t\tprint(tree.args.tail, \", \");\n\t\t} else {\n\t\t\tprint(tree.args, \", \");\n\t\t}\n\t\tprint(\")\");\n\t\tif (tree.def != null) {\n\t\t\tName previousTypeName = currentTypeName;\n\t\t\tcurrentTypeName = null;\n\t\t\tprintln(\" {\");\n\t\t\tindent++;\n\t\t\tprint(tree.def.defs, \"\");\n\t\t\tindent--;\n\t\t\taPrint(\"}\");\n\t\t\tcurrentTypeName = previousTypeName;\n\t\t}\n\t}\n\t\n\t@Override public void visitIndexed(JCArrayAccess tree) {\n\t\tprint(tree.indexed);\n\t\tprint(\"[\");\n\t\tprint(tree.index);\n\t\tprint(\"]\");\n\t}\n\t\n\t@Override public void visitTypeIdent(JCPrimitiveTypeTree tree) {\n\t\tTypeTag typeTag = typeTag(tree);\n\t\t\n\t\tif (CTC_BYTE.equals(typeTag)) print(\"byte\");\n\t\telse if (CTC_CHAR.equals(typeTag)) print(\"char\");\n\t\telse if (CTC_SHORT.equals(typeTag)) print(\"short\");\n\t\telse if (CTC_INT.equals(typeTag)) print(\"int\");\n\t\telse if (CTC_LONG.equals(typeTag)) print(\"long\");\n\t\telse if (CTC_FLOAT.equals(typeTag)) print(\"float\");\n\t\telse if (CTC_DOUBLE.equals(typeTag)) print(\"double\");\n\t\telse if (CTC_BOOLEAN.equals(typeTag)) print(\"boolean\");\n\t\telse if (CTC_VOID.equals(typeTag)) print(\"void\");\n\t\telse print(\"error\");\n\t}\n\t\n\t@Override public void visitLabelled(JCLabeledStatement tree) {\n\t\taPrint(tree.label);\n\t\tprint(\":\");\n\t\tif (tree.body instanceof JCSkip || suppress(tree)) {\n\t\t\tprintln(\" ;\", tree);\n\t\t} else if (tree.body instanceof JCBlock) {\n\t\t\tprint(\" \");\n\t\t\tprint(tree.body);\n\t\t} else {\n\t\t\tprintln(tree);\n\t\t\tprint(tree.body);\n\t\t}\n\t}\n\t\n\tprivate long flagMod = -1L;\n\tprivate static final long DEFAULT = 1L<<43;\n\t\n\t@Override public void visitModifiers(JCModifiers tree) {\n\t\tprintAnnotations(tree.annotations, true);\n\t\tprintModifierKeywords(tree);\n\t}\n\t\n\tprivate void printAnnotations(List<JCAnnotation> annotations, boolean newlines) {\n\t\tfor (JCAnnotation ann : annotations) {\n\t\t\tprint(ann);\n\t\t\tif (newlines) {\n\t\t\t\tprintln();\n\t\t\t\talign();\n\t\t\t} else print(\" \");\n\t\t}\n\t}\n\t\n\tprivate void printModifierKeywords(JCModifiers tree) {\n\t\tlong v = flagMod & tree.flags;\n\t\tflagMod = -1L;\n\t\t\n\t\tif ((v & SYNTHETIC) != 0) print(\"/* synthetic */ \");\n\t\tif ((v & PUBLIC) != 0) print(\"public \");\n\t\tif ((v & PRIVATE) != 0) print(\"private \");\n\t\tif ((v & PROTECTED) != 0) print(\"protected \");\n\t\tif ((v & STATIC) != 0) print(\"static \");\n\t\tif ((v & FINAL) != 0) print(\"final \");\n\t\tif ((v & SYNCHRONIZED) != 0) print(\"synchronized \");\n\t\tif ((v & VOLATILE) != 0) print(\"volatile \");\n\t\tif ((v & TRANSIENT) != 0) print(\"transient \");\n\t\tif ((v & NATIVE) != 0) print(\"native \");\n\t\tif ((v & ABSTRACT) != 0) print(\"abstract \");\n\t\tif ((v & SEALED) != 0) print(\"sealed \");\n\t\tif ((v & NON_SEALED) != 0) print(\"non-sealed \"); // Yes, this is a real keyword.\n\t\tif ((v & STRICTFP) != 0) print(\"strictfp \");\n\t\tif ((v & DEFAULT) != 0 && (v & INTERFACE) == 0) print(\"default \");\n\t}\n\t\n\t@Override public void visitSelect(JCFieldAccess tree) {\n\t\tprint(tree.selected);\n\t\tprint(\".\");\n\t\tprint(tree.name);\n\t}\n\t\n\t@Override public void visitIdent(JCIdent tree) {\n\t\tprint(tree.name);\n\t}\n\t\n\t@Override public void visitApply(JCMethodInvocation tree) {\n\t\tif (tree.typeargs.nonEmpty()) {\n\t\t\tif (tree.meth instanceof JCFieldAccess) {\n\t\t\t\tJCFieldAccess fa = (JCFieldAccess) tree.meth;\n\t\t\t\tprint(fa.selected);\n\t\t\t\tprint(\".<\");\n\t\t\t\tprint(tree.typeargs, \", \");\n\t\t\t\tprint(\">\");\n\t\t\t\tprint(fa.name);\n\t\t\t} else {\n\t\t\t\tprint(\"<\");\n\t\t\t\tprint(tree.typeargs, \", \");\n\t\t\t\tprint(\">\");\n\t\t\t\tprint(tree.meth);\n\t\t\t}\n\t\t} else {\n\t\t\tprint(tree.meth);\n\t\t}\n\t\t\n\t\tprint(\"(\");\n\t\tprint(tree.args, \", \");\n\t\tprint(\")\");\n\t}\n\t\n\t@Override public void visitAssert(JCAssert tree) {\n\t\taPrint(\"assert \");\n\t\tprint(tree.cond);\n\t\tif (tree.detail != null) {\n\t\t\tprint(\" : \");\n\t\t\tprint(tree.detail);\n\t\t}\n\t\tprintln(\";\", tree);\n\t}\n\t\n\t@Override public void visitAssign(JCAssign tree) {\n\t\tprint(tree.lhs);\n\t\tprint(\" = \");\n\t\tprint(tree.rhs);\n\t}\n\t\n\t@Override public void visitAssignop(JCAssignOp tree) {\n\t\tprint(tree.lhs);\n\t\tString opname = operator(treeTag(tree));\n\t\tprint(\" \" + opname + \" \");\n\t\tprint(tree.rhs);\n\t}\n\t\n\tprivate static final int PREFIX = 14;\n\t\n\t@Override public void visitUnary(JCUnary tree) {\n\t\tString op = operator(treeTag(tree));\n\t\tif (treeTag(tree).getOperatorPrecedenceLevel() == PREFIX) {\n\t\t\tprint(op);\n\t\t\tprint(tree.arg);\n\t\t} else {\n\t\t\tprint(tree.arg);\n\t\t\tprint(op);\n\t\t}\n\t}\n\t\n\t@Override public void visitBinary(JCBinary tree) {\n\t\tString op = operator(treeTag(tree));\n\t\tprint(tree.lhs);\n\t\tprint(\" \");\n\t\tprint(op);\n\t\tprint(\" \");\n\t\tprint(tree.rhs);\n\t}\n\t\n\t@Override public void visitTypeTest(JCInstanceOf tree) {\n\t\tprint(tree.expr);\n\t\tprint(\" instanceof \");\n\t\t\n\t\t/** With java14, instead of a type (field 'clazz'), there's now a pattern (field 'pattern', of type JCTree, which is either a JCPattern for new-style instanceof, or if not it's the same as what 'clazz' held) */\n\t\tJCTree c = readObject(tree, \"clazz\", null); // JDK-13\n\t\tif (c == null) c = readObject(tree, \"pattern\", null); // JDK14+\n\t\tprint(c);\n\t}\n\t\n\t@Override public void visitTypeCast(JCTypeCast tree) {\n\t\tprint(\"(\");\n\t\tprint(tree.clazz);\n\t\tprint(\") \");\n\t\tprint(tree.expr);\n\t}\n\t\n\t@Override public void visitBlock(JCBlock tree) {\n\t\tif (tree.pos == Position.NOPOS && tree.stats.isEmpty()) return;\n\t\tif (onNewLine) align();\n\t\tif ((tree.flags & STATIC) != 0) print(\"static \");\n\t\tprintln(\"{\");\n\t\tindent++;\n\t\tprint(tree.stats, \"\");\n\t\tconsumeComments(endPos(tree));\n\t\tindent--;\n\t\taPrintln(\"}\", tree);\n\t}\n\t\n\t@Override public void visitBreak(JCBreak tree) {\n\t\taPrint(\"break\");\n\t\t\n\t\tJCExpression value = readObject(tree, \"value\", null); // JDK 12+\n\t\tif (value != null) {\n\t\t\tprint(\" \");\n\t\t\tprint(value);\n\t\t} else {\n\t\t\tName label = readObject(tree, \"label\", null);\n\t\t\tif (label != null) {\n\t\t\t\tprint(\" \");\n\t\t\t\tprint(label);\n\t\t\t}\n\t\t}\n\t\tprintln(\";\", tree);\n\t}\n\t\n\t@Override public void visitContinue(JCContinue tree) {\n\t\taPrint(\"continue\");\n\t\tif (tree.label != null) {\n\t\t\tprint(\" \");\n\t\t\tprint(tree.label);\n\t\t}\n\t\tprintln(\";\", tree);\n\t}\n\t\n\t@Override public void visitConditional(JCConditional tree) {\n\t\tprint(tree.cond);\n\t\tprint(\" ? \");\n\t\tprint(tree.truepart);\n\t\tprint(\" : \");\n\t\tprint(tree.falsepart);\n\t}\n\t\n\t@Override public void visitParens(JCParens tree) {\n\t\tprint(\"(\");\n\t\tprint(tree.expr);\n\t\tprint(\")\");\n\t}\n\t\n\t@Override public void visitReturn(JCReturn tree) {\n\t\taPrint(\"return\");\n\t\tif (tree.expr != null) {\n\t\t\tprint(\" \");\n\t\t\tprint(tree.expr);\n\t\t}\n\t\tprintln(\";\", tree);\n\t}\n\t\n\t@Override public void visitThrow(JCThrow tree) {\n\t\taPrint(\"throw \");\n\t\tprint(tree.expr);\n\t\tprintln(\";\", tree);\n\t}\n\t\n\t@Override public void visitWhileLoop(JCWhileLoop tree) {\n\t\taPrint(\"while \");\n\t\tif (tree.cond instanceof JCParens) {\n\t\t\tprint(tree.cond);\n\t\t} else {\n\t\t\tprint(\"(\");\n\t\t\tprint(tree.cond);\n\t\t\tprint(\")\");\n\t\t}\n\t\tprint(\" \");\n\t\tprint(tree.body);\n\t\t// make sure to test while (true) ; and while(true){} and while(true) x = 5;\n\t}\n\t\n\t@Override public void visitForLoop(JCForLoop tree) {\n\t\taPrint(\"for (\");\n\t\tif (tree.init.nonEmpty()) {\n\t\t\t// ForInit is either a StatementExpressionList or a LocalVariableDeclaration\n\t\t\tif (tree.init.head instanceof JCVariableDecl) {\n\t\t\t\tboolean first = true;\n\t\t\t\tint dims = 0;\n\t\t\t\tfor (JCStatement i : tree.init) {\n\t\t\t\t\tJCVariableDecl vd = (JCVariableDecl) i;\n\t\t\t\t\tif (first) {\n\t\t\t\t\t\tprintVarDefInline(vd);\n\t\t\t\t\t\tdims = dims(vd.vartype);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprint(\", \");\n\t\t\t\t\t\tprint(vd.name);\n\t\t\t\t\t\tint dimDiff = dims(vd.vartype) - dims;\n\t\t\t\t\t\tfor (int j = 0; j < dimDiff; j++) print(\"[]\");\n\t\t\t\t\t\tif (vd.init != null) {\n\t\t\t\t\t\t\tprint(\" = \");\n\t\t\t\t\t\t\tprint(vd.init);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfirst = false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tboolean first = true;\n\t\t\t\tfor (JCStatement exprStatement : tree.init) {\n\t\t\t\t\tif (!first) print(\", \");\n\t\t\t\t\tfirst = false;\n\t\t\t\t\tprint(((JCExpressionStatement) exprStatement).expr);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tprint(\"; \");\n\t\tif (tree.cond != null) print(tree.cond);\n\t\tprint(\"; \");\n\t\tboolean first = true;\n\t\tfor (JCExpressionStatement exprStatement : tree.step) {\n\t\t\tif (!first) print(\", \");\n\t\t\tfirst = false;\n\t\t\tprint(exprStatement.expr);\n\t\t}\n\t\tprint(\") \");\n\t\tprint(tree.body);\n\t}\n\t\n\t@Override public void visitForeachLoop(JCEnhancedForLoop tree) {\n\t\taPrint(\"for (\");\n\t\tJCTree varOrRecordPattern = readObject(tree, \"varOrRecordPattern\", null);\n\t\tif (varOrRecordPattern instanceof JCVariableDecl) {\n\t\t\tprintVarDefInline((JCVariableDecl) varOrRecordPattern);\n\t\t} else if (varOrRecordPattern != null) {\n\t\t\tprint(varOrRecordPattern);\n\t\t} else {\n\t\t\tprintVarDefInline(tree.var);\n\t\t}\n\t\tprint(\" : \");\n\t\tprint(tree.expr);\n\t\tprint(\") \");\n\t\tprint(tree.body);\n\t}\n\t\n\t@Override public void visitIf(JCIf tree) {\n\t\taPrint(\"if \");\n\t\tif (tree.cond instanceof JCParens) {\n\t\t\tprint(tree.cond);\n\t\t} else {\n\t\t\tprint(\"(\");\n\t\t\tprint(tree.cond);\n\t\t\tprint(\")\");\n\t\t}\n\t\tprint(\" \");\n\t\tif (tree.thenpart instanceof JCBlock) {\n\t\t\tprintln(\"{\");\n\t\t\tindent++;\n\t\t\tprint(((JCBlock) tree.thenpart).stats, \"\");\n\t\t\tindent--;\n\t\t\tif (tree.elsepart == null) {\n\t\t\t\taPrintln(\"}\", tree);\n\t\t\t} else {\n\t\t\t\taPrint(\"}\");\n\t\t\t}\n\t\t} else {\n\t\t\tprint(tree.thenpart);\n\t\t}\n\t\tif (tree.elsepart != null) {\n\t\t\taPrint(\" else \");\n\t\t\tprint(tree.elsepart);\n\t\t}\n\t}\n\t\n\t@Override public void visitExec(JCExpressionStatement tree) {\n\t\talign();\n\t\tprint(tree.expr);\n\t\tprintln(\";\", tree);\n\t}\n\t\n\t@Override public void visitDoLoop(JCDoWhileLoop tree) {\n\t\taPrint(\"do \");\n\t\tif (tree.body instanceof JCBlock) {\n\t\t\tprintln(\"{\");\n\t\t\tindent++;\n\t\t\tprint(((JCBlock) tree.body).stats, \"\");\n\t\t\tindent--;\n\t\t\taPrint(\"}\");\n\t\t\t\n\t\t} else print(tree.body);\n\t\tprint(\" while \");\n\t\tif (tree.cond instanceof JCParens) {\n\t\t\tprint(tree.cond);\n\t\t} else {\n\t\t\tprint(\"(\");\n\t\t\tprint(tree.cond);\n\t\t\tprint(\")\");\n\t\t}\n\t\tprintln(\";\", tree);\n\t}\n\t\n\t@Override public void visitSynchronized(JCSynchronized tree) {\n\t\taPrint(\"synchronized \");\n\t\tif (tree.lock instanceof JCParens) {\n\t\t\tprint(tree.lock);\n\t\t} else {\n\t\t\tprint(\"(\");\n\t\t\tprint(tree.lock);\n\t\t\tprint(\")\");\n\t\t}\n\t\tprint(\" \");\n\t\tprint(tree.body);\n\t}\n\t\n\t@Override public void visitCase(JCCase tree) {\n\t\t// Starting with JDK12, switches allow multiple expressions per case, and can take the form of an expression (preview feature).\n\t\t\n\t\tList<JCTree> pats = readObject(tree, \"labels\", null); // JDK 17+\n\t\tif (pats == null) {\n\t\t\tpats = readObject(tree, \"pats\", null); // JDK 12-17\n\t\t}\n\t\tif (pats == null) {\n\t\t\tJCTree pat = readObject(tree, \"pat\", null); // JDK -11\n\t\t\tpats = pat == null ? List.<JCTree>nil() : List.of(pat);\n\t\t}\n\t\t\n\t\tif (pats.isEmpty() || pats.size() == 1 && pats.head.getClass().getName().endsWith(\"$JCDefaultCaseLabel\")) {\n\t\t\taPrint(\"default\");\n\t\t} else {\n\t\t\taPrint(\"case \");\n\t\t\tprint(pats, \", \");\n\t\t\t\n\t\t\tJCExpression guard = readObject(tree, \"guard\", null); // JDK 21+\n\t\t\tif (guard != null) {\n\t\t\t\tprint(\" when \");\n\t\t\t\tprint(guard);\n\t\t\t}\n\t\t}\n\t\t\n\t\tEnum<?> caseKind = readObject(tree, \"caseKind\", null); // JDK 12+\n\t\t\n\t\tif (caseKind != null && caseKind.name().equalsIgnoreCase(\"RULE\")) {\n\t\t\tprint(\" -> \");\n\t\t\tif (tree.stats.head instanceof JCBreak) {\n\t\t\t\tJCBreak b = (JCBreak) tree.stats.head;\n\t\t\t\tprint((JCExpression) readObject(b, \"value\", null));\n\t\t\t\tprint(\";\");\n\t\t\t\tneedsNewLine = true;\n\t\t\t\tneedsAlign = true;\n\t\t\t} else if (tree.stats.head.getClass().getName().endsWith(\"$JCYield\")) {\n\t\t\t\tprint((JCExpression) readObject(tree.stats.head, \"value\", null));\n\t\t\t\tprint(\";\");\n\t\t\t\tneedsNewLine = true;\n\t\t\t\tneedsAlign = true;\n\t\t\t} else {\n\t\t\t\tprint(tree.stats.head);\n\t\t\t\tif (tree.stats.head instanceof JCBlock) needsNewLine = false;\n\t\t\t}\n\t\t} else {\n\t\t\tprintln(\": \");\n\t\t\tindent++;\n\t\t\tprint(tree.stats, \"\");\n\t\t\tindent--;\n\t\t}\n\t}\n\t\n\t@Override public void visitCatch(JCCatch tree) {\n\t\tprint(\" catch (\");\n\t\tprint(tree.param);\n\t\tprint(\") \");\n\t\tprint(tree.body);\n\t}\n\t\n\t@Override public void visitSwitch(JCSwitch tree) {\n\t\taPrint(\"switch \");\n\t\tif (tree.selector instanceof JCParens) {\n\t\t\tprint(tree.selector);\n\t\t} else {\n\t\t\tprint(\"(\");\n\t\t\tprint(tree.selector);\n\t\t\tprint(\")\");\n\t\t}\n\t\tprintln(\" {\");\n\t\tboolean ruleStyle = isCaseRuleStyle(tree.cases.head);\n\t\tif (ruleStyle) indent++;\n\t\tprint(tree.cases, \"\");\n\t\tif (ruleStyle) indent--;\n\t\taPrintln(\"}\", tree);\n\t}\n\t\n\tvoid printSwitchExpression(JCTree tree) {\n\t\taPrint(\"switch \");\n\t\tJCExpression selector = readObject(tree, \"selector\", null);\n\t\tif (selector instanceof JCParens) {\n\t\t\tprint(selector);\n\t\t} else {\n\t\t\tprint(\"(\");\n\t\t\tprint(selector);\n\t\t\tprint(\")\");\n\t\t}\n\t\tprintln(\" {\");\n\t\tList<JCCase> cases = readObject(tree, \"cases\", null);\n\t\tboolean ruleStyle = isCaseRuleStyle(cases.head);\n\t\tif (ruleStyle) indent++;\n\t\tprint(cases, \"\");\n\t\tif (ruleStyle) indent--;\n\t\taPrint(\"}\");\n\t}\n\t\n\tvoid printYieldExpression(JCTree tree) {\n\t\taPrint(\"yield \");\n\t\tJCExpression value = readObject(tree, \"value\", null);\n\t\tprint(value);\n\t\tprintln(\";\", tree);\n\t}\n\t\n\tvoid printBindingPattern(JCTree tree) {\n\t\tJCTree var = readObject(tree, \"var\", tree);\n\t\tif (var instanceof JCVariableDecl) {\n\t\t\tprintVarDef0((JCVariableDecl) var);\n\t\t} else {\n\t\t\tprint((JCExpression) readObject(var, \"vartype\", null));\n\t\t\tprint(\" \");\n\t\t\tprint((Name) readObject(var, \"name\", null));\n\t\t}\n\t}\n\t\n\tvoid printDefaultCase(JCTree tree) {\n\t\tprint(\"default\");\n\t}\n\t\n\tvoid printGuardPattern(JCTree tree) {\n\t\tprint((JCTree) readObject(tree, \"patt\", null));\n\t\tprint(\" && \");\n\t\tprint((JCExpression) readObject(tree, \"expr\", null));\n\t}\n\t\n\tvoid printParenthesizedPattern(JCTree tree) {\n\t\tprint(\"(\");\n\t\tprint((JCTree) readObject(tree, \"pattern\", null));\n\t\tprint(\")\");\n\t}\n\t\n\tvoid printConstantCaseLabel(JCTree tree) {\n\t\tprint((JCTree) readObject(tree, \"expr\", null));\n\t}\n\t\n\tvoid printPatternCaseLabel(JCTree tree) {\n\t\tprint((JCTree) readObject(tree, \"pat\", null));\n\t\tJCTree guard = readObject(tree, \"guard\", null);\n\t\tif (guard != null) {\n\t\t\tprint(\" when \");\n\t\t\tprint(guard);\n\t\t}\n\t}\n\t\n\tvoid printRecordPattern(JCTree tree) {\n\t\tprint((JCTree) readObject(tree, \"deconstructor\", null));\n\t\tprint(\"(\");\n\t\tprint(readObject(tree, \"nested\", List.<JCTree>nil()), \", \");\n\t\tprint(\")\");\n\t\tJCVariableDecl var = readObject(tree, \"var\", null);\n\t\tif (var != null) {\n\t\t\tprint(\" \");\n\t\t\tprint(var.name);\n\t\t}\n\t}\n\t\n\t@Override public void visitTry(JCTry tree) {\n\t\taPrint(\"try \");\n\t\tList<?> resources = readObject(tree, \"resources\", List.nil());\n\t\tint len = resources.length();\n\t\tswitch (len) {\n\t\tcase 0:\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tprint(\"(\");\n\t\t\tJCTree resource = (JCTree) resources.get(0);\n\t\t\tif (resource instanceof JCVariableDecl) {\n\t\t\t\tJCVariableDecl decl = (JCVariableDecl) resource;\n\t\t\t\tflagMod = -1L & ~FINAL;\n\t\t\t\tprintVarDefInline(decl);\n\t\t\t} else {\n\t\t\t\tprint(resource);\n\t\t\t}\n\t\t\tprint(\") \");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tprintln(\"(\");\n\t\t\tindent++;\n\t\t\tint c = 0;\n\t\t\tfor (Object i : resources) {\n\t\t\t\talign();\n\t\t\t\tif (i instanceof JCVariableDecl) {\n\t\t\t\t\tflagMod = -1L & ~FINAL;\n\t\t\t\t\tprintVarDefInline((JCVariableDecl) i);\n\t\t\t\t} else {\n\t\t\t\t\tprint((JCTree) i);\n\t\t\t\t}\n\t\t\t\tif (++c == len) {\n\t\t\t\t\tprint(\") \");\n\t\t\t\t} else {\n\t\t\t\t\tprintln(\";\", (JCTree) i);\n\t\t\t\t}\n\t\t\t}\n\t\t\tindent--;\n\t\t}\n\t\tprintln(\"{\");\n\t\tindent++;\n\t\tfor (JCStatement stat : tree.body.stats) print(stat);\n\t\tindent--;\n\t\taPrint(\"}\");\n\t\tfor (JCCatch catchBlock : tree.catchers) {\n\t\t\tprintCatch(catchBlock);\n\t\t}\n\t\tif (tree.finalizer != null) {\n\t\t\tprintln(\" finally {\");\n\t\t\tindent++;\n\t\t\tfor (JCStatement stat : tree.finalizer.stats) print(stat);\n\t\t\tindent--;\n\t\t\taPrint(\"}\");\n\t\t}\n\t\tprintln(tree);\n\t}\n\t\n\tprivate void printCatch(JCCatch catchBlock) {\n\t\tprint(\" catch (\");\n\t\tprintVarDefInline(catchBlock.param); // ExprType1 | ExprType2 handled via JCTypeUnion.\n\t\tprintln(\") {\");\n\t\tindent++;\n\t\tfor (JCStatement stat : catchBlock.body.stats) print(stat);\n\t\tindent--;\n\t\taPrint(\"}\");\n\t}\n\t\n\tpublic void visitErroneous(JCErroneous tree) {\n\t\tprint(\"(ERROR)\");\n\t}\n\t\n\tprivate static String operator(TreeTag tag) {\n\t\tString op = OPERATORS.get(tag);\n\t\tif (op == null) return \"(?op?)\";\n\t\treturn op;\n\t}\n\t\n\tprivate static String quoteChars(String s) {\n\t\tStringBuilder sb = new StringBuilder();\n\t\tfor (int i = 0; i < s.length(); i++) sb.append(quoteChar(s.charAt(i)));\n\t\treturn sb.toString();\n\t}\n\t\n\tprivate static String quoteChar(char ch) {\n\t\tswitch (ch) {\n\t\tcase '\\b': return \"\\\\b\";\n\t\tcase '\\f': return \"\\\\f\";\n\t\tcase '\\n': return \"\\\\n\";\n\t\tcase '\\r': return \"\\\\r\";\n\t\tcase '\\t': return \"\\\\t\";\n\t\tcase '\\'': return \"\\\\'\";\n\t\tcase '\\\"': return \"\\\\\\\"\";\n\t\tcase '\\\\': return \"\\\\\\\\\";\n\t\tdefault:\n\t\t\tif (ch < 32) return String.format(\"\\\\%03o\", (int) ch);\n\t\t\treturn String.valueOf(ch);\n\t\t}\n\t}\n\t\n\tprivate static final Method getExtendsClause, getEndPosition;\n\t\n\tstatic {\n\t\tgetExtendsClause = getMethod(JCClassDecl.class, \"getExtendsClause\", new Class<?>[0]);\n\t\t\n\t\tif (getJavaCompilerVersion() < 8) {\n\t\t\tgetEndPosition = getMethod(DiagnosticPosition.class, \"getEndPosition\", java.util.Map.class);\n\t\t} else {\n\t\t\tgetEndPosition = getMethod(DiagnosticPosition.class, \"getEndPosition\", \"com.sun.tools.javac.tree.EndPosTable\");\n\t\t}\n\t\tPermit.setAccessible(getEndPosition);\n\t}\n\t\n\tprivate static Method getMethod(Class<?> clazz, String name, Class<?>... paramTypes) {\n\t\ttry {\n\t\t\treturn Permit.getMethod(clazz, name, paramTypes);\n\t\t} catch (NoSuchMethodException e) {\n\t\t\tthrow sneakyThrow(e);\n\t\t}\n\t}\n\t\n\tprivate static Method getMethod(Class<?> clazz, String name, String... paramTypes) {\n\t\ttry {\n\t\t\tClass<?>[] c = new Class[paramTypes.length];\n\t\t\tfor (int i = 0; i < paramTypes.length; i++) c[i] = Class.forName(paramTypes[i]);\n\t\t\treturn Permit.getMethod(clazz, name, c);\n\t\t} catch (NoSuchMethodException e) {\n\t\t\tthrow sneakyThrow(e);\n\t\t} catch (ClassNotFoundException e) {\n\t\t\tthrow sneakyThrow(e);\n\t\t}\n\t}\n\t\n\tpublic static JCTree getExtendsClause(JCClassDecl decl) {\n\t\treturn (JCTree) Permit.invokeSneaky(getExtendsClause, decl);\n\t}\n\t\n\tstatic RuntimeException sneakyThrow(Throwable t) {\n\t\tif (t == null) throw new NullPointerException(\"t\");\n\t\tPrettyPrinter.<RuntimeException>sneakyThrow0(t);\n\t\treturn null;\n\t}\n\t\n\t@SuppressWarnings(\"unchecked\")\n\tprivate static <T extends Throwable> void sneakyThrow0(Throwable t) throws T {\n\t\tthrow (T)t;\n\t}\n\t\n\tprivate static final Map<Class<?>, Map<String, Field>> reflectionCache = new HashMap<Class<?>, Map<String, Field>>();\n\t\n\t@SuppressWarnings(\"unchecked\")\n\tprivate <T> T readObject(JCTree tree, String fieldName, T defaultValue) {\n\t\tClass<?> tClass = tree.getClass();\n\t\tMap<String, Field> c = reflectionCache.get(tClass);\n\t\tif (c == null) reflectionCache.put(tClass, c = new HashMap<String, Field>());\n\t\tField f = c.get(fieldName);\n\t\tif (f == null) {\n\t\t\ttry {\n\t\t\t\tf = Permit.getField(tClass, fieldName);\n\t\t\t} catch (Exception e) {\n\t\t\t\treturn defaultValue;\n\t\t\t}\n\t\t\tc.put(fieldName, f);\n\t\t}\n\t\t\n\t\ttry {\n\t\t\treturn (T) f.get(tree);\n\t\t} catch (Exception e) {\n\t\t\treturn defaultValue;\n\t\t}\n\t}\n\t\n\tpublic void visitTypeBoundKind(TypeBoundKind tree) {\n\t\tprint(String.valueOf(tree.kind));\n\t}\n\t\n\t@Override public void visitTree(JCTree tree) {\n\t\tString className = tree.getClass().getName();\n\t\tif (className.endsWith(\"$JCTypeUnion\")) {\n\t\t\tList<JCExpression> types = readObject(tree, \"alternatives\", List.<JCExpression>nil());\n\t\t\tprint(types, \" | \");\n\t\t} else if (className.endsWith(\"$JCTypeIntersection\")) {\n\t\t\tprint(readObject(tree, \"bounds\", List.<JCExpression>nil()), \" & \");\n\t\t} else if (className.endsWith(\"$JCMemberReference\")) {\n\t\t\tprintMemberReference0(tree);\n\t\t} else if (className.endsWith(\"$JCLambda\")) {\n\t\t\tprintLambda0(tree);\n\t\t} else if (className.endsWith(\"$JCAnnotatedType\")) {\n\t\t\tprintAnnotatedType0(tree);\n\t\t} else if (className.endsWith(\"$JCPackageDecl\")) {\n\t\t\t// Starting with JDK9, this is inside the import list, but we've already printed it. Just ignore it.\n\t\t} else if (className.endsWith(\"$JCSwitchExpression\")) { // Introduced as preview feature in JDK12\n\t\t\tprintSwitchExpression(tree);\n\t\t} else if (className.endsWith(\"$JCYield\")) { // Introduced as preview feature in JDK13, part of switch expressions.\n\t\t\tprintYieldExpression(tree);\n\t\t} else if (className.endsWith(\"$JCBindingPattern\")) { // Introduced as preview in JDK14\n\t\t\tprintBindingPattern(tree);\n\t\t} else if (className.endsWith(\"$JCDefaultCaseLabel\")) { // Introduced in JDK17\n\t\t\tprintDefaultCase(tree);\n\t\t} else if (className.endsWith(\"$JCGuardPattern\")) { // Introduced in JDK17\n\t\t\tprintGuardPattern(tree);\n\t\t} else if (className.endsWith(\"$JCParenthesizedPattern\")) { // Introduced in JDK17\n\t\t\tprintParenthesizedPattern(tree);\n\t\t} else if (className.endsWith(\"$JCConstantCaseLabel\")) { // Introduced in JDK19\n\t\t\tprintConstantCaseLabel(tree);\n\t\t} else if (className.endsWith(\"$JCPatternCaseLabel\")) { // Introduced in JDK19\n\t\t\tprintPatternCaseLabel(tree);\n\t\t} else if (className.endsWith(\"$JCRecordPattern\")) { // Introduced in JDK19\n\t\t\tprintRecordPattern(tree);\n\t\t} else if (className.endsWith(\"$JCAnyPattern\")) { // Introduced in JDK22\n\t\t\tprint(\"_\");\n\t\t} else if (className.endsWith(\"$JCModuleImport\")) { // Introduced in JDK25\n\t\t\tprintModuleImport(tree);\n\t\t} else {\n\t\t\tthrow new AssertionError(\"Unhandled tree type: \" + tree.getClass() + \": \" + tree);\n\t\t}\n\t}\n\t\n\tprivate boolean isCaseRuleStyle(JCCase tree) {\n\t\tif (tree == null) return false;\n\t\tEnum<?> caseKind = readObject(tree, \"caseKind\", null); // JDK 12+\n\t\treturn caseKind != null && caseKind.name().equalsIgnoreCase(\"RULE\");\n\t}\n\t\n\tprivate boolean jcAnnotatedTypeInit = false;\n\tprivate Class<?> jcAnnotatedTypeClass = null;\n\t\n\tprivate boolean isJcAnnotatedType(Object o) {\n\t\tif (o == null) return false;\n\t\tif (jcAnnotatedTypeInit) return jcAnnotatedTypeClass == o.getClass();\n\t\tClass<?> c = o.getClass();\n\t\tif (c.getName().endsWith(\"$JCAnnotatedType\")) {\n\t\t\tjcAnnotatedTypeClass = c;\n\t\t\tjcAnnotatedTypeInit = true;\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\tprivate void printMemberReference0(JCTree tree) {\n\t\tprint(readObject(tree, \"expr\", (JCExpression) null));\n\t\tprint(\"::\");\n\t\tList<JCExpression> typeArgs = readObject(tree, \"typeargs\", List.<JCExpression>nil());\n\t\tif (typeArgs != null && !typeArgs.isEmpty()) {\n\t\t\tprint(\"<\");\n\t\t\tprint(typeArgs, \", \");\n\t\t\tprint(\">\");\n\t\t}\n\t\tprint(readObject(tree, \"mode\", new Object()).toString().equals(\"INVOKE\") ? readObject(tree, \"name\", (Name) null) : \"new\");\n\t}\n\t\n\tprivate void printLambda0(JCTree tree) {\n\t\tList<JCVariableDecl> params = readObject(tree, \"params\", List.<JCVariableDecl>nil());\n\t\tboolean explicit = true;\n\t\tint paramLength = params.size();\n\t\ttry {\n\t\t\texplicit = readObject(tree, \"paramKind\", new Object()).toString().equals(\"EXPLICIT\");\n\t\t} catch (Exception e) {}\n\t\tboolean useParens = paramLength != 1 || explicit;\n\t\tif (useParens) print(\"(\");\n\t\tif (explicit) {\n\t\t\tboolean first = true;\n\t\t\tfor (JCVariableDecl vd : params) {\n\t\t\t\tif (!first) print(\", \");\n\t\t\t\tfirst = false;\n\t\t\t\tprintVarDefInline(vd);\n\t\t\t}\n\t\t} else {\n\t\t\tString sep = \"\";\n\t\t\tfor (JCVariableDecl param : params) {\n\t\t\t\tprint(sep);\n\t\t\t\tprint(param.name);\n\t\t\t\tsep = \", \";\n\t\t\t}\n\t\t}\n\t\tif (useParens) print(\")\");\n\t\tprint(\" -> \");\n\t\tJCTree body = readObject(tree, \"body\", (JCTree) null);\n\t\tif (body instanceof JCBlock) {\n\t\t\tprintln(\"{\");\n\t\t\tindent++;\n\t\t\tprint(((JCBlock) body).stats, \"\");\n\t\t\tindent--;\n\t\t\taPrint(\"}\");\n\t\t} else {\n\t\t\tprint(body);\n\t\t}\n\t}\n\t\n\tprivate void printAnnotatedType0(JCTree tree) {\n\t\tJCTree underlyingType = readObject(tree, \"underlyingType\", (JCTree) null);\n\t\tif (underlyingType instanceof JCFieldAccess) {\n\t\t\tprint(((JCFieldAccess) underlyingType).selected);\n\t\t\tprint(\".\");\n\t\t\tprint(readObject(tree, \"annotations\", List.<JCExpression>nil()), \" \");\n\t\t\tprint(\" \");\n\t\t\tprint(((JCFieldAccess) underlyingType).name);\n\t\t} else if (underlyingType instanceof JCArrayTypeTree) {\n\t\t\tprintTypeArray0(tree);\n\t\t} else {\n\t\t\tprint(readObject(tree, \"annotations\", List.<JCExpression>nil()), \" \");\n\t\t\tprint(\" \");\n\t\t\tprint(underlyingType);\n\t\t}\n\t}\n\t\n\tprivate void printTypeArray0(JCTree tree) {\n\t\tJCTree inner = tree;\n\t\tint dimCount = 0;\n\t\t\n\t\twhile (true) {\n\t\t\tif (inner instanceof JCArrayTypeTree) {\n\t\t\t\tinner = ((JCArrayTypeTree) inner).elemtype;\n\t\t\t\tdimCount++;\n\t\t\t\tcontinue;\n\t\t\t} else if (isJcAnnotatedType(inner)) {\n\t\t\t\tJCTree underlyingType = readObject(inner, \"underlyingType\", (JCTree) null);\n\t\t\t\tif (underlyingType instanceof JCArrayTypeTree) {\n\t\t\t\t\tinner = ((JCArrayTypeTree) underlyingType).elemtype;\n\t\t\t\t\tdimCount++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\t\n\t\tprint(inner);\n\t\t\n\t\tinner = tree;\n\t\twhile (true) {\n\t\t\tif (inner instanceof JCArrayTypeTree) {\n\t\t\t\tdimCount--;\n\t\t\t\tprint((dimCount == 0 && innermostArrayBracketsAreVarargs) ? \"...\" : \"[]\");\n\t\t\t\tinner = ((JCArrayTypeTree) inner).elemtype;\n\t\t\t\tcontinue;\n\t\t\t} else if (isJcAnnotatedType(inner)) {\n\t\t\t\tJCTree underlyingType = readObject(inner, \"underlyingType\", (JCTree) null);\n\t\t\t\tif (underlyingType instanceof JCArrayTypeTree) {\n\t\t\t\t\tdimCount--;\n\t\t\t\t\tprint(\" \");\n\t\t\t\t\tprint(readObject(inner, \"annotations\", List.<JCExpression>nil()), \" \");\n\t\t\t\t\tprint(\" \");\n\t\t\t\t\tprint((dimCount == 0 && innermostArrayBracketsAreVarargs) ? \"...\" : \"[]\");\n\t\t\t\t\tinner = ((JCArrayTypeTree) underlyingType).elemtype;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/delombok/lombok/delombok/UnicodeEscapeWriter.java",
    "content": "/*\n * Copyright (C) 2009 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.delombok;\nimport java.io.IOException;\nimport java.io.Writer;\nimport java.nio.charset.Charset;\nimport java.nio.charset.CharsetEncoder;\n\npublic class UnicodeEscapeWriter extends Writer {\n\tprivate final Writer writer;\n\tprivate CharsetEncoder encoder;\n\n\tpublic UnicodeEscapeWriter(Writer writer, Charset charset) {\n\t\tthis.writer = writer;\n\t\tencoder = charset.newEncoder();\n\t}\n\t\n\t@Override\n\tpublic void close() throws IOException {\n\t\twriter.close();\n\t}\n\n\t@Override\n\tpublic void flush() throws IOException {\n\t\twriter.flush();\n\t}\n\n\t@Override\n\tpublic final void write(char[] cbuf, int off, int len) throws IOException {\n\t\tint start = off;\n\t\tint index = start;\n\t\tint end = off + len;\n\t\twhile (index < end) {\n\t\t\tif (!encoder.canEncode(cbuf[index])) {\n\t\t\t\twriter.write(cbuf, start, index - start);\n\t\t\t\twriteUnicodeEscape(cbuf[index]);\n\t\t\t\tstart = index + 1;\n\t\t\t}\n\t\t\tindex++;\n\t\t}\n\t\tif (start < end) {\n\t\t\twriter.write(cbuf, start, end - start);\n\t\t}\n\t}\n\t\n\tprotected void writeUnicodeEscape(char c) throws IOException {\n\t\twriter.write(String.format(\"\\\\u%04x\", (int) c));\n\t}\n}"
  },
  {
    "path": "src/delombok/lombok/delombok/ant/DelombokTask.java",
    "content": "/*\n * Copyright (C) 2009-2018 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.delombok.ant;\n\nimport java.io.File;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\nimport java.lang.reflect.Modifier;\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport org.apache.tools.ant.BuildException;\nimport org.apache.tools.ant.Location;\nimport org.apache.tools.ant.Task;\nimport org.apache.tools.ant.types.FileSet;\nimport org.apache.tools.ant.types.Path;\nimport org.apache.tools.ant.types.Reference;\n\n@SuppressWarnings(\"unused\") // we use reflection to transfer fields.\nclass Tasks {\n\tpublic static class Format {\n\t\tprivate String value;\n\t\t\n\t\t@Override public int hashCode() {\n\t\t\tfinal int prime = 31;\n\t\t\tint result = 1;\n\t\t\tresult = prime * result + ((value == null) ? 0 : value.hashCode());\n\t\t\treturn result;\n\t\t}\n\t\t\n\t\t@Override public boolean equals(Object obj) {\n\t\t\tif (this == obj) return true;\n\t\t\tif (obj == null) return false;\n\t\t\tif (getClass() != obj.getClass()) return false;\n\t\t\tFormat other = (Format) obj;\n\t\t\tif (value == null) {\n\t\t\t\tif (other.value != null) return false;\n\t\t\t} else if (!value.equals(other.value)) return false;\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\t@Override public String toString() {\n\t\t\treturn \"FormatOption [value=\" + value + \"]\";\n\t\t}\n\t\t\n\t\tpublic String getValue() {\n\t\t\treturn value;\n\t\t}\n\t\t\n\t\tpublic void setValue(String value) {\n\t\t\tthis.value = value;\n\t\t}\n\t}\n\t\n\tpublic static class Delombok extends Task {\n\t\tprivate File fromDir, toDir;\n\t\tprivate Path classpath;\n\t\tprivate Path sourcepath;\n\t\tprivate Path modulepath;\n\t\tprivate boolean verbose;\n\t\tprivate String encoding;\n\t\tprivate Path path;\n\t\tprivate List<Format> formatOptions = new ArrayList<Format>();\n\t\t\n\t\tpublic void setClasspath(Path classpath) {\n\t\t\tif (this.classpath == null) {\n\t\t\t\tthis.classpath = classpath;\n\t\t\t} else {\n\t\t\t\tthis.classpath.append(classpath);\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic Path createClasspath() {\n\t\t\tif (classpath == null) classpath = new Path(getProject());\n\t\t\treturn classpath.createPath();\n\t\t}\n\t\t\n\t\tpublic void setClasspathRef(Reference r) {\n\t\t\tcreateClasspath().setRefid(r);\n\t\t}\n\t\t\n\t\tpublic void setSourcepath(Path sourcepath) {\n\t\t\tif (this.sourcepath == null) {\n\t\t\t\tthis.sourcepath = sourcepath;\n\t\t\t} else {\n\t\t\t\tthis.sourcepath.append(sourcepath);\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic Path createSourcepath() {\n\t\t\tif (sourcepath == null) sourcepath = new Path(getProject());\n\t\t\treturn sourcepath.createPath();\n\t\t}\n\t\t\n\t\tpublic void setSourcepathRef(Reference r) {\n\t\t\tcreateSourcepath().setRefid(r);\n\t\t}\n\t\t\n\t\tpublic void setModulepath(Path modulepath) {\n\t\t\tif (this.modulepath == null) {\n\t\t\t\tthis.modulepath = modulepath;\n\t\t\t} else {\n\t\t\t\tthis.modulepath.append(modulepath);\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic Path createModulepath() {\n\t\t\tif (modulepath == null) modulepath = new Path(getProject());\n\t\t\treturn modulepath.createPath();\n\t\t}\n\t\t\n\t\tpublic void setModulepathRef(Reference r) {\n\t\t\tcreateModulepath().setRefid(r);\n\t\t}\n\t\t\n\t\tpublic void setFrom(File dir) {\n\t\t\tthis.fromDir = dir;\n\t\t}\n\t\t\n\t\tpublic void setTo(File dir) {\n\t\t\tthis.toDir = dir;\n\t\t}\n\t\t\n\t\tpublic void setVerbose(boolean verbose) {\n\t\t\tthis.verbose = verbose;\n\t\t}\n\t\t\n\t\tpublic void setEncoding(String encoding) {\n\t\t\tthis.encoding = encoding;\n\t\t}\n\t\t\n\t\tpublic void addFileset(FileSet set) {\n\t\t\tif (path == null) path = new Path(getProject());\n\t\t\tpath.add(set);\n\t\t}\n\t\t\n\t\tpublic void addFormat(Format format) {\n\t\t\tformatOptions.add(format);\n\t\t}\n\t\t\n\t\tprivate static ClassLoader shadowLoader;\n\t\t\n\t\tpublic static Class<?> shadowLoadClass(String name) {\n\t\t\ttry {\n\t\t\t\tif (shadowLoader == null) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tClass.forName(\"lombok.core.LombokNode\");\n\t\t\t\t\t\t// If we get here, then lombok is already available.\n\t\t\t\t\t\tshadowLoader = Delombok.class.getClassLoader();\n\t\t\t\t\t} catch (ClassNotFoundException e) {\n\t\t\t\t\t\t// If we get here, it isn't, and we should use the shadowloader.\n\t\t\t\t\t\tClass<?> launcherMain = Class.forName(\"lombok.launch.Main\");\n\t\t\t\t\t\tMethod m = launcherMain.getDeclaredMethod(\"getShadowClassLoader\");\n\t\t\t\t\t\tm.setAccessible(true);\n\t\t\t\t\t\tshadowLoader = (ClassLoader) m.invoke(null);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn Class.forName(name, true, shadowLoader);\n\t\t\t} catch (Throwable t) {\n\t\t\t\tif (t instanceof InvocationTargetException) t = t.getCause();\n\t\t\t\tif (t instanceof RuntimeException) throw (RuntimeException) t;\n\t\t\t\tif (t instanceof Error) throw (Error) t;\n\t\t\t\tthrow new RuntimeException(t);\n\t\t\t}\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic void execute() throws BuildException {\n\t\t\tLocation loc = getLocation();\n\t\t\t\n\t\t\ttry {\n\t\t\t\tObject instance = shadowLoadClass(\"lombok.delombok.ant.DelombokTaskImpl\").getConstructor().newInstance();\n\t\t\t\tfor (Field selfField : getClass().getDeclaredFields()) {\n\t\t\t\t\tif (selfField.isSynthetic() || Modifier.isStatic(selfField.getModifiers())) continue;\n\t\t\t\t\tField otherField = instance.getClass().getDeclaredField(selfField.getName());\n\t\t\t\t\totherField.setAccessible(true);\n\t\t\t\t\tif (selfField.getName().equals(\"formatOptions\")) {\n\t\t\t\t\t\tList<String> rep = new ArrayList<String>();\n\t\t\t\t\t\tfor (Format f : formatOptions) {\n\t\t\t\t\t\t\tif (f.getValue() == null) throw new BuildException(\"'value' property required for <format>\");\n\t\t\t\t\t\t\trep.add(f.getValue());\n\t\t\t\t\t\t}\n\t\t\t\t\t\totherField.set(instance, rep);\n\t\t\t\t\t} else {\n\t\t\t\t\t\totherField.set(instance, selfField.get(this));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tMethod m = instance.getClass().getMethod(\"execute\", Location.class);\n\t\t\t\tm.invoke(instance, loc);\n\t\t\t} catch (Throwable t) {\n\t\t\t\tif (t instanceof InvocationTargetException) t = t.getCause();\n\t\t\t\tif (t instanceof RuntimeException) throw (RuntimeException) t;\n\t\t\t\tif (t instanceof Error) throw (Error) t;\n\t\t\t\tthrow new RuntimeException(t);\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/delombok/lombok/delombok/ant/DelombokTaskImpl.java",
    "content": "/*\n * Copyright (C) 2009-2018 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.delombok.ant;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.nio.charset.UnsupportedCharsetException;\nimport java.util.ArrayList;\nimport java.util.Iterator;\nimport java.util.List;\n\nimport lombok.delombok.Delombok;\nimport lombok.delombok.Delombok.InvalidFormatOptionException;\n\nimport org.apache.tools.ant.BuildException;\nimport org.apache.tools.ant.Location;\nimport org.apache.tools.ant.types.Path;\nimport org.apache.tools.ant.types.resources.FileResource;\n\npublic class DelombokTaskImpl {\n\tprivate File fromDir, toDir;\n\tprivate Path classpath;\n\tprivate Path sourcepath;\n\tprivate Path modulepath;\n\tprivate boolean verbose;\n\tprivate String encoding;\n\tprivate Path path;\n\tprivate List<String> formatOptions = new ArrayList<String>();\n\t\n\tpublic void execute(Location location) throws BuildException {\n\t\tif (fromDir == null && path == null) throw new BuildException(\"Either 'from' attribute, or nested <fileset> tags are required.\");\n\t\tif (fromDir != null && path != null) throw new BuildException(\"You can't specify both 'from' attribute and nested filesets. You need one or the other.\");\n\t\tif (toDir == null) throw new BuildException(\"The to attribute is required.\");\n\t\t\n\t\tDelombok delombok = new Delombok();\n\t\tif (verbose) delombok.setVerbose(true);\n\t\ttry {\n\t\t\tif (encoding != null) delombok.setCharset(encoding);\n\t\t} catch (UnsupportedCharsetException e) {\n\t\t\tthrow new BuildException(\"Unknown charset: \" + encoding, location);\n\t\t}\n\t\t\n\t\tif (classpath != null) delombok.setClasspath(classpath.toString());\n\t\tif (sourcepath != null) delombok.setSourcepath(sourcepath.toString());\n\t\tif (modulepath != null) delombok.setModulepath(modulepath.toString());\n\t\t\n\t\ttry {\n\t\t\tdelombok.setFormatPreferences(Delombok.formatOptionsToMap(formatOptions));\n\t\t} catch (InvalidFormatOptionException e) {\n\t\t\tthrow new BuildException(e.getMessage() + \" Run java -jar lombok.jar --format-help for detailed format help.\");\n\t\t}\n\t\t\n\t\tdelombok.setOutput(toDir);\n\t\ttry {\n\t\t\tif (fromDir != null) delombok.addDirectory(fromDir);\n\t\t\telse {\n\t\t\t\tIterator<?> it = path.iterator();\n\t\t\t\twhile (it.hasNext()) {\n\t\t\t\t\tFileResource fileResource = (FileResource) it.next();\n\t\t\t\t\tFile baseDir = fileResource.getBaseDir();\n\t\t\t\t\tif (baseDir == null) {\n\t\t\t\t\t\tFile file = fileResource.getFile();\n\t\t\t\t\t\tdelombok.addFile(file.getParentFile(), file.getName());\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdelombok.addFile(baseDir, fileResource.getName());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tdelombok.delombok();\n\t\t} catch (IOException e) {\n\t\t\tthrow new BuildException(\"I/O problem during delombok\", e, location);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/eclipseAgent/lombok/eclipse/agent/EclipseLoaderPatcher.java",
    "content": "/*\n * Copyright (C) 2015 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.agent;\n\nimport lombok.patcher.ClassRootFinder;\nimport lombok.patcher.Hook;\nimport lombok.patcher.MethodTarget;\nimport lombok.patcher.ScriptManager;\nimport lombok.patcher.StackRequest;\nimport lombok.patcher.scripts.ScriptBuilder;\n\npublic class EclipseLoaderPatcher {\n\tprivate static final String TRANSPLANTS_CLASS_NAME = \"lombok.eclipse.agent.EclipseLoaderPatcherTransplants\";\n\t\n\tstatic final String[] OSGI_TYPES = {\n\t\t\"org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader\",\n\t\t\"org/eclipse/osgi/framework/adapter/core/AbstractClassLoader\",\n\t\t\"org/eclipse/osgi/internal/loader/ModuleClassLoader\"\n\t};\n\t\n\tpublic static void patchEquinoxLoaders(ScriptManager sm, Class<?> launchingContext) {\n\t\tsm.addScript(ScriptBuilder.exitEarly()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader\", \"loadClass\",\n\t\t\t\t\t\t\"java.lang.Class\", \"java.lang.String\", \"boolean\"))\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.osgi.framework.adapter.core.AbstractClassLoader\", \"loadClass\",\n\t\t\t\t\t\t\"java.lang.Class\", \"java.lang.String\", \"boolean\"))\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.osgi.internal.loader.ModuleClassLoader\", \"loadClass\",\n\t\t\t\t\t\t\"java.lang.Class\", \"java.lang.String\", \"boolean\"))\n\t\t\t\t.decisionMethod(new Hook(TRANSPLANTS_CLASS_NAME, \"overrideLoadDecide\", \"boolean\", \"java.lang.ClassLoader\", \"java.lang.String\", \"boolean\"))\n\t\t\t\t.valueMethod(new Hook(TRANSPLANTS_CLASS_NAME, \"overrideLoadResult\", \"java.lang.Class\", \"java.lang.ClassLoader\", \"java.lang.String\", \"boolean\"))\n\t\t\t\t.transplant()\n\t\t\t\t.request(StackRequest.THIS, StackRequest.PARAM1, StackRequest.PARAM2).build());\n\t\t\n\t\tsm.addScript(ScriptBuilder.addField().setPublic().setVolatile()\n\t\t\t\t.fieldType(\"Ljava/lang/ClassLoader;\")\n\t\t\t\t.fieldName(\"lombok$shadowLoader\")\n\t\t\t\t.targetClass(\"org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader\")\n\t\t\t\t.targetClass(\"org.eclipse.osgi.framework.adapter.core.AbstractClassLoader\")\n\t\t\t\t.targetClass(\"org.eclipse.osgi.internal.loader.ModuleClassLoader\")\n\t\t\t\t.build());\n\t\t\n\t\tsm.addScript(ScriptBuilder.addField().setPublic().setVolatile().setStatic()\n\t\t\t\t.fieldType(\"Ljava/lang/Class;\")\n\t\t\t\t.fieldName(\"lombok$shadowLoaderClass\")\n\t\t\t\t.targetClass(\"org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader\")\n\t\t\t\t.targetClass(\"org.eclipse.osgi.framework.adapter.core.AbstractClassLoader\")\n\t\t\t\t.targetClass(\"org.eclipse.osgi.internal.loader.ModuleClassLoader\")\n\t\t\t\t.build());\n\t\t\n\t\tsm.addScript(ScriptBuilder.addField().setPublic().setStatic().setFinal()\n\t\t\t\t.fieldType(\"Ljava/lang/String;\")\n\t\t\t\t.fieldName(\"lombok$location\")\n\t\t\t\t.targetClass(\"org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader\")\n\t\t\t\t.targetClass(\"org.eclipse.osgi.framework.adapter.core.AbstractClassLoader\")\n\t\t\t\t.targetClass(\"org.eclipse.osgi.internal.loader.ModuleClassLoader\")\n\t\t\t\t.value(ClassRootFinder.findClassRootOfClass(launchingContext))\n\t\t\t\t.build());\n\t}\n}\n"
  },
  {
    "path": "src/eclipseAgent/lombok/eclipse/agent/EclipseLoaderPatcherTransplants.java",
    "content": "/*\n * Copyright (C) 2015 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.agent;\n\nimport java.io.InputStream;\nimport java.lang.reflect.Constructor;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\nimport java.util.Arrays;\nimport java.util.jar.JarFile;\nimport java.util.zip.ZipEntry;\n\n/**\n * Contains all the code to be transplanted into eclipse.\n * \n * Do not use:\n * \n * * Annotations\n * * Generics\n * * Varargs\n * * Auto (un)boxing\n * * class literals\n * \n * The above because this code is compiled with -source 1.4, and is transplanted.\n * \n * NB: The suppress warnings will be stripped out before compilation.\n */\n@SuppressWarnings(\"all\")\npublic class EclipseLoaderPatcherTransplants {\n\tpublic static boolean overrideLoadDecide(ClassLoader original, String name, boolean resolve) {\n\t\treturn name.startsWith(\"lombok.\");\n\t}\n\t\n\tpublic static Class overrideLoadResult(ClassLoader original, String name, boolean resolve) throws ClassNotFoundException {\n\t\tboolean bootstrap = name.equals(\"lombok.launch.PackageShader\") || name.equals(\"lombok.launch.ClassFileMetaData\");\n\t\ttry {\n\t\t\tField shadowLoaderField = original.getClass().getField(\"lombok$shadowLoader\");\n\t\t\tClassLoader shadowLoader = (ClassLoader) shadowLoaderField.get(original);\n\t\t\tif (bootstrap || shadowLoader == null) {\n\t\t\t\tsynchronized (\"lombok$shadowLoader$globalLock\".intern()) {\n\t\t\t\t\tshadowLoader = (ClassLoader) shadowLoaderField.get(original);\n\t\t\t\t\tif (bootstrap || shadowLoader == null) {\n\t\t\t\t\t\tClass shadowClassLoaderClass = (Class) original.getClass().getField(\"lombok$shadowLoaderClass\").get(null);\n\t\t\t\t\t\tClass classLoaderClass = Class.forName(\"java.lang.ClassLoader\");\n\t\t\t\t\t\tString jarLoc = (String) original.getClass().getField(\"lombok$location\").get(null);\n\t\t\t\t\t\tif (bootstrap || shadowClassLoaderClass == null) {\n\t\t\t\t\t\t\tJarFile jf = new JarFile(jarLoc);\n\t\t\t\t\t\t\tInputStream in = null;\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tZipEntry entry = jf.getEntry(bootstrap ? (name.replace(\".\", \"/\") + \".class\") : \"lombok/launch/ShadowClassLoader.class\");\n\t\t\t\t\t\t\t\tif (entry == null) {\n\t\t\t\t\t\t\t\t\tbootstrap = false;\n\t\t\t\t\t\t\t\t\tentry = jf.getEntry(\"lombok/launch/ShadowClassLoader.class\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tin = jf.getInputStream(entry);\n\t\t\t\t\t\t\t\tbyte[] bytes = new byte[65536];\n\t\t\t\t\t\t\t\tint len = 0;\n\t\t\t\t\t\t\t\twhile (true) {\n\t\t\t\t\t\t\t\t\tint r = in.read(bytes, len, bytes.length - len);\n\t\t\t\t\t\t\t\t\tif (r == -1) break;\n\t\t\t\t\t\t\t\t\tlen += r;\n\t\t\t\t\t\t\t\t\tif (len == bytes.length) throw new IllegalStateException((bootstrap ? name : \"lombok.launch.ShadowClassLoader\") + \" too large.\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tin.close();\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t/* Since Java 16 reflective access to ClassLoader.defineClass is no longer permitted. The recommended solution \n\t\t\t\t\t\t\t\t\t * is to use MethodHandles.lookup().defineClass which is useless here because it is limited to classes in the\n\t\t\t\t\t\t\t\t\t * same package. Fortunately this code gets transplanted into a ClassLoader and we can call the parent method\n\t\t\t\t\t\t\t\t\t * using a MethodHandle. To support old Java versions we use a reflective version of the code snippet below.\n\t\t\t\t\t\t\t\t\t * \n\t\t\t\t\t\t\t\t\t * Lookup lookup = MethodHandles.lookup();\n\t\t\t\t\t\t\t\t\t * MethodType type = MethodType.methodType(Class.class, new Class[] {String.class, byte[].class, int.class, int.class});\n\t\t\t\t\t\t\t\t\t * MethodHandle method = lookup.findVirtual(original.getClass(), \"defineClass\", type);\n\t\t\t\t\t\t\t\t\t * shadowClassLoaderClass = (Class) method.invokeWithArguments(original, \"lombok.launch.ShadowClassLoader\", bytes, new Integer(0), new Integer(len)}) \n\t\t\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t\t\tClass methodHandles = Class.forName(\"java.lang.invoke.MethodHandles\");\n\t\t\t\t\t\t\t\t\tClass methodHandle = Class.forName(\"java.lang.invoke.MethodHandle\");\n\t\t\t\t\t\t\t\t\tClass methodType = Class.forName(\"java.lang.invoke.MethodType\");\n\t\t\t\t\t\t\t\t\tClass methodHandlesLookup = Class.forName(\"java.lang.invoke.MethodHandles$Lookup\");\n\t\t\t\t\t\t\t\t\tMethod lookupMethod = methodHandles.getDeclaredMethod(\"lookup\", null);\n\t\t\t\t\t\t\t\t\tMethod methodTypeMethod = methodType.getDeclaredMethod(\"methodType\", new Class[] {Class.class, Class[].class});\n\t\t\t\t\t\t\t\t\tMethod findVirtualMethod = methodHandlesLookup.getDeclaredMethod(\"findVirtual\", new Class[] {Class.class, String.class, methodType});\n\t\t\t\t\t\t\t\t\tMethod invokeMethod = methodHandle.getDeclaredMethod(\"invokeWithArguments\", new Class[] {Object[].class});\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tObject lookup = lookupMethod.invoke(null, null);\n\t\t\t\t\t\t\t\t\tObject type = methodTypeMethod.invoke(null, new Object[] {Class.class, new Class[] {String.class, byte[].class, int.class, int.class}});\n\t\t\t\t\t\t\t\t\tObject method = findVirtualMethod.invoke(lookup, new Object[] {original.getClass(), \"defineClass\", type});\n\t\t\t\t\t\t\t\t\tClass c = (Class) invokeMethod.invoke(method, new Object[] {new Object[] {original, bootstrap ? name : \"lombok.launch.ShadowClassLoader\", bytes, new Integer(0), new Integer(len)}});\n\t\t\t\t\t\t\t\t\tif (bootstrap) return c;\n\t\t\t\t\t\t\t\t\tshadowClassLoaderClass = c;\n\t\t\t\t\t\t\t\t} catch (ClassNotFoundException e) {\n\t\t\t\t\t\t\t\t\t// Ignore, old Java\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (shadowClassLoaderClass == null) {\n\t\t\t\t\t\t\t\t\tClass[] paramTypes = new Class[4];\n\t\t\t\t\t\t\t\t\tparamTypes[0] = \"\".getClass();\n\t\t\t\t\t\t\t\t\tparamTypes[1] = new byte[0].getClass();\n\t\t\t\t\t\t\t\t\tparamTypes[2] = Integer.TYPE;\n\t\t\t\t\t\t\t\t\tparamTypes[3] = paramTypes[2];\n\t\t\t\t\t\t\t\t\tMethod defineClassMethod = classLoaderClass.getDeclaredMethod(\"defineClass\", paramTypes);\n\t\t\t\t\t\t\t\t\tdefineClassMethod.setAccessible(true);\n\t\t\t\t\t\t\t\t\tClass c = (Class) defineClassMethod.invoke(original, new Object[] {bootstrap ? name : \"lombok.launch.ShadowClassLoader\", bytes, new Integer(0), new Integer(len)});\n\t\t\t\t\t\t\t\t\tif (bootstrap) return c;\n\t\t\t\t\t\t\t\t\tshadowClassLoaderClass = c;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\toriginal.getClass().getField(\"lombok$shadowLoaderClass\").set(null, shadowClassLoaderClass);\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tif (in != null) in.close();\n\t\t\t\t\t\t\t\tjf.close();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tClass[] paramTypes = new Class[5];\n\t\t\t\t\t\tparamTypes[0] = classLoaderClass;\n\t\t\t\t\t\tparamTypes[1] = \"\".getClass();\n\t\t\t\t\t\tparamTypes[2] = paramTypes[1];\n\t\t\t\t\t\tparamTypes[3] = Class.forName(\"java.util.List\");\n\t\t\t\t\t\tparamTypes[4] = paramTypes[3];\n\t\t\t\t\t\tConstructor constructor = shadowClassLoaderClass.getDeclaredConstructor(paramTypes);\n\t\t\t\t\t\tconstructor.setAccessible(true);\n\t\t\t\t\t\tshadowLoader = (ClassLoader) constructor.newInstance(new Object[] {original, \"lombok\", jarLoc, Arrays.asList(new Object[] {\"lombok.\"}), Arrays.asList(new Object[] {\"lombok.patcher.Symbols\"})});\n\t\t\t\t\t\tshadowLoaderField.set(original, shadowLoader);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (resolve) {\n\t\t\t\tClass[] paramTypes = new Class[2];\n\t\t\t\tparamTypes[0] = \"\".getClass();\n\t\t\t\tparamTypes[1] = Boolean.TYPE;\n\t\t\t\tMethod m = shadowLoader.getClass().getDeclaredMethod(\"loadClass\", new Class[] {String.class, boolean.class});\n\t\t\t\tm.setAccessible(true);\n\t\t\t\treturn (Class) m.invoke(shadowLoader, new Object[] {name, Boolean.TRUE});\n\t\t\t} else {\n\t\t\t\treturn shadowLoader.loadClass(name);\n\t\t\t}\n\t\t} catch (Exception ex) {\n\t\t\tThrowable t = ex;\n\t\t\tif (t instanceof InvocationTargetException) t = t.getCause();\n\t\t\tif (t instanceof RuntimeException) throw (RuntimeException) t;\n\t\t\tif (t instanceof Error) throw (Error) t;\n\t\t\tthrow new RuntimeException(t);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java",
    "content": "/*\n * Copyright (C) 2009-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.agent;\n\nimport static lombok.patcher.scripts.ScriptBuilder.*;\nimport static lombok.eclipse.agent.EclipseLoaderPatcher.OSGI_TYPES;\n\nimport java.io.File;\nimport java.lang.instrument.Instrumentation;\nimport java.net.URLClassLoader;\nimport java.security.ProtectionDomain;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.List;\n\nimport lombok.core.AgentLauncher;\nimport lombok.patcher.Filter;\nimport lombok.patcher.Hook;\nimport lombok.patcher.MethodTarget;\nimport lombok.patcher.ScriptManager;\nimport lombok.patcher.StackRequest;\nimport lombok.patcher.TargetMatcher;\nimport lombok.patcher.TransplantMapper;\nimport lombok.patcher.scripts.ScriptBuilder;\n\n/**\n * This is a java-agent that patches some of eclipse's classes so AST Nodes are handed off to Lombok\n * for modification before Eclipse actually uses them to compile, render errors, show code outlines,\n * create auto-completion dialogs, and anything else eclipse does with java code. See the *Transformer\n * classes in this package for more information about which classes are transformed and how they are\n * transformed.\n */\npublic class EclipsePatcher implements AgentLauncher.AgentLaunchable {\n\t@Override public void runAgent(String agentArgs, Instrumentation instrumentation, boolean injected, Class<?> launchingContext) throws Exception {\n\t\tregisterPatchScripts(instrumentation, injected, launchingContext);\n\t}\n\t\n\tprivate static void registerPatchScripts(Instrumentation instrumentation, boolean reloadExistingClasses, Class<?> launchingContext) {\n\t\tScriptManager sm = new ScriptManager();\n\t\tsm.registerTransformer(instrumentation);\n\t\tsm.setFilter(new Filter() {\n\t\t\t@Override public boolean shouldTransform(ClassLoader loader, String className, Class<?> classBeingDefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) {\n\t\t\t\tif (loader != null) {\t\t\t\t\t\n\t\t\t\t\tif (loader.getClass().getName().startsWith(\"org.sonar.classloader.\")) return false; // Relevant to bug #2351\n\t\t\t\t\tif (loader.toString().contains(\"com.alexnederlof:jasperreports-plugin\")) return false; //Relevant to bug #1036\n\t\t\t\t\tif (loader.toString().contains(\"com.pro-crafting.tools:jasperreports-plugin\")) return false; //Relevant to bug #1036\n\t\t\t\t\tif (loader.toString().contains(\"com.pro-crafting.tools:jasperreports-maven-plugin\")) return false; //Relevant to bug #1036\n\t\t\t\t}\n\t\t\t\tif (!(loader instanceof URLClassLoader)) return true;\n\t\t\t\tClassLoader parent = loader.getParent();\n\t\t\t\tif (parent == null) return true;\n\t\t\t\treturn !parent.getClass().getName().startsWith(\"org.eclipse.jdt.apt.core.internal.AnnotationProcessorFactoryLoader\");\n\t\t\t}\n\t\t});\n\t\t\n\t\tfinal boolean forceBaseResourceNames = shouldForceBaseResourceNames();\n\t\tsm.setTransplantMapper(new TransplantMapper() {\n\t\t\tpublic String mapResourceName(int classFileFormatVersion, String resourceName) {\n\t\t\t\tif (classFileFormatVersion < 50 || forceBaseResourceNames) return resourceName;\n\t\t\t\treturn \"Class50/\" + resourceName;\n\t\t\t}\n\t\t});\n\t\t\n\t\tEclipseLoaderPatcher.patchEquinoxLoaders(sm, launchingContext);\n\t\tpatchCatchReparse(sm);\n\t\tpatchIdentifierEndReparse(sm);\n\t\tpatchRetrieveEllipsisStartPosition(sm);\n\t\tpatchRetrieveRightBraceOrSemiColonPosition(sm);\n\t\tpatchRetrieveProperRightBracketPosition(sm);\n\t\tpatchRetrieveStartBlockPosition(sm);\n\t\tpatchSetGeneratedFlag(sm);\n\t\tpatchDomAstReparseIssues(sm);\n\t\tpatchHideGeneratedNodes(sm);\n\t\tpatchPostCompileHookEclipse(sm);\n\t\tpatchFixSourceTypeConverter(sm);\n\t\tpatchListRewriteHandleGeneratedMethods(sm);\n\t\tpatchSyntaxAndOccurrencesHighlighting(sm);\n\t\tpatchSortMembersOperation(sm);\n\t\tpatchExtractInterfaceAndPullUp(sm);\n\t\tpatchExtractVariable(sm);\n\t\tpatchAboutDialog(sm);\n\t\tpatchEclipseDebugPatches(sm);\n\t\tpatchJavadoc(sm);\n\t\tpatchASTConverterLiterals(sm);\n\t\tpatchASTNodeSearchUtil(sm);\n\t\tpatchFieldInitializer(sm);\n\t\t\n\t\tpatchPostCompileHookEcj(sm);\n\t\t\n\t\tpatchAvoidReparsingGeneratedCode(sm);\n\t\tpatchLombokizeAST(sm);\n\t\tpatchEcjTransformers(sm);\n\t\tpatchExtensionMethod(sm);\n\t\tpatchRenameField(sm);\n\t\tpatchInline(sm);\n\t\tpatchNullCheck(sm);\n\t\tpatchCrossModuleClassLoading(sm);\n\t\t\n\t\tpatchForTests(sm);\n\t\t\n\t\tif (reloadExistingClasses) sm.reloadClasses(instrumentation);\n\t}\n\t\n\tprivate static boolean shouldForceBaseResourceNames() {\n\t\tString shadowOverride = System.getProperty(\"shadow.override.lombok\", \"\");\n\t\tif (shadowOverride == null || shadowOverride.length() == 0) return false;\n\t\tfor (String part : shadowOverride.split(\"\\\\s*\" + (File.pathSeparatorChar == ';' ? \";\" : \":\") + \"\\\\s*\")) {\n\t\t\tif (part.equalsIgnoreCase(\"lombok.jar\")) return false;\n\t\t}\n\t\treturn true;\n\t}\n\t\n\tprivate static void patchRenameField(ScriptManager sm) {\n\t\t/* RefactoringSearchEngine.search will not return results when renaming field and Data Annotation is present. Return a fake Element to make checks pass */\n\t\tsm.addScript(ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.corext.refactoring.rename.RenameFieldProcessor\", \"checkAccessorDeclarations\", \"org.eclipse.ltk.core.refactoring.RefactoringStatus\", \"org.eclipse.core.runtime.IProgressMonitor\", \"org.eclipse.jdt.core.IMethod\"))\n\t\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.internal.corext.refactoring.RefactoringSearchEngine\", \"search\", \"org.eclipse.jdt.internal.corext.refactoring.SearchResultGroup[]\", \"org.eclipse.jdt.core.search.SearchPattern\",\"org.eclipse.jdt.core.search.IJavaSearchScope\",\"org.eclipse.core.runtime.IProgressMonitor\",\"org.eclipse.ltk.core.refactoring.RefactoringStatus\"))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"createFakeSearchResult\", \"org.eclipse.jdt.internal.corext.refactoring.SearchResultGroup[]\", \"org.eclipse.jdt.internal.corext.refactoring.SearchResultGroup[]\", \"java.lang.Object\"))\n\t\t\t\t.requestExtra(StackRequest.THIS)\n\t\t\t\t.transplant()\n\t\t\t\t.build());\n\t\t\n\t\t/* Prevent adding generated nodes as possible search matches */\n\t\tsm.addScript(ScriptBuilder.exitEarly()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.core.search.matching.MatchingNodeSet\", \"addPossibleMatch\", \"void\", \"org.eclipse.jdt.internal.compiler.ast.ASTNode\"))\n\t\t\t\t.decisionMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"isGenerated\", \"boolean\", \"org.eclipse.jdt.internal.compiler.ast.ASTNode\"))\n\t\t\t\t.request(StackRequest.PARAM1)\n\t\t\t\t.transplant()\n\t\t\t\t.build());\n\t}\n\t\n\tprivate static void patchExtractInterfaceAndPullUp(ScriptManager sm) {\n\t\t/* Fix sourceEnding for generated nodes to avoid null pointer */\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.compiler.SourceElementNotifier\", \"notifySourceElementRequestor\", \"void\", \"org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration\", \"org.eclipse.jdt.internal.compiler.ast.TypeDeclaration\", \"org.eclipse.jdt.internal.compiler.ast.ImportReference\"))\n\t\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.internal.compiler.util.HashtableOfObjectToInt\", \"get\", \"int\", \"java.lang.Object\"))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"getSourceEndFixed\", \"int\", \"int\", \"org.eclipse.jdt.internal.compiler.ast.ASTNode\"))\n\t\t\t\t.requestExtra(StackRequest.PARAM1)\n\t\t\t\t.transplant().build());\n\t\t\n\t\t/* Make sure the generated source element is found instead of the annotation */\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.corext.refactoring.structure.ExtractInterfaceProcessor\", \"createMethodDeclaration\", \"void\",\n\t\t\t\t\"org.eclipse.jdt.internal.corext.refactoring.structure.CompilationUnitRewrite\", \n\t\t\t\t\"org.eclipse.jdt.core.dom.rewrite.ASTRewrite\",\n\t\t\t\t\"org.eclipse.jdt.core.dom.AbstractTypeDeclaration\", \n\t\t\t\t\"org.eclipse.jdt.core.dom.MethodDeclaration\"\n\t\t\t))\n\t\t\t.methodToWrap(new Hook(\"org.eclipse.jface.text.IDocument\", \"get\", \"java.lang.String\", \"int\", \"int\"))\n\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"getRealMethodDeclarationSource\", \"java.lang.String\", \"java.lang.String\", \"java.lang.Object\", \"org.eclipse.jdt.core.dom.MethodDeclaration\"))\n\t\t\t.requestExtra(StackRequest.THIS, StackRequest.PARAM4)\n\t\t\t.transplant().build());\n\t\t\n\t\t/* Get real node source instead of the annotation */\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.corext.refactoring.structure.HierarchyProcessor\", \"createPlaceholderForSingleVariableDeclaration\", \"org.eclipse.jdt.core.dom.SingleVariableDeclaration\",\n\t\t\t\t\"org.eclipse.jdt.core.dom.SingleVariableDeclaration\",\n\t\t\t\t\"org.eclipse.jdt.core.ICompilationUnit\",\n\t\t\t\t\"org.eclipse.jdt.core.dom.rewrite.ASTRewrite\"\n\t\t\t))\n\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.corext.refactoring.structure.HierarchyProcessor\", \"createPlaceholderForType\", \"org.eclipse.jdt.core.dom.Type\",\n\t\t\t\t\"org.eclipse.jdt.core.dom.Type\",\n\t\t\t\t\"org.eclipse.jdt.core.ICompilationUnit\",\n\t\t\t\t\"org.eclipse.jdt.core.dom.rewrite.ASTRewrite\"\n\t\t\t))\n\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.core.IBuffer\", \"getText\", \"java.lang.String\", \"int\", \"int\"))\n\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"getRealNodeSource\", \"java.lang.String\", \"java.lang.String\", \"org.eclipse.jdt.core.dom.ASTNode\"))\n\t\t\t.requestExtra(StackRequest.PARAM1)\n\t\t\t.transplant()\n\t\t\t.build());\n\t\t\n\t\t/* Do not add @Override's for generated methods */\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.exitEarly()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.rewrite.ListRewrite\", \"insertFirst\"))\n\t\t\t\t.decisionMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"isListRewriteOnGeneratedNode\", \"boolean\", \"org.eclipse.jdt.core.dom.rewrite.ListRewrite\"))\n\t\t\t\t.request(StackRequest.THIS)\n\t\t\t\t.transplant().build());\n\t\t\n\t\t/* Do not add comments for generated methods */\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.exitEarly()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.corext.refactoring.structure.ExtractInterfaceProcessor\", \"createMethodComment\"))\n\t\t\t\t.decisionMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"isGenerated\", \"boolean\", \"org.eclipse.jdt.core.dom.ASTNode\"))\n\t\t\t\t.request(StackRequest.PARAM2)\n\t\t\t\t.transplant().build());\n\t\t\n\t\t/* Do not add a modifier to the generating annotation during pull up \n\t\t * \n\t\t * Example: Pull up a protected method (canEqual()/@EqualsAndHashCode)\n\t\t */\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.exitEarly()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.corext.refactoring.structure.MemberVisibilityAdjustor$IncomingMemberVisibilityAdjustment\", \"rewriteVisibility\"))\n\t\t\t\t.decisionMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"skipRewriteVisibility\", \"boolean\", \"org.eclipse.jdt.internal.corext.refactoring.structure.MemberVisibilityAdjustor$IncomingMemberVisibilityAdjustment\"))\n\t\t\t\t.request(StackRequest.THIS)\n\t\t\t\t.transplant()\n\t\t\t\t.build());\n\t\t\n\t\t/*\n\t\t * ImportRemover sometimes removes lombok imports if a generated method/type gets changed. Skipping all generated nodes fixes this behavior.\n\t\t * \n\t\t * Example: Create a class (Use.java) that uses a generated method (Test t; t.toString();) and pull up this generated method.\n\t\t */\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.exitEarly()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.corext.refactoring.structure.ImportRemover\", \"registerRemovedNode\", \"void\", \"org.eclipse.jdt.core.dom.ASTNode\"))\n\t\t\t\t.decisionMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"isGenerated\", \"boolean\", \"org.eclipse.jdt.core.dom.ASTNode\"))\n\t\t\t\t.request(StackRequest.PARAM1)\n\t\t\t\t.transplant()\n\t\t\t\t.build());\n\t}\n\t\n\tprivate static void patchExtractVariable(ScriptManager sm) {\n\t\t/* Fix sourceEnding for generated nodes to avoid null pointer */\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.replaceMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.corext.refactoring.util.SideEffectChecker\", \"findFunctionDefinition\", \"org.eclipse.jdt.core.dom.MethodDeclaration\", \"org.eclipse.jdt.core.dom.ITypeBinding\", \"org.eclipse.jdt.core.dom.IMethodBinding\"))\n\t\t\t\t.methodToReplace(new Hook(\"org.eclipse.jdt.core.dom.NodeFinder\", \"perform\", \"org.eclipse.jdt.core.dom.ASTNode\", \"org.eclipse.jdt.core.dom.ASTNode\", \"org.eclipse.jdt.core.ISourceRange\"))\n\t\t\t\t.replacementMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"findGeneratedNode\", \"org.eclipse.jdt.core.dom.ASTNode\", \"org.eclipse.jdt.core.dom.ASTNode\", \"org.eclipse.jdt.core.ISourceRange\", \"org.eclipse.jdt.core.dom.IMethodBinding\"))\n\t\t\t\t.requestExtra(StackRequest.PARAM2)\n\t\t\t\t.transplant()\n\t\t\t\t.build());\n\t}\n\t\n\tprivate static void patchInline(ScriptManager sm) {\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapReturnValue()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.corext.refactoring.code.SourceProvider\", \"getCodeBlocks\", \"java.lang.String[]\", \"org.eclipse.jdt.internal.corext.refactoring.code.CallContext\", \"org.eclipse.jdt.core.dom.rewrite.ImportRewrite\"))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"getRealCodeBlocks\", \"java.lang.String[]\", \"java.lang.String[]\", \"org.eclipse.jdt.internal.corext.refactoring.code.SourceProvider\", \"org.eclipse.jdt.internal.corext.refactoring.code.CallContext\"))\n\t\t\t\t.request(StackRequest.RETURN_VALUE, StackRequest.THIS, StackRequest.PARAM1)\n\t\t\t\t.transplant()\n\t\t\t\t.build());\n\t}\n\t\n\tprivate static void patchAboutDialog(ScriptManager sm) {\n\t\t/*\n\t\t * Add a line about lombok (+ version info) to eclipse's about dialog.\n\t\t * This is doable without patching, but we intentionally patch it so that presence of the lombok info\n\t\t * in the about dialog can be used to ascertain that patching in general is doing something.\n\t\t */\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapReturnValue()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.core.internal.runtime.Product\", \"getProperty\", \"java.lang.String\", \"java.lang.String\"))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$LombokDeps\", \"addLombokNotesToEclipseAboutDialog\", \"java.lang.String\", \"java.lang.String\", \"java.lang.String\"))\n\t\t\t\t.request(StackRequest.RETURN_VALUE, StackRequest.PARAM1)\n\t\t\t\t.transplant().build());\n\t}\n\t\n\tprivate static void patchSyntaxAndOccurrencesHighlighting(ScriptManager sm) {\n\t\t/*\n\t\t * Skip generated nodes for \"visual effects\" (syntax highlighting && highlight occurrences)\n\t\t */\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.exitEarly()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.ui.search.OccurrencesFinder\", \"addUsage\"))\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.ui.search.OccurrencesFinder\", \"addWrite\"))\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlightingReconciler$PositionCollector\", \"visit\", \"boolean\", \"org.eclipse.jdt.core.dom.SimpleName\"))\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlightingReconciler$PositionCollector\", \"visitLiteral\", \"boolean\", \"org.eclipse.jdt.core.dom.Expression\"))\n\t\t\t\t.decisionMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"isGenerated\", \"boolean\", \"org.eclipse.jdt.core.dom.ASTNode\"))\n\t\t\t\t.valueMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"returnFalse\", \"boolean\", \"java.lang.Object\"))\n\t\t\t\t.request(StackRequest.PARAM1)\n\t\t\t\t.build());\n\t}\n\t\n\tprivate static void patchListRewriteHandleGeneratedMethods(ScriptManager sm) {\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.replaceMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.core.dom.rewrite.ASTRewriteAnalyzer$ListRewriter\", \"rewriteList\"))\n\t\t\t\t.methodToReplace(new Hook(\"org.eclipse.jdt.internal.core.dom.rewrite.RewriteEvent\", \"getChildren\", \"org.eclipse.jdt.internal.core.dom.rewrite.RewriteEvent[]\"))\n\t\t\t\t.replacementMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"listRewriteHandleGeneratedMethods\", \"org.eclipse.jdt.internal.core.dom.rewrite.RewriteEvent[]\", \"org.eclipse.jdt.internal.core.dom.rewrite.RewriteEvent\"))\n\t\t\t\t.build());\n\t}\n\n\tprivate static void patchSortMembersOperation(ScriptManager sm) {\n\t\t/* Fixes \"sort members\" action with @Data @Log\n\t\t * I would have liked to patch sortMembers, but kept getting a VerifyError: Illegal type in constant pool\n\t\t * So now I just patch all calling methods\n\t\t */\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.core.SortElementsOperation$2\", \"visit\", \"boolean\", \"org.eclipse.jdt.core.dom.CompilationUnit\"))\n\t\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.core.dom.CompilationUnit\", \"types\", \"java.util.List\"))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"removeGeneratedNodes\", \"java.util.List\", \"java.util.List\"))\n\t\t\t\t.transplant().build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.core.SortElementsOperation$2\", \"visit\", \"boolean\", \"org.eclipse.jdt.core.dom.AnnotationTypeDeclaration\"))\n\t\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.core.dom.AnnotationTypeDeclaration\", \"bodyDeclarations\", \"java.util.List\"))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"removeGeneratedNodes\", \"java.util.List\", \"java.util.List\"))\n\t\t\t\t.transplant().build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.core.SortElementsOperation$2\", \"visit\", \"boolean\", \"org.eclipse.jdt.core.dom.AnonymousClassDeclaration\"))\n\t\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.core.dom.AnonymousClassDeclaration\", \"bodyDeclarations\", \"java.util.List\"))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"removeGeneratedNodes\", \"java.util.List\", \"java.util.List\"))\n\t\t\t\t.transplant().build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.core.SortElementsOperation$2\", \"visit\", \"boolean\", \"org.eclipse.jdt.core.dom.TypeDeclaration\"))\n\t\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.core.dom.TypeDeclaration\", \"bodyDeclarations\", \"java.util.List\"))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"removeGeneratedNodes\", \"java.util.List\", \"java.util.List\"))\n\t\t\t\t.transplant().build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.core.SortElementsOperation$2\", \"visit\", \"boolean\", \"org.eclipse.jdt.core.dom.EnumDeclaration\"))\n\t\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.core.dom.EnumDeclaration\", \"bodyDeclarations\", \"java.util.List\"))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"removeGeneratedNodes\", \"java.util.List\", \"java.util.List\"))\n\t\t\t\t.transplant().build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.core.SortElementsOperation$2\", \"visit\", \"boolean\", \"org.eclipse.jdt.core.dom.EnumDeclaration\"))\n\t\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.core.dom.EnumDeclaration\", \"enumConstants\", \"java.util.List\"))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"removeGeneratedNodes\", \"java.util.List\", \"java.util.List\"))\n\t\t\t\t.transplant().build());\n\t}\n\t\n\tprivate static void patchDomAstReparseIssues(ScriptManager sm) {\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.replaceMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.core.dom.rewrite.ASTRewriteAnalyzer\", \"visit\"))\n\t\t\t\t.methodToReplace(new Hook(\"org.eclipse.jdt.internal.core.dom.rewrite.TokenScanner\", \"getTokenEndOffset\", \"int\", \"int\", \"int\"))\n\t\t\t\t.replacementMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"getTokenEndOffsetFixed\", \"int\", \"org.eclipse.jdt.internal.core.dom.rewrite.TokenScanner\", \"int\", \"int\", \"java.lang.Object\"))\n\t\t\t\t.requestExtra(StackRequest.PARAM1)\n\t\t\t\t.transplant()\n\t\t\t\t.build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.replaceMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.core.dom.rewrite.ASTRewriteAnalyzer\", \"visit\"))\n\t\t\t\t.methodToReplace(new Hook(\"org.eclipse.jdt.internal.core.dom.rewrite.TokenScanner\", \"getTokenEndOffset\", \"int\", \"org.eclipse.jdt.internal.compiler.parser.TerminalToken\", \"int\"))\n\t\t\t\t.replacementMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"getTokenEndOffsetFixed\", \"int\", \"org.eclipse.jdt.internal.core.dom.rewrite.TokenScanner\", \"java.lang.Object\", \"int\", \"java.lang.Object\"))\n\t\t\t\t.requestExtra(StackRequest.PARAM1)\n\t\t\t\t.transplant()\n\t\t\t\t.build());\n\t}\n\t\n\tprivate static void patchPostCompileHookEclipse(ScriptManager sm) {\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.core.builder.IncrementalImageBuilder\", \"writeClassFileContents\"))\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.core.builder.AbstractImageBuilder\", \"writeClassFileContents\"))\n\t\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.internal.compiler.ClassFile\", \"getBytes\", \"byte[]\"))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$LombokDeps\", \"runPostCompiler\", \"byte[]\", \"byte[]\", \"java.lang.String\"))\n\t\t\t\t.requestExtra(StackRequest.PARAM3)\n\t\t\t\t.build());\n\t}\n\t\n\tprivate static void patchPostCompileHookEcj(ScriptManager sm) {\n\t\tsm.addScriptIfNotWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.compiler.tool.EclipseCompilerImpl\", \"outputClassFiles\"))\n\t\t\t\t.methodToWrap(new Hook(\"javax.tools.JavaFileObject\", \"openOutputStream\", \"java.io.OutputStream\"))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$LombokDeps\", \"runPostCompiler\", \"java.io.OutputStream\", \"java.io.OutputStream\"))\n\t\t\t\t.transplant().build());\n\t\t\n\t\tsm.addScriptIfNotWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.compiler.util.Util\", \"writeToDisk\"))\n\t\t\t\t.methodToWrap(new Hook(\"java.io.BufferedOutputStream\", \"<init>\", \"void\", \"java.io.OutputStream\", \"int\"))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$LombokDeps\", \"runPostCompiler\", \"java.io.BufferedOutputStream\", \"java.io.BufferedOutputStream\", \"java.lang.String\", \"java.lang.String\"))\n\t\t\t\t.requestExtra(StackRequest.PARAM2, StackRequest.PARAM3)\n\t\t\t\t.transplant().build());\n\t}\n\t\n\tprivate static void patchHideGeneratedNodes(ScriptManager sm) {\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapReturnValue()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.corext.dom.LinkedNodeFinder\", \"findByNode\", \"org.eclipse.jdt.core.dom.SimpleName[]\", \"org.eclipse.jdt.core.dom.ASTNode\", \"org.eclipse.jdt.core.dom.SimpleName\"))\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.corext.dom.LinkedNodeFinder\", \"findByBinding\"))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"removeGeneratedSimpleNames\", \"org.eclipse.jdt.core.dom.SimpleName[]\",\n\t\t\t\t\t\t\"org.eclipse.jdt.core.dom.SimpleName[]\"))\n\t\t\t\t.request(StackRequest.RETURN_VALUE).build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapReturnValue()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.corext.dom.LinkedNodeFinder\", \"findByNode\", \"org.eclipse.jdt.core.dom.Name[]\", \"org.eclipse.jdt.core.dom.ASTNode\", \"org.eclipse.jdt.core.dom.Name\"))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"removeGeneratedNames\", \"org.eclipse.jdt.core.dom.Name[]\",\n\t\t\t\t\t\t\"org.eclipse.jdt.core.dom.Name[]\"))\n\t\t\t\t.request(StackRequest.RETURN_VALUE).build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.exitEarly()\n\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTNode\", \"accept\", \"void\", \"org.eclipse.jdt.core.dom.ASTVisitor\"))\n\t\t\t.decisionMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"isBlockedVisitorAndGenerated\", \"boolean\", \"org.eclipse.jdt.core.dom.ASTNode\", \"org.eclipse.jdt.core.dom.ASTVisitor\"))\n\t\t\t.request(StackRequest.THIS, StackRequest.PARAM1)\n\t\t\t.build());\n\t\t\n\t\tpatchRefactorScripts(sm);\n\t\tpatchFormatters(sm);\n\t}\n\t\n\tprivate static void patchFormatters(ScriptManager sm) {\n\t\t// before Eclipse Mars\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.setSymbolDuringMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.formatter.DefaultCodeFormatter\", \"formatCompilationUnit\"))\n\t\t\t\t.callToWrap(new Hook(\"org.eclipse.jdt.internal.core.util.CodeSnippetParsingUtil\", \"parseCompilationUnit\", \"org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration\", \"char[]\", \"java.util.Map\", \"boolean\"))\n\t\t\t\t.symbol(\"lombok.disable\")\n\t\t\t\t.build());\n\t\t\n\t\t// Eclipse Mars and beyond\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.setSymbolDuringMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.formatter.DefaultCodeFormatter\", \"parseSourceCode\"))\n\t\t\t\t.callToWrap(new Hook(\"org.eclipse.jdt.core.dom.ASTParser\", \"createAST\", \"org.eclipse.jdt.core.dom.ASTNode\", \"org.eclipse.core.runtime.IProgressMonitor\"))\n\t\t\t\t.symbol(\"lombok.disable\")\n\t\t\t\t.build());\n\t}\n\t\n\tprivate static void patchRefactorScripts(ScriptManager sm) {\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.exitEarly()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.rewrite.ASTRewrite\", \"replace\"))\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.rewrite.ASTRewrite\", \"remove\"))\n\t\t\t\t.decisionMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"skipRewritingGeneratedNodes\", \"boolean\",\n\t\t\t\t\t\t\"org.eclipse.jdt.core.dom.ASTNode\"))\n\t\t\t\t.transplant().request(StackRequest.PARAM1).build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.corext.refactoring.rename.RenameTypeProcessor\", \"addConstructorRenames\"))\n\t\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.core.IType\", \"getMethods\", \"org.eclipse.jdt.core.IMethod[]\"))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"removeGeneratedMethods\", \"org.eclipse.jdt.core.IMethod[]\",\n\t\t\t\t\t\t\"org.eclipse.jdt.core.IMethod[]\"))\n\t\t\t\t.transplant().build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.exitEarly()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.corext.refactoring.rename.TempOccurrenceAnalyzer\", \"visit\", \"boolean\", \"org.eclipse.jdt.core.dom.SimpleName\"))\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.corext.refactoring.rename.RenameAnalyzeUtil$ProblemNodeFinder$NameNodeVisitor\", \"visit\", \"boolean\", \"org.eclipse.jdt.core.dom.SimpleName\"))\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.corext.refactoring.rename.RenameTypeParameterProcessor$RenameTypeParameterVisitor\", \"visit\", \"boolean\", \"org.eclipse.jdt.core.dom.SimpleName\"))\n\t\t\t\t.decisionMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"isGenerated\", \"boolean\", \"org.eclipse.jdt.core.dom.ASTNode\"))\n\t\t\t\t.valueMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"returnTrue\", \"boolean\", \"java.lang.Object\"))\n\t\t\t\t.request(StackRequest.PARAM1)\n\t\t\t\t.transplant().build());\n\t}\n\t\n\tprivate static void patchCatchReparse(ScriptManager sm) {\n\t\tsm.addScript(ScriptBuilder.wrapReturnValue()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"retrieveStartingCatchPosition\"))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"fixRetrieveStartingCatchPosition\", \"int\", \"int\", \"int\"))\n\t\t\t\t.transplant().request(StackRequest.RETURN_VALUE, StackRequest.PARAM1).build());\n\t}\n\t\n\tprivate static void patchIdentifierEndReparse(ScriptManager sm) {\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapReturnValue()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"retrieveIdentifierEndPosition\"))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"fixRetrieveIdentifierEndPosition\", \"int\", \"int\", \"int\", \"int\"))\n\t\t\t\t.transplant().request(StackRequest.RETURN_VALUE, StackRequest.PARAM1, StackRequest.PARAM2).build());\n\t}\n\t\n\tprivate static void patchRetrieveEllipsisStartPosition(ScriptManager sm) {\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapReturnValue()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"retrieveEllipsisStartPosition\"))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"fixRetrieveEllipsisStartPosition\", \"int\", \"int\", \"int\"))\n\t\t\t\t.transplant().request(StackRequest.RETURN_VALUE, StackRequest.PARAM2).build());\n\t}\n\t\n\tprivate static void patchRetrieveStartBlockPosition(ScriptManager sm) {\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapReturnValue()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"retrieveStartBlockPosition\"))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"fixRetrieveStartBlockPosition\", \"int\", \"int\", \"int\"))\n\t\t\t\t.transplant().request(StackRequest.RETURN_VALUE, StackRequest.PARAM2).build());\n\t}\n\t\n\tprivate static void patchRetrieveRightBraceOrSemiColonPosition(ScriptManager sm) {\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"convert\", \"org.eclipse.jdt.core.dom.ASTNode\", \"boolean\", \"org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration\"))\n\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.core.dom.ASTConverter\", \"retrieveRightBraceOrSemiColonPosition\", \"int\", \"int\", \"int\"))\n\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"fixRetrieveRightBraceOrSemiColonPosition\", \"int\", \"int\", \"org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration\"))\n\t\t\t.requestExtra(StackRequest.PARAM2)\n\t\t\t.transplant()\n\t\t\t.build());\n\t\t\n\t\tsm.addScript(ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"convert\", \"org.eclipse.jdt.core.dom.ASTNode\", \"boolean\", \"org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration\"))\n\t\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.core.dom.ASTConverter\", \"retrieveRightBrace\", \"int\", \"int\", \"int\"))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"fixRetrieveRightBraceOrSemiColonPosition\", \"int\", \"int\", \"org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration\"))\n\t\t\t\t.requestExtra(StackRequest.PARAM2)\n\t\t\t\t.transplant()\n\t\t\t\t.build());\n\t\t\n\t\tsm.addScript(ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"convert\", \"org.eclipse.jdt.core.dom.ASTNode\", \"org.eclipse.jdt.internal.compiler.ast.FieldDeclaration\"))\n\t\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.core.dom.ASTConverter\", \"retrieveRightBrace\", \"int\", \"int\", \"int\"))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"fixRetrieveRightBraceOrSemiColonPosition\", \"int\", \"int\", \"org.eclipse.jdt.internal.compiler.ast.FieldDeclaration\"))\n\t\t\t\t.requestExtra(StackRequest.PARAM1)\n\t\t\t\t.transplant()\n\t\t\t\t.build());\n\t\t\n//\t\tsm.addScript(ScriptBuilder.wrapReturnValue()\n//\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"retrieveRightBraceOrSemiColonPosition\"))\n//\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"retrieveRightBrace\"))\n//\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"fixRetrieveRightBraceOrSemiColonPosition\", \"int\", \"int\", \"int\"))\n//\t\t\t\t.transplant().request(StackRequest.RETURN_VALUE, StackRequest.PARAM2).build());\n\t}\n\n\tprivate static void patchRetrieveProperRightBracketPosition(ScriptManager sm) {\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"extractSubArrayType\", \"org.eclipse.jdt.core.dom.ArrayType\", \"org.eclipse.jdt.core.dom.ArrayType\", \"int\", \"int\"))\n\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.core.dom.ASTConverter\", \"retrieveProperRightBracketPosition\", \"int\", \"int\", \"int\"))\n\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"fixRetrieveProperRightBracketPosition\", \"int\", \"int\", \"org.eclipse.jdt.core.dom.Type\"))\n\t\t\t.requestExtra(StackRequest.PARAM1)\n\t\t\t.transplant()\n\t\t\t.build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"convertToArray\", \"org.eclipse.jdt.core.dom.ArrayType\", \"org.eclipse.jdt.core.dom.Type\", \"int\", \"int\", \"int\", \"org.eclipse.jdt.internal.compiler.ast.Annotation[][]\"))\n\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.core.dom.ASTConverter\", \"retrieveProperRightBracketPosition\", \"int\", \"int\", \"int\"))\n\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"fixRetrieveProperRightBracketPosition\", \"int\", \"int\", \"org.eclipse.jdt.core.dom.Type\"))\n\t\t\t.requestExtra(StackRequest.PARAM1)\n\t\t\t.transplant()\n\t\t\t.build());\n\t}\n\n\tprivate static void patchSetGeneratedFlag(ScriptManager sm) {\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.addField()\n\t\t\t\t.targetClass(\"org.eclipse.jdt.internal.compiler.ast.ASTNode\")\n\t\t\t\t.fieldName(\"$generatedBy\")\n\t\t\t\t.fieldType(\"Lorg/eclipse/jdt/internal/compiler/ast/ASTNode;\")\n\t\t\t\t.setPublic().setTransient().build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.addField()\n\t\t\t\t.targetClass(\"org.eclipse.jdt.core.dom.ASTNode\")\n\t\t\t\t.fieldName(\"$isGenerated\").fieldType(\"Z\")\n\t\t\t\t.setPublic().setTransient().build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapReturnValue()\n\t\t\t\t.target(new TargetMatcher() {\n\t\t\t\t\t@Override public boolean matches(String classSpec, String methodName, String descriptor) {\n\t\t\t\t\t\tif (!\"convert\".equals(methodName)) return false;\n\t\t\t\t\t\t\n\t\t\t\t\t\tList<String> fullDesc = MethodTarget.decomposeFullDesc(descriptor);\n\t\t\t\t\t\tif (\"V\".equals(fullDesc.get(0))) return false;\n\t\t\t\t\t\tif (fullDesc.size() < 2) return false;\n\t\t\t\t\t\tif (!fullDesc.get(1).startsWith(\"Lorg/eclipse/jdt/internal/compiler/ast/\")) return false;\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t@Override public String describe() {\n\t\t\t\t\t\treturn \"ASTConverter:[all relevant]\";\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t@Override public Collection<String> getAffectedClasses() {\n\t\t\t\t\t\treturn Collections.singleton(\"org.eclipse.jdt.core.dom.ASTConverter\");\n\t\t\t\t\t}\n\t\t\t\t}).request(StackRequest.PARAM1, StackRequest.RETURN_VALUE)\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"setIsGeneratedFlag\", \"void\",\n\t\t\t\t\t\t\"org.eclipse.jdt.core.dom.ASTNode\", \"org.eclipse.jdt.internal.compiler.ast.ASTNode\"))\n\t\t\t\t.transplant().build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapReturnValue()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"convert\", \"org.eclipse.jdt.core.dom.ASTNode\", \"boolean\", \"org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration\"))\n\t\t\t\t.request(StackRequest.PARAM2, StackRequest.RETURN_VALUE)\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"setIsGeneratedFlag\", \"void\",\n\t\t\t\t\t\t\"org.eclipse.jdt.core.dom.ASTNode\", \"org.eclipse.jdt.internal.compiler.ast.ASTNode\"))\n\t\t\t\t.transplant().build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapReturnValue()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"convertToFieldDeclaration\", \"org.eclipse.jdt.core.dom.FieldDeclaration\", \"org.eclipse.jdt.internal.compiler.ast.FieldDeclaration\"))\n/* Targets beneath are only patched because the resulting dom nodes should be marked if generated.\n * However I couldn't find a usecase where these were actually used\n */\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"convertToType\", \"org.eclipse.jdt.core.dom.Type\", \"org.eclipse.jdt.internal.compiler.ast.NameReference\"))\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"convertType\", \"org.eclipse.jdt.core.dom.Type\", \"org.eclipse.jdt.internal.compiler.ast.TypeReference\"))\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"convertToVariableDeclarationExpression\", \"org.eclipse.jdt.core.dom.VariableDeclarationExpression\", \"org.eclipse.jdt.internal.compiler.ast.LocalDeclaration\"))\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"convertToSingleVariableDeclaration\", \"org.eclipse.jdt.core.dom.SingleVariableDeclaration\", \"org.eclipse.jdt.internal.compiler.ast.LocalDeclaration\"))\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"convertToVariableDeclarationFragment\", \"org.eclipse.jdt.core.dom.VariableDeclarationFragment\", \"org.eclipse.jdt.internal.compiler.ast.FieldDeclaration\"))\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"convertToVariableDeclarationFragment\", \"org.eclipse.jdt.core.dom.VariableDeclarationFragment\", \"org.eclipse.jdt.internal.compiler.ast.LocalDeclaration\"))\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"convertToVariableDeclarationStatement\", \"org.eclipse.jdt.core.dom.VariableDeclarationStatement\", \"org.eclipse.jdt.internal.compiler.ast.LocalDeclaration\"))\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"createBaseType\", \"org.eclipse.jdt.core.dom.Type\", \"org.eclipse.jdt.internal.compiler.ast.TypeReference\", \"long[]\", \"org.eclipse.jdt.internal.compiler.ast.Annotation[][]\", \"char[][]\", \"int\", \"int\", \"boolean\"))\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"createQualifiedType\", \"org.eclipse.jdt.core.dom.QualifiedType\", \"org.eclipse.jdt.internal.compiler.ast.TypeReference\", \"long[]\", \"org.eclipse.jdt.internal.compiler.ast.Annotation[][]\", \"char[][]\", \"int\", \"org.eclipse.jdt.core.dom.Type\"))\n/* Targets above are only patched because the resulting dom nodes should be marked if generated. */\n\t\t\t\t.request(StackRequest.PARAM1, StackRequest.RETURN_VALUE)\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"setIsGeneratedFlag\", \"void\",\n\t\t\t\t\t\t\"org.eclipse.jdt.core.dom.ASTNode\", \"org.eclipse.jdt.internal.compiler.ast.ASTNode\"))\n\t\t\t\t.transplant().build());\n\t\t\n\t\t/* Set generated flag for SimpleNames */\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new TargetMatcher() {\n\t\t\t\t\t@Override public boolean matches(String classSpec, String methodName, String descriptor) {\n\t\t\t\t\t\tif (!methodName.startsWith(\"convert\")) return false;\n\t\t\t\t\t\t\n\t\t\t\t\t\tList<String> fullDesc = MethodTarget.decomposeFullDesc(descriptor);\n\t\t\t\t\t\tif (fullDesc.size() < 2) return false;\n\t\t\t\t\t\tif (!fullDesc.get(1).startsWith(\"Lorg/eclipse/jdt/internal/compiler/ast/\")) return false;\n\t\t\t\t\t\t\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t@Override public String describe() {\n\t\t\t\t\t\treturn \"ASTConverter::(all relevant)\";\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t@Override public Collection<String> getAffectedClasses() {\n\t\t\t\t\t\treturn Collections.singleton(\"org.eclipse.jdt.core.dom.ASTConverter\");\n\t\t\t\t\t}\n\t\t\t\t}).methodToWrap(new Hook(\"org.eclipse.jdt.core.dom.SimpleName\", \"<init>\", \"void\", \"org.eclipse.jdt.core.dom.AST\"))\n\t\t\t\t.requestExtra(StackRequest.PARAM1)\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"setIsGeneratedFlagForName\", \"void\",\n\t\t\t\t\t\t\"org.eclipse.jdt.core.dom.Name\", \"java.lang.Object\"))\n\t\t\t\t.transplant().build());\n\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"convert\", \"org.eclipse.jdt.core.dom.ASTNode\", \"boolean\", \"org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration\"))\n\t\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.core.dom.SimpleName\", \"<init>\", \"void\", \"org.eclipse.jdt.core.dom.AST\"))\n\t\t\t\t.requestExtra(StackRequest.PARAM2)\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"setIsGeneratedFlagForName\", \"void\",\n\t\t\t\t\t\t\"org.eclipse.jdt.core.dom.Name\", \"java.lang.Object\"))\n\t\t\t\t.transplant().build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"convert\", \"org.eclipse.jdt.core.dom.ASTNode\", \"boolean\", \"org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration\"))\n\t\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.core.dom.Block\", \"<init>\", \"void\", \"org.eclipse.jdt.core.dom.AST\"))\n\t\t\t\t.requestExtra(StackRequest.PARAM2)\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"setIsGeneratedFlag\", \"void\",\n\t\t\t\t\t\t\"org.eclipse.jdt.core.dom.ASTNode\", \"org.eclipse.jdt.internal.compiler.ast.ASTNode\"))\n\t\t\t\t.transplant().build());\n\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"convertType\", \"org.eclipse.jdt.core.dom.Type\", \"org.eclipse.jdt.internal.compiler.ast.TypeReference\"))\n\t\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.core.dom.PrimitiveType\", \"<init>\", \"void\", \"org.eclipse.jdt.core.dom.AST\"))\n\t\t\t\t.requestExtra(StackRequest.PARAM1)\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"setIsGeneratedFlag\", \"void\",\n\t\t\t\t\t\t\"org.eclipse.jdt.core.dom.ASTNode\", \"org.eclipse.jdt.internal.compiler.ast.ASTNode\"))\n\t\t\t\t.transplant()\n\t\t\t\t.build());\n\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"convertType\", \"org.eclipse.jdt.core.dom.Type\", \"org.eclipse.jdt.internal.compiler.ast.TypeReference\"))\n\t\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.core.dom.SimpleType\", \"<init>\", \"void\", \"org.eclipse.jdt.core.dom.AST\"))\n\t\t\t\t.requestExtra(StackRequest.PARAM1)\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"setIsGeneratedFlag\", \"void\",\n\t\t\t\t\t\t\"org.eclipse.jdt.core.dom.ASTNode\", \"org.eclipse.jdt.internal.compiler.ast.ASTNode\"))\n\t\t\t\t.transplant()\n\t\t\t\t.build());\n\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"convertType\", \"org.eclipse.jdt.core.dom.Type\", \"org.eclipse.jdt.internal.compiler.ast.TypeReference\"))\n\t\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.core.dom.ParameterizedType\", \"<init>\", \"void\", \"org.eclipse.jdt.core.dom.AST\"))\n\t\t\t\t.requestExtra(StackRequest.PARAM1)\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"setIsGeneratedFlag\", \"void\",\n\t\t\t\t\t\t\"org.eclipse.jdt.core.dom.ASTNode\", \"org.eclipse.jdt.internal.compiler.ast.ASTNode\"))\n\t\t\t\t.transplant()\n\t\t\t\t.build());\n\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"convertType\", \"org.eclipse.jdt.core.dom.Type\", \"org.eclipse.jdt.internal.compiler.ast.TypeReference\"))\n\t\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.core.dom.QualifiedType\", \"<init>\", \"void\", \"org.eclipse.jdt.core.dom.AST\"))\n\t\t\t\t.requestExtra(StackRequest.PARAM1)\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"setIsGeneratedFlag\", \"void\",\n\t\t\t\t\t\t\"org.eclipse.jdt.core.dom.ASTNode\", \"org.eclipse.jdt.internal.compiler.ast.ASTNode\"))\n\t\t\t\t.transplant()\n\t\t\t\t.build());\n\n\t\t/* Set generated flag for QualifiedNames */\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"setQualifiedNameNameAndSourceRanges\", \"org.eclipse.jdt.core.dom.QualifiedName\", \"char[][]\", \"long[]\", \"int\", \"org.eclipse.jdt.internal.compiler.ast.ASTNode\"))\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"setQualifiedNameNameAndSourceRanges\", \"org.eclipse.jdt.core.dom.QualifiedName\", \"char[][]\", \"long[]\", \"int\", \"org.eclipse.jdt.internal.compiler.ast.TypeReference\"))\n\t\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.core.dom.SimpleName\", \"<init>\", \"void\", \"org.eclipse.jdt.core.dom.AST\"))\n\t\t\t\t.requestExtra(StackRequest.PARAM4)\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"setIsGeneratedFlagForName\", \"void\",\n\t\t\t\t\t\t\"org.eclipse.jdt.core.dom.Name\", \"java.lang.Object\"))\n\t\t\t\t.transplant().build());\n\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"setQualifiedNameNameAndSourceRanges\", \"org.eclipse.jdt.core.dom.QualifiedName\", \"char[][]\", \"long[]\", \"int\", \"org.eclipse.jdt.internal.compiler.ast.ASTNode\"))\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"setQualifiedNameNameAndSourceRanges\", \"org.eclipse.jdt.core.dom.QualifiedName\", \"char[][]\", \"long[]\", \"int\", \"org.eclipse.jdt.internal.compiler.ast.TypeReference\"))\n\t\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.core.dom.QualifiedName\", \"<init>\", \"void\", \"org.eclipse.jdt.core.dom.AST\"))\n\t\t\t\t.requestExtra(StackRequest.PARAM4)\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"setIsGeneratedFlagForName\", \"void\",\n\t\t\t\t\t\t\"org.eclipse.jdt.core.dom.Name\", \"java.lang.Object\"))\n\t\t\t\t.transplant().build());\n\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"setQualifiedNameNameAndSourceRanges\", \"org.eclipse.jdt.core.dom.QualifiedName\", \"char[][]\", \"long[]\", \"org.eclipse.jdt.internal.compiler.ast.ASTNode\"))\n\t\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.core.dom.SimpleName\", \"<init>\", \"void\", \"org.eclipse.jdt.core.dom.AST\"))\n\t\t\t\t.requestExtra(StackRequest.PARAM3)\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"setIsGeneratedFlagForName\", \"void\",\n\t\t\t\t\t\t\"org.eclipse.jdt.core.dom.Name\", \"java.lang.Object\"))\n\t\t\t\t.transplant().build());\n\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"setQualifiedNameNameAndSourceRanges\", \"org.eclipse.jdt.core.dom.QualifiedName\", \"char[][]\", \"long[]\", \"org.eclipse.jdt.internal.compiler.ast.ASTNode\"))\n\t\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.core.dom.QualifiedName\", \"<init>\", \"void\", \"org.eclipse.jdt.core.dom.AST\"))\n\t\t\t\t.requestExtra(StackRequest.PARAM3)\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"setIsGeneratedFlagForName\", \"void\",\n\t\t\t\t\t\t\"org.eclipse.jdt.core.dom.Name\", \"java.lang.Object\"))\n\t\t\t\t.transplant().build());\n\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"setTypeNameForAnnotation\", \"void\", \"org.eclipse.jdt.internal.compiler.ast.Annotation\", \"org.eclipse.jdt.core.dom.Annotation\"))\n\t\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.core.dom.SimpleName\", \"<init>\", \"void\", \"org.eclipse.jdt.core.dom.AST\"))\n\t\t\t\t.requestExtra(StackRequest.PARAM1)\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"setIsGeneratedFlagForName\", \"void\",\n\t\t\t\t\t\t\"org.eclipse.jdt.core.dom.Name\", \"java.lang.Object\"))\n\t\t\t\t.transplant().build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"setTypeNameForAnnotation\", \"void\", \"org.eclipse.jdt.internal.compiler.ast.Annotation\", \"org.eclipse.jdt.core.dom.Annotation\"))\n\t\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.core.dom.QualifiedName\", \"<init>\", \"void\", \"org.eclipse.jdt.core.dom.AST\"))\n\t\t\t\t.requestExtra(StackRequest.PARAM1)\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"setIsGeneratedFlagForName\", \"void\",\n\t\t\t\t\t\t\"org.eclipse.jdt.core.dom.Name\", \"java.lang.Object\"))\n\t\t\t\t.transplant().build());\n\t}\n\t\n\tprivate static void patchAvoidReparsingGeneratedCode(ScriptManager sm) {\n\t\tfinal String PARSER_SIG = \"org.eclipse.jdt.internal.compiler.parser.Parser\";\n\t\tsm.addScript(ScriptBuilder.exitEarly()\n\t\t\t\t.target(new MethodTarget(PARSER_SIG, \"parse\", \"void\",\n\t\t\t\t\t\t\"org.eclipse.jdt.internal.compiler.ast.MethodDeclaration\",\n\t\t\t\t\t\t\"org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration\"))\n\t\t\t\t.decisionMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"checkBit24\", \"boolean\", \"java.lang.Object\"))\n\t\t\t\t.transplant()\n\t\t\t\t.request(StackRequest.PARAM1).build());\n\t\t\n\t\tsm.addScript(ScriptBuilder.exitEarly()\n\t\t\t\t.target(new MethodTarget(PARSER_SIG, \"parse\", \"void\",\n\t\t\t\t\t\t\"org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration\",\n\t\t\t\t\t\t\"org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration\", \"boolean\"))\n\t\t\t\t.decisionMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"checkBit24\", \"boolean\", \"java.lang.Object\"))\n\t\t\t\t.transplant()\n\t\t\t\t.request(StackRequest.PARAM1).build());\n\t\t\n\t\tsm.addScript(ScriptBuilder.exitEarly()\n\t\t\t\t.target(new MethodTarget(PARSER_SIG, \"parse\", \"void\",\n\t\t\t\t\t\t\"org.eclipse.jdt.internal.compiler.ast.Initializer\",\n\t\t\t\t\t\t\"org.eclipse.jdt.internal.compiler.ast.TypeDeclaration\",\n\t\t\t\t\t\t\"org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration\"))\n\t\t\t\t.decisionMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"checkBit24\", \"boolean\", \"java.lang.Object\"))\n\t\t\t\t.transplant()\n\t\t\t\t.request(StackRequest.PARAM1).build());\n\t}\n\t\n\tprivate static void patchLombokizeAST(ScriptManager sm) {\n\t\tsm.addScript(ScriptBuilder.addField()\n\t\t\t\t.targetClass(\"org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration\")\n\t\t\t\t.fieldName(\"$lombokAST\").fieldType(\"Ljava/lang/Object;\")\n\t\t\t\t.setPublic().setTransient().build());\n\t\t\n\t\tsm.addScript(ScriptBuilder.addField()\n\t\t\t\t.targetClass(\"org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration\")\n\t\t\t\t.fieldName(\"$transformationState\").fieldType(\"Ljava/lang/Object;\")\n\t\t\t\t.setPublic().setTransient().build());\n\t\t\n\t\tfinal String PARSER_SIG = \"org.eclipse.jdt.internal.compiler.parser.Parser\";\n\t\tfinal String CUD_SIG = \"org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration\";\n\t\tfinal String OBJECT_SIG = \"java.lang.Object\";\n\t\t\n\t\tsm.addScript(ScriptBuilder.wrapReturnValue()\n\t\t\t\t.target(new MethodTarget(PARSER_SIG, \"getMethodBodies\", \"void\", CUD_SIG))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$Transform\", \"transform\", \"void\", OBJECT_SIG, OBJECT_SIG))\n\t\t\t\t.request(StackRequest.THIS, StackRequest.PARAM1).build());\n\t\t\n\t\tsm.addScript(ScriptBuilder.wrapReturnValue()\n\t\t\t\t.target(new MethodTarget(PARSER_SIG, \"endParse\", CUD_SIG, \"int\"))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$Transform\", \"transform_swapped\", \"void\", OBJECT_SIG, OBJECT_SIG))\n\t\t\t\t.request(StackRequest.THIS, StackRequest.RETURN_VALUE).build());\n\t}\n\t\n\tprivate static void patchEcjTransformers(ScriptManager sm) {\n\t\taddPatchesForDelegate(sm);\n\t\taddPatchesForVal(sm);\n\t\taddPatchesForValEclipse(sm);\n\t}\n\t\n\tprivate static void addPatchesForDelegate(ScriptManager sm) {\n\t\tfinal String CLASSSCOPE_SIG = \"org.eclipse.jdt.internal.compiler.lookup.ClassScope\";\n\t\t\n\t\tsm.addScript(ScriptBuilder.exitEarly()\n\t\t\t\t.target(new MethodTarget(CLASSSCOPE_SIG, \"buildFieldsAndMethods\", \"void\"))\n\t\t\t\t.request(StackRequest.THIS)\n\t\t\t\t.decisionMethod(new Hook(\"lombok.launch.PatchFixesHider$Delegate\", \"handleDelegateForType\", \"boolean\", \"java.lang.Object\"))\n\t\t\t\t.build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.setSymbolDuringMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.core.SelectionRequestor\", \"acceptSourceMethod\"))\n\t\t\t\t.callToWrap(new Hook(\"org.eclipse.jdt.core.IType\", \"getMethods\", \"org.eclipse.jdt.core.IMethod[]\"))\n\t\t\t\t.symbol(\"lombok.skipdelegates\")\n\t\t\t\t.build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.addField()\n\t\t\t\t.fieldName(\"$delegateMethods\")\n\t\t\t\t.fieldType(\"Ljava/util/Map;\")\n\t\t\t\t.setPublic()\n\t\t\t\t.setTransient()\n\t\t\t\t.targetClass(\"org.eclipse.jdt.internal.core.CompilationUnit\")\n\t\t\t\t.build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapReturnValue()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.core.SourceTypeElementInfo\", \"getChildren\", \"org.eclipse.jdt.core.IJavaElement[]\"))\n\t\t\t\t.request(StackRequest.RETURN_VALUE, StackRequest.THIS)\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$Delegate\", \"addGeneratedDelegateMethods\", \"java.lang.Object[]\", \"java.lang.Object\", \"java.lang.Object\"))\n\t\t\t\t.build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.exitEarly()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.core.JavaElement\", \"getElementInfo\", \"org.eclipse.jdt.internal.compiler.env.IElementInfo\"))\n\t\t\t\t.request(StackRequest.THIS)\n\t\t\t\t.decisionMethod(new Hook(\"lombok.launch.PatchFixesHider$Delegate\", \"isDelegateSourceMethod\", \"boolean\", \"java.lang.Object\"))\n\t\t\t\t.valueMethod(new Hook(\"lombok.launch.PatchFixesHider$Delegate\", \"returnElementInfo\", \"java.lang.Object\", \"java.lang.Object\"))\n\t\t\t\t.build());\n\t}\n\t\n\tprivate static void addPatchesForValEclipse(ScriptManager sm) {\n\t\tfinal String LOCALDECLARATION_SIG = \"org.eclipse.jdt.internal.compiler.ast.LocalDeclaration\";\n\t\tfinal String PARSER_SIG = \"org.eclipse.jdt.internal.compiler.parser.Parser\";\n\t\tfinal String VARIABLEDECLARATIONSTATEMENT_SIG = \"org.eclipse.jdt.core.dom.VariableDeclarationStatement\";\n\t\tfinal String SINGLEVARIABLEDECLARATION_SIG = \"org.eclipse.jdt.core.dom.SingleVariableDeclaration\";\n\t\tfinal String ASTCONVERTER_SIG = \"org.eclipse.jdt.core.dom.ASTConverter\";\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.addField()\n\t\t\t\t.fieldName(\"$initCopy\")\n\t\t\t\t.fieldType(\"Lorg/eclipse/jdt/internal/compiler/ast/ASTNode;\")\n\t\t\t\t.setPublic()\n\t\t\t\t.setTransient()\n\t\t\t\t.targetClass(\"org.eclipse.jdt.internal.compiler.ast.LocalDeclaration\")\n\t\t\t\t.build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.addField()\n\t\t\t\t.fieldName(\"$iterableCopy\")\n\t\t\t\t.fieldType(\"Lorg/eclipse/jdt/internal/compiler/ast/ASTNode;\")\n\t\t\t\t.setPublic()\n\t\t\t\t.setTransient()\n\t\t\t\t.targetClass(\"org.eclipse.jdt.internal.compiler.ast.LocalDeclaration\")\n\t\t\t\t.build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapReturnValue()\n\t\t\t\t.target(new MethodTarget(PARSER_SIG, \"consumeExitVariableWithInitialization\", \"void\"))\n\t\t\t\t.request(StackRequest.THIS)\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$ValPortal\", \"copyInitializationOfLocalDeclaration\", \"void\", \"java.lang.Object\"))\n\t\t\t\t.build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapReturnValue()\n\t\t\t\t.target(new MethodTarget(PARSER_SIG, \"consumeEnhancedForStatementHeader\", \"void\"))\n\t\t\t\t.request(StackRequest.THIS)\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$ValPortal\", \"copyInitializationOfForEachIterable\", \"void\", \"java.lang.Object\"))\n\t\t\t\t.build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapReturnValue()\n\t\t\t\t.target(new MethodTarget(ASTCONVERTER_SIG, \"setModifiers\", \"void\", VARIABLEDECLARATIONSTATEMENT_SIG, LOCALDECLARATION_SIG))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$ValPortal\", \"addFinalAndValAnnotationToVariableDeclarationStatement\",\n\t\t\t\t\t\t\"void\", \"java.lang.Object\", \"java.lang.Object\", \"java.lang.Object\"))\n\t\t\t\t.request(StackRequest.THIS, StackRequest.PARAM1, StackRequest.PARAM2).build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapReturnValue()\n\t\t\t\t.target(new MethodTarget(ASTCONVERTER_SIG, \"setModifiers\", \"void\", SINGLEVARIABLEDECLARATION_SIG, LOCALDECLARATION_SIG))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$ValPortal\", \"addFinalAndValAnnotationToSingleVariableDeclaration\",\n\t\t\t\t\t\t\"void\", \"java.lang.Object\", \"java.lang.Object\", \"java.lang.Object\"))\n\t\t\t\t.request(StackRequest.THIS, StackRequest.PARAM1, StackRequest.PARAM2).build());\n\t}\n\t\n\tprivate static void addPatchesForVal(ScriptManager sm) {\n\t\tfinal String LOCALDECLARATION_SIG = \"org.eclipse.jdt.internal.compiler.ast.LocalDeclaration\";\n\t\tfinal String FOREACHSTATEMENT_SIG = \"org.eclipse.jdt.internal.compiler.ast.ForeachStatement\";\n\t\tfinal String EXPRESSION_SIG = \"org.eclipse.jdt.internal.compiler.ast.Expression\";\n\t\tfinal String BLOCKSCOPE_SIG = \"org.eclipse.jdt.internal.compiler.lookup.BlockScope\";\n\t\tfinal String TYPEBINDING_SIG = \"org.eclipse.jdt.internal.compiler.lookup.TypeBinding\";\n\t\tfinal String OBJECT_SIG = \"java.lang.Object\";\n\t\t\n\t\tsm.addScript(ScriptBuilder.exitEarly()\n\t\t\t\t.target(new MethodTarget(LOCALDECLARATION_SIG, \"resolve\", \"void\", BLOCKSCOPE_SIG))\n\t\t\t\t.request(StackRequest.THIS, StackRequest.PARAM1)\n\t\t\t\t.decisionMethod(new Hook(\"lombok.launch.PatchFixesHider$Val\", \"handleValForLocalDeclaration\", \"boolean\", OBJECT_SIG, OBJECT_SIG))\n\t\t\t\t.build());\n\t\t\n\t\tsm.addScript(ScriptBuilder.replaceMethodCall()\n\t\t\t\t.target(new MethodTarget(LOCALDECLARATION_SIG, \"resolve\", \"void\", BLOCKSCOPE_SIG))\n\t\t\t\t.target(new MethodTarget(LOCALDECLARATION_SIG, \"resolve\", \"void\", BLOCKSCOPE_SIG, \"boolean\"))\n\t\t\t\t.methodToReplace(new Hook(EXPRESSION_SIG, \"resolveType\", TYPEBINDING_SIG, BLOCKSCOPE_SIG))\n\t\t\t\t.requestExtra(StackRequest.THIS)\n\t\t\t\t.replacementMethod(new Hook(\"lombok.launch.PatchFixesHider$Val\", \"skipResolveInitializerIfAlreadyCalled2\", TYPEBINDING_SIG, EXPRESSION_SIG, BLOCKSCOPE_SIG, LOCALDECLARATION_SIG))\n\t\t\t\t.transplant()\n\t\t\t\t.build());\n\t\t\n\t\tsm.addScript(ScriptBuilder.replaceMethodCall()\n\t\t\t\t.target(new MethodTarget(FOREACHSTATEMENT_SIG, \"resolve\", \"void\", BLOCKSCOPE_SIG))\n\t\t\t\t.methodToReplace(new Hook(EXPRESSION_SIG, \"resolveType\", TYPEBINDING_SIG, BLOCKSCOPE_SIG))\n\t\t\t\t.replacementMethod(new Hook(\"lombok.launch.PatchFixesHider$Val\", \"skipResolveInitializerIfAlreadyCalled\", TYPEBINDING_SIG, EXPRESSION_SIG, BLOCKSCOPE_SIG))\n\t\t\t\t.transplant()\n\t\t\t\t.build());\n\t\t\n\t\tsm.addScript(ScriptBuilder.exitEarly()\n\t\t\t\t.target(new MethodTarget(FOREACHSTATEMENT_SIG, \"resolve\", \"void\", BLOCKSCOPE_SIG))\n\t\t\t\t.request(StackRequest.THIS, StackRequest.PARAM1)\n\t\t\t\t.decisionMethod(new Hook(\"lombok.launch.PatchFixesHider$Val\", \"handleValForForEach\", \"boolean\", OBJECT_SIG, OBJECT_SIG))\n\t\t\t\t.build());\n\t}\n\t\n\tprivate static void patchFixSourceTypeConverter(ScriptManager sm) {\n\t\tfinal String SOURCE_TYPE_CONVERTER_SIG = \"org.eclipse.jdt.internal.compiler.parser.SourceTypeConverter\";\n\t\tfinal String I_ANNOTATABLE_SIG = \"org.eclipse.jdt.core.IAnnotatable\";\n\t\tfinal String ANNOTATION_SIG = \"org.eclipse.jdt.internal.compiler.ast.Annotation\";\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapReturnValue()\n\t\t\t\t.target(new MethodTarget(SOURCE_TYPE_CONVERTER_SIG, \"convertAnnotations\", ANNOTATION_SIG + \"[]\", I_ANNOTATABLE_SIG))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"convertAnnotations\", ANNOTATION_SIG + \"[]\", ANNOTATION_SIG + \"[]\", I_ANNOTATABLE_SIG))\n\t\t\t\t.request(StackRequest.PARAM1, StackRequest.RETURN_VALUE).build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.exitEarly()\n\t\t\t\t.target(new MethodTarget(SOURCE_TYPE_CONVERTER_SIG, \"parseMemberValue\", \"org.eclipse.jdt.internal.compiler.ast.Expression\", \"char[]\"))\n\t\t\t\t.decisionMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"isEmpty\", \"boolean\", \"char[]\"))\n\t\t\t\t.valueMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"returnNullExpression\", \"org.eclipse.jdt.internal.compiler.ast.Expression\", \"java.lang.Object\"))\n\t\t\t\t.request(StackRequest.PARAM1)\n\t\t\t\t.transplant()\n\t\t\t\t.build());\n\t}\n\t\n\tprivate static void patchEclipseDebugPatches(ScriptManager sm) {\n\t\tfinal String ASTNODE_SIG = \"org.eclipse.jdt.core.dom.ASTNode\";\n\t\tfinal String PATCH_DEBUG = \"lombok.eclipse.agent.PatchDiagnostics\";\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, exitEarly()\n\t\t\t\t.target(new MethodTarget(ASTNODE_SIG, \"setSourceRange\", \"void\", \"int\", \"int\"))\n\t\t\t\t.request(StackRequest.THIS)\n\t\t\t\t.request(StackRequest.PARAM1)\n\t\t\t\t.request(StackRequest.PARAM2)\n\t\t\t\t.decisionMethod(new Hook(PATCH_DEBUG, \"setSourceRangeCheck\", \"boolean\", \"java.lang.Object\", \"int\", \"int\"))\n\t\t\t\t.build());\n\t}\n\t\n\tprivate static void patchExtensionMethod(ScriptManager sm) {\n\t\tfinal String PATCH_EXTENSIONMETHOD = \"lombok.launch.PatchFixesHider$ExtensionMethod\";\n\t\tfinal String PATCH_EXTENSIONMETHOD_COMPLETIONPROPOSAL_PORTAL = \"lombok.eclipse.agent.PatchExtensionMethodCompletionProposalPortal\";\n\t\tfinal String MESSAGE_SEND_SIG = \"org.eclipse.jdt.internal.compiler.ast.MessageSend\";\n\t\tfinal String TYPE_BINDING_SIG = \"org.eclipse.jdt.internal.compiler.lookup.TypeBinding\";\n\t\tfinal String SCOPE_SIG = \"org.eclipse.jdt.internal.compiler.lookup.Scope\";\n\t\tfinal String BLOCK_SCOPE_SIG = \"org.eclipse.jdt.internal.compiler.lookup.BlockScope\";\n\t\tfinal String TYPE_BINDINGS_SIG = \"org.eclipse.jdt.internal.compiler.lookup.TypeBinding[]\";\n\t\tfinal String PROBLEM_REPORTER_SIG = \"org.eclipse.jdt.internal.compiler.problem.ProblemReporter\";\n\t\tfinal String METHOD_BINDING_SIG = \"org.eclipse.jdt.internal.compiler.lookup.MethodBinding\";\n\t\tfinal String COMPLETION_PROPOSAL_COLLECTOR_SIG = \"org.eclipse.jdt.ui.text.java.CompletionProposalCollector\";\n\t\tfinal String I_JAVA_COMPLETION_PROPOSAL_SIG = \"org.eclipse.jdt.ui.text.java.IJavaCompletionProposal[]\";\n\t\tfinal String AST_NODE = \"org.eclipse.jdt.internal.compiler.ast.ASTNode\";\n\t\tfinal String OBJECT_SIG = \"java.lang.Object\";\n\t\t\n\t\tsm.addScript(wrapReturnValue()\n\t\t\t.target(new MethodTarget(MESSAGE_SEND_SIG, \"resolveType\", TYPE_BINDING_SIG, BLOCK_SCOPE_SIG))\n\t\t\t.request(StackRequest.RETURN_VALUE)\n\t\t\t.request(StackRequest.THIS)\n\t\t\t.request(StackRequest.PARAM1)\n\t\t\t.wrapMethod(new Hook(PATCH_EXTENSIONMETHOD, \"resolveType\", OBJECT_SIG, OBJECT_SIG, OBJECT_SIG, OBJECT_SIG))\n\t\t\t.cast()\n\t\t\t.build());\n\t\t\n\t\tsm.addScript(replaceMethodCall()\n\t\t\t.target(new MethodTarget(MESSAGE_SEND_SIG, \"resolveType\", TYPE_BINDING_SIG, BLOCK_SCOPE_SIG))\n\t\t\t.methodToReplace(new Hook(PROBLEM_REPORTER_SIG, \"errorNoMethodFor\", \"void\", MESSAGE_SEND_SIG, TYPE_BINDING_SIG, TYPE_BINDINGS_SIG))\n\t\t\t.replacementMethod(new Hook(PATCH_EXTENSIONMETHOD, \"errorNoMethodFor\", \"void\", OBJECT_SIG, OBJECT_SIG, OBJECT_SIG, OBJECT_SIG))\n\t\t\t.build());\n\t\t\n\t\tsm.addScript(replaceMethodCall()\n\t\t\t.target(new MethodTarget(MESSAGE_SEND_SIG, \"resolveType\", TYPE_BINDING_SIG, BLOCK_SCOPE_SIG))\n\t\t\t.methodToReplace(new Hook(PROBLEM_REPORTER_SIG, \"invalidMethod\", \"void\", MESSAGE_SEND_SIG, METHOD_BINDING_SIG))\n\t\t\t.replacementMethod(new Hook(PATCH_EXTENSIONMETHOD, \"invalidMethod\", \"void\", OBJECT_SIG, OBJECT_SIG, OBJECT_SIG))\n\t\t\t.build());\n\t\t\n\t\t// Since eclipse mars; they added a param.\n\t\tsm.addScript(replaceMethodCall()\n\t\t\t.target(new MethodTarget(MESSAGE_SEND_SIG, \"resolveType\", TYPE_BINDING_SIG, BLOCK_SCOPE_SIG))\n\t\t\t.methodToReplace(new Hook(PROBLEM_REPORTER_SIG, \"invalidMethod\", \"void\", MESSAGE_SEND_SIG, METHOD_BINDING_SIG, SCOPE_SIG))\n\t\t\t.replacementMethod(new Hook(PATCH_EXTENSIONMETHOD, \"invalidMethod\", \"void\", OBJECT_SIG, OBJECT_SIG, OBJECT_SIG, OBJECT_SIG))\n\t\t\t.build());\n\t\t\n\t\tsm.addScript(replaceMethodCall()\n\t\t\t.target(new MethodTarget(MESSAGE_SEND_SIG, \"resolveType\", TYPE_BINDING_SIG, BLOCK_SCOPE_SIG))\n\t\t\t.methodToReplace(new Hook(PROBLEM_REPORTER_SIG, \"nonStaticAccessToStaticMethod\", \"void\", AST_NODE, METHOD_BINDING_SIG))\n\t\t\t.replacementMethod(new Hook(PATCH_EXTENSIONMETHOD, \"nonStaticAccessToStaticMethod\", \"void\", OBJECT_SIG, OBJECT_SIG, OBJECT_SIG, OBJECT_SIG))\n\t\t\t.requestExtra(StackRequest.THIS)\n\t\t\t.build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, wrapReturnValue()\n\t\t\t.target(new MethodTarget(COMPLETION_PROPOSAL_COLLECTOR_SIG, \"getJavaCompletionProposals\", I_JAVA_COMPLETION_PROPOSAL_SIG))\n\t\t\t.request(StackRequest.RETURN_VALUE)\n\t\t\t.request(StackRequest.THIS)\n\t\t\t.wrapMethod(new Hook(PATCH_EXTENSIONMETHOD_COMPLETIONPROPOSAL_PORTAL, \"getJavaCompletionProposals\", I_JAVA_COMPLETION_PROPOSAL_SIG, \"java.lang.Object[]\", \"java.lang.Object\"))\n\t\t\t.build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapReturnValue()\n\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.search.SearchPattern\", \"createPattern\", \"org.eclipse.jdt.core.search.SearchPattern\", \"org.eclipse.jdt.core.IJavaElement\", \"int\", \"int\"))\n\t\t\t.wrapMethod(new Hook(PATCH_EXTENSIONMETHOD, \"modifyMethodPattern\", \"java.lang.Object\", \"java.lang.Object\"))\n\t\t\t.cast()\n\t\t\t.request(StackRequest.RETURN_VALUE)\n\t\t\t.build());\n\t}\n\n\tprivate static void patchNullCheck(ScriptManager sm) {\n\t\t/* Avoid warnings caused by the null check generated for lombok.NonNull if NonNullByDefault is used. */\n\n\t\t/* Avoid \"Redundant null check: comparing '@NonNull String' against null\" */\n\t\tsm.addScript(ScriptBuilder.exitEarly()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.compiler.problem.ProblemReporter\", \"expressionNonNullComparison\", \"boolean\", \"org.eclipse.jdt.internal.compiler.ast.Expression\", \"boolean\"))\n\t\t\t\t.decisionMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"isGenerated\", \"boolean\", \"org.eclipse.jdt.internal.compiler.ast.ASTNode\"))\n\t\t\t\t.valueMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"returnTrue\", \"boolean\", \"java.lang.Object\"))\n\t\t\t\t.request(StackRequest.PARAM1)\n\t\t\t\t.transplant().build());\n\n\t\t/* Avoid \"Dead code\" */\n\t\tsm.addScript(ScriptBuilder.exitEarly()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.compiler.problem.ProblemReporter\", \"fakeReachable\", \"void\", \"org.eclipse.jdt.internal.compiler.ast.ASTNode\"))\n\t\t\t\t.decisionMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"isGenerated\", \"boolean\", \"org.eclipse.jdt.internal.compiler.ast.ASTNode\"))\n\t\t\t\t.request(StackRequest.PARAM1)\n\t\t\t\t.transplant().build());\n\t}\n\t\n\tprivate static void patchJavadoc(ScriptManager sm) {\n\t\t// Moved to new package and changed to instance method in 2024-03\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.manipulation.internal.javadoc.CoreJavadocAccess\", \"getHTMLContent\", \"java.lang.String\", \"org.eclipse.jdt.core.IJavaElement\", \"boolean\"))\n\t\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.core.manipulation.internal.javadoc.CoreJavadocAccess\", \"getHTMLContentFromSource\", \"java.lang.String\", \"org.eclipse.jdt.core.IJavaElement\"))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$Javadoc\", \"getHTMLContentFromSource\", \"java.lang.String\", \"java.lang.String\", \"java.lang.Object\", \"org.eclipse.jdt.core.IJavaElement\"))\n\t\t\t\t.requestExtra(StackRequest.THIS, StackRequest.PARAM1)\n\t\t\t\t.build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.ui.text.javadoc.JavadocContentAccess2\", \"getHTMLContent\", \"java.lang.String\", \"org.eclipse.jdt.core.IJavaElement\", \"boolean\"))\n\t\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.internal.ui.text.javadoc.JavadocContentAccess2\", \"getHTMLContentFromSource\", \"java.lang.String\", \"org.eclipse.jdt.core.IJavaElement\"))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$Javadoc\", \"getHTMLContentFromSource\", \"java.lang.String\", \"java.lang.String\", \"org.eclipse.jdt.core.IJavaElement\"))\n\t\t\t\t.requestExtra(StackRequest.PARAM1)\n\t\t\t\t.build());\n\t\t\n\t\t/* This is a copy for the language server implementation that also supports markdown */\n\t\tsm.addScript(ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.ls.core.internal.javadoc.JavadocContentAccess2\", \"getHTMLContent\", \"java.lang.String\", \"org.eclipse.jdt.core.IJavaElement\", \"boolean\"))\n\t\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.ls.core.internal.javadoc.JavadocContentAccess2\", \"getHTMLContentFromSource\", \"java.lang.String\", \"org.eclipse.jdt.core.IJavaElement\"))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$Javadoc\", \"getHTMLContentFromSource\", \"java.lang.String\", \"java.lang.String\", \"org.eclipse.jdt.core.IJavaElement\"))\n\t\t\t\t.requestExtra(StackRequest.PARAM1)\n\t\t\t\t.build());\n\t\t\n\t\t/* This is an older version that uses IMember instead of IJavaElement */\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.ui.text.javadoc.JavadocContentAccess2\", \"getHTMLContent\", \"java.lang.String\", \"org.eclipse.jdt.core.IMember\", \"boolean\"))\n\t\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.internal.ui.text.javadoc.JavadocContentAccess2\", \"getHTMLContentFromSource\", \"java.lang.String\", \"org.eclipse.jdt.core.IMember\"))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$Javadoc\", \"getHTMLContentFromSource\", \"java.lang.String\", \"java.lang.String\", \"org.eclipse.jdt.core.IJavaElement\"))\n\t\t\t\t.requestExtra(StackRequest.PARAM1)\n\t\t\t\t.build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.addField()\n\t\t\t\t.fieldName(\"$javadoc\")\n\t\t\t\t.fieldType(\"Ljava/util/Map;\")\n\t\t\t\t.setPublic()\n\t\t\t\t.setTransient()\n\t\t\t\t.targetClass(\"org.eclipse.jdt.internal.core.CompilationUnit\")\n\t\t\t\t.build());\n\t}\n\n\tprivate static void patchASTConverterLiterals(ScriptManager sm) {\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"convert\", \"org.eclipse.jdt.core.dom.Expression\", \"org.eclipse.jdt.internal.compiler.ast.StringLiteral\"))\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"convert\", \"org.eclipse.jdt.core.dom.Expression\", \"org.eclipse.jdt.internal.compiler.ast.TextBlock\"))\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"convert\", \"org.eclipse.jdt.core.dom.CharacterLiteral\", \"org.eclipse.jdt.internal.compiler.ast.CharLiteral\"))\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"convert\", \"org.eclipse.jdt.core.dom.NumberLiteral\", \"org.eclipse.jdt.internal.compiler.ast.DoubleLiteral\"))\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"convert\", \"org.eclipse.jdt.core.dom.NumberLiteral\", \"org.eclipse.jdt.internal.compiler.ast.FloatLiteral\"))\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"convert\", \"org.eclipse.jdt.core.dom.NumberLiteral\", \"org.eclipse.jdt.internal.compiler.ast.LongLiteral\"))\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"convert\", \"org.eclipse.jdt.core.dom.NumberLiteral\", \"org.eclipse.jdt.internal.compiler.ast.LongLiteralMinValue\"))\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"convert\", \"org.eclipse.jdt.core.dom.NumberLiteral\", \"org.eclipse.jdt.internal.compiler.ast.IntLiteral\"))\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.core.dom.ASTConverter\", \"convert\", \"org.eclipse.jdt.core.dom.NumberLiteral\", \"org.eclipse.jdt.internal.compiler.ast.IntLiteralMinValue\"))\n\t\t\t\t.methodToWrap(new Hook(\"java.lang.String\", \"<init>\", \"void\", \"char[]\", \"int\", \"int\"))\n\t\t\t\t.requestExtra(StackRequest.PARAM1)\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"getRealNodeSource\", \"java.lang.String\", \"java.lang.String\", \"org.eclipse.jdt.internal.compiler.ast.ASTNode\"))\n\t\t\t\t.transplant()\n\t\t\t\t.build());\n\t}\n\t\n\tprivate static void patchASTNodeSearchUtil(ScriptManager sm) {\n\t\t/*\n\t\t * If an annotation generates more than one method the normal node search returns one of them instead of the right one. \n\t\t * This patch method also compares method name and method parameter types to identify the right method.\n\t\t */\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapReturnValue()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.corext.refactoring.structure.ASTNodeSearchUtil\", \"getMethodDeclarationNode\", \"org.eclipse.jdt.core.dom.MethodDeclaration\", \"org.eclipse.jdt.core.IMethod\", \"org.eclipse.jdt.core.dom.CompilationUnit\"))\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$PatchFixes\", \"getRealMethodDeclarationNode\", \"org.eclipse.jdt.core.dom.MethodDeclaration\", \"org.eclipse.jdt.core.dom.MethodDeclaration\", \"org.eclipse.jdt.core.IMethod\", \"org.eclipse.jdt.core.dom.CompilationUnit\"))\n\t\t\t\t.request(StackRequest.RETURN_VALUE, StackRequest.PARAM1, StackRequest.PARAM2)\n\t\t\t\t.transplant()\n\t\t\t\t.build());\n\t}\n\t\n\tprivate static void patchFieldInitializer(ScriptManager sm) {\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.addField()\n\t\t\t.targetClass(\"org.eclipse.jdt.internal.core.CompilationUnitStructureRequestor\")\n\t\t\t.fieldName(\"$fieldInfo\")\n\t\t\t.fieldType(\"Ljava/lang/Object;\")\n\t\t\t.build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.addField()\n\t\t\t.targetClass(\"org.eclipse.jdt.internal.core.CompilationUnitStructureRequestor\")\n\t\t\t.fieldName(\"$sourceFieldElementInfo\")\n\t\t\t.fieldType(\"Lorg/eclipse/jdt/internal/core/SourceFieldElementInfo;\")\n\t\t\t.build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.exitEarly()\n\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.core.CompilationUnitStructureRequestor\", \"exitField\", \"void\", \"int\", \"int\", \"int\"))\n\t\t\t.decisionMethod(new Hook(\"lombok.launch.PatchFixesHider$FieldInitializer\", \"storeFieldInfo\", \"boolean\", \"org.eclipse.jdt.internal.core.CompilationUnitStructureRequestor\"))\n\t\t\t.request(StackRequest.THIS)\n\t\t\t.transplant()\n\t\t\t.build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapMethodCall()\n\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.core.CompilationUnitStructureRequestor\", \"exitField\", \"void\", \"int\", \"int\", \"int\"))\n\t\t\t.methodToWrap(new Hook(\"org.eclipse.jdt.internal.core.SourceFieldElementInfo\", \"<init>\", \"void\"))\n\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$FieldInitializer\", \"storeSourceFieldElementInfo\", \"void\", \"org.eclipse.jdt.internal.core.SourceFieldElementInfo\", \"org.eclipse.jdt.internal.core.CompilationUnitStructureRequestor\"))\n\t\t\t.requestExtra(StackRequest.THIS)\n\t\t\t.transplant()\n\t\t\t.build());\n\t\t\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapReturnValue()\n\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.core.CompilationUnitStructureRequestor\", \"exitField\", \"void\", \"int\", \"int\", \"int\"))\n\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$FieldInitializer\", \"overwriteInitializer\", \"void\", \"org.eclipse.jdt.internal.core.CompilationUnitStructureRequestor\"))\n\t\t\t.request(StackRequest.THIS)\n\t\t\t.transplant()\n\t\t\t.build());\n\t}\n\t\n\tprivate static void patchCrossModuleClassLoading(ScriptManager sm) {\n\t\tsm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapReturnValue()\n\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.compiler.parser.Parser\", \"<clinit>\"))\n\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$ModuleClassLoading\", \"parserClinit\", \"void\"))\n\t\t\t.build());\n\t}\n\t\n\tprivate static void patchForTests(ScriptManager sm) {\n\t\tString[] ECLIPSE_TEST_CLASSES = new String[] {\"lombok/transform/TestWithEcj\", \"lombok/eclipse/EclipseRunner\"};\n\t\t\n\t\t// Add support for javadoc in tests\n\t\tsm.addScriptIfWitness(ECLIPSE_TEST_CLASSES, ScriptBuilder.replaceMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.compiler.ast.TypeDeclaration\", \"printBody\", \"java.lang.StringBuilder\", \"int\", \"java.lang.StringBuilder\"))\n\t\t\t\t.methodToReplace(new Hook(\"org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration\", \"print\", \"java.lang.StringBuilder\", \"int\", \"java.lang.StringBuilder\"))\n\t\t\t\t.replacementMethod(new Hook(\"lombok.launch.PatchFixesHider$Tests\", \"printMethod\", \"java.lang.StringBuilder\", \"org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration\", \"int\", \"java.lang.StringBuilder\", \"org.eclipse.jdt.internal.compiler.ast.TypeDeclaration\"))\n\t\t\t\t.requestExtra(StackRequest.THIS)\n\t\t\t\t.build());\n\t\t\n\t\tsm.addScriptIfWitness(ECLIPSE_TEST_CLASSES, ScriptBuilder.replaceMethodCall()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.compiler.ast.TypeDeclaration\", \"printBody\", \"java.lang.StringBuffer\", \"int\", \"java.lang.StringBuffer\"))\n\t\t\t\t.methodToReplace(new Hook(\"org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration\", \"print\", \"java.lang.StringBuffer\", \"int\", \"java.lang.StringBuffer\"))\n\t\t\t\t.replacementMethod(new Hook(\"lombok.launch.PatchFixesHider$Tests\", \"printMethod\", \"java.lang.StringBuffer\", \"org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration\", \"int\", \"java.lang.StringBuffer\", \"org.eclipse.jdt.internal.compiler.ast.TypeDeclaration\"))\n\t\t\t\t.requestExtra(StackRequest.THIS)\n\t\t\t\t.build());\n\t\t\n\t\tsm.addScriptIfWitness(ECLIPSE_TEST_CLASSES, ScriptBuilder.wrapReturnValue()\n\t\t\t\t.target(new MethodTarget(\"org.osgi.framework.FrameworkUtil\", \"getBundle\", \"org.osgi.framework.Bundle\", \"java.lang.Class\"))\n\t\t\t\t.request(StackRequest.RETURN_VALUE, StackRequest.PARAM1)\n\t\t\t\t.wrapMethod(new Hook(\"lombok.launch.PatchFixesHider$Tests\", \"getBundle\", \"java.lang.Object\", \"java.lang.Object\", \"java.lang.Class\"))\n\t\t\t\t.build());\n\t\t\n\t\t// Remove implicit canonical constructors in tests\n\t\tsm.addScriptIfWitness(ECLIPSE_TEST_CLASSES, ScriptBuilder.exitEarly()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration\", \"print\", \"java.lang.StringBuilder\", \"int\", \"java.lang.StringBuilder\"))\n\t\t\t\t.decisionMethod(new Hook(\"lombok.launch.PatchFixesHider$Tests\", \"isImplicitCanonicalConstructor\", \"boolean\", \"org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration\", \"java.lang.Object\"))\n\t\t\t\t.valueMethod(new Hook(\"lombok.launch.PatchFixesHider$Tests\", \"returnStringBuilder\", \"java.lang.StringBuilder\", \"java.lang.Object\", \"java.lang.StringBuilder\"))\n\t\t\t\t.request(StackRequest.THIS, StackRequest.PARAM2)\n\t\t\t\t.transplant()\n\t\t\t\t.build());\n\t\t\n\t\tsm.addScriptIfWitness(ECLIPSE_TEST_CLASSES, ScriptBuilder.exitEarly()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration\", \"print\", \"java.lang.StringBuffer\", \"int\", \"java.lang.StringBuffer\"))\n\t\t\t\t.decisionMethod(new Hook(\"lombok.launch.PatchFixesHider$Tests\", \"isImplicitCanonicalConstructor\", \"boolean\", \"org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration\", \"java.lang.Object\"))\n\t\t\t\t.valueMethod(new Hook(\"lombok.launch.PatchFixesHider$Tests\", \"returnStringBuffer\", \"java.lang.StringBuffer\", \"java.lang.Object\", \"java.lang.StringBuffer\"))\n\t\t\t\t.request(StackRequest.THIS, StackRequest.PARAM2)\n\t\t\t\t.transplant()\n\t\t\t\t.build());\n\t\t\n\t\t// Remove implicit record fields in tests\n\t\tsm.addScriptIfWitness(ECLIPSE_TEST_CLASSES, ScriptBuilder.exitEarly()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.compiler.ast.FieldDeclaration\", \"print\", \"java.lang.StringBuilder\", \"int\", \"java.lang.StringBuilder\"))\n\t\t\t\t.decisionMethod(new Hook(\"lombok.launch.PatchFixesHider$Tests\", \"isRecordComponent\", \"boolean\", \"org.eclipse.jdt.internal.compiler.ast.FieldDeclaration\", \"java.lang.Object\"))\n\t\t\t\t.valueMethod(new Hook(\"lombok.launch.PatchFixesHider$Tests\", \"returnStringBuilder\", \"java.lang.StringBuilder\", \"java.lang.Object\", \"java.lang.StringBuilder\"))\n\t\t\t\t.request(StackRequest.THIS, StackRequest.PARAM2)\n\t\t\t\t.transplant()\n\t\t\t\t.build());\n\t\t\n\t\tsm.addScriptIfWitness(ECLIPSE_TEST_CLASSES, ScriptBuilder.exitEarly()\n\t\t\t\t.target(new MethodTarget(\"org.eclipse.jdt.internal.compiler.ast.FieldDeclaration\", \"print\", \"java.lang.StringBuffer\", \"int\", \"java.lang.StringBuffer\"))\n\t\t\t\t.decisionMethod(new Hook(\"lombok.launch.PatchFixesHider$Tests\", \"isRecordComponent\", \"boolean\", \"org.eclipse.jdt.internal.compiler.ast.FieldDeclaration\", \"java.lang.Object\"))\n\t\t\t\t.valueMethod(new Hook(\"lombok.launch.PatchFixesHider$Tests\", \"returnStringBuffer\", \"java.lang.StringBuffer\", \"java.lang.Object\", \"java.lang.StringBuffer\"))\n\t\t\t\t.request(StackRequest.THIS, StackRequest.PARAM2)\n\t\t\t\t.transplant()\n\t\t\t\t.build());\n\t}\n\n}\n"
  },
  {
    "path": "src/eclipseAgent/lombok/eclipse/agent/ExtensionMethodCompletionProposal.java",
    "content": "/*\n * Copyright (C) 2012 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.agent;\n\nimport static org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants.AccStatic;\nimport static org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants.AccVarargs;\n\nimport java.util.Arrays;\n\nimport org.eclipse.core.runtime.IProgressMonitor;\nimport org.eclipse.jdt.core.CompletionProposal;\nimport org.eclipse.jdt.core.IMethod;\nimport org.eclipse.jdt.core.JavaModelException;\nimport org.eclipse.jdt.core.Signature;\nimport org.eclipse.jdt.core.compiler.CharOperation;\nimport org.eclipse.jdt.internal.codeassist.CompletionEngine;\nimport org.eclipse.jdt.internal.codeassist.InternalCompletionProposal;\nimport org.eclipse.jdt.internal.codeassist.complete.CompletionOnMemberAccess;\nimport org.eclipse.jdt.internal.codeassist.complete.CompletionOnQualifiedNameReference;\nimport org.eclipse.jdt.internal.codeassist.complete.CompletionOnSingleNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.lookup.MethodBinding;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeBinding;\nimport org.eclipse.jdt.internal.core.NameLookup;\n\npublic class ExtensionMethodCompletionProposal extends InternalCompletionProposal {\n\tprivate char[] fullSignature;\n\tprivate char[][] parameterNames;\n\t\n\tpublic ExtensionMethodCompletionProposal(final int replacementOffset) {\n\t\tsuper(CompletionProposal.METHOD_REF, replacementOffset - 1);\n\t}\n\t\n\tpublic void setMethodBinding(final MethodBinding method, final ASTNode node) {\n\t\t// Add proposal parameter names, sometimes its empty...\n\t\tif (method.parameterNames != null && method.parameterNames.length > 0) {\n\t\t\tsetParameterNames(Arrays.copyOfRange(method.parameterNames, 1, method.parameterNames.length));\n\t\t} else {\n\t\t\t// Copy signature for parameter name resolution, this is more reliable but slower\n\t\t\tfullSignature = CompletionEngine.getSignature(method);\n\t\t}\n\n\t\tMethodBinding original = method.original();\n\t\tTypeBinding[] parameters = Arrays.copyOf(method.parameters, method.parameters.length);\n\t\tmethod.parameters = Arrays.copyOfRange(method.parameters, 1, method.parameters.length);\n\n\t\tTypeBinding[] originalParameters = null;\n\t\tif (original != method) {\n\t\t\toriginalParameters = Arrays.copyOf(method.original().parameters, method.original().parameters.length);\n\t\t\tmethod.original().parameters = Arrays.copyOfRange(method.original().parameters, 1, method.original().parameters.length);\n\t\t}\n\t\t\n\t\tint length = method.parameters == null ? 0 : method.parameters.length;\n\t\tchar[][] parameterPackageNames = new char[length][];\n\t\tchar[][] parameterTypeNames = new char[length][];\n\n\t\tfor (int i = 0; i < length; i++) {\n\t\t\tTypeBinding type = method.original().parameters[i];\n\t\t\tparameterPackageNames[i] = type.qualifiedPackageName();\n\t\t\tparameterTypeNames[i] = type.qualifiedSourceName();\n\t\t}\n\t\tchar[] completion = CharOperation.concat(method.selector, new char[] { '(', ')' });\n\t\tsetDeclarationSignature(CompletionEngine.getSignature(method.declaringClass));\n\t\tsetSignature(CompletionEngine.getSignature(method));\n\n\t\tif (original != method) {\n\t\t\tsetOriginalSignature(CompletionEngine.getSignature(original));\n\t\t}\n\t\tsetDeclarationPackageName(method.declaringClass.qualifiedPackageName());\n\t\tsetDeclarationTypeName(method.declaringClass.qualifiedSourceName());\n\t\tsetParameterPackageNames(parameterPackageNames);\n\t\tsetParameterTypeNames(parameterTypeNames);\n\t\tsetPackageName(method.returnType.qualifiedPackageName());\n\t\tsetTypeName(method.returnType.qualifiedSourceName());\n\t\tsetName(method.selector);\n\t\tsetCompletion(completion);\n\t\tsetFlags(method.modifiers & (~AccStatic));\n\t\t// Remove varargs flag if it is the only parameter\n\t\tif (method.isVarargs() && length == 0) {\n\t\t\tsetFlags(getFlags() & (~AccVarargs));\n\t\t}\n\t\tint index = node.sourceEnd + 1;\n\t\tif (node instanceof CompletionOnQualifiedNameReference) {\n\t\t\tindex -= ((CompletionOnQualifiedNameReference) node).completionIdentifier.length;\n\t\t}\n\t\tif (node instanceof CompletionOnMemberAccess) {\n\t\t\tindex -= ((CompletionOnMemberAccess) node).token.length;\n\t\t}\n\t\tif (node instanceof CompletionOnSingleNameReference) {\n\t\t\tindex -= ((CompletionOnSingleNameReference) node).token.length;\n\t\t}\n\t\tsetReplaceRange(index, index);\n\t\tsetTokenRange(index, index);\n\n\t\tsetRelevance(100);\n\n\t\tmethod.parameters = parameters;\n\t\tif (original != method) {\n\t\t\tmethod.original().parameters = originalParameters;\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic char[][] findParameterNames(IProgressMonitor monitor) {\n\t\tif (parameterNames != null) {\n\t\t\treturn parameterNames;\n\t\t}\n\t\t\n\t\tNameLookup.Answer answer = this.nameLookup.findType(\n\t\t\tnew String(this.declarationTypeName),\n\t\t\tnew String(this.declarationPackageName),\n\t\t\tfalse,\n\t\t\tNameLookup.ACCEPT_CLASSES & NameLookup.ACCEPT_INTERFACES,\n\t\t\ttrue/* consider secondary types */,\n\t\t\tfalse/* do NOT wait for indexes */,\n\t\t\tfalse/*don't check restrictions*/,\n\t\t\tnull);\n\t\t\n\t\tif (answer != null && answer.type != null) {\n\t\t\tchar[][] parameterTypes = Signature.getParameterTypes(fullSignature);\n\t\t\t\n\t\t\tString[] args = new String[parameterTypes.length];\n\t\t\tfor (int i = 0; i < parameterTypes.length; i++) {\n\t\t\t\targs[i] = new String(parameterTypes[i]);\n\t\t\t}\n\t\t\tIMethod method = answer.type.getMethod(new String(this.getName()), args);\n\t\t\tIMethod[] methods = answer.type.findMethods(method);\n\t\t\tif (methods != null && methods.length > 0) {\n\t\t\t\tmethod = methods[0];\n\t\t\t}\n\t\t\tif (method != null) {\n\t\t\t\ttry {\n\t\t\t\t\tString[] parameterNames = method.getParameterNames();\n\t\t\t\t\tchar[][] parameterNamesAsChar = new char[parameterNames.length - 1][];\n\t\t\t\t\tfor (int i = 0; i < parameterNamesAsChar.length; i++) {\n\t\t\t\t\t\tparameterNamesAsChar[i] = parameterNames[i + 1].toCharArray();\n\t\t\t\t\t}\n\t\t\t\t\tsetParameterNames(parameterNamesAsChar);\n\t\t\t\t} catch (JavaModelException e) {\n\t\t\t\t\t// Nope\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Seems like we failed, fallback\n\t\tif (parameterNames == null) {\n\t\t\tparameterNames = super.findParameterNames(monitor);\n\t\t}\n\t\treturn parameterNames;\n\t}\n\t\n\t@Override\n\tpublic void setParameterNames(char[][] parameterNames) {\n\t\tthis.parameterNames = parameterNames;\n\t\tsuper.setParameterNames(parameterNames);\n\t}\n}\n"
  },
  {
    "path": "src/eclipseAgent/lombok/eclipse/agent/MavenEcjBootstrapApp.java",
    "content": "/*\n * Copyright (C) 2022 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.agent;\n\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.io.FileWriter;\nimport java.io.InputStream;\nimport java.io.PrintStream;\nimport java.util.List;\n\nimport com.zwitserloot.cmdreader.CmdReader;\nimport com.zwitserloot.cmdreader.Description;\nimport com.zwitserloot.cmdreader.InvalidCommandLineException;\nimport com.zwitserloot.cmdreader.Shorthand;\n\nimport lombok.core.LombokApp;\nimport lombok.spi.Provides;\n\n@Provides\npublic class MavenEcjBootstrapApp extends LombokApp {\n\t@Override public String getAppName() {\n\t\treturn \"createMavenECJBootstrap\";\n\t}\n\t\n\t@Override public String getAppDescription() {\n\t\treturn \"Creates .mvn/jvm.config and .mvn/lombok-bootstrap.jar for\\n\" +\n\t\t\t\"use with the ECJ compiler.\";\n\t}\n\t\n\tprivate static class CmdArgs {\n\t\t@Shorthand(\"w\")\n\t\t@Description(\"Overwrite existing files. Defaults to false.\")\n\t\tboolean overwrite = false;\n\t\t\n\t\t@Shorthand(\"o\")\n\t\t@Description(\"The root of a Maven project. Defaults to the current working directory.\")\n\t\tString output;\n\t\t\n\t\t@Shorthand({\"h\", \"?\"})\n\t\t@Description(\"Shows this help text\")\n\t\tboolean help;\n\t}\n\t\n\t@Override public int runApp(List<String> rawArgs) throws Exception {\n\t\tCmdReader<CmdArgs> reader = CmdReader.of(CmdArgs.class);\n\t\tCmdArgs args;\n\t\ttry {\n\t\t\targs = reader.make(rawArgs.toArray(new String[0]));\n\t\t} catch (InvalidCommandLineException e) {\n\t\t\tprintHelp(reader, e.getMessage(), System.err);\n\t\t\treturn 1;\n\t\t}\n\t\t\n\t\tif (args.help) {\n\t\t\tprintHelp(reader, null, System.out);\n\t\t\treturn 0;\n\t\t}\n\t\t\n\t\treturn createBootstrap(args.output, args.overwrite);\n\t}\n\t\n\tprivate int createBootstrap(String root, boolean overwrite) {\n\t\tFile mvn = new File(root, \".mvn\");\n\t\tint result = 0;\n\t\tif (result == 0) result = makeMvn(mvn);\n\t\tif (result == 0) result = makeJvmConfig(mvn, overwrite);\n\t\tif (result == 0) result = makeJar(mvn, overwrite);\n\t\treturn result;\n\t}\n\t\n\tprivate int makeMvn(File mvn) {\n\t\tint result = 0;\n\t\tException err = null;\n\t\ttry {\n\t\t\tif (!mvn.exists() && !mvn.mkdirs()) result = 1;\n\t\t} catch (Exception e) {\n\t\t\tresult = 1;\n\t\t\terr = e;\n\t\t}\n\t\tif (result != 0) {\n\t\t\tSystem.err.println(\"Could not create \" + mvn.getPath());\n\t\t\tif (err != null) err.printStackTrace(System.err);\n\t\t}\n\t\treturn result;\n\t}\n\t\n\tprivate int makeJvmConfig(File mvn, boolean overwrite) {\n\t\tFile jvmConfig = new File(mvn, \"jvm.config\");\n\t\tif (jvmConfig.exists() && !overwrite) {\n\t\t\tSystem.err.println(canonical(jvmConfig) + \" exists but '-w' not specified.\");\n\t\t\treturn 1;\n\t\t}\n\t\ttry {\n\t\t\tFileWriter writer = new FileWriter(jvmConfig);\n\t\t\twriter.write(\"-javaagent:.mvn/lombok-bootstrap.jar\");\n\t\t\twriter.flush();\n\t\t\twriter.close();\n\t\t\tSystem.out.println(\"Successfully created: \" + canonical(jvmConfig));\n\t\t\treturn 0;\n\t\t} catch (Exception e) {\n\t\t\tSystem.err.println(\"Could not create: \" + canonical(jvmConfig));\n\t\t\te.printStackTrace(System.err);\n\t\t\treturn 1;\n\t\t}\n\t}\n\t\n\tprivate int makeJar(File mvn, boolean overwrite) {\n\t\tFile jar = new File(mvn, \"lombok-bootstrap.jar\");\n\t\tif (jar.exists() && !overwrite) {\n\t\t\tSystem.err.println(canonical(jar) + \" but '-w' not specified.\");\n\t\t\treturn 1;\n\t\t}\n\t\ttry {\n\t\t\tInputStream input = MavenEcjBootstrapApp.class.getResourceAsStream(\"/lombok/launch/mavenEcjBootstrapAgent.jar\");\n\t\t\tFileOutputStream output = new FileOutputStream(jar);\n\t\t\ttry {\n\t\t\t\tbyte[] buffer = new byte[4096];\n\t\t\t\tint length;\n\t\t\t\twhile ((length = input.read(buffer)) > 0) output.write(buffer, 0, length);\n\t\t\t\toutput.flush();\n\t\t\t\toutput.close();\n\t\t\t\tSystem.out.println(\"Successfully created: \" + canonical(jar));\n\t\t\t\treturn 0;\n\t\t\t} finally {\n\t\t\t\ttry {\n\t\t\t\t\toutput.close();\n\t\t\t\t} catch (Exception ignore) {}\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\tSystem.err.println(\"Could not create: \" + canonical(jar));\n\t\t\te.printStackTrace(System.err);\n\t\t\treturn 1;\n\t\t}\n\t}\n\t\n\tprivate static String canonical(File out) {\n\t\ttry {\n\t\t\treturn out.getCanonicalPath();\n\t\t} catch (Exception e) {\n\t\t\treturn out.getAbsolutePath();\n\t\t}\n\t}\n\t\n\tprivate void printHelp(CmdReader<CmdArgs> reader, String message, PrintStream out) {\n\t\tif (message != null) {\n\t\t\tout.println(message);\n\t\t\tout.println(\"----------------------------\");\n\t\t}\n\t\tout.println(reader.generateCommandLineHelp(\"java -jar lombok.jar createMavenECJBootstrap\"));\n\t}\n}\n"
  },
  {
    "path": "src/eclipseAgent/lombok/eclipse/agent/PatchDelegate.java",
    "content": "/*\n * Copyright (C) 2010-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.agent;\n\nimport static lombok.eclipse.EcjAugments.*;\nimport static lombok.eclipse.Eclipse.*;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\n\nimport java.lang.reflect.Field;\nimport java.lang.reflect.Method;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.ConcurrentMap;\n\nimport org.eclipse.jdt.core.ElementChangedEvent;\nimport org.eclipse.jdt.core.IJavaElement;\nimport org.eclipse.jdt.core.ILocalVariable;\nimport org.eclipse.jdt.core.IType;\nimport org.eclipse.jdt.core.JavaModelException;\nimport org.eclipse.jdt.core.Signature;\nimport org.eclipse.jdt.core.compiler.CharOperation;\nimport org.eclipse.jdt.internal.compiler.CompilationResult;\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.Argument;\nimport org.eclipse.jdt.internal.compiler.ast.ArrayInitializer;\nimport org.eclipse.jdt.internal.compiler.ast.ClassLiteralAccess;\nimport org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.FieldReference;\nimport org.eclipse.jdt.internal.compiler.ast.MemberValuePair;\nimport org.eclipse.jdt.internal.compiler.ast.MessageSend;\nimport org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.ReturnStatement;\nimport org.eclipse.jdt.internal.compiler.ast.SingleNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.SingleTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.Statement;\nimport org.eclipse.jdt.internal.compiler.ast.ThisReference;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.TypeParameter;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\nimport org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;\nimport org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding;\nimport org.eclipse.jdt.internal.compiler.lookup.ArrayBinding;\nimport org.eclipse.jdt.internal.compiler.lookup.BaseTypeBinding;\nimport org.eclipse.jdt.internal.compiler.lookup.Binding;\nimport org.eclipse.jdt.internal.compiler.lookup.ClassScope;\nimport org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers;\nimport org.eclipse.jdt.internal.compiler.lookup.FieldBinding;\nimport org.eclipse.jdt.internal.compiler.lookup.MethodBinding;\nimport org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding;\nimport org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;\nimport org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeBinding;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeConstants;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding;\nimport org.eclipse.jdt.internal.compiler.lookup.UnresolvedReferenceBinding;\nimport org.eclipse.jdt.internal.compiler.lookup.WildcardBinding;\nimport org.eclipse.jdt.internal.core.CompilationUnit;\nimport org.eclipse.jdt.internal.core.DeltaProcessor;\nimport org.eclipse.jdt.internal.core.JavaElement;\nimport org.eclipse.jdt.internal.core.JavaElementDelta;\nimport org.eclipse.jdt.internal.core.JavaModelManager;\nimport org.eclipse.jdt.internal.core.LocalVariable;\nimport org.eclipse.jdt.internal.core.SourceMethod;\nimport org.eclipse.jdt.internal.core.SourceMethodInfo;\nimport org.eclipse.jdt.internal.core.SourceType;\nimport org.eclipse.jdt.internal.core.SourceTypeElementInfo;\n\nimport lombok.core.AST.Kind;\nimport lombok.eclipse.Eclipse;\nimport lombok.eclipse.EclipseAST;\nimport lombok.eclipse.EclipseNode;\nimport lombok.eclipse.TransformEclipseAST;\nimport lombok.eclipse.handlers.SetGeneratedByVisitor;\nimport lombok.patcher.Symbols;\nimport lombok.permit.Permit;\n\npublic class PatchDelegate {\n\n\tprivate static class ClassScopeEntry {\n\t\tClassScopeEntry(ClassScope scope) {\n\t\t\tthis.scope = scope;\n\t\t}\n\t\t\n\t\tfinal ClassScope scope;\n\t\tString corruptedPath;\n\t}\n\t\n\tprivate static ThreadLocal<List<ClassScopeEntry>> visited = new ThreadLocal<List<ClassScopeEntry>>() {\n\t\tprotected List<ClassScopeEntry> initialValue() {\n\t\t\treturn new ArrayList<ClassScopeEntry>();\n\t\t}\n\t};\n\t\n\tprivate static String nameOfScope(ClassScope scope) {\n\t\tTypeDeclaration decl = scope.referenceContext;\n\t\tif (decl == null) return \"(unknown)\";\n\t\tif (decl.name == null || decl.name.length == 0) return \"(unknown)\";\n\t\treturn new String(decl.name);\n\t}\n\t\n\tprivate static boolean hasDelegateMarkedFieldsOrMethods(TypeDeclaration decl) {\n\t\tAbstractVariableDeclaration[] fields = getFieldsOrRecordComponents(decl);\n\t\tif (fields != null) for (AbstractVariableDeclaration field : fields) {\n\t\t\tif (field.annotations == null) continue;\n\t\t\tfor (Annotation ann : field.annotations) {\n\t\t\t\tif (isDelegate(ann, decl)) return true;\n\t\t\t}\n\t\t}\n\t\tif (decl.methods != null) for (AbstractMethodDeclaration method : decl.methods) {\n\t\t\tif (method.annotations == null) continue;\n\t\t\tfor (Annotation ann : method.annotations) {\n\t\t\t\tif (isDelegate(ann, decl)) return true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t\n\tpublic static boolean handleDelegateForType(ClassScope scope) {\n\t\tif (TransformEclipseAST.disableLombok) return false;\n\t\t\n\t\tCompilationUnitDeclaration cud = scope.compilationUnitScope().referenceContext;\n\t\tif (scope == scope.compilationUnitScope().topLevelTypes[0].scope) {\n\t\t\tif (eclipseAvailable) {\n\t\t\t\tEclipseOnlyMethods.cleanupDelegateMethods(cud);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (!hasDelegateMarkedFieldsOrMethods(scope.referenceContext)) return false;\n\t\t\n\t\tList<ClassScopeEntry> stack = visited.get();\n\t\tStringBuilder corrupted = null;\n\t\tfor (ClassScopeEntry entry : stack) {\n\t\t\tif (corrupted != null) {\n\t\t\t\tcorrupted.append(\" -> \").append(nameOfScope(entry.scope));\n\t\t\t} else if (entry.scope == scope) {\n\t\t\t\tcorrupted = new StringBuilder().append(nameOfScope(scope));\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (corrupted != null) {\n\t\t\tboolean found = false;\n\t\t\tString path = corrupted.toString();\n\t\t\tfor (ClassScopeEntry entry : stack) {\n\t\t\t\tif (!found && entry.scope == scope) found = true;\n\t\t\t\tif (found) entry.corruptedPath = path;\n\t\t\t}\n\t\t} else {\n\t\t\tClassScopeEntry entry = new ClassScopeEntry(scope);\n\t\t\tstack.add(entry);\n\t\t\t\n\t\t\ttry {\n\t\t\t\tTypeDeclaration decl = scope.referenceContext;\n\t\t\t\tif (decl != null) {\n\t\t\t\t\tEclipseAST eclipseAst = TransformEclipseAST.getAST(cud, true);\n\t\t\t\t\tList<BindingTuple> methodsToDelegate = new ArrayList<BindingTuple>();\n\t\t\t\t\tfillMethodBindingsForFields(cud, scope, methodsToDelegate);\n\t\t\t\t\tif (entry.corruptedPath != null) {\n\t\t\t\t\t\teclipseAst.get(scope.referenceContext).addError(\"No @Delegate methods created because there's a loop: \" + entry.corruptedPath);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgenerateDelegateMethods(eclipseAst.get(decl), methodsToDelegate, DelegateReceiver.FIELD);\n\t\t\t\t\t}\n\t\t\t\t\tmethodsToDelegate.clear();\n\t\t\t\t\tfillMethodBindingsForMethods(cud, scope, methodsToDelegate);\n\t\t\t\t\tif (entry.corruptedPath != null) {\n\t\t\t\t\t\teclipseAst.get(scope.referenceContext).addError(\"No @Delegate methods created because there's a loop: \" + entry.corruptedPath);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgenerateDelegateMethods(eclipseAst.get(decl), methodsToDelegate, DelegateReceiver.METHOD);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tstack.remove(stack.size() - 1);\n\t\t\t\tif (stack.isEmpty() && eclipseAvailable) {\n\t\t\t\t\tEclipseOnlyMethods.notifyDelegateMethodsAdded(cud);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * Returns a string containing the signature of a method that appears (erased) at least twice in the list.\n\t * If no duplicates are present, {@code null} is returned.\n\t */\n\tprivate static String containsDuplicates(List<BindingTuple> tuples) {\n\t\tSet<String> sigs = new HashSet<String>();\n\t\tfor (BindingTuple tuple : tuples) {\n\t\t\tif (!sigs.add(printSig(tuple.parameterized))) return printSig(tuple.parameterized);\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\t\n\tpublic static void markHandled(Annotation annotation) {\n\t\tAnnotation_applied.set(annotation, true);\n\t}\n\t\n\tprivate static AbstractVariableDeclaration[] getFieldsOrRecordComponents(TypeDeclaration decl) {\n\t\tif (isRecord(decl)) return getRecordComponents(decl);\n\t\treturn decl.fields;\n\t}\n\t\n\tprivate static void fillMethodBindingsForFields(CompilationUnitDeclaration cud, ClassScope scope, List<BindingTuple> methodsToDelegate) {\n\t\tTypeDeclaration decl = scope.referenceContext;\n\t\tif (decl == null) return;\n\t\t\n\t\tAbstractVariableDeclaration[] fields = getFieldsOrRecordComponents(decl);\n\t\tif (fields == null) return;\n\t\t\n\t\tfor (AbstractVariableDeclaration field : fields) {\n\t\t\tif (field.annotations == null) continue;\n\t\t\tfor (Annotation ann : field.annotations) {\n\t\t\t\tif (!isDelegate(ann, decl)) continue;\n\t\t\t\tif (Annotation_applied.getAndSet(ann, true)) continue;\n\t\t\t\t\n\t\t\t\tif ((field.modifiers & ClassFileConstants.AccStatic) != 0) {\n\t\t\t\t\tEclipseAST eclipseAst = TransformEclipseAST.getAST(cud, true);\n\t\t\t\t\teclipseAst.get(ann).addError(LEGALITY_OF_DELEGATE);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tList<ClassLiteralAccess> rawTypes = rawTypes(ann, \"types\");\n\t\t\t\tList<ClassLiteralAccess> excludedRawTypes = rawTypes(ann, \"excludes\");\n\t\t\t\t\n\t\t\t\tList<BindingTuple> methodsToExclude = new ArrayList<BindingTuple>();\n\t\t\t\tList<BindingTuple> methodsToDelegateForThisAnn = new ArrayList<BindingTuple>();\n\t\t\t\t\n\t\t\t\ttry {\n\t\t\t\t\tfor (ClassLiteralAccess cla : excludedRawTypes) {\n\t\t\t\t\t\taddAllMethodBindings(methodsToExclude, cla.type.resolveType(decl.initializerScope), new HashSet<String>(), field.name, ann);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tSet<String> banList = findAlreadyImplementedMethods(decl);\n\t\t\t\t\tfor (BindingTuple excluded : methodsToExclude) banList.add(printSig(excluded.parameterized));\n\t\t\t\t\t\n\t\t\t\t\tif (rawTypes.isEmpty()) {\n\t\t\t\t\t\taddAllMethodBindings(methodsToDelegateForThisAnn, field.type.resolveType(decl.initializerScope), banList, field.name, ann);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (ClassLiteralAccess cla : rawTypes) {\n\t\t\t\t\t\t\taddAllMethodBindings(methodsToDelegateForThisAnn, cla.type.resolveType(decl.initializerScope), banList, field.name, ann);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch (DelegateRecursion e) {\n\t\t\t\t\tEclipseAST eclipseAst = TransformEclipseAST.getAST(cud, true);\n\t\t\t\t\teclipseAst.get(ann).addError(String.format(RECURSION_NOT_ALLOWED, new String(e.member), new String(e.type)));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Not doing this right now because of problems - see commented-out-method for info.\n\t\t\t\t// removeExistingMethods(methodsToDelegate, decl, scope);\n\t\t\t\t\n\t\t\t\tString dupe = containsDuplicates(methodsToDelegateForThisAnn);\n\t\t\t\tif (dupe != null) {\n\t\t\t\t\tEclipseAST eclipseAst = TransformEclipseAST.getAST(cud, true);\n\t\t\t\t\teclipseAst.get(ann).addError(\"The method '\" + dupe + \"' is being delegated by more than one specified type.\");\n\t\t\t\t} else {\n\t\t\t\t\tmethodsToDelegate.addAll(methodsToDelegateForThisAnn);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate static final String LEGALITY_OF_DELEGATE = \"@Delegate is legal only on instance fields or no-argument instance methods.\";\n\tprivate static final String RECURSION_NOT_ALLOWED = \"@Delegate does not support recursion (delegating to a type that itself has @Delegate members). Member \\\"%s\\\" is @Delegate in type \\\"%s\\\"\";\n\t\n\tprivate static void fillMethodBindingsForMethods(CompilationUnitDeclaration cud, ClassScope scope, List<BindingTuple> methodsToDelegate) {\n\t\tTypeDeclaration decl = scope.referenceContext;\n\t\tif (decl == null) return;\n\t\t\n\t\tif (decl.methods != null) for (AbstractMethodDeclaration methodDecl : decl.methods) {\n\t\t\tif (methodDecl.annotations == null) continue;\n\t\t\tfor (Annotation ann : methodDecl.annotations) {\n\t\t\t\tif (!isDelegate(ann, decl)) continue;\n\t\t\t\tif (Annotation_applied.getAndSet(ann, true)) continue;\n\t\t\t\tif (!(methodDecl instanceof MethodDeclaration)) {\n\t\t\t\t\tEclipseAST eclipseAst = TransformEclipseAST.getAST(cud, true);\n\t\t\t\t\teclipseAst.get(ann).addError(LEGALITY_OF_DELEGATE);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (methodDecl.arguments != null) {\n\t\t\t\t\tEclipseAST eclipseAst = TransformEclipseAST.getAST(cud, true);\n\t\t\t\t\teclipseAst.get(ann).addError(LEGALITY_OF_DELEGATE);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ((methodDecl.modifiers & ClassFileConstants.AccStatic) != 0) {\n\t\t\t\t\tEclipseAST eclipseAst = TransformEclipseAST.getAST(cud, true);\n\t\t\t\t\teclipseAst.get(ann).addError(LEGALITY_OF_DELEGATE);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tMethodDeclaration method = (MethodDeclaration) methodDecl;\n\t\t\t\t\n\t\t\t\tList<ClassLiteralAccess> rawTypes = rawTypes(ann, \"types\");\n\t\t\t\tList<ClassLiteralAccess> excludedRawTypes = rawTypes(ann, \"excludes\");\n\t\t\t\t\n\t\t\t\tList<BindingTuple> methodsToExclude = new ArrayList<BindingTuple>();\n\t\t\t\tList<BindingTuple> methodsToDelegateForThisAnn = new ArrayList<BindingTuple>();\n\t\t\t\t\n\t\t\t\ttry {\n\t\t\t\t\tfor (ClassLiteralAccess cla : excludedRawTypes) {\n\t\t\t\t\t\taddAllMethodBindings(methodsToExclude, cla.type.resolveType(decl.initializerScope), new HashSet<String>(), method.selector, ann);\n\t\t\t\t\t}\n\n\t\t\t\t\tSet<String> banList = findAlreadyImplementedMethods(decl);\n\t\t\t\t\tfor (BindingTuple excluded : methodsToExclude) banList.add(printSig(excluded.parameterized));\n\t\t\t\t\t\n\t\t\t\t\tif (rawTypes.isEmpty()) {\n\t\t\t\t\t\tif (method.returnType == null) continue;\n\t\t\t\t\t\taddAllMethodBindings(methodsToDelegateForThisAnn, method.returnType.resolveType(decl.initializerScope), banList, method.selector, ann);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (ClassLiteralAccess cla : rawTypes) {\n\t\t\t\t\t\t\taddAllMethodBindings(methodsToDelegateForThisAnn, cla.type.resolveType(decl.initializerScope), banList, method.selector, ann);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch (DelegateRecursion e) {\n\t\t\t\t\tEclipseAST eclipseAst = TransformEclipseAST.getAST(cud, true);\n\t\t\t\t\teclipseAst.get(ann).addError(String.format(RECURSION_NOT_ALLOWED, new String(e.member), new String(e.type)));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Not doing this right now because of problems - see commented-out-method for info.\n\t\t\t\t// removeExistingMethods(methodsToDelegate, decl, scope);\n\t\t\t\t\n\t\t\t\tString dupe = containsDuplicates(methodsToDelegateForThisAnn);\n\t\t\t\tif (dupe != null) {\n\t\t\t\t\tEclipseAST eclipseAst = TransformEclipseAST.getAST(cud, true);\n\t\t\t\t\teclipseAst.get(ann).addError(\"The method '\" + dupe + \"' is being delegated by more than one specified type.\");\n\t\t\t\t} else {\n\t\t\t\t\tmethodsToDelegate.addAll(methodsToDelegateForThisAnn);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate static boolean isDelegate(Annotation ann, TypeDeclaration decl) {\n\t\tif (ann.type == null) return false;\n\t\tif (!charArrayEquals(\"Delegate\", ann.type.getLastToken())) return false;\n\t\t\n\t\tTypeBinding tb = ann.type.resolveType(decl.initializerScope);\n\t\tif (tb == null) return false;\n\t\tif (!charArrayEquals(\"lombok\", tb.qualifiedPackageName()) && !charArrayEquals(\"lombok.experimental\", tb.qualifiedPackageName())) return false;\n\t\tif (!charArrayEquals(\"Delegate\", tb.qualifiedSourceName())) return false;\n\t\treturn true;\n\t}\n\t\n\tprivate static List<ClassLiteralAccess> rawTypes(Annotation ann, String name) {\n\t\tList<ClassLiteralAccess> rawTypes = new ArrayList<ClassLiteralAccess>();\n\t\tfor (MemberValuePair pair : ann.memberValuePairs()) {\n\t\t\tif (charArrayEquals(name, pair.name)) {\n\t\t\t\tif (pair.value instanceof ArrayInitializer) {\n\t\t\t\t\tfor (Expression expr : ((ArrayInitializer)pair.value).expressions) {\n\t\t\t\t\t\tif (expr instanceof ClassLiteralAccess) rawTypes.add((ClassLiteralAccess) expr);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (pair.value instanceof ClassLiteralAccess) {\n\t\t\t\t\trawTypes.add((ClassLiteralAccess) pair.value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn rawTypes;\n\t}\n\t\n\t/*\n\t * We may someday finish this method. Steps to be completed:\n\t * \n\t * (A) Turn any Parameterized anythings into non-parameterized versions. Resolving parameterized stuff will definitely not work safely.\n\t * (B) scope.problemReporter() will need to return a noop reporter as various errors are marked off.\n\t * (C) Find a way to do _something_ for references to typevars (i.e. 'T') which are declared on the method itself.\n\t * (D) getTypeBinding isn't public, so call it via reflection.\n\t */\n//\tprivate static TypeBinding safeResolveAndErase(TypeReference ref, Scope scope) {\n//\t\tif (ref.resolvedType != null) {\n//\t\t\treturn ref.resolvedType.isValidBinding() ? ref.resolvedType : null;\n//\t\t}\n//\t\t\n//\t\ttry {\n//\t\t\tTypeBinding bind = ref.getTypeBinding(scope);\n//\t\t\tif (!bind.isValidBinding()) return null;\n//\t\t} catch (AbortCompilation e) {\n//\t\t\treturn null;\n//\t\t}\n//\t\treturn bind.erasure();\n//\t}\n\t\n\t/*\n\t * Not using this because calling clone.resolveType() taints a bunch of caches and reports erroneous errors.\n\t */\n//\tprivate static void removeExistingMethods(List<BindingTuple> list, TypeDeclaration decl, ClassScope scope) {\n//\t\tfor (AbstractMethodDeclaration methodDecl : decl.methods) {\n//\t\t\tif (!(methodDecl instanceof MethodDeclaration)) continue;\n//\t\t\tMethodDeclaration md = (MethodDeclaration) methodDecl;\n//\t\t\tchar[] name = md.selector;\n//\t\t\tTypeBinding[] args = md.arguments == null ? new TypeBinding[0] : new TypeBinding[md.arguments.length];\n//\t\t\tfor (int i = 0; i < args.length; i++) {\n//\t\t\t\tTypeReference clone = Eclipse.copyType(md.arguments[i].type, md.arguments[i]);\n//\t\t\t\targs[i] = clone.resolveType(scope).erasure(); // This is the problematic line\n//\t\t\t}\n//\t\t\tIterator<BindingTuple> it = list.iterator();\n//\t\t\tmethods:\n//\t\t\twhile (it.hasNext()) {\n//\t\t\t\tMethodBinding mb = it.next().parameterized;\n//\t\t\t\tif (!Arrays.equals(mb.selector, name)) continue;\n//\t\t\t\tint paramLen = mb.parameters == null ? 0 : mb.parameters.length;\n//\t\t\t\tif (paramLen != args.length) continue;\n//\t\t\t\tif (md.typeParameters == null || md.typeParameters.length == 0) {\n//\t\t\t\t\tfor (int i = 0; i < paramLen; i++) {\n//\t\t\t\t\t\tif (!mb.parameters[i].erasure().isEquivalentTo(args[i])) continue methods;\n//\t\t\t\t\t}\n//\t\t\t\t} else {\n//\t\t\t\t\tfor (int i = 0; i < paramLen; i++) {\n//\t\t\t\t\t\tif (!mb.parameters[i].erasure().isEquivalentTo(args[i])) ;\n//\t\t\t\t\t}\n//\t\t\t\t\t//BUG #???: We erase the method's parameter types using  the class scope, but we should be using the method scope.\n//\t\t\t\t\t// In practice this is no problem UNLESS the method has type parameters, such as <T> T[] toArray(T[] in).\n//\t\t\t\t\t// In this case the class scope cannot resolve the T[] parameter and erase it to Object[], which is a big problem because\n//\t\t\t\t\t// it would mean manually writing <X> X[] toArray(X[] in) does NOT stop lombok from ALSO trying to make the delegated toArray method,\n//\t\t\t\t\t// thus causing an error (2 methods with post-erasure duplicate signatures). Our 'fix' for this is to treat any method with type parameters\n//\t\t\t\t\t// as if each parameter's type matches anything else; so, if the name matches and the parameter count, we DONT generate it, even if its just\n//\t\t\t\t\t// an overloaded method.\n//\t\t\t\t\t//\n//\t\t\t\t\t// The reason we do this now is because making that MethodScope properly is effectively impossible at this step, so we need to do the resolving\n//\t\t\t\t\t// ourselves, which involves chasing down array bindings (T[]), following the path down type variables, i.e. <X extends Y, Y extends T>, and then\n//\t\t\t\t\t// resolving the final result of this exercise against the class scope.\n//\t\t\t\t\t\n//\t\t\t\t\t// When this crappy incomplete workaround of ours occurs, we end up in this else block, which does nothing and thus we fall through and remove\n//\t\t\t\t\t// the method.\n//\t\t\t\t}\n//\t\t\t\tit.remove(); // Method already exists in this class - don't create a delegating implementation.\n//\t\t\t}\n//\t\t}\n//\t}\n\t\n\tprivate static void generateDelegateMethods(EclipseNode typeNode, List<BindingTuple> methods, DelegateReceiver delegateReceiver) {\n\t\tCompilationUnitDeclaration top = (CompilationUnitDeclaration) typeNode.top().get();\n\t\tList<MethodDeclaration> addedMethods = new ArrayList<MethodDeclaration>();\n\t\tfor (BindingTuple pair : methods) {\n\t\t\tEclipseNode annNode = typeNode.getAst().get(pair.responsible);\n\t\t\tMethodDeclaration method = createDelegateMethod(pair.fieldName, typeNode, pair, top.compilationResult, annNode, delegateReceiver);\n\t\t\tif (method != null) { \n\t\t\t\tSetGeneratedByVisitor visitor = new SetGeneratedByVisitor(annNode.get());\n\t\t\t\tmethod.traverse(visitor, ((TypeDeclaration)typeNode.get()).scope);\n\t\t\t\tinjectMethod(typeNode, method);\n\t\t\t\taddedMethods.add(method);\n\t\t\t}\n\t\t}\n\t\tif (eclipseAvailable) {\n\t\t\tEclipseOnlyMethods.collectGeneratedDelegateMethods(top, typeNode, addedMethods);\n\t\t}\n\t}\n\t\n\tpublic static void checkConflictOfTypeVarNames(BindingTuple binding, EclipseNode typeNode) throws CantMakeDelegates {\n\t\tTypeVariableBinding[] typeVars = binding.parameterized.typeVariables();\n\t\tif (typeVars == null || typeVars.length == 0) return;\n\t\t\n\t\tSet<String> usedInOurType = new HashSet<String>();\n\t\tEclipseNode enclosingType = typeNode;\n\t\twhile (enclosingType != null) {\n\t\t\tif (enclosingType.getKind() == Kind.TYPE) {\n\t\t\t\tTypeParameter[] typeParameters = ((TypeDeclaration)enclosingType.get()).typeParameters;\n\t\t\t\tif (typeParameters != null) {\n\t\t\t\t\tfor (TypeParameter param : typeParameters) {\n\t\t\t\t\t\tif (param.name != null) usedInOurType.add(new String(param.name));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tenclosingType = enclosingType.up();\n\t\t}\n\t\t\n\t\tSet<String> usedInMethodSig = new HashSet<String>();\n\t\tfor (TypeVariableBinding var : typeVars) {\n\t\t\tchar[] sourceName = var.sourceName();\n\t\t\tif (sourceName != null) usedInMethodSig.add(new String(sourceName));\n\t\t}\n\t\t\n\t\tusedInMethodSig.retainAll(usedInOurType);\n\t\tif (usedInMethodSig.isEmpty()) return;\n\t\t\n\t\t// We might be delegating a List<T>, and we are making method <T> toArray(). A conflict is possible.\n\t\t// But only if the toArray method also uses type vars from its class, otherwise we're only shadowing,\n\t\t// which is okay as we'll add a @SuppressWarnings.\n\t\t\n\t\tTypeVarFinder finder = new TypeVarFinder();\n\t\tfinder.visitRaw(binding.base);\n\t\t\n\t\tSet<String> names = new HashSet<String>(finder.getTypeVariables());\n\t\tnames.removeAll(usedInMethodSig);\n\t\tif (!names.isEmpty()) {\n\t\t\t// We have a confirmed conflict. We could dig deeper as this may still be a false alarm, but its already an exceedingly rare case.\n\t\t\tCantMakeDelegates cmd = new CantMakeDelegates();\n\t\t\tcmd.conflicted = usedInMethodSig;\n\t\t\tthrow cmd;\n\t\t}\n\t}\n\t\n\tpublic static class CantMakeDelegates extends Exception {\n\t\tpublic Set<String> conflicted;\n\t}\n\t\n\tpublic static class TypeVarFinder extends EclipseTypeBindingScanner {\n\t\tprivate Set<String> typeVars = new HashSet<String>();\n\t\t\n\t\tpublic Set<String> getTypeVariables() {\n\t\t\treturn typeVars;\n\t\t}\n\t\t\n\t\t@Override public void visitTypeVariable(TypeVariableBinding binding) {\n\t\t\tif (binding.sourceName != null) typeVars.add(new String(binding.sourceName));\n\t\t\tsuper.visitTypeVariable(binding);\n\t\t}\n\t}\n\t\n\tpublic abstract static class EclipseTypeBindingScanner {\n\t\tpublic void visitRaw(Binding binding) {\n\t\t\tif (binding == null) return;\n\t\t\tif (binding instanceof MethodBinding) visitMethod((MethodBinding) binding);\n\t\t\tif (binding instanceof BaseTypeBinding) visitBase((BaseTypeBinding) binding);\n\t\t\tif (binding instanceof ArrayBinding) visitArray((ArrayBinding) binding);\n\t\t\tif (binding instanceof UnresolvedReferenceBinding) visitUnresolved((UnresolvedReferenceBinding) binding);\n\t\t\tif (binding instanceof WildcardBinding) visitWildcard((WildcardBinding) binding);\n\t\t\tif (binding instanceof TypeVariableBinding) visitTypeVariable((TypeVariableBinding) binding);\n\t\t\tif (binding instanceof ParameterizedTypeBinding) visitParameterized((ParameterizedTypeBinding) binding);\n\t\t\tif (binding instanceof ReferenceBinding) visitReference((ReferenceBinding) binding);\n\t\t}\n\t\t\n\t\tpublic void visitReference(ReferenceBinding binding) {\n\t\t}\n\t\t\n\t\tpublic void visitParameterized(ParameterizedTypeBinding binding) {\n\t\t\tvisitRaw(binding.genericType());\n\t\t\tTypeVariableBinding[] typeVars = binding.typeVariables();\n\t\t\tif (typeVars != null) for (TypeVariableBinding child : typeVars) {\n\t\t\t\tvisitRaw(child);\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic void visitTypeVariable(TypeVariableBinding binding) {\n\t\t\tvisitRaw(binding.superclass);\n\t\t\tReferenceBinding[] supers = binding.superInterfaces();\n\t\t\tif (supers != null) for (ReferenceBinding child : supers) {\n\t\t\t\tvisitRaw(child);\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic void visitWildcard(WildcardBinding binding) {\n\t\t\tvisitRaw(binding.bound);\n\t\t}\n\t\t\n\t\tpublic void visitUnresolved(UnresolvedReferenceBinding binding) {\n\t\t}\n\t\t\n\t\tpublic void visitArray(ArrayBinding binding) {\n\t\t\tvisitRaw(binding.leafComponentType());\n\t\t}\n\t\t\n\t\tpublic void visitBase(BaseTypeBinding binding) {\n\t\t}\n\t\t\n\t\tpublic void visitMethod(MethodBinding binding) {\n\t\t\tif (binding.parameters != null) for (TypeBinding child : binding.parameters) {\n\t\t\t\tvisitRaw(child);\n\t\t\t}\n\t\t\tvisitRaw(binding.returnType);\n\t\t\tif (binding.thrownExceptions != null) for (TypeBinding child : binding.thrownExceptions) {\n\t\t\t\tvisitRaw(child);\n\t\t\t}\n\t\t\tTypeVariableBinding[] typeVars = binding.typeVariables();\n\t\t\tif (typeVars != null) for (TypeVariableBinding child : typeVars) {\n\t\t\t\tvisitRaw(child.superclass);\n\t\t\t\tReferenceBinding[] supers = child.superInterfaces();\n\t\t\t\tif (supers != null) for (ReferenceBinding child2 : supers) {\n\t\t\t\t\tvisitRaw(child2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate static MethodDeclaration createDelegateMethod(char[] name, EclipseNode typeNode, BindingTuple pair, CompilationResult compilationResult, EclipseNode annNode, DelegateReceiver delegateReceiver) {\n\t\t/* public <T, U, ...> ReturnType methodName(ParamType1 name1, ParamType2 name2, ...) throws T1, T2, ... {\n\t\t *      (return) delegate.<T, U>methodName(name1, name2);\n\t\t *  }\n\t\t */\n\t\t\n\t\tboolean isVarargs = (pair.base.modifiers & ClassFileConstants.AccVarargs) != 0;\n\t\t\n\t\ttry {\n\t\t\tcheckConflictOfTypeVarNames(pair, typeNode);\n\t\t} catch (CantMakeDelegates e) {\n\t\t\tannNode.addError(\"There's a conflict in the names of type parameters. Fix it by renaming the following type parameters of your class: \" + e.conflicted);\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\tASTNode source = annNode.get();\n\t\t\n\t\tint pS = source.sourceStart, pE = source.sourceEnd;\n\t\t\n\t\tMethodBinding binding = pair.parameterized;\n\t\tMethodDeclaration method = new MethodDeclaration(compilationResult);\n\t\tsetGeneratedBy(method, source);\n\t\tmethod.sourceStart = pS; method.sourceEnd = pE;\n\t\tmethod.modifiers = ClassFileConstants.AccPublic;\n\t\t\n\t\tmethod.returnType = makeType(binding.returnType, source, false);\n\t\tboolean isDeprecated = binding.isDeprecated();\n\t\t\n\t\tmethod.selector = binding.selector;\n\t\t\n\t\tif (binding.thrownExceptions != null && binding.thrownExceptions.length > 0) {\n\t\t\tmethod.thrownExceptions = new TypeReference[binding.thrownExceptions.length];\n\t\t\tfor (int i = 0; i < method.thrownExceptions.length; i++) {\n\t\t\t\tmethod.thrownExceptions[i] = makeType(binding.thrownExceptions[i], source, false);\n\t\t\t}\n\t\t}\n\t\t\n\t\tMessageSend call = new MessageSend();\n\t\tcall.sourceStart = pS; call.sourceEnd = pE;\n\t\tcall.nameSourcePosition = pos(source);\n\t\tsetGeneratedBy(call, source);\n\t\tcall.receiver = delegateReceiver.get(source, name);\n\t\tcall.selector = binding.selector;\n\t\t\n\t\tif (binding.typeVariables != null && binding.typeVariables.length > 0) {\n\t\t\tmethod.typeParameters = new TypeParameter[binding.typeVariables.length];\n\t\t\tcall.typeArguments = new TypeReference[binding.typeVariables.length];\n\t\t\tfor (int i = 0; i < method.typeParameters.length; i++) {\n\t\t\t\tmethod.typeParameters[i] = new TypeParameter();\n\t\t\t\tmethod.typeParameters[i].sourceStart = pS; method.typeParameters[i].sourceEnd = pE;\n\t\t\t\tsetGeneratedBy(method.typeParameters[i], source);\n\t\t\t\tmethod.typeParameters[i].name = binding.typeVariables[i].sourceName;\n\t\t\t\tcall.typeArguments[i] = new SingleTypeReference(binding.typeVariables[i].sourceName, pos(source));\n\t\t\t\tsetGeneratedBy(call.typeArguments[i], source);\n\t\t\t\tReferenceBinding super1 = binding.typeVariables[i].superclass;\n\t\t\t\tReferenceBinding[] super2 = binding.typeVariables[i].superInterfaces;\n\t\t\t\tif (super2 == null) super2 = new ReferenceBinding[0];\n\t\t\t\tif (super1 != null || super2.length > 0) {\n\t\t\t\t\tint offset = super1 == null ? 0 : 1;\n\t\t\t\t\tmethod.typeParameters[i].bounds = new TypeReference[super2.length + offset - 1];\n\t\t\t\t\tif (super1 != null) method.typeParameters[i].type = makeType(super1, source, false);\n\t\t\t\t\telse method.typeParameters[i].type = makeType(super2[0], source, false);\n\t\t\t\t\tint ctr = 0;\n\t\t\t\t\tfor (int j = (super1 == null) ? 1 : 0; j < super2.length; j++) {\n\t\t\t\t\t\tmethod.typeParameters[i].bounds[ctr] = makeType(super2[j], source, false);\n\t\t\t\t\t\tmethod.typeParameters[i].bounds[ctr++].bits |= ASTNode.IsSuperType;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (isDeprecated) {\n\t\t\tmethod.annotations = new Annotation[] { generateDeprecatedAnnotation(source) };\n\t\t}\n\t\t\n\t\tmethod.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;\n\t\t\n\t\tif (binding.parameters != null && binding.parameters.length > 0) {\n\t\t\tmethod.arguments = new Argument[binding.parameters.length];\n\t\t\tcall.arguments = new Expression[method.arguments.length];\n\t\t\tfor (int i = 0; i < method.arguments.length; i++) {\n\t\t\t\tAbstractMethodDeclaration sourceElem;\n\t\t\t\ttry {\n\t\t\t\t\tsourceElem = pair.base.sourceMethod();\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t\tsourceElem = null;\n\t\t\t\t}\n\t\t\t\tchar[] argName;\n\t\t\t\tif (sourceElem == null) argName = (\"arg\" + i).toCharArray();\n\t\t\t\telse {\n\t\t\t\t\targName = sourceElem.arguments[i].name;\n\t\t\t\t}\n\t\t\t\tmethod.arguments[i] = new Argument(\n\t\t\t\t\t\targName, pos(source),\n\t\t\t\t\t\tmakeType(binding.parameters[i], source, false),\n\t\t\t\t\t\tClassFileConstants.AccFinal);\n\t\t\t\tsetGeneratedBy(method.arguments[i], source);\n\t\t\t\tcall.arguments[i] = new SingleNameReference(argName, pos(source));\n\t\t\t\tsetGeneratedBy(call.arguments[i], source);\n\t\t\t}\n\t\t\tif (isVarargs) {\n\t\t\t\tmethod.arguments[method.arguments.length - 1].type.bits |= ASTNode.IsVarArgs;\n\t\t\t}\n\t\t}\n\t\t\n\t\tStatement body;\n\t\tif (method.returnType instanceof SingleTypeReference && ((SingleTypeReference)method.returnType).token == TypeConstants.VOID) {\n\t\t\tbody = call;\n\t\t} else {\n\t\t\tbody = new ReturnStatement(call, source.sourceStart, source.sourceEnd);\n\t\t\tsetGeneratedBy(body, source);\n\t\t}\n\t\t\n\t\tmethod.statements = new Statement[] {body};\n\t\treturn method;\n\t}\n\t\n\tprivate static boolean eclipseAvailable = true;\n\tstatic {\n\t\ttry {\n\t\t\tCompilationUnit.class.getName();\n\t\t} catch (Throwable t) {\n\t\t\teclipseAvailable = false;\n\t\t}\n\t}\n\t\n\tpublic static Object[] addGeneratedDelegateMethods(Object[] returnValue, Object javaElement) {\n\t\tif (Symbols.hasSymbol(\"lombok.skipdelegates\")) return returnValue;\n\t\tif (!eclipseAvailable) return returnValue;\n\t\t\n\t\treturn EclipseOnlyMethods.addGeneratedDelegateMethodsToChildren(returnValue, javaElement);\n\t}\n\t\n\tpublic static Object returnElementInfo(Object delegateSourceMethod) {\n\t\tField field = Permit.permissiveGetField(delegateSourceMethod.getClass(), \"sourceMethodInfo\");\n\t\treturn Permit.permissiveReadField(Object.class, field, delegateSourceMethod);\n\t}\n\t\n\tpublic static boolean isDelegateSourceMethod(Object sourceMethod) {\n\t\treturn sourceMethod.getClass().getName().equals(\"lombok.eclipse.agent.PatchDelegate$EclipseOnlyMethods$DelegateSourceMethod\");\n\t}\n\t\n\tpublic static class EclipseOnlyMethods {\n\t\tprivate static void cleanupDelegateMethods(CompilationUnitDeclaration cud) {\n\t\t\tCompilationUnit compilationUnit = getCompilationUnit(cud);\n\t\t\tif (compilationUnit != null) {\n\t\t\t\tEclipseAugments.CompilationUnit_delegateMethods.clear(compilationUnit);\n\t\t\t}\n\t\t}\n\n\t\tpublic static void collectGeneratedDelegateMethods(CompilationUnitDeclaration top, EclipseNode typeNode, List<MethodDeclaration> addedMethods) {\n\t\t\tString qualifiedName = new String(CharOperation.concatWith(getQualifiedInnerName(typeNode.up(), typeNode.getName().toCharArray()), '$'));\n\t\t\tSourceType sourceType = getSourceType(top, qualifiedName);\n\t\t\tList<SourceMethod> generatedMethods = getGeneratedMethods(sourceType);\n\t\t\tif (generatedMethods == null) return;\n\t\t\t\n\t\t\tfor (MethodDeclaration md : addedMethods) {\n\t\t\t\tgeneratedMethods.add(DelegateSourceMethod.forMethodDeclaration(sourceType, md));\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic static Object[] addGeneratedDelegateMethodsToChildren(Object[] returnValue, Object javaElement) {\n\t\t\tList<SourceMethod> delegateMethods = getGeneratedMethods((SourceType) ((SourceTypeElementInfo) javaElement).getHandle());\n\t\t\tif (delegateMethods != null) {\n\t\t\t\treturn concat((IJavaElement[]) returnValue, delegateMethods.toArray(new IJavaElement[0]), IJavaElement.class);\n\t\t\t}\n\t\t\treturn returnValue;\n\t\t}\n\t\t\n\t\tprivate static void notifyDelegateMethodsAdded(CompilationUnitDeclaration cud) {\n\t\t\tCompilationUnit compilationUnit = getCompilationUnit(cud);\n\t\t\tif (compilationUnit != null) {\n\t\t\t\tDeltaProcessor deltaProcessor = JavaModelManager.getJavaModelManager().getDeltaProcessor();\n\t\t\t\tdeltaProcessor.fire(new JavaElementDelta(compilationUnit), ElementChangedEvent.POST_CHANGE);\n\t\t\t}\n\t\t}\n\t\t\n\t\tprivate static CompilationUnit getCompilationUnit(Object iCompilationUnit) {\n\t\t\tif (iCompilationUnit instanceof CompilationUnit) {\n\t\t\t\tCompilationUnit compilationUnit = (CompilationUnit) iCompilationUnit;\n\t\t\t\treturn compilationUnit.originalFromClone();\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\tprivate static CompilationUnit getCompilationUnit(CompilationUnitDeclaration cud) {\n\t\t\treturn getCompilationUnit(cud.compilationResult.compilationUnit);\n\t\t}\n\t\t\n\t\tprivate static final class DelegateSourceMethod extends SourceMethod {\n\t\t\tprivate DelegateSourceMethodInfo sourceMethodInfo;\n\t\n\t\t\tprivate static DelegateSourceMethod forMethodDeclaration(JavaElement parent, MethodDeclaration method) {\n\t\t\t\tArgument[] arguments = method.arguments != null ? method.arguments : new Argument[0];\n\t\t\t\tString[] parameterTypes = new String[arguments.length];\n\t\t\t\tfor (int i = 0; i < arguments.length; i++) {\n\t\t\t\t\tparameterTypes[i] = Signature.createTypeSignature(CharOperation.concatWith(arguments[i].type.getParameterizedTypeName(), '.'), false);\n\t\t\t\t}\n\t\t\t\treturn new DelegateSourceMethod(parent, new String(method.selector), parameterTypes, method);\n\t\t\t}\n\t\t\t\n\t\t\tprivate DelegateSourceMethod(JavaElement parent, String name, String[] parameterTypes, MethodDeclaration md) {\n\t\t\t\tsuper(parent, name, parameterTypes);\n\t\t\t\tsourceMethodInfo = new DelegateSourceMethodInfo(this, md);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public Object getElementInfo() throws JavaModelException {\n\t\t\t\treturn sourceMethodInfo;\n\t\t\t}\n\t\t\t\n\t\t\t/**\n\t\t\t * Disable refactoring for delegate methods\n\t\t\t */\n\t\t\t@Override public boolean isReadOnly() {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t\n\t\t\t/**\n\t\t\t * This is required to prevent duplicate entries in the outline\n\t\t\t */\n\t\t\t@Override public boolean equals(Object o) {\n\t\t\t\treturn this == o;\n\t\t\t}\n\t\t\t\n\t\t\tpublic static final class DelegateSourceMethodInfo extends SourceMethodInfo {\n\t\t\t\tDelegateSourceMethodInfo(DelegateSourceMethod delegateSourceMethod, MethodDeclaration md) {\n\t\t\t\t\tint pS = md.sourceStart;\n\t\t\t\t\tint pE = md.sourceEnd;\n\t\t\t\t\t\n\t\t\t\t\tArgument[] methodArguments = md.arguments != null ? md.arguments : new Argument[0];\n\t\t\t\t\tchar[][] argumentNames = new char[methodArguments.length][];\n\t\t\t\t\targuments = new ILocalVariable[methodArguments.length];\n\t\t\t\t\tfor (int i = 0; i < methodArguments.length; i++) {\n\t\t\t\t\t\tArgument argument = methodArguments[i];\n\t\t\t\t\t\targumentNames[i] = argument.name;\n\t\t\t\t\t\targuments[i] = new LocalVariable(delegateSourceMethod, new String(argument.name), pS, pE, pS, pS, delegateSourceMethod.getParameterTypes()[i], argument.annotations, argument.modifiers, true);\n\t\t\t\t\t}\n\t\t\t\t\tsetArgumentNames(argumentNames);\n\t\t\t\t\t\n\t\t\t\t\tsetSourceRangeStart(pS);\n\t\t\t\t\tsetSourceRangeEnd(pE);\n\t\t\t\t\tsetNameSourceStart(pS);\n\t\t\t\t\tsetNameSourceEnd(pE);\n\t\t\t\t\t\n\t\t\t\t\tsetExceptionTypeNames(CharOperation.NO_CHAR_CHAR);\n\t\t\t\t\tsetReturnType(md.returnType == null ? new char[]{'v', 'o','i', 'd'} : CharOperation.concatWith(md.returnType.getParameterizedTypeName(), '.'));\n\t\t\t\t\tsetFlags(md.modifiers);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tprivate static List<SourceMethod> getGeneratedMethods(SourceType sourceType) {\n\t\t\tif (sourceType != null) {\n\t\t\t\tCompilationUnit compilationUnit = getCompilationUnit(sourceType.getCompilationUnit());\n\t\t\t\tif (compilationUnit != null) {\n\t\t\t\t\tConcurrentMap<String, List<SourceMethod>> map = EclipseAugments.CompilationUnit_delegateMethods.setIfAbsent(compilationUnit, new ConcurrentHashMap<String, List<SourceMethod>>());\n\t\t\t\t\tList<SourceMethod> newList = new ArrayList<SourceMethod>();\n\t\t\t\t\tList<SourceMethod> oldList = map.putIfAbsent(sourceType.getTypeQualifiedName(), newList);\n\t\t\t\t\treturn oldList != null ? oldList : newList;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\tprivate static SourceType getSourceType(CompilationUnitDeclaration cud, String typeName) {\n\t\t\tCompilationUnit compilationUnit = getCompilationUnit(cud);\n\t\t\tif (compilationUnit != null) {\n\t\t\t\ttry {\n\t\t\t\t\tfor (IType type : compilationUnit.getAllTypes()) {\n\t\t\t\t\t\tif (type instanceof SourceType && type.getTypeQualifiedName().equals(typeName)) {\n\t\t\t\t\t\t\treturn (SourceType) type;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch (JavaModelException e) {\n\t\t\t\t\t// Ignore\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tprivate static final class Reflection {\n\t\tpublic static final Method classScopeBuildFieldsAndMethodsMethod;\n\t\tpublic static final Throwable initCause;\n\t\tstatic {\n\t\t\tMethod m = null;\n\t\t\tThrowable c = null;\n\t\t\ttry {\n\t\t\t\tm = Permit.getMethod(ClassScope.class, \"buildFieldsAndMethods\");\n\t\t\t} catch (Throwable t) {\n\t\t\t\tc = t;\n\t\t\t\t// That's problematic, but as long as no local classes are used we don't actually need it.\n\t\t\t\t// Better fail on local classes than crash altogether.\n\t\t\t}\n\t\t\t\n\t\t\tclassScopeBuildFieldsAndMethodsMethod = m;\n\t\t\tinitCause = c;\n\t\t}\n\t}\n\t\n\tprivate static void addAllMethodBindings(List<BindingTuple> list, TypeBinding binding, Set<String> banList, char[] fieldName, ASTNode responsible) throws DelegateRecursion {\n\t\tbanList.addAll(METHODS_IN_OBJECT);\n\t\taddAllMethodBindings0(list, binding, banList, fieldName, responsible);\n\t}\n\t\n\tprivate static class DelegateRecursion extends Throwable {\n\t\tfinal char[] type, member;\n\t\t\n\t\tpublic DelegateRecursion(char[] type, char[] member) {\n\t\t\tthis.type = type;\n\t\t\tthis.member = member;\n\t\t}\n\t}\n\t\n\tprivate static void addAllMethodBindings0(List<BindingTuple> list, TypeBinding binding, Set<String> banList, char[] fieldName, ASTNode responsible) throws DelegateRecursion {\n\t\tif (binding instanceof SourceTypeBinding) {\n\t\t\tClassScope scope = ((SourceTypeBinding) binding).scope;\n\t\t\tif (scope != null) scope.environment().globalOptions.storeAnnotations = true;\n\t\t}\n\t\tif (binding == null) return;\n\t\t\n\t\tTypeBinding inner;\n\t\t\n\t\tif (binding instanceof ParameterizedTypeBinding) {\n\t\t\tinner = ((ParameterizedTypeBinding) binding).genericType();\n\t\t} else {\n\t\t\tinner = binding;\n\t\t}\n\t\t\n\t\tif (inner instanceof SourceTypeBinding) {\n\t\t\tClassScope cs = ((SourceTypeBinding)inner).scope;\n\t\t\tif (cs != null) {\n\t\t\t\ttry {\n\t\t\t\t\tPermit.invoke(Reflection.initCause, Reflection.classScopeBuildFieldsAndMethodsMethod, cs);\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t// See 'Reflection' class for why we ignore this exception.\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (!(binding instanceof ReferenceBinding)) return;\n\t\t\n\t\tReferenceBinding rb = (ReferenceBinding) binding;\n\t\tMethodBinding[] availableMethods = rb.availableMethods();\n\t\tFieldBinding[] availableFields = rb.availableFields();\n\t\tfailIfContainsAnnotation(binding, availableMethods);\n\t\tfailIfContainsAnnotation(binding, availableFields);\n\t\t\n\t\tMethodBinding[] parameterizedSigs = availableMethods;\n\t\tMethodBinding[] baseSigs = parameterizedSigs;\n\t\tif (binding instanceof ParameterizedTypeBinding) {\n\t\t\tbaseSigs = ((ParameterizedTypeBinding)binding).genericType().availableMethods();\n\t\t\tif (baseSigs.length != parameterizedSigs.length) {\n\t\t\t\t// The last known state of eclipse source says this can't happen, so we rely on it,\n\t\t\t\t// but if this invariant is broken, better to go with 'arg0' naming instead of crashing.\n\t\t\t\tbaseSigs = parameterizedSigs;\n\t\t\t}\n\t\t}\n\t\tfor (int i = 0; i < parameterizedSigs.length; i++) {\n\t\t\tMethodBinding mb = parameterizedSigs[i];\n\t\t\tString sig = printSig(mb);\n\t\t\tif (mb.isStatic()) continue;\n\t\t\tif (mb.isBridge()) continue;\n\t\t\tif (mb.isConstructor()) continue;\n\t\t\tif (mb.isDefaultAbstract()) continue;\n\t\t\tif (!mb.isPublic()) continue;\n\t\t\tif (mb.isSynthetic()) continue;\n\t\t\tif (!banList.add(sig)) continue; // If add returns false, it was already in there.\n\t\t\tBindingTuple pair = new BindingTuple(mb, baseSigs[i], fieldName, responsible);\n\t\t\tlist.add(pair);\n\t\t}\n\t\taddAllMethodBindings0(list, rb.superclass(), banList, fieldName, responsible);\n\t\tReferenceBinding[] interfaces = rb.superInterfaces();\n\t\tif (interfaces != null) {\n\t\t\tfor (ReferenceBinding iface : interfaces) addAllMethodBindings0(list, iface, banList, fieldName, responsible);\n\t\t}\n\t}\n\t\n\tprivate static Set<String> findAlreadyImplementedMethods(TypeDeclaration decl) {\n\t\tSet<String> sigs = new HashSet<String>();\n\t\tfor (AbstractMethodDeclaration md : decl.methods) {\n\t\t\tif (md.isStatic()) continue;\n\t\t\tif ((md.modifiers & ClassFileConstants.AccBridge) != 0) continue;\n\t\t\tif (md.isConstructor()) continue;\n\t\t\tif ((md.modifiers & ExtraCompilerModifiers.AccDefaultAbstract) != 0) continue;\n\t\t\tif ((md.modifiers & ClassFileConstants.AccPublic) == 0) continue;\n\t\t\tif ((md.modifiers & ClassFileConstants.AccSynthetic) != 0) continue;\n\t\t\t\n\t\t\tsigs.add(printSig(md, decl.scope));\n\t\t}\n\t\treturn sigs;\n\t}\n\t\n\tprivate static final char[] STRING_LOMBOK = new char[] {'l', 'o', 'm', 'b', 'o', 'k'};\n\tprivate static final char[] STRING_EXPERIMENTAL = new char[] {'e', 'x', 'p', 'e', 'r', 'i', 'm', 'e', 'n', 't', 'a', 'l'};\n\tprivate static final char[] STRING_DELEGATE = new char[] {'D', 'e', 'l', 'e', 'g', 'a', 't', 'e'};\n\tprivate static void failIfContainsAnnotation(TypeBinding parent, Binding[] bindings) throws DelegateRecursion {\n\t\tif (bindings == null) return;\n\t\t\n\t\tfor (Binding b : bindings) {\n\t\t\tAnnotationBinding[] anns = null;\n\t\t\tif (b instanceof MethodBinding) anns = ((MethodBinding) b).getAnnotations();\n\t\t\tif (b instanceof FieldBinding) anns = ((FieldBinding) b).getAnnotations();\n\t\t\t// anns = b.getAnnotations() would make a heck of a lot more sense, but that is a late addition to ecj, so would cause NoSuchMethodErrors! Don't use that!\n\t\t\tif (anns == null) continue;\n\t\t\tfor (AnnotationBinding ann : anns) {\n\t\t\t\tchar[][] name = null;\n\t\t\t\ttry {\n\t\t\t\t\tname = ann.getAnnotationType().compoundName;\n\t\t\t\t} catch (Exception ignore) {}\n\t\t\t\t\n\t\t\t\tif (name == null || name.length < 2 || name.length > 3) continue;\n\t\t\t\tif (!Arrays.equals(STRING_LOMBOK, name[0])) continue;\n\t\t\t\tif (!Arrays.equals(STRING_DELEGATE, name[name.length - 1])) continue;\n\t\t\t\tif (name.length == 3 && !Arrays.equals(STRING_EXPERIMENTAL, name[1])) continue;\n\t\t\t\t\n\t\t\t\tthrow new DelegateRecursion(parent.readableName(), b.readableName());\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate static final class BindingTuple {\n\t\tBindingTuple(MethodBinding parameterized, MethodBinding base, char[] fieldName, ASTNode responsible) {\n\t\t\tthis.parameterized = parameterized;\n\t\t\tthis.base = base;\n\t\t\tthis.fieldName = fieldName;\n\t\t\tthis.responsible = responsible;\n\t\t}\n\t\t\n\t\tfinal MethodBinding parameterized, base;\n\t\tfinal char[] fieldName;\n\t\tfinal ASTNode responsible;\n\t\t\n\t\t@Override public String toString() {\n\t\t\treturn String.format(\"{param: %s, base: %s, fieldName: %s}\", parameterized == null ? \"(null)\" : printSig(parameterized), base == null ? \"(null)\" : printSig(base), new String(fieldName));\n\t\t}\n\t}\n\t\n\tprivate static final List<String> METHODS_IN_OBJECT = Collections.unmodifiableList(Arrays.asList(\n\t\t\t\"hashCode()\",\n\t\t\t\"canEqual(java.lang.Object)\",  //Not in j.l.Object, but it goes with hashCode and equals so if we ignore those two, we should ignore this one.\n\t\t\t\"equals(java.lang.Object)\",\n\t\t\t\"wait()\",\n\t\t\t\"wait(long)\",\n\t\t\t\"wait(long, int)\",\n\t\t\t\"notify()\",\n\t\t\t\"notifyAll()\",\n\t\t\t\"toString()\",\n\t\t\t\"getClass()\",\n\t\t\t\"clone()\",\n\t\t\t\"finalize()\"));\n\t\n\tprivate static String printSig(MethodBinding binding) {\n\t\tStringBuilder signature = new StringBuilder();\n\t\t\n\t\tsignature.append(binding.selector);\n\t\tsignature.append(\"(\");\n\t\tboolean first = true;\n\t\tif (binding.parameters != null) for (TypeBinding param : binding.parameters) {\n\t\t\tif (!first) signature.append(\", \");\n\t\t\tfirst = false;\n\t\t\tsignature.append(typeBindingToSignature(param));\n\t\t}\n\t\tsignature.append(\")\");\n\t\t\n\t\treturn signature.toString();\n\t}\n\t\n\tprivate static String printSig(AbstractMethodDeclaration md, ClassScope scope) {\n\t\tStringBuilder signature = new StringBuilder();\n\t\t\n\t\tsignature.append(md.selector);\n\t\tsignature.append(\"(\");\n\t\tboolean first = true;\n\t\tif (md.arguments != null) {\n\t\t\tTypeParameter[] typeParameters = md.typeParameters();\n\t\t\tMap<String, TypeParameter> typeParametersMap = new HashMap<String, TypeParameter>();\n\t\t\tif (typeParameters != null) {\n\t\t\t\tfor (TypeParameter typeParameter : typeParameters) {\n\t\t\t\t\ttypeParametersMap.put(new String(typeParameter.name), typeParameter);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tfor (Argument argument : md.arguments) {\n\t\t\t\tTypeBinding typeBinding = makeTypeBinding(argument.type, typeParametersMap, scope);\n\t\t\t\t\n\t\t\t\tif (!first) signature.append(\", \");\n\t\t\t\tfirst = false;\n\t\t\t\tsignature.append(typeBindingToSignature(typeBinding));\n\t\t\t}\n\t\t}\n\t\tsignature.append(\")\");\n\t\t\n\t\treturn signature.toString();\n\t}\n\t\n\tprivate static TypeBinding makeTypeBinding(TypeReference typeReference, Map<String, TypeParameter> typeParametersMap, ClassScope scope) {\n\t\tchar[][] typeName = typeReference.getTypeName();\n\t\tString typeNameString = Eclipse.toQualifiedName(typeName);\n\t\t\n\t\tTypeParameter typeParameter = typeParametersMap.get(typeNameString);\n\t\tif (typeParameter != null) {\n\t\t\tif (typeParameter.type != null) {\n\t\t\t\ttypeName = typeParameter.type.getTypeName();\n\t\t\t} else {\n\t\t\t\ttypeName = TypeConstants.JAVA_LANG_OBJECT;\n\t\t\t}\n\t\t}\n\t\t\n\t\tTypeBinding typeBinding = scope.getType(typeName, typeName.length);\n\t\tif (typeReference.dimensions() > 0) {\n\t\t\ttypeBinding = scope.createArrayType(typeBinding, typeReference.dimensions());\n\t\t}\n\t\treturn typeBinding;\n\t}\n\t\n\tprivate static String typeBindingToSignature(TypeBinding binding) {\n\t\tbinding = binding.erasure();\n\t\tif (binding != null && binding.isBaseType()) {\n\t\t\treturn new String (binding.sourceName());\n\t\t} else if (binding instanceof ReferenceBinding) {\n\t\t\tString pkg = binding.qualifiedPackageName() == null ? \"\" : new String(binding.qualifiedPackageName());\n\t\t\tString qsn = binding.qualifiedSourceName() == null ? \"\" : new String(binding.qualifiedSourceName());\n\t\t\treturn pkg.isEmpty() ? qsn : (pkg + \".\" + qsn);\n\t\t} else if (binding instanceof ArrayBinding) {\n\t\t\tStringBuilder out = new StringBuilder();\n\t\t\tout.append(typeBindingToSignature(binding.leafComponentType()));\n\t\t\tfor (int i = 0; i < binding.dimensions(); i++) out.append(\"[]\");\n\t\t\treturn out.toString();\n\t\t}\n\t\t\n\t\treturn \"\";\n\t}\n\t\n\tprivate static boolean charArrayEquals(String s, char[] c) {\n\t\tif (s == null) return c == null;\n\t\tif (c == null) return false;\n\t\t\n\t\tif (s.length() != c.length) return false;\n\t\tfor (int i = 0; i < s.length(); i++) if (s.charAt(i) != c[i]) return false;\n\t\treturn true;\n\t}\n\t\n\tprivate enum DelegateReceiver {\n\t\tMETHOD {\n\t\t\tpublic Expression get(final ASTNode source, char[] name) {\n\t\t\t\tMessageSend call = new MessageSend();\n\t\t\t\tcall.sourceStart = source.sourceStart; call.sourceEnd = source.sourceEnd;\n\t\t\t\tcall.nameSourcePosition = pos(source);\n\t\t\t\tsetGeneratedBy(call, source);\n\t\t\t\tcall.selector = name;\n\t\t\t\tcall.receiver = new ThisReference(source.sourceStart, source.sourceEnd);\n\t\t\t\tsetGeneratedBy(call.receiver, source);\n\t\t\t\treturn call;\n\t\t\t}\n\t\t},\n\t\tFIELD {\n\t\t\tpublic Expression get(final ASTNode source, char[] name) {\n\t\t\t\tFieldReference fieldRef = new FieldReference(name, pos(source));\n\t\t\t\tsetGeneratedBy(fieldRef, source);\n\t\t\t\tfieldRef.receiver = new ThisReference(source.sourceStart, source.sourceEnd);\n\t\t\t\tsetGeneratedBy(fieldRef.receiver, source);\n\t\t\t\treturn fieldRef;\n\t\t\t}\n\t\t};\n\t\t\n\t\tpublic abstract Expression get(final ASTNode source, char[] name);\n\t}\n}\n"
  },
  {
    "path": "src/eclipseAgent/lombok/eclipse/agent/PatchDelegatePortal.java",
    "content": "/*\n * Copyright (C) 2012-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.agent;\n\nimport java.lang.reflect.Method;\n\nimport lombok.permit.Permit;\n\npublic class PatchDelegatePortal {\n\tstatic final String CLASS_SCOPE = \"org.eclipse.jdt.internal.compiler.lookup.ClassScope\";\n\tstatic final String I_JAVA_ELEMENT_ARRAY = \"[Lorg.eclipse.jdt.core.IJavaElement;\";\n\tstatic final String SOURCE_TYPE_ELEMENT_INFO = \"org.eclipse.jdt.internal.core.SourceTypeElementInfo\";\n\t\n\tpublic static boolean handleDelegateForType(Object classScope) {\n\t\tBoolean v = (Boolean) Permit.invokeSneaky(Reflection.problemHandleDelegate, Reflection.handleDelegateForType, null, classScope);\n\t\tif (v == null) return false;\n\t\treturn v.booleanValue();\n\t}\n\t\n\tpublic static Object[] addGeneratedDelegateMethods(Object returnValue, Object javaElement) {\n\t\treturn (Object[]) Permit.invokeSneaky(Reflection.problemAddGeneratedDelegateMethods, Reflection.addGeneratedDelegateMethods, null, returnValue, javaElement);\n\t}\n\t\n\tprivate static final class Reflection {\n\t\tpublic static final Method handleDelegateForType;\n\t\tpublic static final Method addGeneratedDelegateMethods;\n\t\tpublic static final Throwable problemHandleDelegate;\n\t\tpublic static final Throwable problemAddGeneratedDelegateMethods;\n\t\t\n\t\tstatic {\n\t\t\tMethod m = null, n = null;\n\t\t\tThrowable problemHandleDelegate_ = null;\n\t\t\tThrowable problemAddGeneratedDelegateMethods_ = null;\n\t\t\ttry {\n\t\t\t\tm = Permit.getMethod(PatchDelegate.class, \"handleDelegateForType\", Class.forName(CLASS_SCOPE));\n\t\t\t} catch (Throwable t) {\n\t\t\t\t// That's problematic, but as long as no local classes are used we don't actually need it.\n\t\t\t\t// Better fail on local classes than crash altogether.\n\t\t\t\tproblemHandleDelegate_ = t;\n\t\t\t}\n\t\t\thandleDelegateForType = m;\n\t\t\tproblemHandleDelegate = problemHandleDelegate_;\n\t\t\t\n\t\t\ttry {\n\t\t\t\tn = Permit.getMethod(PatchDelegate.class, \"addGeneratedDelegateMethods\", Object[].class, Object.class);\n\t\t\t} catch (Throwable t) {\n\t\t\t\t// That's problematic, but as long as no local classes are used we don't actually need it.\n\t\t\t\t// Better fail on local classes than crash altogether.\n\t\t\t\tproblemAddGeneratedDelegateMethods_ = t;\n\t\t\t}\n\t\t\taddGeneratedDelegateMethods = n;\n\t\t\tproblemAddGeneratedDelegateMethods = problemAddGeneratedDelegateMethods_;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/eclipseAgent/lombok/eclipse/agent/PatchDiagnostics.java",
    "content": "/*\n * Copyright (C) 2012-2019 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.agent;\n\npublic class PatchDiagnostics {\n\t/**\n\t * \n\t * org.eclipse.jdt.core.dom.ASTNode#setSourceRange starts off doing some sanity checks on the input arguments, and, if these fail the sanity check,\n\t * a {@code IllegalArgumentException} is thrown. However, these IAEs do not have any message and are thus pretty much useless. We do the exact same\n\t * checks, and throw the exact same exception (thus, effectively, we don't change how eclipse operates), but, we <em>do</em> provide a useful message.\n\t */\n\tpublic static boolean setSourceRangeCheck(Object astNode, int startPosition, int length) {\n\t\tString nodeTxt;\n\t\tif (startPosition >= 0 && length < 0) {\n\t\t\tif (astNode == null) nodeTxt = \"(NULL NODE)\";\n\t\t\telse nodeTxt = astNode.getClass() + \": \" + astNode.toString();\n\t\t\tthrow new IllegalArgumentException(\"startPos = \" + startPosition + \" and length is \" + length + \".\\n\" +\n\t\t\t\t\"This breaks the rule that lengths are not allowed to be negative. Affected Node:\\n\" + nodeTxt);\n\t\t}\n\t\t\n\t\tif (startPosition < 0 && length != 0) {\n\t\t\tif (astNode == null) nodeTxt = \"(NULL NODE)\";\n\t\t\telse nodeTxt = astNode.getClass() + \": \" + astNode.toString();\n\t\t\tthrow new IllegalArgumentException(\"startPos = \" + startPosition + \" and length is \" + length + \".\\n\" +\n\t\t\t\t\"This breaks the rule that length must be 0 if startPosition is negative. Affected Node:\\n\" + nodeTxt);\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "src/eclipseAgent/lombok/eclipse/agent/PatchExtensionMethod.java",
    "content": "/*\n * Copyright (C) 2012-2024 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.agent;\n\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.createAnnotation;\n\nimport java.lang.ref.WeakReference;\nimport java.lang.reflect.Constructor;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\n\nimport lombok.core.AST.Kind;\nimport lombok.core.AnnotationValues;\nimport lombok.core.AnnotationValues.AnnotationValueDecodeFail;\nimport lombok.core.FieldAugment;\nimport lombok.eclipse.EclipseAST;\nimport lombok.eclipse.EclipseNode;\nimport lombok.eclipse.TransformEclipseAST;\nimport lombok.eclipse.handlers.EclipseHandlerUtil;\nimport lombok.experimental.ExtensionMethod;\nimport lombok.permit.Permit;\n\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.ClassLiteralAccess;\nimport org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.ConditionalExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.MessageSend;\nimport org.eclipse.jdt.internal.compiler.ast.NameReference;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.SingleNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.SuperReference;\nimport org.eclipse.jdt.internal.compiler.ast.ThisReference;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.impl.ReferenceContext;\nimport org.eclipse.jdt.internal.compiler.lookup.Binding;\nimport org.eclipse.jdt.internal.compiler.lookup.BlockScope;\nimport org.eclipse.jdt.internal.compiler.lookup.MethodBinding;\nimport org.eclipse.jdt.internal.compiler.lookup.ProblemMethodBinding;\nimport org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;\nimport org.eclipse.jdt.internal.compiler.lookup.Scope;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeBinding;\nimport org.eclipse.jdt.internal.compiler.problem.ProblemReporter;\nimport org.eclipse.jdt.internal.core.search.matching.MethodPattern;\n\npublic class PatchExtensionMethod {\n\tstatic class Extension {\n\t\tList<MethodBinding> extensionMethods;\n\t\tboolean suppressBaseMethods;\n\t}\n\t\n\tprivate static class PostponedNoMethodError implements PostponedError {\n\t\tprivate final ProblemReporter problemReporter;\n\t\tprivate final WeakReference<MessageSend> messageSendRef;\n\t\tprivate final TypeBinding recType;\n\t\tprivate final TypeBinding[] params;\n\t\t\n\t\tPostponedNoMethodError(ProblemReporter problemReporter, MessageSend messageSend, TypeBinding recType, TypeBinding[] params) {\n\t\t\tthis.problemReporter = problemReporter;\n\t\t\tthis.messageSendRef = new WeakReference<MessageSend>(messageSend);\n\t\t\tthis.recType = recType;\n\t\t\tthis.params = params;\n\t\t}\n\t\t\n\t\tpublic void fire() {\n\t\t\tMessageSend messageSend = messageSendRef.get();\n\t\t\tif (messageSend != null) problemReporter.errorNoMethodFor(messageSend, recType, params);\n\t\t}\n\t}\n\t\n\tprivate static class PostponedInvalidMethodError implements PostponedError {\n\t\tprivate final ProblemReporter problemReporter;\n\t\tprivate final WeakReference<MessageSend> messageSendRef;\n\t\tprivate final MethodBinding method;\n\t\tprivate final Scope scope;\n\t\t\n\t\tprivate static final Method shortMethod = getMethod(\"invalidMethod\", MessageSend.class, MethodBinding.class);\n\t\tprivate static final Method longMethod = getMethod(\"invalidMethod\", MessageSend.class, MethodBinding.class, Scope.class);\n\t\tprivate static Throwable initProblem;\n\t\t\n\t\tprivate static Method getMethod(String name, Class<?>... types) {\n\t\t\ttry {\n\t\t\t\treturn Permit.getMethod(ProblemReporter.class, name, types);\n\t\t\t} catch (Exception e) {\n\t\t\t\tinitProblem = e;\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\t\n\t\tPostponedInvalidMethodError(ProblemReporter problemReporter, MessageSend messageSend, MethodBinding method, Scope scope) {\n\t\t\tthis.problemReporter = problemReporter;\n\t\t\tthis.messageSendRef = new WeakReference<MessageSend>(messageSend);\n\t\t\tthis.method = method;\n\t\t\tthis.scope = scope;\n\t\t}\n\t\t\n\t\tstatic void invoke(ProblemReporter problemReporter, MessageSend messageSend, MethodBinding method, Scope scope) {\n\t\t\tif (messageSend != null) {\n\t\t\t\ttry {\n\t\t\t\t\tif (shortMethod != null) Permit.invoke(initProblem, shortMethod, problemReporter, messageSend, method);\n\t\t\t\t\telse if (longMethod != null) Permit.invoke(initProblem, longMethod, problemReporter, messageSend, method, scope);\n\t\t\t\t\telse Permit.reportReflectionProblem(initProblem, \"method named 'invalidMethod' not found in ProblemReporter.class\");\n\t\t\t\t} catch (IllegalAccessException e) {\n\t\t\t\t\tthrow new RuntimeException(e);\n\t\t\t\t} catch (InvocationTargetException e) {\n\t\t\t\t\tThrowable t = e.getCause();\n\t\t\t\t\tif (t instanceof Error) throw (Error) t;\n\t\t\t\t\tif (t instanceof RuntimeException) throw (RuntimeException) t;\n\t\t\t\t\tthrow new RuntimeException(t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic void fire() {\n\t\t\tMessageSend messageSend = messageSendRef.get();\n\t\t\tinvoke(problemReporter, messageSend, method, scope);\n\t\t}\n\t}\n\t\n\tprivate static class PostponedNonStaticAccessToStaticMethodError implements PostponedError {\n\t\tprivate final ProblemReporter problemReporter;\n\t\tprivate ASTNode location;\n\t\tprivate MethodBinding method;\n\t\tprivate ReferenceContext referenceContext;\n\t\t\n\t\tPostponedNonStaticAccessToStaticMethodError(ProblemReporter problemReporter, ASTNode location, MethodBinding method) {\n\t\t\tthis.problemReporter = problemReporter;\n\t\t\tthis.location = location;\n\t\t\tthis.method = method;\n\t\t\tthis.referenceContext = problemReporter.referenceContext;\n\t\t}\n\n\t\tpublic void fire() {\n\t\t\tproblemReporter.referenceContext = this.referenceContext;\n\t\t\tproblemReporter.nonStaticAccessToStaticMethod(location, method);\n\t\t}\n\t}\n\t\n\tprivate static interface PostponedError {\n\t\tpublic void fire();\n\t}\n\t\n\tpublic static EclipseNode getTypeNode(TypeDeclaration decl) {\n\t\tCompilationUnitDeclaration cud = decl.scope.compilationUnitScope().referenceContext;\n\t\tEclipseAST astNode = TransformEclipseAST.getAST(cud, false);\n\t\tEclipseNode node = astNode.get(decl);\n\t\tif (node == null) {\n\t\t\tastNode = TransformEclipseAST.getAST(cud, true);\n\t\t\tnode = astNode.get(decl);\n\t\t}\n\t\treturn node;\n\t}\n\t\n\tpublic static Annotation getAnnotation(Class<? extends java.lang.annotation.Annotation> expectedType, EclipseNode node) {\n\t\tTypeDeclaration decl = (TypeDeclaration) node.get();\n\t\tif (decl.annotations != null) for (Annotation ann : decl.annotations) {\n\t\t\tif (EclipseHandlerUtil.typeMatches(expectedType, node, ann.type)) return ann;\n\t\t}\n\t\treturn null;\n\t}\n\t\n\tstatic EclipseNode upToType(EclipseNode typeNode) {\n\t\tEclipseNode node = typeNode;\n\t\tdo {\n\t\t\tnode = node.up();\n\t\t} while ((node != null) && (node.getKind() != Kind.TYPE));\n\t\treturn node;\n\t}\n\t\n\tstatic List<Extension> getApplicableExtensionMethods(EclipseNode typeNode, Annotation ann, TypeBinding receiverType) {\n\t\tList<Extension> extensions = new ArrayList<Extension>();\n\t\tif ((typeNode != null) && (ann != null) && (receiverType != null)) {\n\t\t\tBlockScope blockScope = ((TypeDeclaration) typeNode.get()).initializerScope;\n\t\t\tEclipseNode annotationNode = typeNode.getNodeFor(ann);\n\t\t\tAnnotationValues<ExtensionMethod> annotation = createAnnotation(ExtensionMethod.class, annotationNode);\n\t\t\tboolean suppressBaseMethods = false;\n\t\t\ttry {\n\t\t\t\tsuppressBaseMethods = annotation.getInstance().suppressBaseMethods();\n\t\t\t} catch (AnnotationValueDecodeFail fail) {\n\t\t\t\tfail.owner.setError(fail.getMessage(), fail.idx);\n\t\t\t}\n\t\t\tfor (Object extensionMethodProvider : annotation.getActualExpressions(\"value\")) {\n\t\t\t\tif (extensionMethodProvider instanceof ClassLiteralAccess) {\n\t\t\t\t\tTypeBinding binding = ((ClassLiteralAccess) extensionMethodProvider).type.resolveType(blockScope);\n\t\t\t\t\tif (binding == null) continue;\n\t\t\t\t\tif (!binding.isClass() && !binding.isEnum()) continue;\n\t\t\t\t\tExtension e = new Extension();\n\t\t\t\t\te.extensionMethods = getApplicableExtensionMethodsDefinedInProvider(typeNode, (ReferenceBinding) binding, receiverType);\n\t\t\t\t\te.suppressBaseMethods = suppressBaseMethods;\n\t\t\t\t\textensions.add(e);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn extensions;\n\t}\n\t\n\tprivate static List<MethodBinding> getApplicableExtensionMethodsDefinedInProvider(EclipseNode typeNode, ReferenceBinding extensionMethodProviderBinding,\n\t\t\tTypeBinding receiverType) {\n\t\t\n\t\tList<MethodBinding> extensionMethods = new ArrayList<MethodBinding>();\n\t\tfor (MethodBinding method : extensionMethodProviderBinding.methods()) {\n\t\t\tif (!method.isStatic()) continue;\n\t\t\tif (!method.isPublic()) continue;\n\t\t\tif (method.parameters == null || method.parameters.length == 0) continue;\n\t\t\tTypeBinding firstArgType = method.parameters[0];\n\t\t\tif (receiverType.isProvablyDistinct(firstArgType) && !receiverType.isCompatibleWith(firstArgType.erasure())) continue;\n\t\t\textensionMethods.add(method);\n\t\t}\n\t\treturn extensionMethods;\n\t}\n\t\n\tprivate static final FieldAugment<MessageSend, PostponedError> MessageSend_postponedErrors = FieldAugment.augment(MessageSend.class, PostponedError.class, \"lombok$postponedErrors\");\n\t\n\tpublic static void errorNoMethodFor(ProblemReporter problemReporter, MessageSend messageSend, TypeBinding recType, TypeBinding[] params) {\n\t\tMessageSend_postponedErrors.set(messageSend, new PostponedNoMethodError(problemReporter, messageSend, recType, params));\n\t}\n\t\n\tpublic static void invalidMethod(ProblemReporter problemReporter, MessageSend messageSend, MethodBinding method) {\n\t\tMessageSend_postponedErrors.set(messageSend, new PostponedInvalidMethodError(problemReporter, messageSend, method, null));\n\t}\n\t\n\tpublic static void invalidMethod(ProblemReporter problemReporter, MessageSend messageSend, MethodBinding method, Scope scope) {\n\t\tMessageSend_postponedErrors.set(messageSend, new PostponedInvalidMethodError(problemReporter, messageSend, method, scope));\n\t}\n\t\n\tpublic static void nonStaticAccessToStaticMethod(ProblemReporter problemReporter, ASTNode location, MethodBinding method, MessageSend messageSend) {\n\t\tMessageSend_postponedErrors.set(messageSend, new PostponedNonStaticAccessToStaticMethodError(problemReporter, location, method));\n\t}\n\t\n\tpublic static TypeBinding resolveType(TypeBinding resolvedType, MessageSend methodCall, BlockScope scope) {\n\t\tList<Extension> extensions = new ArrayList<Extension>();\n\t\tTypeDeclaration decl = scope.classScope().referenceContext;\n\t\t\n\t\tEclipseNode owningType = null;\n\t\t\n\t\tfor (EclipseNode typeNode = getTypeNode(decl); typeNode != null; typeNode = upToType(typeNode)) {\n\t\t\tAnnotation ann = getAnnotation(ExtensionMethod.class, typeNode);\n\t\t\tif (ann != null) {\n\t\t\t\textensions.addAll(0, getApplicableExtensionMethods(typeNode, ann, methodCall.receiver.resolvedType));\n\t\t\t\tif (owningType == null) owningType = typeNode;\n\t\t\t}\n\t\t}\n\t\t\n\t\tboolean skip = false;\n\t\t\n\t\tif (methodCall.receiver instanceof ThisReference && (((ThisReference)methodCall.receiver).bits & ASTNode.IsImplicitThis) != 0) skip = true;\n\t\tif (methodCall.receiver instanceof SuperReference) skip = true;\n\t\tif (methodCall.receiver instanceof NameReference) {\n\t\t\tBinding binding = ((NameReference)methodCall.receiver).binding;\n\t\t\tif (binding instanceof TypeBinding) skip = true;\n\t\t}\n\t\t// It's impossible to resolve the right method without types\n\t\tif (Reflection.argumentsHaveErrors != null) {\n\t\t\ttry {\n\t\t\t\tif ((Boolean) Reflection.argumentsHaveErrors.get(methodCall)) skip = true;\n\t\t\t} catch (IllegalAccessException ignore) {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (!skip) for (Extension extension : extensions) {\n\t\t\tif (!extension.suppressBaseMethods && !(methodCall.binding instanceof ProblemMethodBinding)) continue;\n\t\t\tfor (MethodBinding extensionMethod : extension.extensionMethods) {\n\t\t\t\tif (!Arrays.equals(methodCall.selector, extensionMethod.selector)) continue;\n\t\t\t\tMessageSend_postponedErrors.clear(methodCall);\n\t\t\t\tif (methodCall.receiver instanceof ThisReference) {\n\t\t\t\t\tmethodCall.receiver.bits &= ~ASTNode.IsImplicitThis;\n\t\t\t\t}\n\t\t\t\tList<Expression> arguments = new ArrayList<Expression>();\n\t\t\t\targuments.add(methodCall.receiver);\n\t\t\t\tif (methodCall.arguments != null) arguments.addAll(Arrays.asList(methodCall.arguments));\n\t\t\t\tExpression[] originalArgs = methodCall.arguments;\n\t\t\t\tmethodCall.arguments = arguments.toArray(new Expression[0]);\n\t\t\t\t\n\t\t\t\tList<TypeBinding> argumentTypes = new ArrayList<TypeBinding>();\n\t\t\t\tfor (Expression argument : arguments) {\n\t\t\t\t\tTypeBinding argumentType = argument.resolvedType;\n\t\t\t\t\tif (argumentType == null && requiresPolyBinding(argument)) {\n\t\t\t\t\t\targumentType = Reflection.getPolyTypeBinding(argument);\n\t\t\t\t\t}\n\t\t\t\t\tif (argumentType == null) {\n\t\t\t\t\t\targumentType = TypeBinding.NULL;\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\targumentTypes.add(argumentType);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (methodCall.receiver instanceof MessageSend) {\n\t\t\t\t\tif (Reflection.inferenceContexts != null) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tPermit.set(Reflection.inferenceContexts, methodCall.receiver, null);\n\t\t\t\t\t\t} catch (IllegalAccessException ignore) {\n\t\t\t\t\t\t\t// ignore\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tMethodBinding fixedBinding = scope.getMethod(extensionMethod.declaringClass, methodCall.selector, argumentTypes.toArray(new TypeBinding[0]), methodCall);\n\t\t\t\tif (fixedBinding instanceof ProblemMethodBinding) {\n\t\t\t\t\tmethodCall.arguments = originalArgs;\n\t\t\t\t\t// Sometimes the declaring class is null, in that case we have to create a new ProblemMethodBinding using the extension method's declaring class\n\t\t\t\t\tif (fixedBinding.declaringClass == null) {\n\t\t\t\t\t\tfixedBinding = new ProblemMethodBinding(fixedBinding.selector, fixedBinding.parameters, extensionMethod.declaringClass, fixedBinding.problemId());\n\t\t\t\t\t}\n\t\t\t\t\tPostponedInvalidMethodError.invoke(scope.problemReporter(), methodCall, fixedBinding, scope);\n\t\t\t\t} else {\n\t\t\t\t\t// If the extension method uses varargs, the last fixed binding parameter is an array but \n\t\t\t\t\t// the method arguments are not. Even thought we already know that the method is fine we still\n\t\t\t\t\t// have to compare each parameter with the type of the array to support autoboxing/unboxing.\n\t\t\t\t\tboolean isVarargs = fixedBinding.isVarargs();\n\t\t\t\t\tfor (int i = 0, iend = arguments.size(); i < iend; i++) {\n\t\t\t\t\t\tExpression arg = arguments.get(i);\n\t\t\t\t\t\tTypeBinding[] parameters = fixedBinding.parameters;\n\t\t\t\t\t\tTypeBinding param;\n\t\t\t\t\t\tif (isVarargs && i >= parameters.length - 1) {\n\t\t\t\t\t\t\t// Extract the array element type for all vararg arguments\n\t\t\t\t\t\t\tparam = parameters[parameters.length - 1].leafComponentType();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tparam = parameters[i];\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Resolve types for polys\n\t\t\t\t\t\tif (requiresPolyBinding(arg)) {\n\t\t\t\t\t\t\targ.setExpectedType(param);\n\t\t\t\t\t\t\targ.resolveType(scope);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (arg.resolvedType != null) {\n\t\t\t\t\t\t\targ.computeConversion(scope, param, arg.resolvedType);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tmethodCall.receiver = createNameRef(extensionMethod.declaringClass, methodCall);\n\t\t\t\t\tmethodCall.actualReceiverType = extensionMethod.declaringClass;\n\t\t\t\t\tmethodCall.binding = fixedBinding;\n\t\t\t\t\tmethodCall.resolvedType = methodCall.binding.returnType;\n\t\t\t\t\tmethodCall.statementEnd = methodCall.sourceEnd;\n\t\t\t\t\tif (Reflection.argumentTypes != null) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tReflection.argumentTypes.set(methodCall, argumentTypes.toArray(new TypeBinding[0]));\n\t\t\t\t\t\t} catch (IllegalAccessException ignore) {\n\t\t\t\t\t\t\t// ignore\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn methodCall.resolvedType;\n\t\t\t}\n\t\t}\n\t\t\n\t\tPostponedError error = MessageSend_postponedErrors.get(methodCall);\n\t\tif (error != null) error.fire();\n\t\t\n\t\tMessageSend_postponedErrors.clear(methodCall);\n\t\treturn resolvedType;\n\t}\n\t\n\tpublic static Object modifyMethodPattern(Object original) {\n\t\tif (original != null && original instanceof MethodPattern) {\n\t\t\tMethodPattern methodPattern = (MethodPattern) original;\n\t\t\tif (methodPattern.parameterCount > 0) {\n\t\t\t\tmethodPattern.varargs = true;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn original;\n\t}\n\n\tprivate static boolean requiresPolyBinding(Expression argument) {\n\t\treturn Reflection.isFunctionalExpression(argument) || argument instanceof ConditionalExpression && Reflection.isPolyExpression(argument);\n\t}\n\t\n\tprivate static NameReference createNameRef(TypeBinding typeBinding, ASTNode source) {\n\t\tlong p = ((long) source.sourceStart << 32) | source.sourceEnd;\n\t\tchar[] pkg = typeBinding.qualifiedPackageName();\n\t\tchar[] basename = typeBinding.qualifiedSourceName();\n\t\t\n\t\tStringBuilder sb = new StringBuilder();\n\t\tif (pkg != null) sb.append(pkg);\n\t\tif (sb.length() > 0) sb.append(\".\");\n\t\tsb.append(basename);\n\t\t\n\t\tString tName = sb.toString();\n\t\t\n\t\tif (tName.indexOf('.') == -1) {\n\t\t\treturn new SingleNameReference(basename, p);\n\t\t} else {\n\t\t\tchar[][] sources;\n\t\t\tString[] in = tName.split(\"\\\\.\");\n\t\t\tsources = new char[in.length][];\n\t\t\tfor (int i = 0; i < in.length; i++) sources[i] = in[i].toCharArray();\n\t\t\tlong[] poss = new long[in.length];\n\t\t\tArrays.fill(poss, p);\n\t\t\treturn new QualifiedNameReference(sources, poss, source.sourceStart, source.sourceEnd);\n\t\t}\n\t}\n\t\n\tprivate static final class Reflection {\n\t\tpublic static final Field argumentTypes = Permit.permissiveGetField(MessageSend.class, \"argumentTypes\");\n\t\tpublic static final Field argumentsHaveErrors = Permit.permissiveGetField(MessageSend.class, \"argumentsHaveErrors\");\n\t\tpublic static final Field inferenceContexts = Permit.permissiveGetField(MessageSend.class, \"inferenceContexts\");\n\t\tprivate static final Method isPolyExpression = Permit.permissiveGetMethod(Expression.class, \"isPolyExpression\");\n\t\tprivate static final Class<?> functionalExpression;\n\t\tprivate static final Constructor<?> polyTypeBindingConstructor;\n\t\t\n\t\tstatic {\n\t\t\tClass<?> a = null;\n\t\t\tConstructor<?> b = null;\n\t\t\ttry {\n\t\t\t\ta = Class.forName(\"org.eclipse.jdt.internal.compiler.ast.FunctionalExpression\");\n\t\t\t} catch (Exception e) {\n\t\t\t\t// Ignore\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tb = Permit.getConstructor(Class.forName(\"org.eclipse.jdt.internal.compiler.lookup.PolyTypeBinding\"), Expression.class);\n\t\t\t} catch (Exception e) {\n\t\t\t\t// Ignore\n\t\t\t}\n\t\t\tfunctionalExpression = a;\n\t\t\tpolyTypeBindingConstructor = b;\n\t\t}\n\t\t\n\t\tpublic static boolean isFunctionalExpression(Expression expression) {\n\t\t\tif (functionalExpression == null) return false;\n\t\t\treturn functionalExpression.isInstance(expression);\n\t\t}\n\t\t\n\t\tpublic static boolean isPolyExpression(Expression expression) {\n\t\t\tif (isPolyExpression == null) return false;\n\t\t\ttry {\n\t\t\t\treturn (Boolean) isPolyExpression.invoke(expression);\n\t\t\t} catch (Exception e) {\n\t\t\t\t// Ignore\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tpublic static TypeBinding getPolyTypeBinding(Expression expression) {\n\t\t\tif (polyTypeBindingConstructor == null) return null;\n\t\t\ttry {\n\t\t\t\treturn (TypeBinding) polyTypeBindingConstructor.newInstance(expression);\n\t\t\t} catch (Exception e) {\n\t\t\t\t// Ignore\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/eclipseAgent/lombok/eclipse/agent/PatchExtensionMethodCompletionProposal.java",
    "content": "/*\n * Copyright (C) 2012 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.agent;\n\nimport static lombok.eclipse.agent.PatchExtensionMethod.*;\n\nimport java.lang.reflect.AccessibleObject;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.Method;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\n\nimport lombok.eclipse.EclipseNode;\nimport lombok.eclipse.agent.PatchExtensionMethod.Extension;\nimport lombok.experimental.ExtensionMethod;\nimport lombok.permit.Permit;\n\nimport org.eclipse.jdt.core.CompletionProposal;\nimport org.eclipse.jdt.internal.codeassist.InternalCompletionContext;\nimport org.eclipse.jdt.internal.codeassist.InternalCompletionProposal;\nimport org.eclipse.jdt.internal.codeassist.InternalExtendedCompletionContext;\nimport org.eclipse.jdt.internal.codeassist.complete.CompletionOnMemberAccess;\nimport org.eclipse.jdt.internal.codeassist.complete.CompletionOnQualifiedNameReference;\nimport org.eclipse.jdt.internal.codeassist.complete.CompletionOnSingleNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.FieldReference;\nimport org.eclipse.jdt.internal.compiler.ast.NameReference;\nimport org.eclipse.jdt.internal.compiler.ast.SuperReference;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.lookup.Binding;\nimport org.eclipse.jdt.internal.compiler.lookup.ClassScope;\nimport org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment;\nimport org.eclipse.jdt.internal.compiler.lookup.MethodBinding;\nimport org.eclipse.jdt.internal.compiler.lookup.Scope;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeBinding;\nimport org.eclipse.jdt.internal.compiler.lookup.VariableBinding;\nimport org.eclipse.jdt.internal.core.SearchableEnvironment;\nimport org.eclipse.jdt.internal.ui.text.java.AbstractJavaCompletionProposal;\nimport org.eclipse.jdt.ui.text.java.CompletionProposalCollector;\nimport org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;\n\npublic class PatchExtensionMethodCompletionProposal {\n\tpublic static IJavaCompletionProposal[] getJavaCompletionProposals(IJavaCompletionProposal[] javaCompletionProposals,\n\t\t\tCompletionProposalCollector completionProposalCollector) {\n\t\t\n\t\tList<IJavaCompletionProposal> proposals = new ArrayList<IJavaCompletionProposal>(Arrays.asList(javaCompletionProposals));\n\t\tif (canExtendCodeAssist()) {\n\t\t\tfor (Extension extension : getExtensionMethods(completionProposalCollector)) {\n\t\t\t\tfor (MethodBinding method : extension.extensionMethods) {\n\t\t\t\t\tif (!isMatchingProposal(method, completionProposalCollector)) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tExtensionMethodCompletionProposal newProposal = new ExtensionMethodCompletionProposal(0);\n\t\t\t\t\tcopyNameLookupAndCompletionEngine(completionProposalCollector, newProposal);\n\t\t\t\t\tASTNode node = getAssistNode(completionProposalCollector);\n\t\t\t\t\tnewProposal.setMethodBinding(method, node);\n\t\t\t\t\tcreateAndAddJavaCompletionProposal(completionProposalCollector, newProposal, proposals);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn proposals.toArray(new IJavaCompletionProposal[0]);\n\t}\n\t\n\tprivate static List<Extension> getExtensionMethods(CompletionProposalCollector completionProposalCollector) {\n\t\tList<Extension> extensions = new ArrayList<Extension>();\n\t\tClassScope classScope = getClassScope(completionProposalCollector);\n\t\tif (classScope != null) {\n\t\t\tTypeDeclaration decl = classScope.referenceContext;\n\t\t\tTypeBinding firstParameterType = getFirstParameterType(decl, completionProposalCollector);\n\t\t\tfor (EclipseNode typeNode = getTypeNode(decl); typeNode != null; typeNode = upToType(typeNode)) {\n\t\t\t\tAnnotation ann = getAnnotation(ExtensionMethod.class, typeNode);\n\t\t\t\textensions.addAll(0, getApplicableExtensionMethods(typeNode, ann, firstParameterType));\n\t\t\t}\n\t\t}\n\t\treturn extensions;\n\t}\n\t\n\tprivate static boolean isMatchingProposal(MethodBinding method, CompletionProposalCollector completionProposalCollector) {\n\t\ttry {\n\t\t\tInternalCompletionContext context = (InternalCompletionContext) Reflection.contextField.get(completionProposalCollector);\n\t\t\tString searchToken = new String(context.getToken());\n\t\t\tString extensionMethodName = new String(method.selector);\n\t\t\treturn extensionMethodName.contains(searchToken);\n\t\t} catch (IllegalAccessException e) {\n\t\t\treturn true;\n\t\t}\n\t}\n\t\n\tstatic TypeBinding getFirstParameterType(TypeDeclaration decl, CompletionProposalCollector completionProposalCollector) {\n\t\tTypeBinding firstParameterType = null;\n\t\tASTNode node = getAssistNode(completionProposalCollector);\n\t\tif (node == null) return null;\n\t\tif (!(node instanceof CompletionOnQualifiedNameReference) && !(node instanceof CompletionOnSingleNameReference) && !(node instanceof CompletionOnMemberAccess)) return null;\n\t\t\n\t\t// Never offer on 'super.<autocomplete>'.\n\t\tif (node instanceof FieldReference && ((FieldReference)node).receiver instanceof SuperReference) return null;\n\t\t\n\t\tif (node instanceof NameReference) {\n\t\t\tBinding binding = ((NameReference) node).binding;\n\t\t\t// Unremark next block to allow a 'blank' autocomplete to list any extensions that apply to the current scope, but make sure we're not in a static context first, which this doesn't do.\n\t\t\t// Lacking good use cases, and having this particular concept be a little tricky on javac, means for now we don't support extension methods like this. this.X() will be fine, though.\n\t\t\t\n/*\t\t\tif ((node instanceof SingleNameReference) && (((SingleNameReference) node).token.length == 0)) {\n\t\t\t\tfirstParameterType = decl.binding;\n\t\t\t} else */if (binding instanceof VariableBinding) {\n\t\t\t\tfirstParameterType = ((VariableBinding) binding).type;\n\t\t\t}\n\t\t} else if (node instanceof FieldReference) {\n\t\t\tfirstParameterType = ((FieldReference) node).actualReceiverType;\n\t\t}\n\t\treturn firstParameterType;\n\t}\n\t\n\tprivate static ASTNode getAssistNode(CompletionProposalCollector completionProposalCollector) {\n\t\ttry {\n\t\t\tInternalCompletionContext context = (InternalCompletionContext) Reflection.contextField.get(completionProposalCollector);\n\t\t\tInternalExtendedCompletionContext extendedContext = (InternalExtendedCompletionContext) Reflection.extendedContextField.get(context);\n\t\t\tif (extendedContext == null) return null;\n\t\t\treturn (ASTNode) Reflection.assistNodeField.get(extendedContext);\n\t\t} catch (Exception ignore) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tprivate static ClassScope getClassScope(CompletionProposalCollector completionProposalCollector) {\n\t\tClassScope scope = null;\n\t\ttry {\n\t\t\tInternalCompletionContext context = (InternalCompletionContext) Reflection.contextField.get(completionProposalCollector);\n\t\t\tInternalExtendedCompletionContext extendedContext = (InternalExtendedCompletionContext) Reflection.extendedContextField.get(context);\n\t\t\tif (extendedContext != null) {\n\t\t\t\tScope assistScope = ((Scope) Reflection.assistScopeField.get(extendedContext));\n\t\t\t\tif (assistScope != null) {\n\t\t\t\t\tscope = assistScope.classScope();\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (IllegalAccessException ignore) {\n\t\t\t// ignore\n\t\t}\n\t\treturn scope;\n\t}\n\t\n\tprivate static void copyNameLookupAndCompletionEngine(CompletionProposalCollector completionProposalCollector, InternalCompletionProposal newProposal) {\n\t\t\n\t\ttry {\n\t\t\tInternalCompletionContext context = (InternalCompletionContext) Reflection.contextField.get(completionProposalCollector);\n\t\t\tInternalExtendedCompletionContext extendedContext = (InternalExtendedCompletionContext) Reflection.extendedContextField.get(context);\n\t\t\tLookupEnvironment lookupEnvironment = (LookupEnvironment) Reflection.lookupEnvironmentField.get(extendedContext);\n\t\t\tReflection.nameLookupField.set(newProposal, ((SearchableEnvironment) lookupEnvironment.nameEnvironment).nameLookup);\n\t\t\tReflection.completionEngineField.set(newProposal, lookupEnvironment.typeRequestor);\n\t\t} catch (IllegalAccessException ignore) {\n\t\t\t// ignore\n\t\t}\n\t}\n\t\n\tprivate static void createAndAddJavaCompletionProposal(CompletionProposalCollector completionProposalCollector, CompletionProposal newProposal,\n\t\t\tList<IJavaCompletionProposal> proposals) {\n\t\t\n\t\ttry {\n\t\t\tproposals.add((IJavaCompletionProposal) Reflection.createJavaCompletionProposalMethod.invoke(completionProposalCollector, newProposal));\n\t\t} catch (Exception ignore) {\n\t\t\t// ignore\n\t\t}\n\t}\n\t\n\tprivate static boolean canExtendCodeAssist() {\n\t\treturn Reflection.isComplete();\n\t}\n\n\t\n\tstatic class Reflection {\n\t\tpublic static final Field replacementOffsetField;\n\t\tpublic static final Field contextField;\n\t\tpublic static final Field extendedContextField;\n\t\tpublic static final Field assistNodeField;\n\t\tpublic static final Field assistScopeField;\n\t\tpublic static final Field lookupEnvironmentField;\n\t\tpublic static final Field completionEngineField;\n\t\tpublic static final Field nameLookupField;\n\t\tpublic static final Method createJavaCompletionProposalMethod;\n\t\t\n\t\tstatic {\n\t\t\treplacementOffsetField = accessField(AbstractJavaCompletionProposal.class, \"fReplacementOffset\");\n\t\t\tcontextField = accessField(CompletionProposalCollector.class, \"fContext\");\n\t\t\textendedContextField = accessField(InternalCompletionContext.class, \"extendedContext\");\n\t\t\tassistNodeField = accessField(InternalExtendedCompletionContext.class, \"assistNode\");\n\t\t\tassistScopeField = accessField(InternalExtendedCompletionContext.class, \"assistScope\");\n\t\t\tlookupEnvironmentField = accessField(InternalExtendedCompletionContext.class, \"lookupEnvironment\");\n\t\t\tcompletionEngineField = accessField(InternalCompletionProposal.class, \"completionEngine\");\n\t\t\tnameLookupField = accessField(InternalCompletionProposal.class, \"nameLookup\");\n\t\t\tcreateJavaCompletionProposalMethod = accessMethod(CompletionProposalCollector.class, \"createJavaCompletionProposal\", CompletionProposal.class);\n\t\t}\n\t\t\n\t\tstatic boolean isComplete() {\n\t\t\tObject[] requiredFieldsAndMethods = { replacementOffsetField, contextField, extendedContextField, assistNodeField, assistScopeField, lookupEnvironmentField, completionEngineField, nameLookupField, createJavaCompletionProposalMethod };\n\t\t\tfor (Object o : requiredFieldsAndMethods) if (o == null) return false;\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\tprivate static Field accessField(Class<?> clazz, String fieldName) {\n\t\t\ttry {\n\t\t\t\treturn makeAccessible(clazz.getDeclaredField(fieldName));\n\t\t\t} catch (Exception e) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\t\n\t\tprivate static Method accessMethod(Class<?> clazz, String methodName, Class<?> parameter) {\n\t\t\ttry {\n\t\t\t\treturn makeAccessible(clazz.getDeclaredMethod(methodName, parameter));\n\t\t\t} catch (Exception e) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\t\n\t\tprivate static <T extends AccessibleObject> T makeAccessible(T object) {\n\t\t\treturn Permit.setAccessible(object);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/eclipseAgent/lombok/eclipse/agent/PatchExtensionMethodCompletionProposalPortal.java",
    "content": "/*\n * Copyright (C) 2012 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.agent;\n\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\n\nimport lombok.Lombok;\n\nimport org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;\n\n\npublic class PatchExtensionMethodCompletionProposalPortal {\n\tprivate static final String COMPLETION_PROPOSAL_COLLECTOR = \"org.eclipse.jdt.ui.text.java.CompletionProposalCollector\";\n\tprivate static final String I_JAVA_COMPLETION_PROPOSAL_ARRAY = \"[Lorg.eclipse.jdt.ui.text.java.IJavaCompletionProposal;\";\n\t\n\tpublic static IJavaCompletionProposal[] getJavaCompletionProposals(Object[] javaCompletionProposals, Object completionProposalCollector) {\n\t\ttry {\n\t\t\treturn (IJavaCompletionProposal[]) ReflectionForUi.getJavaCompletionProposals.invoke(null, javaCompletionProposals, completionProposalCollector);\n\t\t} catch (NoClassDefFoundError e) {\n\t\t\t//ignore, we don't have access to the correct ECJ classes, so lombok can't possibly\n\t\t\t//do anything useful here.\n\t\t\treturn (IJavaCompletionProposal[]) javaCompletionProposals;\n\t\t} catch (IllegalAccessException e) {\n\t\t\tthrow Lombok.sneakyThrow(e);\n\t\t} catch (InvocationTargetException e) {\n\t\t\tthrow Lombok.sneakyThrow(e.getCause());\n\t\t} catch (NullPointerException e) {\n\t\t\tif (!\"false\".equals(System.getProperty(\"lombok.debug.reflection\", \"false\"))) {\n\t\t\t\te.initCause(ReflectionForUi.problem);\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\t//ignore, we don't have access to the correct ECJ classes, so lombok can't possibly\n\t\t\t//do anything useful here.\n\t\t\treturn (IJavaCompletionProposal[]) javaCompletionProposals;\n\t\t}\n\t}\n\t\n\tprivate static final class ReflectionForUi {\n\t\tpublic static final Method getJavaCompletionProposals;\n\t\tpublic static final Throwable problem;\n\t\t\n\t\tstatic {\n\t\t\tMethod p = null;\n\t\t\tThrowable problem_ = null;\n\t\t\ttry {\n\t\t\t\tp = PatchExtensionMethodCompletionProposal.class.getMethod(\"getJavaCompletionProposals\", Class.forName(I_JAVA_COMPLETION_PROPOSAL_ARRAY), Class.forName(COMPLETION_PROPOSAL_COLLECTOR));\n\t\t\t} catch (Throwable t) {\n\t\t\t\t// That's problematic, but as long as no local classes are used we don't actually need it.\n\t\t\t\t// Better fail on local classes than crash altogether.\n\t\t\t\tproblem_ = t;\n\t\t\t}\n\t\t\tgetJavaCompletionProposals = p;\n\t\t\tproblem = problem_;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/eclipseAgent/lombok/eclipse/agent/PatchFixesShadowLoaded.java",
    "content": "/*\n * Copyright (C) 2015 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.agent;\n\nimport java.io.BufferedOutputStream;\nimport java.io.IOException;\nimport java.io.OutputStream;\n\nimport lombok.core.DiagnosticsReceiver;\nimport lombok.core.PostCompiler;\nimport lombok.core.Version;\n\npublic class PatchFixesShadowLoaded {\n\tpublic static String addLombokNotesToEclipseAboutDialog(String origReturnValue, String key) {\n\t\tif (\"aboutText\".equals(key)) {\n\t\t\tif (origReturnValue.contains(\" is installed. https://projectlombok.org\")) return origReturnValue;\n\t\t\treturn origReturnValue + \"\\n\\nLombok \" + Version.getFullVersion() + \" is installed. https://projectlombok.org/\";\n\t\t}\n\t\treturn origReturnValue;\n\t}\n\t\n\tpublic static byte[] runPostCompiler(byte[] bytes, String fileName) {\n\t\tbyte[] transformed = PostCompiler.applyTransformations(bytes, fileName, DiagnosticsReceiver.CONSOLE);\n\t\treturn transformed == null ? bytes : transformed;\n\t}\n\t\n\tpublic static OutputStream runPostCompiler(OutputStream out) throws IOException {\n\t\treturn PostCompiler.wrapOutputStream(out, \"TEST\", DiagnosticsReceiver.CONSOLE);\n\t}\n\t\n\tpublic static BufferedOutputStream runPostCompiler(BufferedOutputStream out, String path, String name) throws IOException {\n\t\tString fileName = path + \"/\" + name;\n\t\treturn new BufferedOutputStream(PostCompiler.wrapOutputStream(out, fileName, DiagnosticsReceiver.CONSOLE));\n\t}\n}\n"
  },
  {
    "path": "src/eclipseAgent/lombok/eclipse/agent/PatchJavadoc.java",
    "content": "/*\n * Copyright (C) 2020-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.agent;\n\nimport static lombok.eclipse.EcjAugments.CompilationUnit_javadoc;\n\nimport java.lang.reflect.Method;\nimport java.util.Map;\n\nimport org.eclipse.jdt.core.ICompilationUnit;\nimport org.eclipse.jdt.core.IJavaElement;\nimport org.eclipse.jdt.core.IMember;\nimport org.eclipse.jdt.internal.core.CompilationUnit;\nimport org.eclipse.jdt.internal.core.SourceMethod;\nimport org.eclipse.jdt.internal.ui.text.javadoc.JavadocContentAccess2;\n\nimport lombok.permit.Permit;\n\npublic class PatchJavadoc {\n\t\n\tpublic static String getHTMLContentFromSource(Object instance, String original, Object member) {\n\t\tif (original != null) {\n\t\t\treturn original;\n\t\t}\n\t\t\n\t\tif (member instanceof SourceMethod) {\n\t\t\tSourceMethod sourceMethod = (SourceMethod) member;\n\t\t\tICompilationUnit iCompilationUnit = sourceMethod.getCompilationUnit();\n\t\t\tif (iCompilationUnit instanceof CompilationUnit) {\n\t\t\t\tCompilationUnit compilationUnit = (CompilationUnit) iCompilationUnit;\n\t\t\t\tMap<String, String> docs = CompilationUnit_javadoc.get(compilationUnit);\n\t\t\t\tif (docs == null) return null;\n\t\t\t\t\n\t\t\t\tString signature = Signature.getSignature(sourceMethod);\n\t\t\t\tString rawJavadoc = docs.get(signature);\n\t\t\t\tif (rawJavadoc == null) return null;\n\t\t\t\t\n\t\t\t\treturn Reflection.javadoc2HTML(instance, (IMember) member, (IJavaElement) member, rawJavadoc);\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\n\tprivate static class Signature {\n\t\tstatic final String getSignature(SourceMethod sourceMethod) {\n\t\t\tStringBuilder sb = new StringBuilder();\n\t\t\tsb.append(sourceMethod.getParent().getElementName());\n\t\t\tsb.append(\".\");\n\t\t\tsb.append(sourceMethod.getElementName());\n\t\t\tsb.append(\"(\");\n\t\t\tfor (String type : sourceMethod.getParameterTypes()) {\n\t\t\t\tsb.append(org.eclipse.jdt.core.Signature.toString(type));\n\t\t\t}\n\t\t\tsb.append(\")\");\n\t\t\t\n\t\t\treturn sb.toString();\n\t\t}\n\t}\n\t\n\t/**\n\t * The method {@code javadoc2HTML} changed 2014-12 to accept an\n\t * additional {@code IJavaElement} parameter. To support older versions, try to\n\t * find that one too.\n\t */\n\tprivate static class Reflection {\n\t\tprivate static final Method javadoc2HTML;\n\t\tprivate static final Method oldJavadoc2HTML;\n\t\tprivate static final Method reallyOldJavadoc2HTML;\n\t\tprivate static final Method lsJavadoc2HTML;\n\t\tstatic {\n\t\t\tMethod a = null, b = null, c = null, d = null;\n\t\t\t\n\t\t\ttry {\n\t\t\t\ta = Permit.getMethod(JavadocContentAccess2.class, \"javadoc2HTML\", IMember.class, IJavaElement.class, String.class);\n\t\t\t} catch (Throwable t) {}\n\t\t\ttry {\n\t\t\t\tb = Permit.getMethod(JavadocContentAccess2.class, \"javadoc2HTML\", IMember.class, String.class);\n\t\t\t} catch (Throwable t) {}\n\t\t\ttry {\n\t\t\t\tc = Permit.getMethod(Class.forName(\"org.eclipse.jdt.ls.core.internal.javadoc.JavadocContentAccess2\"), \"javadoc2HTML\", IMember.class, IJavaElement.class, String.class);\n\t\t\t} catch (Throwable t) {}\n\t\t\ttry {\n\t\t\t\td = Permit.getMethod(Class.forName(\"org.eclipse.jdt.core.manipulation.internal.javadoc.CoreJavadocAccess\"), \"javadoc2HTML\", IMember.class, IJavaElement.class, String.class);\n\t\t\t} catch (Throwable t) {}\n\t\t\t\n\t\t\toldJavadoc2HTML = a;\n\t\t\treallyOldJavadoc2HTML = b;\n\t\t\tlsJavadoc2HTML = c;\n\t\t\tjavadoc2HTML = d;\n\t\t}\n\t\t\n\t\tprivate static String javadoc2HTML(Object instance, IMember member, IJavaElement element, String rawJavadoc) {\n\t\t\tif (javadoc2HTML != null) {\n\t\t\t\ttry {\n\t\t\t\t\treturn (String) javadoc2HTML.invoke(instance, member, element, rawJavadoc);\n\t\t\t\t} catch (Throwable t) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (oldJavadoc2HTML != null) {\n\t\t\t\ttry {\n\t\t\t\t\treturn (String) oldJavadoc2HTML.invoke(instance, member, element, rawJavadoc);\n\t\t\t\t} catch (Throwable t) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (lsJavadoc2HTML != null) {\n\t\t\t\ttry {\n\t\t\t\t\treturn (String) lsJavadoc2HTML.invoke(instance, member, element, rawJavadoc);\n\t\t\t\t} catch (Throwable t) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (reallyOldJavadoc2HTML != null) {\n\t\t\t\ttry {\n\t\t\t\t\treturn (String) reallyOldJavadoc2HTML.invoke(instance, member, rawJavadoc);\n\t\t\t\t} catch (Throwable t) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/eclipseAgent/lombok/eclipse/agent/PatchVal.java",
    "content": "/*\n * Copyright (C) 2010-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.agent;\n\nimport lombok.permit.Permit;\nimport org.eclipse.jdt.core.compiler.CategorizedProblem;\nimport org.eclipse.jdt.internal.compiler.CompilationResult;\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.ConditionalExpression;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.ForeachStatement;\nimport org.eclipse.jdt.internal.compiler.ast.FunctionalExpression;\nimport org.eclipse.jdt.internal.compiler.ast.ImportReference;\nimport org.eclipse.jdt.internal.compiler.ast.LambdaExpression;\nimport org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.SingleTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\nimport org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;\nimport org.eclipse.jdt.internal.compiler.impl.ReferenceContext;\nimport org.eclipse.jdt.internal.compiler.lookup.ArrayBinding;\nimport org.eclipse.jdt.internal.compiler.lookup.Binding;\nimport org.eclipse.jdt.internal.compiler.lookup.BlockScope;\nimport org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope;\nimport org.eclipse.jdt.internal.compiler.lookup.ImportBinding;\nimport org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding;\nimport org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;\nimport org.eclipse.jdt.internal.compiler.lookup.Scope;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeBinding;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeConstants;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeIds;\nimport org.eclipse.jdt.internal.compiler.problem.AbortCompilation;\n\nimport java.lang.reflect.Field;\n\nimport static lombok.Lombok.sneakyThrow;\nimport static lombok.eclipse.Eclipse.*;\nimport static lombok.eclipse.handlers.EclipseHandlerUtil.*;\nimport static org.eclipse.jdt.core.compiler.CategorizedProblem.CAT_TYPE;\n\npublic class PatchVal {\n\t\n\t// This is half of the work for 'val' support - the other half is in PatchValEclipse. This half is enough for ecj.\n\t// Creates a copy of the 'initialization' field on a LocalDeclaration if the type of the LocalDeclaration is 'val', because the completion parser will null this out,\n\t// which in turn stops us from inferring the intended type for 'val x = 5;'. We look at the copy.\n\t// Also patches .resolve() on LocalDeclaration itself to just-in-time replace the 'val' vartype with the right one.\n\t\n\tpublic static boolean matches(String key, char[] array) {\n\t\tif (array == null || key.length() != array.length) return false;\n\t\tfor (int i = 0; i < array.length; i++) {\n\t\t\tif (key.charAt(i) != array[i]) return false;\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\tpublic static boolean couldBe(ImportBinding[] imports, String key, TypeReference ref) {\n\t\tString[] keyParts = key.split(\"\\\\.\");\n\t\tif (ref instanceof SingleTypeReference) {\n\t\t\tchar[] token = ((SingleTypeReference)ref).token;\n\t\t\tif (!matches(keyParts[keyParts.length - 1], token)) return false;\n\t\t\tif (imports == null) return true;\n\t\t\ttop:\n\t\t\tfor (ImportBinding ib : imports) {\n\t\t\t\tImportReference ir = ib.reference;\n\t\t\t\tif (ir == null) continue;\n\t\t\t\tif (ir.isStatic()) continue;\n\t\t\t\tboolean star = ((ir.bits & ASTNode.OnDemand) != 0);\n\t\t\t\tint len = keyParts.length - (star ? 1 : 0);\n\t\t\t\tchar[][] t = ir.tokens;\n\t\t\t\tif (len != t.length) continue;\n\t\t\t\tfor (int i = 0; i < len; i++) {\n\t\t\t\t\tif (keyParts[i].length() != t[i].length) continue top;\n\t\t\t\t\tfor (int j = 0; j < t[i].length; j++) if (keyParts[i].charAt(j) != t[i][j]) continue top;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tif (ref instanceof QualifiedTypeReference) {\n\t\t\tchar[][] tokens = ((QualifiedTypeReference)ref).tokens;\n\t\t\tif (keyParts.length != tokens.length) return false;\n\t\t\tfor(int i = 0; i < tokens.length; ++i) {\n\t\t\t\tString part = keyParts[i];\n\t\t\t\tchar[] token = tokens[i];\n\t\t\t\tif (!matches(part, token)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\tpublic static boolean couldBe(ImportReference[] imports, String key, TypeReference ref) {\n\t\tString[] keyParts = key.split(\"\\\\.\");\n\t\tif (ref instanceof SingleTypeReference) {\n\t\t\tchar[] token = ((SingleTypeReference) ref).token;\n\t\t\tif (!matches(keyParts[keyParts.length - 1], token)) return false;\n\t\t\tif (imports == null) return true;\n\t\t\ttop:\n\t\t\tfor (ImportReference ir : imports) {\n\t\t\t\tif (ir.isStatic()) continue;\n\t\t\t\tboolean star = ((ir.bits & ASTNode.OnDemand) != 0);\n\t\t\t\tint len = keyParts.length - (star ? 1 : 0);\n\t\t\t\tchar[][] t = ir.tokens;\n\t\t\t\tif (len != t.length) continue;\n\t\t\t\tfor (int i = 0; i < len; i++) {\n\t\t\t\t\tif (keyParts[i].length() != t[i].length) continue top;\n\t\t\t\t\tfor (int j = 0; j < t[i].length; j++) if (keyParts[i].charAt(j) != t[i][j]) continue top;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tif (ref instanceof QualifiedTypeReference) {\n\t\t\tchar[][] tokens = ((QualifiedTypeReference) ref).tokens;\n\t\t\tif (keyParts.length != tokens.length) return false;\n\t\t\tfor(int i = 0; i < tokens.length; ++i) {\n\t\t\t\tString part = keyParts[i];\n\t\t\t\tchar[] token = tokens[i];\n\t\t\t\tif (!matches(part, token)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\tprivate static boolean is(TypeReference ref, BlockScope scope, String key) {\n\t\tScope s = scope.parent;\n\t\twhile (s != null && !(s instanceof CompilationUnitScope)) {\n\t\t\tScope ns = s.parent;\n\t\t\ts = ns == s ? null : ns;\n\t\t}\n\t\tImportBinding[] imports = null;\n\t\tif (s instanceof CompilationUnitScope) imports = ((CompilationUnitScope) s).imports;\n\t\tif (!couldBe(imports, key, ref)) return false;\n\t\t\n\t\tTypeBinding resolvedType = ref.resolvedType;\n\t\tif (resolvedType == null) resolvedType = ref.resolveType(scope, false);\n\t\tif (resolvedType == null) return false;\n\t\t\n\t\tchar[] pkg = resolvedType.qualifiedPackageName();\n\t\tchar[] nm = resolvedType.qualifiedSourceName();\n\t\tint pkgFullLength = pkg.length > 0 ? pkg.length + 1: 0;\n\t\tchar[] fullName = new char[pkgFullLength + nm.length];\n\t\tif(pkg.length > 0) {\n\t\t\tSystem.arraycopy(pkg, 0, fullName, 0, pkg.length);\n\t\t\tfullName[pkg.length] = '.';\n\t\t}\n\t\tSystem.arraycopy(nm, 0, fullName, pkgFullLength, nm.length);\n\t\treturn matches(key, fullName);\n\t}\n\t\n\tpublic static final class Reflection {\n\t\tprivate static final Field initCopyField, iterableCopyField;\n\t\t\n\t\tstatic {\n\t\t\tField a = null, b = null;\n\t\t\t\n\t\t\ttry {\n\t\t\t\ta = Permit.getField(LocalDeclaration.class, \"$initCopy\");\n\t\t\t\tb = Permit.getField(LocalDeclaration.class, \"$iterableCopy\");\n\t\t\t} catch (Throwable t) {\n\t\t\t\t//ignore - no $initCopy exists when running in ecj.\n\t\t\t}\n\t\t\t\n\t\t\tinitCopyField = a;\n\t\t\titerableCopyField = b;\n\t\t}\n\t}\n\tpublic static boolean handleValForLocalDeclaration(LocalDeclaration local, BlockScope scope) {\n\t\tif (local == null || !LocalDeclaration.class.equals(local.getClass())) return false;\n\t\tboolean decomponent = false;\n\t\t\n\t\tboolean val = isVal(local, scope);\n\t\tboolean var = isVar(local, scope);\n\t\tif (!(val || var)) return false;\n\t\t\n\t\tif (val) {\n\t\t\tStackTraceElement[] st = new Throwable().getStackTrace();\n\t\t\tfor (int i = 0; i < st.length - 2 && i < 10; i++) {\n\t\t\t\tif (st[i].getClassName().equals(\"lombok.launch.PatchFixesHider$Val\")) {\n\t\t\t\t\tboolean valInForStatement = \n\t\t\t\t\t\tst[i + 1].getClassName().equals(\"org.eclipse.jdt.internal.compiler.ast.LocalDeclaration\") &&\n\t\t\t\t\t\tst[i + 2].getClassName().equals(\"org.eclipse.jdt.internal.compiler.ast.ForStatement\");\n\t\t\t\t\tif (valInForStatement) return false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tExpression init = local.initialization;\n\t\tif (init == null && Reflection.initCopyField != null) {\n\t\t\ttry {\n\t\t\t\tinit = (Expression) Reflection.initCopyField.get(local);\n\t\t\t} catch (Exception e) {\n\t\t\t\t// init remains null.\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (init == null && Reflection.iterableCopyField != null) {\n\t\t\ttry {\n\t\t\t\tinit = (Expression) Reflection.iterableCopyField.get(local);\n\t\t\t\tdecomponent = true;\n\t\t\t} catch (Exception e) {\n\t\t\t\t// init remains null.\n\t\t\t}\n\t\t}\n\t\t\n\t\tTypeReference replacement = null;\n\t\t\n\t\t// Java 10+: Lombok uses the native 'var' support and transforms 'val' to 'final var'.\n\t\tif (hasNativeVarSupport(scope) && val) {\n\t\t\treplacement = new SingleTypeReference(\"var\".toCharArray(), pos(local.type));\n\t\t\tlocal.initialization = init;\n\t\t\tinit = null;\n\t\t}\n\t\t\n\t\tif (init != null) {\n\t\t\tif (init.getClass().getName().equals(\"org.eclipse.jdt.internal.compiler.ast.LambdaExpression\")) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\tTypeBinding resolved = null;\n\t\t\ttry {\n\t\t\t\tresolved = decomponent ? getForEachComponentType(init, scope) : resolveForExpression(init, scope);\n\t\t\t} catch (NullPointerException e) {\n\t\t\t\t// This definitely occurs if as part of resolving the initializer expression, a\n\t\t\t\t// lambda expression in it must also be resolved (such as when lambdas are part of\n\t\t\t\t// a ternary expression). This can't result in a viable 'val' matching, so, we\n\t\t\t\t// just go with 'Object' and let the IDE print the appropriate errors.\n\t\t\t\tresolved = null;\n\t\t\t}\n\t\t\t\n\t\t\tif (resolved == null) {\n\t\t\t\tif (init instanceof ConditionalExpression) {\n\t\t\t\t\tConditionalExpression cexp = (ConditionalExpression) init;\n\t\t\t\t\tExpression ifTrue = cexp.valueIfTrue;\n\t\t\t\t\tExpression ifFalse = cexp.valueIfFalse;\n\t\t\t\t\tTypeBinding ifTrueResolvedType = ifTrue.resolvedType;\n\t\t\t\t\tCompilationResult compilationResult = scope.referenceCompilationUnit().compilationResult;\n\t\t\t\t\tCategorizedProblem[] problems = compilationResult.problems;\n\t\t\t\t\tCategorizedProblem lastProblem = problems[compilationResult.problemCount - 1];\n\t\t\t\t\tif (ifTrueResolvedType != null && ifFalse.resolvedType == null && lastProblem.getCategoryID() == CAT_TYPE) {\n\t\t\t\t\t\tint problemCount = compilationResult.problemCount;\n\t\t\t\t\t\tfor (int i = 0; i < problemCount; ++i) {\n\t\t\t\t\t\t\tif (problems[i] == lastProblem) {\n\t\t\t\t\t\t\t\tproblems[i] = null;\n\t\t\t\t\t\t\t\tif (i + 1 < problemCount) {\n\t\t\t\t\t\t\t\t\tSystem.arraycopy(problems, i + 1, problems, i, problemCount - i + 1);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcompilationResult.removeProblem(lastProblem);\n\t\t\t\t\t\tif (!compilationResult.hasErrors()) {\n\t\t\t\t\t\t\tclearIgnoreFurtherInvestigationField(scope.referenceContext());\n\t\t\t\t\t\t\tsetValue(getField(CompilationResult.class, \"hasMandatoryErrors\"), compilationResult, false);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (ifFalse instanceof FunctionalExpression) {\n\t\t\t\t\t\t\tFunctionalExpression functionalExpression = (FunctionalExpression) ifFalse;\n\t\t\t\t\t\t\tfunctionalExpression.setExpectedType(ifTrueResolvedType);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (ifFalse.resolvedType == null) {\n\t\t\t\t\t\t\tresolveForExpression(ifFalse, scope);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tresolved = ifTrueResolvedType;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (resolved != null) {\n\t\t\t\ttry {\n\t\t\t\t\treplacement = makeType(resolved, local.type, false);\n\t\t\t\t\tif (!decomponent) init.resolvedType = replacement.resolveType(scope);\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t// Some type thing failed.\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (val) local.modifiers |= ClassFileConstants.AccFinal;\n\t\tlocal.annotations = addValAnnotation(local.annotations, local.type, scope);\n\t\tlocal.type = replacement != null ? replacement : new QualifiedTypeReference(TypeConstants.JAVA_LANG_OBJECT, poss(local.type, 3));\n\t\treturn false;\n\t}\n\t\n\tprivate static boolean isVar(LocalDeclaration local, BlockScope scope) {\n\t\treturn is(local.type, scope, \"lombok.experimental.var\") || is(local.type, scope, \"lombok.var\");\n\t}\n\t\n\tprivate static boolean isVal(LocalDeclaration local, BlockScope scope) {\n\t\treturn is(local.type, scope, \"lombok.val\");\n\t}\n\t\n\tprivate static boolean hasNativeVarSupport(Scope scope) {\n\t\tlong sl = scope.problemReporter().options.sourceLevel >> 16;\n\t\tlong cl = scope.problemReporter().options.complianceLevel >> 16;\n\t\tif (sl == 0) sl = cl;\n\t\tif (cl == 0) cl = sl;\n\t\treturn Math.min((int)(sl - 44), (int)(cl - 44)) >= 10;\n\t}\n\t\n\tpublic static boolean handleValForForEach(ForeachStatement forEach, BlockScope scope) {\n\t\tif (forEach.elementVariable == null) return false;\n\t\t\n\t\tboolean val = isVal(forEach.elementVariable, scope);\n\t\tboolean var = isVar(forEach.elementVariable, scope);\n\t\tif (!(val || var)) return false;\n\t\t\n\t\tif (hasNativeVarSupport(scope)) return false;\n\t\t\n\t\tTypeBinding component = getForEachComponentType(forEach.collection, scope);\n\t\tif (component == null) return false;\n\t\tTypeReference replacement = makeType(component, forEach.elementVariable.type, false);\n\t\t\n\t\tif (val) forEach.elementVariable.modifiers |= ClassFileConstants.AccFinal;\n\t\tforEach.elementVariable.annotations = addValAnnotation(forEach.elementVariable.annotations, forEach.elementVariable.type, scope);\n\t\tforEach.elementVariable.type = replacement != null ? replacement :\n\t\t\tnew QualifiedTypeReference(TypeConstants.JAVA_LANG_OBJECT, poss(forEach.elementVariable.type, 3));\n\t\t\n\t\treturn false;\n\t}\n\t\n\tprivate static Annotation[] addValAnnotation(Annotation[] originals, TypeReference originalRef, BlockScope scope) {\n\t\tAnnotation[] newAnn;\n\t\tif (originals != null) {\n\t\t\tnewAnn = new Annotation[1 + originals.length];\n\t\t\tSystem.arraycopy(originals, 0, newAnn, 0, originals.length);\n\t\t} else {\n\t\t\tnewAnn = new Annotation[1];\n\t\t}\n\t\t\n\t\tTypeReference qualifiedTypeRef = generateQualifiedTypeRef(originalRef, originalRef.getTypeName());\n\t\tnewAnn[newAnn.length - 1] = new org.eclipse.jdt.internal.compiler.ast.MarkerAnnotation(qualifiedTypeRef, qualifiedTypeRef.sourceStart);\n\t\t\n\t\treturn newAnn;\n\t}\n\t\n\tprivate static TypeBinding getForEachComponentType(Expression collection, BlockScope scope) {\n\t\tif (collection != null) {\n\t\t\tTypeBinding resolved = collection.resolvedType;\n\t\t\tif (resolved == null) resolved = resolveForExpression(collection, scope);\n\t\t\tif (resolved == null) return null;\n\t\t\tif (resolved.isArrayType()) {\n\t\t\t\tresolved = ((ArrayBinding) resolved).elementsType();\n\t\t\t\treturn resolved;\n\t\t\t} else if (resolved instanceof ReferenceBinding) {\n\t\t\t\tReferenceBinding iterableType = ((ReferenceBinding) resolved).findSuperTypeOriginatingFrom(TypeIds.T_JavaLangIterable, false);\n\t\t\t\t\n\t\t\t\tTypeBinding[] arguments = null;\n\t\t\t\tif (iterableType != null) switch (iterableType.kind()) {\n\t\t\t\t\tcase Binding.GENERIC_TYPE : // for (T t : Iterable<T>) - in case used inside Iterable itself\n\t\t\t\t\t\targuments = iterableType.typeVariables();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase Binding.PARAMETERIZED_TYPE : // for(E e : Iterable<E>)\n\t\t\t\t\t\targuments = ((ParameterizedTypeBinding)iterableType).arguments;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase Binding.RAW_TYPE : // for(Object e : Iterable)\n\t\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (arguments != null && arguments.length == 1) {\n\t\t\t\t\treturn arguments[0];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\t\n\tprivate static TypeBinding resolveForExpression(Expression collection, BlockScope scope) {\n\t\ttry {\n\t\t\treturn collection.resolveType(scope);\n\t\t} catch (ArrayIndexOutOfBoundsException e) {\n\t\t\t// Known cause of issues; for example: val e = mth(\"X\"), where mth takes 2 arguments.\n\t\t\treturn null;\n\t\t} catch (AbortCompilation e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tprivate static void clearIgnoreFurtherInvestigationField(ReferenceContext currentContext) {\n\t\tif (currentContext instanceof AbstractMethodDeclaration) {\n\t\t\tAbstractMethodDeclaration methodDeclaration = (AbstractMethodDeclaration) currentContext;\n\t\t\tmethodDeclaration.ignoreFurtherInvestigation = false;\n\t\t} else if (currentContext instanceof LambdaExpression) {\n\t\t\tLambdaExpression lambdaExpression = (LambdaExpression) currentContext;\n\t\t\tsetValue(getField(LambdaExpression.class, \"ignoreFurtherInvestigation\"), lambdaExpression, false);\n\t\t\t\n\t\t\tScope parent = lambdaExpression.enclosingScope.parent;\n\t\t\twhile (parent != null) {\n\t\t\t\tswitch(parent.kind) {\n\t\t\t\t\tcase Scope.CLASS_SCOPE:\n\t\t\t\t\tcase Scope.METHOD_SCOPE:\n\t\t\t\t\t\tReferenceContext parentAST = parent.referenceContext();\n\t\t\t\t\t\tif (parentAST != lambdaExpression) {\n\t\t\t\t\t\t\tclearIgnoreFurtherInvestigationField(parentAST);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tparent = parent.parent;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t} else if (currentContext instanceof TypeDeclaration) {\n\t\t\tTypeDeclaration typeDeclaration = (TypeDeclaration) currentContext;\n\t\t\ttypeDeclaration.ignoreFurtherInvestigation = false;\n\t\t} else if (currentContext instanceof CompilationUnitDeclaration) {\n\t\t\tCompilationUnitDeclaration typeDeclaration = (CompilationUnitDeclaration) currentContext;\n\t\t\ttypeDeclaration.ignoreFurtherInvestigation = false;\n\t\t} else {\n\t\t\tthrow new UnsupportedOperationException(\"clearIgnoreFurtherInvestigationField for \" + currentContext.getClass());\n\t\t}\n\t}\n\t\n\tprivate static void setValue(Field field, Object object, Object value) {\n\t\ttry {\n\t\t\tfield.set(object, value);\n\t\t} catch (IllegalAccessException e) {\n\t\t\tthrow sneakyThrow(e);\n\t\t}\n\t}\n\t\n\tprivate static Field getField(Class<?> clazz, String name) {\n\t\ttry {\n\t\t\treturn Permit.getField(clazz, name);\n\t\t} catch (NoSuchFieldException e) {\n\t\t\tthrow sneakyThrow(e);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/eclipseAgent/lombok/eclipse/agent/PatchValEclipse.java",
    "content": "/*\n * Copyright (C) 2010-2018 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n * \n * Thanks to Stephen Haberman for a patch to solve some NPEs in Eclipse.\n */\npackage lombok.eclipse.agent;\n\nimport java.lang.reflect.Constructor;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\nimport java.util.List;\n\nimport lombok.Lombok;\nimport lombok.permit.Permit;\n\nimport org.eclipse.jdt.core.dom.AST;\nimport org.eclipse.jdt.core.dom.IExtendedModifier;\nimport org.eclipse.jdt.core.dom.MarkerAnnotation;\nimport org.eclipse.jdt.core.dom.Modifier;\nimport org.eclipse.jdt.core.dom.Modifier.ModifierKeyword;\nimport org.eclipse.jdt.core.dom.Name;\nimport org.eclipse.jdt.core.dom.QualifiedName;\nimport org.eclipse.jdt.core.dom.SimpleName;\nimport org.eclipse.jdt.core.dom.SingleVariableDeclaration;\nimport org.eclipse.jdt.core.dom.VariableDeclarationStatement;\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.ForeachStatement;\nimport org.eclipse.jdt.internal.compiler.ast.ImportReference;\nimport org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.SingleTypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\nimport org.eclipse.jdt.internal.compiler.parser.Parser;\n\npublic class PatchValEclipse {\n\tpublic static void copyInitializationOfForEachIterable(Parser parser) {\n\t\tASTNode[] astStack;\n\t\tint astPtr;\n\t\ttry {\n\t\t\tastStack = (ASTNode[]) Reflection.astStackField.get(parser);\n\t\t\tastPtr = (Integer) Reflection.astPtrField.get(parser);\n\t\t} catch (Exception e) {\n\t\t\t// Most likely we're in ecj or some other plugin usage of the eclipse compiler. No need for this.\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tForeachStatement foreachDecl = (ForeachStatement) astStack[astPtr];\n\t\tASTNode init = foreachDecl.collection;\n\t\tif (init == null) return;\n\t\tboolean val = couldBeVal(parser == null ? null : parser.compilationUnit == null ? null : parser.compilationUnit.imports, foreachDecl.elementVariable.type);\n\t\tboolean var = couldBeVar(parser == null ? null : parser.compilationUnit == null ? null : parser.compilationUnit.imports, foreachDecl.elementVariable.type);\n\t\tif (foreachDecl.elementVariable == null || !(val || var)) return;\n\t\t\n\t\ttry {\n\t\t\tif (Reflection.iterableCopyField != null) Reflection.iterableCopyField.set(foreachDecl.elementVariable, init);\n\t\t} catch (Exception e) {\n\t\t\t// In ecj mode this field isn't there and we don't need the copy anyway, so, we ignore the exception.\n\t\t}\n\t}\n\t\n\tpublic static void copyInitializationOfLocalDeclaration(Parser parser) {\n\t\tASTNode[] astStack;\n\t\tint astPtr;\n\t\ttry {\n\t\t\tastStack = (ASTNode[]) Reflection.astStackField.get(parser);\n\t\t\tastPtr = (Integer)Reflection.astPtrField.get(parser);\n\t\t} catch (Exception e) {\n\t\t\t// Most likely we're in ecj or some other plugin usage of the eclipse compiler. No need for this.\n\t\t\treturn;\n\t\t}\n\t\tAbstractVariableDeclaration variableDecl = (AbstractVariableDeclaration) astStack[astPtr];\n\t\tif (!(variableDecl instanceof LocalDeclaration)) return;\n\t\tASTNode init = variableDecl.initialization;\n\t\tif (init == null) return;\n\t\tboolean val = couldBeVal(parser == null ? null : parser.compilationUnit == null ? null : parser.compilationUnit.imports, variableDecl.type);\n\t\tboolean var = couldBeVar(parser == null ? null : parser.compilationUnit == null ? null : parser.compilationUnit.imports, variableDecl.type);\n\t\tif (!(val || var)) return;\n\t\t\n\t\ttry {\n\t\t\tif (Reflection.initCopyField != null) Reflection.initCopyField.set(variableDecl, init);\n\t\t} catch (Exception e) {\n\t\t\t// In ecj mode this field isn't there and we don't need the copy anyway, so, we ignore the exception.\n\t\t}\n\t}\n\t\n\tprivate static boolean couldBeVal(ImportReference[] imports, TypeReference type) {\n\t\treturn PatchVal.couldBe(imports, \"lombok.val\", type);\n\t}\n\t\n\tprivate static boolean couldBeVar(ImportReference[] imports, TypeReference type) {\n\t\treturn PatchVal.couldBe(imports, \"lombok.experimental.var\", type) || PatchVal.couldBe(imports, \"lombok.var\", type);\n\t}\n\t\n\tpublic static void addFinalAndValAnnotationToSingleVariableDeclaration(Object converter, SingleVariableDeclaration out, LocalDeclaration in) {\n\t\t@SuppressWarnings(\"unchecked\") List<IExtendedModifier> modifiers = out.modifiers();\n\t\taddFinalAndValAnnotationToModifierList(converter, modifiers, out.getAST(), in);\n\t}\n\t\n\tpublic static void addFinalAndValAnnotationToVariableDeclarationStatement(Object converter, VariableDeclarationStatement out, LocalDeclaration in) {\n\t\t@SuppressWarnings(\"unchecked\") List<IExtendedModifier> modifiers = out.modifiers();\n\t\taddFinalAndValAnnotationToModifierList(converter, modifiers, out.getAST(), in);\n\t}\n\t\n\tpublic static void addFinalAndValAnnotationToModifierList(Object converter, List<IExtendedModifier> modifiers, AST ast, LocalDeclaration in) {\n\t\t// First check that 'in' has the final flag on, and a @val / @lombok.val / @var / @lombok.var annotation.\n\t\tif (in.annotations == null) return;\n\t\tboolean found = false;\n\t\tAnnotation valAnnotation = null, varAnnotation = null;\n\t\tfor (Annotation ann : in.annotations) {\n\t\t\tif (couldBeVal(null, ann.type)) {\n\t\t\t\tfound = true;\n\t\t\t\tvalAnnotation = ann;\n\t\t\t}\n\t\t\tif (couldBeVar(null, ann.type)) {\n\t\t\t\tfound = true;\n\t\t\t\tvarAnnotation = ann;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (!found) return;\n\t\t\n\t\t// Now check that 'out' is missing either of these.\n\t\t\n\t\tif (modifiers == null) return; // This is null only if the project is 1.4 or less. Lombok doesn't work in that.\n\t\tboolean finalIsPresent = false;\n\t\tboolean valIsPresent = false;\n\t\tboolean varIsPresent = false;\n\t\t\n\t\tfor (Object present : modifiers) {\n\t\t\tif (present instanceof Modifier) {\n\t\t\t\tModifierKeyword keyword = ((Modifier) present).getKeyword();\n\t\t\t\tif (keyword == null) continue;\n\t\t\t\tif (keyword.toFlagValue() == Modifier.FINAL) finalIsPresent = true;\n\t\t\t}\n\t\t\t\n\t\t\tif (present instanceof org.eclipse.jdt.core.dom.Annotation) {\n\t\t\t\tName typeName = ((org.eclipse.jdt.core.dom.Annotation) present).getTypeName();\n\t\t\t\tif (typeName != null) {\n\t\t\t\t\tString fullyQualifiedName = typeName.getFullyQualifiedName();\n\t\t\t\t\tif (\"val\".equals(fullyQualifiedName) || \"lombok.val\".equals(fullyQualifiedName)) valIsPresent = true;\n\t\t\t\t\tif (\"var\".equals(fullyQualifiedName) || \"lombok.var\".equals(fullyQualifiedName) || \"lombok.experimental.var\".equals(fullyQualifiedName)) varIsPresent = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (!finalIsPresent && valAnnotation != null) {\n\t\t\tmodifiers.add(createModifier(ast, ModifierKeyword.FINAL_KEYWORD, valAnnotation.sourceStart, valAnnotation.sourceEnd));\n\t\t}\n\t\t\n\t\tif (!valIsPresent && valAnnotation != null) {\n\t\t\tMarkerAnnotation newAnnotation = createValVarAnnotation(ast, valAnnotation, valAnnotation.sourceStart, valAnnotation.sourceEnd);\n\t\t\ttry {\n\t\t\t\tReflection.astConverterRecordNodes.invoke(converter, newAnnotation, valAnnotation);\n\t\t\t\tReflection.astConverterRecordNodes.invoke(converter, newAnnotation.getTypeName(), valAnnotation.type);\n\t\t\t} catch (IllegalAccessException e) {\n\t\t\t\tthrow Lombok.sneakyThrow(e);\n\t\t\t} catch (InvocationTargetException e) {\n\t\t\t\tthrow Lombok.sneakyThrow(e.getCause());\n\t\t\t}\n\t\t\tmodifiers.add(newAnnotation);\n\t\t}\n\t\t\n\t\tif (!varIsPresent && varAnnotation != null) {\n\t\t\tMarkerAnnotation newAnnotation = createValVarAnnotation(ast, varAnnotation, varAnnotation.sourceStart, varAnnotation.sourceEnd);\n\t\t\ttry {\n\t\t\t\tReflection.astConverterRecordNodes.invoke(converter, newAnnotation, varAnnotation);\n\t\t\t\tReflection.astConverterRecordNodes.invoke(converter, newAnnotation.getTypeName(), varAnnotation.type);\n\t\t\t} catch (IllegalAccessException e) {\n\t\t\t\tthrow Lombok.sneakyThrow(e);\n\t\t\t} catch (InvocationTargetException e) {\n\t\t\t\tthrow Lombok.sneakyThrow(e.getCause());\n\t\t\t}\n\t\t\tmodifiers.add(newAnnotation);\n\t\t}\n\t}\n\t\n\tpublic static Modifier createModifier(AST ast, ModifierKeyword keyword, int start, int end) {\n\t\tModifier modifier = null;\n\t\ttry {\n\t\t\tmodifier = Reflection.modifierConstructor.newInstance(ast);\n\t\t} catch (InstantiationException e) {\n\t\t\tthrow Lombok.sneakyThrow(e);\n\t\t} catch (IllegalAccessException e) {\n\t\t\tthrow Lombok.sneakyThrow(e);\n\t\t} catch (InvocationTargetException e) {\n\t\t\tthrow Lombok.sneakyThrow(e);\n\t\t}\n\t\t\n\t\tif (modifier != null) {\n\t\t\tmodifier.setKeyword(keyword);\n\t\t\tmodifier.setSourceRange(start, end - start + 1);\n\t\t}\n\t\treturn modifier;\n\t}\n\t\n\tpublic static MarkerAnnotation createValVarAnnotation(AST ast, Annotation original, int start, int end) {\n\t\tMarkerAnnotation out = null;\n\t\ttry {\n\t\t\tout = Reflection.markerAnnotationConstructor.newInstance(ast);\n\t\t} catch (InstantiationException e) {\n\t\t\tthrow Lombok.sneakyThrow(e);\n\t\t} catch (IllegalAccessException e) {\n\t\t\tthrow Lombok.sneakyThrow(e);\n\t\t} catch (InvocationTargetException e) {\n\t\t\tthrow Lombok.sneakyThrow(e);\n\t\t}\n\t\t\n\t\tchar[][] tokens;\n\t\tif (original.type instanceof SingleTypeReference) {\n\t\t\ttokens = new char[1][];\n\t\t\ttokens[0] = ((SingleTypeReference) original.type).token;\n\t\t} else if (original.type instanceof QualifiedTypeReference) {\n\t\t\ttokens = ((QualifiedTypeReference) original.type).tokens;\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\tif (out != null) {\n\t\t\tSimpleName valName = ast.newSimpleName(new String(tokens[tokens.length - 1]));\n\t\t\tvalName.setSourceRange(start, end - start + 1);\n\t\t\tif (tokens.length == 1) {\n\t\t\t\tout.setTypeName(valName);\n\t\t\t\tsetIndex(valName, 1);\n\t\t\t} else if (tokens.length == 2) {\n\t\t\t\tSimpleName lombokName = ast.newSimpleName(\"lombok\");\n\t\t\t\tlombokName.setSourceRange(start, end - start + 1);\n\t\t\t\tsetIndex(lombokName, 1);\n\t\t\t\tsetIndex(valName, 2);\n\t\t\t\tQualifiedName fullName = ast.newQualifiedName(lombokName, valName);\n\t\t\t\tsetIndex(fullName, 1);\n\t\t\t\tfullName.setSourceRange(start, end - start + 1);\n\t\t\t\tout.setTypeName(fullName);\n\t\t\t} else {\n\t\t\t\tSimpleName lombokName = ast.newSimpleName(\"lombok\");\n\t\t\t\tlombokName.setSourceRange(start, end - start + 1);\n\t\t\t\tSimpleName experimentalName = ast.newSimpleName(\"experimental\");\n\t\t\t\tlombokName.setSourceRange(start, end - start + 1);\n\t\t\t\tsetIndex(lombokName, 1);\n\t\t\t\tsetIndex(experimentalName, 2);\n\t\t\t\tsetIndex(valName, 3);\n\t\t\t\tQualifiedName lombokExperimentalName = ast.newQualifiedName(lombokName, experimentalName);\n\t\t\t\tlombokExperimentalName.setSourceRange(start, end - start + 1);\n\t\t\t\tsetIndex(lombokExperimentalName, 1);\n\t\t\t\tQualifiedName fullName = ast.newQualifiedName(lombokExperimentalName, valName);\n\t\t\t\tsetIndex(fullName, 1);\n\t\t\t\tfullName.setSourceRange(start, end - start + 1);\n\t\t\t\tout.setTypeName(fullName);\n\t\t\t}\n\t\t\tout.setSourceRange(start, end - start + 1);\n\t\t}\n\t\t\n\t\treturn out;\n\t}\n\t\n\tprivate static final Field FIELD_NAME_INDEX;\n\t\n\tstatic {\n\t\tField f = null;\n\t\ttry {\n\t\t\tf = Permit.getField(Name.class, \"index\");\n\t\t} catch (Throwable t) {\n\t\t\t// Leave it null, in which case we don't set index. That'll result in error log messages but its better than crashing here.\n\t\t}\n\t\t\n\t\tFIELD_NAME_INDEX = f;\n\t}\n\t\n\tprivate static void setIndex(Name name, int index) {\n\t\ttry {\n\t\t\tif (FIELD_NAME_INDEX != null) FIELD_NAME_INDEX.set(name, index);\n\t\t} catch (Exception e) {\n\t\t\t// Don't do anything - safest fallback behaviour.\n\t\t}\n\t}\n\t\n\tpublic static final class Reflection {\n\t\tprivate static final Field initCopyField, iterableCopyField;\n\t\tprivate static final Field astStackField, astPtrField;\n\t\tprivate static final Constructor<Modifier> modifierConstructor;\n\t\tprivate static final Constructor<MarkerAnnotation> markerAnnotationConstructor;\n\t\tprivate static final Method astConverterRecordNodes;\n\t\t\n\t\tstatic {\n\t\t\tField a = null, b = null, c = null, d = null;\n\t\t\tConstructor<Modifier> f = null;\n\t\t\tConstructor<MarkerAnnotation> g = null;\n\t\t\tMethod h = null;\n\t\t\t\n\t\t\ttry {\n\t\t\t\ta = Permit.getField(LocalDeclaration.class, \"$initCopy\");\n\t\t\t\tb = Permit.getField(LocalDeclaration.class, \"$iterableCopy\");\n\t\t\t} catch (Throwable t) {\n\t\t\t\t//ignore - no $initCopy exists when running in ecj.\n\t\t\t}\n\t\t\t\n\t\t\ttry {\n\t\t\t\tc = Permit.getField(Parser.class, \"astStack\");\n\t\t\t\td = Permit.getField(Parser.class, \"astPtr\");\n\t\t\t\tf = Permit.getConstructor(Modifier.class, AST.class);\n\t\t\t\tg = Permit.getConstructor(MarkerAnnotation.class, AST.class);\n\t\t\t\tClass<?> z = Class.forName(\"org.eclipse.jdt.core.dom.ASTConverter\");\n\t\t\t\th = Permit.getMethod(z, \"recordNodes\", org.eclipse.jdt.core.dom.ASTNode.class, org.eclipse.jdt.internal.compiler.ast.ASTNode.class);\n\t\t\t} catch (Throwable t) {\n\t\t\t\t// Most likely we're in ecj or some other plugin usage of the eclipse compiler. No need for this.\n\t\t\t}\n\t\t\t\n\t\t\tinitCopyField = a;\n\t\t\titerableCopyField = b;\n\t\t\tastStackField = c;\n\t\t\tastPtrField = d;\n\t\t\tmodifierConstructor = f;\n\t\t\tmarkerAnnotationConstructor = g;\n\t\t\tastConverterRecordNodes = h;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/eclipseAgent/lombok/eclipse/agent/PatchValEclipsePortal.java",
    "content": "/*\n * Copyright (C) 2011 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.agent;\n\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\n\nimport lombok.Lombok;\n\npublic class PatchValEclipsePortal {\n\tstatic final String LOCALDECLARATION_SIG = \"org.eclipse.jdt.internal.compiler.ast.LocalDeclaration\";\n\tstatic final String PARSER_SIG = \"org.eclipse.jdt.internal.compiler.parser.Parser\";\n\tstatic final String VARIABLEDECLARATIONSTATEMENT_SIG = \"org.eclipse.jdt.core.dom.VariableDeclarationStatement\";\n\tstatic final String SINGLEVARIABLEDECLARATION_SIG = \"org.eclipse.jdt.core.dom.SingleVariableDeclaration\";\n\tstatic final String ASTCONVERTER_SIG = \"org.eclipse.jdt.core.dom.ASTConverter\";\n\t\n\tpublic static void copyInitializationOfForEachIterable(Object parser) {\n\t\ttry {\n\t\t\tReflection.copyInitializationOfForEachIterable.invoke(null, parser);\n\t\t} catch (NoClassDefFoundError e) {\n\t\t\t//ignore, we don't have access to the correct ECJ classes, so lombok can't possibly\n\t\t\t//do anything useful here.\n\t\t} catch (IllegalAccessException e) {\n\t\t\tthrow Lombok.sneakyThrow(e);\n\t\t} catch (InvocationTargetException e) {\n\t\t\tthrow Lombok.sneakyThrow(e.getCause());\n\t\t} catch (NullPointerException e) {\n\t\t\tif (!\"false\".equals(System.getProperty(\"lombok.debug.reflection\", \"false\"))) {\n\t\t\t\te.initCause(Reflection.problem);\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\t//ignore, we don't have access to the correct ECJ classes, so lombok can't possibly\n\t\t\t//do anything useful here.\n\t\t}\n\t}\n\t\n\tpublic static void copyInitializationOfLocalDeclaration(Object parser) {\n\t\ttry {\n\t\t\tReflection.copyInitializationOfLocalDeclaration.invoke(null, parser);\n\t\t} catch (NoClassDefFoundError e) {\n\t\t\t//ignore, we don't have access to the correct ECJ classes, so lombok can't possibly\n\t\t\t//do anything useful here.\n\t\t} catch (IllegalAccessException e) {\n\t\t\tthrow Lombok.sneakyThrow(e);\n\t\t} catch (InvocationTargetException e) {\n\t\t\tthrow Lombok.sneakyThrow(e.getCause());\n\t\t} catch (NullPointerException e) {\n\t\t\tif (!\"false\".equals(System.getProperty(\"lombok.debug.reflection\", \"false\"))) {\n\t\t\t\te.initCause(Reflection.problem);\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\t//ignore, we don't have access to the correct ECJ classes, so lombok can't possibly\n\t\t\t//do anything useful here.\n\t\t}\n\t}\n\t\n\tpublic static void addFinalAndValAnnotationToVariableDeclarationStatement(Object converter, Object out, Object in) {\n\t\ttry {\n\t\t\tReflection.addFinalAndValAnnotationToVariableDeclarationStatement.invoke(null, converter, out, in);\n\t\t} catch (NoClassDefFoundError e) {\n\t\t\t//ignore, we don't have access to the correct ECJ classes, so lombok can't possibly\n\t\t\t//do anything useful here.\n\t\t} catch (IllegalAccessException e) {\n\t\t\tthrow Lombok.sneakyThrow(e);\n\t\t} catch (InvocationTargetException e) {\n\t\t\tthrow Lombok.sneakyThrow(e.getCause());\n\t\t} catch (NullPointerException e) {\n\t\t\tif (!\"false\".equals(System.getProperty(\"lombok.debug.reflection\", \"false\"))) {\n\t\t\t\te.initCause(Reflection.problem);\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\t//ignore, we don't have access to the correct ECJ classes, so lombok can't possibly\n\t\t\t//do anything useful here.\n\t\t}\n\t}\n\t\n\tpublic static void addFinalAndValAnnotationToSingleVariableDeclaration(Object converter, Object out, Object in) {\n\t\ttry {\n\t\t\tReflection.addFinalAndValAnnotationToSingleVariableDeclaration.invoke(null, converter, out, in);\n\t\t} catch (NoClassDefFoundError e) {\n\t\t\t//ignore, we don't have access to the correct ECJ classes, so lombok can't possibly\n\t\t\t//do anything useful here.\n\t\t} catch (IllegalAccessException e) {\n\t\t\tthrow Lombok.sneakyThrow(e);\n\t\t} catch (InvocationTargetException e) {\n\t\t\tthrow Lombok.sneakyThrow(e.getCause());\n\t\t} catch (NullPointerException e) {\n\t\t\tif (!\"false\".equals(System.getProperty(\"lombok.debug.reflection\", \"false\"))) {\n\t\t\t\te.initCause(Reflection.problem);\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\t//ignore, we don't have access to the correct ECJ classes, so lombok can't possibly\n\t\t\t//do anything useful here. \n\t\t}\n\t}\n\t\n\tprivate static final class Reflection {\n\t\tpublic static final Method copyInitializationOfForEachIterable;\n\t\tpublic static final Method copyInitializationOfLocalDeclaration;\n\t\tpublic static final Method addFinalAndValAnnotationToVariableDeclarationStatement;\n\t\tpublic static final Method addFinalAndValAnnotationToSingleVariableDeclaration;\n\t\tpublic static final Throwable problem;\n\t\t\n\t\tstatic {\n\t\t\tMethod m = null, n = null, o = null, p = null;\n\t\t\tThrowable problem_ = null;\n\t\t\ttry {\n\t\t\t\tm = PatchValEclipse.class.getMethod(\"copyInitializationOfForEachIterable\", Class.forName(PARSER_SIG));\n\t\t\t\tn = PatchValEclipse.class.getMethod(\"copyInitializationOfLocalDeclaration\", Class.forName(PARSER_SIG));\n\t\t\t\to = PatchValEclipse.class.getMethod(\"addFinalAndValAnnotationToVariableDeclarationStatement\",\n\t\t\t\t\t\tObject.class,\n\t\t\t\t\t\tClass.forName(VARIABLEDECLARATIONSTATEMENT_SIG),\n\t\t\t\t\t\tClass.forName(LOCALDECLARATION_SIG));\n\t\t\t\tp = PatchValEclipse.class.getMethod(\"addFinalAndValAnnotationToSingleVariableDeclaration\",\n\t\t\t\t\t\tObject.class,\n\t\t\t\t\t\tClass.forName(SINGLEVARIABLEDECLARATION_SIG),\n\t\t\t\t\t\tClass.forName(LOCALDECLARATION_SIG));\n\t\t\t} catch (Throwable t) {\n\t\t\t\t// That's problematic, but as long as no local classes are used we don't actually need it.\n\t\t\t\t// Better fail on local classes than crash altogether.\n\t\t\t\tproblem_ = t;\n\t\t\t}\n\t\t\tcopyInitializationOfForEachIterable = m;\n\t\t\tcopyInitializationOfLocalDeclaration = n;\n\t\t\taddFinalAndValAnnotationToVariableDeclarationStatement = o;\n\t\t\taddFinalAndValAnnotationToSingleVariableDeclaration = p;\n\t\t\tproblem = problem_;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/eclipseAgent/lombok/eclipse/agent/package-info.java",
    "content": "/*\n * Copyright (C) 2009 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/**\n * Contains the mechanism that instruments eclipse by being loaded as a javaagent.\n */\npackage lombok.eclipse.agent;\n"
  },
  {
    "path": "src/eclipseAgent/lombok/launch/PatchFixesHider.java",
    "content": "/*\n * Copyright (C) 2010-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.launch;\n\nimport static lombok.eclipse.EcjAugments.*;\nimport static lombok.eclipse.Eclipse.*;\n\nimport java.io.BufferedOutputStream;\nimport java.io.IOException;\nimport java.io.OutputStream;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\nimport java.security.CodeSource;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Stack;\n\nimport org.eclipse.core.runtime.CoreException;\nimport org.eclipse.jdt.core.IAnnotatable;\nimport org.eclipse.jdt.core.IAnnotation;\nimport org.eclipse.jdt.core.IJavaElement;\nimport org.eclipse.jdt.core.IMethod;\nimport org.eclipse.jdt.core.ISourceRange;\nimport org.eclipse.jdt.core.IType;\nimport org.eclipse.jdt.core.JavaModelException;\nimport org.eclipse.jdt.core.dom.AST;\nimport org.eclipse.jdt.core.dom.ASTNode;\nimport org.eclipse.jdt.core.dom.CompilationUnit;\nimport org.eclipse.jdt.core.dom.IMethodBinding;\nimport org.eclipse.jdt.core.dom.MethodDeclaration;\nimport org.eclipse.jdt.core.dom.Name;\nimport org.eclipse.jdt.core.dom.NodeFinder;\nimport org.eclipse.jdt.core.dom.ReturnStatement;\nimport org.eclipse.jdt.core.dom.SimpleName;\nimport org.eclipse.jdt.core.dom.SingleVariableDeclaration;\nimport org.eclipse.jdt.core.dom.Type;\nimport org.eclipse.jdt.core.search.SearchMatch;\nimport org.eclipse.jdt.internal.compiler.ISourceElementRequestor.FieldInfo;\nimport org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.lookup.BlockScope;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeBinding;\nimport org.eclipse.jdt.internal.compiler.parser.Parser;\nimport org.eclipse.jdt.internal.core.CompilationUnitStructureRequestor;\nimport org.eclipse.jdt.internal.core.SourceField;\nimport org.eclipse.jdt.internal.core.SourceFieldElementInfo;\nimport org.eclipse.jdt.internal.core.dom.rewrite.NodeRewriteEvent;\nimport org.eclipse.jdt.internal.core.dom.rewrite.RewriteEvent;\nimport org.eclipse.jdt.internal.core.dom.rewrite.TokenScanner;\nimport org.eclipse.jdt.internal.corext.refactoring.SearchResultGroup;\nimport org.eclipse.jdt.internal.corext.refactoring.code.CallContext;\nimport org.eclipse.jdt.internal.corext.refactoring.code.SourceProvider;\nimport org.eclipse.jdt.internal.corext.refactoring.structure.MemberVisibilityAdjustor.IncomingMemberVisibilityAdjustment;\n\nimport lombok.eclipse.handlers.EclipseHandlerUtil;\nimport lombok.permit.Permit;\n\n/** These contain a mix of the following:\n * <ul>\n * <li> 'dependency free' method wrappers that cross the shadowloader barrier.\n * <li> methods that directly patch, <em>but</em>, these should ALWAYS be transplanted.\n * </ul>\n * \n * <strong>This class lives on the outside of the shadowloader barrier, and as a consequence, cannot access any other lombok code except other\n * code in the {@code lombok.launch} package!</strong>.\n * <p>\n * This class is package private with lots of public inner static classes. This hides all of them from IDE autocomplete dialogs and such but at the JVM\n * level the inner static class are just plain public, which is important, because calls to the contents of these inner static classes are injected into\n * various eclipse classes verbatim, and if they weren't public, the verifier wouldn't accept it.\n */\nfinal class PatchFixesHider {\n\t\n\t/** These utility methods are only used 'internally', but because of transplant methods, the class (and its methods) still have to be public! */\n\tpublic static final class Util {\n\t\tprivate static ClassLoader shadowLoader;\n\t\t\n\t\tpublic static ClassLoader getShadowLoader() {\n\t\t\tif (shadowLoader == null) {\n\t\t\t\ttry {\n\t\t\t\t\tClass.forName(\"lombok.core.LombokNode\");\n\t\t\t\t\t// If we get here, then lombok is already available.\n\t\t\t\t\tshadowLoader = Util.class.getClassLoader();\n\t\t\t\t} catch (ClassNotFoundException e) {\n\t\t\t\t\t// If we get here, it isn't, and we should use the shadowloader.\n\t\t\t\t\tshadowLoader = Main.getShadowClassLoader();\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn shadowLoader;\n\t\t}\n\t\t\n\t\tpublic static Class<?> shadowLoadClass(String name) {\n\t\t\ttry {\n\t\t\t\treturn Class.forName(name, true, getShadowLoader());\n\t\t\t} catch (ClassNotFoundException e) {\n\t\t\t\tthrow sneakyThrow(e);\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic static Method findMethod(Class<?> type, String name, Class<?>... parameterTypes) {\n\t\t\ttry {\n\t\t\t\treturn type.getDeclaredMethod(name, parameterTypes);\n\t\t\t} catch (NoSuchMethodException e) {\n\t\t\t\tthrow sneakyThrow(e);\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic static Method findMethod(Class<?> type, String name, String... parameterTypes) {\n\t\t\tfor (Method m : type.getDeclaredMethods()) {\n\t\t\t\tif (name.equals(m.getName()) && sameTypes(m.getParameterTypes(), parameterTypes)) {\n\t\t\t\t\treturn m;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow sneakyThrow(new NoSuchMethodException(type.getName() + \"::\" + name));\n\t\t}\n\t\t\n\t\tpublic static Method findMethodAnyArgs(Class<?> type, String name) {\n\t\t\tfor (Method m : type.getDeclaredMethods()) if (name.equals(m.getName())) return m;\n\t\t\tthrow sneakyThrow(new NoSuchMethodException(type.getName() + \"::\" + name));\n\t\t}\n\t\t\n\t\tpublic static Object invokeMethod(Method method, Object... args) {\n\t\t\ttry {\n\t\t\t\treturn method.invoke(null, args);\n\t\t\t} catch (IllegalAccessException e) {\n\t\t\t\tthrow sneakyThrow(e);\n\t\t\t} catch (InvocationTargetException e) {\n\t\t\t\tthrow sneakyThrow(e.getCause());\n\t\t\t}\n\t\t}\n\t\t\n\t\tprivate static RuntimeException sneakyThrow(Throwable t) {\n\t\t\tif (t == null) throw new NullPointerException(\"t\");\n\t\t\tUtil.<RuntimeException>sneakyThrow0(t);\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\t@SuppressWarnings(\"unchecked\")\n\t\tprivate static <T extends Throwable> void sneakyThrow0(Throwable t) throws T {\n\t\t\tthrow (T)t;\n\t\t}\n\t\t\n\t\tprivate static boolean sameTypes(Class<?>[] types, String[] typeNames) {\n\t\t\tif (types.length != typeNames.length) return false;\n\t\t\tfor (int i = 0; i < types.length; i++) {\n\t\t\t\tif (!types[i].getName().equals(typeNames[i])) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\tprivate static void prependToClassLoader(ClassLoader currentClassLoader, ClassLoader prepend) {\n\t\t\ttry {\n\t\t\t\tMethod prependParentMethod = Permit.getMethod(currentClassLoader.getClass(), \"prependParent\", ClassLoader.class);\n\t\t\t\tPermit.invoke(prependParentMethod, currentClassLoader, prepend);\n\t\t\t} catch (Throwable t) {\n\t\t\t\t// Ignore\n\t\t\t}\n\t\t}\n\t\t\n\t\tprivate static ClassLoader findJdtCoreClassLoader(ClassLoader classLoader) {\n\t\t\ttry {\n\t\t\t\tMethod getBundleMethod = Permit.getMethod(classLoader.getClass(), \"getBundle\");\n\t\t\t\tObject bundle = Permit.invoke(getBundleMethod, classLoader);\n\t\t\t\t\n\t\t\t\tMethod getBundleContextMethod = Permit.getMethod(bundle.getClass(), \"getBundleContext\");\n\t\t\t\tObject bundleContext = Permit.invoke(getBundleContextMethod, bundle);\n\t\t\t\t\n\t\t\t\tMethod getBundlesMethod = Permit.getMethod(bundleContext.getClass(), \"getBundles\");\n\t\t\t\tObject[] bundles = (Object[]) Permit.invoke(getBundlesMethod, bundleContext);\n\t\t\t\t\n\t\t\t\tfor (Object searchBundle : bundles) {\n\t\t\t\t\tif (searchBundle.toString().startsWith(\"org.eclipse.jdt.core_\")) {\n\t\t\t\t\t\tMethod getModuleClassLoaderMethod = Permit.getMethod(searchBundle.getClass(), \"getModuleClassLoader\", boolean.class);\n\t\t\t\t\t\treturn (ClassLoader) Permit.invoke(getModuleClassLoaderMethod, searchBundle, false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (Throwable t) {\n\t\t\t\t// Ignore\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\t/** Contains patch fixes that are dependent on lombok internals. */\n\tpublic static final class LombokDeps {\n\t\tpublic static final Method ADD_LOMBOK_NOTES;\n\t\tpublic static final Method POST_COMPILER_BYTES_STRING;\n\t\tpublic static final Method POST_COMPILER_OUTPUTSTREAM;\n\t\tpublic static final Method POST_COMPILER_BUFFEREDOUTPUTSTREAM_STRING_STRING;\n\t\t\n\t\tstatic {\n\t\t\tClass<?> shadowed = Util.shadowLoadClass(\"lombok.eclipse.agent.PatchFixesShadowLoaded\");\n\t\t\tADD_LOMBOK_NOTES = Util.findMethod(shadowed, \"addLombokNotesToEclipseAboutDialog\", String.class, String.class);\n\t\t\tPOST_COMPILER_BYTES_STRING = Util.findMethod(shadowed, \"runPostCompiler\", byte[].class, String.class);\n\t\t\tPOST_COMPILER_OUTPUTSTREAM = Util.findMethod(shadowed, \"runPostCompiler\", OutputStream.class);\n\t\t\tPOST_COMPILER_BUFFEREDOUTPUTSTREAM_STRING_STRING = Util.findMethod(shadowed, \"runPostCompiler\", BufferedOutputStream.class, String.class, String.class);\n\t\t}\n\t\t\n\t\tpublic static String addLombokNotesToEclipseAboutDialog(String origReturnValue, String key) {\n\t\t\ttry {\n\t\t\t\treturn (String) Util.invokeMethod(LombokDeps.ADD_LOMBOK_NOTES, origReturnValue, key);\n\t\t\t} catch (Throwable t) {\n\t\t\t\treturn origReturnValue;\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic static byte[] runPostCompiler(byte[] bytes, String fileName) {\n\t\t\treturn (byte[]) Util.invokeMethod(LombokDeps.POST_COMPILER_BYTES_STRING, bytes, fileName);\n\t\t}\n\t\t\n\t\tpublic static OutputStream runPostCompiler(OutputStream out) throws IOException {\n\t\t\treturn (OutputStream) Util.invokeMethod(LombokDeps.POST_COMPILER_OUTPUTSTREAM, out);\n\t\t}\n\t\t\n\t\tpublic static BufferedOutputStream runPostCompiler(BufferedOutputStream out, String path, String name) throws IOException {\n\t\t\treturn (BufferedOutputStream) Util.invokeMethod(LombokDeps.POST_COMPILER_BUFFEREDOUTPUTSTREAM_STRING_STRING, out, path, name);\n\t\t}\n\t}\n\t\n\tpublic static final class ModuleClassLoading {\n\t\tpublic static void parserClinit() {\n\t\t\tClassLoader jdtCoreClassLoader = Util.findJdtCoreClassLoader(Parser.class.getClassLoader());\n\t\t\tClassLoader currentClassLoader = ModuleClassLoading.class.getClassLoader();\n\t\t\tUtil.prependToClassLoader(currentClassLoader, jdtCoreClassLoader);\n\t\t}\n\t}\n\t\n\tpublic static final class Transform {\n\t\tprivate static Method TRANSFORM;\n\t\tprivate static Method TRANSFORM_SWAPPED;\n\t\t\n\t\tprivate static synchronized void init(ClassLoader prepend) {\n\t\t\tif (TRANSFORM != null) return;\n\t\t\t\n\t\t\tMain.prependClassLoader(prepend);\n\t\t\tClassLoader currentClassLoader = Transform.class.getClassLoader();\n\t\t\tUtil.prependToClassLoader(currentClassLoader, prepend);\n\t\t\tClass<?> shadowed = Util.shadowLoadClass(\"lombok.eclipse.TransformEclipseAST\");\n\t\t\tTRANSFORM = Util.findMethodAnyArgs(shadowed, \"transform\");\n\t\t\tTRANSFORM_SWAPPED = Util.findMethodAnyArgs(shadowed, \"transform_swapped\");\n\t\t}\n\t\t\n\t\tpublic static void transform(Object parser, Object ast) throws IOException {\n\t\t\tinit(parser.getClass().getClassLoader());\n\t\t\tUtil.invokeMethod(TRANSFORM, parser, ast);\n\t\t}\n\t\t\n\t\tpublic static void transform_swapped(Object ast, Object parser) throws IOException {\n\t\t\tinit(parser.getClass().getClassLoader());\n\t\t\tUtil.invokeMethod(TRANSFORM_SWAPPED, ast, parser);\n\t\t}\n\t}\n\t\n\t/** Contains patch code to support {@code @Delegate} */\n\tpublic static final class Delegate {\n\t\tprivate static final Method HANDLE_DELEGATE_FOR_TYPE;\n\t\tprivate static final Method ADD_GENERATED_DELEGATE_METHODS;\n\t\tpublic static final Method IS_DELEGATE_SOURCE_METHOD;\n\t\tpublic static final Method RETURN_ELEMENT_INFO;\n\t\t\n\t\tstatic {\n\t\t\tClass<?> shadowedPortal = Util.shadowLoadClass(\"lombok.eclipse.agent.PatchDelegatePortal\");\n\t\t\tHANDLE_DELEGATE_FOR_TYPE = Util.findMethod(shadowedPortal, \"handleDelegateForType\", Object.class);\n\t\t\tADD_GENERATED_DELEGATE_METHODS = Util.findMethod(shadowedPortal, \"addGeneratedDelegateMethods\", Object.class, Object.class);\n\t\t\tClass<?> shadowed = Util.shadowLoadClass(\"lombok.eclipse.agent.PatchDelegate\");\n\t\t\tIS_DELEGATE_SOURCE_METHOD = Util.findMethod(shadowed, \"isDelegateSourceMethod\", Object.class);\n\t\t\tRETURN_ELEMENT_INFO = Util.findMethod(shadowed, \"returnElementInfo\", Object.class);\n\t\t}\n\t\t\n\t\tpublic static boolean handleDelegateForType(Object classScope) {\n\t\t\treturn (Boolean) Util.invokeMethod(HANDLE_DELEGATE_FOR_TYPE, classScope);\n\t\t}\n\t\t\n\t\tpublic static Object[] addGeneratedDelegateMethods(Object returnValue, Object javaElement) {\n\t\t\treturn (Object[]) Util.invokeMethod(ADD_GENERATED_DELEGATE_METHODS, returnValue, javaElement);\n\t\t}\n\t\t\n\t\tpublic static boolean isDelegateSourceMethod(Object sourceMethod) {\n\t\t\treturn (Boolean) Util.invokeMethod(IS_DELEGATE_SOURCE_METHOD, sourceMethod);\n\t\t}\n\t\t\n\t\tpublic static Object returnElementInfo(Object delegateSourceMethod) {\n\t\t\treturn Util.invokeMethod(RETURN_ELEMENT_INFO, delegateSourceMethod);\n\t\t}\n\t}\n\t\n\t/** Contains patch code to support {@code val} (eclipse specific) */\n\tpublic static final class ValPortal {\n\t\tprivate static final Method COPY_INITIALIZATION_OF_FOR_EACH_ITERABLE;\n\t\tprivate static final Method COPY_INITIALIZATION_OF_LOCAL_DECLARATION;\n\t\tprivate static final Method ADD_FINAL_AND_VAL_ANNOTATION_TO_VARIABLE_DECLARATION_STATEMENT;\n\t\tprivate static final Method ADD_FINAL_AND_VAL_ANNOTATION_TO_SINGLE_VARIABLE_DECLARATION;\n\t\t\n\t\tstatic {\n\t\t\tClass<?> shadowed = Util.shadowLoadClass(\"lombok.eclipse.agent.PatchValEclipsePortal\");\n\t\t\tCOPY_INITIALIZATION_OF_FOR_EACH_ITERABLE = Util.findMethod(shadowed, \"copyInitializationOfForEachIterable\", Object.class);\n\t\t\tCOPY_INITIALIZATION_OF_LOCAL_DECLARATION = Util.findMethod(shadowed, \"copyInitializationOfLocalDeclaration\", Object.class);\n\t\t\tADD_FINAL_AND_VAL_ANNOTATION_TO_VARIABLE_DECLARATION_STATEMENT = Util.findMethod(shadowed, \"addFinalAndValAnnotationToVariableDeclarationStatement\", Object.class, Object.class, Object.class);\n\t\t\tADD_FINAL_AND_VAL_ANNOTATION_TO_SINGLE_VARIABLE_DECLARATION = Util.findMethod(shadowed, \"addFinalAndValAnnotationToSingleVariableDeclaration\", Object.class, Object.class, Object.class);\n\t\t}\n\n\t\tpublic static void copyInitializationOfForEachIterable(Object parser) {\n\t\t\tUtil.invokeMethod(COPY_INITIALIZATION_OF_FOR_EACH_ITERABLE, parser);\n\t\t}\n\t\t\n\t\tpublic static void copyInitializationOfLocalDeclaration(Object parser) {\n\t\t\tUtil.invokeMethod(COPY_INITIALIZATION_OF_LOCAL_DECLARATION, parser);\n\t\t}\n\t\t\n\t\tpublic static void addFinalAndValAnnotationToVariableDeclarationStatement(Object converter, Object out, Object in) {\n\t\t\tUtil.invokeMethod(ADD_FINAL_AND_VAL_ANNOTATION_TO_VARIABLE_DECLARATION_STATEMENT, converter, out, in);\n\t\t}\n\t\t\n\t\tpublic static void addFinalAndValAnnotationToSingleVariableDeclaration(Object converter, Object out, Object in) {\n\t\t\tUtil.invokeMethod(ADD_FINAL_AND_VAL_ANNOTATION_TO_SINGLE_VARIABLE_DECLARATION, converter, out, in);\n\t\t}\n\t}\n\t\n\t/** Contains patch code to support {@code val} (eclipse and ecj) */\n\tpublic static final class Val {\n\t\tprivate static final String BLOCK_SCOPE_SIG = \"org.eclipse.jdt.internal.compiler.lookup.BlockScope\";\n\t\tprivate static final String LOCAL_DECLARATION_SIG = \"org.eclipse.jdt.internal.compiler.ast.LocalDeclaration\";\n\t\tprivate static final String FOREACH_STATEMENT_SIG = \"org.eclipse.jdt.internal.compiler.ast.ForeachStatement\";\n\t\t\n\t\tprivate static final Method HANDLE_VAL_FOR_LOCAL_DECLARATION;\n\t\tprivate static final Method HANDLE_VAL_FOR_FOR_EACH;\n\t\t\n\t\tstatic {\n\t\t\tClass<?> shadowed = Util.shadowLoadClass(\"lombok.eclipse.agent.PatchVal\");\n\t\t\tHANDLE_VAL_FOR_LOCAL_DECLARATION = Util.findMethod(shadowed, \"handleValForLocalDeclaration\", LOCAL_DECLARATION_SIG, BLOCK_SCOPE_SIG);\n\t\t\tHANDLE_VAL_FOR_FOR_EACH = Util.findMethod(shadowed, \"handleValForForEach\", FOREACH_STATEMENT_SIG, BLOCK_SCOPE_SIG);\n\t\t}\n\t\t\n\t\tpublic static boolean handleValForLocalDeclaration(Object local, Object scope) {\n\t\t\treturn (Boolean) Util.invokeMethod(HANDLE_VAL_FOR_LOCAL_DECLARATION, local, scope);\n\t\t}\n\t\t\n\t\tpublic static boolean handleValForForEach(Object forEach, Object scope) {\n\t\t\treturn (Boolean) Util.invokeMethod(HANDLE_VAL_FOR_FOR_EACH, forEach, scope);\n\t\t}\n\t\t\n\t\t/** \n\t\t * Patches local declaration to not call .resolveType() on the initializer expression if we've already done so (calling it twice causes weird errors) \n\t\t * This and the next method must be transplanted so that the return type is loaded in the correct class loader\n\t\t */\n\t\tpublic static TypeBinding skipResolveInitializerIfAlreadyCalled(Expression expr, BlockScope scope) {\n\t\t\tif (expr.resolvedType != null) return expr.resolvedType;\n\t\t\ttry {\n\t\t\t\treturn expr.resolveType(scope);\n\t\t\t} catch (NullPointerException e) {\n\t\t\t\treturn null;\n\t\t\t} catch (ArrayIndexOutOfBoundsException e) {\n\t\t\t\t// This will occur internally due to for example 'val x = mth(\"X\");', where mth takes 2 arguments.\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic static TypeBinding skipResolveInitializerIfAlreadyCalled2(Expression expr, BlockScope scope, LocalDeclaration decl) {\n\t\t\tif (decl != null && LocalDeclaration.class.equals(decl.getClass()) && expr.resolvedType != null) return expr.resolvedType;\n\t\t\ttry {\n\t\t\t\treturn expr.resolveType(scope);\n\t\t\t} catch (NullPointerException e) {\n\t\t\t\treturn null;\n\t\t\t} catch (ArrayIndexOutOfBoundsException e) {\n\t\t\t\t// This will occur internally due to for example 'val x = mth(\"X\");', where mth takes 2 arguments.\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/** Contains patch code to support {@code @ExtensionMethod} */\n\tpublic static final class ExtensionMethod {\n\t\tprivate static final String MESSAGE_SEND_SIG = \"org.eclipse.jdt.internal.compiler.ast.MessageSend\";\n\t\tprivate static final String TYPE_BINDING_SIG = \"org.eclipse.jdt.internal.compiler.lookup.TypeBinding\";\n\t\tprivate static final String SCOPE_SIG = \"org.eclipse.jdt.internal.compiler.lookup.Scope\";\n\t\tprivate static final String BLOCK_SCOPE_SIG = \"org.eclipse.jdt.internal.compiler.lookup.BlockScope\";\n\t\tprivate static final String TYPE_BINDINGS_SIG = \"[Lorg.eclipse.jdt.internal.compiler.lookup.TypeBinding;\";\n\t\tprivate static final String PROBLEM_REPORTER_SIG = \"org.eclipse.jdt.internal.compiler.problem.ProblemReporter\";\n\t\tprivate static final String METHOD_BINDING_SIG = \"org.eclipse.jdt.internal.compiler.lookup.MethodBinding\";\n\t\tprivate static final String AST_NODE_SIG = \"org.eclipse.jdt.internal.compiler.ast.ASTNode\";\n\t\t\n\t\tprivate static final Method RESOLVE_TYPE;\n\t\tprivate static final Method ERROR_NO_METHOD_FOR;\n\t\tprivate static final Method INVALID_METHOD, INVALID_METHOD2;\n\t\tprivate static final Method NON_STATIC_ACCESS_TO_STATIC_METHOD;\n\t\tprivate static final Method MODIFY_METHOD_PATTERN;\n\t\t\n\t\tstatic {\n\t\t\tClass<?> shadowed = Util.shadowLoadClass(\"lombok.eclipse.agent.PatchExtensionMethod\");\n\t\t\tRESOLVE_TYPE = Util.findMethod(shadowed, \"resolveType\", TYPE_BINDING_SIG, MESSAGE_SEND_SIG, BLOCK_SCOPE_SIG);\n\t\t\tERROR_NO_METHOD_FOR = Util.findMethod(shadowed, \"errorNoMethodFor\", PROBLEM_REPORTER_SIG, MESSAGE_SEND_SIG, TYPE_BINDING_SIG, TYPE_BINDINGS_SIG);\n\t\t\tINVALID_METHOD = Util.findMethod(shadowed, \"invalidMethod\", PROBLEM_REPORTER_SIG, MESSAGE_SEND_SIG, METHOD_BINDING_SIG);\n\t\t\tINVALID_METHOD2 = Util.findMethod(shadowed, \"invalidMethod\", PROBLEM_REPORTER_SIG, MESSAGE_SEND_SIG, METHOD_BINDING_SIG, SCOPE_SIG);\n\t\t\tNON_STATIC_ACCESS_TO_STATIC_METHOD = Util.findMethod(shadowed, \"nonStaticAccessToStaticMethod\", PROBLEM_REPORTER_SIG, AST_NODE_SIG, METHOD_BINDING_SIG, MESSAGE_SEND_SIG);\n\t\t\tMODIFY_METHOD_PATTERN = Util.findMethod(shadowed, \"modifyMethodPattern\", Object.class);\n\t\t}\n\t\t\n\t\tpublic static Object resolveType(Object resolvedType, Object methodCall, Object scope) {\n\t\t\treturn Util.invokeMethod(RESOLVE_TYPE, resolvedType, methodCall, scope);\n\t\t}\n\t\t\n\t\tpublic static void errorNoMethodFor(Object problemReporter, Object messageSend, Object recType, Object params) {\n\t\t\tUtil.invokeMethod(ERROR_NO_METHOD_FOR, problemReporter, messageSend, recType, params);\n\t\t}\n\t\t\n\t\tpublic static void invalidMethod(Object problemReporter, Object messageSend, Object method) {\n\t\t\tUtil.invokeMethod(INVALID_METHOD, problemReporter, messageSend, method);\n\t\t}\n\t\t\n\t\tpublic static void invalidMethod(Object problemReporter, Object messageSend, Object method, Object scope) {\n\t\t\tUtil.invokeMethod(INVALID_METHOD2, problemReporter, messageSend, method, scope);\n\t\t}\n\t\t\n\t\tpublic static void nonStaticAccessToStaticMethod(Object problemReporter, Object location, Object method, Object messageSend) {\n\t\t\tUtil.invokeMethod(NON_STATIC_ACCESS_TO_STATIC_METHOD, problemReporter, location, method, messageSend);\n\t\t}\n\t\t\n\t\tpublic static Object modifyMethodPattern(Object original) {\n\t\t\treturn Util.invokeMethod(MODIFY_METHOD_PATTERN, original);\n\t\t}\n\t}\n\t\n\t/** Contains patch code to support Javadoc for generated methods */\n\tpublic static final class Javadoc {\n\t\tprivate static final Method GET_HTML;\n\t\t\n\t\tstatic {\n\t\t\tClass<?> shadowed = Util.shadowLoadClass(\"lombok.eclipse.agent.PatchJavadoc\");\n\t\t\tGET_HTML = Util.findMethod(shadowed, \"getHTMLContentFromSource\", Object.class, String.class, Object.class);\n\t\t}\n\t\t\n\t\tpublic static String getHTMLContentFromSource(String original, IJavaElement member) {\n\t\t\treturn (String) Util.invokeMethod(GET_HTML, null, original, member);\n\t\t}\n\t\t\n\t\tpublic static String getHTMLContentFromSource(String original, Object instance, IJavaElement member) {\n\t\t\treturn (String) Util.invokeMethod(GET_HTML, instance, original, member);\n\t\t}\n\t}\n\t\n\t/**\n\t * Contains a mix of methods: ecj only, ecj+eclipse, and eclipse only. As a consequence, _EVERY_ method from here used for ecj MUST be\n\t * transplanted, as ecj itself cannot load this class (signatures refer to things that don't exist in ecj-only mode).\n\t * <p>\n\t * Because of usage of transplant(), a bunch of these contain direct code and don't try to cross the shadowloader barrier.\n\t */\n\tpublic static final class PatchFixes {\n\t\tpublic static boolean isGenerated(org.eclipse.jdt.core.dom.ASTNode node) {\n\t\t\tboolean result = false;\n\t\t\ttry {\n\t\t\t\tresult = ((Boolean)node.getClass().getField(\"$isGenerated\").get(node)).booleanValue();\n\t\t\t\tif (!result && node.getParent() != null && node.getParent() instanceof org.eclipse.jdt.core.dom.QualifiedName) {\n\t\t\t\t\tresult = isGenerated(node.getParent());\n\t\t\t\t}\n\t\t\t} catch (Exception e) {\n\t\t\t\t// better to assume it isn't generated\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t\t\n\t\tpublic static boolean isGenerated(org.eclipse.jdt.internal.compiler.ast.ASTNode node) {\n\t\t\tboolean result = false;\n\t\t\ttry {\n\t\t\t\tresult = node.getClass().getField(\"$generatedBy\").get(node) != null;\n\t\t\t} catch (Exception e) {\n\t\t\t\t// better to assume it isn't generated\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t\t\n\t\tpublic static boolean isGenerated(org.eclipse.jdt.core.IMember member) {\n\t\t\tboolean result = false;\n\t\t\ttry {\n\t\t\t\tresult = member.getNameRange().getLength() <= 0 || member.getNameRange().equals(member.getSourceRange());\n\t\t\t} catch (JavaModelException e) {\n\t\t\t\t// better to assume it isn't generated\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t\t\n\t\tpublic static boolean isBlockedVisitorAndGenerated(org.eclipse.jdt.core.dom.ASTNode node, org.eclipse.jdt.core.dom.ASTVisitor visitor) {\n\t\t\tif (visitor == null) return false;\n\t\t\t\n\t\t\tString className = visitor.getClass().getName();\n\t\t\tif (!(className.startsWith(\"org.eclipse.jdt.internal.corext.fix\") || className.startsWith(\"org.eclipse.jdt.internal.ui.fix\") || className.startsWith(\"org.eclipse.jdt.ls.core.internal.semantictokens.SemanticTokensVisitor\"))) return false;\n\t\t\tif (className.equals(\"org.eclipse.jdt.internal.corext.fix.VariableDeclarationFixCore$WrittenNamesFinder\")) return false;\n\t\t\t\n\t\t\treturn isGenerated(node);\n\t\t}\n\t\t\n\t\tpublic static boolean isListRewriteOnGeneratedNode(org.eclipse.jdt.core.dom.rewrite.ListRewrite rewrite) {\n\t\t\treturn isGenerated(rewrite.getParent());\n\t\t}\n\t\t\n\t\tpublic static boolean returnFalse(java.lang.Object object) {\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tpublic static boolean returnTrue(java.lang.Object object) {\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\t@java.lang.SuppressWarnings({\"unchecked\", \"rawtypes\"}) public static java.util.List removeGeneratedNodes(java.util.List list) {\n\t\t\ttry {\n\t\t\t\tjava.util.List realNodes = new java.util.ArrayList(list.size());\n\t\t\t\tfor (java.lang.Object node : list) {\n\t\t\t\t\tif(!isGenerated(((org.eclipse.jdt.core.dom.ASTNode)node))) {\n\t\t\t\t\t\trealNodes.add(node);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn realNodes;\n\t\t\t} catch (Exception e) {\n\t\t\t}\n\t\t\treturn list;\n\t\t}\n\t\t\n\t\tpublic static java.lang.String getRealMethodDeclarationSource(java.lang.String original, Object processor, org.eclipse.jdt.core.dom.MethodDeclaration declaration) throws Exception {\n\t\t\tif (!isGenerated(declaration)) return original;\n\t\t\t\n\t\t\tList<org.eclipse.jdt.core.dom.Annotation> annotations = new ArrayList<org.eclipse.jdt.core.dom.Annotation>();\n\t\t\tfor (Object modifier : declaration.modifiers()) {\n\t\t\t\tif (modifier instanceof org.eclipse.jdt.core.dom.Annotation) {\n\t\t\t\t\torg.eclipse.jdt.core.dom.Annotation annotation = (org.eclipse.jdt.core.dom.Annotation)modifier;\n\t\t\t\t\tString qualifiedAnnotationName = annotation.resolveTypeBinding().getQualifiedName();\n\t\t\t\t\tif (!\"java.lang.Override\".equals(qualifiedAnnotationName) && !\"java.lang.SuppressWarnings\".equals(qualifiedAnnotationName)) annotations.add(annotation);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tStringBuilder signature = new StringBuilder();\n\t\t\taddAnnotations(annotations, signature);\n\t\t\t\n\t\t\ttry {\n\t\t\t\tif ((Boolean)processor.getClass().getDeclaredField(\"fPublic\").get(processor)) signature.append(\"public \");\n\t\t\t\tif ((Boolean)processor.getClass().getDeclaredField(\"fAbstract\").get(processor)) signature.append(\"abstract \");\n\t\t\t} catch (Throwable t) { }\n\t\t\t\n\t\t\tsignature\n\t\t\t\t.append(declaration.getReturnType2().toString())\n\t\t\t\t.append(\" \").append(declaration.getName().getFullyQualifiedName())\n\t\t\t\t.append(\"(\");\n\t\t\t\n\t\t\tboolean first = true;\n\t\t\tfor (Object parameter : declaration.parameters()) {\n\t\t\t\tif (!first) signature.append(\", \");\n\t\t\t\tfirst = false;\n\t\t\t\t// We should also add the annotations of the parameters\n\t\t\t\tsignature.append(parameter);\n\t\t\t}\n\t\t\t\n\t\t\tsignature.append(\");\");\n\t\t\treturn signature.toString();\n\t\t}\n\t\t\n\t\t// part of getRealMethodDeclarationSource(...)\n\t\tpublic static void addAnnotations(List<org.eclipse.jdt.core.dom.Annotation> annotations, StringBuilder signature) {\n\t\t\t/*\n\t\t\t * We SHOULD be able to handle the following cases:\n\t\t\t * @Override\n\t\t\t * @Override()\n\t\t\t * @SuppressWarnings(\"all\")\n\t\t\t * @SuppressWarnings({\"all\", \"unused\"})\n\t\t\t * @SuppressWarnings(value = \"all\")\n\t\t\t * @SuppressWarnings(value = {\"all\", \"unused\"})\n\t\t\t * @EqualsAndHashCode(callSuper=true, of=\"id\")\n\t\t\t * \n\t\t\t * Currently, we only seem to correctly support:\n\t\t\t * @Override\n\t\t\t * @Override() N.B. We lose the parentheses here, since there are no values. No big deal.\n\t\t\t * @SuppressWarnings(\"all\")\n\t\t\t */\n\t\t\tfor (org.eclipse.jdt.core.dom.Annotation annotation : annotations) {\n\t\t\t\tList<String> values = new ArrayList<String>();\n\t\t\t\tif (annotation.isSingleMemberAnnotation()) {\n\t\t\t\t\torg.eclipse.jdt.core.dom.SingleMemberAnnotation smAnn = (org.eclipse.jdt.core.dom.SingleMemberAnnotation) annotation;\n\t\t\t\t\tvalues.add(smAnn.getValue().toString());\n\t\t\t\t} else if (annotation.isNormalAnnotation()) {\n\t\t\t\t\torg.eclipse.jdt.core.dom.NormalAnnotation normalAnn = (org.eclipse.jdt.core.dom.NormalAnnotation) annotation;\n\t\t\t\t\tfor (Object value : normalAnn.values()) values.add(value.toString());\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tsignature.append(\"@\").append(annotation.getTypeName().getFullyQualifiedName());\n\t\t\t\tif (!values.isEmpty()) {\n\t\t\t\t\tsignature.append(\"(\");\n\t\t\t\t\tboolean first = true;\n\t\t\t\t\tfor (String string : values) {\n\t\t\t\t\t\tif (!first) signature.append(\", \");\n\t\t\t\t\t\tfirst = false;\n\t\t\t\t\t\tsignature.append('\"').append(string).append('\"');\n\t\t\t\t\t}\n\t\t\t\t\tsignature.append(\")\");\n\t\t\t\t}\n\t\t\t\tsignature.append(\" \");\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic static org.eclipse.jdt.core.dom.MethodDeclaration getRealMethodDeclarationNode(org.eclipse.jdt.core.dom.MethodDeclaration original, org.eclipse.jdt.core.IMethod sourceMethod, org.eclipse.jdt.core.dom.CompilationUnit cuUnit) throws JavaModelException {\n\t\t\tif (!isGenerated(original)) return original;\n\t\t\t\n\t\t\tIType declaringType = sourceMethod.getDeclaringType();\n\t\t\tStack<IType> typeStack = new Stack<IType>();\n\t\t\twhile (declaringType != null) {\n\t\t\t\ttypeStack.push(declaringType);\n\t\t\t\tdeclaringType = declaringType.getDeclaringType();\n\t\t\t}\n\t\t\t\n\t\t\tIType rootType = typeStack.pop();\n\t\t\torg.eclipse.jdt.core.dom.AbstractTypeDeclaration typeDeclaration = findTypeDeclaration(rootType, cuUnit.types());\n\t\t\twhile (!typeStack.isEmpty() && typeDeclaration != null) {\n\t\t\t\ttypeDeclaration = findTypeDeclaration(typeStack.pop(), typeDeclaration.bodyDeclarations());\n\t\t\t}\n\t\t\t\n\t\t\tString targetMethodName = sourceMethod.getElementName();\n\t\t\tList<String> targetMethodParameterTypes = new ArrayList<String>();\n\t\t\tfor (String parameterType : sourceMethod.getParameterTypes()) {\n\t\t\t\ttargetMethodParameterTypes.add(org.eclipse.jdt.core.Signature.toString(parameterType));\n\t\t\t}\n\t\t\t\n\t\t\tif (typeStack.isEmpty() && typeDeclaration != null) {\n\t\t\t\tfor (Object declaration : typeDeclaration.bodyDeclarations()) {\n\t\t\t\t\tif (declaration instanceof org.eclipse.jdt.core.dom.MethodDeclaration) {\n\t\t\t\t\t\torg.eclipse.jdt.core.dom.MethodDeclaration methodDeclaration = (org.eclipse.jdt.core.dom.MethodDeclaration) declaration;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (!methodDeclaration.getName().toString().equals(targetMethodName)) continue;\n\t\t\t\t\t\tif (methodDeclaration.parameters().size() != targetMethodParameterTypes.size()) continue;\n\t\t\t\t\t\tif (!isGenerated(methodDeclaration)) continue;\n\t\t\t\t\t\t\n\t\t\t\t\t\tboolean parameterTypesEquals = true;\n\t\t\t\t\t\tfor (int i = 0; i < methodDeclaration.parameters().size(); i++) {\n\t\t\t\t\t\t\tSingleVariableDeclaration variableDeclaration = (SingleVariableDeclaration) methodDeclaration.parameters().get(i);\n\t\t\t\t\t\t\tif (!variableDeclaration.getType().toString().equals(targetMethodParameterTypes.get(i))) {\n\t\t\t\t\t\t\t\tparameterTypesEquals = false;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (parameterTypesEquals) {\n\t\t\t\t\t\t\treturn methodDeclaration;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn original;\n\t\t}\n\t\t\n\t\t// part of getRealMethodDeclarationNode\n\t\tpublic static org.eclipse.jdt.core.dom.AbstractTypeDeclaration findTypeDeclaration(IType searchType, List<?> nodes) {\n\t\t\tfor (Object object : nodes) {\n\t\t\t\tif (object instanceof org.eclipse.jdt.core.dom.AbstractTypeDeclaration) {\n\t\t\t\t\torg.eclipse.jdt.core.dom.AbstractTypeDeclaration typeDeclaration = (org.eclipse.jdt.core.dom.AbstractTypeDeclaration) object;\n\t\t\t\t\tif (typeDeclaration.getName().toString().equals(searchType.getElementName()))\n\t\t\t\t\t\treturn typeDeclaration;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\tpublic static int getSourceEndFixed(int sourceEnd, org.eclipse.jdt.internal.compiler.ast.ASTNode node) throws Exception {\n\t\t\tif (sourceEnd == -1) {\n\t\t\t\torg.eclipse.jdt.internal.compiler.ast.ASTNode object = (org.eclipse.jdt.internal.compiler.ast.ASTNode)node.getClass().getField(\"$generatedBy\").get(node);\n\t\t\t\tif (object != null) {\n\t\t\t\t\treturn object.sourceEnd;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn sourceEnd;\n\t\t}\n\t\t\n\t\tpublic static int fixRetrieveStartingCatchPosition(int original, int start) {\n\t\t\treturn original == -1 ? start : original;\n\t\t}\n\t\t\n\t\tpublic static int fixRetrieveIdentifierEndPosition(int original, int start, int end) {\n\t\t\tif (original == -1) return end;\n\t\t\tif (original < start) return end;\n\t\t\treturn original;\n\t\t}\n\t\t\n\t\tpublic static int fixRetrieveEllipsisStartPosition(int original, int end) {\n\t\t\treturn original == -1 ? end : original;\n\t\t}\n\t\t\n\t\tpublic static int fixRetrieveStartBlockPosition(int original, int start) {\n\t\t\treturn original == -1 ? start : original;\n\t\t}\n\t\t\n\t\tpublic static int fixRetrieveRightBraceOrSemiColonPosition(int original, int end) {\n//\t\t\tif (original == -1) {\n//\t\t\t\tThread.dumpStack();\n//\t\t\t}\n\t\t\t return original == -1 ? end : original;\n\t\t}\n\t\t\n\t\tpublic static int fixRetrieveRightBraceOrSemiColonPosition(int retVal, AbstractMethodDeclaration amd) {\n\t\t\tif (retVal != -1 || amd == null) return retVal;\n\t\t\tboolean isGenerated = ASTNode_generatedBy.get(amd) != null;\n\t\t\tif (isGenerated) return amd.declarationSourceEnd;\n\t\t\treturn -1;\n\t\t}\n\t\t\n\t\tpublic static int fixRetrieveRightBraceOrSemiColonPosition(int retVal, FieldDeclaration fd) {\n\t\t\tif (retVal != -1 || fd == null) return retVal;\n\t\t\tboolean isGenerated = ASTNode_generatedBy.get(fd) != null;\n\t\t\tif (isGenerated) return fd.declarationSourceEnd;\n\t\t\treturn -1;\n\t\t}\n\t\t\n\t\tpublic static int fixRetrieveProperRightBracketPosition(int retVal, Type type) {\n\t\t\tif (retVal != -1 || type == null) return retVal;\n\t\t\tif (isGenerated(type)) return type.getStartPosition() + type.getLength() - 1;\n\t\t\treturn -1;\n\t\t}\n\t\t\n\t\tpublic static final int ALREADY_PROCESSED_FLAG = 0x800000;  //Bit 24\n\t\t\n\t\tpublic static boolean checkBit24(Object node) throws Exception {\n\t\t\tint bits = (Integer)(node.getClass().getField(\"bits\").get(node));\n\t\t\treturn (bits & ALREADY_PROCESSED_FLAG) != 0;\n\t\t}\n\t\t\n\t\tpublic static boolean skipRewritingGeneratedNodes(org.eclipse.jdt.core.dom.ASTNode node) throws Exception {\n\t\t\treturn ((Boolean) node.getClass().getField(\"$isGenerated\").get(node)).booleanValue();\n\t\t}\n\t\t\n\t\tpublic static void setIsGeneratedFlag(org.eclipse.jdt.core.dom.ASTNode domNode,\n\t\t\t\torg.eclipse.jdt.internal.compiler.ast.ASTNode internalNode) throws Exception {\n\t\t\t\n\t\t\tif (internalNode == null || domNode == null) return;\n\t\t\tboolean isGenerated = ASTNode_generatedBy.get(internalNode) != null;\n\t\t\tif (isGenerated) domNode.getClass().getField(\"$isGenerated\").set(domNode, true);\n\t\t}\n\t\t\n\t\tpublic static void setIsGeneratedFlagForName(org.eclipse.jdt.core.dom.Name name, Object internalNode) throws Exception {\n\t\t\tif (internalNode instanceof org.eclipse.jdt.internal.compiler.ast.ASTNode) {\n\t\t\t\tboolean isGenerated = ASTNode_generatedBy.get((org.eclipse.jdt.internal.compiler.ast.ASTNode) internalNode) != null;\n\t\t\t\tif (isGenerated) name.getClass().getField(\"$isGenerated\").set(name, true);\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic static RewriteEvent[] listRewriteHandleGeneratedMethods(RewriteEvent parent) {\n\t\t\tRewriteEvent[] children = parent.getChildren();\n\t\t\tList<RewriteEvent> newChildren = new ArrayList<RewriteEvent>();\n\t\t\tList<RewriteEvent> modifiedChildren = new ArrayList<RewriteEvent>();\n\t\t\tfor (int i = 0; i < children.length; i++) {\n\t\t\t\tRewriteEvent child = children[i];\n\t\t\t\tboolean isGenerated = isGenerated((org.eclipse.jdt.core.dom.ASTNode) child.getOriginalValue());\n\t\t\t\tif (isGenerated) {\n\t\t\t\t\tboolean isReplacedOrRemoved = child.getChangeKind() == RewriteEvent.REPLACED || child.getChangeKind() == RewriteEvent.REMOVED;\n\t\t\t\t\tboolean convertingFromMethod = child.getOriginalValue() instanceof org.eclipse.jdt.core.dom.MethodDeclaration;\n\t\t\t\t\tif (isReplacedOrRemoved && convertingFromMethod && child.getNewValue() != null) {\n\t\t\t\t\t\tmodifiedChildren.add(new NodeRewriteEvent(null, child.getNewValue()));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tnewChildren.add(child);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Since Eclipse doesn't honor the \"insert at specified location\" for already existing members,\n\t\t\t// we'll just add them last\n\t\t\tnewChildren.addAll(modifiedChildren);\n\t\t\treturn newChildren.toArray(new RewriteEvent[0]);\n\t\t}\n\t\t\n\t\t// Eclipse changed a method. Older versions have `getTokenOffset(int, int)` whereas newer ones have `getTokenOffset(TerminalToken, int)`. See https://github.com/eclipse-jdt/eclipse.jdt.core/issues/3303\n\t\tpublic static int getTokenEndOffsetFixed(TokenScanner scanner, int token, int startOffset, Object domNode) throws CoreException {\n\t\t\tboolean isGenerated = false;\n\t\t\ttry {\n\t\t\t\tisGenerated = (Boolean) domNode.getClass().getField(\"$isGenerated\").get(domNode);\n\t\t\t} catch (Exception e) {\n\t\t\t\t// If this fails, better to break some refactor scripts than to crash eclipse.\n\t\t\t}\n\t\t\tif (isGenerated) return -1;\n\t\t\t\n\t\t\t// `scanner.getTokenEndOffset(int, int)` is public so we can just call it directly, except it might not exist (in more recent versions of eclipse).\n\t\t\t// Ordinarily that means you just write a private static class and shove the code in there to avoid classloader errors, but we're in PatchFixes and we need to be careful about that sort of thing.\n\t\t\ttry {\n\t\t\t\tMethod m = Permit.getMethod(TokenScanner.class, \"getTokenEndOffset\", int.class, int.class);\n\t\t\t\treturn (Integer) Permit.invoke(m, scanner, token, startOffset);\n\t\t\t} catch (Exception e) {\n\t\t\t\t// This is bizarre; we replaced a call to this exact method which strongly suggests it should be there. It's not going to be a nice experience in eclipse to 'break' token offsets,\n\t\t\t\t// but breaking token offsets is less dire than just hard crashing the entire editor with an exception.\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic static int getTokenEndOffsetFixed(TokenScanner scanner, Object token, int startOffset, Object domNode) throws CoreException {\n\t\t\tboolean isGenerated = false;\n\t\t\ttry {\n\t\t\t\tisGenerated = (Boolean) domNode.getClass().getField(\"$isGenerated\").get(domNode);\n\t\t\t} catch (Exception e) {\n\t\t\t\t// If this fails, better to break some refactor scripts than to crash eclipse.\n\t\t\t}\n\t\t\tif (isGenerated) return -1;\n\t\t\t\n\t\t\ttry {\n\t\t\t\tClass<?> terminalTokenClass = Class.forName(\"org.eclipse.jdt.internal.compiler.parser.TerminalToken\");\n\t\t\t\tMethod m = Permit.getMethod(TokenScanner.class, \"getTokenEndOffset\", terminalTokenClass, int.class);\n\t\t\t\treturn (Integer) Permit.invoke(m, scanner, token, startOffset);\n\t\t\t} catch (Exception e) {\n\t\t\t\t// This is bizarre; we replaced a call to this exact method which strongly suggests it should be there. It's not going to be a nice experience in eclipse to 'break' token offsets,\n\t\t\t\t// but breaking token offsets is less dire than just hard crashing the entire editor with an exception.\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic static IMethod[] removeGeneratedMethods(IMethod[] methods) throws Exception {\n\t\t\tList<IMethod> result = new ArrayList<IMethod>();\n\t\t\tfor (IMethod m : methods) {\n\t\t\t\tif (!isGenerated(m)) result.add(m);\n\t\t\t}\n\t\t\treturn result.size() == methods.length ? methods : result.toArray(new IMethod[0]);\n\t\t}\n\t\t\n\t\tpublic static SearchResultGroup[] createFakeSearchResult(SearchResultGroup[] returnValue,\n\t\t\t\tObject/*\n\t\t\t\t\t\t * org.eclipse.jdt.internal.corext.refactoring.rename.\n\t\t\t\t\t\t * RenameFieldProcessor\n\t\t\t\t\t\t */ processor) throws Exception {\n\t\t\tif (returnValue == null || returnValue.length == 0) {\n\t\t\t\t// if no matches were found, check if Data annotation is present on the class\n\t\t\t\tField declaredField = processor.getClass().getDeclaredField(\"fField\");\n\t\t\t\tif (declaredField != null) {\n\t\t\t\t\tdeclaredField.setAccessible(true);\n\t\t\t\t\tSourceField fField = (SourceField) declaredField.get(processor);\n\t\t\t\t\tIAnnotation dataAnnotation = fField.getDeclaringType().getAnnotation(\"Data\");\n\t\t\t\t\tif (dataAnnotation != null) {\n\t\t\t\t\t\t// add fake item, to make refactoring checks pass\n\t\t\t\t\t\treturn new SearchResultGroup[] {new SearchResultGroup(null, new SearchMatch[1])};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn returnValue;\n\t\t}\n\t\t\n\t\tpublic static SimpleName[] removeGeneratedSimpleNames(SimpleName[] in) throws Exception {\n\t\t\tField f = SimpleName.class.getField(\"$isGenerated\");\n\t\t\t\n\t\t\tint count = 0;\n\t\t\tfor (int i = 0; i < in.length; i++) {\n\t\t\t\tif (in[i] == null || !((Boolean)f.get(in[i])).booleanValue()) count++;\n\t\t\t}\n\t\t\tif (count == in.length) return in;\n\t\t\tSimpleName[] newSimpleNames = new SimpleName[count];\n\t\t\tcount = 0;\n\t\t\tfor (int i = 0; i < in.length; i++) {\n\t\t\t\tif (in[i] == null || !((Boolean)f.get(in[i])).booleanValue()) newSimpleNames[count++] = in[i];\n\t\t\t}\n\t\t\treturn newSimpleNames;\n\t\t}\n\t\t\n\t\tpublic static Name[] removeGeneratedNames(Name[] in) throws Exception {\n\t\t\tField f = Name.class.getField(\"$isGenerated\");\n\t\t\t\n\t\t\tint count = 0;\n\t\t\tfor (int i = 0; i < in.length; i++) {\n\t\t\t\tif (in[i] == null || !((Boolean)f.get(in[i])).booleanValue()) count++;\n\t\t\t}\n\t\t\tif (count == in.length) return in;\n\t\t\tName[] newNames = new Name[count];\n\t\t\tcount = 0;\n\t\t\tfor (int i = 0; i < in.length; i++) {\n\t\t\t\tif (in[i] == null || !((Boolean)f.get(in[i])).booleanValue()) newNames[count++] = in[i];\n\t\t\t}\n\t\t\treturn newNames;\n\t\t}\n\t\t\n\t\tpublic static Annotation[] convertAnnotations(Annotation[] out, IAnnotatable annotatable) {\n\t\t\tIAnnotation[] in;\n\t\t\t\n\t\t\ttry {\n\t\t\t\tin = annotatable.getAnnotations();\n\t\t\t} catch (Exception e) {\n\t\t\t\treturn out;\n\t\t\t}\n\t\t\t\n\t\t\tif (out == null) return null;\n\t\t\tint toWrite = 0;\n\t\t\t\n\t\t\tfor (int idx = 0; idx < out.length; idx++) {\n\t\t\t\tString oName = new String(out[idx].type.getLastToken());\n\t\t\t\tboolean found = false;\n\t\t\t\tfor (IAnnotation i : in) {\n\t\t\t\t\tString name = i.getElementName();\n\t\t\t\t\tint li = name.lastIndexOf('.');\n\t\t\t\t\tif (li > -1) name = name.substring(li + 1);\n\t\t\t\t\tif (name.equals(oName)) {\n\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!found) out[idx] = null;\n\t\t\t\telse toWrite++;\n\t\t\t}\n\t\t\t\n\t\t\tAnnotation[] replace = out;\n\t\t\tif (toWrite < out.length) {\n\t\t\t\treplace = new Annotation[toWrite];\n\t\t\t\tint idx = 0;\n\t\t\t\tfor (int i = 0; i < out.length; i++) {\n\t\t\t\t\tif (out[i] == null) continue;\n\t\t\t\t\treplace[idx++] = out[i];\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn replace;\n\t\t}\n\t\t\n\t\tpublic static boolean isEmpty(char[] array) {\n\t\t\treturn array.length == 0;\n\t\t}\n\t\t\n\t\tpublic static Expression returnNullExpression(Object arg0) {\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\tpublic static String getRealNodeSource(String original, org.eclipse.jdt.internal.compiler.ast.ASTNode node) {\n\t\t\tif (!isGenerated(node)) return original;\n\t\t\t\n\t\t\treturn node.toString();\n\t\t}\n\t\t\n\t\tpublic static java.lang.String getRealNodeSource(java.lang.String original, org.eclipse.jdt.core.dom.ASTNode node) throws Exception {\n\t\t\tif (!isGenerated(node)) return original;\n\t\t\t\n\t\t\treturn node.toString();\n\t\t}\n\t\t\n\t\tpublic static boolean skipRewriteVisibility(IncomingMemberVisibilityAdjustment adjustment) {\n\t\t\treturn isGenerated(adjustment.getMember());\n\t\t}\n\t\t\n\t\tpublic static String[] getRealCodeBlocks(String[] blocks, SourceProvider sourceProvider, CallContext callContext) {\n\t\t\tMethodDeclaration methodDeclaration = sourceProvider.getDeclaration();\n\t\t\tif (!isGenerated(methodDeclaration)) {\n\t\t\t\treturn blocks;\n\t\t\t}\n\t\t\t\n\t\t\ttry {\n\t\t\t\t// Replace parameter references with actual argument\n\t\t\t\tAST ast = methodDeclaration.getAST();\n\t\t\t\tList<?> parameters = methodDeclaration.parameters();\n\t\t\t\tfor (int i = 0; i < parameters.size(); i++) {\n\t\t\t\t\tSingleVariableDeclaration param = (SingleVariableDeclaration) parameters.get(i);\n\t\t\t\t\tObject data = param.getProperty(\"org.eclipse.jdt.internal.corext.refactoring.code.ParameterData\");\n\t\t\t\t\tList<SimpleName> names = Permit.get(Permit.permissiveGetField(data.getClass(), \"fReferences\"), data);\n\t\t\t\t\t\n\t\t\t\t\tfor (SimpleName simpleName : names) {\n\t\t\t\t\t\tASTNode copy = ASTNode.copySubtree(ast, callContext.arguments[i]);\n\t\t\t\t\t\tsimpleName.getParent().setStructuralProperty(simpleName.getLocationInParent(), copy);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Convert AST to source\n\t\t\t\tStringBuilder sb = new StringBuilder();\n\t\t\t\tfor (Object statement : methodDeclaration.getBody().statements()) {\n\t\t\t\t\tif (callContext.callMode != ASTNode.RETURN_STATEMENT && statement instanceof ReturnStatement) {\n\t\t\t\t\t\tReturnStatement returnStatement = (ReturnStatement) statement;\n\t\t\t\t\t\tsb.append(returnStatement.getExpression());\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsb.append(statement);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn new String[] {sb.toString().trim()};\n\t\t\t} catch (Throwable e) {\n\t\t\t\treturn blocks;\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic static ASTNode findGeneratedNode(ASTNode root, ISourceRange sourceRange, IMethodBinding methodBinding) {\n\t\t\tASTNode result = NodeFinder.perform(root, sourceRange);\n\t\t\tif (result instanceof MethodDeclaration){\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\t\n\t\t\tCompilationUnit cu = (CompilationUnit) root;\n\t\t\treturn cu.findDeclaringNode(methodBinding.getKey());\n\t\t}\n\t}\n\t\n\tpublic static class FieldInitializer {\n\t\tpublic static final Field INFO_STACK;\n\t\tpublic static final Field FIELD_INFO;\n\t\tpublic static final Field SOURCE_FIELD_ELEMENT_INFO;\n\t\tpublic static final Field INITIALIZATION_SOURCE;\n\t\tpublic static final Field NODE;\n\t\tpublic static final boolean INITIALIZED;\n\t\t\n\t\tstatic {\n\t\t\tINFO_STACK = Permit.permissiveGetField(CompilationUnitStructureRequestor.class, \"infoStack\");\n\t\t\tFIELD_INFO = Permit.permissiveGetField(CompilationUnitStructureRequestor.class, \"$fieldInfo\");\n\t\t\tSOURCE_FIELD_ELEMENT_INFO = Permit.permissiveGetField(CompilationUnitStructureRequestor.class, \"$sourceFieldElementInfo\");\n\t\t\tINITIALIZATION_SOURCE = Permit.permissiveGetField(SourceFieldElementInfo.class, \"initializationSource\");\n\t\t\tNODE = Permit.permissiveGetField(FieldInfo.class, \"node\");\n\t\t\tINITIALIZED = INFO_STACK != null && FIELD_INFO != null && SOURCE_FIELD_ELEMENT_INFO != null && INITIALIZATION_SOURCE != null && NODE != null;\n\t\t}\n\t\t\n\t\tpublic static boolean storeFieldInfo(CompilationUnitStructureRequestor compilationUnitStructureRequestor) {\n\t\t\ttry {\n\t\t\t\tif (INITIALIZED) {\n\t\t\t\t\tStack<?> infoStack = Permit.get(INFO_STACK, compilationUnitStructureRequestor);\n\t\t\t\t\tObject fieldInfo = infoStack.peek();\n\t\t\t\t\tPermit.set(FIELD_INFO, compilationUnitStructureRequestor, fieldInfo);\n\t\t\t\t}\n\t\t\t} catch (Exception e) {\n\t\t\t\t// do not break eclipse\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\tpublic static void storeSourceFieldElementInfo(SourceFieldElementInfo fieldInfo, CompilationUnitStructureRequestor compilationUnitStructureRequestor) {\n\t\t\ttry {\n\t\t\t\tif (INITIALIZED) {\n\t\t\t\t\tPermit.set(SOURCE_FIELD_ELEMENT_INFO, compilationUnitStructureRequestor, fieldInfo);\n\t\t\t\t}\n\t\t\t} catch (Exception e) {\n\t\t\t\t// do not break eclipse\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic static void overwriteInitializer(CompilationUnitStructureRequestor compilationUnitStructureRequestor) {\n\t\t\ttry {\n\t\t\t\tif (INITIALIZED) {\n\t\t\t\t\tFieldInfo fieldInfo = Permit.get(FIELD_INFO, compilationUnitStructureRequestor);\n\t\t\t\t\tPermit.set(FIELD_INFO, compilationUnitStructureRequestor, null);\n\t\t\t\t\t\n\t\t\t\t\tSourceFieldElementInfo sourceFieldElementInfo = Permit.get(SOURCE_FIELD_ELEMENT_INFO,compilationUnitStructureRequestor);\n\t\t\t\t\tPermit.set(SOURCE_FIELD_ELEMENT_INFO, compilationUnitStructureRequestor, null);\n\t\t\t\t\t\n\t\t\t\t\tif (sourceFieldElementInfo.getInitializationSource() != null) {\n\t\t\t\t\t\tAbstractVariableDeclaration node = Permit.get(NODE, fieldInfo);\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (PatchFixes.isGenerated(node)) {\n\t\t\t\t\t\t\tPermit.set(INITIALIZATION_SOURCE, sourceFieldElementInfo, node.initialization.toString().toCharArray());\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (Exception e) {\n\t\t\t\t// do not break eclipse\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic static class Tests {\n\t\tpublic static StringBuffer printMethod(AbstractMethodDeclaration methodDeclaration, int tab, StringBuffer output, TypeDeclaration type) {\n\t\t\treturn (StringBuffer) printMethod(methodDeclaration, tab, (Object) output, type);\n\t\t}\n\t\t\n\t\tpublic static StringBuilder printMethod(AbstractMethodDeclaration methodDeclaration, int tab, StringBuilder output, TypeDeclaration type) {\n\t\t\treturn (StringBuilder) printMethod(methodDeclaration, tab, (Object) output, type);\n\t\t}\n\t\t\n\t\tpublic static Object printMethod(AbstractMethodDeclaration methodDeclaration, int tab, Object output, TypeDeclaration type) {\n\t\t\tMap<String, String> docs = CompilationUnit_javadoc.get(methodDeclaration.compilationResult.compilationUnit);\n\t\t\tMethod printIndent = Permit.permissiveGetMethod(org.eclipse.jdt.internal.compiler.ast.ASTNode.class, \"printIndent\", int.class, output.getClass());\n\t\t\tif (docs != null) {\n\t\t\t\tString signature = EclipseHandlerUtil.getSignature(type, methodDeclaration);\n\t\t\t\tString rawJavadoc = docs.get(signature);\n\t\t\t\tif (rawJavadoc != null) {\n\t\t\t\t\tfor (String line : rawJavadoc.split(\"\\r?\\n\")) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tAppendable sb = (Appendable) Permit.invoke(printIndent, null, tab, output);\n\t\t\t\t\t\t\tsb.append(line).append(\"\\n\");\n\t\t\t\t\t\t} catch (Throwable e) {\n\t\t\t\t\t\t\t// Ignore\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tMethod printMethodDeclaration = Permit.permissiveGetMethod(AbstractMethodDeclaration.class, \"print\", int.class, output.getClass());\n\t\t\tPermit.invokeSneaky(printMethodDeclaration, methodDeclaration, tab, output);\n\t\t\treturn output;\n\t\t}\n\t\t\n\t\tpublic static Object getBundle(Object original, Class<?> c) {\n\t\t\tif (original != null) {\n\t\t\t\treturn original;\n\t\t\t}\n\t\t\t\n\t\t\tCodeSource codeSource = c.getProtectionDomain().getCodeSource();\n\t\t\tif (codeSource == null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t\n\t\t\tString jar = codeSource.getLocation().getFile();\n\t\t\tString bundleName = jar.substring(jar.lastIndexOf(\"/\") + 1, jar.indexOf(\"_\"));\n\t\t\t\n\t\t\torg.osgi.framework.Bundle[] bundles = org.eclipse.core.runtime.adaptor.EclipseStarter.getSystemBundleContext().getBundles();\n\t\t\tfor (org.osgi.framework.Bundle bundle : bundles) {\n\t\t\t\tif (bundleName.equals(bundle.getSymbolicName())) {\n\t\t\t\t\treturn bundle;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\tpublic static boolean isImplicitCanonicalConstructor(AbstractMethodDeclaration method, Object parameter) {\n\t\t\treturn (method.bits & IsCanonicalConstructor) != 0 && (method.bits & IsImplicit) != 0;\n\t\t}\n\t\t\n\t\tpublic static boolean isRecordComponent(FieldDeclaration field, Object parameter) {\n\t\t\treturn (field.modifiers & AccRecord) != 0;\n\t\t}\n\t\t\n\t\tpublic static StringBuffer returnStringBuffer(Object p1, StringBuffer buffer) {\n\t\t\treturn buffer;\n\t\t}\n\n\t\tpublic static StringBuilder returnStringBuilder(Object p1, StringBuilder buffer) {\n\t\t\treturn buffer;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/installer/lombok/installer/AppleNativeLook.java",
    "content": "/*\n * Copyright (C) 2009 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.installer;\n\nimport java.awt.Image;\nimport java.awt.image.BufferedImage;\n\nimport javax.imageio.ImageIO;\n\n/**\n * Mac OS X specific code to gussy up the GUI a little bit, mostly with a nice dock icon. Well, nicer than\n * the standard icon, at any rate.\n */\nclass AppleNativeLook {\n\tpublic static void go() throws Exception {\n\t\tClass<?> appClass = Class.forName(\"com.apple.eawt.Application\");\n\t\tObject app = appClass.getMethod(\"getApplication\").invoke(null);\n\t\tappClass.getMethod(\"removeAboutMenuItem\").invoke(app);\n\t\tappClass.getMethod(\"removePreferencesMenuItem\").invoke(app);\n\t\t\n\t\tBufferedImage image = ImageIO.read(AppleNativeLook.class.getResource(\"lombokIcon.png\"));\n\t\tappClass.getMethod(\"setDockIconImage\", Image.class).invoke(app, image);\n\t}\n}\n"
  },
  {
    "path": "src/installer/lombok/installer/CorruptedIdeLocationException.java",
    "content": "/*\n * Copyright (C) 2009 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.installer;\n\nimport javax.swing.JFrame;\nimport javax.swing.JOptionPane;\n\n/**\n * Represents an installation location problem.\n * You should throw it upon creation of a {@code IdeLocation} class\n * if the provided location looks like your kind of IDE but there's something wrong with it.\n */\npublic class CorruptedIdeLocationException extends Exception {\n\tprivate final String ideType;\n\t\n\tpublic CorruptedIdeLocationException(String message, String ideType, Throwable cause) {\n\t\tsuper(message, cause);\n\t\tthis.ideType = ideType;\n\t}\n\t\n\tpublic String getIdeType() {\n\t\treturn ideType;\n\t}\n\t\n\tvoid showDialog(JFrame appWindow) {\n\t\tJOptionPane.showMessageDialog(appWindow, getMessage(), \"Cannot configure \" + ideType + \" installation\", JOptionPane.WARNING_MESSAGE);\n\t}\n}\n"
  },
  {
    "path": "src/installer/lombok/installer/IdeLocation.java",
    "content": "/*\n * Copyright (C) 2009-2016 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.installer;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.net.URL;\n\nimport lombok.patcher.ClassRootFinder;\n\n/**\n * Represents a location that contains an IDE.\n */\npublic abstract class IdeLocation {\n\t/** Toggling the 'selected' checkbox in the GUI is tracked via this boolean */\n\tboolean selected = true;\n\t\n\tpublic abstract String install() throws InstallException;\n\tpublic abstract void uninstall() throws UninstallException;\n\tpublic abstract String getName();\n\tpublic abstract boolean hasLombok();\n\tpublic abstract URL getIdeIcon();\n\t\n\t/**\n\t * Returns a File object pointing to our own jar file. Will obviously fail if the installer was started via\n\t * a jar that wasn't accessed via the file-system, or if its started via e.g. unpacking the jar.\n\t */\n\tpublic static File findOurJar() {\n\t\treturn new File(ClassRootFinder.findClassRootOfClass(OsUtils.class));\n\t}\n\t\n\t@Override public String toString() {\n\t\treturn getName();\n\t}\n\t\n\t/**\n\t * Returns a full path to the provided file.\n\t * Returns the canonical path, unless that is not available, in which case it returns the absolute path.\n\t */\n\tpublic static String canonical(File p) {\n\t\ttry {\n\t\t\treturn p.getCanonicalPath();\n\t\t} catch (IOException e) {\n\t\t\tString x = p.getAbsolutePath();\n\t\t\treturn x == null ? p.getPath() : x;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/installer/lombok/installer/IdeLocationProvider.java",
    "content": "/*\n * Copyright (C) 2009-2016 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.installer;\n\nimport java.util.List;\nimport java.util.regex.Pattern;\n\npublic interface IdeLocationProvider {\n\t/**\n\t * @throws CorruptedIdeLocationException\n\t *    Only throw this exception if the location seems like a proper installation except there's something wrong with it.\n\t *    Do not throw it (just return {@code null}) if there's nothing there or it looks absolutely nothing like your IDE.\n\t */\n\tIdeLocation create(String path) throws CorruptedIdeLocationException;\n\t\n\t/**\n\t * Return the usual name of the IDE executable or other obvious marker of an IDE installation on the current platform.\n\t */\n\tPattern getLocationSelectors();\n\t\n\t/**\n\t * Look for installations of your IDE in the usual places.\n\t * \n\t * @param locations Add to this list any valid locations that you found.\n\t * @param problems\n\t *     Add to this list any locations that look like installations,\n\t *     but have problems that prevent you from installing/uninstalling from them. DONT add to this list\n\t *     any common locations that have no installation at all - only add near misses.\n\t */\n\tvoid findIdes(List<IdeLocation> locations, List<CorruptedIdeLocationException> problems);\n}\n"
  },
  {
    "path": "src/installer/lombok/installer/InstallException.java",
    "content": "/*\n * Copyright (C) 2009-2010 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.installer;\n\n/**\n * Thrown when installation of lombok into an IDE fails.\n */\npublic class InstallException extends Exception {\n\tprivate boolean warning;\n\t\n\tpublic InstallException(String message, Throwable cause) {\n\t\tsuper(message, cause);\n\t}\n\t\n\tpublic InstallException(boolean warning, String message, Throwable cause) {\n\t\tsuper(message, cause);\n\t\tthis.warning = warning;\n\t}\n\t\n\tpublic boolean isWarning() {\n\t\treturn warning;\n\t}\n}\n"
  },
  {
    "path": "src/installer/lombok/installer/Installer.java",
    "content": "/*\n * Copyright (C) 2009-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.installer;\n\nimport java.awt.HeadlessException;\nimport java.io.File;\nimport java.io.IOException;\nimport java.net.URI;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.regex.Pattern;\n\nimport javax.swing.SwingUtilities;\nimport javax.swing.UIManager;\n\nimport lombok.Lombok;\nimport lombok.core.LombokApp;\nimport lombok.core.SpiLoadUtil;\nimport lombok.core.Version;\nimport lombok.installer.OsUtils.OS;\nimport lombok.patcher.ClassRootFinder;\nimport lombok.spi.Provides;\n\nimport com.zwitserloot.cmdreader.CmdReader;\nimport com.zwitserloot.cmdreader.Description;\nimport com.zwitserloot.cmdreader.InvalidCommandLineException;\nimport com.zwitserloot.cmdreader.Sequential;\nimport com.zwitserloot.cmdreader.Shorthand;\n\n/**\n * The lombok installer proper.\n * Uses swing to show a simple GUI that can add and remove the java agent to Eclipse installations.\n * Also offers info on what this installer does in case people want to instrument their Eclipse manually,\n * and looks in some common places on Mac OS X, Linux and Windows.\n */\npublic class Installer {\n\tstatic final URI ABOUT_LOMBOK_URL = URI.create(\"https://projectlombok.org\");\n\tstatic final List<IdeLocationProvider> locationProviders;\n\t\n\tstatic {\n\t\tList<IdeLocationProvider> list = new ArrayList<IdeLocationProvider>();\n\t\ttry {\n\t\t\tfor (IdeLocationProvider provider : SpiLoadUtil.findServices(IdeLocationProvider.class)) {\n\t\t\t\tlist.add(provider);\n\t\t\t}\n\t\t} catch (IOException e) {\n\t\t\tthrow Lombok.sneakyThrow(e);\n\t\t}\n\t\tlocationProviders = Collections.unmodifiableList(list);\n\t}\n\t\n\tstatic List<Pattern> getIdeExecutableNames() {\n\t\tList<Pattern> list = new ArrayList<Pattern>();\n\t\tfor (IdeLocationProvider provider : locationProviders) {\n\t\t\tPattern p = provider.getLocationSelectors();\n\t\t\tif (p != null) list.add(p);\n\t\t}\n\t\treturn list;\n\t}\n\t\n\tstatic IdeLocation tryAllProviders(String location) throws CorruptedIdeLocationException {\n\t\tfor (IdeLocationProvider provider : locationProviders) {\n\t\t\tIdeLocation loc = provider.create(location);\n\t\t\tif (loc != null) return loc;\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\t\n\tstatic void autoDiscover(List<IdeLocation> locations, List<CorruptedIdeLocationException> problems) {\n\t\tfor (IdeLocationProvider provider : locationProviders) {\n\t\t\tprovider.findIdes(locations, problems);\n\t\t}\n\t}\n\t\n\tpublic static boolean isSelf(String jar) {\n\t\tString self = ClassRootFinder.findClassRootOfClass(Installer.class);\n\t\tif (self == null) return false;\n\t\tFile a = new File(jar).getAbsoluteFile();\n\t\tFile b = new File(self).getAbsoluteFile();\n\t\ttry { a = a.getCanonicalFile(); } catch (IOException ignore) {}\n\t\ttry { b = b.getCanonicalFile(); } catch (IOException ignore) {}\n\t\treturn a.equals(b);\n\t}\n\t\n\t@Provides\n\tpublic static class GraphicalInstallerApp extends LombokApp {\n\t\t@Override public String getAppName() {\n\t\t\treturn \"installer\";\n\t\t}\n\t\t\n\t\t@Override public String getAppDescription() {\n\t\t\treturn \"Runs the graphical installer tool (default).\";\n\t\t}\n\t\t\n\t\t@Override public List<String> getAppAliases() {\n\t\t\treturn Arrays.asList(\"\");\n\t\t}\n\t\t\n\t\t@Override public int runApp(List<String> args) throws Exception {\n\t\t\treturn guiInstaller();\n\t\t}\n\t}\n\t\n\t@Provides\n\tpublic static class CommandLineInstallerApp extends LombokApp {\n\t\t@Override public String getAppName() {\n\t\t\treturn \"install\";\n\t\t}\n\t\t\n\t\t@Override public String getAppDescription() {\n\t\t\treturn \"Runs the 'handsfree' command line scriptable installer.\";\n\t\t}\n\t\t\n\t\t@Override public int runApp(List<String> args) throws Exception {\n\t\t\treturn cliInstaller(false, args);\n\t\t}\n\t}\n\t\n\t@Provides\n\tpublic static class CommandLineUninstallerApp extends LombokApp {\n\t\t@Override public String getAppName() {\n\t\t\treturn \"uninstall\";\n\t\t}\n\t\t\n\t\t@Override public String getAppDescription() {\n\t\t\treturn \"Runs the 'handsfree' command line scriptable uninstaller.\";\n\t\t}\n\t\t\n\t\t@Override public int runApp(List<String> args) throws Exception {\n\t\t\treturn cliInstaller(true, args);\n\t\t}\n\t}\n\t\n\tprivate static int guiInstaller() {\n\t\tif (OsUtils.getOS() == OS.MAC_OS_X) {\n\t\t\tSystem.setProperty(\"com.apple.mrj.application.apple.menu.about.name\", \"Lombok Installer\");\n\t\t\tSystem.setProperty(\"com.apple.macos.use-file-dialog-packages\", \"true\");\n\t\t}\n\t\t\n\t\ttry {\n\t\t\tSwingUtilities.invokeLater(new Runnable() {\n\t\t\t\tpublic void run() {\n\t\t\t\t\ttry {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tUIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());\n\t\t\t\t\t\t} catch (Exception ignore) {}\n\t\t\t\t\t\t\n\t\t\t\t\t\tnew InstallerGUI().show();\n\t\t\t\t\t} catch (HeadlessException e) {\n\t\t\t\t\t\tprintHeadlessInfo();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tsynchronized (InstallerGUI.exitMarker) {\n\t\t\t\twhile (!Thread.interrupted() && InstallerGUI.exitMarker.get() == null) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tInstallerGUI.exitMarker.wait();\n\t\t\t\t\t} catch (InterruptedException e) {\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tInteger errCode = InstallerGUI.exitMarker.get();\n\t\t\t\treturn errCode == null ? 1 : errCode;\n\t\t\t}\n\t\t} catch (HeadlessException e) {\n\t\t\tprintHeadlessInfo();\n\t\t\treturn 1;\n\t\t}\n\t}\n\t\n\tprivate static class CmdArgs {\n\t\t@Description(\"Specify paths to a location to install/uninstall. Use 'auto' to apply to all automatically discoverable installations.\")\n\t\t@Sequential\n\t\tList<String> path = new ArrayList<String>();\n\t\t\n\t\t@Shorthand({\"h\", \"?\"})\n\t\t@Description(\"Shows this help text\")\n\t\tboolean help;\n\t}\n\t\n\tpublic static int cliInstaller(boolean uninstall, List<String> rawArgs) {\n\t\tCmdReader<CmdArgs> reader = CmdReader.of(CmdArgs.class);\n\t\tCmdArgs args;\n\t\ttry {\n\t\t\targs = reader.make(rawArgs.toArray(new String[0]));\n\t\t} catch (InvalidCommandLineException e) {\n\t\t\tSystem.err.println(e.getMessage());\n\t\t\tSystem.err.println(\"--------------------------\");\n\t\t\tSystem.err.println(generateCliHelp(uninstall, reader));\n\t\t\treturn 1;\n\t\t}\n\t\t\n\t\tif (args.help) {\n\t\t\tSystem.out.println(generateCliHelp(uninstall, reader));\n\t\t\treturn 0;\n\t\t}\n\t\t\n\t\tif (args.path.isEmpty()) {\n\t\t\tSystem.err.println(\"ERROR: Nothing to do!\");\n\t\t\tSystem.err.println(\"--------------------------\");\n\t\t\tSystem.err.println(generateCliHelp(uninstall, reader));\n\t\t\treturn 1;\n\t\t}\n\t\t\n\t\tfinal List<IdeLocation> locations = new ArrayList<IdeLocation>();\n\t\tfinal List<CorruptedIdeLocationException> problems = new ArrayList<CorruptedIdeLocationException>();\n\t\t\n\t\tif (args.path.contains(\"auto\")) autoDiscover(locations, problems);\n\t\t\n\t\tfor (String rawPath : args.path) {\n\t\t\tif (!rawPath.equals(\"auto\")) {\n\t\t\t\ttry {\n\t\t\t\t\tIdeLocation loc = tryAllProviders(rawPath);\n\t\t\t\t\tif (loc != null) locations.add(loc);\n\t\t\t\t\telse problems.add(new CorruptedIdeLocationException(\"Can't find any IDE at: \" + rawPath, null, null));\n\t\t\t\t} catch (CorruptedIdeLocationException e) {\n\t\t\t\t\tproblems.add(e);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tint validLocations = locations.size();\n\t\tfor (IdeLocation loc : locations) {\n\t\t\ttry {\n\t\t\t\tif (uninstall) {\n\t\t\t\t\tloc.uninstall();\n\t\t\t\t} else {\n\t\t\t\t\tloc.install();\n\t\t\t\t}\n\t\t\t\tSystem.out.printf(\"Lombok %s %s: %s\\n\", uninstall ? \"uninstalled\" : \"installed\", uninstall ? \"from\" : \"to\", loc.getName());\n\t\t\t} catch (InstallException e) {\n\t\t\t\tif (e.isWarning()) {\n\t\t\t\t\tSystem.err.printf(\"Warning while installing at %s:\\n\", loc.getName());\n\t\t\t\t} else {\n\t\t\t\t\tSystem.err.printf(\"Installation at %s failed:\\n\", loc.getName());\n\t\t\t\t\tvalidLocations--;\n\t\t\t\t}\n\t\t\t\tSystem.err.println(e.getMessage());\n\t\t\t} catch (UninstallException e) {\n\t\t\t\tif (e.isWarning()) {\n\t\t\t\t\tSystem.err.printf(\"Warning while uninstalling at %s:\\n\", loc.getName());\n\t\t\t\t} else {\n\t\t\t\t\tSystem.err.printf(\"Uninstall at %s failed:\\n\", loc.getName());\n\t\t\t\t\tvalidLocations--;\n\t\t\t\t}\n\t\t\t\tSystem.err.println(e.getMessage());\n\t\t\t}\n\t\t}\n\t\t\n\t\tfor (CorruptedIdeLocationException problem : problems) {\n\t\t\tSystem.err.println(\"WARNING: \" + problem.getMessage());\n\t\t}\n\t\t\n\t\tif (validLocations == 0) {\n\t\t\tSystem.err.println(\"WARNING: Zero valid locations found; so nothing was done!\");\n\t\t}\n\t\treturn 0;\n\t}\n\t\n\tprivate static String generateCliHelp(boolean uninstall, CmdReader<CmdArgs> reader) {\n\t\treturn reader.generateCommandLineHelp(\"java -jar lombok.jar \" + (uninstall ? \"uninstall\" : \"install\"));\n\t}\n\t\n\t/**\n\t * If run in headless mode, the installer can't show its fancy GUI. There's little point in running\n\t * the installer without a GUI environment, as Eclipse doesn't run in headless mode either, so\n\t * we'll make do with showing some basic info on Lombok as well as instructions for using lombok with javac.\n\t */\n\tprivate static void printHeadlessInfo() {\n\t\tSystem.out.printf(\"About lombok v%s\\n\" +\n\t\t\t\t\"Lombok makes java better by providing very spicy additions to the Java programming language,\" +\n\t\t\t\t\"such as using @Getter to automatically generate a getter method for any field.\\n\\n\" +\n\t\t\t\t\"Browse to %s for more information. To install lombok on Eclipse, re-run this jar file on a \" +\n\t\t\t\t\"graphical computer system - this message is being shown because your terminal is not graphics capable.\\n\" +\n\t\t\t\t\"Alternatively, use the command line installer (java -jar lombok.jar install --help).\\n\" +\n\t\t\t\t\"If you are just using 'javac' or a tool that calls on javac, no installation is neccessary; just \" +\n\t\t\t\t\"make sure lombok.jar is in the classpath when you compile. Example:\\n\\n\" +\n\t\t\t\t\"   java -cp lombok.jar MyCode.java\\n\",\n\t\t\t\tVersion.getVersion(), ABOUT_LOMBOK_URL);\n\t}\n}\n"
  },
  {
    "path": "src/installer/lombok/installer/InstallerGUI.java",
    "content": "/*\n * Copyright (C) 2009-2017 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.installer;\n\nimport java.awt.Color;\nimport java.awt.Component;\nimport java.awt.Container;\nimport java.awt.Cursor;\nimport java.awt.Dimension;\nimport java.awt.FileDialog;\nimport java.awt.FlowLayout;\nimport java.awt.Font;\nimport java.awt.GridBagConstraints;\nimport java.awt.GridBagLayout;\nimport java.awt.Insets;\nimport java.awt.Rectangle;\nimport java.awt.Toolkit;\nimport java.awt.event.ActionEvent;\nimport java.awt.event.ActionListener;\nimport java.awt.font.TextAttribute;\nimport java.io.File;\nimport java.io.FilenameFilter;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.net.URI;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.LinkedHashSet;\nimport java.util.List;\nimport java.util.Set;\nimport java.util.concurrent.atomic.AtomicBoolean;\nimport java.util.concurrent.atomic.AtomicInteger;\nimport java.util.concurrent.atomic.AtomicReference;\nimport java.util.regex.Pattern;\n\nimport javax.swing.Box;\nimport javax.swing.BoxLayout;\nimport javax.swing.ImageIcon;\nimport javax.swing.JButton;\nimport javax.swing.JCheckBox;\nimport javax.swing.JComponent;\nimport javax.swing.JFileChooser;\nimport javax.swing.JFrame;\nimport javax.swing.JLabel;\nimport javax.swing.JOptionPane;\nimport javax.swing.JPanel;\nimport javax.swing.JScrollPane;\nimport javax.swing.JTextPane;\nimport javax.swing.Scrollable;\nimport javax.swing.SwingUtilities;\nimport javax.swing.UIManager;\nimport javax.swing.filechooser.FileFilter;\nimport javax.swing.text.html.HTMLDocument;\n\nimport lombok.core.Version;\nimport lombok.installer.OsUtils.OS;\n\n/**\n * The lombok GUI installer.\n * Uses swing to show a simple GUI that can add and remove the java agent to IDE installations.\n * Also offers info on what this installer does in case people want to instrument their IDE manually.\n */\npublic class InstallerGUI {\n\tprivate static final int INSTALLER_WINDOW_WIDTH = 662;\n\tstatic final AtomicReference<Integer> exitMarker = new AtomicReference<Integer>();\n\t\n\tprivate JFrame appWindow;\n\t\n\tprivate JComponent loadingExpl;\n\n\tprivate Component javacArea;\n\tprivate Component ideArea;\n\tprivate Component uninstallArea;\n\tprivate Component howIWorkArea;\n\tprivate Component successArea;\n\n\tprivate Box uninstallBox;\n\tprivate JHyperLink uninstallButton;\n\tprivate JLabel uninstallPlaceholder;\n\tprivate JButton installButton;\n\t\n\tprivate List<IdeLocation> toUninstall;\n\tprivate final Set<String> installSpecificMessages = new LinkedHashSet<String>();\n\t\n\t/**\n\t * Creates a new installer that starts out invisible.\n\t * Call the {@link #show()} method on a freshly created installer to render it.\n\t */\n\tpublic InstallerGUI() {\n\t\tappWindow = new JFrame(String.format(\"Project Lombok v%s - Installer\", Version.getVersion()));\n\t\t\n\t\tappWindow.setLocationByPlatform(true);\n\t\tappWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);\n\t\tappWindow.setResizable(false);\n\t\tappWindow.setIconImage(Toolkit.getDefaultToolkit().getImage(Installer.class.getResource(\"lombokIcon.png\")));\n\t\t\n\t\ttry {\n\t\t\tjavacArea = buildJavacArea();\n\t\t\tideArea = buildIdeArea();\n\t\t\tuninstallArea = buildUninstallArea();\n\t\t\tuninstallArea.setVisible(false);\n\t\t\thowIWorkArea = buildHowIWorkArea();\n\t\t\thowIWorkArea.setVisible(false);\n\t\t\tsuccessArea = buildSuccessArea();\n\t\t\tsuccessArea.setVisible(false);\n\t\t\tbuildChrome(appWindow.getContentPane());\n\t\t\tappWindow.pack();\n\t\t} catch (Throwable t) {\n\t\t\thandleException(t);\n\t\t}\n\t}\n\t\n\tprivate void handleException(final Throwable t) {\n\t\tSwingUtilities.invokeLater(new Runnable() {\n\t\t\t@Override public void run() {\n\t\t\t\tJOptionPane.showMessageDialog(appWindow, \"There was a problem during the installation process:\\n\" + t, \"Uh Oh!\", JOptionPane.ERROR_MESSAGE);\n\t\t\t\tt.printStackTrace();\n\t\t\t\tSystem.exit(1);\n\t\t\t}\n\t\t});\n\t}\n\t\n\tprivate Component buildHowIWorkArea() {\n\t\tJPanel container = new JPanel();\n\t\t\n\t\tcontainer.setLayout(new GridBagLayout());\n\t\tGridBagConstraints constraints = new GridBagConstraints();\n\t\tconstraints.anchor = GridBagConstraints.WEST;\n\t\t\n\t\tcontainer.add(new JLabel(HOW_I_WORK_TITLE), constraints);\n\t\t\n\t\tconstraints.gridy = 1;\n\t\tconstraints.insets = new Insets(8, 0, 0, 16);\n\t\tcontainer.add(new JLabel(String.format(HOW_I_WORK_EXPLANATION, File.separator)), constraints);\n\t\t\n\t\tBox buttonBar = Box.createHorizontalBox();\n\t\tJButton backButton = new JButton(\"Okay - Good to know!\");\n\t\tbuttonBar.add(Box.createHorizontalGlue());\n\t\tbuttonBar.add(backButton);\n\t\t\n\t\tbackButton.addActionListener(new ActionListener() {\n\t\t\t@Override public void actionPerformed(ActionEvent e) {\n\t\t\t\thowIWorkArea.setVisible(false);\n\t\t\t\tjavacArea.setVisible(true);\n\t\t\t\tideArea.setVisible(true);\n\t\t\t\tsuccessArea.setVisible(false);\n\t\t\t\tappWindow.pack();\n\t\t\t}\n\t\t});\n\t\t\n\t\tconstraints.gridy = 2;\n\t\tcontainer.add(buttonBar, constraints);\n\t\t\n\t\tcontainer.setPreferredSize(new Dimension(INSTALLER_WINDOW_WIDTH, 415));\n\t\tcontainer.setMinimumSize(new Dimension(INSTALLER_WINDOW_WIDTH, 415));\n\t\treturn container;\n\t}\n\t\n\tprivate void showSuccess(String installSpecific) {\n\t\tsuccessExplanation.setText(SUCCESS_EXPLANATION.replace(\"%%%\", installSpecific));\n\t\thowIWorkArea.setVisible(false);\n\t\tjavacArea.setVisible(false);\n\t\tideArea.setVisible(false);\n\t\tsuccessArea.setVisible(true);\n\t\tappWindow.pack();\n\t}\n\t\n\tprivate JLabel successExplanation;\n\t\n\tprivate Component buildSuccessArea() {\n\t\tJPanel container = new JPanel();\n\t\t\n\t\tcontainer.setLayout(new GridBagLayout());\n\t\tGridBagConstraints constraints = new GridBagConstraints();\n\t\tconstraints.anchor = GridBagConstraints.WEST;\n\t\t\n\t\tJLabel title;\n\t\tcontainer.add(title = new JLabel(SUCCESS_TITLE), constraints);\n\t\ttitle.setPreferredSize(new Dimension(INSTALLER_WINDOW_WIDTH - 82, 20));\n\t\ttitle.setMinimumSize(new Dimension(INSTALLER_WINDOW_WIDTH - 82, 20));\n\t\t\n\t\tconstraints.gridy = 1;\n\t\tconstraints.insets = new Insets(8, 0, 0, 16);\n\t\tcontainer.add(successExplanation = new JLabel(SUCCESS_EXPLANATION), constraints);\n\t\tsuccessExplanation.setPreferredSize(new Dimension(INSTALLER_WINDOW_WIDTH - 82, 175));\n\t\tsuccessExplanation.setMinimumSize(new Dimension(INSTALLER_WINDOW_WIDTH - 82, 175));\n\t\t\n\t\tconstraints.gridy++;\n\t\tconstraints.fill = GridBagConstraints.BOTH;\n\t\t\n\t\tJTextPane notes = new JTextPane();\n\t\tnotes.setContentType(\"text/html\");\n\t\tnotes.setText(readChangeLog());\n\t\tnotes.setEditable(false);\n\t\tnotes.setOpaque(false);\n\t\tnotes.setBorder(null);\n\t\tnotes.setSelectionStart(0);\n\t\tnotes.setSelectionEnd(0);\n\t\t\n\t\tFont font = UIManager.getFont(\"Label.font\");\n\t\tString bodyRule = \"body { font-family: \" + font.getFamily() + \"; font-size: \" + font.getSize() + \"pt; }\";\n\t\t((HTMLDocument) notes.getDocument()).getStyleSheet().addRule(bodyRule);\n\t\tJScrollPane scroller = new JScrollPane(notes);\n\t\tcontainer.add(scroller, constraints);\n\t\tscroller.setPreferredSize(new Dimension(INSTALLER_WINDOW_WIDTH - 82, 200));\n\t\tscroller.setMinimumSize(new Dimension(INSTALLER_WINDOW_WIDTH - 82, 200));\n\t\tcontainer.setPreferredSize(new Dimension(INSTALLER_WINDOW_WIDTH, 415));\n\t\tcontainer.setMinimumSize(new Dimension(INSTALLER_WINDOW_WIDTH, 415));\n\t\treturn container;\n\t}\n\t\n\tprivate String readChangeLog() {\n\t\tInputStream in = Installer.class.getResourceAsStream(\"/latestchanges.html\");\n\t\ttry {\n\t\t\tchar[] buff = new char[8192];\n\t\t\tStringBuilder contents = new StringBuilder();\n\t\t\tInputStreamReader reader = new InputStreamReader(in, \"UTF-8\");\n\t\t\twhile (true) {\n\t\t\t\tint read = reader.read(buff);\n\t\t\t\tif (read == -1) break;\n\t\t\t\tcontents.append(buff, 0, read);\n\t\t\t}\n\t\t\treturn \"<html>\" + contents + \"</html>\";\n\t\t} catch (Exception e) {\n\t\t\treturn \"No Changelog available\";\n\t\t}\n\t\tfinally {\n\t\t\ttry {\n\t\t\t\tin.close();\n\t\t\t} catch (Exception ignore){ /**/}\n\t\t}\n\t}\n\t\n\tprivate Component buildUninstallArea() {\n\t\tJPanel container = new JPanel();\n\t\t\n\t\tcontainer.setLayout(new GridBagLayout());\n\t\tGridBagConstraints constraints = new GridBagConstraints();\n\t\tconstraints.anchor = GridBagConstraints.WEST;\n\t\t\n\t\tcontainer.add(new JLabel(UNINSTALL_TITLE), constraints);\n\t\t\n\t\tconstraints.gridy = 1;\n\t\tconstraints.insets = new Insets(8, 0, 0, 16);\n\t\tcontainer.add(new JLabel(UNINSTALL_EXPLANATION), constraints);\n\t\t\n\t\tuninstallBox = Box.createVerticalBox();\n\t\tconstraints.gridy = 2;\n\t\tconstraints.fill = GridBagConstraints.HORIZONTAL;\n\t\tcontainer.add(uninstallBox, constraints);\n\t\t\n\t\tconstraints.fill = GridBagConstraints.HORIZONTAL;\n\t\tconstraints.gridy = 3;\n\t\tcontainer.add(new JLabel(\"Are you sure?\"), constraints);\n\t\t\n\t\tBox buttonBar = Box.createHorizontalBox();\n\t\tJButton noButton = new JButton(\"No - Don't uninstall\");\n\t\tbuttonBar.add(noButton);\n\t\tbuttonBar.add(Box.createHorizontalGlue());\n\t\tJButton yesButton = new JButton(\"Yes - uninstall Lombok\");\n\t\tbuttonBar.add(yesButton);\n\t\t\n\t\tnoButton.addActionListener(new ActionListener() {\n\t\t\t@Override public void actionPerformed(ActionEvent e) {\n\t\t\t\tuninstallArea.setVisible(false);\n\t\t\t\tjavacArea.setVisible(true);\n\t\t\t\tideArea.setVisible(true);\n\t\t\t\tappWindow.pack();\n\t\t\t}\n\t\t});\n\t\t\n\t\tyesButton.addActionListener(new ActionListener() {\n\t\t\t@Override public void actionPerformed(ActionEvent e) {\n\t\t\t\tdoUninstall();\n\t\t\t}\n\t\t});\n\t\t\n\t\tconstraints.gridy = 4;\n\t\tcontainer.add(buttonBar, constraints);\n\t\t\n\t\tcontainer.setPreferredSize(new Dimension(INSTALLER_WINDOW_WIDTH, 415));\n\t\tcontainer.setMinimumSize(new Dimension(INSTALLER_WINDOW_WIDTH, 415));\n\t\treturn container;\n\t}\n\t\n\tprivate Component buildJavacArea() {\n\t\tJPanel container = new JPanel();\n\t\t\n\t\tcontainer.setLayout(new GridBagLayout());\n\t\tGridBagConstraints constraints = new GridBagConstraints();\n\t\tconstraints.anchor = GridBagConstraints.WEST;\n\t\tconstraints.insets = new Insets(8, 0, 0, 16);\n\t\t\n\t\tcontainer.add(new JLabel(JAVAC_TITLE), constraints);\n\t\t\n\t\tconstraints.gridy = 1;\n\t\tconstraints.weightx = 1.0;\n\t\tconstraints.fill = GridBagConstraints.HORIZONTAL;\n\t\tcontainer.add(new JLabel(JAVAC_EXPLANATION), constraints);\n\t\t\n\t\tJLabel example = new JLabel(JAVAC_EXAMPLE);\n\t\t\n\t\tconstraints.gridy = 2;\n\t\tcontainer.add(example, constraints);\n\t\tcontainer.setPreferredSize(new Dimension(INSTALLER_WINDOW_WIDTH, 105));\n\t\tcontainer.setMinimumSize(new Dimension(INSTALLER_WINDOW_WIDTH, 105));\n\t\treturn container;\n\t}\n\t\n\tprivate Component buildIdeArea() {\n\t\tJPanel container = new JPanel();\n\t\t\n\t\tcontainer.setLayout(new GridBagLayout());\n\t\tGridBagConstraints constraints = new GridBagConstraints();\n\t\tconstraints.anchor = GridBagConstraints.WEST;\n\t\t\n\t\tconstraints.insets = new Insets(8, 0, 0, 16);\n\t\tcontainer.add(new JLabel(IDE_TITLE), constraints);\n\t\t\n\t\tconstraints.gridy = 1;\n\t\tcontainer.add(new JLabel(IDE_EXPLANATION), constraints);\n\t\t\n\t\tconstraints.gridy = 2;\n\t\tloadingExpl = Box.createHorizontalBox();\n\t\tloadingExpl.add(new JLabel(new ImageIcon(Installer.class.getResource(\"loading.gif\"))));\n\t\tloadingExpl.add(new JLabel(IDE_LOADING_EXPLANATION));\n\t\tcontainer.add(loadingExpl, constraints);\n\t\t\n\t\tconstraints.weightx = 1.0;\n\t\tconstraints.gridy = 3;\n\t\tconstraints.fill = GridBagConstraints.HORIZONTAL;\n\t\tidesList = new IdesList();\n\t\t\n\t\tJScrollPane idesListScroll = new JScrollPane(idesList);\n\t\tidesListScroll.setBackground(Color.WHITE);\n\t\tidesListScroll.getViewport().setBackground(Color.WHITE);\n\t\tcontainer.add(idesListScroll, constraints);\n\t\t\n\t\tThread findIdesThread = new Thread() {\n\t\t\t@Override public void run() {\n\t\t\t\ttry {\n\t\t\t\t\tfinal List<IdeLocation> locations = new ArrayList<IdeLocation>();\n\t\t\t\t\tfinal List<CorruptedIdeLocationException> problems = new ArrayList<CorruptedIdeLocationException>();\n\t\t\t\t\tInstaller.autoDiscover(locations, problems);\n\t\t\t\t\t\n\t\t\t\t\tSwingUtilities.invokeLater(new Runnable() {\n\t\t\t\t\t\t@Override public void run() {\n\t\t\t\t\t\t\tfor (IdeLocation location : locations) {\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tidesList.addLocation(location);\n\t\t\t\t\t\t\t\t} catch (Throwable t) {\n\t\t\t\t\t\t\t\t\thandleException(t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tfor (CorruptedIdeLocationException problem : problems) {\n\t\t\t\t\t\t\t\tproblem.showDialog(appWindow);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tloadingExpl.setVisible(false);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (locations.size() + problems.size() == 0) {\n\t\t\t\t\t\t\t\tJOptionPane.showMessageDialog(appWindow,\n\t\t\t\t\t\t\t\t\t\"I can't find any IDEs on your computer.\\n\" +\n\t\t\t\t\t\t\t\t\t\"If you have IDEs installed on this computer, please use the \" +\n\t\t\t\t\t\t\t\t\t\"'Specify Location...' button to manually point out the \\n\" +\n\t\t\t\t\t\t\t\t\t\"location of your IDE installation to me. Thanks!\",\n\t\t\t\t\t\t\t\t\t\"Can't find IDE\", JOptionPane.INFORMATION_MESSAGE);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} catch (Throwable t) {\n\t\t\t\t\thandleException(t);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\t\n\t\tfindIdesThread.start();\n\t\t\n\t\tBox buttonBar = Box.createHorizontalBox();\n\t\tJButton specifyIdeLocationButton = new JButton(\"Specify location...\");\n\t\tbuttonBar.add(specifyIdeLocationButton);\n\t\tspecifyIdeLocationButton.addActionListener(new ActionListener() {\n\t\t\t@Override public void actionPerformed(ActionEvent event) {\n\t\t\t\tfinal List<Pattern> exeNames = Installer.getIdeExecutableNames();\n\t\t\t\tString file = null;\n\t\t\t\t\n\t\t\t\tif (OsUtils.getOS() == OS.MAC_OS_X) {\n\t\t\t\t\tFileDialog chooser = new FileDialog(appWindow);\n\t\t\t\t\tchooser.setMode(FileDialog.LOAD);\n\t\t\t\t\t\n\t\t\t\t\tchooser.setFilenameFilter(new FilenameFilter() {\n\t\t\t\t\t\t@Override public boolean accept(File dir, String fileName) {\n\t\t\t\t\t\t\tfor (Pattern exeName : exeNames) if (exeName.matcher(fileName).matches()) return true;\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tchooser.setVisible(true);\n\t\t\t\t\tif (chooser.getDirectory() != null && chooser.getFile() != null) {\n\t\t\t\t\t\tfile = new File(chooser.getDirectory(), chooser.getFile()).getAbsolutePath();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tJFileChooser chooser = new JFileChooser();\n\t\t\t\t\t\n\t\t\t\t\tchooser.setAcceptAllFileFilterUsed(false);\n\t\t\t\t\tchooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);\n\t\t\t\t\tchooser.setFileFilter(new FileFilter() {\n\t\t\t\t\t\t@Override public boolean accept(File f) {\n\t\t\t\t\t\t\tif (f.isDirectory()) return true;\n\t\t\t\t\t\t\tfor (Pattern exeName : exeNames) if (exeName.matcher(f.getName()).matches()) return true;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t@Override public String getDescription() {\n\t\t\t\t\t\t\treturn \"IDE Installation\";\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tswitch (chooser.showDialog(appWindow, \"Select\")) {\n\t\t\t\t\tcase JFileChooser.APPROVE_OPTION:\n\t\t\t\t\t\tfile = chooser.getSelectedFile().getAbsolutePath();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (file != null) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tIdeLocation loc = Installer.tryAllProviders(file);\n\t\t\t\t\t\tif (loc != null) idesList.addLocation(loc);\n\t\t\t\t\t\telse JOptionPane.showMessageDialog(appWindow, \"I can't find any IDE that lombok supports at location: \" + file, \"No IDE found\", JOptionPane.WARNING_MESSAGE);\n\t\t\t\t\t} catch (CorruptedIdeLocationException e) {\n\t\t\t\t\t\te.showDialog(appWindow);\n\t\t\t\t\t} catch (Throwable t) {\n\t\t\t\t\t\thandleException(t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t\n\t\tbuttonBar.add(Box.createHorizontalGlue());\n\t\tinstallButton = new JButton(\"Install / Update\");\n\t\tbuttonBar.add(installButton);\n\t\t\n\t\tinstallButton.addActionListener(new ActionListener() {\n\t\t\t@Override public void actionPerformed(ActionEvent e) {\n\t\t\t\tList<IdeLocation> locationsToInstall = new ArrayList<IdeLocation>(idesList.getSelectedIdes());\n\t\t\t\tif (locationsToInstall.isEmpty()) {\n\t\t\t\t\tJOptionPane.showMessageDialog(appWindow, \"You haven't selected any IDE installations!.\", \"No Selection\", JOptionPane.WARNING_MESSAGE);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tinstall(locationsToInstall);\n\t\t\t}\n\t\t});\n\t\t\n\t\tconstraints.gridy = 4;\n\t\tconstraints.weightx = 0;\n\t\tcontainer.add(buttonBar, constraints);\n\t\t\n\t\tconstraints.gridy = 5;\n\t\tconstraints.fill = GridBagConstraints.NONE;\n\t\tJHyperLink showMe = new JHyperLink(\"Show me what this installer will do to my IDE installation.\");\n\t\tcontainer.add(showMe, constraints);\n\t\tshowMe.addActionListener(new ActionListener() {\n\t\t\t@Override public void actionPerformed(ActionEvent e) {\n\t\t\t\tshowWhatIDo();\n\t\t\t}\n\t\t});\n\t\t\n\t\tconstraints.gridy = 6;\n\t\tuninstallButton = new JHyperLink(\"Uninstall lombok from selected IDE installations.\");\n\t\tuninstallPlaceholder = new JLabel(\"<html>&nbsp;</html>\");\n\t\tuninstallButton.addActionListener(new ActionListener() {\n\t\t\t@Override public void actionPerformed(ActionEvent e) {\n\t\t\t\tList<IdeLocation> locationsToUninstall = new ArrayList<IdeLocation>();\n\t\t\t\tfor (IdeLocation location : idesList.getSelectedIdes()) {\n\t\t\t\t\tif (location.hasLombok()) locationsToUninstall.add(location);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (locationsToUninstall.isEmpty()) {\n\t\t\t\t\tJOptionPane.showMessageDialog(appWindow, \"You haven't selected any IDE installations that have been lombok-enabled.\", \"No Selection\", JOptionPane.WARNING_MESSAGE);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tuninstall(locationsToUninstall);\n\t\t\t}\n\t\t});\n\t\tcontainer.add(uninstallButton, constraints);\n\t\tuninstallPlaceholder.setVisible(false);\n\t\tcontainer.add(uninstallPlaceholder, constraints);\n\t\t\n\t\tcontainer.setPreferredSize(new Dimension(INSTALLER_WINDOW_WIDTH, 296));\n\t\tcontainer.setMinimumSize(new Dimension(INSTALLER_WINDOW_WIDTH, 296));\n\t\treturn container;\n\t}\n\t\n\tprivate void showWhatIDo() {\n\t\tjavacArea.setVisible(false);\n\t\tideArea.setVisible(false);\n\t\thowIWorkArea.setVisible(true);\n\t\tsuccessArea.setVisible(false);\n\t\tappWindow.pack();\n\t}\n\t\n\tprivate void uninstall(List<IdeLocation> locations) {\n\t\tjavacArea.setVisible(false);\n\t\tideArea.setVisible(false);\n\t\t\n\t\tuninstallBox.removeAll();\n\t\tuninstallBox.add(Box.createRigidArea(new Dimension(1, 16)));\n\t\tfor (IdeLocation location : locations) {\n\t\t\tJLabel label = new JLabel(location.getName());\n\t\t\tlabel.setFont(label.getFont().deriveFont(Font.BOLD));\n\t\t\tuninstallBox.add(label);\n\t\t}\n\t\tuninstallBox.add(Box.createRigidArea(new Dimension(1, 16)));\n\t\t\n\t\ttoUninstall = locations;\n\t\tuninstallArea.setVisible(true);\n\t\tappWindow.pack();\n\t}\n\t\n\tprivate void install(final List<IdeLocation> toInstall) {\n\t\tJPanel spinner = new JPanel();\n\t\tspinner.setOpaque(true);\n\t\tspinner.setLayout(new FlowLayout());\n\t\tspinner.add(new JLabel(new ImageIcon(Installer.class.getResource(\"loading.gif\"))));\n\t\tfinal Container appWindowContent = appWindow.getContentPane();\n\t\tappWindow.setContentPane(spinner);\n\t\t\n\t\tfinal AtomicInteger successes = new AtomicInteger();\n\t\tfinal AtomicBoolean failure = new AtomicBoolean();\n\t\t\n\t\tnew Thread() {\n\t\t\t@Override public void run() {\n\t\t\t\tfor (IdeLocation loc : toInstall) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tinstallSpecificMessages.add(loc.install());\n\t\t\t\t\t\tsuccesses.incrementAndGet();\n\t\t\t\t\t} catch (final InstallException e) {\n\t\t\t\t\t\tif (e.isWarning()) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tSwingUtilities.invokeAndWait(new Runnable() {\n\t\t\t\t\t\t\t\t\t@Override public void run() {\n\t\t\t\t\t\t\t\t\t\tJOptionPane.showMessageDialog(appWindow,\n\t\t\t\t\t\t\t\t\t\t\t\te.getMessage(), \"Install Problem\", JOptionPane.WARNING_MESSAGE);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} catch (Exception e2) {\n\t\t\t\t\t\t\t\te2.printStackTrace();\n\t\t\t\t\t\t\t\t//Shouldn't happen.\n\t\t\t\t\t\t\t\tthrow new RuntimeException(e2);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfailure.set(true);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tSwingUtilities.invokeAndWait(new Runnable() {\n\t\t\t\t\t\t\t\t\t@Override public void run() {\n\t\t\t\t\t\t\t\t\t\tJOptionPane.showMessageDialog(appWindow,\n\t\t\t\t\t\t\t\t\t\t\t\te.getMessage(), \"Install Problem\", JOptionPane.ERROR_MESSAGE);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} catch (Exception e2) {\n\t\t\t\t\t\t\t\te2.printStackTrace();\n\t\t\t\t\t\t\t\t//Shouldn't happen.\n\t\t\t\t\t\t\t\tthrow new RuntimeException(e2);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (successes.get() > 0) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tSwingUtilities.invokeAndWait(new Runnable() {\n\t\t\t\t\t\t\t@Override public void run() {\n\t\t\t\t\t\t\t\tappWindow.setContentPane(appWindowContent);\n\t\t\t\t\t\t\t\tappWindow.pack();\n\t\t\t\t\t\t\t\tStringBuilder installSpecific = new StringBuilder();\n\t\t\t\t\t\t\t\tfor (String installSpecificMessage : installSpecificMessages) {\n\t\t\t\t\t\t\t\t\tinstallSpecific.append(\"<br>\").append(installSpecificMessage);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tshowSuccess(installSpecific.toString());\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t\t// Shouldn't happen.\n\t\t\t\t\t\tthrow new RuntimeException(e);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tSwingUtilities.invokeLater(new Runnable() {\n\t\t\t\t\t\t@Override public void run() {\n\t\t\t\t\t\t\tsynchronized (exitMarker) {\n\t\t\t\t\t\t\t\texitMarker.set(failure.get() ? 1 : 0);\n\t\t\t\t\t\t\t\texitMarker.notifyAll();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}.start();\n\t}\n\t\n\tprivate void doUninstall() {\n\t\tJPanel spinner = new JPanel();\n\t\tspinner.setOpaque(true);\n\t\tspinner.setLayout(new FlowLayout());\n\t\tspinner.add(new JLabel(new ImageIcon(Installer.class.getResource(\"/lombok/installer/loading.gif\"))));\n\t\t\n\t\tfinal Container originalContentPane = appWindow.getContentPane();\n\t\tappWindow.setContentPane(spinner);\n\t\t\n\t\tfinal AtomicInteger successes = new AtomicInteger();\n\t\tnew Thread(new Runnable() {\n\t\t\t@Override public void run() {\n\t\t\t\tfor (IdeLocation loc : toUninstall) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tloc.uninstall();\n\t\t\t\t\t\tsuccesses.incrementAndGet();\n\t\t\t\t\t} catch (final UninstallException e) {\n\t\t\t\t\t\tif (e.isWarning()) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tSwingUtilities.invokeAndWait(new Runnable() {\n\t\t\t\t\t\t\t\t\t@Override public void run() {\n\t\t\t\t\t\t\t\t\t\tJOptionPane.showMessageDialog(appWindow,\n\t\t\t\t\t\t\t\t\t\t\t\te.getMessage(), \"Uninstall Problem\", JOptionPane.WARNING_MESSAGE);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} catch (Exception e2) {\n\t\t\t\t\t\t\t\te2.printStackTrace();\n\t\t\t\t\t\t\t\t//Shouldn't happen.\n\t\t\t\t\t\t\t\tthrow new RuntimeException(e2);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tSwingUtilities.invokeAndWait(new Runnable() {\n\t\t\t\t\t\t\t\t\t@Override public void run() {\n\t\t\t\t\t\t\t\t\t\tJOptionPane.showMessageDialog(appWindow,\n\t\t\t\t\t\t\t\t\t\t\t\te.getMessage(), \"Uninstall Problem\", JOptionPane.ERROR_MESSAGE);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} catch (Exception e2) {\n\t\t\t\t\t\t\t\te2.printStackTrace();\n\t\t\t\t\t\t\t\t//Shouldn't happen.\n\t\t\t\t\t\t\t\tthrow new RuntimeException(e2);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tSwingUtilities.invokeLater(new Runnable() {\n\t\t\t\t\t@Override public void run() {\n\t\t\t\t\t\tif (successes.get() > 0) {\n\t\t\t\t\t\t\tJOptionPane.showMessageDialog(appWindow, \"Lombok has been removed from the selected IDE installations.\", \"Uninstall successful\", JOptionPane.INFORMATION_MESSAGE);\n\t\t\t\t\t\t\tappWindow.setVisible(false);\n\t\t\t\t\t\t\tSystem.exit(0);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tappWindow.setContentPane(originalContentPane);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\t\n\t\t\t}\n\t\t}).start();\n\t}\n\t\n\tprivate IdesList idesList = new IdesList();\n\t\n\tvoid selectedLomboksChanged(List<IdeLocation> selectedIdes) {\n\t\tboolean uninstallAvailable = false;\n\t\tboolean installAvailable = false;\n\t\tfor (IdeLocation loc : selectedIdes) {\n\t\t\tif (loc.hasLombok()) uninstallAvailable = true;\n\t\t\tinstallAvailable = true;\n\t\t}\n\t\t\n\t\tuninstallButton.setVisible(uninstallAvailable);\n\t\tuninstallPlaceholder.setVisible(!uninstallAvailable);\n\t\tinstallButton.setEnabled(installAvailable);\n\t}\n\t\n\tprivate class IdesList extends JPanel implements Scrollable {\n\t\tprivate static final long serialVersionUID = 1L;\n\t\t\n\t\tList<IdeLocation> locations = new ArrayList<IdeLocation>();\n\t\t\n\t\tIdesList() {\n\t\t\tsetLayout(new BoxLayout(this, BoxLayout.Y_AXIS));\n\t\t\tsetBackground(Color.WHITE);\n\t\t}\n\t\t\n\t\tList<IdeLocation> getSelectedIdes() {\n\t\t\tList<IdeLocation> list = new ArrayList<IdeLocation>();\n\t\t\tfor (IdeLocation loc : locations) if (loc.selected) list.add(loc);\n\t\t\treturn list;\n\t\t}\n\t\t\n\t\tvoid fireSelectionChange() {\n\t\t\tselectedLomboksChanged(getSelectedIdes());\n\t\t}\n\t\t\n\t\tvoid addLocation(final IdeLocation location) {\n\t\t\tif (locations.contains(location)) return;\n\t\t\tBox box = Box.createHorizontalBox();\n\t\t\tbox.setBackground(Color.WHITE);\n\t\t\tfinal JCheckBox checkbox = new JCheckBox(location.getName());\n\t\t\tcheckbox.setBackground(Color.WHITE);\n\t\t\tbox.add(new JLabel(new ImageIcon(location.getIdeIcon())));\n\t\t\tbox.add(checkbox);\n\t\t\tcheckbox.setSelected(true);\n\t\t\tcheckbox.addActionListener(new ActionListener() {\n\t\t\t\t@Override public void actionPerformed(ActionEvent e) {\n\t\t\t\t\tlocation.selected = checkbox.isSelected();\n\t\t\t\t\tfireSelectionChange();\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tif (location.hasLombok()) {\n\t\t\t\tbox.add(new JLabel(new ImageIcon(Installer.class.getResource(\"lombokIcon.png\"))));\n\t\t\t}\n\t\t\tbox.add(Box.createHorizontalGlue());\n\t\t\tlocations.add(location);\n\t\t\tadd(box);\n\t\t\tgetParent().doLayout();\n\t\t\tfireSelectionChange();\n\t\t}\n\t\t\n\t\t@Override public Dimension getPreferredScrollableViewportSize() {\n\t\t\treturn new Dimension(1, 100);\n\t\t}\n\t\t\n\t\t@Override public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {\n\t\t\treturn 12;\n\t\t}\n\t\t\n\t\t@Override public boolean getScrollableTracksViewportHeight() {\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\t@Override public boolean getScrollableTracksViewportWidth() {\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\t@Override public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {\n\t\t\treturn 1;\n\t\t}\n\t}\n\t\n\tprivate void buildChrome(Container appWindowContainer) {\n\t\tJLabel leftGraphic = new JLabel(new ImageIcon(Installer.class.getResource(\"lombok.png\")));\n\t\t\n\t\tGridBagConstraints constraints = new GridBagConstraints();\n\t\t\n\t\tappWindowContainer.setLayout(new GridBagLayout());\n\t\t\n\t\tconstraints.gridheight = 3;\n\t\tconstraints.gridwidth = 1;\n\t\tconstraints.gridx = 0;\n\t\tconstraints.gridy = 0;\n\t\tconstraints.insets = new Insets(8, 8, 8, 8);\n\t\tappWindowContainer.add(leftGraphic, constraints);\n\t\tconstraints.insets = new Insets(0, 0, 0, 0);\n\t\t\n\t\tconstraints.gridx++;\n\t\tconstraints.gridy++;\n\t\tconstraints.gridheight = 1;\n\t\tconstraints.fill = GridBagConstraints.HORIZONTAL;\n\t\tconstraints.ipadx = 16;\n\t\tconstraints.ipady = 14;\n\t\tappWindowContainer.add(javacArea, constraints);\n\t\t\n\t\tconstraints.gridy++;\n\t\tappWindowContainer.add(ideArea, constraints);\n\t\t\n\t\tappWindowContainer.add(uninstallArea, constraints);\n\t\t\n\t\tappWindowContainer.add(howIWorkArea, constraints);\n\t\t\n\t\tappWindowContainer.add(successArea, constraints);\n\t\t\n\t\tconstraints.gridy++;\n\t\tconstraints.gridwidth = 2;\n\t\tconstraints.gridx = 0;\n\t\tconstraints.weightx = 0;\n\t\tconstraints.weighty = 0;\n\t\tconstraints.ipadx = 0;\n\t\tconstraints.ipady = 0;\n\t\tconstraints.fill = GridBagConstraints.HORIZONTAL;\n\t\tconstraints.anchor = GridBagConstraints.SOUTHWEST;\n\t\tconstraints.insets = new Insets(0, 16, 8, 8);\n\t\t\n\t\tappWindow.add(buildButtonBar(), constraints);\n\t}\n\n\tprivate Box buildButtonBar() {\n\t\tBox buttonBar = Box.createHorizontalBox();\n\n\t\tJHyperLink aboutLink = new JHyperLink(Installer.ABOUT_LOMBOK_URL.toString());\n\t\taboutLink.addActionListener(openBrowser(aboutLink, Installer.ABOUT_LOMBOK_URL));\n\t\tbuttonBar.add(aboutLink);\n\t\t\n\t\tbuttonBar.add(Box.createRigidArea(new Dimension(16, 1)));\n\t\t\n\t\tJLabel versionLabel = new JLabel();\n\t\tversionLabel.setText(\"v\" + Version.getVersion());\n\n\t\tbuttonBar.add(versionLabel);\n\t\tbuttonBar.add(Box.createRigidArea(new Dimension(16, 1)));\n\t\t\n\t\tJHyperLink changelogLink = new JHyperLink(\"View full changelog\");\n\t\tchangelogLink.addActionListener(openBrowser(changelogLink, Installer.ABOUT_LOMBOK_URL.resolve(\"/changelog.html\")));\n\t\tbuttonBar.add(changelogLink);\n\t\t\n\t\tbuttonBar.add(Box.createHorizontalGlue());\n\t\t\n\t\tJButton quitButton = new JButton(\"Quit Installer\");\n\t\tquitButton.addActionListener(new ActionListener() {\n\t\t\t@Override public void actionPerformed(ActionEvent e) {\n\t\t\t\tappWindow.setVisible(false);\n\t\t\t\tSystem.exit(0);\n\t\t\t}\n\t\t});\n\t\tbuttonBar.add(quitButton);\n\t\treturn buttonBar;\n\t}\n\n\tprivate ActionListener openBrowser(final JHyperLink hyperlink, final URI location) {\n\t\treturn new ActionListener() {\n\t\t\t@Override public void actionPerformed(ActionEvent event) {\n\t\t\t\thyperlink.setForeground(new Color(85, 145, 90));\n\t\t\t\ttry {\n\t\t\t\t\t//java.awt.Desktop doesn't exist in 1.5.\n\t\t\t\t\tObject desktop = Class.forName(\"java.awt.Desktop\").getMethod(\"getDesktop\").invoke(null);\n\t\t\t\t\tClass.forName(\"java.awt.Desktop\").getMethod(\"browse\", URI.class).invoke(desktop, location);\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t\tRuntime rt = Runtime.getRuntime();\n\t\t\t\t\ttry {\n\t\t\t\t\t\tswitch (OsUtils.getOS()) {\n\t\t\t\t\t\tcase WINDOWS:\n\t\t\t\t\t\t\tString[] cmd = new String[4];\n\t\t\t\t\t\t\tcmd[0] = \"cmd.exe\";\n\t\t\t\t\t\t\tcmd[1] = \"/C\";\n\t\t\t\t\t\t\tcmd[2] = \"start\";\n\t\t\t\t\t\t\tcmd[3] = location.toString();\n\t\t\t\t\t\t\trt.exec(cmd);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase MAC_OS_X:\n\t\t\t\t\t\t\trt.exec(\"open \" + location.toString());\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\tcase UNIX:\n\t\t\t\t\t\t\trt.exec(\"firefox \" + location.toString());\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (Exception e2) {\n\t\t\t\t\t\tJOptionPane.showMessageDialog(appWindow,\n\t\t\t\t\t\t\t\t\"Well, this is embarrassing. I don't know how to open a webbrowser.\\n\" +\n\t\t\t\t\t\t\t\t\"I guess you'll have to open it. Browse to:\\n\" + location +\n\t\t\t\t\t\t\t\t\" for more information about Lombok.\",\n\t\t\t\t\t\t\t\t\"I'm embarrassed\", JOptionPane.INFORMATION_MESSAGE);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\t\n\t/**\n\t * Makes the installer window visible.\n\t */\n\tpublic void show() {\n\t\tappWindow.setVisible(true);\n\t\tif (OsUtils.getOS() == OS.MAC_OS_X) {\n\t\t\ttry {\n\t\t\t\tAppleNativeLook.go();\n\t\t\t} catch (Throwable ignore) {\n\t\t\t\t//We're just prettying up the app. If it fails, meh.\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate static final String IDE_TITLE =\n\t\t\"<html><font size=\\\"+1\\\"><b><i>IDEs </i></b></font></html>\";\n\t\n\tprivate static final String IDE_EXPLANATION =\n\t\t\"<html>Lombok can update your Eclipse or eclipse-based IDE to fully support all Lombok features.<br>\" +\n\t\t\"Select IDE installations below and hit 'Install/Update'.</html>\";\n\t\n\tprivate static final String IDE_LOADING_EXPLANATION =\n\t\t\"Scanning your drives for IDE installations...\";\n\t\n\tprivate static final String JAVAC_TITLE =\n\t\t\"<html><font size=\\\"+1\\\"><b><i>Javac </i></b></font> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (and tools that invoke javac such as <i>ant</i> and <i>maven</i>)</html>\";\n\t\n\tprivate static final String JAVAC_EXPLANATION =\n\t\t\"<html>Lombok works 'out of the box' with javac.<br>Just make sure the lombok.jar is in your classpath when you compile.\";\n\t\n\tprivate static final String JAVAC_EXAMPLE =\n\t\t\"<html>Example: <code>javac -cp lombok.jar MyCode.java</code></html>\";\n\t\n\tprivate static final String UNINSTALL_TITLE =\n\t\t\"<html><font size=\\\"+1\\\"><b><i>Uninstall </i></b></font></html>\";\n\t\n\tprivate static final String UNINSTALL_EXPLANATION =\n\t\t\"<html>Uninstall Lombok from the following IDE Installations?</html>\";\n\t\n\tprivate static final String HOW_I_WORK_TITLE =\n\t\t\"<html><font size=\\\"+1\\\"><b><i>What this installer does </i></b></font></html>\";\n\t\n\tprivate static final String HOW_I_WORK_EXPLANATION =\n\t\t\"<html><h2>Eclipse</h2><ol>\" +\n\t\t\"<li>First, I copy myself (lombok.jar) to your Eclipse install directory.</li>\" +\n\t\t\"<li>Then, I edit the <i>eclipse.ini</i> file to add the following entry:<br>\" +\n\t\t\"<pre>-javaagent:lombok.jar</pre></li></ol>\" +\n\t\t\"On Mac OS X, eclipse.ini is hidden in<br>\" +\n\t\t\"<code>Eclipse.app/Contents/MacOS</code> so that's where I place the jar files.</html>\";\n\t\n\tprivate static final String SUCCESS_TITLE = \"<html><font size=\\\"+1\\\"><b><i>Install successful </i></b></font></html>\";\n\tprivate static final String SUCCESS_EXPLANATION = \"<html>Lombok has been installed on the selected IDE installations.<br>\" +\n\t\t\t\"Don't forget to:<ul><li> add <code>lombok.jar</code> to your projects,<li><b>exit and start</b> your IDE,<li><b>rebuild</b> all projects!</ul>%%%</html>\";\n\t\n\t\n\tprivate static class JHyperLink extends JButton {\n\t\tprivate static final long serialVersionUID = 1L;\n\t\t\n\t\tpublic JHyperLink(String text) {\n\t\t\tsuper();\n\t\t\tsetFont(getFont().deriveFont(Collections.singletonMap(TextAttribute.UNDERLINE, 1)));\n\t\t\tsetText(text);\n\t\t\tsetBorder(null);\n\t\t\tsetContentAreaFilled(false);\n\t\t\tsetForeground(Color.BLUE);\n\t\t\tsetCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));\n\t\t\tsetMargin(new Insets(0, 0, 0, 0));\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/installer/lombok/installer/OsUtils.java",
    "content": "/*\n * Copyright (C) 2009-2016 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.installer;\n\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.atomic.AtomicBoolean;\n\nimport lombok.core.Version;\n\n/**\n * Implement and provide this class to add auto-finding a certain brand of IDEs to the lombok installer.\n */\npublic final class OsUtils {\n\tprivate static final AtomicBoolean windowsDriveInfoLibLoaded = new AtomicBoolean(false);\n\t\n\tprivate OsUtils() {\n\t\t// Prevent instantiation\n\t}\n\t\n\tprivate static void loadWindowsDriveInfoLib() throws IOException {\n\t\tif (!windowsDriveInfoLibLoaded.compareAndSet(false, true)) return;\n\t\t\n\t\tfinal String prefix = \"lombok-\" + Version.getVersion() + \"-\";\n\t\t\n\t\tFile temp = File.createTempFile(\"lombok\", \".mark\");\n\t\tFile dll1 = new File(temp.getParentFile(), prefix + \"WindowsDriveInfo-i386.dll\");\n\t\tFile dll2 = new File(temp.getParentFile(), prefix + \"WindowsDriveInfo-x86_64.dll\");\n\t\ttemp.delete();\n\t\tdll1.deleteOnExit();\n\t\tdll2.deleteOnExit();\n\t\ttry {\n\t\t\tif (unpackDLL(\"WindowsDriveInfo-i386.binary\", dll1)) {\n\t\t\t\tSystem.load(dll1.getAbsolutePath());\n\t\t\t\treturn;\n\t\t\t}\n\t\t} catch (Throwable ignore) {}\n\t\t\n\t\ttry {\n\t\t\tif (unpackDLL(\"WindowsDriveInfo-x86_64.binary\", dll2)) {\n\t\t\t\tSystem.load(dll2.getAbsolutePath());\n\t\t\t}\n\t\t} catch (Throwable ignore) {}\n\t}\n\t\n\tprivate static boolean unpackDLL(String dllName, File target) throws IOException {\n\t\tInputStream in = OsUtils.class.getResourceAsStream(dllName);\n\t\ttry {\n\t\t\ttry {\n\t\t\t\tFileOutputStream out = new FileOutputStream(target);\n\t\t\t\ttry {\n\t\t\t\t\tbyte[] b = new byte[32000];\n\t\t\t\t\twhile (true) {\n\t\t\t\t\t\tint r = in.read(b);\n\t\t\t\t\t\tif (r == -1) break;\n\t\t\t\t\t\tout.write(b, 0, r);\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\tout.close();\n\t\t\t\t}\n\t\t\t} catch (IOException e) {\n\t\t\t\t//Fall through - if there is a file named lombok-WindowsDriveInfo-arch.dll, we'll try it.\n\t\t\t\treturn target.exists() && target.canRead();\n\t\t\t}\n\t\t} finally {\n\t\t\tin.close();\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\t/**\n\t * Returns all drive letters on windows that represent fixed disks.\n\t * \n\t * Floppy drives, optical drives, USB sticks, and network drives should all be excluded.\n\t * \n\t * @return A List of drive letters, such as [\"C\", \"D\", \"X\"].\n\t */\n\tpublic static List<String> getDrivesOnWindows() throws Throwable {\n\t\tloadWindowsDriveInfoLib();\n\t\t\n\t\tList<String> drives = new ArrayList<String>();\n\t\t\n\t\tWindowsDriveInfo info = new WindowsDriveInfo();\n\t\tfor (String drive : info.getLogicalDrives()) {\n\t\t\tif (info.isFixedDisk(drive)) drives.add(drive);\n\t\t}\n\t\t\n\t\treturn drives;\n\t}\n\t\n\tpublic static enum OS {\n\t\tMAC_OS_X(\"\\n\"), WINDOWS(\"\\r\\n\"), UNIX(\"\\n\");\n\t\t\n\t\tprivate final String lineEnding;\n\t\t\n\t\tOS(String lineEnding) {\n\t\t\tthis.lineEnding = lineEnding;\n\t\t}\n\t\t\n\t\tpublic String getLineEnding() {\n\t\t\treturn lineEnding;\n\t\t}\n\t}\n\t\n\tpublic static OS getOS() {\n\t\tString prop = System.getProperty(\"os.name\", \"\").toLowerCase();\n\t\tif (prop.matches(\"^.*\\\\bmac\\\\b.*$\")) return OS.MAC_OS_X;\n\t\tif (prop.matches(\"^.*\\\\bdarwin\\\\b.*$\")) return OS.MAC_OS_X;\n\t\tif (prop.matches(\"^.*\\\\bwin(dows|32|64)?\\\\b.*$\")) return OS.WINDOWS;\n\t\t\n\t\treturn OS.UNIX;\n\t}\n}\n"
  },
  {
    "path": "src/installer/lombok/installer/UninstallException.java",
    "content": "/*\n * Copyright (C) 2009-2010 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.installer;\n\n/**\n * Thrown when uninstallation of lombok into an IDE fails.\n */\npublic class UninstallException extends Exception {\n\tprivate boolean warning;\n\t\n\tpublic UninstallException(String message, Throwable cause) {\n\t\tsuper(message, cause);\n\t}\n\t\n\tpublic UninstallException(boolean warning, String message, Throwable cause) {\n\t\tsuper(message, cause);\n\t\tthis.warning = warning;\n\t}\n\t\n\tpublic boolean isWarning() {\n\t\treturn warning;\n\t}\n}\n"
  },
  {
    "path": "src/installer/lombok/installer/WindowsDriveInfo.java",
    "content": "/*\n * Copyright (C) 2009 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.installer;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * This class uses native calls on windows to figure out all drives,\n * and, for each drive, if its a harddisk or something else.\n * \n * The output is essentially equivalent to running windows executable:\n * <pre>fsutil fsinfo drives</pre>\n * and\n * <pre>fsutil fsinfo drivetype C:</pre>\n * \n * except that (A) fsutil requires privileges, (B) someone might have moved\n * it out of the path or some such, and (C) its output is internationalized,\n * so unless you want to include a table of how to say \"Fixed Disk\" in 300\n * languages, this really is a superior solution.\n * <p>\n * To compile it, you'll need windows, as well as MinGW:\n * http://sourceforge.net/projects/mingw/files/\n * <p>\n * Fetch gcc 4.0.4+, you don't need anything extra. Toss /c/mingw/bin in\n * your git bash prompt's path (/etc/profile) and then run:\n * \n * $ gcc -c \\\n      -I \"/c/Program Files/Java/jdk1.6.0_14/include\" \\\n     -I \"/c/Program Files/Java/jdk1.6.0_14/include/win32\" \\\n     -D__int64=\"long long\" lombok_installer_WindowsDriveInfo.c\n * \n * $ dllwrap.exe --add-stdcall-alias \\\n      -o WindowsDriveInfo-i386.dll \\\n      lombok_installer_WindowsDriveInfo.o\n * \n * You may get a warning along the lines of \"Creating an export definition\".\n * This is expected behaviour.\n * \n * <p>\n * Now download MinGW-w64 to build the 64-bit version of the dll (you thought you were done, weren't you?)\n * from: http://sourceforge.net/projects/mingw-w64/files/\n *  (under toolchains targetting Win64 / Release for GCC 4.4.0 (or later) / the version for your OS.)\n * \n * Then, do this all over again, but this time with the  x86_64-w64-mingw32-gcc and\n *  x86_64-w64-mingw32-dllwrap versions that are part of the MinGW-w64 distribution.\n *  Name the dll 'WindowsDriveInfo-x86_64.dll'.\n * \n * Both the 32-bit and 64-bit DLLs that this produces have been checked into the git repository\n * under src/lombok/installer so you won't need to build them again unless you make some changes to\n * the code in the winsrc directory.\n */\npublic class WindowsDriveInfo {\n\t/**\n\t * Return a list of all available drive letters, such as [\"A\", \"C\", \"D\"].\n\t */\n\tpublic List<String> getLogicalDrives() {\n\t\tint flags = getLogicalDrives0();\n\t\t\n\t\tList<String> letters = new ArrayList<String>();\n\t\tfor (int i = 0; i < 26; i++) {\n\t\t\tif ((flags & (1 << i)) != 0) letters.add(Character.toString((char)('A' + i)));\n\t\t}\n\t\t\n\t\treturn letters;\n\t}\n\t\n\t/**\n\t * Calls kernel32's GetLogicalDrives, which returns an int containing\n\t * flags; bit 0 corresponds to drive A, bit 25 to drive Z. on = disk exists.\n\t */\n\tprivate native int getLogicalDrives0();\n\t\n\t/**\n\t * Feed it a drive letter (such as 'A') to see if it is a fixed disk.\n\t */\n\tpublic boolean isFixedDisk(String letter) {\n\t\tif (letter.length() != 1) throw new IllegalArgumentException(\"Supply 1 letter, not: \" + letter);\n\t\tchar drive = Character.toUpperCase(letter.charAt(0));\n\t\tif (drive < 'A' || drive > 'Z') throw new IllegalArgumentException(\n\t\t\t\t\"A drive is indicated by a letter, so A-Z inclusive. Not \" + drive);\n\t\treturn getDriveType(drive + \":\\\\\") == 3L;\n\t}\n\t\n\t/**\n\t * Mirror of kernel32's GetDriveTypeA. You must pass in 'A:\\\\' - \n\t * so including both a colon and a backslash!\n\t * \n\t * 0 = error\n\t * 1 = doesn't exist\n\t * 2 = removable drive\n\t * 3 = fixed disk\n\t * 4 = remote (network) disk\n\t * 5 = cd-rom\n\t * 6 = ram disk\n\t */\n\tprivate native int getDriveType(String name);\n\t\n\tpublic static void main(String[] args) {\n\t\tSystem.loadLibrary(\"WindowsDriveInfo\");\n\t\tWindowsDriveInfo info = new WindowsDriveInfo();\n\t\t\n\t\tfor (String letter : info.getLogicalDrives()) {\n\t\t\tSystem.out.printf(\"Drive %s: - %s\\n\", letter,\n\t\t\t\t\tinfo.isFixedDisk(letter) ? \"Fixed Disk\" : \"Not Fixed Disk\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/installer/lombok/installer/eclipse/AngularIDELocationProvider.java",
    "content": "/*\n * Copyright (C) 2018-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.installer.eclipse;\n\nimport java.util.Collections;\n\nimport lombok.installer.IdeLocationProvider;\nimport lombok.spi.Provides;\n\n@Provides(IdeLocationProvider.class)\npublic class AngularIDELocationProvider extends EclipseProductLocationProvider {\n\t\n\tprivate static final EclipseProductDescriptor ANGULAR = new StandardProductDescriptor(\n\t\t\t\"Angular IDE\",\n\t\t\t\"angularide\",\n\t\t\t\"angular\",\n\t\t\tAngularIDELocationProvider.class.getResource(\"angular.png\"),\n\t\t\tCollections.<String>emptySet()\n\t);\n\t\n\tpublic AngularIDELocationProvider() {\n\t\tsuper(ANGULAR);\n\t}\n}\n"
  },
  {
    "path": "src/installer/lombok/installer/eclipse/EclipseLocationProvider.java",
    "content": "/*\n * Copyright (C) 2009-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.installer.eclipse;\n\nimport java.util.Collections;\n\nimport lombok.installer.IdeLocationProvider;\nimport lombok.spi.Provides;\n\n@Provides(IdeLocationProvider.class)\npublic class EclipseLocationProvider extends EclipseProductLocationProvider {\n\t\n\tprivate static final EclipseProductDescriptor ECLIPSE = new StandardProductDescriptor(\n\t\t\t\"Eclipse\",\n\t\t\t\"eclipse\",\n\t\t\t\"eclipse\",\n\t\t\tEclipseLocationProvider.class.getResource(\"eclipse.png\"),\n\t\t\tCollections.<String>emptySet()\n\t);\n\t\n\tpublic EclipseLocationProvider() {\n\t\tsuper(ECLIPSE);\n\t}\n}\n"
  },
  {
    "path": "src/installer/lombok/installer/eclipse/EclipseProductDescriptor.java",
    "content": "/*\n * Copyright (C) 2016 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.installer.eclipse;\n\nimport java.net.URL;\nimport java.util.List;\nimport java.util.regex.Pattern;\n\npublic interface EclipseProductDescriptor {\n\tString getProductName();\n\tString getWindowsExecutableName();\n\tString getUnixAppName();\n\tString getMacAppName();\n\tString getDirectoryName();\n\tList<String> getExecutableNames();\n\tList<String> getSourceDirsOnWindows();\n\tList<String> getSourceDirsOnMac();\n\tList<String> getSourceDirsOnUnix();\n\tString getIniFileName();\n\tPattern getLocationSelectors();\n\tURL getIdeIcon();\n}"
  },
  {
    "path": "src/installer/lombok/installer/eclipse/EclipseProductLocation.java",
    "content": "/*\n * Copyright (C) 2009-2017 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.installer.eclipse;\n\nimport java.io.BufferedReader;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.net.URL;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\nimport lombok.installer.CorruptedIdeLocationException;\nimport lombok.installer.IdeLocation;\nimport lombok.installer.InstallException;\nimport lombok.installer.Installer;\nimport lombok.installer.OsUtils;\nimport lombok.installer.UninstallException;\n\n/**\n * Represents an Eclipse installation.\n * An instance can figure out if an Eclipse installation has been lombok-ified, and can\n * install and uninstall lombok from the Eclipse installation.\n */\npublic final class EclipseProductLocation extends IdeLocation {\n\t\n\tprivate static final String OS_NEWLINE = OsUtils.getOS().getLineEnding();\n\t\n\tprivate final EclipseProductDescriptor descriptor;\n\tprivate final String[] name;\n\tprivate final File[] eclipseIniPath;\n\tprivate final String[] pathToLombokJarPrefix;\n\tprivate final boolean[] hasLombok;\n\t\n\tEclipseProductLocation(EclipseProductDescriptor descriptor, String[] nameOfLocation, File[] pathToEclipseIni) throws CorruptedIdeLocationException {\n\t\tthis.descriptor = descriptor;\n\t\tthis.name = nameOfLocation;\n\t\tthis.eclipseIniPath = pathToEclipseIni;\n\t\tthis.pathToLombokJarPrefix = new String[pathToEclipseIni.length];\n\t\tthis.hasLombok = new boolean[pathToEclipseIni.length];\n\t\t\n\t\tfor (int i = 0; i < pathToEclipseIni.length; i++) {\n\t\t\tFile p1 = pathToEclipseIni[i].getParentFile();\n\t\t\tFile p2 = p1 == null ? null : p1.getParentFile();\n\t\t\tFile p3 = p2 == null ? null : p2.getParentFile();\n\t\t\tif (p1 != null && p1.getName().equals(\"Eclipse\") && p2 != null && p2.getName().equals(\"Contents\") && p3 != null && p3.getName().endsWith(\".app\")) {\n\t\t\t\tthis.pathToLombokJarPrefix[i] = \"../Eclipse/\";\n\t\t\t} else {\n\t\t\t\tthis.pathToLombokJarPrefix[i] = \"\";\n\t\t\t}\n\t\t\t\n\t\t\ttry {\n\t\t\t\tthis.hasLombok[i] = checkForLombok(eclipseIniPath[i]);\n\t\t\t} catch (IOException e) {\n\t\t\t\tthrow new CorruptedIdeLocationException(\n\t\t\t\t\t\t\"I can't read the configuration file of the \" + descriptor.getProductName() + \" installed at \" + name + \"\\n\" +\n\t\t\t\t\t\t\"You may need to run this installer with root privileges if you want to modify that \" + descriptor.getProductName() + \".\", descriptor.getProductName(), e);\n\t\t\t}\n\t\t}\n\t}\n\t\n\t@Override public int hashCode() {\n\t\treturn Arrays.hashCode(eclipseIniPath);\n\t}\n\t\n\t@Override public boolean equals(Object o) {\n\t\tif (!(o instanceof EclipseProductLocation)) return false;\n\t\treturn Arrays.deepEquals(((EclipseProductLocation)o).eclipseIniPath, eclipseIniPath);\n\t}\n\t\n\t/**\n\t * Returns the name of this location; generally the path to the eclipse executable.\n\t */\n\t@Override\n\tpublic String getName() {\n\t\treturn name[0];\n\t}\n\t\n\t/**\n\t * @return true if the Eclipse installation has been instrumented with lombok.\n\t */\n\t@Override\n\tpublic boolean hasLombok() {\n\t\tfor (int i = 0; i < hasLombok.length; i++) {\n\t\t\tif (!hasLombok[i]) return false;\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\tprivate static final Pattern JAVA_AGENT_LINE_MATCHER = Pattern.compile(\n\t\t\t\"^\\\\-javaagent\\\\:.*lombok.*\\\\.jar$\", Pattern.CASE_INSENSITIVE);\n\t\n\tprivate static final Pattern BOOTCLASSPATH_LINE_MATCHER = Pattern.compile(\n\t\t\t\"^\\\\-Xbootclasspath\\\\/a\\\\:(.*lombok.*\\\\.jar.*)$\", Pattern.CASE_INSENSITIVE);\n\t\n\tprivate static boolean checkForLombok(File iniFile) throws IOException {\n\t\tif (!iniFile.exists()) return false;\n\t\tFileInputStream fis = new FileInputStream(iniFile);\n\t\ttry {\n\t\t\tBufferedReader br = new BufferedReader(new InputStreamReader(fis));\n\t\t\tString line;\n\t\t\twhile ((line = br.readLine()) != null) {\n\t\t\t\tif (JAVA_AGENT_LINE_MATCHER.matcher(line.trim()).matches()) {\n\t\t\t\t\tbr.close();\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tbr.close();\n\t\t\treturn false;\n\t\t} finally {\n\t\t\tfis.close();\n\t\t}\n\t}\n\t\n\t/** Returns directories that may contain lombok.jar files that need to be deleted. */\n\tprivate List<File> getUninstallDirs() {\n\t\tSet<String> result = new HashSet<String>();\n\t\tfor (int i = 0; i < name.length; i++) {\n\t\t\tFile x = new File(name[i]);\n\t\t\tif (!x.isDirectory()) x = x.getParentFile();\n\t\t\tif (x.isDirectory()) result.add(x.getAbsolutePath());\n\t\t\tresult.add(eclipseIniPath[i].getAbsolutePath());\n\t\t}\n\t\t\n\t\tList<File> out = new ArrayList<File>();\n\t\tfor (String r : result) out.add(new File(r));\n\t\treturn out;\n\t}\n\t\n\t/**\n\t * Uninstalls lombok from this location.\n\t * It's a no-op if lombok wasn't there in the first place,\n\t * and it will remove a half-succeeded lombok installation as well.\n\t * \n\t * @throws UninstallException\n\t *             If there's an obvious I/O problem that is preventing\n\t *             installation. bugs in the uninstall code will probably throw\n\t *             other exceptions; this is intentional.\n\t */\n\t@Override \n\tpublic void uninstall() throws UninstallException {\n\t\tfinal List<File> lombokJarsForWhichCantDeleteSelf = new ArrayList<File>();\n\t\tStringBuilder newContents = new StringBuilder();\n\t\tfor (int i = 0; i < eclipseIniPath.length; i++) {\n\t\t\tif (eclipseIniPath[i].exists()) {\n\t\t\t\ttry {\n\t\t\t\t\tFileInputStream fis = new FileInputStream(eclipseIniPath[i]);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tBufferedReader br = new BufferedReader(new InputStreamReader(fis));\n\t\t\t\t\t\tString line;\n\t\t\t\t\t\twhile ((line = br.readLine()) != null) {\n\t\t\t\t\t\t\tif (JAVA_AGENT_LINE_MATCHER.matcher(line).matches()) continue;\n\t\t\t\t\t\t\tMatcher m = BOOTCLASSPATH_LINE_MATCHER.matcher(line);\n\t\t\t\t\t\t\tif (m.matches()) {\n\t\t\t\t\t\t\t\tStringBuilder elemBuilder = new StringBuilder();\n\t\t\t\t\t\t\t\telemBuilder.append(\"-Xbootclasspath/a:\");\n\t\t\t\t\t\t\t\tboolean first = true;\n\t\t\t\t\t\t\t\tfor (String elem : m.group(1).split(Pattern.quote(File.pathSeparator))) {\n\t\t\t\t\t\t\t\t\tif (elem.toLowerCase().endsWith(\"lombok.jar\")) continue;\n\t\t\t\t\t\t\t\t\t/* legacy code -see previous comment that starts with 'legacy' */ {\n\t\t\t\t\t\t\t\t\t\tif (elem.toLowerCase().endsWith(\"lombok.eclipse.agent.jar\")) continue;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (first) first = false;\n\t\t\t\t\t\t\t\t\telse elemBuilder.append(File.pathSeparator);\n\t\t\t\t\t\t\t\t\telemBuilder.append(elem);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (!first) newContents.append(elemBuilder.toString()).append(OS_NEWLINE);\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tnewContents.append(line).append(OS_NEWLINE);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbr.close();\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tfis.close();\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tFileOutputStream fos = new FileOutputStream(eclipseIniPath[i]);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfos.write(newContents.toString().getBytes());\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tfos.close();\n\t\t\t\t\t}\n\t\t\t\t} catch (IOException e) {\n\t\t\t\t\tthrow new UninstallException(\"Cannot uninstall lombok from \" + name + generateWriteErrorMessage(), e);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tfor (File dir : getUninstallDirs()) {\n\t\t\t\tFile lombokJar = new File(dir, \"lombok.jar\");\n\t\t\t\tif (lombokJar.exists()) {\n\t\t\t\t\tif (!lombokJar.delete()) {\n\t\t\t\t\t\tif (OsUtils.getOS() == OsUtils.OS.WINDOWS && Installer.isSelf(lombokJar.getAbsolutePath())) {\n\t\t\t\t\t\t\tlombokJarsForWhichCantDeleteSelf.add(lombokJar);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow new UninstallException(\n\t\t\t\t\t\t\t\t\"Can't delete \" + lombokJar.getAbsolutePath() + generateWriteErrorMessage(), null);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t/* legacy code - lombok at one point used to have a separate jar for the eclipse agent.\n\t\t\t\t * Leave this code in to delete it for those upgrading from an old version. */ {\n\t\t\t\t\tFile agentJar = new File(dir, \"lombok.eclipse.agent.jar\");\n\t\t\t\t\tif (agentJar.exists()) {\n\t\t\t\t\t\tagentJar.delete();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (!lombokJarsForWhichCantDeleteSelf.isEmpty()) {\n\t\t\t\tthrow new UninstallException(true, String.format(\n\t\t\t\t\t\t\"lombok.jar cannot delete itself on windows.\\nHowever, lombok has been uncoupled from your %s.\\n\" +\n\t\t\t\t\t\t\"You can safely delete this jar file. You can find it at:\\n%s\",\n\t\t\t\t\t\tdescriptor.getProductName(), lombokJarsForWhichCantDeleteSelf.get(0).getAbsolutePath()), null);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate static String generateWriteErrorMessage() {\n\t\tString osSpecificError;\n\t\t\n\t\tswitch (OsUtils.getOS()) {\n\t\tdefault:\n\t\tcase MAC_OS_X:\n\t\tcase UNIX:\n\t\t\tosSpecificError = \":\\nStart terminal, go to the directory with lombok.jar, and run: sudo java -jar lombok.jar\";\n\t\t\tbreak;\n\t\tcase WINDOWS:\n\t\t\tosSpecificError = \":\\nStart a new cmd (dos box) with admin privileges, go to the directory with lombok.jar, and run: java -jar lombok.jar\";\n\t\t\tbreak;\n\t\t}\n\t\t\n\t\treturn \", probably because this installer does not have the access rights.\\n\" +\n\t\t\"Try re-running the installer with administrative privileges\" + osSpecificError;\n\t}\n\t\n\t/**\n\t * Install lombok into the Eclipse at this location.\n\t * If lombok is already there, it is overwritten neatly (upgrade mode).\n\t * \n\t * @throws InstallException\n\t *             If there's an obvious I/O problem that is preventing\n\t *             installation. bugs in the install code will probably throw\n\t *             other exceptions; this is intentional.\n\t */\n\t@Override\n\tpublic String install() throws InstallException {\n\t\t// On Linux, for whatever reason, relative paths in your eclipse.ini file don't work, but only for -javaagent.\n\t\t// On Windows, since the Oomph, the generated shortcut starts in the wrong directory.\n\t\t// So the default is to use absolute paths, breaking lombok when you move the eclipse directory.\n\t\t// Or not break when you copy your directory, but break later when you remove the original one.\n\t\tboolean fullPathRequired = !\"false\".equals(System.getProperty(\"lombok.installer.fullpath\", \"true\"));\n\t\t\n\t\tboolean installSucceeded = false;\n\t\tStringBuilder newContents = new StringBuilder();\n\t\t\n\t\tfor (int i = 0; i < eclipseIniPath.length; i++) {\n\t\t\tinstallSucceeded = false;\n\t\t\tFile lombokJar = new File(eclipseIniPath[i].getParentFile(), \"lombok.jar\");\n\t\t\t\n\t\t\t/* No need to copy lombok.jar to itself, obviously. On windows this would generate an error so we check for this. */\n\t\t\tif (!Installer.isSelf(lombokJar.getAbsolutePath())) {\n\t\t\t\tFile ourJar = findOurJar();\n\t\t\t\tbyte[] b = new byte[524288];\n\t\t\t\tboolean readSucceeded = true;\n\t\t\t\ttry {\n\t\t\t\t\tFileOutputStream out = new FileOutputStream(lombokJar);\n\t\t\t\t\ttry {\n\t\t\t\t\t\treadSucceeded = false;\n\t\t\t\t\t\tInputStream in = new FileInputStream(ourJar);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\twhile (true) {\n\t\t\t\t\t\t\t\tint r = in.read(b);\n\t\t\t\t\t\t\t\tif (r == -1) break;\n\t\t\t\t\t\t\t\tif (r > 0) readSucceeded = true;\n\t\t\t\t\t\t\t\tout.write(b, 0, r);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tin.close();\n\t\t\t\t\t\t}\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tout.close();\n\t\t\t\t\t}\n\t\t\t\t} catch (IOException e) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlombokJar.delete();\n\t\t\t\t\t} catch (Throwable ignore) { /* Nothing we can do about that. */ }\n\t\t\t\t\tif (!readSucceeded) {\n\t\t\t\t\t\tthrow new InstallException(\n\t\t\t\t\t\t\t\"I can't read my own jar file (trying: \" + ourJar.toString() + \"). I think you've found a bug in this installer!\\nI suggest you restart it \" +\n\t\t\t\t\t\t\t\"and use the 'what do I do' link, to manually install lombok. Also, tell us about this at:\\n\" +\n\t\t\t\t\t\t\t\"http://groups.google.com/group/project-lombok - Thanks!\\n\\n[DEBUG INFO] \" + e.getClass() + \": \" + e.getMessage() + \"\\nBase: \" + OsUtils.class.getResource(\"OsUtils.class\"), e);\n\t\t\t\t\t}\n\t\t\t\t\tthrow new InstallException(\"I can't write to your \" + descriptor.getProductName() + \" directory at \" + name + generateWriteErrorMessage(), e);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/* legacy - delete lombok.eclipse.agent.jar if its there, which lombok no longer uses. */ {\n\t\t\t\tnew File(lombokJar.getParentFile(), \"lombok.eclipse.agent.jar\").delete();\n\t\t\t}\n\t\t\t\n\t\t\ttry {\n\t\t\t\tFileInputStream fis = new FileInputStream(eclipseIniPath[i]);\n\t\t\t\ttry {\n\t\t\t\t\tBufferedReader br = new BufferedReader(new InputStreamReader(fis));\n\t\t\t\t\tString line;\n\t\t\t\t\twhile ((line = br.readLine()) != null) {\n\t\t\t\t\t\tif (JAVA_AGENT_LINE_MATCHER.matcher(line).matches()) continue;\n\t\t\t\t\t\tMatcher m = BOOTCLASSPATH_LINE_MATCHER.matcher(line);\n\t\t\t\t\t\tif (m.matches()) {\n\t\t\t\t\t\t\tStringBuilder elemBuilder = new StringBuilder();\n\t\t\t\t\t\t\telemBuilder.append(\"-Xbootclasspath/a:\");\n\t\t\t\t\t\t\tboolean first = true;\n\t\t\t\t\t\t\tfor (String elem : m.group(1).split(Pattern.quote(File.pathSeparator))) {\n\t\t\t\t\t\t\t\tif (elem.toLowerCase().endsWith(\"lombok.jar\")) continue;\n\t\t\t\t\t\t\t\t/* legacy code -see previous comment that starts with 'legacy' */ {\n\t\t\t\t\t\t\t\t\tif (elem.toLowerCase().endsWith(\"lombok.eclipse.agent.jar\")) continue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (first) first = false;\n\t\t\t\t\t\t\t\telse elemBuilder.append(File.pathSeparator);\n\t\t\t\t\t\t\t\telemBuilder.append(elem);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!first) newContents.append(elemBuilder.toString()).append(OS_NEWLINE);\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tnewContents.append(line).append(OS_NEWLINE);\n\t\t\t\t\t}\n\t\t\t\t\tbr.close();\n\t\t\t\t} finally {\n\t\t\t\t\tfis.close();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tString pathPrefix;\n\t\t\t\tif (fullPathRequired) {\n\t\t\t\t\tpathPrefix = lombokJar.getParentFile().getCanonicalPath() + File.separator;\n\t\t\t\t} else {\n\t\t\t\t\tpathPrefix = pathToLombokJarPrefix[i];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// NB: You may be tempted to escape this, but don't; there is no possibility to escape this, but\n\t\t\t\t// eclipse/java reads the string following the colon in 'raw' fashion. Spaces, colons - all works fine.\n\t\t\t\tnewContents.append(String.format(\n\t\t\t\t\t\"-javaagent:%s\", pathPrefix + \"lombok.jar\")).append(OS_NEWLINE);\n\t\t\t\t\n\t\t\t\tFileOutputStream fos = new FileOutputStream(eclipseIniPath[i]);\n\t\t\t\ttry {\n\t\t\t\t\tfos.write(newContents.toString().getBytes());\n\t\t\t\t} finally {\n\t\t\t\t\tfos.close();\n\t\t\t\t}\n\t\t\t\tinstallSucceeded = true;\n\t\t\t} catch (IOException e) {\n\t\t\t\tthrow new InstallException(\"Cannot install lombok at \" + name + generateWriteErrorMessage(), e);\n\t\t\t} finally {\n\t\t\t\tif (!installSucceeded) try {\n\t\t\t\t\tlombokJar.delete();\n\t\t\t\t} catch (Throwable ignore) {}\n\t\t\t}\n\t\t\t\n\t\t\tif (!installSucceeded) {\n\t\t\t\tthrow new InstallException(\"I can't find the \" + descriptor.getIniFileName() + \" file. Is this a real \" + descriptor.getProductName() + \" installation?\", null);\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn \"If you start \" + descriptor.getProductName() + \" with a custom -vm parameter, you'll need to add:<br>\" +\n\t\t\t\t\"<code>-vmargs -javaagent:lombok.jar</code><br>as parameter as well.\";\n\t}\n\t\n\t@Override public URL getIdeIcon() {\n\t\treturn descriptor.getIdeIcon();\n\t}\n}\n"
  },
  {
    "path": "src/installer/lombok/installer/eclipse/EclipseProductLocationProvider.java",
    "content": "/*\n * Copyright (C) 2009-2016 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.installer.eclipse;\n\nimport static java.util.Arrays.asList;\nimport static lombok.installer.IdeLocation.canonical;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.regex.Pattern;\n\nimport lombok.installer.CorruptedIdeLocationException;\nimport lombok.installer.OsUtils;\nimport lombok.installer.IdeLocation;\nimport lombok.installer.IdeLocationProvider;\n\npublic class EclipseProductLocationProvider implements IdeLocationProvider {\n\tprivate final EclipseProductDescriptor descriptor;\n\n\tEclipseProductLocationProvider(EclipseProductDescriptor descriptor) {\n\t\tthis.descriptor = descriptor;\n\t}\n\t\n\t/**\n\t * Create a new EclipseLocation by pointing at either the directory contains the Eclipse executable, or the executable itself,\n\t * or an eclipse.ini file.\n\t * \n\t * @throws CorruptedIdeLocationException\n\t *             If this isn't an Eclipse executable or a directory with an\n\t *             Eclipse executable.\n\t * @throws NullPointerException if {@code path} is {@code null}.\n\t */\n\t@Override public final IdeLocation create(String path) throws CorruptedIdeLocationException {\n\t\treturn create0(path);\n\t}\n\t\n\tprivate IdeLocation create0(String path) throws CorruptedIdeLocationException {\n\t\tif (path == null) throw new NullPointerException(\"path\");\n\t\tString iniName = descriptor.getIniFileName();\n\t\tFile p = new File(path);\n\t\t\n\t\tif (!p.exists()) return null;\n\t\tif (p.isDirectory()) {\n\t\t\tfor (String possibleExeName : descriptor.getExecutableNames()) {\n\t\t\t\tFile f = new File(p, possibleExeName);\n\t\t\t\tif (f.exists()) return findEclipseIniFromExe(f, 0);\n\t\t\t}\n\t\t\t\n\t\t\tFile f = new File(p, iniName);\n\t\t\tif (f.exists()) return makeLocation(new String[] {canonical(p)}, new File[] {f});\n\t\t}\n\t\t\n\t\tif (p.isFile()) {\n\t\t\tif (p.getName().equalsIgnoreCase(iniName)) {\n\t\t\t\treturn makeLocation(new String[] {canonical(p.getParentFile())}, new File[] {p});\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (descriptor.getExecutableNames().contains(p.getName().toLowerCase())) {\n\t\t\treturn findEclipseIniFromExe(p, 0);\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\t\n\tprivate IdeLocation findEclipseIniFromExe(File exePath, int loopCounter) throws CorruptedIdeLocationException {\n\t\tString iniName = descriptor.getIniFileName();\n\t\tList<Object> foundResults = new ArrayList<Object>(); // even indices are the canonical path (Strings), the immediately following odd index is the file. (java.io.File).\n\t\t/* Try looking for eclipse.ini as sibling to the executable */ {\n\t\t\tFile ini = new File(exePath.getParentFile(), iniName);\n\t\t\tif (ini.isFile()) {\n\t\t\t\tfoundResults.add(canonical(exePath));\n\t\t\t\tfoundResults.add(ini);\n\t\t\t}\n\t\t}\n\t\t\n\t\tString macAppName = descriptor.getMacAppName();\n\t\t\n\t\t/* Starting with Eclipse Mars (with the oomph installer), the structure has changed, and it's now at Eclipse.app/Contents/Eclipse/eclipse.ini*/ {\n\t\t\tFile ini = new File(exePath.getParentFile(), macAppName + \"/Contents/Eclipse/\" + iniName);\n\t\t\tif (ini.isFile()) {\n\t\t\t\tfoundResults.add(canonical(exePath));\n\t\t\t\tfoundResults.add(ini);\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* Try looking for Eclipse.app/Contents/MacOS/eclipse.ini as sibling to executable; this works on Mac OS X. */ {\n\t\t\tFile ini = new File(exePath.getParentFile(), macAppName + \"/Contents/MacOS/\" + iniName);\n\t\t\tif (ini.isFile()) {\n\t\t\t\tfoundResults.add(canonical(exePath));\n\t\t\t\tfoundResults.add(ini);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (foundResults.size() > 0) {\n\t\t\tString[] paths = new String[foundResults.size() / 2];\n\t\t\tFile[] files = new File[paths.length];\n\t\t\t\n\t\t\tfor (int i = 0; i < paths.length; i++) {\n\t\t\t\tpaths[i] = (String) foundResults.get(i * 2);\n\t\t\t\tfiles[i] = (File) foundResults.get((i * 2) + 1);\n\t\t\t}\n\t\t\t\n\t\t\treturn makeLocation(paths, files);\n\t\t}\n\t\t\n\t\t/* If executable is a soft link, follow it and retry. */ {\n\t\t\tif (loopCounter < 50) {\n\t\t\t\ttry {\n\t\t\t\t\tString oPath = exePath.getAbsolutePath();\n\t\t\t\t\tString nPath = exePath.getCanonicalPath();\n\t\t\t\t\tif (!oPath.equals(nPath)) try {\n\t\t\t\t\t\tIdeLocation loc = findEclipseIniFromExe(new File(nPath), loopCounter + 1);\n\t\t\t\t\t\tif (loc != null) return loc;\n\t\t\t\t\t} catch (CorruptedIdeLocationException ignore) {\n\t\t\t\t\t\t// Unlinking didn't help find an eclipse, so continue.\n\t\t\t\t\t}\n\t\t\t\t} catch (IOException ignore) { /* okay, that didn't work, assume it isn't a soft link then. */ }\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* If executable is a linux LSB-style path, then look in the usual places that package managers like apt-get use.*/ {\n\t\t\tString path = exePath.getAbsolutePath();\n\t\t\ttry {\n\t\t\t\tpath = exePath.getCanonicalPath();\n\t\t\t} catch (IOException ignore) { /* We'll stick with getAbsolutePath()'s result then. */ }\n\t\t\t\n\t\t\tString unixAppName = descriptor.getUnixAppName();\n\t\t\tif (path.equals(\"/usr/bin/\" + unixAppName) || path.equals(\"/bin/\" + unixAppName) || path.equals(\"/usr/local/bin/\" + unixAppName)) {\n\t\t\t\tFile ini = new File(\"/usr/lib/\" + unixAppName + \"/\" + iniName);\n\t\t\t\tif (ini.isFile()) return makeLocation(new String[] {path}, new File[] {ini});\n\t\t\t\tini = new File(\"/usr/local/lib/\" + unixAppName + \"/\" + iniName);\n\t\t\t\tif (ini.isFile()) return makeLocation(new String[] {path}, new File[] {ini});\n\t\t\t\tini = new File(\"/usr/local/etc/\" + unixAppName + \"/\" + iniName);\n\t\t\t\tif (ini.isFile()) return makeLocation(new String[] {path}, new File[] {ini});\n\t\t\t\tini = new File(\"/etc/\" + iniName);\n\t\t\t\tif (ini.isFile()) return makeLocation(new String[] {path}, new File[] {ini});\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* If we get this far, we lose. */\n\t\treturn null;\n\t}\n\t\n\tprivate IdeLocation makeLocation(String[] name, File[] ini) throws CorruptedIdeLocationException {\n\t\treturn new EclipseProductLocation(descriptor, name, ini);\n\t}\n\t\n\t@Override public Pattern getLocationSelectors() {\n\t\treturn descriptor.getLocationSelectors();\n\t}\n\t\n\t/**\n\t * Calls the OS-dependent 'find Eclipse' routine. If the local OS doesn't have a routine written for it,\n\t * null is returned.\n\t * \n\t * @param locations\n\t *            List of valid eclipse locations - provide an empty list; this\n\t *            method will fill it.\n\t * @param problems\n\t *            List of eclipse locations that seem to contain half-baked\n\t *            eclipses that can't be installed. Provide an empty list; this\n\t *            method will fill it.\n\t */\n\t@Override\n\tpublic void findIdes(List<IdeLocation> locations, List<CorruptedIdeLocationException> problems) {\n\t\tswitch (OsUtils.getOS()) {\n\t\tcase WINDOWS:\n\t\t\tnew WindowsFinder().findEclipse(locations, problems);\n\t\t\tbreak;\n\t\tcase MAC_OS_X:\n\t\t\tnew MacFinder().findEclipse(locations, problems);\n\t\t\tbreak;\n\t\tdefault:\n\t\tcase UNIX:\n\t\t\tnew UnixFinder().findEclipse(locations, problems);\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tprivate List<File> transformToFiles(List<String> fileNames) {\n\t\tList<File> files = new ArrayList<File>();\n\t\tfor (String fileName : fileNames) {\n\t\t\tfiles.add(new File(fileName));\n\t\t}\n\t\treturn files;\n\t}\n\t\n\tprivate List<File> getFlatSourceLocationsOnUnix() {\n\t\tList<File> dirs = new ArrayList<File>();\n\t\tdirs.add(new File(\"/usr/bin/\"));\n\t\tdirs.add(new File(\"/usr/local/bin/\"));\n\t\tdirs.add(new File(System.getProperty(\"user.home\", \".\"), \"bin/\"));\n\t\treturn dirs;\n\t}\n\t\n\tprivate List<File> getNestedSourceLocationOnUnix() {\n\t\tList<File> dirs = new ArrayList<File>();\n\t\tdirs.add(new File(\"/usr/local/share\"));\n\t\tdirs.add(new File(\"/usr/local\"));\n\t\tdirs.add(new File(\"/usr/share\"));\n\t\treturn dirs;\n\t}\n\t\n\tprivate class UnixFinder extends DirectoryFinder {\n\t\tUnixFinder() {\n\t\t\tsuper(getNestedSourceLocationOnUnix(), getFlatSourceLocationsOnUnix());\n\t\t}\n\t\t\n\t\t@Override protected String findEclipseOnPlatform(File dir) {\n\t\t\tFile possible = new File(dir, descriptor.getUnixAppName());\n\t\t\treturn (possible.exists()) ? possible.getAbsolutePath() : null;\n\t\t}\n\t}\n\t\n\t/**\n\t * Returns a list of paths of Eclipse installations.\n\t * \n\t * The search process works by scanning for each 'source dir' for either an eclipse installation or a folder containing the text returned\n\t * by getDirName(). If such a folder is found, this process is applied recursively. On windows, this process is run on each drive letter\n\t * which represents a physical hard disk. If the native windows API call to determine these drive letters fails, only 'C:' is checked.\n\t */\n\tprivate List<String> getSourceDirsOnWindowsWithDriveLetters() {\n\t\tList<String> driveLetters = asList(\"C\");\n\t\ttry {\n\t\t\tdriveLetters = OsUtils.getDrivesOnWindows();\n\t\t} catch (Throwable ignore) {\n\t\t\tignore.printStackTrace();\n\t\t}\n\t\tList<String> sourceDirs = new ArrayList<String>();\n\t\tfor (String letter : driveLetters) {\n\t\t\tfor (String possibleSource : descriptor.getSourceDirsOnWindows()) {\n\t\t\t\tif (!isDriveSpecificOnWindows(possibleSource)) {\n\t\t\t\t\tsourceDirs.add(letter + \":\" + possibleSource);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (String possibleSource : descriptor.getSourceDirsOnWindows()) {\n\t\t\tif (isDriveSpecificOnWindows(possibleSource)) sourceDirs.add(possibleSource);\n\t\t}\n\t\t\n\t\treturn sourceDirs;\n\t}\n\t\n\tprivate boolean isDriveSpecificOnWindows(String path) {\n\t\treturn path.length() > 1 && path.charAt(1) == ':';\n\t}\n\t\n\tprivate class WindowsFinder extends DirectoryFinder {\n\t\tWindowsFinder() {\n\t\t\tsuper(transformToFiles(getSourceDirsOnWindowsWithDriveLetters()), Collections.<File>emptyList());\n\t\t}\n\t\t\n\t\t/** Checks if the provided directory contains 'eclipse.exe', and if so, returns the directory, otherwise null. */\n\t\t@Override \n\t\tprotected String findEclipseOnPlatform(File dir) {\n\t\t\tFile possible = new File(dir, descriptor.getWindowsExecutableName());\n\t\t\treturn (possible.isFile()) ? dir.getAbsolutePath() : null;\n\t\t}\n\t}\n\t\n\tprivate class MacFinder extends DirectoryFinder {\n\t\tMacFinder() {\n\t\t\tsuper(transformToFiles(descriptor.getSourceDirsOnMac()), Collections.<File>emptyList());\n\t\t}\n\t\t\n\t\tprotected String findEclipseOnPlatform(File dir) {\n\t\t\tif (dir.getName().toLowerCase().equals(descriptor.getMacAppName().toLowerCase())) return dir.getParent();\n\t\t\tif (dir.getName().toLowerCase().contains(descriptor.getDirectoryName())) {\n\t\t\t\tif (new File(dir, descriptor.getMacAppName()).exists()) return dir.toString();\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tprivate abstract class DirectoryFinder {\n\t\tprivate final List<File> flatSourceDirs;\n\t\tprivate final List<File> nestedSourceDirs;\n\n\t\tDirectoryFinder(List<File> nestedSourceDirs, List<File> flatSourceDirs) {\n\t\t\tthis.nestedSourceDirs = nestedSourceDirs;\n\t\t\tthis.flatSourceDirs = flatSourceDirs;\n\t\t}\n\t\t\n\t\tvoid findEclipse(List<IdeLocation> locations, List<CorruptedIdeLocationException> problems) {\n\t\t\tfor (File dir : nestedSourceDirs) recurseDirectory(locations, problems, dir);\n\t\t\tfor (File dir : flatSourceDirs) findEclipse(locations, problems, dir);\n\t\t}\n\t\t\n\t\tabstract String findEclipseOnPlatform(File dir);\n\t\t\n\t\tvoid recurseDirectory(List<IdeLocation> locations, List<CorruptedIdeLocationException> problems, File dir) {\n\t\t\trecurseDirectory0(locations, problems, dir, 0, false);\n\t\t}\n\t\t\n\t\tprivate void recurseDirectory0(List<IdeLocation> locations, List<CorruptedIdeLocationException> problems, File f, int loopCounter, boolean nameFound) {\n\t\t\t//Various try/catch/ignore statements are in this for loop. Weird conditions on the disk can cause exceptions,\n\t\t\t//such as an unformatted drive causing a NullPointerException on listFiles. Best action is almost invariably to just\n\t\t\t//continue onwards.\n\t\t\tFile[] listFiles = f.listFiles();\n\t\t\tif (listFiles == null) return;\n\t\t\t\n\t\t\tfor (File dir : listFiles) {\n\t\t\t\tif (!dir.isDirectory()) continue;\n\t\t\t\ttry {\n\t\t\t\t\tif (nameFound || dir.getName().toLowerCase().contains(descriptor.getDirectoryName())) {\n\t\t\t\t\t\tfindEclipse(locations, problems, dir);\n\t\t\t\t\t\tif (loopCounter < 50) recurseDirectory0(locations, problems, dir, loopCounter + 1, true);\n\t\t\t\t\t}\n\t\t\t\t} catch (Exception ignore) {}\n\t\t\t}\n\t\t}\n\t\t\n\t\tprivate void findEclipse(List<IdeLocation> locations, List<CorruptedIdeLocationException> problems, File dir) {\n\t\t\tString eclipseLocation = findEclipseOnPlatform(dir);\n\t\t\tif (eclipseLocation != null) {\n\t\t\t\ttry {\n\t\t\t\t\tIdeLocation newLocation = create(eclipseLocation);\n\t\t\t\t\tif (newLocation != null) locations.add(newLocation);\n\t\t\t\t} catch (CorruptedIdeLocationException e) {\n\t\t\t\t\tproblems.add(e);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/installer/lombok/installer/eclipse/JbdsLocationProvider.java",
    "content": "/*\n * Copyright (C) 2013-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.installer.eclipse;\n\nimport java.util.Collections;\n\nimport lombok.installer.IdeLocationProvider;\nimport lombok.spi.Provides;\n\n@Provides(IdeLocationProvider.class)\npublic class JbdsLocationProvider extends EclipseProductLocationProvider {\n\t\n\tprivate static final EclipseProductDescriptor JBDS = new StandardProductDescriptor(\n\t\t\t\"JBoss Developer Studio\",\n\t\t\t\"jbdevstudio\",\n\t\t\t\"studio\",\n\t\t\tJbdsLocationProvider.class.getResource(\"jbds.png\"),\n\t\t\tCollections.<String>emptySet()\n\t);\n\t\n\tpublic JbdsLocationProvider() {\n\t\tsuper(JBDS);\n\t}\n}\n"
  },
  {
    "path": "src/installer/lombok/installer/eclipse/MyEclipseLocationProvider.java",
    "content": "/*\n * Copyright (C) 2016-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.installer.eclipse;\n\nimport java.util.Collections;\n\nimport lombok.installer.IdeLocationProvider;\nimport lombok.spi.Provides;\n\n@Provides(IdeLocationProvider.class)\npublic class MyEclipseLocationProvider extends EclipseProductLocationProvider {\n\t\n\tprivate static final EclipseProductDescriptor MY_ECLIPSE = new StandardProductDescriptor(\n\t\t\t\"MyEclipse\",\n\t\t\t\"myeclipse\",\n\t\t\t\"myeclipse\",\n\t\t\tMyEclipseLocationProvider.class.getResource(\"myeclipse.png\"),\n\t\t\tCollections.<String>emptySet()\n\t);\n\t\n\tpublic MyEclipseLocationProvider() {\n\t\tsuper(MY_ECLIPSE);\n\t}\n}\n"
  },
  {
    "path": "src/installer/lombok/installer/eclipse/RhcrLocationProvider.java",
    "content": "/*\n * Copyright (C) 2020-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.installer.eclipse;\n\nimport java.util.Collections;\n\nimport lombok.installer.IdeLocationProvider;\nimport lombok.spi.Provides;\n\n@Provides(IdeLocationProvider.class)\npublic class RhcrLocationProvider extends EclipseProductLocationProvider {\n\tprivate static final EclipseProductDescriptor RHCR = new StandardProductDescriptor(\n\t\t\t\"Red Hat CodeReady Studio\",\n\t\t\t\"codereadystudio\",\n\t\t\t\"studio\",\n\t\t\tRhcrLocationProvider.class.getResource(\"rhds.png\"),\n\t\t\tCollections.<String>emptySet()\n\t);\n\t\n\tpublic RhcrLocationProvider() {\n\t\tsuper(RHCR);\n\t}\n}\n"
  },
  {
    "path": "src/installer/lombok/installer/eclipse/RhdsLocationProvider.java",
    "content": "/*\n * Copyright (C) 2013-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.installer.eclipse;\n\nimport java.util.Collections;\n\nimport lombok.installer.IdeLocationProvider;\nimport lombok.spi.Provides;\n\n@Provides(IdeLocationProvider.class)\npublic class RhdsLocationProvider extends EclipseProductLocationProvider {\n\t\n\tprivate static final EclipseProductDescriptor RHDS = new StandardProductDescriptor(\n\t\t\t\"Red Hat JBoss Developer Studio\",\n\t\t\t\"devstudio\",\n\t\t\t\"studio\",\n\t\t\tRhdsLocationProvider.class.getResource(\"rhds.png\"),\n\t\t\tCollections.<String>emptySet()\n\t); \n\t\n\tpublic RhdsLocationProvider() {\n\t\tsuper(RHDS);\n\t}\n}\n"
  },
  {
    "path": "src/installer/lombok/installer/eclipse/STS4LocationProvider.java",
    "content": "/*\n * Copyright (C) 2018-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.installer.eclipse;\n\nimport java.util.Arrays;\nimport java.util.Collections;\n\nimport lombok.installer.IdeLocationProvider;\nimport lombok.spi.Provides;\n\n@Provides(IdeLocationProvider.class)\npublic class STS4LocationProvider extends EclipseProductLocationProvider {\n\t\n\tprivate static final EclipseProductDescriptor STS4 = new StandardProductDescriptor(\"Spring Tools Suite 4\",\n\t\t\t\"SpringToolSuite4\",\n\t\t\t\"sts\",\n\t\t\tSTS4LocationProvider.class.getResource(\"STS.png\"),\n\t\t\tCollections.unmodifiableList(Arrays.asList(\"springsource\", \"spring-tool-suite\"))\n\t);\n\t\n\tpublic STS4LocationProvider() {\n\t\tsuper(STS4);\n\t}\n}\n"
  },
  {
    "path": "src/installer/lombok/installer/eclipse/STSLocationProvider.java",
    "content": "/*\n * Copyright (C) 2009-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.installer.eclipse;\n\nimport java.util.Collections;\n\nimport lombok.installer.IdeLocationProvider;\nimport lombok.spi.Provides;\n\n@Provides(IdeLocationProvider.class)\npublic class STSLocationProvider extends EclipseProductLocationProvider {\n\t\n\tprivate static final EclipseProductDescriptor STS = new StandardProductDescriptor(\"STS\",\n\t\t\t\"STS\",\n\t\t\t\"sts\",\n\t\t\tSTSLocationProvider.class.getResource(\"STS.png\"),\n\t\t\tCollections.singleton(\"springsource\")\n\t);\n\t\n\tpublic STSLocationProvider() {\n\t\tsuper(STS);\n\t}\n}\n"
  },
  {
    "path": "src/installer/lombok/installer/eclipse/StandardProductDescriptor.java",
    "content": "/*\n * Copyright (C) 2016 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.installer.eclipse;\n\nimport java.io.File;\nimport java.net.URL;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.regex.Pattern;\n\nimport lombok.installer.OsUtils;\n\npublic class StandardProductDescriptor implements EclipseProductDescriptor {\n\t\n\tprivate static final String USER_HOME = System.getProperty(\"user.home\", \".\");\n\tprivate static final String[] BASE_WINDOWS_ROOTS = {\"\\\\\", \"\\\\Program Files\", \"\\\\Program Files (x86)\", \"\\\\ProgramData\\\\Chocolatey\\\\lib\"};\n\tprivate static final String[] WINDOWS_ROOTS = windowsRoots();\n\tprivate static final String[] MAC_ROOTS = {\"/Applications\", USER_HOME};\n\tprivate static final String[] UNIX_ROOTS = {USER_HOME};\n\t\n\tprivate final String productName;\n\tprivate final String windowsName;\n\tprivate final String unixName;\n\tprivate final String macAppName;\n\tprivate final List<String> executableNames;\n\tprivate final List<String> sourceDirsOnWindows;\n\tprivate final List<String> sourceDirsOnMac;\n\tprivate final List<String> sourceDirsOnUnix;\n\tprivate final String iniFileName;\n\tprivate final Pattern locationSelectors;\n\tprivate final String directoryName;\n\tprivate final URL ideIcon;\n\t\n\tpublic StandardProductDescriptor(String productName, String baseName, String directoryName, URL ideIcon, Collection<String> alternativeDirectoryNames) {\n\t\tthis.productName = productName;\n\t\tthis.windowsName = baseName + \".exe\";\n\t\tthis.unixName = baseName;\n\t\tthis.macAppName = baseName + \".app\";\n\t\tthis.executableNames = executableNames(baseName);\n\t\tthis.sourceDirsOnWindows = generateAlternatives(WINDOWS_ROOTS, \"\\\\\", alternativeDirectoryNames);\n\t\tthis.sourceDirsOnMac = generateAlternatives(MAC_ROOTS, \"/\", alternativeDirectoryNames);\n\t\tthis.sourceDirsOnUnix = generateAlternatives(UNIX_ROOTS, \"/\", alternativeDirectoryNames);\n\t\tthis.iniFileName = baseName + \".ini\";\n\t\tthis.locationSelectors = getLocationSelectors(baseName);\n\t\tthis.directoryName = directoryName.toLowerCase();\n\t\tthis.ideIcon = ideIcon;\n\t}\n\t\n\t@Override public String getProductName() {\n\t\treturn productName;\n\t}\n\t\n\t@Override public String getWindowsExecutableName() {\n\t\treturn windowsName;\n\t}\n\t\n\t@Override public String getUnixAppName() {\n\t\treturn unixName;\n\t}\n\t\n\t@Override public String getMacAppName() {\n\t\treturn macAppName;\n\t}\n\t\n\t@Override public String getDirectoryName() {\n\t\treturn directoryName;\n\t}\n\t\n\t@Override public List<String> getExecutableNames() {\n\t\treturn executableNames;\n\t}\n\t\n\t@Override public List<String> getSourceDirsOnWindows() {\n\t\treturn sourceDirsOnWindows;\n\t}\n\t\n\t@Override public List<String> getSourceDirsOnMac() {\n\t\treturn sourceDirsOnMac;\n\t}\n\t\n\t@Override public List<String> getSourceDirsOnUnix() {\n\t\treturn sourceDirsOnUnix;\n\t}\n\t\n\t@Override public String getIniFileName() {\n\t\treturn iniFileName;\n\t}\n\t\n\t@Override public Pattern getLocationSelectors() {\n\t\treturn locationSelectors;\n\t}\n\t\n\t@Override public URL getIdeIcon() {\n\t\treturn ideIcon;\n\t}\n\t\n\tprivate static Pattern getLocationSelectors(String baseName) {\n\t\treturn Pattern.compile(String.format(platformPattern(), baseName.toLowerCase()), Pattern.CASE_INSENSITIVE);\n\t}\n\t\n\tprivate static String platformPattern() {\n\t\tswitch (OsUtils.getOS()) {\n\t\tcase MAC_OS_X:\n\t\t\treturn \"^(%s|%<s\\\\.ini|%<s\\\\.app)$\";\n\t\tcase WINDOWS:\n\t\t\treturn \"^(%sc?\\\\.exe|%<s\\\\.ini)$\";\n\t\tdefault:\n\t\tcase UNIX:\n\t\t\treturn \"^(%s|%<s\\\\.ini)$\";\n\t\t}\n\t}\n\t\n\tprivate static List<String> executableNames(String baseName) {\n\t\tString base = baseName.toLowerCase();\n\t\treturn Collections.unmodifiableList(Arrays.asList(base, base + \".app\", base + \".exe\", base + \"c.exe\"));\n\t}\n\t\n\tprivate static List<String> generateAlternatives(String[] roots, String pathSeparator, Collection<String> alternatives) {\n\t\tList<String> result = new ArrayList<String>();\n\t\tfor (String root : roots) {\n\t\t\tresult.add(concat(root, pathSeparator, \"\"));\n\t\t\tfor (String alternative : alternatives) {\n\t\t\t\tresult.add(concat(root, pathSeparator, alternative));\n\t\t\t}\n\t\t}\n\t\treturn Collections.unmodifiableList(result);\n\t}\n\t\n\tprivate static String concat(String base, String pathSeparator, String alternative) {\n\t\tif (alternative.isEmpty()) {\n\t\t\treturn base;\n\t\t}\n\t\tif (base.endsWith(pathSeparator)) {\n\t\t\treturn base + alternative.replaceAll(\"[\\\\/]\", \"\\\\\" + pathSeparator);\n\t\t}\n\t\treturn base + pathSeparator + alternative.replaceAll(\"[\\\\/]\", \"\\\\\" + pathSeparator);\n\t}\n\t\n\tprivate static String[] windowsRoots() {\n\t\tString localAppData = windowsLocalAppData();\n\t\tString[] out = new String[BASE_WINDOWS_ROOTS.length + (localAppData == null ? 1 : 2)];\n\t\tSystem.arraycopy(BASE_WINDOWS_ROOTS, 0, out, 0, BASE_WINDOWS_ROOTS.length);\n\t\tout[BASE_WINDOWS_ROOTS.length] = USER_HOME;\n\t\tif (localAppData != null) out[BASE_WINDOWS_ROOTS.length + 1] = localAppData;\n\t\treturn out;\n\t}\n\t\n\tprivate static String windowsLocalAppData() {\n\t\tString localAppData = System.getenv(\"LOCALAPPDATA\");\n\t\tFile file = localAppData == null ? null : new File(localAppData);\n\t\treturn file != null && file.exists() && file.canRead() && file.isDirectory() ? localAppData : null;\n\t}\n}\n"
  },
  {
    "path": "src/installer/lombok/installer/package-info.java",
    "content": "/*\n * Copyright (C) 2009 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/**\n * This package contains the lombok installer. It explains to any user that double-clicks the lombok.jar what\n * lombok is about, and has the ability to instrument (or remove existing Lombok instrumentation) from any\n * Eclipse installation. This package also contains the graphics uses in the installer in SVG format.\n */\npackage lombok.installer;\n"
  },
  {
    "path": "src/j9stubs/mapstruct/org/mapstruct/ap/spi/AstModifyingAnnotationProcessor.java",
    "content": "/**\n *  Copyright 2012-2017 Gunnar Morling (http://www.gunnarmorling.de/)\n *  and/or other contributors as indicated by the @authors tag. See the\n *  copyright.txt file in the distribution for a full listing of all\n *  contributors.\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\");\n *  you may not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS,\n *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n */\npackage org.mapstruct.ap.spi;\n\nimport javax.lang.model.type.TypeMirror;\n\n/**\n * A contract to be implemented by other annotation processors which - against the design philosophy of JSR 269 - alter\n * the types under compilation.\n * <p>\n * This contract will be queried by MapStruct when examining types referenced by mappers to be generated, most notably\n * the source and target types of mapping methods. If at least one AST-modifying processor announces further changes to\n * such type, the generation of the affected mapper(s) will be deferred to a future round in the annnotation processing\n * cycle.\n * <p>\n * Implementations are discovered via the service loader, i.e. a JAR providing an AST-modifying processor needs to\n * declare its implementation in a file {@code META-INF/services/org.mapstruct.ap.spi.AstModifyingAnnotationProcessor}.\n *\n * @author Gunnar Morling\n */\n//@org.mapstruct.util.Experimental\npublic interface AstModifyingAnnotationProcessor {\n\n    /**\n     * Whether the specified type has been fully processed by this processor or not (i.e. this processor will amend the\n     * given type's structure after this invocation).\n     *\n     * @param type The type of interest\n     * @return {@code true} if this processor has fully processed the given type, {@code false} otherwise.\n     */\n    boolean isTypeComplete(TypeMirror type);\n}"
  },
  {
    "path": "src/javac-only-stubs/com/sun/tools/javac/util/Context.java",
    "content": "/*\n * These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these.\n */\npackage com.sun.tools.javac.util;\n\npublic class Context {\n\tpublic static class Key<T> {\n\t}\n\t\n\tpublic interface Factory<T> {\n\t\tT make(Context c);\n\t\tT make();\n\t}\n\t\n\tpublic <T> void put(Key<T> key, Factory<T> fac) {\n\t}\n\t\n\tpublic <T> void put(Key<T> key, T data) {\n\t}\n\t\n\tpublic <T> void put(Class<T> clazz, T data) {\n\t}\n\t\n\tpublic <T> T get(Key<T> key) {\n\t\treturn null;\n\t}\n\t\n\tpublic <T> T get(Class<T> clazz) {\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "src/launch/lombok/launch/Agent.java",
    "content": "/*\n * Copyright (C) 2014 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.launch;\n\nimport java.lang.instrument.Instrumentation;\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\n\nfinal class Agent {\n\tpublic static void agentmain(String agentArgs, Instrumentation instrumentation) throws Throwable {\n\t\trunLauncher(agentArgs, instrumentation, true);\n\t}\n\t\n\tpublic static void premain(String agentArgs, Instrumentation instrumentation) throws Throwable {\n\t\trunLauncher(agentArgs, instrumentation, false);\n\t}\n\t\n\tprivate static void runLauncher(String agentArgs, Instrumentation instrumentation, boolean injected) throws Throwable {\n\t\tClassLoader cl = Main.getShadowClassLoader();\n\t\ttry {\n\t\t\tClass<?> c = cl.loadClass(\"lombok.core.AgentLauncher\");\n\t\t\tMethod m = c.getDeclaredMethod(\"runAgents\", String.class, Instrumentation.class, boolean.class, Class.class);\n\t\t\tm.invoke(null, agentArgs, instrumentation, injected, Agent.class);\n\t\t} catch (InvocationTargetException e) {\n\t\t\tthrow e.getCause();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/launch/lombok/launch/AnnotationProcessor.java",
    "content": "/*\n * Copyright (C) 2014-2018 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.launch;\n\nimport java.lang.reflect.Field;\nimport java.util.Set;\n\nimport javax.annotation.processing.AbstractProcessor;\nimport javax.annotation.processing.Completion;\nimport javax.annotation.processing.ProcessingEnvironment;\nimport javax.annotation.processing.RoundEnvironment;\nimport javax.annotation.processing.SupportedAnnotationTypes;\nimport javax.lang.model.SourceVersion;\nimport javax.lang.model.element.AnnotationMirror;\nimport javax.lang.model.element.Element;\nimport javax.lang.model.element.ExecutableElement;\nimport javax.lang.model.element.TypeElement;\n\nimport sun.misc.Unsafe;\n\nclass AnnotationProcessorHider {\n\n\tpublic static class AstModificationNotifierData {\n\t\tpublic volatile static boolean lombokInvoked = false;\n\t}\n\t\n\tpublic static class AnnotationProcessor extends AbstractProcessor {\n\t\tprivate final AbstractProcessor instance = createWrappedInstance();\n\t\t\n\t\t@Override public Set<String> getSupportedOptions() {\n\t\t\treturn instance.getSupportedOptions();\n\t\t}\n\t\t\n\t\t@Override public Set<String> getSupportedAnnotationTypes() {\n\t\t\treturn instance.getSupportedAnnotationTypes();\n\t\t}\n\t\t\n\t\t@Override public SourceVersion getSupportedSourceVersion() {\n\t\t\treturn instance.getSupportedSourceVersion();\n\t\t}\n\t\t\n\t\t@Override public void init(ProcessingEnvironment processingEnv) {\n\t\t\tdisableJava9SillyWarning();\n\t\t\tAstModificationNotifierData.lombokInvoked = true;\n\t\t\tinstance.init(processingEnv);\n\t\t\tsuper.init(processingEnv);\n\t\t}\n\t\t\n\t\t// sunapi suppresses javac's warning about using Unsafe; 'all' suppresses eclipse's warning about the unspecified 'sunapi' key. Leave them both.\n\t\t// Yes, javac's definition of the word 'all' is quite contrary to what the dictionary says it means. 'all' does NOT include 'sunapi' according to javac.\n\t\t@SuppressWarnings({\"sunapi\", \"all\"})\n\t\tprivate void disableJava9SillyWarning() {\n\t\t\t// JVM9 complains about using reflection to access packages from a module that aren't exported. This makes no sense; the whole point of reflection\n\t\t\t// is to get past such issues. The only comment from the jigsaw team lead on this was some unspecified mumbling about security which makes no sense,\n\t\t\t// as the SecurityManager is invoked to check such things. Therefore this warning is a bug, so we shall patch java to fix it.\n\t\t\t\n\t\t\ttry {\n\t\t\t\tField theUnsafe = Unsafe.class.getDeclaredField(\"theUnsafe\");\n\t\t\t\ttheUnsafe.setAccessible(true);\n\t\t\t\tUnsafe u = (Unsafe) theUnsafe.get(null);\n\t\t\t\t\n\t\t\t\tClass<?> cls = Class.forName(\"jdk.internal.module.IllegalAccessLogger\");\n\t\t\t\tField logger = cls.getDeclaredField(\"logger\");\n\t\t\t\tu.putObjectVolatile(cls, u.staticFieldOffset(logger), null);\n\t\t\t} catch (Throwable t) {\n\t\t\t\t// We shall ignore it; the effect of this code failing is that the user gets to see a warning they remove with various --add-opens magic.\n\t\t\t}\n\t\t}\n\t\t\n\t\t@Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {\n\t\t\treturn instance.process(annotations, roundEnv);\n\t\t}\n\t\t\n\t\t@Override public Iterable<? extends Completion> getCompletions(Element element, AnnotationMirror annotation, ExecutableElement member, String userText) {\n\t\t\treturn instance.getCompletions(element, annotation, member, userText);\n\t\t}\n\t\t\n\t\tprivate static AbstractProcessor createWrappedInstance() {\n\t\t\tClassLoader cl = Main.getShadowClassLoader();\n\t\t\ttry {\n\t\t\t\tClass<?> mc = cl.loadClass(\"lombok.core.AnnotationProcessor\");\n\t\t\t\treturn (AbstractProcessor) mc.getDeclaredConstructor().newInstance();\n\t\t\t} catch (Throwable t) {\n\t\t\t\tif (t instanceof Error) throw (Error) t;\n\t\t\t\tif (t instanceof RuntimeException) throw (RuntimeException) t;\n\t\t\t\tthrow new RuntimeException(t);\n\t\t\t}\n\t\t}\n\t}\n\t\n\t@SupportedAnnotationTypes(\"lombok.*\")\n\tpublic static class ClaimingProcessor extends AbstractProcessor {\n\t\t@Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\t@Override public SourceVersion getSupportedSourceVersion() {\n\t\t\treturn SourceVersion.latest();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/launch/lombok/launch/ClassFileMetaData.java",
    "content": "/*\n * Copyright (C) 2010-2023 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.launch;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\n\n/**\n * Utility to read the constant pool, header, and inheritance information of any class file.\n * \n * THIS IS A COPY OF lombok.bytecode.ClassFileMetaData - it is used by the shadowclassloader which can't rely on anything from outside the lombok.launch package, but everything in the launch package has to be package private.\n * If there is a bug or an update is needed here - make sure to also update it in the lombok.bytecode package.\n */\nclass ClassFileMetaData {\n\tprivate static final byte UTF8 = 1;\n\tprivate static final byte INTEGER = 3;\n\tprivate static final byte FLOAT = 4;\n\tprivate static final byte LONG = 5;\n\tprivate static final byte DOUBLE = 6;\n\tprivate static final byte CLASS = 7;\n\tprivate static final byte STRING = 8;\n\tprivate static final byte FIELD = 9;\n\tprivate static final byte METHOD = 10;\n\tprivate static final byte INTERFACE_METHOD = 11;\n\tprivate static final byte NAME_TYPE = 12;\n\t// New in java7: support for methodhandles and invokedynamic\n\tprivate static final byte METHOD_HANDLE = 15;\n\tprivate static final byte METHOD_TYPE = 16;\n\tprivate static final byte DYNAMIC = 17;\n\tprivate static final byte INVOKE_DYNAMIC = 18;\n\t// New in java9: support for modules\n\tprivate static final byte MODULE = 19;\n\tprivate static final byte PACKAGE = 20;\n\t\n\tprivate static final int NOT_FOUND = -1;\n\tprivate static final int START_OF_CONSTANT_POOL = 8; \n\t\n\tprivate final byte[] byteCode;\n\t\n\tprivate final int maxPoolSize;\n\tprivate final int[] offsets;\n\tprivate final byte[] types;\n\tprivate final String[] utf8s;\n\tprivate final int endOfPool;\n\t\n\tpublic ClassFileMetaData(byte[] byteCode) {\n\t\tthis.byteCode = byteCode;\n\t\t\n\t\tmaxPoolSize = readValue(START_OF_CONSTANT_POOL);\n\t\toffsets = new int[maxPoolSize];\n\t\ttypes = new byte[maxPoolSize];\n\t\tutf8s = new String[maxPoolSize];\n\t\tint position = 10;\n\t\tfor (int i = 1; i < maxPoolSize; i++) {\n\t\t\tbyte type = byteCode[position];\n\t\t\ttypes[i] = type;\n\t\t\tposition++;\n\t\t\toffsets[i] = position;\n\t\t\tswitch (type) {\n\t\t\tcase UTF8:\n\t\t\t\tint length = readValue(position);\n\t\t\t\tposition += 2;\n\t\t\t\tutf8s[i] = decodeString(position, length);\n\t\t\t\tposition += length;\n\t\t\t\tbreak;\n\t\t\tcase CLASS:\n\t\t\tcase STRING:\n\t\t\tcase METHOD_TYPE:\n\t\t\tcase MODULE:\n\t\t\tcase PACKAGE:\n\t\t\t\tposition += 2;\n\t\t\t\tbreak;\n\t\t\tcase METHOD_HANDLE:\n\t\t\t\tposition += 3;\n\t\t\t\tbreak;\n\t\t\tcase INTEGER:\n\t\t\tcase FLOAT:\n\t\t\tcase FIELD:\n\t\t\tcase METHOD:\n\t\t\tcase INTERFACE_METHOD:\n\t\t\tcase NAME_TYPE:\n\t\t\tcase INVOKE_DYNAMIC:\n\t\t\tcase DYNAMIC:\n\t\t\t\tposition += 4;\n\t\t\t\tbreak;\n\t\t\tcase LONG:\n\t\t\tcase DOUBLE:\n\t\t\t\tposition += 8;\n\t\t\t\ti++;\n\t\t\t\tbreak;\n\t\t\tcase 0:\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new AssertionError(\"Unknown constant pool type \" + type);\n\t\t\t}\n\t\t}\n\t\tendOfPool = position;\n\t}\n\t\n\tprivate String decodeString(int pos, int size) {\n\t\tint end = pos + size;\n\t\t\n\t\t// the resulting string might be smaller\n\t\tchar[] result = new char[size];\n\t\tint length = 0;\n\t\twhile (pos < end) {\n\t\t\tint first = (byteCode[pos++] & 0xFF);\n\t\t\tif (first < 0x80) {\n\t\t\t\tresult[length++] = (char)first;\n\t\t\t} else if ((first & 0xE0) == 0xC0) {\n\t\t\t\tint x = (first & 0x1F) << 6;\n\t\t\t\tint y = (byteCode[pos++] & 0x3F);\n\t\t\t\tresult[length++] = (char)(x | y);\n\t\t\t} else {\n\t\t\t\tint x = (first & 0x0F) << 12;\n\t\t\t\tint y = (byteCode[pos++] & 0x3F) << 6;\n\t\t\t\tint z = (byteCode[pos++] & 0x3F);\n\t\t\t\tresult[length++] = (char)(x | y | z);\n\t\t\t}\n\t\t}\n\t\treturn new String(result, 0, length);\n\t}\n\t\n\tpublic int[] getOffsets(byte type) {\n\t\tint[] out = new int[types.length];\n\t\tint ptr = 0;\n\t\t\n\t\tfor (int i = 0; i < types.length; i++) {\n\t\t\tif (types[i] != type) continue;\n\t\t\tout[ptr++] = offsets[i];\n\t\t}\n\t\t\n\t\treturn Arrays.copyOf(out, ptr);\n\t}\n\t\n\t/**\n\t * Checks if the constant pool contains the provided 'raw' string. These are used as source material for further JVM types, such as string constants, type references, etcetera.\n\t */\n\tpublic boolean containsUtf8(String value) {\n\t\treturn findUtf8(value) != NOT_FOUND;\n\t}\n\t\n\t/**\n\t * Checks if the constant pool contains a reference to the provided class.\n\t * \n\t * NB: Most uses of a type do <em>NOT</em> show up as a class in the constant pool.\n\t *    For example, the parameter types and return type of any method you invoke or declare, are stored as signatures and not as type references,\n\t *    but the type to which any method you invoke belongs, is. Read the JVM Specification for more information.\n\t * \n\t * @param className must be provided JVM-style, such as {@code java/lang/String}\n\t */\n\tpublic boolean usesClass(String className) {\n\t\treturn findClass(className) != NOT_FOUND;\n\t}\n\t\n\t/**\n\t * Checks if the constant pool contains a reference to a given field, either for writing or reading.\n\t * \n\t * @param className must be provided JVM-style, such as {@code java/lang/String}\n\t */\n\tpublic boolean usesField(String className, String fieldName) {\n\t\tint classIndex = findClass(className);\n\t\tif (classIndex == NOT_FOUND) return false;\n\t\tint fieldNameIndex = findUtf8(fieldName);\n\t\tif (fieldNameIndex == NOT_FOUND) return false;\n\t\t\n\t\tfor (int i = 1; i < maxPoolSize; i++) {\n\t\t\tif (types[i] == FIELD && readValue(offsets[i]) == classIndex) {\n\t\t\t\tint nameAndTypeIndex = readValue(offsets[i] + 2);\n\t\t\t\tif (readValue(offsets[nameAndTypeIndex]) == fieldNameIndex) return true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * Checks if the constant pool contains a reference to a given method, with any signature (return type and parameter types).\n\t * \n\t * @param className must be provided JVM-style, such as {@code java/lang/String}\n\t */\n\tpublic boolean usesMethod(String className, String methodName) {\n\t\tint classIndex = findClass(className);\n\t\tif (classIndex == NOT_FOUND) return false;\n\t\tint methodNameIndex = findUtf8(methodName);\n\t\tif (methodNameIndex == NOT_FOUND) return false;\n\t\t\n\t\tfor (int i = 1; i < maxPoolSize; i++) {\n\t\t\tif (isMethod(i) && readValue(offsets[i]) == classIndex) {\n\t\t\t\tint nameAndTypeIndex = readValue(offsets[i] + 2);\n\t\t\t\tif (readValue(offsets[nameAndTypeIndex]) == methodNameIndex) return true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * Checks if the constant pool contains a reference to a given method.\n\t * \n\t * @param className must be provided JVM-style, such as {@code java/lang/String}\n\t * @param descriptor must be provided JVM-style, such as {@code (IZ)Ljava/lang/String;}\n\t */\n\tpublic boolean usesMethod(String className, String methodName, String descriptor) {\n\t\tint classIndex = findClass(className);\n\t\tif (classIndex == NOT_FOUND) return false;\n\t\tint nameAndTypeIndex = findNameAndType(methodName, descriptor);\n\t\tif (nameAndTypeIndex == NOT_FOUND) return false;\n\t\t\n\t\tfor (int i = 1; i < maxPoolSize; i++) {\n\t\t\tif (isMethod(i) && \n\t\t\t\t\treadValue(offsets[i]) == classIndex && \n\t\t\t\t\treadValue(offsets[i] + 2) == nameAndTypeIndex) return true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * Checks if the constant pool contains the provided string constant, which implies the constant is used somewhere in the code.\n\t * \n\t * NB: String literals get concatenated by the compiler.\n\t * NB2: This method does NOT do any kind of normalization.\n\t */\n\tpublic boolean containsStringConstant(String value) {\n\t\tint index = findUtf8(value);\n\t\tif (index == NOT_FOUND) return false;\n\t\tfor (int i = 1; i < maxPoolSize; i++) {\n\t\t\tif (types[i] == STRING && readValue(offsets[i]) == index) return true; \n\t\t}\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * Checks if the constant pool contains the provided long constant, which implies the constant is used somewhere in the code.\n\t * \n\t * NB: compile-time constant expressions are evaluated at compile time.\n\t */\n\tpublic boolean containsLong(long value) {\n\t\tfor (int i = 1; i < maxPoolSize; i++) {\n\t\t\tif (types[i] == LONG && readLong(i) == value) return true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * Checks if the constant pool contains the provided double constant, which implies the constant is used somewhere in the code.\n\t * \n\t * NB: compile-time constant expressions are evaluated at compile time.\n\t */\n\tpublic boolean containsDouble(double value) {\n\t\tboolean isNan = Double.isNaN(value);\n\t\tfor (int i = 1; i < maxPoolSize; i++) {\n\t\t\tif (types[i] == DOUBLE) {\n\t\t\t\tdouble d = readDouble(i);\n\t\t\t\tif (d == value || (isNan && Double.isNaN(d))) return true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * Checks if the constant pool contains the provided int constant, which implies the constant is used somewhere in the code.\n\t * \n\t * NB: compile-time constant expressions are evaluated at compile time.\n\t */\n\tpublic boolean containsInteger(int value) {\n\t\tfor (int i = 1; i < maxPoolSize; i++) {\n\t\t\tif (types[i] == INTEGER && readInteger(i) == value) return true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * Checks if the constant pool contains the provided float constant, which implies the constant is used somewhere in the code.\n\t * \n\t * NB: compile-time constant expressions are evaluated at compile time.\n\t */\n\tpublic boolean containsFloat(float value) {\n\t\tboolean isNan = Float.isNaN(value);\n\t\tfor (int i = 1; i < maxPoolSize; i++) {\n\t\t\tif (types[i] == FLOAT) {\n\t\t\t\tfloat f = readFloat(i);\n\t\t\t\tif (f == value || (isNan && Float.isNaN(f))) return true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t\n\tprivate long readLong(int index) {\n\t\tint pos = offsets[index];\n\t\treturn ((long)read32(pos)) << 32 | (read32(pos + 4) & 0x00000000FFFFFFFFL);\n\t}\n\t\n\tprivate double readDouble(int index) {\n\t\treturn Double.longBitsToDouble(readLong(index));\n\t}\n\t\n\tprivate int readInteger(int index) {\n\t\treturn read32(offsets[index]);\n\t}\n\t\n\tprivate float readFloat(int index) {\n\t\treturn Float.intBitsToFloat(readInteger(index));\n\t}\n\t\n\tprivate int read32(int pos) {\n\t\treturn (byteCode[pos] & 0xFF) << 24 | (byteCode[pos + 1] & 0xFF) << 16 | (byteCode[pos + 2] & 0xFF) << 8 | (byteCode[pos + 3] & 0xFF);\n\t}\n\t\n\t/**\n\t * Returns the name of the class in JVM format, such as {@code java/lang/String}\n\t */\n\tpublic String getClassName() {\n\t\treturn getClassName(readValue(endOfPool + 2));\n\t}\n\t\n\t/**\n\t * Returns the name of the superclass in JVM format, such as {@code java/lang/Object}\n\t * \n\t * NB: If you try this on Object itself, you'll get {@code null}.<br />\n\t * NB2: For interfaces and annotation interfaces, you'll always get {@code java/lang/Object}\n\t */\n\tpublic String getSuperClassName() {\n\t\treturn getClassName(readValue(endOfPool + 4));\n\t}\n\t\n\t/**\n\t * Returns the name of all implemented interfaces.\n\t */\n\tpublic List<String> getInterfaces() {\n\t\tint size = readValue(endOfPool + 6);\n\t\tif (size == 0) return Collections.emptyList();\n\t\t\n\t\tList<String> result = new ArrayList<String>();\n\t\tfor (int i = 0; i < size; i++) {\n\t\t\tresult.add(getClassName(readValue(endOfPool + 8 + (i * 2))));\n\t\t}\n\t\treturn result;\n\t}\n\t\n\t/**\n\t * A {@code toString()} like utility to dump all contents of the constant pool into a string.\n\t * \n\t * NB: No guarantees are made about the exact layout of this string. It is for informational purposes only, don't try to parse it.<br />\n\t * NB2: After a double or long, there's a JVM spec-mandated gap, which is listed as {@code (cont.)} in the returned string.\n\t */\n\tpublic String poolContent() {\n\t\tStringBuilder result = new StringBuilder();\n\t\tfor (int i = 1; i < maxPoolSize; i++) {\n\t\t\tresult.append(String.format(\"#%02x: \", i));\n\t\t\tint pos = offsets[i];\n\t\t\tswitch(types[i]) {\n\t\t\tcase UTF8:\n\t\t\t\tresult.append(\"Utf8 \").append(utf8s[i]);\n\t\t\t\tbreak;\n\t\t\tcase CLASS:\n\t\t\t\tresult.append(\"Class \").append(getClassName(i));\n\t\t\t\tbreak;\n\t\t\tcase STRING:\n\t\t\t\tresult.append(\"String \\\"\").append(utf8s[readValue(pos)]).append(\"\\\"\");\n\t\t\t\tbreak;\n\t\t\tcase INTEGER:\n\t\t\t\tresult.append(\"int \").append(readInteger(i));\n\t\t\t\tbreak;\n\t\t\tcase FLOAT:\n\t\t\t\tresult.append(\"float \").append(readFloat(i));\n\t\t\t\tbreak;\n\t\t\tcase FIELD:\n\t\t\t\tappendAccess(result.append(\"Field \"), i);\n\t\t\t\tbreak;\n\t\t\tcase METHOD:\n\t\t\tcase INTERFACE_METHOD:\n\t\t\t\tappendAccess(result.append(\"Method \"), i);\n\t\t\t\tbreak;\n\t\t\tcase NAME_TYPE:\n\t\t\t\tappendNameAndType(result.append(\"Name&Type \"), i);\n\t\t\t\tbreak;\n\t\t\tcase LONG:\n\t\t\t\tresult.append(\"long \").append(readLong(i));\n\t\t\t\tbreak;\n\t\t\tcase DOUBLE:\n\t\t\t\tresult.append(\"double \").append(readDouble(i));\n\t\t\t\tbreak;\n\t\t\tcase METHOD_HANDLE:\n\t\t\t\tresult.append(\"MethodHandle...\");\n\t\t\t\tbreak;\n\t\t\tcase METHOD_TYPE:\n\t\t\t\tresult.append(\"MethodType...\");\n\t\t\t\tbreak;\n\t\t\tcase DYNAMIC:\n\t\t\t\tresult.append(\"Dynamic...\");\n\t\t\t\tbreak;\n\t\t\tcase INVOKE_DYNAMIC:\n\t\t\t\tresult.append(\"InvokeDynamic...\");\n\t\t\t\tbreak;\n\t\t\tcase 0:\n\t\t\t\tresult.append(\"(cont.)\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tresult.append(\"\\n\");\n\t\t}\n\t\treturn result.toString();\n\t}\n\t\n\tprivate void appendAccess(StringBuilder result, int index) {\n\t\tint pos = offsets[index];\n\t\tresult.append(getClassName(readValue(pos))).append(\".\");\n\t\tappendNameAndType(result, readValue(pos + 2));\n\t}\n\t\n\tprivate void appendNameAndType(StringBuilder result, int index) {\n\t\tint pos = offsets[index];\n\t\tresult.append(utf8s[readValue(pos)]).append(\":\").append(utf8s[readValue(pos + 2)]);\n\t}\n\t\n\tprivate String getClassName(int classIndex) {\n\t\tif (classIndex < 1) return null;\n\t\treturn utf8s[readValue(offsets[classIndex])];\n\t}\n\t\n\tprivate boolean isMethod(int i) {\n\t\tbyte type = types[i];\n\t\treturn type == METHOD || type == INTERFACE_METHOD;\n\t}\n\t\n\tprivate int findNameAndType(String name, String descriptor) {\n\t\tint nameIndex = findUtf8(name);\n\t\tif (nameIndex == NOT_FOUND) return NOT_FOUND;\n\t\tint descriptorIndex = findUtf8(descriptor);\n\t\tif (descriptorIndex == NOT_FOUND) return NOT_FOUND;\n\t\tfor (int i = 1; i < maxPoolSize; i++) {\n\t\t\tif (types[i] == NAME_TYPE && \n\t\t\t\t\treadValue(offsets[i]) == nameIndex && \n\t\t\t\t\treadValue(offsets[i] + 2) == descriptorIndex) return i;\n\t\t}\n\t\treturn NOT_FOUND;\n\t}\n\t\n\tprivate int findUtf8(String value) {\n\t\tfor (int i = 1; i < maxPoolSize; i++) {\n\t\t\tif (value.equals(utf8s[i])) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn NOT_FOUND;\n\t}\n\t\n\tprivate int findClass(String className) {\n\t\tint index = findUtf8(className);\n\t\tif (index == -1) return NOT_FOUND;\n\t\tfor (int i = 1; i < maxPoolSize; i++) {\n\t\t\tif (types[i] == CLASS && readValue(offsets[i]) == index) return i;\n\t\t}\n\t\treturn NOT_FOUND;\n\t}\n\t\n\t/**\n\t * Reads a 16-bit value at {@code position}\n\t */\n\tprivate int readValue(int position) {\n\t\treturn ((byteCode[position] & 0xFF) << 8) | (byteCode[position + 1] & 0xFF);\n\t}\n}\n"
  },
  {
    "path": "src/launch/lombok/launch/Main.java",
    "content": "/*\n * Copyright (C) 2014-2015 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.launch;\n\nimport java.lang.reflect.InvocationTargetException;\nimport java.util.Arrays;\n\nclass Main {\n\tprivate static ShadowClassLoader classLoader;\n\t\n\tstatic synchronized ClassLoader getShadowClassLoader() {\n\t\tif (classLoader == null) {\n\t\t\tclassLoader = new ShadowClassLoader(Main.class.getClassLoader(), \"lombok\", null, Arrays.<String>asList(), Arrays.asList(\"lombok.patcher.Symbols\"));\n\t\t}\n\t\treturn classLoader;\n\t}\n\t\n\tstatic synchronized void prependClassLoader(ClassLoader loader) {\n\t\tgetShadowClassLoader();\n\t\tclassLoader.prependParent(loader);\n\t}\n\t\n\tpublic static void main(String[] args) throws Throwable {\n\t\tClassLoader cl = getShadowClassLoader();\n\t\tClass<?> mc = cl.loadClass(\"lombok.core.Main\");\n\t\ttry {\n\t\t\tmc.getMethod(\"main\", String[].class).invoke(null, new Object[] {args});\n\t\t} catch (InvocationTargetException e) {\n\t\t\tthrow e.getCause();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/launch/lombok/launch/PackageShader.java",
    "content": "/*\n * Copyright (C) 2023 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.launch;\n\nimport java.io.UnsupportedEncodingException;\nimport java.nio.charset.Charset;\n\n/**\n * Low-level shader tool, that inline 'rewrites' bytecode so that a given package name acts like it has a different name.\n * \n * This is useful particularly in light of the java module system which disallows 'split packages' - different loader systems / class file sources\n * that both have the same package. Generally you'd take one of your dependency libraries (such as lombok's dependency on ObjectWeb's ASM bytecode parser) and\n * rename that dependency to avoid conflicts with other code that also wants to use ASM.\n * \n * This shader doesn't use ASM or any other bytecode manip library; it just scans constant pools.\n * \n * It's limited in its capabilities: A shading op (rename 'this' package to 'that') requires same-length strings so that the replacement can be done without moving things around.\n */\nclass PackageShader {\n\tprivate final byte[][] froms; // contains package prefixes that need shading.\n\tprivate final byte[][] tos;   // contains the post-shading package prefixes. froms.length == tos.length.\n\t\n\t/**\n\t * @param shadeOps provide pairs of strings; each pair is a from,to tuple listing binary package prefixes, e.g. \"Lorg/objectweb/asm\", \"Lorg/lombokweb/asm\".\n\t */\n\tpublic PackageShader(String... shadeOps) {\n\t\tif (shadeOps.length % 2 != 0) throw new IllegalArgumentException(\"Provide pairs: real package name to shaded package name (you provided an odd number of strings; even number required)\");\n\t\tCharset ascii = Charset.forName(\"US-ASCII\");\n\t\tint len = shadeOps.length / 2;\n\t\tfroms = new byte[len][];\n\t\ttos = new byte[len][];\n\t\tfor (int i = 0; i < len; i ++) {\n\t\t\tString in = shadeOps[i << 1];\n\t\t\tString out = shadeOps[(i << 1) | 1];\n\t\t\tif (in.contains(\".\") || out.contains(\".\")) throw new IllegalArgumentException(\"Binary name prefixes are required (use slashes and dollars instead of dots to separate type name elements); they look like e.g. 'java/util/'. Violating entry: \" + in + \" -> \" + out);\n\t\t\tfroms[i] = in.getBytes(ascii);\n\t\t\ttos[i] = out.getBytes(ascii);\n\t\t\tif (froms[i].length != tos[i].length) throw new IllegalArgumentException(\"Pair [\" + in + \" -> \" + out + \"] is invalid: Both strings must be the same length\");\n\t\t}\n\t}\n\t\n\tprivate static final byte CONSTANTPOOLTYPE_UTF8 = 1;\n\t/**\n\t * Fuxxes the constant pool of the provided bytecode, rewriting any constant pool entries that represent types that start with any of the registered package shade requests to the shaded variant.\n\t * \n\t * The byte array is modified in-line.\n\t * \n\t * @param b Bytecode\n\t * @return {@code true} if at least one shading modification has been applied.\n\t */\n\tpublic boolean apply(byte[] b) {\n\t\tClassFileMetaData md = new ClassFileMetaData(b);\n\t\tboolean changes = false;\n\t\t\n\t\t // We want to replace the package name but it can occur in the middle of a 'signature' string, e.g. ([I[Ljava/util/List;)Ljava/util/List; - so replace from start and _after_ every capital-L.\n\t\t// 'startPoints' tracks every location inside the constant pool UTF8 value that _could_ contain a fully qualified type name: Position 0 plus after _every_ capital-L in the UTF-8.\n\t\tint[] startPoints = new int[260];\n\t\tint maxStartPoints;\n\t\t\n\t\tfor (int offset : md.getOffsets(CONSTANTPOOLTYPE_UTF8)) {\n\t\t\tint len = readValue(b, offset);\n\t\t\toffset += 2;\n\t\t\tstartPoints[0] = offset;\n\t\t\tmaxStartPoints = 1;\n\t\t\t\n\t\t\tfor (int i = offset, max = offset + len; i < max; i++) {\n\t\t\t\tif (b[i] == 'L') startPoints[maxStartPoints++] = i + 1;\n\t\t\t}\n\t\t\t\n\t\t\tfor (int i = 0; i < froms.length; i++) {\n\t\t\t\touter: for (int startPointIdx = 0; startPointIdx < maxStartPoints; startPointIdx++) {\n\t\t\t\t\tint indexIntoSignature = startPoints[startPointIdx];\n\t\t\t\t\tif (len - (indexIntoSignature - offset) < froms[i].length) continue;\n\t\t\t\t\tfor (int p = 0; p < froms[i].length; p++) {\n\t\t\t\t\t\tif (b[indexIntoSignature + p] != froms[i][p]) continue outer;\n\t\t\t\t\t}\n\t\t\t\t\tSystem.arraycopy(tos[i], 0, b, indexIntoSignature, tos[i].length);\n\t\t\t\t\tchanges = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn changes;\n\t}\n\t\n\t/**\n\t * Reads a 16-bit value at {@code position}\n\t */\n\tprivate static int readValue(byte[] b, int position) {\n\t\treturn ((b[position] & 0xFF) << 8) | (b[position + 1] & 0xFF);\n\t}\n\t\n\tpublic String reverseResourceName(String name) {\n\t\touter: for (int i = 0; i < tos.length; i++) {\n\t\t\tint len = tos[i].length;\n\t\t\tif (name.length() < len) continue;\n\t\t\tfor (int p = 0; p < len; p++) {\n\t\t\t\tif (name.charAt(p) != tos[i][p]) continue outer;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tString out = new String(froms[i], 0, froms[i].length, \"US-ASCII\") + name.substring(len);\n\t\t\t\treturn out;\n\t\t\t} catch (UnsupportedEncodingException e) {\n\t\t\t\t// Can't happen - US-ASCII is guaranteed by the JVM spec\n\t\t\t\treturn name;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn name;\n\t}\n}\n"
  },
  {
    "path": "src/launch/lombok/launch/ShadowClassLoader.java",
    "content": "/*\n * Copyright (C) 2014-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.launch;\n\nimport java.io.BufferedReader;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.io.UnsupportedEncodingException;\nimport java.net.MalformedURLException;\nimport java.net.URI;\nimport java.net.URL;\nimport java.net.URLDecoder;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.Enumeration;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.IdentityHashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.Set;\nimport java.util.Vector;\nimport java.util.WeakHashMap;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.ConcurrentMap;\nimport java.util.jar.JarEntry;\nimport java.util.jar.JarFile;\nimport java.util.zip.ZipEntry;\nimport java.util.zip.ZipInputStream;\n\n/**\n * The shadow classloader serves to completely hide almost all classes in a given jar file by using a different file ending.\n * \n * The shadow classloader also serves to link in a project as it is being developed (a 'bin' dir from an IDE for example).\n * <p>\n * Classes loaded by the shadowloader use \".SCL.<em>sclSuffix</em>\" in addition to \".class\". In other words, most of the class files in a given jar end in this suffix, which\n * serves to hide them from any tool that isn't aware of the suffix (such as IDEs generating auto-complete dialogs, and javac's classpath in general). Only shadowloader can actually\n * load these classes.\n * <p>\n * The shadowloader will pick up an alternate (priority) classpath, using normal class files, from the system property \"<code>shadow.override.<em>sclSuffix</em></code>\".\n * This shadow classpath looks just like a normal java classpath; the path separator is applied (semi-colon on windows, colon elsewhere), and entries can consist of directories,\n * jar files, or directories ending in \"/*\" to pick up all jars inside it.\n * <p>\n * Load order is as follows if at least one override is present:\n * <li>First, if the resource is found in one of the paths stated in the shadow classpath, find that.\n * <li>Next, ask the {@code parent} loader, which is passed during construction of the ShadowClassLoader.\n * <li>Notably, this jar's contents are always skipped! (The idea of the shadow classpath is that this jar only functions as a launcher, not as a source of your actual application).\n * </ul>\n * \n * If no overrides are present, the load order is as follows:\n * <li>First, if the resource is found in our own jar (trying \".SCL.<em>sclSuffix</em>\" first for any resource request ending in \".class\"), return that.\n * <li>Next, check any jar files other than our own, loading them via this classloader, if they have a file {@code META-INF/ShadowClassLoader} that contains a line of text with <em>sclSuffix</em>.\n * <li>Next, ask the {@code parent} loader.\n * </ul>\n * \n * Use ShadowClassLoader to accomplish the following things:<ul>\n * <li>Avoid contaminating the namespace of any project using an SCL-based jar. Autocompleters in IDEs will NOT suggest anything other than actual public API.\n * <li>Like jarjar, allows folding in dependencies such as ASM without foisting these dependencies on projects that use this jar. shadowloader obviates the need for jarjar.\n * <li>Allows an agent (which MUST be in jar form) to still load everything except this loader infrastructure from class files generated by the IDE, which should\n * considerably help debugging, as you can now rely on the IDE's built-in auto-recompile features instead of having to run a full build everytime, and it should help\n * with hot code replace and the like (this is what the {@code shadow.override} feature is for).\n * </ul>\n * \n * Implementation note: {@code lombok.eclipse.agent.EclipseLoaderPatcher} <em>relies</em> on this class having no dependencies on any other class except the JVM boot class and\n * package private classes inside this package <strong>explicitly</strong> listed in EclipseLoaderPatcherTransplants's {@code overrideLoadResult} (near the top). This notably\n * including any other classes in this package, <strong>including</strong> inner classes. So, don't write closures, anonymous inner class literals,\n * enums, or anything else that could cause the compilation of this file to produce more than 1 class file. In general, actually passing load control to this loader is a bit tricky\n * so ensure that this class has zero dependencies on anything except java core classes.\n */\nclass ShadowClassLoader extends ClassLoader {\n\tprivate static final String SELF_NAME = \"lombok/launch/ShadowClassLoader.class\";\n\tprivate static final ConcurrentMap<String, Class<?>> highlanderMap = new ConcurrentHashMap<String, Class<?>>();\n\t\n\tprivate final String SELF_BASE;\n\tprivate final File SELF_BASE_FILE;\n\tprivate final int SELF_BASE_LENGTH;\n\t\n\tprivate final List<File> override = new ArrayList<File>();\n\tprivate final String sclSuffix;\n\tprivate final List<String> parentExclusion = new ArrayList<String>();\n\tprivate final List<String> highlanders = new ArrayList<String>();\n\t\n\tprivate final Set<ClassLoader> prependedParentLoaders = Collections.newSetFromMap(new IdentityHashMap<ClassLoader, Boolean>());\n\t\n\tprivate final PackageShader shader = new PackageShader(\n\t\t\"org/objectweb/asm/\", \"org/lombokweb/asm/\");\n\t\n\tpublic void prependParent(ClassLoader loader) {\n\t\tif (loader == null) return;\n\t\tif (loader == getParent()) return;\n\t\tif (loader == this) return;\n\t\tprependedParentLoaders.add(loader);\n\t}\n\t\n\t/**\n\t * @param source The 'parent' classloader.\n\t * @param sclSuffix The suffix of the shadowed class files in our own jar. For example, if this is {@code lombok}, then the class files in your jar should be {@code foo/Bar.SCL.lombok} and not {@code foo/Bar.class}.\n\t * @param selfBase The (preferably absolute) path to our own jar. This jar will be searched for class/SCL.sclSuffix files.\n\t * @param parentExclusion For example {@code \"lombok.\"}; upon invocation of loadClass of this loader, the parent loader ({@code source}) will NOT be invoked if the class to be loaded begins with anything in the parent exclusion list. No exclusion is applied for getResource(s).\n\t * @param highlanders SCL will put in extra effort to ensure that these classes (in simple class spec, so {@code foo.bar.baz.ClassName}) are only loaded once as a class, even if many different classloaders try to load classes, such as equinox/OSGi.\n\t */\n\tShadowClassLoader(ClassLoader source, String sclSuffix, String selfBase, List<String> parentExclusion, List<String> highlanders) {\n\t\tsuper(source);\n\t\tthis.sclSuffix = sclSuffix;\n\t\tif (parentExclusion != null) for (String pe : parentExclusion) {\n\t\t\tpe = pe.replace(\".\", \"/\");\n\t\t\tif (!pe.endsWith(\"/\")) pe = pe + \"/\";\n\t\t\tthis.parentExclusion.add(pe);\n\t\t}\n\t\tif (highlanders != null) for (String hl : highlanders) this.highlanders.add(hl);\n\t\t\n\t\tif (selfBase != null) {\n\t\t\tSELF_BASE = selfBase;\n\t\t\tSELF_BASE_LENGTH = selfBase.length();\n\t\t} else {\n\t\t\tURL sclClassUrl = ShadowClassLoader.class.getResource(\"ShadowClassLoader.class\");\n\t\t\tString sclClassStr = sclClassUrl == null ? null : sclClassUrl.toString();\n\t\t\tif (sclClassStr == null || !sclClassStr.endsWith(SELF_NAME)) {\n\t\t\t\tClassLoader cl = ShadowClassLoader.class.getClassLoader();\n\t\t\t\tthrow new RuntimeException(\"ShadowLoader can't find itself. SCL loader type: \" + (cl == null ? \"*NULL*\" : cl.getClass().toString()));\n\t\t\t}\n\t\t\tSELF_BASE_LENGTH = sclClassStr.length() - SELF_NAME.length();\n\t\t\tString decoded = urlDecode(sclClassStr.substring(0, SELF_BASE_LENGTH));\n\t\t\tSELF_BASE = decoded;\n\t\t}\n\t\t\n\t\tif (SELF_BASE.startsWith(\"jar:file:\") && SELF_BASE.endsWith(\"!/\")) SELF_BASE_FILE = new File(SELF_BASE.substring(9, SELF_BASE.length() - 2));\n\t\telse if (SELF_BASE.startsWith(\"file:\")) SELF_BASE_FILE = new File(SELF_BASE.substring(5));\n\t\telse SELF_BASE_FILE = new File(SELF_BASE);\n\t\tString scl = System.getProperty(\"shadow.override.\" + sclSuffix);\n\t\tif (scl != null && !scl.isEmpty()) {\n\t\t\tfor (String part : scl.split(\"\\\\s*\" + (File.pathSeparatorChar == ';' ? \";\" : \":\") + \"\\\\s*\")) {\n\t\t\t\tif (part.endsWith(\"/*\") || part.endsWith(File.separator + \"*\")) {\n\t\t\t\t\taddOverrideJarDir(part.substring(0, part.length() - 2));\n\t\t\t\t} else {\n\t\t\t\t\taddOverrideClasspathEntry(part);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate final Map<String, Object> mapJarPathToTracker = new HashMap<String, Object>();\n\tprivate static final Map<Object, String> mapTrackerToJarPath = new WeakHashMap<Object, String>();\n\tprivate static final Map<Object, Set<String>> mapTrackerToJarContents = new WeakHashMap<Object, Set<String>>();\n\t\n\t/**\n\t * This cache ensures that any given jar file is only opened once in order to determine the full contents of it.\n\t * We use 'trackers' to make sure that the bulk of the memory taken up by this cache (the list of strings representing the content of a jar file)\n\t * gets garbage collected if all ShadowClassLoaders that ever tried to request a listing of this jar file, are garbage collected.\n\t */\n\tprivate Set<String> getOrMakeJarListing(final String absolutePathToJar) {\n\t\tsynchronized (mapTrackerToJarPath) {\n\t\t\t/*\n\t\t\t * 1) Check our private instance JarPath-to-Tracker Mappings:\n\t\t\t */\n\t\t\tObject ourTracker = mapJarPathToTracker.get(absolutePathToJar);\n\t\t\tif (ourTracker != null) {\n\t\t\t\t/*\n\t\t\t\t * Yes, we are already tracking this Jar. Just return its contents...\n\t\t\t\t */\n\t\t\t\treturn mapTrackerToJarContents.get(ourTracker);\n\t\t\t}\n\t\t\t\n\t\t\t/*\n\t\t\t * 2) Not tracked by us as yet. Check statically whether others have tracked this JarPath:\n\t\t\t */\n\t\t\tfor (Entry<Object, String> entry : mapTrackerToJarPath.entrySet()) {\n\t\t\t\tif (entry.getValue().equals(absolutePathToJar)) {\n\t\t\t\t\t/*\n\t\t\t\t\t * Yes, 3rd party is tracking this jar. We must track too, then return its contents.\n\t\t\t\t\t */\n\t\t\t\t\tObject otherTracker = entry.getKey();\n\t\t\t\t\tmapJarPathToTracker.put(absolutePathToJar, otherTracker);\n\t\t\t\t\treturn mapTrackerToJarContents.get(otherTracker);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t/*\n\t\t\t * 3) Not tracked by anyone so far. Build, publish, track & return Jar contents...\n\t\t\t */\n\t\t\tObject newTracker = new Object();\n\t\t\tSet<String> jarMembers = getJarMemberSet(absolutePathToJar);\n\t\t\t\n\t\t\tmapTrackerToJarContents.put(newTracker, jarMembers);\n\t\t\tmapTrackerToJarPath.put(newTracker, absolutePathToJar);\n\t\t\tmapJarPathToTracker.put(absolutePathToJar, newTracker);\n\t\t\t\n\t\t\treturn jarMembers;\n\t\t}\n\t}\n\t\n\t/**\n\t * Return a {@link Set} of members in the Jar identified by {@code absolutePathToJar}.\n\t * \n\t * @param absolutePathToJar Cache key\n\t * @return a Set with the Jar member-names\n\t */\n\tprivate Set<String> getJarMemberSet(String absolutePathToJar) {\n\t\t/*\n\t\t * Note:\n\t\t * Our implementation returns a HashSet. initialCapacity and loadFactor are carefully tweaked for speed and RAM optimization purposes.\n\t\t * \n\t\t * Benchmark:\n\t\t * The HashSet implementation is about 10% slower to build (only happens once) than the ArrayList.\n\t\t * The HashSet with shiftBits = 1 was about 33 times(!) faster than the ArrayList for retrievals.\n\t\t */\n\t\ttry {\n\t\t\tint shiftBits = 1;  //  (fast, but big)  0 <= shiftBits <= 5, say  (slower & compact)\n\t\t\tJarFile jar = new JarFile(absolutePathToJar);\n\t\t\t\n\t\t\t/*\n\t\t\t * Find the first power of 2 >= JarSize (as calculated in HashSet constructor)\n\t\t\t */\n\t\t\tint jarSizePower2 = Integer.highestOneBit(jar.size());\n\t\t\tif (jarSizePower2 != jar.size()) jarSizePower2 <<= 1;\n\t\t\tif (jarSizePower2 == 0) jarSizePower2 = 1;\n\t\t\t\n\t\t\tSet<String> jarMembers = new HashSet<String>(jarSizePower2 >> shiftBits,  1 << shiftBits);\n\t\t\ttry {\n\t\t\t\tEnumeration<JarEntry> entries = jar.entries();\n\t\t\t\twhile (entries.hasMoreElements()) {\n\t\t\t\t\tJarEntry jarEntry = entries.nextElement();\n\t\t\t\t\tif (jarEntry.isDirectory()) continue;\n\t\t\t\t\tjarMembers.add(jarEntry.getName());\n\t\t\t\t}\n\t\t\t} catch (Exception ignore) {\n\t\t\t\t// ignored; if the jar can't be read, treating it as if the jar contains no classes is just what we want.\n\t\t\t} finally {\n\t\t\t\tjar.close();\n\t\t\t}\n\t\t\treturn jarMembers;\n\t\t}\n\t\tcatch (Exception newJarFileException) {\n\t\t\treturn Collections.emptySet();\n\t\t}\n\t}\n\t\n\t/**\n\t * Looks up {@code altName} in {@code location}, and if that isn't found, looks up {@code name}; {@code altName} can be null in which case it is skipped.\n\t */\n\tprivate URL getResourceFromLocation(String name, String altName, File location) {\n\t\tif (location.isDirectory()) {\n\t\t\ttry {\n\t\t\t\tif (altName != null) {\n\t\t\t\t\tFile f = new File(location, altName);\n\t\t\t\t\tif (f.isFile() && f.canRead()) return f.toURI().toURL();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tFile f = new File(location, name);\n\t\t\t\tif (f.isFile() && f.canRead()) return f.toURI().toURL();\n\t\t\t\treturn null;\n\t\t\t} catch (MalformedURLException e) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (!location.isFile() || !location.canRead()) return null;\n\t\t\n\t\tFile absoluteFile; {\n\t\t\ttry {\n\t\t\t\tabsoluteFile = location.getCanonicalFile();\n\t\t\t} catch (Exception e) {\n\t\t\t\tabsoluteFile = location.getAbsoluteFile();\n\t\t\t}\n\t\t}\n\t\tSet<String> jarContents = getOrMakeJarListing(absoluteFile.getAbsolutePath());\n\t\t\n\t\tString absoluteUri = absoluteFile.toURI().toString();\n\t\t\n\t\ttry {\n\t\t\tif (jarContents.contains(altName)) {\n\t\t\t\treturn new URI(\"jar:\" + absoluteUri + \"!/\" + altName).toURL();\n\t\t\t}\n\t\t} catch (Exception ignore) {\n\t\t\t// intentional fallthrough\n\t\t}\n\t\t\n\t\ttry {\n\t\t\tif (jarContents.contains(name)) {\n\t\t\t\treturn new URI(\"jar:\" + absoluteUri + \"!/\" + name).toURL();\n\t\t\t}\n\t\t} catch(Exception ignore) {\n\t\t\t// intentional fallthrough\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\t\n\tprivate boolean partOfShadow(String item, String name) {\n\t\treturn !name.startsWith(\"java/\") \n\t\t\t\t&& !name.startsWith(\"sun/\") \n\t\t\t\t&& (inOwnBase(item, name) || isPartOfShadowSuffix(item, name, sclSuffix));\n\t}\n\t\n\t/**\n\t * Checks if the stated item is located inside the same classpath root as the jar that hosts ShadowClassLoader.class. {@code item} and {@code name} refer to the same thing.\n\t */\n\tprivate boolean inOwnBase(String item, String name) {\n\t\tif (item == null) return false;\n\t\treturn (item.length() == SELF_BASE_LENGTH + name.length()) && SELF_BASE.regionMatches(0, item, 0, SELF_BASE_LENGTH);\n\t}\n\t\n\tprivate static boolean sclFileContainsSuffix(InputStream in, String suffix) throws IOException {\n\t\tBufferedReader br = new BufferedReader(new InputStreamReader(in, \"UTF-8\"));\n\t\tfor (String line = br.readLine(); line != null; line = br.readLine()) {\n\t\t\tline = line.trim();\n\t\t\tif (line.isEmpty() || line.charAt(0) == '#') continue;\n\t\t\tif (line.equals(suffix)) return true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\tprivate static String urlDecode(String in) {\n\t\tfinal String plusFixed = in.replaceAll(\"\\\\+\", \"%2B\");\n\t\ttry {\n\t\t\treturn URLDecoder.decode(plusFixed, \"UTF-8\");\n\t\t} catch (UnsupportedEncodingException e) {\n\t\t\tthrow new InternalError(\"UTF-8 not supported\");\n\t\t}\n\t}\n\t\n\tprivate Map<String, Boolean> fileRootCache = new HashMap<String, Boolean>();\n\tprivate boolean isPartOfShadowSuffixFileBased(String fileRoot, String suffix) {\n\t\tString key = fileRoot + \"::\" + suffix;\n\t\tBoolean existing = fileRootCache.get(key);\n\t\tif (existing != null) return existing.booleanValue();\n\n\t\tFile f = new File(fileRoot + \"/META-INF/ShadowClassLoader\");\n\t\ttry {\n\t\t\tFileInputStream fis = new FileInputStream(f);\n\t\t\ttry {\n\t\t\t\tboolean v = sclFileContainsSuffix(fis, suffix);\n\t\t\t\tfileRootCache.put(key, v);\n\t\t\t\treturn v;\n\t\t\t} finally {\n\t\t\t\tfis.close();\n\t\t\t}\n\t\t} catch (FileNotFoundException fnfEx) {\n\t\t\tfileRootCache.put(key, false);\n\t\t\treturn false;\n\t\t} catch (IOException e) {\n\t\t\tfileRootCache.put(key, false);\n\t\t\treturn false; // *unexpected*\n\t\t}\n\t}\n\n\tprivate Map<String, Boolean> jarLocCache = new HashMap<String, Boolean>();\n\tprivate boolean isPartOfShadowSuffixJarBased(String jarLoc, String suffix) {\n\t\tString key = jarLoc + \"::\" + suffix;\n\t\tBoolean existing = jarLocCache.get(key);\n\t\tif (existing != null) return existing.booleanValue();\n\n\t\tif (jarLoc.startsWith(\"file:/\")) jarLoc = urlDecode(jarLoc.substring(5));\n\t\ttry {\n\t\t\tFileInputStream jar = new FileInputStream(jarLoc);\n\t\t\ttry {\n\t\t\t\tZipInputStream zip = new ZipInputStream(jar);\n\t\t\t\ttry {\n\t\t\t\t\twhile (true) {\n\t\t\t\t\t\tZipEntry entry = zip.getNextEntry();\n\t\t\t\t\t\tif (entry == null) {\n\t\t\t\t\t\t\tjarLocCache.put(key, false);\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!\"META-INF/ShadowClassLoader\".equals(entry.getName())) continue;\n\t\t\t\t\t\tboolean v = sclFileContainsSuffix(zip, suffix);\n\t\t\t\t\t\tjarLocCache.put(key, v);\n\t\t\t\t\t\treturn v;\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\tzip.close();\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tjar.close();\n\t\t\t}\n\t\t} catch (FileNotFoundException fnfEx) {\n\t\t\tjarLocCache.put(key, false);\n\t\t\treturn false;\n\t\t} catch (IOException ex) {\n\t\t\tjarLocCache.put(key, false);\n\t\t\treturn false; // *unexpected*\n\t\t}\n\t}\n\n\tprivate boolean isPartOfShadowSuffix(String url, String name, String suffix) {\n\t\t// Instead of throwing an exception or logging, weird, unexpected cases just return false.\n\t\t// This is better than throwing an exception, because exceptions would make your build tools unusable.\n\t\t// Such cases are marked with the comment: // *unexpected*\n\t\tif (url == null) return false;\n\t\tif (url.startsWith(\"file:/\")) {\n\t\t\turl = urlDecode(url.substring(5));\n\t\t\tif (url.length() <= name.length() || !url.endsWith(name) || url.charAt(url.length() - name.length() - 1) != '/') {\n\t\t\t\treturn false; // *unexpected*\n\t\t\t}\n\t\t\t\n\t\t\tString fileRoot = url.substring(0, url.length() - name.length() - 1);\n\t\t\treturn isPartOfShadowSuffixFileBased(fileRoot, suffix);\n\t\t} else if (url.startsWith(\"jar:\")) {\n\t\t\tint sep = url.indexOf('!');\n\t\t\tif (sep == -1) {\n\t\t\t\treturn false; // *unexpected*\n\t\t\t}\n\t\t\tString jarLoc = url.substring(4, sep);\n\t\t\treturn isPartOfShadowSuffixJarBased(jarLoc, suffix);\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\tprivate String toSclResourceName(String name) {\n\t\treturn \"SCL.\" + sclSuffix + \"/\" + name.substring(0, name.length() - 6) + \".SCL.\" + sclSuffix;\n\t}\n\t\n\t@Override public Enumeration<URL> getResources(String name) throws IOException {\n\t\tString altName = null;\n\t\tif (name.endsWith(\".class\")) altName = toSclResourceName(name);\n\t\t\n\t\t// Vector? Yes, we need one:\n\t\t// * We can NOT make inner classes here (this class is loaded with special voodoo magic in eclipse, as a one off, it's not a full loader.\n\t\t// * We need to return an enumeration.\n\t\t// * We can't make one on the fly.\n\t\t// * ArrayList can't make these.\n\t\tVector<URL> vector = new Vector<URL>();\n\t\t\n\t\tfor (File ce : override) {\n\t\t\tURL url = getResourceFromLocation(name, altName, ce);\n\t\t\tif (url != null) vector.add(url);\n\t\t}\n\t\t\n\t\tif (override.isEmpty()) {\n\t\t\tURL fromSelf = getResourceFromLocation(name, altName, SELF_BASE_FILE);\n\t\t\tif (fromSelf != null) vector.add(fromSelf);\n\t\t}\n\t\t\n\t\tEnumeration<URL> sec = super.getResources(name);\n\t\twhile (sec.hasMoreElements()) {\n\t\t\tURL item = sec.nextElement();\n\t\t\tif (isPartOfShadowSuffix(item.toString(), name, sclSuffix)) vector.add(item);\n\t\t}\n\t\t\n\t\tif (altName != null) {\n\t\t\tEnumeration<URL> tern = super.getResources(altName);\n\t\t\twhile (tern.hasMoreElements()) {\n\t\t\t\tURL item = tern.nextElement();\n\t\t\t\tif (isPartOfShadowSuffix(item.toString(), altName, sclSuffix)) vector.add(item);\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn vector.elements();\n\t}\n\t\n\t@Override public URL getResource(String name) {\n\t\treturn getResource_(name, false);\n\t}\n\t\n\tprivate URL getResource_(String name, boolean noSuper) {\n\t\tString altName = null;\n\t\tname = shader == null ? name : shader.reverseResourceName(name);\n\t\tif (name.endsWith(\".class\")) altName = toSclResourceName(name);\n\t\t\n\t\tfor (File ce : override) {\n\t\t\tURL url = getResourceFromLocation(name, altName, ce);\n\t\t\tif (url != null) return url;\n\t\t}\n\t\t\n\t\tif (!override.isEmpty()) {\n\t\t\tif (noSuper) return null;\n\t\t\tif (altName != null) {\n\t\t\t\ttry {\n\t\t\t\t\tURL res = getResourceSkippingSelf(altName);\n\t\t\t\t\tif (res != null) return res;\n\t\t\t\t} catch (IOException ignore) {}\n\t\t\t}\n\t\t\t\n\t\t\ttry {\n\t\t\t\treturn getResourceSkippingSelf(name);\n\t\t\t} catch (IOException e) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\t\n\t\tURL url = getResourceFromLocation(name, altName, SELF_BASE_FILE);\n\t\tif (url != null) return url;\n\t\t\n\t\tif (altName != null) {\n\t\t\tURL res = super.getResource(altName);\n\t\t\tif (res != null && (!noSuper || partOfShadow(res.toString(), altName))) return res;\n\t\t}\n\t\t\n\t\tURL res = super.getResource(name);\n\t\tif (res != null && (!noSuper || partOfShadow(res.toString(), name))) return res;\n\t\treturn null;\n\t}\n\t\n\tprivate boolean exclusionListMatch(String name) {\n\t\tfor (String pe : parentExclusion) {\n\t\t\tif (name.startsWith(pe)) return true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\tprivate URL getResourceSkippingSelf(String name) throws IOException {\n\t\tURL candidate = super.getResource(name);\n\t\tif (candidate == null) return null;\n\t\tif (!partOfShadow(candidate.toString(), name)) return candidate;\n\t\t\n\t\tEnumeration<URL> en = super.getResources(name);\n\t\twhile (en.hasMoreElements()) {\n\t\t\tcandidate = en.nextElement();\n\t\t\tif (!partOfShadow(candidate.toString(), name)) return candidate;\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\t\n\t@Override public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {\n\t\t{\n\t\t\tClass<?> alreadyLoaded = findLoadedClass(name);\n\t\t\tif (alreadyLoaded != null) return alreadyLoaded;\n\t\t}\n\t\t\n\t\tif (highlanders.contains(name)) {\n\t\t\tClass<?> c = highlanderMap.get(name);\n\t\t\tif (c != null) return c;\n\t\t}\n\t\t\n\t\tString fileNameOfClass = name.replace(\".\", \"/\") + \".class\";\n\t\tURL res = getResource_(fileNameOfClass, true);\n\t\tif (res == null) {\n\t\t\tif (!exclusionListMatch(fileNameOfClass)) {\n\t\t\t\ttry {\n\t\t\t\t\t// First search in the prepended classloaders, the class might be there already\n\t\t\t\t\tfor (ClassLoader pre : prependedParentLoaders) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tClass<?> loadClass = pre.loadClass(name);\n\t\t\t\t\t\t\tif (loadClass != null) return loadClass;\n\t\t\t\t\t\t} catch (Throwable e) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\treturn super.loadClass(name, resolve);\n\t\t\t\t} catch (ClassNotFoundException cnfe) {\n\t\t\t\t\tres = getResource_(\"secondaryLoading.SCL.\" + sclSuffix + \"/\" + name.replace(\".\", \"/\") + \".SCL.\" + sclSuffix, true);\n\t\t\t\t\tif (res == null) throw cnfe;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (res == null) throw new ClassNotFoundException(name);\n\t\t\n\t\treturn urlToDefineClass(name, res, resolve);\n\t}\n\t\n\tprivate Class<?> urlToDefineClass(String name, URL res, boolean resolve) throws ClassNotFoundException {\n\t\tbyte[] b;\n\t\tint p = 0;\n\t\ttry {\n\t\t\tInputStream in = res.openStream();\n\t\t\t\n\t\t\ttry {\n\t\t\t\tb = new byte[65536];\n\t\t\t\twhile (true) {\n\t\t\t\t\tint r = in.read(b, p, b.length - p);\n\t\t\t\t\tif (r == -1) break;\n\t\t\t\t\tp += r;\n\t\t\t\t\tif (p == b.length) {\n\t\t\t\t\t\tbyte[] nb = new byte[b.length * 2];\n\t\t\t\t\t\tSystem.arraycopy(b, 0, nb, 0, p);\n\t\t\t\t\t\tb = nb;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tin.close();\n\t\t\t}\n\t\t} catch (IOException e) {\n\t\t\tthrow new ClassNotFoundException(\"I/O exception reading class \" + name, e);\n\t\t}\n\t\t\n\t\tif (shader != null) shader.apply(b);\n\t\t\n\t\tClass<?> c;\n\t\ttry {\n\t\t\tc = defineClass(name, b, 0, p);\n\t\t} catch (LinkageError e) {\n\t\t\tif (highlanders.contains(name)) {\n\t\t\t\tClass<?> alreadyDefined = highlanderMap.get(name);\n\t\t\t\tif (alreadyDefined != null) return alreadyDefined;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tc = this.findLoadedClass(name);\n\t\t\t} catch (LinkageError e2) {\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\tif (c == null) throw e;\n\t\t}\n\t\t\n\t\tif (highlanders.contains(name)) {\n\t\t\tClass<?> alreadyDefined = highlanderMap.putIfAbsent(name, c);\n\t\t\tif (alreadyDefined != null) c = alreadyDefined;\n\t\t}\n\t\t\n\t\tif (resolve) resolveClass(c);\n\t\treturn c;\n\t}\n\t\n\tpublic void addOverrideJarDir(String dir) {\n\t\tFile f = new File(dir);\n\t\tfor (File j : f.listFiles()) {\n\t\t\tif (j.getName().toLowerCase().endsWith(\".jar\") && j.canRead() && j.isFile()) override.add(j);\n\t\t}\n\t}\n\t\n\tpublic void addOverrideClasspathEntry(String entry) {\n\t\toverride.add(new File(entry));\n\t}\n}\n"
  },
  {
    "path": "src/mavenEcjBootstrapAgent/lombok/launch/MavenEcjBootstrapAgent.java",
    "content": "/*\n * Copyright (C) 2022 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.launch;\n\nimport java.lang.instrument.ClassFileTransformer;\nimport java.lang.instrument.IllegalClassFormatException;\nimport java.lang.instrument.Instrumentation;\nimport java.net.URL;\nimport java.net.URLClassLoader;\nimport java.security.ProtectionDomain;\nimport java.util.jar.JarFile;\n\n/**\n * This Java agent does not transform bytecode, but acts as a watcher that can\n * figure out when it is appropriate to load Lombok itself within a Maven\n * execution.\n * \n * It relies on several facts:\n * <ul>\n * <li>maven-compiler-plugin contains an {@code AbstractCompilerMojo} class that\n * compiler instances extend.\n * <li>Maven loaders are {@code ClassRealms}, which extend {@code URLClassLoader}.\n * <li>Each plugin dependency in the <em>pom.xml </em>is represented as a file URL on the\n * ClassRealm that points to the artifact.\n * <li>URLs to Maven artifacts contain the group and artifact ids\n * ({@code [...]/groupid/artifactid/ver/artifactid-ver.jar}).\n * <li>The Lombok Java agent class is {@code lombok.launch.Agent}.\n * </ul>\n * Given all of the above, the transformer simply waits for {@code AbstractCompilerMojo}\n * to be loaded, then uses the loader to find the path to the Lombok jar file,\n * and finally loads the Lombok agent using reflection.\n */\npublic final class MavenEcjBootstrapAgent {\n\tprivate static final String MAVEN_COMPILER_TRIGGER_CLASS = \"org/apache/maven/plugin/compiler/AbstractCompilerMojo\";\n\tprivate static final String LOMBOK_URL_IDENTIFIER = \"/org/projectlombok/lombok/\";\n\tprivate static final String LOMBOK_AGENT_CLASS = \"lombok.launch.Agent\";\n\tprivate static final byte[] NOT_TRANSFORMED = null;\n\t\n\tprivate MavenEcjBootstrapAgent() {}\n\t\n\tpublic static void premain(final String agentArgs, final Instrumentation instrumentation) {\n\t\tinstrumentation.addTransformer(new ClassFileTransformer() {\n\t\t\t@Override public byte[] transform(final ClassLoader loader, final String className, final Class<?> cbr, final ProtectionDomain pd, final byte[] cfb) throws IllegalClassFormatException {\n\t\t\t\tif (MAVEN_COMPILER_TRIGGER_CLASS.equals(className)) {\n\t\t\t\t\tfor (final URL url : ((URLClassLoader) loader).getURLs()) {\n\t\t\t\t\t\tif (url.getPath().contains(LOMBOK_URL_IDENTIFIER)) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tinstrumentation.appendToSystemClassLoaderSearch(new JarFile(url.getPath()));\n\t\t\t\t\t\t\t\tMavenEcjBootstrapAgent.class.getClassLoader().loadClass(LOMBOK_AGENT_CLASS).getDeclaredMethod(\"premain\", String.class, Instrumentation.class).invoke(null, agentArgs, instrumentation);\n\t\t\t\t\t\t\t\tinstrumentation.removeTransformer(this);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t\t\t\t// There are no appropriate loggers available at\n\t\t\t\t\t\t\t\t// this point in time.\n\t\t\t\t\t\t\t\te.printStackTrace(System.err);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn NOT_TRANSFORMED;\n\t\t\t}\n\t\t});\n\t}\n}\n"
  },
  {
    "path": "src/spiProcessor/lombok/spi/Provides.java",
    "content": "/*\n * Copyright (C) 2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.spi;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.SOURCE)\npublic @interface Provides {\n\tClass<?>[] value() default {};\n}\n"
  },
  {
    "path": "src/spiProcessor/lombok/spi/SpiProcessor.java",
    "content": "/*\n * Copyright (C) 2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.spi;\n\nimport java.io.IOException;\nimport java.util.ArrayDeque;\nimport java.util.ArrayList;\nimport java.util.Deque;\nimport java.util.List;\nimport java.util.Map.Entry;\nimport java.util.Set;\n\nimport javax.annotation.processing.AbstractProcessor;\nimport javax.annotation.processing.ProcessingEnvironment;\nimport javax.annotation.processing.RoundEnvironment;\nimport javax.annotation.processing.SupportedAnnotationTypes;\nimport javax.lang.model.SourceVersion;\nimport javax.lang.model.element.AnnotationMirror;\nimport javax.lang.model.element.AnnotationValue;\nimport javax.lang.model.element.Element;\nimport javax.lang.model.element.ElementKind;\nimport javax.lang.model.element.ExecutableElement;\nimport javax.lang.model.element.Modifier;\nimport javax.lang.model.element.Name;\nimport javax.lang.model.element.TypeElement;\nimport javax.lang.model.type.DeclaredType;\nimport javax.lang.model.type.TypeMirror;\n\nimport javax.tools.Diagnostic.Kind;\n\n@SupportedAnnotationTypes(\"*\")\npublic class SpiProcessor extends AbstractProcessor {\n\tprivate SpiProcessorCollector data;\n\tprivate SpiProcessorPersistence persistence;\n\t\n\tstatic String getRootPathOfServiceFiles() {\n\t\treturn \"META-INF/services/\";\n\t}\n\t\n\t@Override public SourceVersion getSupportedSourceVersion() {\n\t\treturn SourceVersion.latest();\n\t}\n\t\n\tstatic String toErrorMsg(Exception e, String pathName) {\n\t\tStringBuilder sb = new StringBuilder();\n\t\tsb.append(\"Exception applying SPI processor on \").append(pathName).append(\": \").append(toStringLong(e));\n\t\treturn sb.toString();\n\t}\n\t\n\tprivate static String toStringLong(Throwable t) {\n\t\tif (t == null) return \"NULL\";\n\t\tStringBuilder out = new StringBuilder();\n\t\t\n\t\tString msg = t.getMessage();\n\t\tout.append(t.getClass().getName());\n\t\tif (msg != null) out.append(\": \").append(msg);\n\t\tString indent = \"  \";\n\t\t\n\t\tStackTraceElement[] elems = t.getStackTrace();\n\t\tif (elems != null) for (int i = 0; i < elems.length; i++) {\n\t\t\tout.append(\"\\n\").append(indent).append(elems[i]);\n\t\t}\n\t\tThrowable cause = t.getCause();\n\t\twhile (cause != null) {\n\t\t\tindent = indent + \" \";\n\t\t\tout.append(\"\\n\").append(indent).append(\"Caused by: \").append(cause.getClass().getName());\n\t\t\tmsg = cause.getMessage();\n\t\t\tif (msg != null) out.append(\": \").append(msg);\n\t\t\telems = cause.getStackTrace();\n\t\t\tindent = indent + \" \";\n\t\t\tif (elems != null) for (int i = 0; i < elems.length; i++) {\n\t\t\t\tout.append(\"\\n\").append(indent).append(elems[i]);\n\t\t\t}\n\t\t\tcause = cause.getCause();\n\t\t}\n\t\treturn out.toString();\n\t}\n\t\n\t@Override public synchronized void init(ProcessingEnvironment processingEnv) {\n\t\tsuper.init(processingEnv);\n\t\tpersistence = new SpiProcessorPersistence(\"SpiProcessor\", processingEnv.getFiler(), processingEnv.getMessager());\n\t\tdata = new SpiProcessorCollector(processingEnv);\n\t\tfor (String serviceName : persistence.tryFind()) data.getService(serviceName);\n\t\tdata.stripProvidersWithoutSourceFile();\n\t}\n\t\n\t@Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {\n\t\tremoveStaleData(roundEnv);\n\t\thandleAnnotations(roundEnv);\n\t\tif (roundEnv.processingOver()) writeData();\n\t\t\n\t\treturn false;\n\t}\n\t\n\tprivate void writeData() {\n\t\tfor (SpiProcessorService service : data.services()) {\n\t\t\ttry {\n\t\t\t\tpersistence.write(service.getName(), service.toProvidersListFormat());\n\t\t\t} \n\t\t\tcatch (IOException e) {\n\t\t\t\tprocessingEnv.getMessager().printMessage(Kind.ERROR, e.getMessage());\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate void removeStaleData(RoundEnvironment roundEnv) {\n\t\tfor (Element e : roundEnv.getRootElements()) {\n\t\t\tif (e instanceof TypeElement) {\n\t\t\t\tTypeElement currentClass = (TypeElement) e;\n\t\t\t\tdata.removeProvider(createProperQualifiedName(currentClass));\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate void handleAnnotations(RoundEnvironment roundEnv) {\n\t\tSet<? extends Element> elements = roundEnv.getElementsAnnotatedWith(Provides.class);\n\t\tfor (Element e : elements) handleProvidingElement(e);\n\t}\n\t\n\tprivate void handleProvidingElement(Element element) {\n\t\tif (element.getKind() != ElementKind.CLASS) {\n\t\t\treport(element, \"is not a class definition\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tTypeElement elem = (TypeElement) element;\n\t\t\n\t\tElement enclosing = elem.getEnclosingElement();\n\t\tif (enclosing != null && enclosing.getKind() == ElementKind.CLASS && !elem.getModifiers().contains(Modifier.STATIC)) {\n\t\t\treport(elem, \"is a non-static inner class\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tboolean hasConstructors = false;\n\t\tboolean hasNoArgsConstructor = false;\n\t\tfor (Element child : elem.getEnclosedElements()) {\n\t\t\tif (child.getKind() != ElementKind.CONSTRUCTOR) continue;\n\t\t\tExecutableElement ee = (ExecutableElement) child;\n\t\t\thasConstructors = true;\n\t\t\tif (ee.getParameters().isEmpty()) {\n\t\t\t\thasNoArgsConstructor = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (hasConstructors && !hasNoArgsConstructor) {\n\t\t\treport(elem, \"has no no-args constructor\");\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tList<TypeMirror> spiTypes = new ArrayList<TypeMirror>();\n\t\t\n\t\tfor (AnnotationMirror annMirror : element.getAnnotationMirrors()) {\n\t\t\tif (!getQualifiedTypeName(annMirror).contentEquals(Provides.class.getName())) continue;\n\t\t\tfor (Entry<? extends ExecutableElement, ? extends AnnotationValue> entry : annMirror.getElementValues().entrySet()) {\n\t\t\t\tif (!entry.getKey().getSimpleName().contentEquals(\"value\")) continue;\n\t\t\t\tObject list = entry.getValue().getValue();\n\t\t\t\tif (list instanceof TypeMirror) spiTypes.add((TypeMirror) list);\n\t\t\t\telse if (list instanceof List<?>) {\n\t\t\t\t\tfor (Object tm : (List<?>) list) {\n\t\t\t\t\t\tif (tm instanceof AnnotationValue) tm = ((AnnotationValue) tm).getValue();\n\t\t\t\t\t\tif (tm instanceof TypeMirror) {\n\t\t\t\t\t\t\tTypeMirror mirror = (TypeMirror) tm;\n\t\t\t\t\t\t\tmirror = processingEnv.getTypeUtils().erasure(mirror);\n\t\t\t\t\t\t\tspiTypes.add(mirror);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tTypeMirror superclass = elem.getSuperclass();\n\t\tif (spiTypes.isEmpty()) {\n\t\t\tList<TypeMirror> qualifying = new ArrayList<TypeMirror>();\n\t\t\tqualifying.addAll(elem.getInterfaces());\n\t\t\tif (superclass != null && !toElement(superclass).getQualifiedName().contentEquals(\"java.lang.Object\")) qualifying.add(superclass);\n\t\t\t\n\t\t\tif (qualifying.isEmpty()) {\n\t\t\t\treport(elem, \"is marked @Provides but implements/extends nothing\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (qualifying.size() > 1) {\n\t\t\t\treport(elem, \"is marked @Provides but implements/extends multiple types; explicitly specify which interface(s) this provides for\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tspiTypes.add(qualifying.get(0));\n\t\t} else {\n\t\t\tDeque<TypeMirror> parentage = new ArrayDeque<TypeMirror>();\n\t\t\tparentage.addAll(elem.getInterfaces());\n\t\t\tparentage.add(superclass);\n\t\t\tList<TypeMirror> needed = new ArrayList<TypeMirror>();\n\t\t\tneeded.addAll(spiTypes);\n\t\t\twhile (!parentage.isEmpty() && !spiTypes.isEmpty()) {\n\t\t\t\tTypeMirror parent = parentage.pollFirst();\n\t\t\t\tif (parent == null) continue;\n\t\t\t\tneeded.remove(parent);\n\t\t\t\tparentage.addAll(processingEnv.getTypeUtils().directSupertypes(parent));\n\t\t\t}\n\t\t\tif (!needed.isEmpty()) {\n\t\t\t\treport(elem, \"is marked as providing \" + needed + \" but does not implement it\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t\n\t\tfor (TypeMirror spiType : spiTypes) {\n\t\t\tString spiTypeName = createProperQualifiedName(toElement(spiType));\n\t\t\tString createProperQualifiedName = createProperQualifiedName(elem);\n\t\t\tdata.getService(spiTypeName).addProvider(createProperQualifiedName);\n\t\t}\n\t}\n\t\n\tprivate Name getQualifiedTypeName(AnnotationMirror mirror) {\n\t\tElement elem = mirror.getAnnotationType().asElement();\n\t\tif (!(elem instanceof TypeElement)) return null;\n\t\treturn ((TypeElement) elem).getQualifiedName();\n\t}\n\t\n\tprivate TypeElement toElement(TypeMirror typeMirror) {\n\t\tif (typeMirror instanceof DeclaredType) {\n\t\t\tElement asElement = ((DeclaredType) typeMirror).asElement();\n\t\t\tif (asElement instanceof TypeElement) return (TypeElement) asElement;\n\t\t}\n\t\treturn null;\n\t}\n\t\n\tprivate void report(Element elem, String message) {\n\t\t/* In eclipse, messages just seem to get ignored, so we throw instead. */\n\t\tif (Boolean.TRUE) throw new RuntimeException(elem.getSimpleName() + \" \" + message);\n\t\tprocessingEnv.getMessager().printMessage(Kind.ERROR, elem.getSimpleName() + \" \" + message, elem);\n\t}\n\t\n\tprivate String createProperQualifiedName(TypeElement provider) {\n\t\treturn processingEnv.getElementUtils().getBinaryName(provider).toString();\n\t}\n}\n"
  },
  {
    "path": "src/spiProcessor/lombok/spi/SpiProcessorCollector.java",
    "content": "/*\n * Copyright (C) 2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.spi;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport javax.annotation.processing.Filer;\nimport javax.annotation.processing.Messager;\nimport javax.annotation.processing.ProcessingEnvironment;\nimport javax.lang.model.util.Elements;\nimport javax.tools.Diagnostic.Kind;\nimport javax.tools.FileObject;\nimport javax.tools.StandardLocation;\n\nclass SpiProcessorCollector {\n\tprivate final Map<String, SpiProcessorService> services = new HashMap<String, SpiProcessorService>();\n\tprivate final List<String> removed = new ArrayList<String>();\n\t\n\tprivate final Elements elements;\n\tprivate final Messager logger;\n\tprivate final Filer filer;\n\t\n\tSpiProcessorCollector(ProcessingEnvironment processingEnv) {\n\t\tthis.elements = processingEnv.getElementUtils();\n\t\tthis.logger = processingEnv.getMessager();\n\t\tthis.filer = processingEnv.getFiler();\n\t}\n\t\n\tSpiProcessorCollector(Elements elements, Messager logger, Filer filer) {\n\t\tif (elements == null) throw new NullPointerException(\"elements\");\n\t\tif (logger == null) throw new NullPointerException(\"logger\");\n\t\tif (filer == null) throw new NullPointerException(\"filer\");\n\t\tthis.elements = elements;\n\t\tthis.logger = logger;\n\t\tthis.filer = filer;\n\t}\n\t\n\tSpiProcessorService getService(String serviceName) {\n\t\tif (serviceName == null) throw new NullPointerException(\"serviceName\");\n\t\tif (!services.containsKey(serviceName)) {\n\t\t\tSpiProcessorService newService = new SpiProcessorService(serviceName);\n\t\t\tCharSequence initialData = readInitialData(serviceName);\n\t\t\tif (initialData != null) {\n\t\t\t\tnewService.addAllFromProvidersNameList(initialData.toString());\n\t\t\t\tfor (String provider : removed) newService.removeProvider(provider);\n\t\t\t}\n\t\t\tservices.put(serviceName, newService);\n\t\t}\n\t\treturn services.get(serviceName);\n\t}\n\t\n\tCollection<SpiProcessorService> services() {\n\t\treturn Collections.unmodifiableMap(services).values();\n\t}\n\t\n\tvoid removeProvider(String provider) {\n\t\tif (provider == null) throw new NullPointerException(\"provider\");\n\t\tremoved.add(provider);\n\t\tfor (SpiProcessorService service : services.values()) service.removeProvider(provider);\n\t}\n\t\n\t@Override public String toString() {\n\t\treturn services.values().toString();\n\t}\n\t\n\tprivate CharSequence readInitialData(String serviceName) {\n\t\tString pathName = SpiProcessor.getRootPathOfServiceFiles() + serviceName;\n\t\tFileObject resource;\n\t\t\n\t\ttry {\n\t\t\tresource = filer.getResource(StandardLocation.CLASS_OUTPUT, \"\", pathName);\n\t\t} catch (Exception e) {\n\t\t\tlogger.printMessage(Kind.ERROR, SpiProcessor.toErrorMsg(e, pathName));\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\treturn SpiProcessorPersistence.readFilerResource(resource, logger, pathName);\n\t}\n\t\n\tvoid stripProvidersWithoutSourceFile() {\n\t\tfor (SpiProcessorService s : services.values()) s.stripProvidersWithoutSourceFile(elements);\n\t}\n}\n"
  },
  {
    "path": "src/spiProcessor/lombok/spi/SpiProcessorPersistence.java",
    "content": "/*\n * Copyright (C) 2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.spi;\n\nimport java.io.BufferedReader;\nimport java.io.File;\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.io.Reader;\nimport java.io.Writer;\nimport java.net.URI;\nimport java.text.SimpleDateFormat;\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.Date;\nimport java.util.List;\nimport java.util.Locale;\n\nimport javax.annotation.processing.Filer;\nimport javax.annotation.processing.Messager;\nimport javax.tools.Diagnostic.Kind;\nimport javax.tools.FileObject;\nimport javax.tools.StandardLocation;\n\nclass SpiProcessorPersistence {\n\tprivate final String name;\n\tprivate final String path;\n\tfinal Filer filer;\n\tprivate final Messager logger;\n\t\n\tSpiProcessorPersistence(String name, Filer filer, Messager logger) {\n\t\tthis.name = name;\n\t\tthis.logger = logger;\n\t\tthis.path = SpiProcessor.getRootPathOfServiceFiles();\n\t\tthis.filer = filer;\n\t}\n\t\n\tstatic CharSequence readFilerResource(FileObject resource, Messager logger, String pathName) {\n\t\ttry {\n\t\t\t// Eclipse can't handle getCharContent, so we must use a reader...\n\t\t\treturn tryWithReader(resource);\n\t\t} catch (FileNotFoundException e) {\n\t\t\treturn null;\n\t\t} catch (IOException e) {\n\t\t\tif (\n\t\t\t\te.getClass().getName().equals(\"org.eclipse.core.internal.resources.ResourceException\") &&\n\t\t\t\te.getMessage() != null &&\n\t\t\t\te.getMessage().endsWith(\"does not exist.\")) {\n\t\t\t\t\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t\n\t\t\tlogger.printMessage(Kind.ERROR, SpiProcessor.toErrorMsg(e, pathName));\n\t\t\treturn null;\n\t\t} catch (Exception other) {\n\t\t\t// otherwise, probably javac: Some versions don't support the `openReader` method.\n\t\t\ttry {\n\t\t\t\treturn resource.getCharContent(true);\n\t\t\t} catch (FileNotFoundException e) {\n\t\t\t\treturn null;\n\t\t\t} catch (IOException e) {\n\t\t\t\tlogger.printMessage(Kind.ERROR, SpiProcessor.toErrorMsg(e, pathName));\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate static CharSequence tryWithReader(FileObject resource) throws IOException {\n\t\tStringBuilder sb = new StringBuilder();\n\t\tReader raw = resource.openReader(true);\n\t\ttry {\n\t\t\tBufferedReader in = new BufferedReader(raw);\n\t\t\tfor (String line = in.readLine(); line != null; line = in.readLine()) sb.append(line).append('\\n');\n\t\t\treturn sb;\n\t\t} finally {\n\t\t\tif (raw != null) raw.close();\n\t\t}\n\t}\n\t\n\tCollection<String> tryFind() {\n\t\tFile dir = determineOutputLocation();\n\t\tif (dir == null || !dir.isDirectory()) return Collections.emptyList();\n\t\tList<String> out = new ArrayList<String>();\n\t\tfor (File p : dir.listFiles()) {\n\t\t\tif (!p.isFile()) continue;\n\t\t\tout.add(p.getName());\n\t\t}\n\t\treturn out;\n\t}\n\t\n\tprivate File determineOutputLocation() {\n\t\tFileObject resource;\n\t\ttry {\n\t\t\tresource = filer.createResource(StandardLocation.CLASS_OUTPUT, \"META-INF\", \"locator.tmp\");\n\t\t} catch (FileNotFoundException e) {\n\t\t\te.printStackTrace();\n\t\t\t// Could happen\n\t\t\treturn null;\n\t\t} catch (IOException e) {\n\t\t\te.printStackTrace();\n\t\t\tlogger.printMessage(Kind.NOTE, \"IOException while determining output location: \" + e.getMessage());\n\t\t\treturn null;\n\t\t} catch (IllegalArgumentException e) {\n\t\t\te.printStackTrace();\n\t\t\t// Happens when the path is invalid. For instance absolute or relative to a path \n\t\t\t// not part of the class output folder.\n\t\t\t//\n\t\t\t// Due to a bug in javac for Linux, this also occurs when no output path is specified \n\t\t\t// for javac using the -d parameter.\n\t\t\t// See http://forums.sun.com/thread.jspa?threadID=5240999&tstart=45\n\t\t\t// and http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6647996\n\t\t\t\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\tURI uri = resource.toUri();\n\t\treturn new File(new File(uri).getParentFile(), \"services\");\n\t}\n\t\n\tvoid write(String serviceName, String value) throws IOException {\n\t\tFileObject output = filer.createResource(StandardLocation.CLASS_OUTPUT, \"\", path + serviceName);\n\t\tWriter writer = output.openWriter();\n\t\twriter.write(\"# Generated by \" + name + \"\\n\");\n\t\twriter.write(\"# \" + new SimpleDateFormat(\"EEE, d MMM yyyy HH:mm:ss Z\", Locale.US).format(new Date()) + \"\\n\");\n\t\twriter.write(value);\n\t\twriter.close();\n\t}\n}\n"
  },
  {
    "path": "src/spiProcessor/lombok/spi/SpiProcessorService.java",
    "content": "/*\n * Copyright (C) 2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.spi;\n\nimport java.util.Iterator;\nimport java.util.Set;\nimport java.util.TreeSet;\nimport java.util.stream.Collectors;\n\nimport javax.lang.model.util.Elements;\n\nfinal class SpiProcessorService {\n\tprivate final String name;\n\tprivate final Set<String> providers = new TreeSet<String>();\n\t\n\tSpiProcessorService(String name) {\n\t\tif (name == null) throw new NullPointerException(\"name\");\n\t\tthis.name = name;\n\t}\n\t\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\t\n\tvoid addProvider(String className) {\n\t\tif (className == null) throw new NullPointerException(\"className\");\n\t\tproviders.add(className);\n\t}\n\t\n\tboolean removeProvider(String provider) {\n\t\treturn providers.remove(provider);\n\t}\n\t\n\tString toProvidersListFormat() {\n\t\treturn providers.stream().collect(Collectors.joining(\"\\n\"));\n\t}\n\t\n\tvoid addAllFromProvidersNameList(String in) {\n\t\tfor (String line : in.split(\"\\\\n\")) {\n\t\t\tString[] content = line.split(\"#\", 2);\n\t\t\tif (content.length == 0) continue;\n\t\t\tString trimmed = content[0].trim();\n\t\t\tString[] elems = trimmed.split(\"\\\\s+\", 2);\n\t\t\tif (elems.length == 0 || elems[0].isEmpty()) continue;\n\t\t\tString cn = elems[0];\n\t\t\taddProvider(cn);\n\t\t}\n\t}\n\t\n\tvoid stripProvidersWithoutSourceFile(Elements elements) {\n\t\tIterator<String> it = providers.iterator();\n\t\twhile (it.hasNext()) {\n\t\t\tif (!sourceExists(elements, it.next())) it.remove();\n\t\t}\n\t}\n\t\n\tprivate boolean sourceExists(Elements elements, String typeName) {\n\t\treturn elements.getTypeElement(typeName) != null;\n\t}\n\t\n\t@Override public String toString() {\n\t\treturn name + \" = \" + providers;\n\t}\n}\n"
  },
  {
    "path": "src/stubs/ABOUT",
    "content": "These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these.\n"
  },
  {
    "path": "src/stubs/com/sun/tools/javac/code/Symbol.java",
    "content": "/*\n * These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these.\n */\npackage com.sun.tools.javac.code;\n\nimport java.lang.annotation.Annotation;\nimport java.util.Set;\n\nimport javax.lang.model.element.AnnotationValue;\nimport javax.lang.model.element.Element;\nimport javax.lang.model.element.ElementKind;\nimport javax.lang.model.element.ElementVisitor;\nimport javax.lang.model.element.ExecutableElement;\nimport javax.lang.model.element.Modifier;\nimport javax.lang.model.element.NestingKind;\nimport javax.lang.model.element.TypeElement;\nimport javax.lang.model.element.TypeParameterElement;\nimport javax.lang.model.element.VariableElement;\nimport javax.lang.model.type.TypeMirror;\n\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.Name;\n\npublic abstract class Symbol implements Element {\n\tpublic Type type;\n\tpublic Name name;\n\tpublic Symbol owner;\n\tpublic Type erasure_field;\n\n\tpublic long flags() { return 0; }\n\tpublic boolean isStatic() { return false; }\n\tpublic boolean isConstructor() { return false; }\n\tpublic boolean isLocal() { return false; }\n\tpublic Name flatName() { return null; }\n\tpublic Name getQualifiedName() { return null; }\n\tpublic <A extends Annotation> A[] getAnnotationsByType(Class<A> annoType) { return null; }\n\t@Override public java.util.List<Attribute.Compound> getAnnotationMirrors() { return null; }\n\t@Override public TypeMirror asType() { return null; }\n\tpublic <A extends java.lang.annotation.Annotation> A getAnnotation(Class<A> annoType) { return null; }\n\t@Override public Name getSimpleName() { return null; }\n\t@Override public java.util.List<Symbol> getEnclosedElements() { return null; }\n\t@Override public Element getEnclosingElement() { return null; }\n\tpublic void appendAttributes(List<Attribute.Compound> l) {\n\t}\n\n\tpublic static abstract class TypeSymbol extends Symbol {}\n\t\n\tpublic static class MethodSymbol extends Symbol implements ExecutableElement {\n\t\tpublic List<Symbol.VarSymbol> params = null;\n\t\tpublic MethodSymbol(long flags, Name name, Type type, Symbol owner) {}\n\t\t@Override public ElementKind getKind() { return null; }\n\t\t@Override public Set<Modifier> getModifiers() { return null; }\n\t\t@Override public <R, P> R accept(ElementVisitor<R, P> v, P p) { return null; }\n\t\t@Override public java.util.List<? extends TypeParameterElement> getTypeParameters() { return null; }\n\t\t@Override public TypeMirror getReturnType() { return null; }\n\t\t@Override public java.util.List<? extends VariableElement> getParameters() { return null; }\n\t\t@Override public boolean isVarArgs() { return false; }\n\t\t@Override public java.util.List<? extends TypeMirror> getThrownTypes() { return null; }\n\t\t@Override public AnnotationValue getDefaultValue() { return null; }\n\t\tpublic TypeMirror getReceiverType() { return null; }\n\t\tpublic boolean isDefault() { return false; }\n\t\tpublic com.sun.tools.javac.util.List<VarSymbol> params() { return null; }\n\t}\n\t\n\tpublic static class VarSymbol extends Symbol implements VariableElement {\n\t\tpublic Type type;\n\t\tpublic int adr;\n\t\tpublic VarSymbol(long flags, Name name, Type type, Symbol owner) {\n\t\t}\n\t\t@Override public ElementKind getKind() { return null; }\n\t\t@Override public Set<Modifier> getModifiers() { return null; }\n\t\t@Override public <R, P> R accept(ElementVisitor<R, P> v, P p) { return null; }\n\t\t@Override public Object getConstantValue() { return null; }\n\t}\n\t\n\tpublic static class ClassSymbol extends TypeSymbol implements TypeElement {\n\t\t@Override public Name getQualifiedName() { return null; }\n\t\t@Override public java.util.List<? extends TypeMirror> getInterfaces() { return null; }\n\t\t@Override public TypeMirror getSuperclass() { return null; }\n\t\t@Override public ElementKind getKind() { return null; }\n\t\t@Override public Set<Modifier> getModifiers() { return null; }\n\t\t@Override public NestingKind getNestingKind() { return null; }\n\t\t@Override public <R, P> R accept(ElementVisitor<R, P> v, P p) { return null; }\n\t\t@Override public java.util.List<? extends TypeParameterElement> getTypeParameters() { return null; }\n\t}\n\t\n\t// JDK9\n\tpublic static class ModuleSymbol extends TypeSymbol {\n\t\t@Override public ElementKind getKind() { return null; }\n\t\t@Override public Set<Modifier> getModifiers() { return null; }\n\t\t@Override public <R, P> R accept(ElementVisitor<R, P> v, P p) { return null; }\n\t}\n}\n"
  },
  {
    "path": "src/stubs/com/sun/tools/javac/code/Symtab.java",
    "content": "/*\n * These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these.\n */\npackage com.sun.tools.javac.code;\n\nimport com.sun.tools.javac.code.Symbol.ClassSymbol;\nimport com.sun.tools.javac.code.Symbol.ModuleSymbol;\nimport com.sun.tools.javac.code.Symbol.TypeSymbol;\nimport com.sun.tools.javac.util.Context;\n\npublic class Symtab {\n\t// Shared by JDK6-9\n\tpublic ClassSymbol methodClass;\n\tpublic Type iterableType;\n\tpublic Type objectType;\n\tpublic static Symtab instance(Context context) {return null;}\n\tpublic Type unknownType;\n\tpublic TypeSymbol noSymbol;\n\tpublic Type stringType;\n\tpublic Type throwableType;\n\n\t// JDK 9\n\tpublic ModuleSymbol unnamedModule;\n}\n"
  },
  {
    "path": "src/stubs/com/sun/tools/javac/comp/ArgumentAttr.java",
    "content": "/*\n * These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these.\n */\npackage com.sun.tools.javac.comp;\n\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.util.Context;\n\n// JDK9+\npublic class ArgumentAttr extends JCTree.Visitor {\n\tpublic static ArgumentAttr instance(Context context) { return null; }\n}"
  },
  {
    "path": "src/stubs/com/sun/tools/javac/file/BaseFileManager.java",
    "content": "/*\n * These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these.\n */\npackage com.sun.tools.javac.file;\n\nimport javax.tools.JavaFileManager;\n\nimport com.sun.tools.javac.main.Option;\nimport com.sun.tools.javac.util.Context;\n\nimport java.nio.charset.Charset;\nimport java.util.Map;\n\npublic abstract class BaseFileManager implements JavaFileManager {\n\tprotected BaseFileManager(Charset charset) {}\n\tpublic void setContext(Context context) {}\n\tpublic boolean handleOptions(Map<Option, String> deferredFileManagerOptions) { return false; }\n}\n"
  },
  {
    "path": "src/stubs/com/sun/tools/javac/file/BaseFileObject.java",
    "content": "/*\n * These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these.\n */\npackage com.sun.tools.javac.file;\n\nimport javax.tools.JavaFileObject;\n\npublic abstract class BaseFileObject implements JavaFileObject {\n\tprotected BaseFileObject(JavacFileManager fileManager) {}\n}\n"
  },
  {
    "path": "src/stubs/com/sun/tools/javac/file/JavacFileManager.java",
    "content": "/*\n * These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these.\n */\npackage com.sun.tools.javac.file;\n\npublic class JavacFileManager {}\n"
  },
  {
    "path": "src/stubs/com/sun/tools/javac/file/PathFileObject.java",
    "content": "/*\n * These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these.\n */\npackage com.sun.tools.javac.file;\n\nimport java.nio.file.Path;\n\nimport javax.tools.JavaFileObject;\n\npublic abstract class PathFileObject implements JavaFileObject {\n\tprotected PathFileObject(BaseFileManager fileManager, Path path) {}\n}\n"
  },
  {
    "path": "src/stubs/com/sun/tools/javac/main/Arguments.java",
    "content": "package com.sun.tools.javac.main;\n\nimport java.util.Map;\n\nimport com.sun.tools.javac.util.Context;\n\npublic class Arguments {\n\tpublic static final Context.Key<Arguments> argsKey = new Context.Key<Arguments>();\n\tpublic static Arguments instance(Context context) { return null; }\n\tpublic void init(String ownName, String... argv) {}\n\tpublic Map<Option, String> getDeferredFileManagerOptions() { return null; }\n\tpublic boolean validate() { return false; }\n\t\n\t// JDK15\n\tpublic void init(String ownName, Iterable<String> args) {}\n}\n"
  },
  {
    "path": "src/stubs/com/sun/tools/javac/main/JavaCompiler.java",
    "content": "/*\n * These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these.\n */\npackage com.sun.tools.javac.main;\n\nimport java.io.IOException;\nimport java.util.Collection;\nimport javax.annotation.processing.Processor;\nimport javax.tools.JavaFileObject;\n\nimport com.sun.tools.javac.tree.JCTree.JCCompilationUnit;\nimport com.sun.tools.javac.util.Context;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.comp.Todo;\n\npublic class JavaCompiler {\n\t// Shared by JDK6-9\n\tpublic boolean keepComments;\n\tpublic boolean genEndPos;\n\tpublic Todo todo;\n\t\n\tpublic JavaCompiler(Context context) {}\n\tpublic int errorCount() { return 0; }\n\tpublic static String version() { return \"<stub>\"; }\n\tpublic JCCompilationUnit parse(String fileName) throws IOException { return null; }\n\tpublic List<JCCompilationUnit> enterTrees(List<JCCompilationUnit> roots) {return null;}\n\t\n\t//JDK up to 8\n\tpublic void initProcessAnnotations(Iterable<? extends Processor> processors) throws IOException {}\n\tpublic JavaCompiler processAnnotations(List<JCCompilationUnit> roots, List<String> classnames) {return this;}\n\t\n\t// JDK 9\n\tpublic void initProcessAnnotations(Iterable<? extends Processor> processors, Collection<? extends JavaFileObject> initialFiles, Collection<String> initialClassNames) {}\n\tpublic void processAnnotations(List<JCCompilationUnit> roots, Collection<String> classnames) {}\n\tpublic void close() {}\n\tpublic List<JCCompilationUnit> initModules(List<JCCompilationUnit> roots) { return null; }\n}\n"
  },
  {
    "path": "src/stubs/com/sun/tools/javac/main/Option.java",
    "content": "/*\n * These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these.\n */\npackage com.sun.tools.javac.main;\n\n\npublic enum Option {\n\t;\n\tpublic String text;\n\tpublic String primaryName;\n}\n"
  },
  {
    "path": "src/stubs/com/sun/tools/javac/parser/DocCommentScanner.java",
    "content": "/*\n * These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these.\n */\npackage com.sun.tools.javac.parser;\n\nimport java.nio.CharBuffer;\n\npublic class DocCommentScanner extends Scanner {\n\tprotected DocCommentScanner(Factory fac, CharBuffer buffer) {\n\t\tsuper(fac, buffer);\n\t}\n\t\n\tprotected DocCommentScanner(Factory fac, char[] input, int inputLength) {\n\t\tsuper(fac, input, inputLength);\n\t}\n\t\n\tprotected DocCommentScanner(ScannerFactory fac, CharBuffer buffer) {\n\t\tsuper(fac, buffer);\n\t}\n\t\n\tprotected DocCommentScanner(ScannerFactory fac, char[] input, int inputLength) {\n\t\tsuper(fac, input, inputLength);\n\t}\n\t\n}\n"
  },
  {
    "path": "src/stubs/com/sun/tools/javac/parser/EndPosParser.java",
    "content": "/*\n * These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these.\n */\npackage com.sun.tools.javac.parser;\n\nimport com.sun.tools.javac.tree.JCTree.JCCompilationUnit;\n\npublic class EndPosParser {\n\tpublic EndPosParser(Parser.Factory fac, Lexer S, boolean keepDocComments) {\n\t}\n\t\n\tpublic EndPosParser(ParserFactory fac, Lexer S, boolean keepDocComments, boolean keepLineMap) {\n\t}\n\t\n\tpublic JCCompilationUnit compilationUnit() {\n\t\treturn null;\n\t}\n\t\n\tpublic JCCompilationUnit parseCompilationUnit() {\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "src/stubs/com/sun/tools/javac/parser/JavaTokenizer.java",
    "content": "package com.sun.tools.javac.parser;\n\nimport java.nio.CharBuffer;\n\nimport com.sun.tools.javac.parser.Tokens.Comment;\nimport com.sun.tools.javac.parser.Tokens.Comment.CommentStyle;\n\npublic class JavaTokenizer {\n\t// used before java 16\n\tprotected UnicodeReader reader;\n\t\n\t// used before java 16\n\tprotected JavaTokenizer(ScannerFactory fac, UnicodeReader reader) {\n\t}\n\t\n\tpublic com.sun.tools.javac.parser.Tokens.Token readToken() {\n\t\treturn null;\n\t}\n\n\tprotected Comment processComment(int pos, int endPos, CommentStyle style) {\n\t\treturn null;\n\t}\n\t\n\t// used in java 16\n\tprotected JavaTokenizer(ScannerFactory fac, char[] buf, int inputLength) {\n\t}\n\t\n\t// used in java 16\n\tprotected JavaTokenizer(ScannerFactory fac, CharBuffer buf) {\n\t}\n\n\t// introduced in java 16\n\tprotected int position() {\n\t\treturn -1;\n\t}\n}\n"
  },
  {
    "path": "src/stubs/com/sun/tools/javac/parser/JavacParser.java",
    "content": "/*\n * These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these.\n */\npackage com.sun.tools.javac.parser;\n\nimport com.sun.tools.javac.tree.JCTree;\n\npublic class JavacParser {\n\tprotected JavacParser(ParserFactory fac, Lexer S, boolean keepDocComments, boolean keepLineMap, boolean keepEndPositions) {\n\t}\n\t\n\tprotected JavacParser(ParserFactory fac, Lexer S, boolean keepDocComments, boolean keepLineMap, boolean keepEndPositions, boolean parseModuleInfo) {\n\t}\n\t\n\tpublic JCTree.JCCompilationUnit parseCompilationUnit() {\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "src/stubs/com/sun/tools/javac/parser/Lexer.java",
    "content": "/*\n * These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these.\n */\npackage com.sun.tools.javac.parser;\n\npublic interface Lexer {\n\t\n}\n"
  },
  {
    "path": "src/stubs/com/sun/tools/javac/parser/Parser.java",
    "content": "/*\n * These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these.\n */\npackage com.sun.tools.javac.parser;\n\nimport com.sun.tools.javac.util.Context;\n\npublic class Parser {\n\tpublic static class Factory {\n\t\tpublic static Context.Key<Parser.Factory> parserFactoryKey;\n\t\t\n\t\tpublic Factory(Context context) {\n\t\t\t\n\t\t}\n\t\t\n\t\tpublic Parser newParser(Lexer S, boolean keepDocComments, boolean genEndPos) {\n\t\t\treturn null;\n\t\t}\n\t\t\n\t}\n}\n"
  },
  {
    "path": "src/stubs/com/sun/tools/javac/parser/ParserFactory.java",
    "content": "/*\n * These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these.\n */\npackage com.sun.tools.javac.parser;\n\nimport com.sun.tools.javac.util.Context;\n\npublic class ParserFactory {\n\tpublic static Context.Key<ParserFactory> parserFactoryKey;\n\t\n\tpublic ParserFactory(Context context) {\n\t\t\n\t}\n}"
  },
  {
    "path": "src/stubs/com/sun/tools/javac/parser/Scanner.java",
    "content": "/*\n * These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these.\n */\npackage com.sun.tools.javac.parser;\n\nimport java.nio.CharBuffer;\n\nimport com.sun.tools.javac.util.Context;\n\npublic class Scanner implements Lexer {\n\tprotected Scanner(Factory fac, CharBuffer buffer) {\n\t}\n\t\n\tprotected Scanner(Factory fac, char[] input, int inputLength) {\n\t}\n\t\n\tprotected Scanner(ScannerFactory fac, CharBuffer buffer) {\n\t}\n\t\n\tprotected Scanner(ScannerFactory fac, char[] input, int inputLength) {\n\t}\n\t\n\tprotected Scanner(ScannerFactory fac, JavaTokenizer tokenizer) {\n\t}\n\t\n\tpublic static class Factory {\n\t\tpublic static final Context.Key<Scanner.Factory> scannerFactoryKey = null;\n\t\t\n\t\tprotected Factory(Context context) {\n\t\t}\n\t\t\n\t\tpublic Scanner newScanner(CharSequence input) {\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\tpublic Scanner newScanner(char[] input, int inputLength) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic enum CommentStyle {\n\t\tLINE,\n\t\tBLOCK,\n\t\tJAVADOC,\n\t}\n\t\n\tprotected void processComment(CommentStyle style) {\n\t}\n\t\n\tpublic int prevEndPos() {\n\t\treturn -1;\n\t}\n\t\n\tpublic int endPos() {\n\t\treturn -1;\n\t}\n\t\n\tpublic int pos() {\n\t\treturn -1;\n\t}\n\t\n\tpublic char[] getRawCharacters(int beginIndex, int endIndex) {\n\t\treturn null;\n\t}\n\t\n\tpublic void nextToken() {\n\t}\n\t\n\tpublic char[] getRawCharacters() {\n\t\treturn new char[0];\n\t}\n}\n"
  },
  {
    "path": "src/stubs/com/sun/tools/javac/parser/ScannerFactory.java",
    "content": "/*\n * These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these.\n */\npackage com.sun.tools.javac.parser;\n\nimport com.sun.tools.javac.util.Context;\n\npublic class ScannerFactory {\n\tpublic static final Context.Key<ScannerFactory> scannerFactoryKey = null;\n\t\n\tprotected ScannerFactory(Context c) {\n\t}\n\t\n\tpublic static ScannerFactory instance(Context c) {\n\t\treturn null;\n\t}\n\t\n\tpublic Scanner newScanner(CharSequence input, boolean keepDocComments) {\n\t\treturn null;\n\t}\n\t\n\tpublic Scanner newScanner(char[] input, int inputLength, boolean keepDocComments) {\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "src/stubs/com/sun/tools/javac/parser/Tokens.java",
    "content": "package com.sun.tools.javac.parser;\n\nimport com.sun.tools.javac.util.JCDiagnostic;\n\npublic class Tokens {\n\tpublic static class Token {\n\t\tpublic int pos;\n\t}\n\t\n\tpublic interface Comment {\n\t\tenum CommentStyle {\n\t\t\tLINE, BLOCK, JAVADOC,\n\t\t}\n\t\t\n\t\tString getText();\n\t\t\n\t\tComment stripIndent();\n\t\t\n\t\tJCDiagnostic.DiagnosticPosition getPos();\n\t\t\n\t\tint getSourcePos(int index);\n\t\t\n\t\tCommentStyle getStyle();\n\t\t\n\t\tboolean isDeprecated();\n\t}\n}\n"
  },
  {
    "path": "src/stubs/com/sun/tools/javac/parser/UnicodeReader.java",
    "content": "package com.sun.tools.javac.parser;\n\nimport java.nio.CharBuffer;\n\npublic class UnicodeReader {\n\tprotected int bp;\n\t\n\tprotected UnicodeReader(ScannerFactory sf, char[] input, int inputLength) {\n\t}\n\t\n\tprotected UnicodeReader(ScannerFactory sf, CharBuffer buffer) {\n\t\t\n\t}\n\t\n\tpublic char[] getRawCharacters(int beginIndex, int endIndex) {\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "src/stubs/com/sun/tools/javac/tree/DocCommentTable.java",
    "content": "package com.sun.tools.javac.tree;\n\nimport com.sun.tools.javac.parser.Tokens.Comment;\n\npublic interface DocCommentTable {\n\tboolean hasComment(JCTree tree);\n\tComment getComment(JCTree tree);\n\tString getCommentText(JCTree tree);\n\tvoid putComment(JCTree tree, Comment c);\n}\n"
  },
  {
    "path": "src/stubs/com/sun/tools/javac/tree/EndPosTable.java",
    "content": "package com.sun.tools.javac.tree;\n\npublic interface EndPosTable {\n\tint getEndPos(JCTree tree);\n}\n"
  },
  {
    "path": "src/stubs/com/sun/tools/javac/util/BaseFileObject.java",
    "content": "/*\n * These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these.\n */\npackage com.sun.tools.javac.util;\n\nimport javax.tools.JavaFileObject;\n\npublic abstract class BaseFileObject implements JavaFileObject {}\n"
  },
  {
    "path": "src/stubs/com/sun/tools/javac/util/Options.java",
    "content": "package com.sun.tools.javac.util;\n\nimport java.util.Set;\n\nimport com.sun.tools.javac.main.Option;\nimport com.sun.tools.javac.main.OptionName;\nimport com.sun.tools.javac.main.JavacOption;\n\npublic class Options {\n\tpublic Options(Context context) {}\n\tpublic static final Context.Key<Options> optionsKey = new Context.Key<Options>();\n\tpublic static Options instance(Context context) { return null; }\n\tpublic String get(String key) { return null; }\n\tpublic String get(Option opt) { return null; }\n\tpublic String get(OptionName name) { return null; }\n\tpublic String get(JavacOption.Option opt) { return null; }\n\tpublic void putAll(Options o) {}\n\tpublic void put(String key, String value) {}\n\tpublic Set<String> keySet() { return null; }\n}\n"
  },
  {
    "path": "src/stubs/com/sun/tools/javadoc/DocCommentScanner.java",
    "content": "/*\n * These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these.\n */\npackage com.sun.tools.javadoc;\n\nimport java.nio.CharBuffer;\n\nimport com.sun.tools.javac.parser.Scanner;\nimport com.sun.tools.javac.util.Context;\n\npublic class DocCommentScanner extends Scanner {\n\tprotected DocCommentScanner(com.sun.tools.javadoc.DocCommentScanner.Factory fac, CharBuffer buffer) {\n\t\tsuper(fac, buffer);\n\t}\n\t\n\tprotected DocCommentScanner(com.sun.tools.javadoc.DocCommentScanner.Factory fac, char[] input, int inputLength) {\n\t\tsuper(fac, input, inputLength);\n\t}\n\t\n\tpublic static class Factory extends Scanner.Factory {\n\t\tprotected Factory(Context context) {\n\t\t\tsuper(context);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/stubs/java/lang/annotation/ElementType.java",
    "content": "/*\n * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.\n * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.\n *\n * This code is free software; you can redistribute it and/or modify it\n * under the terms of the GNU General Public License version 2 only, as\n * published by the Free Software Foundation.  Oracle designates this\n * particular file as subject to the \"Classpath\" exception as provided\n * by Oracle in the LICENSE file that accompanied this code.\n *\n * This code is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n * version 2 for more details (a copy is included in the LICENSE file that\n * accompanied this code).\n *\n * You should have received a copy of the GNU General Public License version\n * 2 along with this work; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.\n *\n * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA\n * or visit www.oracle.com if you need additional information or have any\n * questions.\n */\n\npackage java.lang.annotation;\n\n/**\n * The constants of this enumerated type provide a simple classification of the\n * syntactic locations where annotations may appear in a Java program. These\n * constants are used in {@link java.lang.annotation.Target Target}\n * meta-annotations to specify where it is legal to write annotations of a\n * given type.\n *\n * <p>The syntactic locations where annotations may appear are split into\n * <em>declaration contexts</em> , where annotations apply to declarations, and\n * <em>type contexts</em> , where annotations apply to types used in\n * declarations and expressions.\n *\n * <p>The constants {@link #ANNOTATION_TYPE}, {@link #CONSTRUCTOR}, {@link\n * #FIELD}, {@link #LOCAL_VARIABLE}, {@link #METHOD}, {@link #PACKAGE}, {@link\n * #MODULE}, {@link #PARAMETER}, {@link #TYPE}, and {@link #TYPE_PARAMETER}\n * correspond to the declaration contexts in JLS 9.6.4.1.\n *\n * <p>For example, an annotation whose type is meta-annotated with\n * {@code @Target(ElementType.FIELD)} may only be written as a modifier for a\n * field declaration.\n *\n * <p>The constant {@link #TYPE_USE} corresponds to the type contexts in JLS\n * 4.11, as well as to two declaration contexts: type declarations (including\n * annotation type declarations) and type parameter declarations.\n *\n * <p>For example, an annotation whose type is meta-annotated with\n * {@code @Target(ElementType.TYPE_USE)} may be written on the type of a field\n * (or within the type of the field, if it is a nested, parameterized, or array\n * type), and may also appear as a modifier for, say, a class declaration.\n *\n * <p>The {@code TYPE_USE} constant includes type declarations and type\n * parameter declarations as a convenience for designers of type checkers which\n * give semantics to annotation types. For example, if the annotation type\n * {@code NonNull} is meta-annotated with\n * {@code @Target(ElementType.TYPE_USE)}, then {@code @NonNull}\n * {@code class C {...}} could be treated by a type checker as indicating that\n * all variables of class {@code C} are non-null, while still allowing\n * variables of other classes to be non-null or not non-null based on whether\n * {@code @NonNull} appears at the variable's declaration.\n *\n * @author  Joshua Bloch\n * @since 1.5\n * @jls 9.6.4.1 @Target\n * @jls 4.1 The Kinds of Types and Values\n */\npublic enum ElementType {\n    /** Class, interface (including annotation type), or enum declaration */\n    TYPE,\n\n    /** Field declaration (includes enum constants) */\n    FIELD,\n\n    /** Method declaration */\n    METHOD,\n\n    /** Formal parameter declaration */\n    PARAMETER,\n\n    /** Constructor declaration */\n    CONSTRUCTOR,\n\n    /** Local variable declaration */\n    LOCAL_VARIABLE,\n\n    /** Annotation type declaration */\n    ANNOTATION_TYPE,\n\n    /** Package declaration */\n    PACKAGE,\n\n    /**\n     * Type parameter declaration\n     *\n     * @since 1.8\n     */\n    TYPE_PARAMETER,\n\n    /**\n     * Use of a type\n     *\n     * @since 1.8\n     */\n    TYPE_USE,\n\n    /**\n     * Module declaration.\n     *\n     * @since 9\n     */\n    MODULE\n}\n"
  },
  {
    "path": "src/stubs/org/eclipse/jdt/internal/compiler/ast/OperatorIds.java",
    "content": "package org.eclipse.jdt.internal.compiler.ast;\n\n/**\n * This stub prevents constant inlining.\n */\npublic interface OperatorIds {\n\tpublic static final int AND_AND = null != null ? 0 : 0;\n\tpublic static final int OR_OR = null != null ? 1 : 1;\n\tpublic static final int AND = null != null ? 2 : 2;\n\tpublic static final int OR = null != null ? 3 : 3;\n\tpublic static final int LESS = null != null ? 4 : 4;\n\tpublic static final int LESS_EQUAL = null != null ? 5 : 5;\n\tpublic static final int GREATER = null != null ? 6 : 6;\n\tpublic static final int GREATER_EQUAL = null != null ? 7 : 7;\n\tpublic static final int XOR = null != null ? 8 : 8;\n\tpublic static final int DIVIDE = null != null ? 9 : 9;\n\tpublic static final int LEFT_SHIFT = null != null ? 10 : 10;\n\tpublic static final int NOT = null != null ? 11 : 11;\n\tpublic static final int TWIDDLE = null != null ? 12 : 12;\n\tpublic static final int MINUS = null != null ? 13 : 13;\n\tpublic static final int PLUS = null != null ? 14 : 14;\n\tpublic static final int MULTIPLY = null != null ? 15 : 15;\n\tpublic static final int REMAINDER = null != null ? 16 : 16;\n\tpublic static final int RIGHT_SHIFT = null != null ? 17 : 17;\n\tpublic static final int EQUAL_EQUAL = null != null ? 18 : 18;\n\tpublic static final int UNSIGNED_RIGHT_SHIFT = null != null ? 19 : 19;\n\tpublic static final int NumberOfTables = null != null ? 20 : 20;\n\t\n\tpublic static final int QUESTIONCOLON = null != null ? 23 : 23;\n\t\n\tpublic static final int NOT_EQUAL = null != null ? 29 : 29;\n\tpublic static final int EQUAL = null != null ? 30 : 30;\n\tpublic static final int INSTANCEOF = null != null ? 31 : 31;\n\tpublic static final int PLUS_PLUS = null != null ? 32 : 32;\n\tpublic static final int MINUS_MINUS = null != null ? 33 : 33;\n}\n"
  },
  {
    "path": "src/stubs/org/mapstruct/ap/spi/AstModifyingAnnotationProcessor.java",
    "content": "/**\n *  Copyright 2012-2017 Gunnar Morling (http://www.gunnarmorling.de/)\n *  and/or other contributors as indicated by the @authors tag. See the\n *  copyright.txt file in the distribution for a full listing of all\n *  contributors.\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\");\n *  you may not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS,\n *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n */\npackage org.mapstruct.ap.spi;\n\nimport javax.lang.model.type.TypeMirror;\n\n/**\n * A contract to be implemented by other annotation processors which - against the design philosophy of JSR 269 - alter\n * the types under compilation.\n * <p>\n * This contract will be queried by MapStruct when examining types referenced by mappers to be generated, most notably\n * the source and target types of mapping methods. If at least one AST-modifying processor announces further changes to\n * such type, the generation of the affected mapper(s) will be deferred to a future round in the annnotation processing\n * cycle.\n * <p>\n * Implementations are discovered via the service loader, i.e. a JAR providing an AST-modifying processor needs to\n * declare its implementation in a file {@code META-INF/services/org.mapstruct.ap.spi.AstModifyingAnnotationProcessor}.\n *\n * @author Gunnar Morling\n */\n//@org.mapstruct.util.Experimental\npublic interface AstModifyingAnnotationProcessor {\n\n    /**\n     * Whether the specified type has been fully processed by this processor or not (i.e. this processor will amend the\n     * given type's structure after this invocation).\n     *\n     * @param type The type of interest\n     * @return {@code true} if this processor has fully processed the given type, {@code false} otherwise.\n     */\n    boolean isTypeComplete(TypeMirror type);\n}"
  },
  {
    "path": "src/stubsstubs/com/sun/tools/javac/code/Attribute.java",
    "content": "package com.sun.tools.javac.code;\n\nimport java.util.Map;\n\nimport javax.lang.model.element.AnnotationMirror;\nimport javax.lang.model.element.AnnotationValue;\nimport javax.lang.model.element.ExecutableElement;\nimport javax.lang.model.type.DeclaredType;\n\npublic abstract class Attribute {\n\tpublic static class Compound extends Attribute implements AnnotationMirror {\n\t\tpublic DeclaredType getAnnotationType() { return null; }\n\t\tpublic Map<? extends ExecutableElement, ? extends AnnotationValue> getElementValues() { return null; }\n\t}\n}"
  },
  {
    "path": "src/stubsstubs/com/sun/tools/javac/code/Type.java",
    "content": "package com.sun.tools.javac.code;\n\npublic class Type {}"
  },
  {
    "path": "src/stubsstubs/com/sun/tools/javac/comp/Todo.java",
    "content": "package com.sun.tools.javac.comp;\n\npublic class Todo {}"
  },
  {
    "path": "src/stubsstubs/com/sun/tools/javac/main/JavacOption.java",
    "content": "package com.sun.tools.javac.main;\n\npublic class JavacOption {\n\tpublic static class Option {}\n}"
  },
  {
    "path": "src/stubsstubs/com/sun/tools/javac/main/Option.java",
    "content": "package com.sun.tools.javac.main;\n\npublic class Option {}"
  },
  {
    "path": "src/stubsstubs/com/sun/tools/javac/main/OptionName.java",
    "content": "package com.sun.tools.javac.main;\n\npublic class OptionName {}"
  },
  {
    "path": "src/stubsstubs/com/sun/tools/javac/parser/Parser.java",
    "content": "package com.sun.tools.javac.parser;\n\npublic class Parser {\n\tpublic static class Factory {}\n}\n"
  },
  {
    "path": "src/stubsstubs/com/sun/tools/javac/tree/JCTree.java",
    "content": "package com.sun.tools.javac.tree;\n\npublic class JCTree {\n\tpublic static class JCCompilationUnit extends JCTree {}\n\tpublic static abstract class Visitor {}\n}\n"
  },
  {
    "path": "src/stubsstubs/com/sun/tools/javac/util/Context.java",
    "content": "package com.sun.tools.javac.util;\n\npublic class Context {\n\tpublic static class Key<T> {}\n}"
  },
  {
    "path": "src/stubsstubs/com/sun/tools/javac/util/JCDiagnostic.java",
    "content": "package com.sun.tools.javac.util;\n\npublic class JCDiagnostic {\n\tpublic interface DiagnosticPosition {}\n}\n"
  },
  {
    "path": "src/stubsstubs/com/sun/tools/javac/util/List.java",
    "content": "package com.sun.tools.javac.util;\n\npublic class List<T> {}"
  },
  {
    "path": "src/stubsstubs/com/sun/tools/javac/util/Name.java",
    "content": "package com.sun.tools.javac.util;\n\npublic class Name implements javax.lang.model.element.Name {\n\tpublic boolean contentEquals(CharSequence cs) { return false; }\n\tpublic int length() { return 0; }\n\tpublic char charAt(int idx) { return '\\0'; }\n\tpublic CharSequence subSequence(int a, int b) { return null; }\n}"
  },
  {
    "path": "src/stubsstubs/java/nio/file/Path.java",
    "content": "package java.nio.file;\n\npublic class Path {\n}\n"
  },
  {
    "path": "src/support/info.txt",
    "content": "These classes are not part of lombok itself, but used during the build. For example:\n* Code to turn the changelog into HTML ready to ship to projectlombok.org\n* Code to create eclipse debug targets\n\n"
  },
  {
    "path": "src/support/log4j.properties",
    "content": "log4j.rootLogger=INFO, stdout\n\nlog4j.appender.stdout=org.apache.log4j.ConsoleAppender\nlog4j.appender.stdout.Target=System.out\nlog4j.appender.stdout.layout=org.apache.log4j.PatternLayout\nlog4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n\n"
  },
  {
    "path": "src/support/lombok/eclipse/dependencies/DownloadEclipseDependencies.java",
    "content": "/*\n * Copyright (C) 2022-2025 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.dependencies;\n\nimport java.io.BufferedInputStream;\nimport java.io.ByteArrayInputStream;\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.io.FilenameFilter;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.OutputStream;\nimport java.net.HttpURLConnection;\nimport java.net.MalformedURLException;\nimport java.net.URL;\nimport java.nio.charset.StandardCharsets;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Set;\nimport java.util.zip.ZipEntry;\nimport java.util.zip.ZipInputStream;\nimport java.util.zip.ZipOutputStream;\n\n/**\n * Download eclipse bundles.\n */\npublic class DownloadEclipseDependencies {\n\t\n\tpublic static void main(String[] args) throws Exception {\n\t\tString target = args[0];\n\t\tString eclipseVersion = args[1];\n\t\tString updateSiteUrl = args[2];\n\t\tboolean resolveDependencies = Boolean.parseBoolean(args[3]);\n\t\tList<String> bundles = Arrays.asList(Arrays.copyOfRange(args, 4, args.length));\n\t\tboolean isCi = \"true\".equalsIgnoreCase(System.getenv(\"CI\"));\n\t\t\n\t\tUpdateSite updateSite = new UpdateSite();\n\t\tupdateSite.read(updateSiteUrl);\n\t\t\n\t\tfinal Set<String> artifacts;\n\t\tif (resolveDependencies) {\n\t\t\tartifacts = updateSite.resolveWithDependencies(bundles);\n\t\t} else {\n\t\t\tartifacts = updateSite.resolveWithoutDependencies(bundles);\n\t\t}\n\t\t\n\t\tString pluginTarget = target + \"/\" + eclipseVersion + \"/plugins/\";\n\t\tString pluginSource = updateSite.getResolvedUrl() + \"/plugins/\";\n\t\t\n\t\tfor (String artifact : artifacts) {\n\t\t\t// Download artifact\n\t\t\tdownloadFile(artifact, pluginSource, pluginTarget);\n\t\t\t\n\t\t\t// Download artifact source for local development\n\t\t\tif (!isCi) {\n\t\t\t\tint index = artifact.lastIndexOf(\"_\");\n\t\t\t\tString source = artifact.substring(0, index) + \".source\" + artifact.substring(index);\n\t\t\t\ttry {\n\t\t\t\t\tdownloadFile(source, pluginSource, pluginTarget);\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t// It's just the source; sometimes these aren't present (specifically, `org.eclipse.swt` doesn't currently appear to have the sources, at least not using the `_sources` naming scheme). Don't fail, just skip them.\n\t\t\t\t\tSystem.out.println(\"[failed]\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\twriteEclipseLibrary(target, eclipseVersion);\n\t}\n\t\n\tprivate static void downloadFile(String filename, String repositoryUrl, String target) throws IOException {\n\t\tnew File(target).mkdirs();\n\t\tFile targetFile = new File(target, filename);\n\t\tif (targetFile.exists()) {\n\t\t\tSystem.out.println(\"File '\" + filename + \"' already exists\");\n\t\t\treturn;\n\t\t}\n\t\tSystem.out.print(\"Downloading '\" + filename + \"'... \");\n\t\t\n\t\tInputStream in = null;\n\t\tOutputStream out = null;\n\t\ttry {\n\t\t\tin = getStreamForUrl(repositoryUrl + filename);\n\t\t\tout = new FileOutputStream(targetFile);\n\t\t\t\n\t\t\tcopyZipButStripSignatures(in, out);\n\t\t\tSystem.out.println(\"[done]\");\n\t\t} finally {\n\t\t\ttry {\n\t\t\t\tif (in != null) in.close();\n\t\t\t} finally {\n\t\t\t\tif (out != null) out.close();\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate static void copyZipButStripSignatures(InputStream rawIn, OutputStream rawOut) throws IOException {\n\t\tZipInputStream in = null;\n\t\tZipOutputStream out = null;\n\t\t\n\t\tin = new ZipInputStream(rawIn);\n\t\tout = new ZipOutputStream(rawOut);\n\t\t\n\t\tZipEntry zipEntry;\n\t\twhile ((zipEntry = in.getNextEntry()) != null) {\n\t\t\tif (zipEntry.getName().matches(\"META-INF/.*\\\\.(SF|RSA)\")) continue;\n\t\t\tout.putNextEntry(zipEntry);\n\t\t\tcopy(in, out);\n\t\t}\n\t\tout.close(); // zip streams buffer.\n\t}\n\t\n\tprivate static void copy(InputStream from, OutputStream to) throws IOException {\n\t\tbyte[] b = new byte[4096];\n\t\twhile (true) {\n\t\t\tint r = from.read(b);\n\t\t\tif (r == -1) return;\n\t\t\tto.write(b, 0, r);\n\t\t}\n\t}\n\t\n\tprivate static InputStream getStreamForUrl(String url) throws IOException, MalformedURLException {\n\t\tHttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();\n\t\tconnection.setRequestProperty(\"User-Agent\", \"lombok\");\n\t\tconnection.setRequestProperty(\"Accept\", \"*/*\");\n\t\treturn new BufferedInputStream(connection.getInputStream());\n\t}\n\t\n\tprivate static void writeEclipseLibrary(String target, String eclipseVersion) throws IOException {\n\t\tStringBuilder sb = new StringBuilder();\n\t\tsb.append(\"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\"?>\\n\");\n\t\tsb.append(\"<eclipse-userlibraries version=\\\"2\\\">\\n\");\n\t\tsb.append(\"<library name=\\\"\");\n\t\tsb.append(eclipseVersion);\n\t\tsb.append(\"\\\" systemlibrary=\\\"false\\\">\\n\");\n\t\t\n\t\tFile[] files = new File(new File(target, eclipseVersion), \"plugins\").listFiles(new FilenameFilter() {\n\t\t\t@Override\n\t\t\tpublic boolean accept(File dir, String name) {\n\t\t\t\treturn name.endsWith(\".jar\") && !name.contains(\".source_\");\n\t\t\t}\n\t\t});\n\t\tArrays.sort(files);\n\t\t\n\t\tfor (File file : files) {\n\t\t\tsb.append(\"<archive path=\\\"\");\n\t\t\tsb.append(file.getAbsolutePath());\n\t\t\tsb.append(\"\\\"\");\n\t\t\t\n\t\t\tString path = file.getAbsolutePath();\n\t\t\tint index = path.lastIndexOf(\"_\");\n\t\t\t\n\t\t\tsb.append(\" source=\\\"\");\n\t\t\tsb.append(path.substring(0, index) + \".source\" + path.substring(index));\n\t\t\tsb.append(\"\\\"\");\n\t\t\t\n\t\t\tsb.append(\" />\\n\");\n\t\t}\n\t\t\n\t\tsb.append(\"</library>\\n\");\n\t\tsb.append(\"</eclipse-userlibraries>\\n\");\n\t\t\n\t\tOutputStream out = null;\n\t\ttry {\n\t\t\tout = new FileOutputStream(new File(target, eclipseVersion + \".userlibraries\"));\n\t\t\tcopy(new ByteArrayInputStream(sb.toString().getBytes(StandardCharsets.UTF_8)), out);\n\t\t} finally {\n\t\t\tif (out != null) out.close();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/support/lombok/eclipse/dependencies/UpdateSite.java",
    "content": "/*\n * Copyright (C) 2024 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.dependencies;\n\nimport java.io.BufferedInputStream;\nimport java.io.FileNotFoundException;\nimport java.io.InputStream;\nimport java.net.HttpURLConnection;\nimport java.net.URL;\nimport java.util.ArrayDeque;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Queue;\nimport java.util.Set;\nimport java.util.stream.Collectors;\nimport java.util.zip.ZipEntry;\nimport java.util.zip.ZipInputStream;\n\nimport javax.xml.XMLConstants;\nimport javax.xml.bind.JAXBContext;\nimport javax.xml.parsers.SAXParserFactory;\nimport javax.xml.transform.Source;\nimport javax.xml.transform.sax.SAXSource;\n\nimport org.xml.sax.InputSource;\n\nimport lombok.eclipse.dependencies.model.Child;\nimport lombok.eclipse.dependencies.model.Repository;\nimport lombok.eclipse.dependencies.model.Required;\nimport lombok.eclipse.dependencies.model.Unit;\nimport lombok.eclipse.dependencies.model.VersionRange;\n\npublic class UpdateSite {\n\tprivate static final String OS_NAME = System.getProperty(\"os.name\").toLowerCase();\n\tprivate static final String OSGI_OS = OS_NAME.contains(\"windows\") ? \"windows\" : OS_NAME.contains(\"mac\") ? \"mac\" : \"linux\";\n\tprivate static final String OS_ARCH = System.getProperty(\"os.arch\");\n\tprivate static final String OSGI_ARCH = OS_ARCH.equals(\"aarch64\") ? \"aarch64\" : \"x86_64\";\n\t\n\tprivate JAXBContext jaxbContext;\n\tprivate Repository repository;\n\tprivate String resolvedUrl;\n\tprivate SAXParserFactory saxParserFactory;\n\t\n\tpublic UpdateSite() throws Exception {\n\t\tjaxbContext = JAXBContext.newInstance(Repository.class);\n\t\t\n\t\tSAXParserFactory spf = SAXParserFactory.newInstance();\n\t\tspf.setFeature(\"http://apache.org/xml/features/disallow-doctype-decl\", true);\n\t\tspf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);\n\t\tspf.setXIncludeAware(false);\n\t\tsaxParserFactory = spf;\n\t}\n\t\n\tpublic void read(String url) throws Exception {\n\t\tString currentUrl = url;\n\t\ttry {\n\t\t\twhile (true) {\n\t\t\t\tString child = resolveNextChild(currentUrl);\n\t\t\t\tif (child.startsWith(\"https://\")) {\n\t\t\t\t\tcurrentUrl = child;\n\t\t\t\t} else {\n\t\t\t\t\tcurrentUrl += child;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (FileNotFoundException e) {\n\t\t\t// Found the real repository\n\t\t}\n\t\t\n\t\tresolvedUrl = currentUrl;\n\t\t\n\t\ttry (InputStream inputStream = readJarOrXml(resolvedUrl, \"content\")) {\n\t\t\trepository = unmarshalRepository(inputStream);\n\t\t}\n\t}\n\t\n\tpublic Set<String> resolveWithoutDependencies(List<String> dependencies) {\n\t\treturn resolve(dependencies, false);\n\t}\n\t\n\tpublic Set<String> resolveWithDependencies(List<String> dependencies) {\n\t\treturn resolve(dependencies, true);\n\t}\n\t\n\tprivate Set<String> resolve(List<String> dependencies, boolean withDependencies) {\n\t\tQueue<Required> toResolve = new ArrayDeque<>();\n\t\tfor (String dependency : dependencies) {\n\t\t\tString[] split = dependency.split(\":\");\n\t\t\tRequired required = new Required();\n\t\t\trequired.namespace = split[0];\n\t\t\trequired.name = split[1];\n\t\t\trequired.range = VersionRange.ALL;\n\t\t\ttoResolve.add(required);\n\t\t}\n\t\tSet<Unit> resolved = new HashSet<>();\n\t\twhile (!toResolve.isEmpty()) {\n\t\t\tRequired next = toResolve.poll();\n\t\t\t\n\t\t\t// Skip already resolved\n\t\t\tif (resolved.stream().anyMatch(u -> u.satisfies(next))) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tList<Unit> satisfyingUnits = repository.units.stream().filter(u -> u.satisfies(next)).collect(Collectors.toList());\n\t\t\t// Skip unknown\n\t\t\tif (satisfyingUnits.isEmpty()) {\n\t\t\t\tSystem.out.println(\"Skipping unknown unit \" + next);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\t// Skip JDK dependencies\n\t\t\tboolean jdkDependency = satisfyingUnits.stream().anyMatch(u -> u.id.equals(\"a.jre.javase\"));\n\t\t\tif (jdkDependency) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tif (satisfyingUnits.size() > 1) {\n\t\t\t\tSystem.out.println(\"Ambiguous resolution for \" + next + \": \" + satisfyingUnits.toString() + \", picking first\");\n\t\t\t}\n\t\t\t\n\t\t\tUnit unit = satisfyingUnits.get(0);\n\t\t\tresolved.add(unit);\n\t\t\t\n\t\t\tif (withDependencies && unit.requires != null) {\n\t\t\t\tfor (Required required : unit.requires) {\n\t\t\t\t\tif (required.optional) continue;\n\t\t\t\t\tif (!matchesFilter(required.filter)) continue;\n\t\t\t\t\t\n\t\t\t\t\ttoResolve.add(required);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn resolved.stream().map(u -> u.toString() + \".jar\").collect(Collectors.toSet());\n\t}\n\t\n\t// Dummy implementation\n\tprivate boolean matchesFilter(String filter) {\n\t\tif (filter == null) {\n\t\t\treturn true;\n\t\t}\n\t\tif (filter.contains(\"osgi.arch=\") && !filter.contains(\"osgi.arch=\" + OSGI_ARCH)) {\n\t\t\treturn false;\n\t\t}\n\t\tif (filter.contains(\"osgi.os=\") && !filter.contains(\"osgi.os=\" + OSGI_OS)) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\tprivate String resolveNextChild(String currentUrl) throws Exception {\n\t\ttry (InputStream inputStream = readJarOrXml(currentUrl, \"compositeContent\")) {\n\t\t\tRepository repository = unmarshalRepository(inputStream);\n\t\t\tChild lastChild = repository.children.get(repository.children.size() - 1);\n\t\t\treturn lastChild.location;\n\t\t}\n\t}\n\n\tprivate Repository unmarshalRepository(InputStream inputStream) throws Exception {\n\t\tSource source = new SAXSource(saxParserFactory.newSAXParser().getXMLReader(), new InputSource(inputStream));\n\t\tRepository repository = (Repository) jaxbContext.createUnmarshaller().unmarshal(source);\n\t\treturn repository;\n\t}\n\t\n\tprivate InputStream readJarOrXml(String url, String name) throws Exception {\n\t\ttry {\n\t\t\treturn getStreamForUrl(url + \"/\" + name + \".xml\");\n\t\t} catch (FileNotFoundException e) {\n\t\t\tSystem.out.println(\"Not found, trying jar\");\n\t\t}\n\t\tZipInputStream zipInputStream = new ZipInputStream(getStreamForUrl(url + \"/\" + name + \".jar\"));\n\t\tZipEntry entry;\n\t\twhile ((entry = zipInputStream.getNextEntry()) != null) {\n\t\t\tif (entry.getName().equals(name + \".xml\")) {\n\t\t\t\treturn zipInputStream;\n\t\t\t}\n\t\t}\n\t\tthrow new FileNotFoundException();\n\t}\n\t\n\tprivate static InputStream getStreamForUrl(String url) throws Exception {\n\t\tSystem.out.println(\"Reading \" + url);\n\t\tHttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();\n\t\tconnection.setRequestProperty(\"User-Agent\", \"lombok\");\n\t\tconnection.setRequestProperty(\"Accept\", \"*/*\");\n\t\tInputStream in = new BufferedInputStream(connection.getInputStream());\n\t\treturn in;\n\t}\n\n\tpublic String getResolvedUrl() {\n\t\treturn resolvedUrl;\n\t}\n}\n"
  },
  {
    "path": "src/support/lombok/eclipse/dependencies/model/Child.java",
    "content": "/*\n * Copyright (C) 2023-2024 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.dependencies.model;\n\nimport javax.xml.bind.annotation.XmlAttribute;\n\npublic class Child {\n\t@XmlAttribute\n\tpublic String location;\n}"
  },
  {
    "path": "src/support/lombok/eclipse/dependencies/model/Provided.java",
    "content": "/*\n * Copyright (C) 2023-2024 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.dependencies.model;\n\nimport javax.xml.bind.annotation.XmlAttribute;\nimport javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;\n\npublic class Provided {\n\t@XmlAttribute\n\tpublic String namespace;\n\t@XmlAttribute\n\tpublic String name;\n\t@XmlAttribute\n\t@XmlJavaTypeAdapter(VersionAdapter.class)\n\tpublic Version version;\n\t\n\t@Override\n\tpublic String toString() {\n\t\treturn namespace + \":\" + name + \"_\"  + version;\n\t}\n}\n"
  },
  {
    "path": "src/support/lombok/eclipse/dependencies/model/Repository.java",
    "content": "/*\n * Copyright (C) 2023-2024 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.dependencies.model;\n\nimport java.util.List;\n\nimport javax.xml.bind.annotation.XmlElement;\nimport javax.xml.bind.annotation.XmlElementWrapper;\nimport javax.xml.bind.annotation.XmlRootElement;\n\n@XmlRootElement\npublic class Repository {\n\t@XmlElementWrapper(name = \"children\")\n\t@XmlElement(name=\"child\")\n\tpublic List<Child> children;\n\t\n\t@XmlElementWrapper(name = \"units\")\n\t@XmlElement(name=\"unit\")\n\tpublic List<Unit> units;\n}"
  },
  {
    "path": "src/support/lombok/eclipse/dependencies/model/Required.java",
    "content": "/*\n * Copyright (C) 2023-2024 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.dependencies.model;\n\nimport javax.xml.bind.annotation.XmlAttribute;\nimport javax.xml.bind.annotation.XmlElement;\nimport javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;\n\npublic class Required {\n\t@XmlAttribute\n\tpublic String namespace;\n\t@XmlAttribute\n\tpublic String name;\n\t@XmlAttribute\n\t@XmlJavaTypeAdapter(VersionRangeAdapter.class)\n\tpublic VersionRange range;\n\t@XmlAttribute\n\tpublic boolean optional;\n\t@XmlElement\n\tpublic String filter;\n\t\n\t@Override\n\tpublic String toString() {\n\t\treturn namespace + \":\" + name + \"_\"  + range;\n\t}\n}\n"
  },
  {
    "path": "src/support/lombok/eclipse/dependencies/model/Unit.java",
    "content": "/*\n * Copyright (C) 2023-2024 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.dependencies.model;\n\nimport java.util.List;\n\nimport javax.xml.bind.annotation.XmlAttribute;\nimport javax.xml.bind.annotation.XmlElement;\nimport javax.xml.bind.annotation.XmlElementWrapper;\nimport javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;\n\npublic class Unit {\n\t@XmlAttribute\n\tpublic String id;\n\t@XmlAttribute\n\t@XmlJavaTypeAdapter(VersionAdapter.class)\n\tpublic Version version;\n\t\n\t@XmlElementWrapper(name = \"provides\")\n\t@XmlElement(name=\"provided\")\n\tpublic List<Provided> provides;\n\t\n\t@XmlElementWrapper(name = \"requires\")\n\t@XmlElement(name=\"required\")\n\tpublic List<Required> requires;\n\t\n\tpublic boolean satisfies(Required required) {\n\t\treturn provides.stream().anyMatch(p -> p.namespace.equals(required.namespace) && p.name.equals(required.name) && required.range.contains(p.version));\n\t}\n\t\n\t@Override\n\tpublic String toString() {\n\t\treturn id + \"_\" + version;\n\t}\n}\n"
  },
  {
    "path": "src/support/lombok/eclipse/dependencies/model/Version.java",
    "content": "/*\n * Copyright (C) 2024 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.dependencies.model;\n\npublic class Version {\n\tprivate int major;\n\tprivate int minor;\n\tprivate int micro;\n\tprivate String qualifier = \"\";\n\t\n\tpublic static Version parse(String v) {\n\t\tString[] parts = v.split(\"\\\\.\", 4);\n\t\t\n\t\tVersion version = new Version();\n\t\tversion.major = Integer.parseInt(parts[0]);\n\t\tif (parts.length > 1) {\n\t\t\tversion.minor = Integer.parseInt(parts[1]);\n\t\t}\n\t\tif (parts.length > 2) {\n\t\t\tversion.micro = Integer.parseInt(parts[2]);\n\t\t}\n\t\tif (parts.length > 3) {\n\t\t\tversion.qualifier = parts[3];\n\t\t}\n\t\treturn version;\n\t}\n\t\n\tpublic int compareTo(Version other) {\n\t\tint result = major - other.major;\n\t\tif (result != 0) return result;\n\t\t\n\t\tresult = minor - other.minor;\n\t\tif (result != 0) return result;\n\t\t\n\t\tresult = micro - other.micro;\n\t\tif (result != 0) return result;\n\t\t\n\t\treturn qualifier.compareTo(other.qualifier);\n\t}\n\t\n\t@Override\n\tpublic String toString() {\n\t\tString result = major + \".\" + minor + \".\" + micro;\n\t\tif (!qualifier.isEmpty()) result += \".\" + qualifier;\n\t\treturn result;\n\t}\n}\n"
  },
  {
    "path": "src/support/lombok/eclipse/dependencies/model/VersionAdapter.java",
    "content": "/*\n * Copyright (C) 2024 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.dependencies.model;\n\nimport javax.xml.bind.annotation.adapters.XmlAdapter;\n\npublic class VersionAdapter extends XmlAdapter<String, Version> {\n\n\t@Override\n\tpublic Version unmarshal(String v) throws Exception {\n\t\treturn Version.parse(v);\n\t}\n\n\t@Override\n\tpublic String marshal(Version v) throws Exception {\n\t\tthrow new UnsupportedOperationException();\n\t}\n\t\n}\n"
  },
  {
    "path": "src/support/lombok/eclipse/dependencies/model/VersionRange.java",
    "content": "/*\n * Copyright (C) 2024 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.dependencies.model;\n\npublic class VersionRange {\n\tpublic static final VersionRange ALL = VersionRange.parse(\"0.0.0\");\n\t\n\tprivate Version min;\n\tprivate Version max;\n\tprivate boolean leftInclusive;\n\tprivate boolean leftExclusive;\n\tprivate boolean rightInclusive;\n\tprivate boolean rightExclusive;\n\t\n\tpublic static VersionRange parse(String v) {\n\t\tVersionRange versionRange = new VersionRange();\n\t\tversionRange.leftInclusive = v.startsWith(\"[\");\n\t\tversionRange.leftExclusive = v.startsWith(\"(\");\n\t\tversionRange.rightInclusive = v.endsWith(\"]\");\n\t\tversionRange.rightExclusive = v.endsWith(\")\");\n\t\t\n\t\tif (!versionRange.leftInclusive && !versionRange.leftExclusive) {\n\t\t\tVersion version = Version.parse(v);\n\t\t\tversionRange.min = version;\n\t\t\tversionRange.leftInclusive = true;\n\t\t\treturn versionRange;\n\t\t}\n\t\t\n\t\tString[] parts = v.replaceAll(\"[\\\\[\\\\(\\\\)\\\\]]\", \"\").split(\",\");\n\t\tversionRange.min = Version.parse(parts[0]);\n\t\tversionRange.max = Version.parse(parts[1]);\n\t\treturn versionRange;\n\t}\n\t\n\tpublic boolean contains(Version version) {\n\t\tif (min != null) {\n\t\t\tint result = min.compareTo(version);\n\t\t\tif (result > 0) return false;\n\t\t\tif (result == 0 && !leftInclusive) return false;\n\t\t}\n\t\tif (max != null) {\n\t\t\tint result = max.compareTo(version);\n\t\t\tif (result < 0) return false;\n\t\t\tif (result == 0 && !rightInclusive) return false;\n\t\t}\n\t\treturn true;\n\t}\n\t\n\t@Override\n\tpublic String toString() {\n\t\tStringBuilder sb = new StringBuilder();\n\t\tif (leftInclusive) sb.append(\"[\");\n\t\tif (leftExclusive) sb.append(\"(\");\n\t\tif (min != null) sb.append(min);\n\t\tsb.append(\",\");\n\t\tif (max != null) sb.append(max);\n\t\tif (rightInclusive) sb.append(\"]\");\n\t\tif (rightExclusive) sb.append(\")\");\n\t\treturn sb.toString();\n\t}\n}\n"
  },
  {
    "path": "src/support/lombok/eclipse/dependencies/model/VersionRangeAdapter.java",
    "content": "/*\n * Copyright (C) 2024 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.dependencies.model;\n\nimport javax.xml.bind.annotation.adapters.XmlAdapter;\n\npublic class VersionRangeAdapter extends XmlAdapter<String, VersionRange> {\n\n\t@Override\n\tpublic VersionRange unmarshal(String v) throws Exception {\n\t\treturn VersionRange.parse(v);\n\t}\n\n\t@Override\n\tpublic String marshal(VersionRange v) throws Exception {\n\t\tthrow new UnsupportedOperationException();\n\t}\n\t\n}\n"
  },
  {
    "path": "src/support/lombok/eclipseCreate/CreateEclipseDebugTarget.java",
    "content": "package lombok.eclipseCreate;\n\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.OutputStream;\nimport java.util.LinkedHashMap;\nimport java.util.Map;\nimport java.util.regex.Pattern;\n\npublic class CreateEclipseDebugTarget {\n\tprivate Map<String, String> args;\n\tprivate StringBuilder launchContent = new StringBuilder();\n\t\n\tprivate static class InvalidCommandLineException extends Exception {\n\t\tInvalidCommandLineException(String msg) {\n\t\t\tsuper(msg);\n\t\t\t\n\t\t}\n\t\tInvalidCommandLineException(String msg, Throwable cause) {\n\t\t\tsuper(msg, cause);\n\t\t}\n\t}\n\t\n\tpublic static void main(String[] args) throws Exception {\n\t\tCreateEclipseDebugTarget instance = new CreateEclipseDebugTarget();\n\t\ttry {\n\t\t\tinstance.args = parseArgs(args);\n\t\t\tif (instance.args.isEmpty()) throw new InvalidCommandLineException(\"\");\n\t\t\tinstance.go();\n\t\t} catch (InvalidCommandLineException e) {\n\t\t\tString msg = e.getMessage();\n\t\t\tif (!msg.isEmpty()) System.err.println(\"ERROR: \" + msg);\n\t\t\tif (e.getCause() != null) {\n\t\t\t\te.getCause().printStackTrace();\n\t\t\t}\n\t\t\tprintCommandLineHelp();\n\t\t\tSystem.exit(1);\n\t\t} catch (IOException e) {\n\t\t\te.printStackTrace();\n\t\t\tSystem.exit(1);\n\t\t}\n\t}\n\t\n\tprivate void go() throws InvalidCommandLineException, IOException {\n\t\tprologue();\n\t\tclasspath();\n\t\tepilogue();\n\t\tString n = getArgString(\"name\");\n\t\tFile f = new File(n + \".launch\").getCanonicalFile();\n\t\t\n\t\tOutputStream out = new FileOutputStream(f);\n\t\ttry {\n\t\t\tout.write(launchContent.toString().getBytes(\"UTF-8\"));\n\t\t} finally {\n\t\t\tout.close();\n\t\t}\n\t\t\n\t\tSystem.out.println(\"Debug target created: \" + f);\n\t}\n\t\n\tprivate void prologue() throws InvalidCommandLineException {\n\t\tString type = getArgString(\"testType\");\n\t\t\n\t\tlaunchContent.append(\"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\"?>\\n\");\n\t\tlaunchContent.append(\"<launchConfiguration type=\\\"org.eclipse.jdt.junit.launchconfig\\\">\\n\");\n\t\tlaunchContent.append(\"\\t<listAttribute key=\\\"org.eclipse.debug.core.MAPPED_RESOURCE_PATHS\\\">\\n\");\n\t\tlaunchContent.append(\"\\t\\t<listEntry value=\\\"/lombok/test/core/src/\").append(type.replace(\".\", \"/\")).append(\".java\\\"/>\\n\");\n\t\tlaunchContent.append(\"\\t</listAttribute>\\n\");\n\t\tlaunchContent.append(\"\\t<listAttribute key=\\\"org.eclipse.debug.core.MAPPED_RESOURCE_TYPES\\\">\\n\");\n\t\tlaunchContent.append(\"\\t\\t<listEntry value=\\\"1\\\"/>\\n\");\n\t\tlaunchContent.append(\"\\t</listAttribute>\\n\");\n\t\t\n\t\tif (getArgBoolean(\"favorite\")) {\n\t\t\tlaunchContent.append(\"\\t<listAttribute key=\\\"org.eclipse.debug.ui.favoriteGroups\\\">\\n\");\n\t\t\tlaunchContent.append(\"\\t\\t<listEntry value=\\\"org.eclipse.debug.ui.launchGroup.debug\\\"/>\\n\");\n\t\t\tlaunchContent.append(\"\\t</listAttribute>\\n\");\n\t\t}\n\t\t\n\t\tlaunchContent.append(\"\\t<stringAttribute key=\\\"org.eclipse.jdt.junit.CONTAINER\\\" value=\\\"\\\"/>\\n\");\n\t\tlaunchContent.append(\"\\t<booleanAttribute key=\\\"org.eclipse.jdt.junit.KEEPRUNNING_ATTR\\\" value=\\\"false\\\"/>\\n\");\n\t\tlaunchContent.append(\"\\t<stringAttribute key=\\\"org.eclipse.jdt.junit.TESTNAME\\\" value=\\\"\\\"/>\\n\");\n\t\tlaunchContent.append(\"\\t<stringAttribute key=\\\"org.eclipse.jdt.junit.TEST_KIND\\\" value=\\\"org.eclipse.jdt.junit.loader.junit4\\\"/>\\n\");\n\t\tlaunchContent.append(\"\\t<booleanAttribute key=\\\"org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD\\\" value=\\\"true\\\"/>\\n\");\n\t}\n\t\n\tprivate void classpath() throws InvalidCommandLineException {\n\t\tlaunchContent.append(\"\\t<listAttribute key=\\\"org.eclipse.jdt.launching.CLASSPATH\\\">\\n\");\n\t\t\n\t\tString self; try {\n\t\t\tself = new File(\"..\").getCanonicalPath();\n\t\t} catch (IOException e) {\n\t\t\tthrow new InvalidCommandLineException(\"Cannot obtain canonical path to parent directory\", e);\n\t\t}\n\t\t\n\t\tString bootpath = getBootPath();\n\t\t\n\t\tlaunchContent.append(\"\\t\\t<listEntry value=\\\"&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/lombok/bin/main&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;\\\"/>\\n\");\n\t\tfor (Map.Entry<String, String> entry : args.entrySet()) {\n\t\t\tif (!entry.getKey().startsWith(\"conf.\")) continue;\n\t\t\tString v = entry.getValue();\n\t\t\tif (v.equals(\"NONE\")) continue;\n\t\t\tString[] files = v.split(Pattern.quote(File.pathSeparator));\n\t\t\tfor (String file : files) {\n\t\t\t\tString n;\n\t\t\t\ttry {\n\t\t\t\t\tn = new File(file).getCanonicalPath();\n\t\t\t\t} catch (IOException e) {\n\t\t\t\t\tthrow new InvalidCommandLineException(\"Cannot obtain canonical path to dependency \" + file, e);\n\t\t\t\t}\n\t\t\t\tif (n.startsWith(self)) {\n\t\t\t\t\tlaunchContent.append(\"\\t\\t<listEntry value=\\\"&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;\");\n\t\t\t\t\tlaunchContent.append(n.substring(self.length()));\n\t\t\t\t\tlaunchContent.append(\"&quot; path=&quot;3&quot; type=&quot;2&quot;/&gt;&#10;\\\"/>\\n\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (bootpath != null) launchContent.append(\"\\t\\t<listEntry value=\\\"&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;runtimeClasspathEntry internalArchive=&quot;/lombok/\" + bootpath + \"&quot; path=&quot;5&quot; type=&quot;2&quot;/&gt;&#10;\\\"/>\\n\");\n\t\tlaunchContent.append(\"\\t</listAttribute>\\n\");\n\t}\n\t\n\tprivate void epilogue() throws InvalidCommandLineException {\n\t\tString type = getArgString(\"testType\");\n\t\t\n\t\tlaunchContent.append(\"\\t<booleanAttribute key=\\\"org.eclipse.jdt.launching.DEFAULT_CLASSPATH\\\" value=\\\"false\\\"/>\\n\");\n\t\tString jvmTarget = getArgString(\"jvmTarget\");\n\t\tString bootpath = getBootPath();\n\t\tlaunchContent.append(\"\\t<stringAttribute key=\\\"org.eclipse.jdt.launching.JRE_CONTAINER\\\" value=\\\"org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-\").append(jvmTarget).append(\"\\\"/>\\n\");\n\t\tlaunchContent.append(\"\\t<stringAttribute key=\\\"org.eclipse.jdt.launching.MAIN_TYPE\\\" value=\\\"\").append(type).append(\"\\\"/>\\n\");\n\t\tlaunchContent.append(\"\\t<listAttribute key=\\\"org.eclipse.jdt.launching.MODULEPATH\\\"/>\\n\");\n\t\tlaunchContent.append(\"\\t<stringAttribute key=\\\"org.eclipse.jdt.launching.PROJECT_ATTR\\\" value=\\\"lombok\\\"/>\\n\");\n\t\tif (getArgBoolean(\"shadowLoaderBased\")) {\n\t\t\tlaunchContent.append(\"<stringAttribute key=\\\"org.eclipse.jdt.launching.VM_ARGUMENTS\\\" value=\\\"-javaagent:dist/lombok.jar -Dshadow.override.lombok=${project_loc:lombok}/bin/main\");\n\t\t\tfor (Map.Entry<String, String> entry : args.entrySet()) {\n\t\t\t\tif (!entry.getKey().startsWith(\"conf.\")) continue;\n\t\t\t\tlaunchContent.append(File.pathSeparator).append(entry.getValue());\n\t\t\t}\n\t\t\tif (bootpath != null) launchContent.append(\" -Ddelombok.bootclasspath=\" + bootpath);\n\t\t}\n\t\tlaunchContent.append(\"\\\"/>\\n</launchConfiguration>\\n\");\n\t}\n\t\n\tprivate String getBootPath() {\n\t\tString bp = args.get(\"bootpath\");\n\t\tif (bp == null || bp.isEmpty() || bp.equals(\"0\")) return null;\n\t\tFile f = new File(bp);\n\t\tif (!f.isAbsolute()) return bp;\n\t\tString r = new File(\".\").getAbsolutePath();\n\t\tif (r.endsWith(\".\")) r = r.substring(0, r.length() - 1);\n\t\tif (bp.startsWith(r)) return bp.substring(r.length());\n\t\tthrow new IllegalStateException(\"Cannot reconstruct relative path; base: \" + r + \" is not a parent of \" + bp);\n\t}\n\t\n\tprivate String getArgString(String key) throws InvalidCommandLineException {\n\t\tString v = args.get(key);\n\t\tif (v == null) throw new InvalidCommandLineException(\"mandatory argument '\" + key + \"' missing\");\n\t\treturn v;\n\t}\n\t\n\tprivate boolean getArgBoolean(String key) throws InvalidCommandLineException {\n\t\tString v = args.get(key);\n\t\tif (v == null) return false;\n\t\tif (v.equalsIgnoreCase(\"false\") || v.equalsIgnoreCase(\"f\")) return false;\n\t\treturn true;\n\t}\n\t\n\tprivate static void printCommandLineHelp() {\n\t\tSystem.err.println(\"CreateEclipseDebugTarget\\n\" +\n\t\t\t\"   name=Lombok-test BaseJavac 11           # Sets the name of the debug target to make\\n\" +\n\t\t\t\"   testType=lombok.RunJavacAndBaseTests    # The test class file that this debug target should run\\n\" +\n\t\t\t\"   shadowLoaderBased                       # Add the VM options to use lombok as an agent and pass the classpath to the shadow loader. Needed for ECJ/Eclipse.\\n\" +\n\t\t\t\"   conf.test=foo:bar:baz                   # Where 'test' is an ivy conf name, and 'foo' is a path to a jar, relativized vs. current directory.\\n\" +\n\t\t\t\"   favorite                                # Should the debug target be marked as favourite?\\n\" +\n\t\t\t\"\");\n\t}\n\t\n\tprivate static Map<String, String> parseArgs(String[] args) throws IllegalArgumentException {\n\t\tMap<String, String> map = new LinkedHashMap<String, String>();\n\t\t\n\t\tfor (String arg : args) {\n\t\t\tint idx = arg.indexOf('=');\n\t\t\tString key = (idx == -1 ? arg : arg.substring(0, idx)).trim();\n\t\t\tString value = (idx == -1 ? \"\" : arg.substring(idx + 1)).trim();\n\t\t\tString existing = map.get(key);\n\t\t\tif (existing != null) {\n\t\t\t\tif (key.startsWith(\"conf.\")) {\n\t\t\t\t\tvalue = existing + File.pathSeparator + value;\n\t\t\t\t} else {\n\t\t\t\t\tthrow new IllegalArgumentException(\"Duplicate argument not allowed: \" + key);\n\t\t\t\t}\n\t\t\t}\n\t\t\tmap.put(key, value);\n\t\t}\n\t\treturn map;\n\t}\n}"
  },
  {
    "path": "src/support/lombok/publish/PublishToBucket.java",
    "content": "package lombok.publish;\n\nimport java.io.IOException;\nimport java.net.URI;\nimport java.nio.file.DirectoryStream;\nimport java.nio.file.Files;\nimport java.nio.file.NoSuchFileException;\nimport java.nio.file.Path;\nimport java.nio.file.Paths;\nimport java.util.ArrayList;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\nimport java.util.stream.Collectors;\n\nimport software.amazon.awssdk.auth.credentials.AwsBasicCredentials;\nimport software.amazon.awssdk.regions.Region;\nimport software.amazon.awssdk.services.s3.S3Client;\nimport software.amazon.awssdk.services.s3.model.Delete;\nimport software.amazon.awssdk.services.s3.model.DeleteObjectsRequest;\nimport software.amazon.awssdk.services.s3.model.ListObjectsV2Request;\nimport software.amazon.awssdk.services.s3.model.ListObjectsV2Response;\nimport software.amazon.awssdk.services.s3.model.ObjectIdentifier;\nimport software.amazon.awssdk.services.s3.model.PutObjectRequest;\nimport software.amazon.awssdk.services.s3.model.S3Object;\n\npublic class PublishToBucket {\n\tprivate static final boolean DEBUG = false;\n\t\n\tprivate static final class AppException extends Exception {\n\t\tAppException(String msg) {\n\t\t\tsuper(msg);\n\t\t}\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\ttry {\n\t\t\tif (args.length != 4) throw new AppException(\"4 args required: [path to creds file] [path to file root to upload] [target dir in bucket] [delete files to create a perfect copy or not]\");\n\t\t\tboolean delete;\n\t\t\tif (args[3].equalsIgnoreCase(\"true\")) delete = true;\n\t\t\telse if (args[3].equalsIgnoreCase(\"false\")) delete = false;\n\t\t\telse throw new AppException(\"4th arg must be 'true' or 'false'\");\n\t\t\tnew PublishToBucket().go(args[0], args[1], args[2], delete);\n\t\t\tSystem.exit(0);\n\t\t} catch (AppException e) {\n\t\t\tSystem.err.println(e.getMessage());\n\t\t\tSystem.exit(1);\n\t\t}\n\t}\n\t\n\tprivate URI endpoint;\n\tprivate String bucketName;\n\tprivate AwsBasicCredentials creds;\n\t\n\t/**\n\t * @param credsPath path to the creds file; first line in that file is the access key, second line is the secret.\n\t * @param rootPath path to a directory; this directory is replicated into the bucket.\n\t */\n\tprivate void go(String credsPath, String rootPath, String bucketDir, boolean delete) throws AppException {\n\t\treadCreds(Paths.get(credsPath));\n\t\t\n\t\tS3Client s3 = S3Client.builder()\n\t\t\t.endpointOverride(endpoint)\n\t\t\t.region(Region.of(\"auto\"))\n\t\t\t.credentialsProvider(() -> creds)\n\t\t\t.build();\n\t\t\n\t\tListObjectsV2Response objList = s3.listObjectsV2(ListObjectsV2Request.builder()\n\t\t\t.bucket(bucketName)\n\t\t\t.prefix(bucketDir + \"/\")\n\t\t\t.build());\n\t\t\n\t\tSet<String> inBucketBeforeUpload = new HashSet<String>();\n\t\tfor (S3Object obj : objList.contents()) inBucketBeforeUpload.add(obj.key());\n\t\t\n\t\tdbg(\"Already in bucket:\\n\" +\n\t\t\tinBucketBeforeUpload.stream().map(x -> \"  \" + x + \"\\n\").collect(Collectors.joining()) +\n\t\t\t(inBucketBeforeUpload.isEmpty() ? \"  (Nothing)\\n\" : \"\"));\n\t\t\n\t\ttry {\n\t\t\tgo0(s3, inBucketBeforeUpload, bucketDir + \"/\", Paths.get(rootPath));\n\t\t} catch (IOException e) {\n\t\t\tthrow new AppException(\"I/O exception uploading: \" + e.getClass() + \": \" + e.getMessage());\n\t\t}\n\t\t\n\t\tif (delete) {\n\t\t\tdbg(\"Uploads complete. Files to delete:\\n\" +\n\t\t\t\tinBucketBeforeUpload.stream().map(x -> \"  \" + x + \"\\n\").collect(Collectors.joining()) +\n\t\t\t\t(inBucketBeforeUpload.isEmpty() ? \"  (Nothing)\\n\" : \"\"));\n\t\t\t\n\t\t\tif (!inBucketBeforeUpload.isEmpty()) {\n\t\t\t\tList<ObjectIdentifier> objsToDelete = new ArrayList<ObjectIdentifier>();\n\t\t\t\tfor (String key : inBucketBeforeUpload) {\n\t\t\t\t\tobjsToDelete.add(ObjectIdentifier.builder().key(key).build());\n\t\t\t\t}\n\t\t\t\ts3.deleteObjects(DeleteObjectsRequest.builder()\n\t\t\t\t\t.bucket(bucketName)\n\t\t\t\t\t.delete(Delete.builder().objects(objsToDelete).build())\n\t\t\t\t\t.build());\n\t\t\t\tdbg(\"Deletion completed\");\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate static void dbg(String msg) {\n\t\tif (DEBUG) System.out.println(msg);\n\t}\n\n\tprivate void go0(S3Client s3, Set<String> inBucketBeforeUpload, String prefix, Path tgt) throws IOException {\n\t\ttry (DirectoryStream<Path> ds = Files.newDirectoryStream(tgt)) {\n\t\t\tfor (Path child : ds) {\n\t\t\t\tif (Files.isDirectory(child)) {\n\t\t\t\t\tgo0(s3, inBucketBeforeUpload, prefix + child.getFileName().toString() + \"/\", child);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tString key = prefix + child.getFileName().toString();\n\t\t\t\tPutObjectRequest req = PutObjectRequest.builder()\n\t\t\t\t\t.bucket(bucketName)\n\t\t\t\t\t.key(key)\n\t\t\t\t\t.build();\n\t\t\t\ts3.putObject(req, child);\n\t\t\t\tboolean overwrote = inBucketBeforeUpload.remove(key);\n\t\t\t\tdbg(\"Uploaded: \" + key + (overwrote ? \" (overwrote)\" : \"\"));\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate static final String LINE_DESCRIPTIONS = \"accessKey/secretKey/endpoint/bucket\";\n\tprivate void readCreds(Path path) throws AppException {\n\t\ttry {\n\t\t\tList<String> lines = Files.readAllLines(path);\n\t\t\tString accessKey = null, secretKey = null, endPoint = null, bucketName = null;\n\t\t\tfor (String line : lines) {\n\t\t\t\tint idx = line.indexOf('#');\n\t\t\t\tif (idx != -1) line = line.substring(0, idx);\n\t\t\t\tline = line.trim();\n\t\t\t\tif (line.isEmpty()) continue;\n\t\t\t\tif (accessKey == null) { accessKey = line; continue; }\n\t\t\t\tif (secretKey == null) { secretKey = line; continue; }\n\t\t\t\tif (endPoint == null) { endPoint = line; continue; }\n\t\t\t\tif (bucketName == null) { bucketName = line; continue; }\n\t\t\t\tthrow new AppException(\"Too many lines in \" + path.toAbsolutePath() + \" - only 4 expected: \" + LINE_DESCRIPTIONS);\n\t\t\t}\n\t\t\tif (bucketName == null) throw new AppException(\"Expected 3 lines in \" + path.toAbsolutePath() + \": \" + LINE_DESCRIPTIONS);\n\t\t\tcreds = AwsBasicCredentials.create(accessKey, secretKey);\n\t\t\tendpoint = URI.create(endPoint);\n\t\t\tthis.bucketName = bucketName;\n\t\t} catch (NoSuchFileException e) {\n\t\t\tthrow new AppException(\"File with bucket endpoint + credentials is not available. Make file \" + path.toAbsolutePath() + \"; it should contain something like: \\n\" +\n\t\t\t\t\"123456789abcdef0123456789abcdef0  # this is the access key\\n\" +\n\t\t\t\t\"123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0  # this is the secret\\n\" +\n\t\t\t\t\"https://12345.r2.cloudflarestorage.com   # this is the endpoint\\n\" +\n\t\t\t\t\"lombok-data   # this is the bucket name\");\n\t\t} catch (IOException e) {\n\t\t\tthrow new AppException(\"I/O issue reading creds file \" + path.toAbsolutePath() + \": \" + e.getClass() + \": \" + e.getMessage());\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/support/lombok/website/CompileChangelog.java",
    "content": "package lombok.website;\n\nimport java.io.BufferedReader;\nimport java.io.ByteArrayOutputStream;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.StringReader;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\nimport com.petebevin.markdown.MarkdownProcessor;\n\npublic class CompileChangelog {\n\tpublic static void main(String[] args) {\n\t\tString fileIn = args[0];\n\t\tString fileOut = args[1];\n\t\tboolean edge = args.length > 3 && \"-edge\".equals(args[2]);\n\t\tboolean latest = args.length > 3 && \"-latest\".equals(args[2]);\n\t\tString version = args.length > 3 ? args[3] : null;\n\t\t\n\t\ttry {\n\t\t\tFileInputStream in = new FileInputStream(fileIn);\n\t\t\tByteArrayOutputStream out = new ByteArrayOutputStream();\n\t\t\t\n\t\t\tbyte[] b = new byte[65536];\n\t\t\twhile (true) {\n\t\t\t\tint r = in.read(b);\n\t\t\t\tif ( r == -1 ) break;\n\t\t\t\tout.write(b, 0, r);\n\t\t\t}\n\t\t\tin.close();\n\t\t\tString markdown = new String(out.toByteArray(), \"UTF-8\");\n\t\t\t\n\t\t\tString result;\n\t\t\tif (edge) {\n\t\t\t\tresult = buildEdge(sectionByVersion(markdown, version));\n\t\t\t} else if (latest) {\n\t\t\t\tresult = buildLatest(sectionByVersion(markdown, version));\n\t\t\t} else {\n\t\t\t\tresult = markdownToHtml(sectionStartingAt(markdown, version));\n\t\t\t}\n\t\t\t\n\t\t\tFileOutputStream file = new FileOutputStream(fileOut);\n\t\t\tfile.write(result.getBytes(\"UTF-8\"));\n\t\t\tfile.close();\n\t\t\tSystem.exit(0);\n\t\t} catch (Throwable e) {\n\t\t\te.printStackTrace();\n\t\t\tSystem.exit(1);\n\t\t}\n\t}\n\t\n\tpublic static String getHtmlForEdge(File root, String edgeVersion) throws IOException {\n\t\tFile f = new File(root, \"doc/changelog.markdown\");\n\t\tString raw = readFile(f);\n\t\treturn buildEdge(sectionByVersion(raw, edgeVersion));\n\t}\n\t\n\tpublic static String getHtmlForLatest(File root, String latestVersion) throws IOException {\n\t\tFile f = new File(root, \"doc/changelog.markdown\");\n\t\tString raw = readFile(f);\n\t\treturn buildLatest(sectionByVersion(raw, latestVersion));\n\t}\n\t\n\tpublic static String getHtml(File root) throws IOException {\n\t\tFile f = new File(root, \"doc/changelog.markdown\");\n\t\tString raw = readFile(f);\n\t\treturn markdownToHtml(raw);\n\t}\n\t\n\tpublic static String getHtmlStartingAtSection(File root, String version) throws IOException {\n\t\tFile f = new File(root, \"doc/changelog.markdown\");\n\t\tString raw = readFile(f);\n\t\treturn markdownToHtml(sectionStartingAt(raw, version));\n\t}\n\t\n\tprivate static String readFile(File f) throws IOException {\n\t\tbyte[] b = new byte[65536];\n\t\tFileInputStream in = new FileInputStream(f);\n\t\ttry {\n\t\t\tByteArrayOutputStream out = new ByteArrayOutputStream();\n\t\t\twhile (true) {\n\t\t\t\tint r = in.read(b);\n\t\t\t\tif ( r == -1 ) break;\n\t\t\t\tout.write(b, 0, r);\n\t\t\t}\n\t\t\tin.close();\n\t\t\treturn new String(out.toByteArray(), \"UTF-8\");\n\t\t} finally {\n\t\t\tin.close();\n\t\t}\n\t}\n\t\n\tprivate static String markdownToHtml(String markdown) {\n\t\treturn new MarkdownProcessor().markdown(markdown);\n\t}\n\t\n\tprivate static String buildEdge(String section) {\n\t\tString latest = section != null ? section : \"* No changelog records for this edge release.\";\n\t\treturn markdownToHtml(latest);\n\t}\n\t\n\tprivate static String buildLatest(String section) {\n\t\tString latest = section != null ? section : \"* No changelog records for this release.\";\n\t\tString noIssueLinks = latest.replaceAll(\"\\\\[[^]]*[Ii]ssue[^]]*\\\\]\\\\([^)]*\\\\)\", \"\");\n\t\tString noLinks = noIssueLinks.replaceAll(\"\\\\[([^]]*)\\\\]\\\\([^)]*\\\\)\", \"$1\");\n\t\treturn markdownToHtml(noLinks);\n\t}\n\t\n\tprivate static String sectionStartingAt(String markdown, String version) {\n\t\tif (version.toUpperCase().endsWith(\"-HEAD\") || version.toUpperCase().endsWith(\"-EDGE\")) {\n\t\t\tversion = version.substring(0, version.length() - 5);\n\t\t}\n\t\t\n\t\tPattern p = Pattern.compile(\"^.*###\\\\s*v(.*)$\");\n\t\tBufferedReader br = new BufferedReader(new StringReader(markdown));\n\t\tStringBuilder out = new StringBuilder();\n\t\tint state = 0;\n\t\ttry {\n\t\t\tfor (String line = br.readLine(); line != null; line = br.readLine()) {\n\t\t\t\tif (state < 2) {\n\t\t\t\t\tMatcher m = p.matcher(line);\n\t\t\t\t\tif (m.matches()) state = m.group(1).startsWith(version) ? 2 : 1;\n\t\t\t\t}\n\t\t\t\tif (state != 1) {\n\t\t\t\t\tout.append(line);\n\t\t\t\t\tout.append(\"\\n\");\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn out.toString();\n\t\t} catch (IOException e) {\n\t\t\tthrow new RuntimeException(e);\n\t\t}\n\t}\n\t\n\tprivate static String sectionByVersion(String markdown, String version) {\n\t\tif (version.toUpperCase().endsWith(\"-HEAD\") || version.toUpperCase().endsWith(\"-EDGE\")) {\n\t\t\tversion = version.substring(0, version.length() - 5);\n\t\t}\n\t\t\n\t\tPattern p = Pattern.compile(\"(?is-m)^.*###\\\\s*v\" + version + \".*?\\n(.*?)(?:###\\\\s*v.*)?$\");\n\t\tMatcher m = p.matcher(markdown);\n\t\treturn m.matches() ? m.group(1) : null;\n\t}\n}"
  },
  {
    "path": "src/support/lombok/website/Domain.java",
    "content": "package lombok.website;\n\nimport java.net.MalformedURLException;\nimport java.net.URL;\n\npublic class Domain {\n\tprivate static final String DEFAULT = \"https://projectlombok.org/\";\n\tprivate final String prefix;\n\t\n\tpublic Domain(String arg) {\n\t\tif (arg == null || arg.isEmpty()) this.prefix = DEFAULT;\n\t\telse {\n\t\t\tif (!arg.contains(\"://\")) arg = \"https://\" + arg;\n\t\t\tif (!arg.endsWith(\"/\")) arg += \"/\";\n\t\t\tthis.prefix = arg;\n\t\t}\n\t}\n\t\n\tpublic String getPrefix() {\n\t\treturn prefix;\n\t}\n\t\n\tpublic URL url(String path) throws MalformedURLException {\n\t\treturn new URL(prefix + path);\n\t}\n}\n"
  },
  {
    "path": "src/support/lombok/website/FetchCurrentVersion.java",
    "content": "package lombok.website;\n\nimport java.io.BufferedReader;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\npublic class FetchCurrentVersion {\n\tprivate FetchCurrentVersion() {}\n\t\n\tprivate static final Pattern VERSION_PATTERN = Pattern.compile(\"^.*<\\\\s*span\\\\s+id\\\\s*=\\\\s*[\\\"'](currentVersion|currentVersionFull)[\\\"'](?:\\\\s+style\\\\s*=\\\\s*[\\\"']display\\\\s*:\\\\s*none;?[\\\"'])?\\\\s*>\\\\s*([^\\t<]+)\\\\s*<\\\\s*/\\\\s*span\\\\s*>.*$\");\n\t\n\tpublic static void main(String[] args) throws IOException {\n\t\tSystem.out.print(fetchVersionFromSite(args.length < 2 || args[1].equals(\"full\"), new Domain(args.length < 1 ? \"\" : args[0])));\n\t}\n\t\n\tpublic static String fetchVersionFromSite(boolean fetchFull, Domain domain) throws IOException {\n\t\tInputStream in = domain.url(\"download\").openStream();\n\t\ttry {\n\t\t\tBufferedReader br = new BufferedReader(new InputStreamReader(in, \"UTF-8\"));\n\t\t\ttry {\n\t\t\t\tfor (String line = br.readLine(); line != null; line = br.readLine()) {\n\t\t\t\t\tMatcher m = VERSION_PATTERN.matcher(line);\n\t\t\t\t\tif (m.matches() && m.group(1).equals(\"currentVersionFull\") == fetchFull) return m.group(2).replace(\"&quot;\", \"\\\"\");\n\t\t\t\t}\n\t\t\t\tthrow new IOException(\"Expected a span with id 'currentVersion'\");\n\t\t\t} finally {\n\t\t\t\tbr.close();\n\t\t\t}\n\t\t} finally {\n\t\t\tin.close();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/support/lombok/website/RunSite.java",
    "content": "package lombok.website;\n\nimport static spark.Spark.*;\n\nimport java.awt.Desktop;\nimport java.io.IOException;\nimport java.net.URI;\nimport java.nio.file.DirectoryStream;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.nio.file.Paths;\n\nimport spark.Request;\nimport spark.Response;\nimport spark.Route;\n\npublic class RunSite {\n\tprivate static final int DEFAULT_PORT = 4569;\n\tprivate final Path base;\n\t\n\tpublic RunSite(Path base) {\n\t\tthis.base = base;\n\t}\n\t\n\tpublic static void main(String[] args) throws Exception {\n\t\tboolean open = args.length > 1 && args[1].equals(\"open\");\n\t\tnew RunSite(Paths.get(args[0])).go(open);\n\t}\n\t\n\tprivate void go(boolean open) throws Exception {\n\t\tport(DEFAULT_PORT);\n\t\tget(\"/\", serve(\"index.html\"));\n\t\tget(\"/setup/overview\", serve(\"setup/index.html\"));\n\t\tget(\"/setup\", serve(\"setup/index.html\"));\n\t\tget(\"/features\", serve(\"features/index.html\"));\n\t\tget(\"/features/all\", serve(\"features/index.html\"));\n\t\tget(\"/features/experimental/all\", serve(\"features/experimental/index.html\"));\n\t\tget(\"/features/experimental\", serve(\"features/experimental/index.html\"));\n\t\t\n\t\tserveDir(\"/\", base);\n\t\t\n\t\tSystem.out.println(\"Serving page from \" + base + \" -- hit enter to stop\");\n\t\tif (open) Opener.open(\"http://localhost:\" + DEFAULT_PORT + \"/\");\n\t\tSystem.in.read();\n\t\tSystem.exit(0);\n\t}\n\t\n\tprivate void serveDir(String sub, Path dir) throws IOException {\n\t\tDirectoryStream<Path> ds = Files.newDirectoryStream(dir);\n\t\ttry {\n\t\t\tfor (Path c : ds) {\n\t\t\t\tString n = c.getFileName().toString();\n\t\t\t\tif (n.equals(\".\") || n.equals(\"..\")) continue;\n\t\t\t\tif (Files.isDirectory(c)) {\n\t\t\t\t\tserveDir(sub + n + \"/\", c);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tString rel = base.relativize(c).toString();\n\t\t\t\tget(sub + n, serve(rel));\n\t\t\t\tif (n.endsWith(\".html\")) get(sub + n.substring(0, n.length() - 5), serve(rel));\n\t\t\t}\n\t\t} finally {\n\t\t\tds.close();\n\t\t}\n\t}\n\t\n\tprivate static class Opener {\n\t\tpublic static void open(String url) throws Exception {\n\t\t\tDesktop.getDesktop().browse(new URI(url));\n\t\t}\n\t}\n\t\n\tprivate Route serve(final String path) {\n\t\tfinal Path tgt = base.resolve(path);\n\t\t\n\t\treturn new Route() {\n\t\t\t@Override public Object handle(Request req, Response res) throws Exception {\n\t\t\t\tres.type(mapMime(path));\n\t\t\t\treturn Files.readAllBytes(tgt);\n\t\t\t}\n\t\t};\n\t}\n\t\n\tprivate String mapMime(String path) {\n\t\tif (path.endsWith(\".css\")) return \"text/css; charset=UTF-8\";\n\t\tif (path.endsWith(\".js\")) return \"text/javascript; charset=UTF-8\";\n\t\tif (path.endsWith(\".png\")) return \"image/png\";\n\t\tif (path.endsWith(\".gif\")) return \"image/gif\";\n\t\tif (path.endsWith(\".jpg\")) return \"image/jpeg\";\n\t\tif (path.endsWith(\".mp4\")) return \"video/mp4\";\n\t\tif (path.endsWith(\".m4v\")) return \"video/mp4\";\n\t\tif (path.endsWith(\".ogv\")) return \"video/ogg\";\n\t\tif (path.endsWith(\".webm\")) return \"video/webm\";\n\t\tif (path.endsWith(\".ico\")) return \"image/x-icon\";\n\t\tif (path.endsWith(\".pdf\")) return \"application/pdf\";\n\t\tif (path.endsWith(\".json\")) return \"application/json\";\n\t\tif (path.endsWith(\".xml\")) return \"text/xml\";\n\t\tif (path.endsWith(\".woff\")) return \"font/woff\";\n\t\tif (path.endsWith(\".woff2\")) return \"font/woff2\";\n\t\tif (path.endsWith(\".html\")) return \"text/html; charset=UTF-8\";\n\t\treturn \"text/plain; charset=UTF-8\";\n\t}\n}\n"
  },
  {
    "path": "src/support/lombok/website/WebsiteMaker.java",
    "content": "/*\n * Copyright (C) 2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.website;\n\nimport java.io.BufferedReader;\nimport java.io.BufferedWriter;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.io.OutputStreamWriter;\nimport java.io.Writer;\nimport java.lang.reflect.Method;\nimport java.text.SimpleDateFormat;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Calendar;\nimport java.util.Date;\nimport java.util.GregorianCalendar;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.Map;\nimport java.util.TimeZone;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\nimport de.java2html.Java2Html;\nimport freemarker.cache.FileTemplateLoader;\nimport freemarker.cache.TemplateLoader;\nimport freemarker.core.HTMLOutputFormat;\nimport freemarker.template.Configuration;\nimport freemarker.template.Template;\nimport freemarker.template.TemplateExceptionHandler;\n\npublic class WebsiteMaker {\n\tprivate final String version, fullVersion;\n\tprivate final File baseDir, outputDir;\n\t\n\tpublic WebsiteMaker(String version, String fullVersion, File baseDir, File outputDir) {\n\t\tthis.version = version;\n\t\tthis.fullVersion = fullVersion;\n\t\tthis.baseDir = baseDir;\n\t\tthis.outputDir = outputDir;\n\t}\n\t\n\tprivate static final class VersionFinder {\n\t\tpublic static String getVersion() {\n\t\t\treturn getVersion0(\"getVersion\");\n\t\t}\n\t\t\n\t\tpublic static String getFullVersion() {\n\t\t\treturn getVersion0(\"getFullVersion\");\n\t\t}\n\t\t\n\t\tprivate static String getVersion0(String mName) {\n\t\t\ttry {\n\t\t\t\tClass<?> c = Class.forName(\"lombok.core.Version\");\n\t\t\t\tMethod m = c.getMethod(mName);\n\t\t\t\treturn (String) m.invoke(null);\n\t\t\t} catch (ClassNotFoundException e) {\n\t\t\t\tSystem.err.println(\"You need to specify the version string, and the full version string, as first 2 arguments.\");\n\t\t\t\tSystem.exit(1);\n\t\t\t\treturn null;\n\t\t\t} catch (Exception e) {\n\t\t\t\tif (e instanceof RuntimeException) throw (RuntimeException) e;\n\t\t\t\tthrow new RuntimeException(e);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate static void printAllVersions(Domain domain) throws Exception {\n\t\tList<List<String>> versions = readAllVersions(domain);\n\t\tfor (List<String> v : versions) {\n\t\t\tSystem.out.println(\" <a href=\\\"\" + v.get(1) + \"\\\">\" + v.get(0) + \"</a>\");\n\t\t}\n\t}\n\t\n\tprivate static void buildAll(Domain domain, String version, String fullVersion, String argIn, String argOut, boolean newRelease) throws Exception {\n\t\tFile in, out;\n\t\tif (argIn == null) {\n\t\t\tin = new File(\".\");\n\t\t\tif (new File(in, \"build.xml\").isFile() && new File(in, \"website\").isDirectory()) in = new File(in, \"website\");\n\t\t} else {\n\t\t\tin = new File(argIn);\n\t\t}\n\t\t\n\t\tif (argOut == null) {\n\t\t\tif (new File(\"./build.xml\").isFile() && new File(\"./website\").isDirectory() && new File(\"./build\").isDirectory()) {\n\t\t\t\tout = new File(\"./build/website\");\n\t\t\t} else {\n\t\t\t\tout = new File(in, \"output\");\n\t\t\t}\n\t\t} else {\n\t\t\tout = new File(argOut);\n\t\t}\n\t\tWebsiteMaker maker = new WebsiteMaker(version, fullVersion, in, out);\n\t\tmaker.buildWebsite(domain, newRelease);\n\t}\n\t\n\tprivate static void buildChangelog(String version, String fullVersion, String argIn, String argOut) throws Exception {\n\t\tFile in, out;\n\t\tif (argIn == null) {\n\t\t\tin = new File(\".\");\n\t\t\tif (new File(in, \"build.xml\").isFile() && new File(in, \"website\").isDirectory()) in = new File(in, \"website\");\n\t\t} else {\n\t\t\tin = new File(argIn);\n\t\t}\n\t\t\n\t\tif (argOut == null) {\n\t\t\tif (new File(\"./build.xml\").isFile() && new File(\"./website\").isDirectory() && new File(\"./build\").isDirectory()) {\n\t\t\t\tout = new File(\"./build/website/changelog.html\");\n\t\t\t} else {\n\t\t\t\tout = new File(in, \"output/changelog.html\");\n\t\t\t}\n\t\t} else {\n\t\t\tout = new File(argOut);\n\t\t}\n\t\tWebsiteMaker maker = new WebsiteMaker(version, fullVersion, in, out.getParentFile());\n\t\tmaker.buildChangelog(out);\n\t}\n\t\n\tprivate static void buildDownloadEdge(String version, String fullVersion, String argIn, String argOut) throws Exception {\n\t\tFile in, out;\n\t\tif (argIn == null) {\n\t\t\tin = new File(\".\");\n\t\t\tif (new File(in, \"build.xml\").isFile() && new File(in, \"website\").isDirectory()) in = new File(in, \"website\");\n\t\t} else {\n\t\t\tin = new File(argIn);\n\t\t}\n\t\t\n\t\tif (argOut == null) {\n\t\t\tif (new File(\"./build.xml\").isFile() && new File(\"./website\").isDirectory() && new File(\"./build\").isDirectory()) {\n\t\t\t\tout = new File(\"./build/website-edge/download-edge.html\");\n\t\t\t} else {\n\t\t\t\tout = new File(in, \"output/download-edge.html\");\n\t\t\t}\n\t\t} else {\n\t\t\tout = new File(argOut);\n\t\t}\n\t\tWebsiteMaker maker = new WebsiteMaker(version, fullVersion, in, out.getParentFile());\n\t\tmaker.buildDownloadEdge(out);\n\t}\n\t\n\tprivate static void buildChangelogLatest(String version, String fullVersion, String argIn, String argOut) throws Exception {\n\t\tFile in, out;\n\t\tif (argIn == null) {\n\t\t\tin = new File(\".\");\n\t\t\tif (new File(in, \"build.xml\").isFile() && new File(in, \"website\").isDirectory()) in = new File(in, \"website\");\n\t\t} else {\n\t\t\tin = new File(argIn);\n\t\t}\n\t\t\n\t\tif (argOut == null) {\n\t\t\tif (new File(\"./build.xml\").isFile() && new File(\"./website\").isDirectory() && new File(\"./build\").isDirectory()) {\n\t\t\t\tout = new File(\"./build/latestchanges.html\");\n\t\t\t} else {\n\t\t\t\tout = new File(in, \"output/latestchanges.html\");\n\t\t\t}\n\t\t} else {\n\t\t\tout = new File(argOut);\n\t\t}\n\t\tWebsiteMaker maker = new WebsiteMaker(version, fullVersion, in, out.getParentFile());\n\t\tmaker.buildChangelogLatest(out);\n\t}\n\t\n\tpublic static void main(String[] args) throws Exception {\n\t\tString version, fullVersion;\n\t\tDomain domain = new Domain(args.length < 1 ? \"\" : args[0]);\n\t\t\n\t\tif (args.length < 3) {\n\t\t\tversion = VersionFinder.getVersion();\n\t\t\tfullVersion = VersionFinder.getFullVersion();\n\t\t} else {\n\t\t\tversion = args[1];\n\t\t\tfullVersion = args[2];\n\t\t}\n\t\t\n\t\tString argIn = args.length < 5 ? null : args[4];\n\t\tString argOut = args.length < 6 ? null : args[5];\n\t\tif (args.length < 4 || args[3].equalsIgnoreCase(\"all\")) {\n\t\t\tbuildAll(domain, version, fullVersion, argIn, argOut, false);\n\t\t} else if (args.length < 4 || args[3].equalsIgnoreCase(\"all-newrelease\")) {\n\t\t\tbuildAll(domain, version, fullVersion, argIn, argOut, true);\n\t\t} else if (args[3].equalsIgnoreCase(\"changelog\")) {\n\t\t\tbuildChangelog(version, fullVersion, argIn, argOut);\n\t\t} else if (args[3].equalsIgnoreCase(\"download-edge\")) {\n\t\t\tbuildDownloadEdge(version, fullVersion, argIn, argOut);\n\t\t} else if (args[3].equalsIgnoreCase(\"changelog-latest\")) {\n\t\t\tbuildChangelogLatest(version, fullVersion, argIn, argOut);\n\t\t} else if (args[3].equalsIgnoreCase(\"print-allversions\")) {\n\t\t\tprintAllVersions(domain);\n\t\t} else {\n\t\t\tthrow new IllegalArgumentException(\"4th argument must be one of 'all', 'changelog', 'download-edge', 'changelog-latest'\");\n\t\t}\n\t}\n\t\n\tprivate Configuration makeFreemarkerConfig() throws IOException {\n\t\tConfiguration freemarkerConfig = new Configuration(Configuration.VERSION_2_3_25);\n\t\tfreemarkerConfig.setEncoding(Locale.ENGLISH, \"UTF-8\");\n\t\tfreemarkerConfig.setOutputEncoding(\"UTF-8\");\n\t\tfreemarkerConfig.setOutputFormat(HTMLOutputFormat.INSTANCE);\n\t\tfreemarkerConfig.setTemplateLoader(createLoader());\n\t\tfreemarkerConfig.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);\n\t\treturn freemarkerConfig;\n\t}\n\t\n\tpublic void buildChangelog(File out) throws Exception {\n\t\tConfiguration freemarkerConfig = makeFreemarkerConfig();\n\t\toutputDir.mkdirs();\n\t\tconvertChangelog(freemarkerConfig, out);\n\t}\n\t\n\tpublic void buildChangelogLatest(File out) throws Exception {\n\t\toutputDir.mkdirs();\n\t\tString htmlForLatest = CompileChangelog.getHtmlForLatest(baseDir.getParentFile(), version);\n\t\tFileOutputStream fos = new FileOutputStream(out);\n\t\ttry {\n\t\t\tBufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos, \"UTF-8\"));\n\t\t\tbw.write(htmlForLatest);\n\t\t\tbw.close();\n\t\t} finally {\n\t\t\tfos.close();\n\t\t}\n\t}\n\t\n\tpublic void buildDownloadEdge(File out) throws Exception {\n\t\tConfiguration freemarkerConfig = makeFreemarkerConfig();\n\t\t\n\t\toutputDir.mkdirs();\n\t\tconvertDownloadEdge(freemarkerConfig, out);\n\t}\n\t\n\tpublic void buildHtAccess(File out) throws Exception {\n\t\tConfiguration freemarkerConfig = new Configuration(Configuration.VERSION_2_3_25);\n\t\tfreemarkerConfig.setEncoding(Locale.ENGLISH, \"UTF-8\");\n\t\tfreemarkerConfig.setOutputEncoding(\"UTF-8\");\n\t\tfreemarkerConfig.setOutputFormat(HTMLOutputFormat.INSTANCE);\n\t\tfreemarkerConfig.setTemplateLoader(createLoader(\"extra\"));\n\t\tfreemarkerConfig.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);\n\t\t\n\t\toutputDir.mkdirs();\n\t\tconvertHtAccess(freemarkerConfig, out);\n\t}\n\t\n\tpublic void buildWebsite(Domain domain, boolean newRelease) throws Exception {\n\t\tConfiguration freemarkerConfig = makeFreemarkerConfig();\n\t\t\n\t\toutputDir.mkdirs();\n\t\tconvertTemplates(domain, freemarkerConfig, newRelease);\n\t\tbuildHtAccess(new File(outputDir, \".htaccess\"));\n\t}\n\t\n\tprivate TemplateLoader createLoader() throws IOException {\n\t\treturn createLoader(\"templates\");\n\t}\n\t\n\tprivate TemplateLoader createLoader(String base) throws IOException {\n\t\treturn new FileTemplateLoader(new File(baseDir, base));\n\t}\n\t\n\tprivate void convertHtAccess(Configuration freemarker, File outFile) throws Exception {\n\t\tMap<String, Object> dataModel = new HashMap<String, Object>();\n\t\tdataModel.put(\"setupPages\", listHtmlNames(new File(outputDir, \"setup\")));\n\t\tdataModel.put(\"featurePages\", listHtmlNames(new File(outputDir, \"features\")));\n\t\tdataModel.put(\"experimentalPages\", listHtmlNames(new File(outputDir, \"features/experimental\")));\n\t\tTemplate template = freemarker.getTemplate(\"htaccess\");\n\t\tFileOutputStream fileOut = new FileOutputStream(outFile);\n\t\ttry {\n\t\t\tWriter wr = new BufferedWriter(new OutputStreamWriter(fileOut, \"UTF-8\"));\n\t\t\ttemplate.process(dataModel, wr);\n\t\t\twr.close();\n\t\t} finally {\n\t\t\tfileOut.close();\n\t\t}\n\t}\n\t\n\tprivate List<String> listHtmlNames(File dir) {\n\t\tList<String> out = new ArrayList<String>();\n\t\tfor (String s : dir.list()) {\n\t\t\tif (s.endsWith(\".html\") && !s.equals(\"index.html\")) out.add(s.substring(0, s.length() - 5));\n\t\t}\n\t\treturn out;\n\t}\n\t\n\tprivate void convertChangelog(Configuration freemarker, File outFile) throws Exception {\n\t\tMap<String, Object> dataModel = createBasicDataModel();\n\t\t\n\t\tTemplate template = freemarker.getTemplate(\"changelog.html\");\n\t\tFileOutputStream fileOut = new FileOutputStream(outFile);\n\t\ttry {\n\t\t\tWriter wr = new BufferedWriter(new OutputStreamWriter(fileOut, \"UTF-8\"));\n\t\t\ttemplate.process(dataModel, wr);\n\t\t\twr.close();\n\t\t} finally {\n\t\t\tfileOut.close();\n\t\t}\n\t}\n\t\n\tprivate void convertDownloadEdge(Configuration freemarker, File outFile) throws Exception {\n\t\tMap<String, Object> dataModel = createBasicDataModel();\n\t\t\n\t\tTemplate template = freemarker.getTemplate(\"_download-edge.html\");\n\t\tFileOutputStream fileOut = new FileOutputStream(outFile);\n\t\ttry {\n\t\t\tWriter wr = new BufferedWriter(new OutputStreamWriter(fileOut, \"UTF-8\"));\n\t\t\ttemplate.process(dataModel, wr);\n\t\t\twr.close();\n\t\t} finally {\n\t\t\tfileOut.close();\n\t\t}\n\t}\n\t\n\tprivate void convertTemplates(Domain domain, Configuration freemarker, boolean newRelease) throws Exception {\n\t\tFile basePagesLoc = new File(baseDir, \"templates\");\n\t\tMap<String, Object> dataModel = createBasicDataModel();\n\t\tdataModel.putAll(createExtendedDataModel(domain, newRelease));\n\t\tconvertTemplates_(freemarker, \"\", basePagesLoc, outputDir, 0, dataModel);\n\t}\n\t\n\tprivate void convertTemplates_(Configuration freemarker, String prefix, File from, File to, int depth, Map<String, Object> dataModel) throws Exception {\n\t\tif (depth > 50) throw new IllegalArgumentException(\"50 levels is too deep: \" + from);\n\t\t\n\t\tfor (File f : from.listFiles()) {\n\t\t\tif (f.isDirectory()) convertTemplates_(freemarker, prefix + f.getName() + \"/\", f, new File(to, f.getName()), depth + 1, dataModel);\n\t\t\tif (!f.isFile() || f.getName().startsWith(\"_\")) continue;\n\t\t\tto.mkdirs();\n\t\t\tTemplate template = freemarker.getTemplate(prefix + f.getName());\n\t\t\tFileOutputStream fileOut = new FileOutputStream(new File(to, f.getName()));\n\t\t\ttry {\n\t\t\t\tWriter wr = new BufferedWriter(new OutputStreamWriter(fileOut, \"UTF-8\"));\n\t\t\t\ttemplate.process(dataModel, wr);\n\t\t\t\twr.close();\n\t\t\t} finally {\n\t\t\t\tfileOut.close();\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate Map<String, Object> createBasicDataModel() throws IOException {\n\t\tMap<String, Object> data = new HashMap<String, Object>();\n\t\t\n\t\tSimpleDateFormat sdf = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss 'UTC'\");\n\t\tsdf.setTimeZone(TimeZone.getTimeZone(\"UTC\"));\n\t\tString currentTime = sdf.format(new Date());\n\t\t\n\t\tdata.put(\"version\", version);\n\t\tdata.put(\"fullVersion\", fullVersion);\n\t\tdata.put(\"timestampString\", currentTime);\n\t\tdata.put(\"year\", \"\" + new GregorianCalendar().get(Calendar.YEAR));\n\t\tdata.put(\"changelog\", CompileChangelog.getHtmlStartingAtSection(baseDir.getParentFile(), version));\n\t\tdata.put(\"changelogEdge\", CompileChangelog.getHtmlForEdge(baseDir.getParentFile(), version));\n\t\t\n\t\treturn data;\n\t}\n\t\n\tprivate static final Pattern LOMBOK_LINK = Pattern.compile(\"^.*<a(?: (?:id|class|rel|rev|download|target|type)(?:=\\\"[^\\\"]*\\\")?)* href=\\\"(downloads/[^\\\"]+)\\\"(?: (?:id|class|rel|rev|download|target|type)(?:=\\\"[^\\\"]*\\\")?)*>([^<]+)</a>.*$\");\n\tprivate Map<String, Object> createExtendedDataModel(Domain domain, boolean newRelease) throws IOException {\n\t\tMap<String, Object> data = new HashMap<String, Object>();\n\t\t\n\t\tdata.put(\"usages\", new HtmlMaker(new File(baseDir, \"usageExamples\")));\n\t\tList<List<String>> allVersions = readAllVersions(domain);\n\t\tif (!newRelease && !allVersions.isEmpty()) allVersions.remove(0); // remove current version; it will be 're-added' as current version automatically.\n\t\tdata.put(\"linksToVersions\", allVersions);\n\t\t\n\t\treturn data;\n\t}\n\t\n\tprivate static List<List<String>> readAllVersions(Domain domain) throws IOException {\n\t\tInputStream in = domain.url(\"all-versions\").openStream();\n\t\tArrayList<List<String>> links = new ArrayList<List<String>>();\n\t\ttry {\n\t\t\tBufferedReader br = new BufferedReader(new InputStreamReader(in, \"UTF-8\"));\n\t\t\tfor (String line = br.readLine(); line != null; line = br.readLine()) {\n\t\t\t\tMatcher m = LOMBOK_LINK.matcher(line);\n\t\t\t\tif (m.matches()) {\n\t\t\t\t\tString url = m.group(1);\n\t\t\t\t\tString name = m.group(2);\n\t\t\t\t\tif (name.endsWith(\" [Current Version]\")) {\n\t\t\t\t\t\tname = \"lombok-\" + name.substring(0, name.length() - \" [Current Version]\".length()) + \".jar\";\n\t\t\t\t\t\turl = url.replace(\"lombok.jar\", name);\n\t\t\t\t\t}\n\t\t\t\t\tlinks.add(Arrays.asList(name, url));\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tin.close();\n\t\t}\n\t\t\n\t\treturn links;\n\t}\n\t\n\tpublic static class HtmlMaker {\n\t\tprivate final File usagesDir;\n\t\t\n\t\tHtmlMaker(File usagesDir) {\n\t\t\tthis.usagesDir = usagesDir;\n\t\t}\n\t\t\n\t\tpublic String pre(String name) throws IOException {\n\t\t\treturn convert(new File(usagesDir, name + \"Example_pre.jpage\"));\n\t\t}\n\t\t\n\t\tpublic String post(String name) throws IOException {\n\t\t\treturn convert(new File(usagesDir, name + \"Example_post.jpage\"));\n\t\t}\n\t\t\n\t\tpublic String convert(File file) throws IOException {\n\t\t\tString rawJava = readFully(file);\n\t\t\treturn Java2Html.convertToHtml(rawJava);\n\t\t}\n\t}\n\t\n\tpublic static String readFully(File file) throws IOException {\n\t\tFileInputStream fis = new FileInputStream(file);\n\t\ttry {\n\t\t\tInputStreamReader isr = new InputStreamReader(fis, \"UTF-8\");\n\t\t\tStringBuilder out = new StringBuilder();\n\t\t\tchar[] b = new char[65536];\n\t\t\twhile (true) {\n\t\t\t\tint r = isr.read(b);\n\t\t\t\tif (r == -1) break;\n\t\t\t\tout.append(b, 0, r);\n\t\t\t}\n\t\t\treturn out.toString();\n\t\t} finally {\n\t\t\tfis.close();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/utils/lombok/core/ClassLiteral.java",
    "content": "/*\n * Copyright (C) 2018 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\npublic class ClassLiteral {\n\tprivate final String className;\n\t\n\tpublic ClassLiteral(String className) {\n\t\tthis.className = className;\n\t}\n\t\n\tpublic String getClassName() {\n\t\treturn className;\n\t}\n}\n"
  },
  {
    "path": "src/utils/lombok/core/FieldAugment.java",
    "content": "/*\n * Copyright (C) 2014 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\nimport java.lang.ref.WeakReference;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.Modifier;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.WeakHashMap;\n\nimport lombok.permit.Permit;\n\npublic abstract class FieldAugment<T, F> {\n\tprivate static Object getDefaultValue(Class<?> type) {\n\t\tif (type == boolean.class) return false;\n\t\tif (type == int.class) return 0;\n\t\tif (!type.isPrimitive()) return null;\n\t\t\n\t\tif (type == long.class) return 0L;\n\t\tif (type == short.class) return (short) 0;\n\t\tif (type == byte.class) return (byte) 0;\n\t\tif (type == char.class) return '\\0';\n\t\tif (type == float.class) return 0.0F;\n\t\tif (type == double.class) return 0.0D;\n\t\t\n\t\t// We can't get here unless java added some primitive types, but, hey.\n\t\treturn null;\n\t}\n\t\n\t/**\n\t * (Virtually) adds a field to an existing type and returns an object that can be used to read and write this field.\n\t * <p>\n\t * If the type already declares a non-final instance field with the given name and a compatible field type, that field will be used.\n\t * Otherwise the field will be provided virtually.\n\t * <p>\n\t * <em>WARNING</em>: The values put into the augment should NOT reference in any way the object you've added the augment to, or memory leaks may occur.\n\t * If you do need to add such references, use {@link #circularSafeAugment(Class, Class, String, Object)} instead.\n\t * <p>\n\t * This code assumes that for any combination of {@code type} and {@code name} this method is only called once.\n\t * Otherwise, whether state is shared is undefined.\n\t * \n\t * @param type to augment\n\t * @param fieldType type of the field\n\t * @param name of the field\n\t * @param defaultValue the value of the augment if it hasn't been set yet.\n\t * @throws NullPointerException if {@code type}, {@code fieldType} or {@code name} is {@code null}\n\t */\n\tpublic static <T, F> FieldAugment<T, F> augment(Class<T> type, Class<? super F> fieldType, String name) {\n\t\tcheckNotNull(type, \"type\");\n\t\tcheckNotNull(fieldType, \"fieldType\");\n\t\tcheckNotNull(name, \"name\");\n\t\t\n\t\tif (type.isInterface()) {\n\t\t\treturn new InterfaceFieldAugment<T, F>(name, fieldType);\n\t\t}\n\t\t\n\t\t@SuppressWarnings(\"unchecked\")\n\t\tF defaultValue = (F) getDefaultValue(fieldType);\n\t\tFieldAugment<T, F> ret = tryCreateReflectionAugment(type, fieldType, name, defaultValue);\n\t\treturn ret != null ? ret : new MapFieldAugment<T, F>(defaultValue);\n\t}\n\t\n\t/**\n\t * (Virtually) adds a field to an existing type and returns an object that can be used to read and write this field.\n\t * <p>\n\t * This method does the same as {@link #augment(Class, Class, String, Object)}, except it is safe to set values that reference back to their containing object.\n\t */\n\tpublic static <T, F> FieldAugment<T, F> circularSafeAugment(Class<T> type, Class<? super F> fieldType, String name) {\n\t\tcheckNotNull(type, \"type\");\n\t\tcheckNotNull(fieldType, \"fieldType\");\n\t\tcheckNotNull(name, \"name\");\n\t\t\n\t\t@SuppressWarnings(\"unchecked\")\n\t\tF defaultValue = (F) getDefaultValue(fieldType);\n\t\tFieldAugment<T, F> ret = tryCreateReflectionAugment(type, fieldType, name, defaultValue);\n\t\treturn ret != null ? ret : new MapWeakFieldAugment<T, F>(defaultValue);\n\t}\n\t\n\t/**\n\t * Creates a reflection-based augment which will directly access the listed field name. If this field does not exist or the field\n\t * is not capable of storing the requested type, {@code null} is returned instead.\n\t */\n\tprivate static <T, F> FieldAugment<T, F> tryCreateReflectionAugment(Class<T> type, Class<? super F> fieldType, String name, F defaultValue) {\n\t\tField f = findField(type, fieldType, name);\n\t\tif (f != null && typeIsAssignmentCompatible(f.getType(), fieldType)) return new ReflectionFieldAugment<T, F>(f, fieldType, defaultValue);\n\t\treturn null;\n\t}\n\t\n\tprivate static Field findField(Class<?> type, Class<?> wantedType, String name) {\n\t\ttry {\n\t\t\tField f = Permit.getField(type, name);\n\t\t\tif (Modifier.isStatic(f.getModifiers()) || Modifier.isFinal(f.getModifiers())) return null;\n\t\t\tif (!typeIsAssignmentCompatible(f.getType(), wantedType)) return null;\n\t\t\treturn f;\n\t\t} catch (Exception e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tprivate static boolean typeIsAssignmentCompatible(Class<?> fieldType, Class<?> wantedType) {\n\t\tif (fieldType == java.lang.Object.class) return true;\n\t\tif (fieldType == wantedType) return true;\n\t\t\n\t\tif (fieldType.isPrimitive()) return fieldType == wantedType;\n\t\tif (wantedType == int.class && (fieldType == Number.class || fieldType == Integer.class)) return true;\n\t\tif (wantedType == long.class && (fieldType == Number.class || fieldType == Long.class)) return true;\n\t\tif (wantedType == short.class && (fieldType == Number.class || fieldType == Short.class)) return true;\n\t\tif (wantedType == byte.class && (fieldType == Number.class || fieldType == Byte.class)) return true;\n\t\tif (wantedType == char.class && (fieldType == Number.class || fieldType == Character.class)) return true;\n\t\tif (wantedType == float.class && (fieldType == Number.class || fieldType == Float.class)) return true;\n\t\tif (wantedType == double.class && (fieldType == Number.class || fieldType == Double.class)) return true;\n\t\tif (wantedType == boolean.class && fieldType == Boolean.class) return true;\n\t\t\n\t\treturn fieldType.isAssignableFrom(wantedType);\n\t}\n\t\n\tprivate FieldAugment() {\n\t\t// prevent external instantiation\n\t}\n\t\n\t/**\n\t * @throws NullPointerException if {@code object} is {@code null}\n\t */\n\tpublic abstract F get(T object);\n\t\n\t/**\n\t * @throws NullPointerException if {@code object} or {@code value} is {@code null}\n\t */\n\tpublic final void set(T object, F value) {\n\t\tgetAndSet(object, value);\n\t}\n\t\n\t/**\n\t * @return the value of the field <strong>before</strong> the operation.\n\t * @throws NullPointerException if {@code object} or {@code value} is {@code null}.\n\t */\n\tpublic abstract F getAndSet(T object, F value);\n\t\n\t/**\n\t * @return the value of the field <strong>before</strong> the operation.\n\t * @throws NullPointerException if {@code object} is {@code null}\n\t */\n\tpublic abstract F clear(T object);\n\t\n\t/**\n\t * @return the value of the field <strong>after</strong> the operation. If the value was equal to {@code expected} or already cleared {@code null}, otherwise the current value.\n\t * @throws NullPointerException if {@code object} or {@code expected} is {@code null}\n\t */\n\tpublic abstract F compareAndClear(T object, F expected);\n\t\n\t/**\n\t * @return the value of the field <strong>after</strong> the operation.\n\t * @throws NullPointerException if {@code object} or {@code value} is {@code null}\n\t */\n\tpublic abstract F setIfAbsent(T object, F value);\n\t\n\t/**\n\t * @return the value of the field <strong>after</strong> the operation.\n\t * @throws NullPointerException if {@code object}, {@code expected} or {@code value} is {@code null}\n\t */\n\tpublic abstract F compareAndSet(T object, F expected, F value);\n\t\n\tprivate static final class InterfaceFieldAugment<T, F> extends FieldAugment<T, F> {\n\t\tprivate final String name;\n\t\tprivate final Class<? super F> fieldType;\n\t\t\n\t\tprivate Map<Class<T>, FieldAugment<T, F>> map = new HashMap<Class<T>, FieldAugment<T,F>>();\n\t\t\n\t\tprivate InterfaceFieldAugment(String name, Class<? super F> fieldType) {\n\t\t\tthis.name = name;\n\t\t\tthis.fieldType = fieldType;\n\t\t}\n\t\t\n\t\tprivate synchronized FieldAugment<T, F> getDelegate(T object) {\n\t\t\t@SuppressWarnings(\"unchecked\")\n\t\t\tClass<T> c = (Class<T>) object.getClass();\n\t\t\t\n\t\t\tFieldAugment<T,F> fieldAugment = map.get(c);\n\t\t\tif (fieldAugment == null) {\n\t\t\t\tfieldAugment = augment(c, fieldType, name);\n\t\t\t\tmap.put(c, fieldAugment);\n\t\t\t}\n\t\t\treturn fieldAugment;\n\t\t}\n\t\t\n\t\t@Override public F get(T object) {\n\t\t\treturn getDelegate(object).get(object);\n\t\t}\n\t\t\n\t\t@Override public F getAndSet(T object, F value) {\n\t\t\treturn getDelegate(object).getAndSet(object, value);\n\t\t}\n\t\t\n\t\t@Override public F clear(T object) {\n\t\t\treturn getDelegate(object).clear(object);\n\t\t}\n\t\t\n\t\t@Override public F compareAndClear(T object, F expected) {\n\t\t\treturn getDelegate(object).compareAndClear(object, expected);\n\t\t}\n\t\t\n\t\t@Override public F setIfAbsent(T object, F value) {\n\t\t\treturn getDelegate(object).setIfAbsent(object, value);\n\t\t}\n\t\t\n\t\t@Override public F compareAndSet(T object, F expected, F value) {\n\t\t\treturn getDelegate(object).compareAndSet(object, expected, value);\n\t\t}\n\t}\n\n\tprivate static class ReflectionFieldAugment<T, F> extends FieldAugment<T, F> {\n\t\tprivate final Object lock = new Object();\n\t\tprivate final Field field;\n\t\tprivate final Class<F> targetType;\n\t\tprivate final F defaultValue;\n\t\t\n\t\t@SuppressWarnings(\"unchecked\")\n\t\tReflectionFieldAugment(Field field, Class<? super F> targetType, F defaultValue) {\n\t\t\tthis.field = field;\n\t\t\tthis.targetType = (Class<F>) targetType;\n\t\t\tthis.defaultValue = defaultValue;\n\t\t}\n\t\t\n\t\t@Override public F get(T object) {\n\t\t\tcheckNotNull(object, \"object\");\n\t\t\ttry {\n\t\t\t\tF value;\n\t\t\t\tsynchronized (lock) {\n\t\t\t\t\tvalue = targetType.cast(field.get(object));\n\t\t\t\t}\n\t\t\t\treturn value == null ? defaultValue : value;\n\t\t\t} catch (IllegalAccessException e) {\n\t\t\t\tthrow new IllegalStateException(e);\n\t\t\t}\n\t\t}\n\t\t\n\t\t@Override public F getAndSet(T object, F value) {\n\t\t\tcheckNotNull(object, \"object\");\n\t\t\tcheckNotNull(value, \"value\");\n\t\t\ttry {\n\t\t\t\tF oldValue;\n\t\t\t\tsynchronized (lock) {\n\t\t\t\t\toldValue = targetType.cast(field.get(object));\n\t\t\t\t\tfield.set(object, value);\n\t\t\t\t}\n\t\t\t\treturn oldValue == null ? defaultValue : oldValue;\n\t\t\t} catch (IllegalAccessException e) {\n\t\t\t\tthrow new IllegalStateException(e);\n\t\t\t}\n\t\t}\n\t\t\n\t\t@Override public F clear(T object) {\n\t\t\tcheckNotNull(object, \"object\");\n\t\t\ttry {\n\t\t\t\tF oldValue;\n\t\t\t\tsynchronized (lock) {\n\t\t\t\t\toldValue = targetType.cast(field.get(object));\n\t\t\t\t\tfield.set(object, defaultValue);\n\t\t\t\t}\n\t\t\t\treturn oldValue == null ? defaultValue : oldValue;\n\t\t\t} catch (IllegalAccessException e) {\n\t\t\t\tthrow new IllegalStateException(e);\n\t\t\t}\n\t\t}\n\t\t\n\t\t@Override public F compareAndClear(T object, F expected) {\n\t\t\tcheckNotNull(object, \"object\");\n\t\t\tcheckNotNull(expected, \"expected\");\n\t\t\ttry {\n\t\t\t\tF oldValue;\n\t\t\t\tsynchronized (lock) {\n\t\t\t\t\toldValue = targetType.cast(field.get(object));\n\t\t\t\t\tif (expected.equals(oldValue)) {\n\t\t\t\t\t\tfield.set(object, defaultValue);\n\t\t\t\t\t\treturn defaultValue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn oldValue;\n\t\t\t} catch (IllegalAccessException e) {\n\t\t\t\tthrow new IllegalStateException(e);\n\t\t\t}\n\t\t}\n\t\t\n\t\t@Override public F setIfAbsent(T object, F value) {\n\t\t\tcheckNotNull(object, \"object\");\n\t\t\tcheckNotNull(value, \"value\");\n\t\t\ttry {\n\t\t\t\tsynchronized (lock) {\n\t\t\t\t\tF oldValue = targetType.cast(field.get(object));\n\t\t\t\t\tif (oldValue != null && !oldValue.equals(defaultValue)) return oldValue;\n\t\t\t\t\tfield.set(object, value);\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t} catch (IllegalAccessException e) {\n\t\t\t\tthrow new IllegalStateException(e);\n\t\t\t}\n\t\t}\n\t\t\n\t\t@Override public F compareAndSet(T object, F expected, F value) {\n\t\t\tcheckNotNull(object, \"object\");\n\t\t\tcheckNotNull(expected, \"expected\");\n\t\t\tcheckNotNull(value, \"value\");\n\t\t\ttry {\n\t\t\t\tsynchronized (lock) {\n\t\t\t\t\tF oldValue = targetType.cast(field.get(object));\n\t\t\t\t\tif (!expected.equals(oldValue)) return oldValue == null ? defaultValue : oldValue;\n\t\t\t\t\tfield.set(object, value);\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t} catch (IllegalAccessException e) {\n\t\t\t\tthrow new IllegalStateException(e);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate static class MapFieldAugment<T, F> extends FieldAugment<T, F> {\n\t\tfinal Map<T, Object> values = new WeakHashMap<T, Object>();\n\t\tfinal F defaultValue;\n\t\t\n\t\tMapFieldAugment(F defaultValue) {\n\t\t\tthis.defaultValue = defaultValue;\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic F get(T object) {\n\t\t\tcheckNotNull(object, \"object\");\n\t\t\tsynchronized (values) {\n\t\t\t\treturn read(object);\n\t\t\t}\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic F getAndSet(T object, F value) {\n\t\t\tcheckNotNull(object, \"object\");\n\t\t\tcheckNotNull(value, \"value\");\n\t\t\tsynchronized (values) {\n\t\t\t\tF result = read(object);\n\t\t\t\twrite(object, value);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic F clear(T object) {\n\t\t\tcheckNotNull(object, \"object\");\n\t\t\tsynchronized (values) {\n\t\t\t\tF result = read(object);\n\t\t\t\tvalues.remove(object);\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic F compareAndClear(T object, F expected) {\n\t\t\tcheckNotNull(object, \"object\");\n\t\t\tcheckNotNull(expected, \"expected\");\n\t\t\tsynchronized (values) {\n\t\t\t\tF result = read(object);\n\t\t\t\tif (result == null) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tif (!expected.equals(result)) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\tvalues.remove(object);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic F setIfAbsent(T object, F value) {\n\t\t\tcheckNotNull(object, \"object\");\n\t\t\tcheckNotNull(value, \"value\");\n\t\t\tsynchronized (values) {\n\t\t\t\tF result = read(object);\n\t\t\t\tif (result != null) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\twrite(object, value);\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic F compareAndSet(T object, F expected, F value) {\n\t\t\tcheckNotNull(object, \"object\");\n\t\t\tcheckNotNull(expected, \"expected\");\n\t\t\tcheckNotNull(value, \"value\");\n\t\t\tsynchronized (values) {\n\t\t\t\tF result = read(object);\n\t\t\t\tif (!expected.equals(result)) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\twrite(object, value);\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t\t\n\t\t@SuppressWarnings(\"unchecked\")\n\t\tF read(T object) {\n\t\t\tF value = (F) values.get(object);\n\t\t\treturn value == null ? defaultValue : value;\n\t\t}\n\t\t\n\t\tvoid write(T object, F value) {\n\t\t\tvalues.put(object, value);\n\t\t}\n\t}\n\t\n\tstatic class MapWeakFieldAugment<T, F> extends MapFieldAugment<T, F> {\n\t\tMapWeakFieldAugment(F defaultValue) {\n\t\t\tsuper(defaultValue);\n\t\t}\n\t\t\n\t\t@SuppressWarnings(\"unchecked\")\n\t\tF read(T object) {\n\t\t\tWeakReference<F> read = (WeakReference<F>)values.get(object);\n\t\t\tif (read == null) return defaultValue;\n\t\t\tF result = read.get();\n\t\t\tif (result == null) values.remove(object);\n\t\t\treturn result == null ? defaultValue : result;\n\t\t}\n\t\t\n\t\tvoid write(T object, F value) {\n\t\t\tvalues.put(object, new WeakReference<F>(value));\n\t\t}\n\t}\n\t\n\tprivate static <T> T checkNotNull(T object, String name) {\n\t\tif (object == null) throw new NullPointerException(name);\n\t\treturn object;\n\t}\n}\n"
  },
  {
    "path": "src/utils/lombok/core/FieldSelect.java",
    "content": "/*\n * Copyright (C) 2018 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\npublic class FieldSelect {\n\tprivate final String finalPart;\n\t\n\tpublic FieldSelect(String finalPart) {\n\t\tthis.finalPart = finalPart;\n\t}\n\t\n\tpublic String getFinalPart() {\n\t\treturn finalPart;\n\t}\n}\n"
  },
  {
    "path": "src/utils/lombok/core/JavaIdentifiers.java",
    "content": "/*\n * Copyright (C) 2013 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\nimport java.util.regex.Pattern;\n\n/**\n * Utility functions for validating potential java verifiers.\n */\npublic class JavaIdentifiers {\n\tprivate JavaIdentifiers() {}\n\t\n\tprivate static final LombokImmutableList<String> KEYWORDS = LombokImmutableList.of(\n\t\t\t\"public\", \"private\", \"protected\",\n\t\t\t\"default\", \"switch\", \"case\",\n\t\t\t\"for\", \"do\", \"goto\", \"const\", \"strictfp\", \"while\", \"if\", \"else\",\n\t\t\t\"byte\", \"short\", \"int\", \"long\", \"float\", \"double\", \"void\", \"boolean\", \"char\", \n\t\t\t\"null\", \"false\", \"true\",\n\t\t\t\"continue\", \"break\", \"return\", \"instanceof\",\n\t\t\t\"synchronized\", \"volatile\", \"transient\", \"final\", \"static\",\n\t\t\t\"interface\", \"class\", \"extends\", \"implements\", \"throws\",\n\t\t\t\"throw\", \"catch\", \"try\", \"finally\", \"abstract\", \"assert\",\n\t\t\t\"enum\", \"import\", \"package\", \"native\", \"new\", \"super\", \"this\");\n\t\n\tpublic static boolean isValidJavaIdentifier(String identifier) {\n\t\tif (identifier == null) return false;\n\t\tif (identifier.isEmpty()) return false;\n\t\t\n\t\tif (!Character.isJavaIdentifierStart(identifier.charAt(0))) return false;\n\t\tfor (int i = 1; i < identifier.length(); i++) {\n\t\t\tif (!Character.isJavaIdentifierPart(identifier.charAt(i))) return false;\n\t\t}\n\t\t\n\t\treturn !isKeyword(identifier);\n\t}\n\t\n\tpublic static boolean isKeyword(String keyword) {\n\t\treturn KEYWORDS.contains(keyword);\n\t}\n\t\n\t/** Matches any of the 8 primitive names, such as {@code boolean}. */\n\tprivate static final Pattern PRIMITIVE_TYPE_NAME_PATTERN = Pattern.compile(\"^(?:boolean|byte|short|int|long|float|double|char)$\");\n\t\n\tpublic static boolean isPrimitive(String typeName) {\n\t\treturn PRIMITIVE_TYPE_NAME_PATTERN.matcher(typeName).matches();\n\t}\n\n\n}\n"
  },
  {
    "path": "src/utils/lombok/core/LombokImmutableList.java",
    "content": "/*\n * Copyright (C) 2013 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collection;\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.NoSuchElementException;\n\npublic final class LombokImmutableList<T> implements Iterable<T> {\n\tprivate Object[] content;\n\tprivate static final LombokImmutableList<?> EMPTY = new LombokImmutableList<Object>(new Object[0]);\n\t\n\t@SuppressWarnings(\"unchecked\")\n\tpublic static <T> LombokImmutableList<T> of() {\n\t\treturn (LombokImmutableList<T>) EMPTY;\n\t}\n\t\n\tpublic static <T> LombokImmutableList<T> of(T a) {\n\t\treturn new LombokImmutableList<T>(new Object[] {a});\n\t}\n\t\n\tpublic static <T> LombokImmutableList<T> of(T a, T b) {\n\t\treturn new LombokImmutableList<T>(new Object[] {a, b});\n\t}\n\t\n\tpublic static <T> LombokImmutableList<T> of(T a, T b, T c) {\n\t\treturn new LombokImmutableList<T>(new Object[] {a, b, c});\n\t}\n\t\n\tpublic static <T> LombokImmutableList<T> of(T a, T b, T c, T d) {\n\t\treturn new LombokImmutableList<T>(new Object[] {a, b, c, d});\n\t}\n\t\n\tpublic static <T> LombokImmutableList<T> of(T a, T b, T c, T d, T e) {\n\t\treturn new LombokImmutableList<T>(new Object[] {a, b, c, d, e});\n\t}\n\t\n\t@SuppressWarnings({\"all\", \"unchecked\"})\n\tpublic static <T> LombokImmutableList<T> of(T a, T b, T c, T d, T e, T f, T... g) {\n\t\tObject[] rest = g == null ? new Object[] {null} : g;\n\t\tObject[] val = new Object[rest.length + 6];\n\t\tSystem.arraycopy(rest, 0, val, 6, rest.length);\n\t\tval[0] = a;\n\t\tval[1] = b;\n\t\tval[2] = c;\n\t\tval[3] = d;\n\t\tval[4] = e;\n\t\tval[5] = f;\n\t\treturn new LombokImmutableList<T>(val);\n\t}\n\t\n\tpublic static <T> LombokImmutableList<T> copyOf(Collection<? extends T> list) {\n\t\treturn new LombokImmutableList<T>(list.toArray());\n\t}\n\t\n\tpublic static <T> LombokImmutableList<T> copyOf(Iterable<? extends T> iterable) {\n\t\tList<T> list = new ArrayList<T>();\n\t\tfor (T o : iterable) list.add(o);\n\t\treturn copyOf(list);\n\t}\n\t\n\tpublic static <T> LombokImmutableList<T> copyOf(T[] array) {\n\t\tObject[] content = new Object[array.length];\n\t\tSystem.arraycopy(array, 0, content, 0, array.length);\n\t\treturn new LombokImmutableList<T>(content);\n\t}\n\t\n\tprivate LombokImmutableList(Object[] content) {\n\t\tthis.content = content;\n\t}\n\t\n\tpublic LombokImmutableList<T> replaceElementAt(int idx, T newValue) {\n\t\tObject[] newContent = content.clone();\n\t\tnewContent[idx] = newValue;\n\t\treturn new LombokImmutableList<T>(newContent);\n\t}\n\t\n\tpublic LombokImmutableList<T> append(T newValue) {\n\t\tint len = content.length;\n\t\tObject[] newContent = new Object[len + 1];\n\t\tSystem.arraycopy(content, 0, newContent, 0, len);\n\t\tnewContent[len] = newValue;\n\t\treturn new LombokImmutableList<T>(newContent);\n\t}\n\t\n\tpublic LombokImmutableList<T> prepend(T newValue) {\n\t\tint len = content.length;\n\t\tObject[] newContent = new Object[len + 1];\n\t\tSystem.arraycopy(content, 0, newContent, 1, len);\n\t\tnewContent[0] = newValue;\n\t\treturn new LombokImmutableList<T>(newContent);\n\t}\n\t\n\tpublic int indexOf(T val) {\n\t\tint len = content.length;\n\t\tif (val == null) {\n\t\t\tfor (int i = 0; i < len; i++) if (content[i] == null) return i;\n\t\t\treturn -1;\n\t\t}\n\t\t\n\t\tfor (int i = 0; i < len; i++) if (val.equals(content[i])) return i;\n\t\treturn -1;\n\t}\n\t\n\tpublic LombokImmutableList<T> removeElement(T val) {\n\t\tint idx = indexOf(val);\n\t\treturn idx == -1 ? this : removeElementAt(idx);\n\t}\n\t\n\tpublic LombokImmutableList<T> removeElementAt(int idx) {\n\t\tint len = content.length;\n\t\tObject[] newContent = new Object[len - 1];\n\t\tif (idx > 0) System.arraycopy(content, 0, newContent, 0, idx);\n\t\tif (idx < len - 1) System.arraycopy(content, idx + 1, newContent, idx, len - idx - 1);\n\t\treturn new LombokImmutableList<T>(newContent);\n\t}\n\t\n\tpublic boolean isEmpty() {\n\t\treturn content.length == 0;\n\t}\n\t\n\tpublic int size() {\n\t\treturn content.length;\n\t}\n\t\n\t@SuppressWarnings(\"unchecked\")\n\tpublic T get(int idx) {\n\t\treturn (T) content[idx];\n\t}\n\t\n\tpublic boolean contains(T in) {\n\t\tif (in == null) {\n\t\t\tfor (Object e : content) if (e == null) return true;\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tfor (Object e : content) if (in.equals(e)) return true;\n\t\treturn false;\n\t}\n\t\n\tpublic Iterator<T> iterator() {\n\t\treturn new Iterator<T>() {\n\t\t\tprivate int idx = 0;\n\t\t\t@Override public boolean hasNext() {\n\t\t\t\treturn idx < content.length;\n\t\t\t}\n\t\t\t\n\t\t\t@SuppressWarnings(\"unchecked\")\n\t\t\t@Override public T next() {\n\t\t\t\tif (idx < content.length) return (T) content[idx++];\n\t\t\t\tthrow new NoSuchElementException();\n\t\t\t}\n\t\t\t\n\t\t\t@Override public void remove() {\n\t\t\t\tthrow new UnsupportedOperationException(\"List is immutable\");\n\t\t\t}\n\t\t};\n\t}\n\t\n\t@Override public String toString() {\n\t\treturn Arrays.toString(content);\n\t}\n\t\n\t@Override public boolean equals(Object obj) {\n\t\tif (!(obj instanceof LombokImmutableList)) return false;\n\t\tif (obj == this) return true;\n\t\treturn Arrays.equals(content, ((LombokImmutableList<?>) obj).content);\n\t}\n\t\n\t@Override public int hashCode() {\n\t\treturn Arrays.hashCode(content);\n\t}\n}\n"
  },
  {
    "path": "src/utils/lombok/core/SpiLoadUtil.java",
    "content": "/*\n * Copyright (C) 2009-2011 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\nimport java.io.BufferedReader;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.lang.annotation.Annotation;\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.ParameterizedType;\nimport java.lang.reflect.Type;\nimport java.net.URL;\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Enumeration;\nimport java.util.Iterator;\nimport java.util.LinkedHashSet;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * The java core libraries have a SPI discovery system, but it works only in Java 1.6 and up. For at least Eclipse,\n * lombok actually works in java 1.5, so we've rolled our own SPI discovery system.\n * \n * It is not API compatible with {@code ServiceLoader}.\n * \n * @see java.util.ServiceLoader\n */\npublic class SpiLoadUtil {\n\tprivate SpiLoadUtil() {\n\t\t//Prevent instantiation\n\t}\n\t\n\t/**\n\t * Method that conveniently turn the {@code Iterable}s returned by the other methods in this class to a\n\t * {@code List}.\n\t * \n\t * @see #findServices(Class)\n\t * @see #findServices(Class, ClassLoader)\n\t */\n\tpublic static <T> List<T> readAllFromIterator(Iterable<T> findServices) {\n\t\tList<T> list = new ArrayList<T>();\n\t\tfor (T t : findServices) list.add(t);\n\t\treturn list;\n\t}\n\t\n\t/**\n\t * Returns an iterator of instances that, at least according to the spi discovery file, are implementations\n\t * of the stated class.\n\t * \n\t * Like ServiceLoader, each listed class is turned into an instance by calling the public no-args constructor.\n\t * \n\t * Convenience method that calls the more elaborate {@link #findServices(Class, ClassLoader)} method with\n\t * this {@link java.lang.Thread}'s context class loader as {@code ClassLoader}.\n\t * \n\t * @param target class to find implementations for.\n\t */\n\tpublic static <C> Iterable<C> findServices(Class<C> target) throws IOException {\n\t\treturn findServices(target, Thread.currentThread().getContextClassLoader());\n\t}\n\t\n\t/**\n\t * Returns an iterator of class objects that, at least according to the spi discovery file, are implementations\n\t * of the stated class.\n\t * \n\t * Like ServiceLoader, each listed class is turned into an instance by calling the public no-args constructor.\n\t * \n\t * @param target class to find implementations for.\n\t * @param loader The classloader object to use to both the spi discovery files, as well as the loader to use\n\t * to make the returned instances.\n\t */\n\tpublic static <C> Iterable<C> findServices(final Class<C> target, ClassLoader loader) throws IOException {\n\t\tif (loader == null) loader = ClassLoader.getSystemClassLoader();\n\t\tEnumeration<URL> resources = loader.getResources(\"META-INF/services/\" + target.getName());\n\t\tfinal Set<String> entries = new LinkedHashSet<String>();\n\t\twhile (resources.hasMoreElements()) {\n\t\t\tURL url = resources.nextElement();\n\t\t\treadServicesFromUrl(entries, url);\n\t\t}\n\t\t\n\t\tfinal Iterator<String> names = entries.iterator();\n\t\tfinal ClassLoader fLoader = loader;\n\t\treturn new Iterable<C> () {\n\t\t\t@Override public Iterator<C> iterator() {\n\t\t\t\treturn new Iterator<C>() {\n\t\t\t\t\t@Override public boolean hasNext() {\n\t\t\t\t\t\treturn names.hasNext();\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t@Override public C next() {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\treturn target.cast(Class.forName(names.next(), true, fLoader).getConstructor().newInstance());\n\t\t\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t\t\tThrowable t = e;\n\t\t\t\t\t\t\tif (t instanceof InvocationTargetException) t = t.getCause();\n\t\t\t\t\t\t\tif (t instanceof RuntimeException) throw (RuntimeException) t;\n\t\t\t\t\t\t\tif (t instanceof Error) throw (Error) t;\n\t\t\t\t\t\t\tthrow new RuntimeException(t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t@Override public void remove() {\n\t\t\t\t\t\tthrow new UnsupportedOperationException();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\t\t};\n\t}\n\t\n\tprivate static void readServicesFromUrl(Collection<String> list, URL url) throws IOException {\n\t\tInputStream in = url.openStream();\n\t\tBufferedReader r = null;\n\t\ttry {\n\t\t\tif (in == null) return;\n\t\t\tr = new BufferedReader(new InputStreamReader(in, \"UTF-8\"));\n\t\t\twhile (true) {\n\t\t\t\tString line = r.readLine();\n\t\t\t\tif (line == null) break;\n\t\t\t\tint idx = line.indexOf('#');\n\t\t\t\tif (idx != -1) line = line.substring(0, idx);\n\t\t\t\tline = line.trim();\n\t\t\t\tif (line.length() == 0) continue;\n\t\t\t\tlist.add(line);\n\t\t\t}\n\t\t} finally {\n\t\t\ttry {\n\t\t\t\tif (r != null) r.close();\n\t\t\t\tif (in != null) in.close();\n\t\t\t} catch (Throwable ignore) {}\n\t\t}\n\t}\n\t\n\t/**\n\t * This method will find the @{code T} in {@code public class Foo extends BaseType<T>}.\n\t * \n\t * It returns an annotation type because it is used exclusively to figure out which annotations are\n\t * being handled by {@link lombok.eclipse.EclipseAnnotationHandler} and {@link lombok.javac.JavacAnnotationHandler}.\n\t */\n\tpublic static Class<? extends Annotation> findAnnotationClass(Class<?> c, Class<?> base) {\n\t\tif (c == Object.class || c == null) return null;\n\t\tClass<? extends Annotation> answer = null;\n\t\t\n\t\tanswer = findAnnotationHelper(base, c.getGenericSuperclass());\n\t\tif (answer != null) return answer;\n\t\t\n\t\tfor (Type iface : c.getGenericInterfaces()) {\n\t\t\tanswer = findAnnotationHelper(base, iface);\n\t\t\tif (answer != null) return answer;\n\t\t}\n\t\t\n\t\tClass<? extends Annotation> potential = findAnnotationClass(c.getSuperclass(), base);\n\t\tif (potential != null) return potential;\n\t\tfor (Class<?> iface : c.getInterfaces()) {\n\t\t\tpotential = findAnnotationClass(iface, base);\n\t\t\tif (potential != null) return potential;\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\t\n\t@SuppressWarnings(\"unchecked\")\n\tprivate static Class<? extends Annotation> findAnnotationHelper(Class<?> base, Type iface) {\n\t\tif (iface instanceof ParameterizedType) {\n\t\t\tParameterizedType p = (ParameterizedType)iface;\n\t\t\tif (!base.equals(p.getRawType())) return null;\n\t\t\tType target = p.getActualTypeArguments()[0];\n\t\t\tif (target instanceof Class<?>) {\n\t\t\t\tif (Annotation.class.isAssignableFrom((Class<?>) target)) {\n\t\t\t\t\treturn (Class<? extends Annotation>) target;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tthrow new ClassCastException(\"Not an annotation type: \" + target);\n\t\t}\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "src/utils/lombok/core/debug/FileLog.java",
    "content": "/*\n * Copyright (C) 2013 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.debug;\n\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.PrintWriter;\nimport java.io.StringWriter;\n\npublic class FileLog {\n\tprivate static FileOutputStream fos;\n\t\n\tpublic static void log(String message) {\n\t\tlog(message, null);\n\t}\n\tpublic synchronized static void log(String message, Throwable t) {\n\t\ttry {\n\t\t\tif (fos == null) {\n\t\t\t\tfos = new FileOutputStream(new File(System.getProperty(\"user.home\"), \"LOMBOK-DEBUG-OUT.txt\"));\n\t\t\t\tRuntime.getRuntime().addShutdownHook(new Thread() {\n\t\t\t\t\tpublic void run() {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tfos.close();\n\t\t\t\t\t\t} catch (Throwable ignore) {}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tfos.write(message.getBytes(\"UTF-8\"));\n\t\t\tfos.write('\\n');\n\t\t\tif (t != null) {\n\t\t\t\tStringWriter sw = new StringWriter();\n\t\t\t\tt.printStackTrace(new PrintWriter(sw));\n\t\t\t\tfos.write(sw.toString().getBytes(\"UTF-8\"));\n\t\t\t\tfos.write('\\n');\n\t\t\t}\n\t\t\tfos.flush();\n\t\t} catch (IOException e) {\n\t\t\tthrow new IllegalStateException(\"Internal lombok file-based debugging not possible\", e);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/utils/lombok/eclipse/Eclipse.java",
    "content": "/*\n * Copyright (C) 2009-2024 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse;\n\nimport java.lang.reflect.Constructor;\nimport java.lang.reflect.Field;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.regex.Pattern;\n\nimport lombok.core.ClassLiteral;\nimport lombok.core.FieldSelect;\nimport lombok.core.JavaIdentifiers;\nimport lombok.permit.Permit;\n\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\nimport org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.CaseStatement;\nimport org.eclipse.jdt.internal.compiler.ast.ClassLiteralAccess;\nimport org.eclipse.jdt.internal.compiler.ast.Clinit;\nimport org.eclipse.jdt.internal.compiler.ast.Expression;\nimport org.eclipse.jdt.internal.compiler.ast.Literal;\nimport org.eclipse.jdt.internal.compiler.ast.QualifiedNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.SingleNameReference;\nimport org.eclipse.jdt.internal.compiler.ast.TryStatement;\nimport org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\nimport org.eclipse.jdt.internal.compiler.ast.UnaryExpression;\nimport org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;\nimport org.eclipse.jdt.internal.compiler.impl.CompilerOptions;\nimport org.eclipse.jdt.internal.compiler.lookup.TypeIds;\n\npublic class Eclipse {\n\tprivate static final Annotation[] EMPTY_ANNOTATIONS_ARRAY = new Annotation[0];\n\t/**\n\t * Eclipse's Parser class is instrumented to not attempt to fill in the body of any method or initializer\n\t * or field initialization if this flag is set. Set it on the flag field of\n\t * any method, field, or initializer you create!\n\t */\n\tpublic static final int ECLIPSE_DO_NOT_TOUCH_FLAG = ASTNode.Bit24;\n\t\n\t/* This section includes flags that are in ecj files too new vs. the deps we compile against.\n\t * Specifically: org.eclipse.jdt.internal.compiler.ast.ASTNode and org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers\n\t */\n\tpublic static final int AccRecord = ASTNode.Bit25; // ECM.AccRecord\n\tpublic static final int IsCanonicalConstructor = ASTNode.Bit10; // ASTNode.IsCanonicalConstructor\n\tpublic static final int IsImplicit = ASTNode.Bit11; // ASTNode.IsImplicit\n\tpublic static final int HasTypeAnnotations = ASTNode.Bit21; // ASTNode.HasTypeAnnotations\n\t\n\tprivate static final Pattern SPLIT_AT_DOT = Pattern.compile(\"\\\\.\");\n\t\n\tprivate Eclipse() {\n\t\t//Prevent instantiation\n\t}\n\t\n\t/**\n\t * For 'speed' reasons, Eclipse works a lot with char arrays. I have my doubts this was a fruitful exercise,\n\t * but we need to deal with it. This turns [[java][lang][String]] into \"java.lang.String\".\n\t */\n\tpublic static String toQualifiedName(char[][] typeName) {\n\t\tint len = typeName.length - 1; // number of dots\n\t\tif (len == 0) return new String(typeName[0]);\n\t\t\n\t\tfor (char[] c : typeName) len += c.length;\n\t\tchar[] ret = new char[len];\n\t\tchar[] part = typeName[0];\n\t\tSystem.arraycopy(part, 0, ret, 0, part.length);\n\t\tint pos = part.length;\n\t\tfor (int i = 1; i < typeName.length; i++) {\n\t\t\tret[pos++] = '.';\n\t\t\tpart = typeName[i];\n\t\t\tSystem.arraycopy(part, 0, ret, pos, part.length);\n\t\t\tpos += part.length;\n\t\t}\n\t\treturn new String(ret);\n\t}\n\t\n\tpublic static char[][] fromQualifiedName(String typeName) {\n\t\tString[] split = SPLIT_AT_DOT.split(typeName);\n\t\tchar[][] result = new char[split.length][];\n\t\tfor (int i = 0; i < split.length; i++) {\n\t\t\tresult[i] = split[i].toCharArray();\n\t\t}\n\t\treturn result;\n\t}\n\t\n\tpublic static long pos(ASTNode node) {\n\t\treturn ((long) node.sourceStart << 32) | (node.sourceEnd & 0xFFFFFFFFL);\n\t}\n\t\n\tpublic static long[] poss(ASTNode node, int repeat) {\n\t\tlong p = ((long) node.sourceStart << 32) | (node.sourceEnd & 0xFFFFFFFFL);\n\t\tlong[] out = new long[repeat];\n\t\tArrays.fill(out, p);\n\t\treturn out;\n\t}\n\t\n\t/**\n\t * Checks if an eclipse-style array-of-array-of-characters to represent a fully qualified name ('foo.bar.baz'), matches a plain\n\t * string containing the same fully qualified name with dots in the string.\n\t */\n\tpublic static boolean nameEquals(char[][] typeName, String string) {\n\t\tint pos = 0, len = string.length();\n\t\tfor (int i = 0; i < typeName.length; i++) {\n\t\t\tchar[] t = typeName[i];\n\t\t\tif (i > 0) {\n\t\t\t\tif (pos == len) return false;\n\t\t\t\tif (string.charAt(pos++) != '.') return false;\n\t\t\t}\n\t\t\tfor (int j = 0; j < t.length; j++) {\n\t\t\t\tif (pos == len) return false;\n\t\t\t\tif (string.charAt(pos++) != t[j]) return false;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\tpublic static boolean hasClinit(TypeDeclaration parent) {\n\t\tif (parent.methods == null) return false;\n\t\t\n\t\tfor (AbstractMethodDeclaration method : parent.methods) {\n\t\t\tif (method instanceof Clinit) return true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * Searches the given field node for annotations and returns each one that matches the provided regular expression pattern.\n\t * \n\t * Only the simple name is checked - the package and any containing class are ignored.\n\t */\n\tpublic static Annotation[] findAnnotations(AbstractVariableDeclaration field, Pattern namePattern) {\n\t\tList<Annotation> result = new ArrayList<Annotation>();\n\t\tif (field.annotations == null) return EMPTY_ANNOTATIONS_ARRAY;\n\t\tfor (Annotation annotation : field.annotations) {\n\t\t\tTypeReference typeRef = annotation.type;\n\t\t\tif (typeRef != null && typeRef.getTypeName() != null) {\n\t\t\t\tchar[][] typeName = typeRef.getTypeName();\n\t\t\t\tString suspect = new String(typeName[typeName.length - 1]);\n\t\t\t\tif (namePattern.matcher(suspect).matches()) {\n\t\t\t\t\tresult.add(annotation);\n\t\t\t\t}\n\t\t\t}\n\t\t}\t\n\t\treturn result.toArray(EMPTY_ANNOTATIONS_ARRAY);\n\t}\n\t\n\t/**\n\t * Checks if the given type reference represents a primitive type.\n\t */\n\tpublic static boolean isPrimitive(TypeReference ref) {\n\t\tif (ref.dimensions() > 0) return false;\n\t\treturn JavaIdentifiers.isPrimitive(toQualifiedName(ref.getTypeName()));\n\t}\n\t\n\t/**\n\t * Returns the actual value of the given Literal or Literal-like node.\n\t */\n\tpublic static Object calculateValue(Expression e) {\n\t\tif (e instanceof Literal) {\n\t\t\t((Literal) e).computeConstant();\n\t\t\tswitch (e.constant.typeID()) {\n\t\t\tcase TypeIds.T_int: return e.constant.intValue();\n\t\t\tcase TypeIds.T_byte: return e.constant.byteValue();\n\t\t\tcase TypeIds.T_short: return e.constant.shortValue();\n\t\t\tcase TypeIds.T_char: return e.constant.charValue();\n\t\t\tcase TypeIds.T_float: return e.constant.floatValue();\n\t\t\tcase TypeIds.T_double: return e.constant.doubleValue();\n\t\t\tcase TypeIds.T_boolean: return e.constant.booleanValue();\n\t\t\tcase TypeIds.T_long: return e.constant.longValue();\n\t\t\tcase TypeIds.T_JavaLangString: return e.constant.stringValue();\n\t\t\tdefault: return null;\n\t\t\t}\n\t\t} else if (e instanceof ClassLiteralAccess) {\n\t\t\treturn new ClassLiteral(Eclipse.toQualifiedName(((ClassLiteralAccess) e).type.getTypeName()));\n\t\t} else if (e instanceof SingleNameReference) {\n\t\t\treturn new FieldSelect(new String(((SingleNameReference)e).token));\n\t\t} else if (e instanceof QualifiedNameReference) {\n\t\t\tString qName = Eclipse.toQualifiedName(((QualifiedNameReference) e).tokens);\n\t\t\tint idx = qName.lastIndexOf('.');\n\t\t\treturn new FieldSelect(idx == -1 ? qName : qName.substring(idx+1));\n\t\t} else if (e instanceof UnaryExpression) {\n\t\t\tif (\"-\".equals(((UnaryExpression) e).operatorToString())) {\n\t\t\t\tObject inner = calculateValue(((UnaryExpression) e).expression);\n\t\t\t\tif (inner instanceof Integer) return - ((Integer) inner).intValue();\n\t\t\t\tif (inner instanceof Byte) return - ((Byte) inner).byteValue();\n\t\t\t\tif (inner instanceof Short) return - ((Short) inner).shortValue();\n\t\t\t\tif (inner instanceof Long) return - ((Long) inner).longValue();\n\t\t\t\tif (inner instanceof Float) return - ((Float) inner).floatValue();\n\t\t\t\tif (inner instanceof Double) return - ((Double) inner).doubleValue();\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\t\n\tprivate static long latestEcjCompilerVersionConstantCached = 0;\n\t\n\tpublic static long getLatestEcjCompilerVersionConstant() {\n\t\tif (latestEcjCompilerVersionConstantCached != 0) return latestEcjCompilerVersionConstantCached;\n\t\t\n\t\tint highestVersionSoFar = 0;\n\t\tfor (Field f : ClassFileConstants.class.getDeclaredFields()) {\n\t\t\ttry {\n\t\t\t\tif (f.getName().startsWith(\"JDK\")) {\n\t\t\t\t\tString versionString = f.getName().substring(\"JDK\".length());\n\t\t\t\t\tif (versionString.startsWith(\"1_\")) versionString = versionString.substring(\"1_\".length());\n\t\t\t\t\t\n\t\t\t\t\tint thisVersion = Integer.parseInt(versionString);\n\t\t\t\t\tif (thisVersion > highestVersionSoFar) {\n\t\t\t\t\t\thighestVersionSoFar = thisVersion;\n\t\t\t\t\t\tlatestEcjCompilerVersionConstantCached = (Long) f.get(null);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (Exception ignore) {}\n\t\t}\n\t\t\n\t\tif (highestVersionSoFar > 6 && !ecjSupportsJava7Features()) {\n\t\t\tlatestEcjCompilerVersionConstantCached = ClassFileConstants.JDK1_6;\n\t\t}\n\t\treturn latestEcjCompilerVersionConstantCached;\n\t}\n\t\n\tprivate static int ecjCompilerVersionCached = -1;\n\tpublic static int getEcjCompilerVersion() {\n\t\tif (ecjCompilerVersionCached >= 0) return ecjCompilerVersionCached;\n\t\t\n\t\tfor (Field f : CompilerOptions.class.getDeclaredFields()) {\n\t\t\ttry {\n\t\t\t\tString fName = f.getName();\n\t\t\t\tString versionNumber = null;\n\t\t\t\tif (fName.startsWith(\"VERSION_1_\")) {\n\t\t\t\t\tversionNumber = fName.substring(\"VERSION_1_\".length());\n\t\t\t\t} else if (fName.startsWith(\"VERSION_\")) {\n\t\t\t\t\tversionNumber = fName.substring(\"VERSION_\".length());\n\t\t\t\t} else continue;\n\t\t\t\tecjCompilerVersionCached = Math.max(ecjCompilerVersionCached, Integer.parseInt(versionNumber));\n\t\t\t} catch (Exception ignore) {}\n\t\t}\n\t\t\n\t\tif (ecjCompilerVersionCached < 5) ecjCompilerVersionCached = 5;\n\t\tif (!ecjSupportsJava7Features()) ecjCompilerVersionCached = Math.min(6, ecjCompilerVersionCached);\n\t\treturn ecjCompilerVersionCached;\n\t}\n\t\n\t/**\n\t * Certain ECJ versions that only go up to -source 6 report that they support -source 7 and even fail to error when -source 7 is applied.\n\t * We detect this and correctly say that no more than -source 6 is supported. (when this is the case, this method returns false).\n\t */\n\tprivate static boolean ecjSupportsJava7Features() {\n\t\ttry {\n\t\t\tTryStatement.class.getDeclaredField(\"resources\");\n\t\t\treturn true;\n\t\t} catch (NoSuchFieldException e) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\tprivate static final Field CASE_STATEMENT_CONSTANT_EXPRESSIONS = Permit.permissiveGetField(CaseStatement.class, \"constantExpressions\");\n\tprivate static final Constructor<CaseStatement> CASE_STATEMENT_CONSTRUCTOR_SINGLE;\n\tprivate static final Constructor<CaseStatement> CASE_STATEMENT_CONSTRUCTOR_ARRAY;\n\tprivate static final Expression[] EMPTY_EXPRESSIONS;\n\tstatic {\n\t\tConstructor<CaseStatement> constructorSingle = null, constructorArray = null;\n\t\tExpression[] emptyExpressions = new Expression[0];\n\t\t\n\t\ttry {\n\t\t\tconstructorSingle = Permit.getConstructor(CaseStatement.class, Expression.class, int.class, int.class);\n\t\t} catch (NoSuchMethodException ignore) {\n\t\t}\n\t\t\n\t\ttry {\n\t\t\tconstructorArray = Permit.getConstructor(CaseStatement.class, Expression[].class, int.class, int.class);\n\t\t} catch (NoSuchMethodException ignore) {\n\t\t}\n\t\t\n\t\ttry {\n\t\t\temptyExpressions = Permit.get(Permit.permissiveGetField(Expression.class, \"NO_EXPRESSIONS\"), null);\n\t\t} catch (Throwable ignore) {\n\t\t}\n\t\t\n\t\tCASE_STATEMENT_CONSTRUCTOR_SINGLE = constructorSingle;\n\t\tCASE_STATEMENT_CONSTRUCTOR_ARRAY = constructorArray;\n\t\tEMPTY_EXPRESSIONS = emptyExpressions;\n\t}\n\tpublic static CaseStatement createCaseStatement(Expression expr) {\n\t\tfinal CaseStatement stat;\n\t\tif (CASE_STATEMENT_CONSTRUCTOR_SINGLE != null) {\n\t\t\tstat = Permit.newInstanceSneaky(CASE_STATEMENT_CONSTRUCTOR_SINGLE, expr, 0, 0);\n\t\t\tif (stat != null && expr != null && CASE_STATEMENT_CONSTANT_EXPRESSIONS != null) {\n\t\t\t\ttry {\n\t\t\t\t\tPermit.set(CASE_STATEMENT_CONSTANT_EXPRESSIONS, stat, new Expression[] {expr});\n\t\t\t\t} catch (IllegalAccessException ignore) {\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tExpression[] expressions = EMPTY_EXPRESSIONS;\n\t\t\tif (expr != null) {\n\t\t\t\texpressions = new Expression[] {expr};\n\t\t\t}\n\t\t\tstat = Permit.newInstanceSneaky(CASE_STATEMENT_CONSTRUCTOR_ARRAY, expressions, 0, 0);\n\t\t}\n\t\treturn stat;\n\t}\n}\n"
  },
  {
    "path": "src/utils/lombok/eclipse/Java14Bits.java",
    "content": "package lombok.eclipse;\n\nimport org.eclipse.jdt.internal.compiler.ast.ASTNode;\n\npublic class Java14Bits {\n\tprivate Java14Bits() { }\n\t\n\tpublic static final int AccRecord = ASTNode.Bit25;\n\tpublic static final int IsCanonicalConstructor = ASTNode.Bit10; // record declaration\n\tpublic static final int IsImplicit = ASTNode.Bit11; // record declaration / generated statements in compact constructor\n}\n"
  },
  {
    "path": "src/utils/lombok/javac/CommentCatcher.java",
    "content": "/*\n * Copyright (C) 2011-2019 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac;\n\nimport java.lang.reflect.InvocationTargetException;\nimport java.util.Collections;\nimport java.util.List;\n\nimport lombok.core.FieldAugment;\nimport lombok.permit.Permit;\n\nimport com.sun.tools.javac.main.JavaCompiler;\nimport com.sun.tools.javac.tree.JCTree.JCCompilationUnit;\nimport com.sun.tools.javac.util.Context;\n\npublic class CommentCatcher {\n\tprivate final JavaCompiler compiler;\n\tpublic static final FieldAugment<JCCompilationUnit, List<CommentInfo>> JCCompilationUnit_comments = FieldAugment.augment(JCCompilationUnit.class, List.class, \"lombok$comments\");\n\tpublic static final FieldAugment<JCCompilationUnit, List<Integer>> JCCompilationUnit_textBlockStarts = FieldAugment.augment(JCCompilationUnit.class, List.class, \"lombok$textBlockStarts\");\n\t\n\tpublic static CommentCatcher create(Context context, boolean findTextBlocks) {\n\t\tregisterCommentsCollectingScannerFactory(context, findTextBlocks);\n\t\tJavaCompiler compiler = new JavaCompiler(context);\n\t\t\n\t\tsetInCompiler(compiler, context);\n\t\t\n\t\tcompiler.keepComments = true;\n\t\tcompiler.genEndPos = true;\n\t\t\n\t\treturn new CommentCatcher(compiler);\n\t}\n\t\n\tprivate CommentCatcher(JavaCompiler compiler) {\n\t\tthis.compiler = compiler;\n\t}\n\t\n\tpublic JavaCompiler getCompiler() {\n\t\treturn compiler;\n\t}\n\t\n\tpublic void setComments(JCCompilationUnit ast, List<CommentInfo> comments) {\n\t\tif (comments != null) {\n\t\t\tJCCompilationUnit_comments.set(ast, comments);\n\t\t} else {\n\t\t\tJCCompilationUnit_comments.clear(ast);\n\t\t}\n\t}\n\t\n\tpublic List<CommentInfo> getComments(JCCompilationUnit ast) {\n\t\tList<CommentInfo> list = JCCompilationUnit_comments.get(ast);\n\t\treturn list == null ? Collections.<CommentInfo>emptyList() : list;\n\t}\n\t\n\tpublic List<Integer> getTextBlockStarts(JCCompilationUnit ast) {\n\t\tList<Integer> list = JCCompilationUnit_textBlockStarts.get(ast);\n\t\treturn list == null ? Collections.<Integer>emptyList() : list;\n\t}\n\t\n\tprivate static void registerCommentsCollectingScannerFactory(Context context, boolean findTextBlocks) {\n\t\ttry {\n\t\t\tClass<?> scannerFactory;\n\t\t\tint javaCompilerVersion = Javac.getJavaCompilerVersion();\n\t\t\tif (javaCompilerVersion <= 6) {\n\t\t\t\tscannerFactory = Class.forName(\"lombok.javac.java6.CommentCollectingScannerFactory\");\n\t\t\t} else if (javaCompilerVersion == 7) {\n\t\t\t\tscannerFactory = Class.forName(\"lombok.javac.java7.CommentCollectingScannerFactory\");\n\t\t\t} else {\n\t\t\t\tscannerFactory = Class.forName(\"lombok.javac.java8.CommentCollectingScannerFactory\");\n\t\t\t\tif (findTextBlocks) Permit.getField(scannerFactory, \"findTextBlocks\").set(null, true);\n\t\t\t}\n\t\t\tPermit.getMethod(scannerFactory, \"preRegister\", Context.class).invoke(null, context);\n\t\t} catch (InvocationTargetException e) {\n\t\t\tthrow Javac.sneakyThrow(e.getCause());\n\t\t} catch (Exception e) {\n\t\t\tthrow Javac.sneakyThrow(e);\n\t\t}\n\t}\n\t\n\tprivate static void setInCompiler(JavaCompiler compiler, Context context) {\n\t\ttry {\n\t\t\tClass<?> parserFactory;\n\t\t\tint javaCompilerVersion = Javac.getJavaCompilerVersion();\n\t\t\tif (javaCompilerVersion <= 6) {\n\t\t\t\tparserFactory = Class.forName(\"lombok.javac.java6.CommentCollectingParserFactory\");\n\t\t\t} else if (javaCompilerVersion == 7) {\n\t\t\t\tparserFactory = Class.forName(\"lombok.javac.java7.CommentCollectingParserFactory\");\n\t\t\t} else if (javaCompilerVersion == 8) {\n\t\t\t\tparserFactory = Class.forName(\"lombok.javac.java8.CommentCollectingParserFactory\");\n\t\t\t} else {\n\t\t\t\tparserFactory = Class.forName(\"lombok.javac.java9.CommentCollectingParserFactory\");\n\t\t\t}\n\t\t\tPermit.getMethod(parserFactory, \"setInCompiler\", JavaCompiler.class, Context.class).invoke(null, compiler, context);\n\t\t} catch (InvocationTargetException e) {\n\t\t\tthrow Javac.sneakyThrow(e.getCause());\n\t\t} catch (Exception e) {\n\t\t\tthrow Javac.sneakyThrow(e);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/utils/lombok/javac/CommentInfo.java",
    "content": "/*\n * Copyright (C) 2009-2011 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac;\n\npublic final class CommentInfo {\n\tpublic enum StartConnection {\n\t\t/* Comment's start immediately follows a newline. */\n\t\tSTART_OF_LINE,\n\t\t\n\t\t/* Comment's start does not immediately follow a newline, but there is a newline between this\n\t\t * and the previous comment (or pos 0 if first comment). */\n\t\tON_NEXT_LINE,\n\t\t\n\t\t/* Comment's start immediately follows previous comment's end  (or pos 0 if first comment). */\n\t\tDIRECT_AFTER_PREVIOUS,\n\t\t\n\t\t/* Comment's start does not immediately follow previous comment's end, but there is no newline in\n\t\t * between this and previous comment (or pos 0 if first comment). */\n\t\tAFTER_PREVIOUS\n\t}\n\n\tpublic enum EndConnection {\n\t\t/* Comment is followed immediately by another node (not whitespace, not newline). */\n\t\tDIRECT_AFTER_COMMENT,\n\t\t\n\t\t/* Comment is followed by some non-newline whitespace then by another node. */\n\t\tAFTER_COMMENT,\n\t\t\n\t\t/* Comment is followed by optionally some whitespace then a newline. */\n\t\tON_NEXT_LINE\n\t}\n\t\n\tpublic final int pos;\n\tpublic final int prevEndPos;\n\tpublic final String content;\n\tpublic final int endPos;\n\tpublic final StartConnection start;\n\tpublic final EndConnection end;\n\t\n\tpublic CommentInfo(int prevEndPos, int pos, int endPos, String content, StartConnection start, EndConnection end) {\n\t\tthis.pos = pos;\n\t\tthis.prevEndPos = prevEndPos;\n\t\tthis.endPos = endPos;\n\t\tthis.content = content;\n\t\tthis.start = start;\n\t\tthis.end = end;\n\t}\n\t\n\tpublic boolean isJavadoc() {\n\t\treturn content.startsWith(\"/**\") && content.length() > 4;\n\t}\n\t\n\t@Override\n\tpublic String toString() {\n\t\treturn String.format(\"%d: %s (%s,%s)\", pos, content, start, end);\n\t}\n}\n"
  },
  {
    "path": "src/utils/lombok/javac/Javac.java",
    "content": "/*\n * Copyright (C) 2009-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac;\n\nimport static lombok.javac.JavacTreeMaker.TreeTag.treeTag;\nimport static lombok.javac.JavacTreeMaker.TypeTag.*;\n\nimport java.lang.reflect.Field;\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.concurrent.atomic.AtomicInteger;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\nimport javax.lang.model.type.NoType;\nimport javax.lang.model.type.TypeKind;\nimport javax.lang.model.type.TypeVisitor;\n\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.code.Source;\nimport com.sun.tools.javac.code.Symtab;\nimport com.sun.tools.javac.code.Type;\nimport com.sun.tools.javac.main.JavaCompiler;\nimport com.sun.tools.javac.parser.Tokens.Comment;\nimport com.sun.tools.javac.parser.Tokens.Comment.CommentStyle;\nimport com.sun.tools.javac.tree.DocCommentTable;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCCompilationUnit;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCFieldAccess;\nimport com.sun.tools.javac.tree.JCTree.JCIdent;\nimport com.sun.tools.javac.tree.JCTree.JCImport;\nimport com.sun.tools.javac.tree.JCTree.JCLiteral;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;\n\nimport lombok.core.ClassLiteral;\nimport lombok.core.FieldSelect;\nimport lombok.core.JavaIdentifiers;\nimport lombok.javac.JavacTreeMaker.TreeTag;\nimport lombok.javac.JavacTreeMaker.TypeTag;\nimport lombok.permit.Permit;\n\n/**\n * Container for static utility methods relevant to lombok's operation on javac.\n */\npublic class Javac {\n\tprivate Javac() {\n\t\t// prevent instantiation\n\t}\n\t\n\tprivate static final Pattern VERSION_PARSER = Pattern.compile(\"^(\\\\d{1,6})\\\\.?(\\\\d{1,6})?.*$\");\n\tprivate static final Pattern SOURCE_PARSER = Pattern.compile(\"^JDK(\\\\d{1,6})_?(\\\\d{1,6})?.*$\");\n\t\n\tprivate static final AtomicInteger compilerVersion = new AtomicInteger(-1);\n\t\n\t/* This section includes flags that would ordinarily be in com.sun.tools.javac.code.Flags, but which are 'too new' (we don't compile against older versions of javac for compatibility). */\n\tpublic static final long RECORD = 1L << 61; // ClassSymbols, MethodSymbols, VarSymbols (Marks types as being records, as well as the 'fields' in the compact declaration, and the canonical constructor)\n\tpublic static final long COMPACT_RECORD_CONSTRUCTOR = 1L << 51; // MethodSymbols (the 'implicit' many-args constructor that records have)\n\tpublic static final long UNINITIALIZED_FIELD = 1L << 51; // VarSymbols (To identify fields that the compact record constructor won't initialize)\n\tpublic static final long GENERATED_MEMBER = 1L << 24; // MethodSymbols, VarSymbols (marks methods and the constructor generated in records)\n\tpublic static final long SEALED = 1L << 62 | 1L << 48; // ClassSymbols (Flag to indicate sealed class/interface declaration) - from the introduction of sealed until ~jdk23, this was 62. In jdk24, it's 48. Ugh.\n\tpublic static final long NON_SEALED = 1L << 63; // ClassSymbols (Flag to indicate that the class/interface was declared with the non-sealed modifier)\n\tpublic static final long IMPLICIT_CLASS = 1L << 19; // ClassSymbols (Flag to indicate that the class/interface wasn't actually written out; it is an implicitly declared top-level class). Introduced in JDK25, JEP512.\n\t\n\t/**\n\t * Returns the version of this java compiler, i.e. the JDK that it shipped in. For example, for javac v1.7, this returns {@code 7}.\n\t */\n\tpublic static int getJavaCompilerVersion() {\n\t\tint cv = compilerVersion.get();\n\t\tif (cv != -1) return cv;\n\t\t\n\t\t/* Main algorithm: Use JavaCompiler's intended method to do this */ {\n\t\t\tMatcher m = VERSION_PARSER.matcher(JavaCompiler.version());\n\t\t\tif (m.matches()) {\n\t\t\t\tint major = Integer.parseInt(m.group(1));\n\t\t\t\tif (major == 1) {\n\t\t\t\t\tint minor = Integer.parseInt(m.group(2));\n\t\t\t\t\treturn setVersion(minor);\n\t\t\t\t}\n\t\t\t\tif (major >= 9) return setVersion(major);\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* Fallback algorithm one: Check Source's values. Lets hope oracle never releases a javac that recognizes future versions for -source */ {\n\t\t\tString name = Source.values()[Source.values().length - 1].name();\n\t\t\tMatcher m = SOURCE_PARSER.matcher(name);\n\t\t\tif (m.matches()) {\n\t\t\t\tint major = Integer.parseInt(m.group(1));\n\t\t\t\tif (major == 1) {\n\t\t\t\t\tint minor = Integer.parseInt(m.group(2));\n\t\t\t\t\treturn setVersion(minor);\n\t\t\t\t}\n\t\t\t\tif (major >= 9) return setVersion(major);\n\t\t\t}\n\t\t}\n\t\treturn setVersion(6);\n\t}\n\t\n\tprivate static int setVersion(int version) {\n\t\tcompilerVersion.set(version);\n\t\treturn version;\n\t}\n\t\n\tprivate static final Class<?> DOCCOMMENTTABLE_CLASS;\n\t\n\tstatic {\n\t\tClass<?> c = null;\n\t\ttry {\n\t\t\tc = Class.forName(\"com.sun.tools.javac.tree.DocCommentTable\");\n\t\t} catch (Throwable ignore) {}\n\t\tDOCCOMMENTTABLE_CLASS = c;\n\t}\n\t\n\tpublic static boolean instanceOfDocCommentTable(Object o) {\n\t\treturn DOCCOMMENTTABLE_CLASS != null && DOCCOMMENTTABLE_CLASS.isInstance(o);\n\t}\n\t\n\t/**\n\t * Checks if the given expression (that really ought to refer to a type\n\t * expression) represents a primitive type.\n\t */\n\tpublic static boolean isPrimitive(JCExpression ref) {\n\t\treturn JavaIdentifiers.isPrimitive(ref.toString());\n\t}\n\t\n\t/**\n\t * Turns an expression into a guessed intended literal. Only works for\n\t * literals, as you can imagine.\n\t * \n\t * Will for example turn a TrueLiteral into 'Boolean.valueOf(true)'.\n\t */\n\tpublic static Object calculateGuess(JCExpression expr) {\n\t\tif (expr instanceof JCLiteral) {\n\t\t\tJCLiteral lit = (JCLiteral) expr;\n\t\t\tif (lit.getKind() == com.sun.source.tree.Tree.Kind.BOOLEAN_LITERAL) {\n\t\t\t\treturn ((Number) lit.value).intValue() == 0 ? false : true;\n\t\t\t}\n\t\t\treturn lit.value;\n\t\t}\n\t\t\n\t\tif (expr instanceof JCIdent || expr instanceof JCFieldAccess) {\n\t\t\tString x = expr.toString();\n\t\t\tif (x.endsWith(\".class\")) return new ClassLiteral(x.substring(0, x.length() - 6));\n\t\t\tint idx = x.lastIndexOf('.');\n\t\t\tif (idx > -1) x = x.substring(idx + 1);\n\t\t\treturn new FieldSelect(x);\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\t\n\tpublic static final TypeTag CTC_BOOLEAN = typeTag(\"BOOLEAN\");\n\tpublic static final TypeTag CTC_INT = typeTag(\"INT\");\n\tpublic static final TypeTag CTC_DOUBLE = typeTag(\"DOUBLE\");\n\tpublic static final TypeTag CTC_FLOAT = typeTag(\"FLOAT\");\n\tpublic static final TypeTag CTC_SHORT = typeTag(\"SHORT\");\n\tpublic static final TypeTag CTC_BYTE = typeTag(\"BYTE\");\n\tpublic static final TypeTag CTC_LONG = typeTag(\"LONG\");\n\tpublic static final TypeTag CTC_CHAR = typeTag(\"CHAR\");\n\tpublic static final TypeTag CTC_VOID = typeTag(\"VOID\");\n\tpublic static final TypeTag CTC_NONE = typeTag(\"NONE\");\n\tpublic static final TypeTag CTC_BOT = typeTag(\"BOT\");\n\tpublic static final TypeTag CTC_ERROR = typeTag(\"ERROR\");\n\tpublic static final TypeTag CTC_UNKNOWN = typeTagPermissive(\"UNKNOWN\"); // UNKNOWN has been removed in JDK24, hence, we need to look it up permissively (just make it `null` if it does not exist).\n\t\n\tpublic static final TypeTag CTC_UNDETVAR = typeTag(\"UNDETVAR\");\n\tpublic static final TypeTag CTC_CLASS = typeTag(\"CLASS\");\n\t\n\tpublic static final TreeTag CTC_NOT_EQUAL = treeTag(\"NE\");\n\tpublic static final TreeTag CTC_LESS_THAN = treeTag(\"LT\");\n\tpublic static final TreeTag CTC_GREATER_THAN = treeTag(\"GT\");\n\tpublic static final TreeTag CTC_LESS_OR_EQUAL= treeTag(\"LE\");\n\tpublic static final TreeTag CTC_GREATER_OR_EQUAL = treeTag(\"GE\");\n\tpublic static final TreeTag CTC_POS = treeTag(\"POS\");\n\tpublic static final TreeTag CTC_NEG = treeTag(\"NEG\");\n\tpublic static final TreeTag CTC_NOT = treeTag(\"NOT\");\n\tpublic static final TreeTag CTC_COMPL = treeTag(\"COMPL\");\n\tpublic static final TreeTag CTC_BITXOR = treeTag(\"BITXOR\");\n\tpublic static final TreeTag CTC_UNSIGNED_SHIFT_RIGHT = treeTag(\"USR\");\n\tpublic static final TreeTag CTC_MUL = treeTag(\"MUL\");\n\tpublic static final TreeTag CTC_DIV = treeTag(\"DIV\");\n\tpublic static final TreeTag CTC_PLUS = treeTag(\"PLUS\");\n\tpublic static final TreeTag CTC_MINUS = treeTag(\"MINUS\");\n\tpublic static final TreeTag CTC_EQUAL = treeTag(\"EQ\");\n\tpublic static final TreeTag CTC_PREINC = treeTag(\"PREINC\");\n\tpublic static final TreeTag CTC_PREDEC = treeTag(\"PREDEC\");\n\tpublic static final TreeTag CTC_POSTINC = treeTag(\"POSTINC\");\n\tpublic static final TreeTag CTC_POSTDEC = treeTag(\"POSTDEC\");\n\t\n\tprivate static final Method getExtendsClause, getEndPosition, storeEnd;\n\t\n\tstatic {\n\t\tgetExtendsClause = getMethod(JCClassDecl.class, \"getExtendsClause\", new Class<?>[0]);\n\t\t\n\t\tif (getJavaCompilerVersion() < 8) {\n\t\t\tgetEndPosition = getMethod(DiagnosticPosition.class, \"getEndPosition\", java.util.Map.class);\n\t\t\tstoreEnd = getMethod(java.util.Map.class, \"put\", Object.class, Object.class);\n\t\t} else {\n\t\t\tgetEndPosition = getMethod(DiagnosticPosition.class, \"getEndPosition\", \"com.sun.tools.javac.tree.EndPosTable\");\n\t\t\tMethod storeEndMethodTemp;\n\t\t\tClass<?> endPosTable;\n\t\t\ttry {\n\t\t\t\tendPosTable = Class.forName(\"com.sun.tools.javac.tree.EndPosTable\");\n\t\t\t} catch (ClassNotFoundException ex) {\n\t\t\t\tthrow sneakyThrow(ex);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tstoreEndMethodTemp = Permit.getMethod(endPosTable, \"storeEnd\", JCTree.class, int.class);\n\t\t\t} catch (NoSuchMethodException e) {\n\t\t\t\ttry {\n\t\t\t\t\tendPosTable = Class.forName(\"com.sun.tools.javac.parser.JavacParser$AbstractEndPosTable\");\n\t\t\t\t\tstoreEndMethodTemp = Permit.getMethod(endPosTable, \"storeEnd\", JCTree.class, int.class);\n\t\t\t\t} catch (NoSuchMethodException ex) {\n\t\t\t\t\tthrow sneakyThrow(ex);\n\t\t\t\t} catch (ClassNotFoundException ex) {\n\t\t\t\t\tthrow sneakyThrow(ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tstoreEnd = storeEndMethodTemp;\n\t\t}\n\t\tPermit.setAccessible(getEndPosition);\n\t\tPermit.setAccessible(storeEnd);\n\t}\n\t\n\tprivate static Method getMethod(Class<?> clazz, String name, Class<?>... paramTypes) {\n\t\ttry {\n\t\t\treturn Permit.getMethod(clazz, name, paramTypes);\n\t\t} catch (NoSuchMethodException e) {\n\t\t\tthrow sneakyThrow(e);\n\t\t}\n\t}\n\t\n\tprivate static Method getMethod(Class<?> clazz, String name, String... paramTypes) {\n\t\ttry {\n\t\t\tClass<?>[] c = new Class[paramTypes.length];\n\t\t\tfor (int i = 0; i < paramTypes.length; i++) c[i] = Class.forName(paramTypes[i]);\n\t\t\treturn Permit.getMethod(clazz, name, c);\n\t\t} catch (NoSuchMethodException e) {\n\t\t\tthrow sneakyThrow(e);\n\t\t} catch (ClassNotFoundException e) {\n\t\t\tthrow sneakyThrow(e);\n\t\t}\n\t}\n\t\n\t/**\n\t * In some versions, the field's type is {@code JCTree}, in others it is {@code JCExpression}, which at the JVM level are not the same.\n\t */\n\tpublic static JCTree getExtendsClause(JCClassDecl decl) {\n\t\ttry {\n\t\t\treturn (JCTree) getExtendsClause.invoke(decl);\n\t\t} catch (IllegalAccessException e) {\n\t\t\tthrow sneakyThrow(e);\n\t\t} catch (InvocationTargetException e) {\n\t\t\tthrow sneakyThrow(e.getCause());\n\t\t}\n\t}\n\t\n\t/**\n\t * In some versions, the field's type is {@code JCTree}, in others it is {@code JCFieldAccess}, which at the JVM level are not the same.\n\t */\n\tprivate static final Field JCIMPORT_QUALID = Permit.permissiveGetField(JCImport.class, \"qualid\");\n\t\n\tpublic static JCTree getQualid(JCImport tree) {\n\t\ttry {\n\t\t\treturn (JCTree) JCIMPORT_QUALID.get(tree);\n\t\t} catch (IllegalAccessException e) {\n\t\t\tthrow sneakyThrow(e.getCause());\n\t\t}\n\t}\n\t\n\tpublic static Object getDocComments(JCCompilationUnit cu) {\n\t\ttry {\n\t\t\treturn JCCOMPILATIONUNIT_DOCCOMMENTS.get(cu);\n\t\t} catch (IllegalAccessException e) {\n\t\t\tthrow sneakyThrow(e);\n\t\t}\n\t}\n\t\n\tpublic static String getDocComment(JCCompilationUnit cu, JCTree node) {\n\t\tObject dc = getDocComments(cu);\n\t\tif (dc instanceof Map) return (String) ((Map<?, ?>) dc).get(node);\n\t\tif (instanceOfDocCommentTable(dc)) return JavadocOps_8.getJavadoc(dc, node);\n\t\treturn null;\n\t}\n\t\n\t/**\n\t * Checks if the javadoc comment associated with {@code tree} has a position set.\n\t * \n\t * Returns true if there is no javadoc comment on the node, or it has position (position isn't -1).\n\t */\n\tpublic static boolean validateDocComment(JCCompilationUnit cu, JCTree tree) {\n\t\tObject dc = getDocComments(cu);\n\t\tif (!instanceOfDocCommentTable(dc)) return true;\n\t\treturn JavadocOps_8.validateJavadoc(dc, tree);\n\t}\n\t\n\t@SuppressWarnings(\"unchecked\")\n\tpublic static void setDocComment(JCCompilationUnit cu, JCTree node, String javadoc) {\n\t\tif (javadoc == null) return;\n\t\tObject dc = getDocComments(cu);\n\t\tif (dc instanceof Map) {\n\t\t\t((Map<JCTree, String>) dc).put(node, javadoc);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (instanceOfDocCommentTable(dc)) {\n\t\t\tJavadocOps_8.setJavadoc(dc, node, javadoc);\n\t\t\treturn;\n\t\t}\n\t}\n\t\n\tpublic static Object getCommentStyle() {\n\t\treturn JavadocOps_8.COMMENT_STYLE;\n\t}\n\t\n\tprivate static class JavadocOps_8 {\n\t\tstatic String getJavadoc(Object dc, JCTree node) {\n\t\t\tDocCommentTable dct = (DocCommentTable) dc;\n\t\t\tComment javadoc = dct.getComment(node);\n\t\t\tif (javadoc == null) return null;\n\t\t\treturn javadoc.getText();\n\t\t}\n\t\t\n\t\tpublic static boolean validateJavadoc(Object dc, JCTree node) {\n\t\t\tDocCommentTable dct = (DocCommentTable) dc;\n\t\t\tComment javadoc = dct.getComment(node);\n\t\t\treturn javadoc == null || javadoc.getText() == null || (javadoc.getSourcePos(0) >= 0 && hasParseableDocComment(dct, node));\n\t\t}\n\t\t\n\t\tstatic void setJavadoc(Object dc, JCTree node, String javadoc) {\n\t\t\tDocCommentTable dct = (DocCommentTable) dc;\n\t\t\tComment newCmt = createJavadocComment(javadoc, node);\n\t\t\tdct.putComment(node, newCmt);\n\t\t}\n\t\t\n\t\tprivate static final CommentStyle COMMENT_STYLE = getCommentStyle();\n\t\tprivate static CommentStyle getCommentStyle() {\n\t\t\ttry {\n\t\t\t\treturn CommentStyle.valueOf(\"JAVADOC\");\n\t\t\t} catch (IllegalArgumentException e) {\n\t\t\t\treturn CommentStyle.valueOf(\"JAVADOC_BLOCK\");\n\t\t\t}\n\t\t}\n\t\t\n\t\tprivate static boolean hasParseableDocComment(Object dc, JCTree node) {\n\t\t\tDocCommentTable dct = (DocCommentTable) dc;\n\t\t\treturn Permit.invokeSneaky(Permit.permissiveGetMethod(DocCommentTable.class, \"getCommentTree\", JCTree.class), dct, node) != null;\n\t\t}\n\t\t\n\t\tprivate static Comment createJavadocComment(final String text, final JCTree field) {\n\t\t\treturn new Comment() {\n\t\t\t\t@Override public String getText() {\n\t\t\t\t\treturn text;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t@Override public Comment stripIndent() {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t@Override public int getSourcePos(int index) {\n\t\t\t\t\treturn field == null ? -1 : field.getStartPosition();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t@Override public CommentStyle getStyle() {\n\t\t\t\t\treturn COMMENT_STYLE;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t@Override public boolean isDeprecated() {\n\t\t\t\t\treturn text.contains(\"@deprecated\") && field instanceof JCVariableDecl && isFieldDeprecated(field);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t@Override public DiagnosticPosition getPos() {\n\t\t\t\t\treturn field;\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t}\n\t\n\tpublic static boolean isFieldDeprecated(JCTree field) {\n\t\tif (!(field instanceof JCVariableDecl)) return false;\n\t\tJCVariableDecl fieldNode = (JCVariableDecl) field;\n\t\tif ((fieldNode.mods.flags & Flags.DEPRECATED) != 0) return true;\n\t\tif (fieldNode.mods.annotations != null) for (JCAnnotation ann : fieldNode.mods.annotations) {\n\t\t\tString at = ann.getAnnotationType().toString();\n\t\t\treturn at.equals(\"Deprecated\") || at.endsWith(\".Deprecated\");\n\t\t}\n\t\treturn false;\n\t}\n\t\n\tpublic static void initDocComments(JCCompilationUnit cu) {\n\t\ttry {\n\t\t\tJCCOMPILATIONUNIT_DOCCOMMENTS.set(cu, new HashMap<Object, String>());\n\t\t} catch (IllegalArgumentException e) {\n\t\t\t// That's fine - we're on JDK8, we'll fix that later.\n\t\t} catch (IllegalAccessException e) {\n\t\t\tthrow sneakyThrow(e);\n\t\t}\n\t}\n\t\n\tpublic static int getEndPosition(DiagnosticPosition pos, JCCompilationUnit top) {\n\t\ttry {\n\t\t\tObject endPositions = JCCOMPILATIONUNIT_ENDPOSITIONS.get(top);\n\t\t\treturn (Integer) getEndPosition.invoke(pos, endPositions);\n\t\t} catch (IllegalAccessException e) {\n\t\t\tthrow sneakyThrow(e);\n\t\t} catch (InvocationTargetException e) {\n\t\t\tthrow sneakyThrow(e.getCause());\n\t\t}\n\t}\n\n\tpublic static void storeEnd(JCTree tree, int pos, JCCompilationUnit top) {\n\t\ttry {\n\t\t\tObject endPositions = JCCOMPILATIONUNIT_ENDPOSITIONS.get(top);\n\t\t\tif (endPositions == null) return;\n\t\t\tstoreEnd.invoke(endPositions, tree, pos);\n\t\t} catch (IllegalAccessException e) {\n\t\t\tthrow sneakyThrow(e);\n\t\t} catch (InvocationTargetException e) {\n\t\t\tthrow sneakyThrow(e.getCause());\n\t\t}\n\t}\n\n\tprivate static final Class<?> JC_VOID_TYPE, JC_NO_TYPE;\n\t\n\tstatic {\n\t\tClass<?> c = null;\n\t\ttry {\n\t\t\tc = Class.forName(\"com.sun.tools.javac.code.Type$JCVoidType\");\n\t\t} catch (Throwable ignore) {}\n\t\tJC_VOID_TYPE = c;\n\t\tc = null;\n\t\ttry {\n\t\t\tc = Class.forName(\"com.sun.tools.javac.code.Type$JCNoType\");\n\t\t} catch (Throwable ignore) {}\n\t\tJC_NO_TYPE = c;\n\t}\n\t\n\tprivate static final Field symtabVoidType = getFieldIfExists(Symtab.class, \"voidType\");\n\t\n\tprivate static Field getFieldIfExists(Class<?> c, String fieldName) {\n\t\ttry {\n\t\t\treturn Permit.getField(c, \"voidType\");\n\t\t} catch (Exception e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic static Type createVoidType(Symtab symbolTable, TypeTag tag) {\n\t\tif (symtabVoidType != null) try {\n\t\t\treturn (Type) symtabVoidType.get(symbolTable);\n\t\t} catch (IllegalAccessException ignore) {}\n\t\t\n\t\tif (Javac.getJavaCompilerVersion() < 8) {\n\t\t\treturn new JCNoType(((Integer) tag.value).intValue());\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tif (CTC_VOID.equals(tag)) {\n\t\t\t\t\treturn (Type) JC_VOID_TYPE.getConstructor().newInstance();\n\t\t\t\t} else {\n\t\t\t\t\treturn (Type) JC_NO_TYPE.getConstructor().newInstance();\n\t\t\t\t}\n\t\t\t} catch (InvocationTargetException e) {\n\t\t\t\tthrow sneakyThrow(e.getCause());\n\t\t\t} catch (NoSuchMethodException e) {\n\t\t\t\tthrow sneakyThrow(e);\n\t\t\t} catch (IllegalAccessException e) {\n\t\t\t\tthrow sneakyThrow(e);\n\t\t\t} catch (InstantiationException e) {\n\t\t\t\tthrow sneakyThrow(e);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate static class JCNoType extends Type implements NoType {\n\t\tpublic JCNoType(int tag) {\n\t\t\tsuper(tag, null);\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic TypeKind getKind() {\n\t\t\tif (tag == ((Integer) CTC_VOID.value).intValue()) return TypeKind.VOID;\n\t\t\tif (tag == ((Integer) CTC_NONE.value).intValue()) return TypeKind.NONE;\n\t\t\tthrow new AssertionError(\"Unexpected tag: \" + tag);\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic <R, P> R accept(TypeVisitor<R, P> v, P p) {\n\t\t\treturn v.visitNoType(this, p);\n\t\t}\n\t}\n\t\n\tprivate static final Field JCCOMPILATIONUNIT_ENDPOSITIONS, JCCOMPILATIONUNIT_DOCCOMMENTS;\n\tstatic {\n\t\tField f = null;\n\t\ttry {\n\t\t\tf = Permit.getField(JCCompilationUnit.class, \"endPositions\");\n\t\t} catch (NoSuchFieldException e) {}\n\t\tJCCOMPILATIONUNIT_ENDPOSITIONS = f;\n\t\t\n\t\tf = null;\n\t\ttry {\n\t\t\tf = Permit.getField(JCCompilationUnit.class, \"docComments\");\n\t\t} catch (NoSuchFieldException e) {}\n\t\tJCCOMPILATIONUNIT_DOCCOMMENTS = f;\n\t}\n\t\n\tstatic RuntimeException sneakyThrow(Throwable t) {\n\t\tif (t == null) throw new NullPointerException(\"t\");\n\t\tJavac.<RuntimeException>sneakyThrow0(t);\n\t\treturn null;\n\t}\n\t\n\t@SuppressWarnings(\"unchecked\")\n\tprivate static <T extends Throwable> void sneakyThrow0(Throwable t) throws T {\n\t\tthrow (T)t;\n\t}\n}\n"
  },
  {
    "path": "src/utils/lombok/javac/JavacTreeMaker.java",
    "content": "/*\n * Copyright (C) 2013-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac;\n\nimport java.lang.reflect.Field;\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\nimport java.lang.reflect.Modifier;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.ConcurrentMap;\n\nimport com.sun.tools.javac.code.Attribute;\nimport com.sun.tools.javac.code.BoundKind;\nimport com.sun.tools.javac.code.Symbol;\nimport com.sun.tools.javac.code.Type;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCArrayAccess;\nimport com.sun.tools.javac.tree.JCTree.JCArrayTypeTree;\nimport com.sun.tools.javac.tree.JCTree.JCAssert;\nimport com.sun.tools.javac.tree.JCTree.JCAssign;\nimport com.sun.tools.javac.tree.JCTree.JCAssignOp;\nimport com.sun.tools.javac.tree.JCTree.JCBinary;\nimport com.sun.tools.javac.tree.JCTree.JCBlock;\nimport com.sun.tools.javac.tree.JCTree.JCBreak;\nimport com.sun.tools.javac.tree.JCTree.JCCase;\nimport com.sun.tools.javac.tree.JCTree.JCCatch;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCCompilationUnit;\nimport com.sun.tools.javac.tree.JCTree.JCConditional;\nimport com.sun.tools.javac.tree.JCTree.JCContinue;\nimport com.sun.tools.javac.tree.JCTree.JCDoWhileLoop;\nimport com.sun.tools.javac.tree.JCTree.JCEnhancedForLoop;\nimport com.sun.tools.javac.tree.JCTree.JCErroneous;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.tree.JCTree.JCExpressionStatement;\nimport com.sun.tools.javac.tree.JCTree.JCFieldAccess;\nimport com.sun.tools.javac.tree.JCTree.JCForLoop;\nimport com.sun.tools.javac.tree.JCTree.JCIdent;\nimport com.sun.tools.javac.tree.JCTree.JCIf;\nimport com.sun.tools.javac.tree.JCTree.JCImport;\nimport com.sun.tools.javac.tree.JCTree.JCInstanceOf;\nimport com.sun.tools.javac.tree.JCTree.JCLabeledStatement;\nimport com.sun.tools.javac.tree.JCTree.JCLiteral;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCMethodInvocation;\nimport com.sun.tools.javac.tree.JCTree.JCModifiers;\nimport com.sun.tools.javac.tree.JCTree.JCNewArray;\nimport com.sun.tools.javac.tree.JCTree.JCNewClass;\nimport com.sun.tools.javac.tree.JCTree.JCParens;\nimport com.sun.tools.javac.tree.JCTree.JCPrimitiveTypeTree;\nimport com.sun.tools.javac.tree.JCTree.JCReturn;\nimport com.sun.tools.javac.tree.JCTree.JCSkip;\nimport com.sun.tools.javac.tree.JCTree.JCStatement;\nimport com.sun.tools.javac.tree.JCTree.JCSwitch;\nimport com.sun.tools.javac.tree.JCTree.JCSynchronized;\nimport com.sun.tools.javac.tree.JCTree.JCThrow;\nimport com.sun.tools.javac.tree.JCTree.JCTry;\nimport com.sun.tools.javac.tree.JCTree.JCTypeApply;\nimport com.sun.tools.javac.tree.JCTree.JCTypeCast;\nimport com.sun.tools.javac.tree.JCTree.JCTypeParameter;\nimport com.sun.tools.javac.tree.JCTree.JCUnary;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.tree.JCTree.JCWhileLoop;\nimport com.sun.tools.javac.tree.JCTree.JCWildcard;\nimport com.sun.tools.javac.tree.JCTree.LetExpr;\nimport com.sun.tools.javac.tree.JCTree.TypeBoundKind;\nimport com.sun.tools.javac.tree.TreeInfo;\nimport com.sun.tools.javac.tree.TreeMaker;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.Name;\n\nimport lombok.permit.Permit;\n\npublic class JavacTreeMaker {\n\tprivate final TreeMaker tm;\n\t\n\tpublic JavacTreeMaker(TreeMaker tm) {\n\t\tthis.tm = tm;\n\t}\n\t\n\tpublic TreeMaker getUnderlyingTreeMaker() {\n\t\treturn tm;\n\t}\n\t\n\tpublic JavacTreeMaker at(int pos) {\n\t\ttm.at(pos);\n\t\treturn this;\n\t}\n\t\n\tprivate static final class FieldId<J> {\n\t\tprivate final Class<?> owner;\n\t\tprivate final String name;\n\t\tprivate final Class<J> fieldType;\n\t\t\n\t\tFieldId(Class<?> owner, String name, Class<J> fieldType) {\n\t\t\tthis.owner = owner;\n\t\t\tthis.name = name;\n\t\t\tthis.fieldType = fieldType;\n\t\t}\n\t}\n\t\n\tprivate static final class MethodId<J> {\n\t\tprivate final Class<?> owner;\n\t\tprivate final String name;\n\t\tprivate final Class<J> returnType;\n\t\tprivate final Class<?>[] paramTypes;\n\t\t\n\t\tMethodId(Class<?> owner, String name, Class<J> returnType, Class<?>... types) {\n\t\t\tthis.owner = owner;\n\t\t\tthis.name = name;\n\t\t\tthis.paramTypes = types;\n\t\t\tthis.returnType = returnType;\n\t\t}\n\t\t\n\t\t@Override public String toString() {\n\t\t\tStringBuilder out = new StringBuilder();\n\t\t\tout.append(returnType.getName()).append(\" \").append(owner.getName()).append(\".\").append(name).append(\"(\");\n\t\t\tboolean f = true;\n\t\t\tfor (Class<?> p : paramTypes) {\n\t\t\t\tif (f) f = false;\n\t\t\t\telse out.append(\", \");\n\t\t\t\tout.append(p.getName());\n\t\t\t}\n\t\t\treturn out.append(\")\").toString();\n\t\t}\n\t}\n\t\n\tprivate static class SchroedingerType {\n\t\tfinal Object value;\n\t\t\n\t\tprivate SchroedingerType(Object value) {\n\t\t\tthis.value = value;\n\t\t}\n\t\t\n\t\t@Override public int hashCode() {\n\t\t\treturn value == null ? -1 : value.hashCode();\n\t\t}\n\t\t\n\t\t@Override public boolean equals(Object obj) {\n\t\t\tif (obj instanceof SchroedingerType) {\n\t\t\t\tObject other = ((SchroedingerType) obj).value;\n\t\t\t\treturn value == null ? other == null : value.equals(other);\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tstatic Object getFieldCached(ConcurrentMap<String, Object> cache, String className, String fieldName) {\n\t\t\tObject value = cache.get(fieldName);\n\t\t\tif (value != null) return value;\n\t\t\ttry {\n\t\t\t\tvalue = Permit.getField(Class.forName(className), fieldName).get(null);\n\t\t\t} catch (NoSuchFieldException e) {\n\t\t\t\tthrow Javac.sneakyThrow(e);\n\t\t\t} catch (IllegalAccessException e) {\n\t\t\t\tthrow Javac.sneakyThrow(e);\n\t\t\t} catch (ClassNotFoundException e) {\n\t\t\t\tthrow Javac.sneakyThrow(e);\n\t\t\t}\n\t\t\t\n\t\t\tcache.putIfAbsent(fieldName, value);\n\t\t\treturn value;\n\t\t}\n\t\t\n\t\tprivate static Field NOSUCHFIELDEX_MARKER;\n\t\tstatic {\n\t\t\ttry {\n\t\t\t\tNOSUCHFIELDEX_MARKER = Permit.getField(SchroedingerType.class, \"NOSUCHFIELDEX_MARKER\");\n\t\t\t} catch (NoSuchFieldException e) {\n\t\t\t\tthrow Javac.sneakyThrow(e);\n\t\t\t}\n\t\t}\n\t\t\n\t\tstatic Object getFieldCached(ConcurrentMap<Class<?>, Field> cache, Object ref, String fieldName) throws NoSuchFieldException {\n\t\t\tClass<?> c = ref.getClass();\n\t\t\tField field = cache.get(c);\n\t\t\tif (field == null) {\n\t\t\t\ttry {\n\t\t\t\t\tfield = Permit.getField(c, fieldName);\n\t\t\t\t} catch (NoSuchFieldException e) {\n\t\t\t\t\tcache.putIfAbsent(c, NOSUCHFIELDEX_MARKER);\n\t\t\t\t\tthrow Javac.sneakyThrow(e);\n\t\t\t\t}\n\t\t\t\tPermit.setAccessible(field);\n\t\t\t\tField old = cache.putIfAbsent(c, field);\n\t\t\t\tif (old != null) field = old;\n\t\t\t}\n\t\t\t\n\t\t\tif (field == NOSUCHFIELDEX_MARKER) throw new NoSuchFieldException(fieldName);\n\t\t\ttry {\n\t\t\t\treturn field.get(ref);\n\t\t\t} catch (IllegalAccessException e) {\n\t\t\t\tthrow Javac.sneakyThrow(e);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic static class TypeTag extends SchroedingerType {\n\t\tprivate static final ConcurrentMap<String, Object> TYPE_TAG_CACHE = new ConcurrentHashMap<String, Object>();\n\t\tprivate static final ConcurrentMap<Class<?>, Field> FIELD_CACHE = new ConcurrentHashMap<Class<?>, Field>();\n\t\tprivate static final Method TYPE_TYPETAG_METHOD;\n\t\t\n\t\tstatic {\n\t\t\tMethod m = null;\n\t\t\ttry {\n\t\t\t\tm = Permit.getMethod(Type.class, \"getTag\");\n\t\t\t} catch (NoSuchMethodException e) {}\n\t\t\tTYPE_TYPETAG_METHOD = m;\n\t\t}\n\t\t\n\t\tprivate TypeTag(Object value) {\n\t\t\tsuper(value);\n\t\t}\n\t\t\n\t\tpublic static TypeTag typeTag(JCTree o) {\n\t\t\ttry {\n\t\t\t\treturn new TypeTag(getFieldCached(FIELD_CACHE, o, \"typetag\"));\n\t\t\t} catch (NoSuchFieldException e) {\n\t\t\t\tthrow Javac.sneakyThrow(e);\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic static TypeTag typeTag(Type t) {\n\t\t\tif (t == null) return Javac.CTC_VOID;\n\t\t\ttry {\n\t\t\t\treturn new TypeTag(getFieldCached(FIELD_CACHE, t, \"tag\"));\n\t\t\t} catch (NoSuchFieldException e) {\n\t\t\t\tif (TYPE_TYPETAG_METHOD == null) throw new IllegalStateException(\"Type \" + t.getClass() + \" has neither 'tag' nor getTag()\");\n\t\t\t\ttry {\n\t\t\t\t\treturn new TypeTag(TYPE_TYPETAG_METHOD.invoke(t));\n\t\t\t\t} catch (IllegalAccessException ex) {\n\t\t\t\t\tthrow Javac.sneakyThrow(ex);\n\t\t\t\t} catch (InvocationTargetException ex) {\n\t\t\t\t\tthrow Javac.sneakyThrow(ex.getCause());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic static TypeTag typeTag(String identifier) {\n\t\t\treturn new TypeTag(getFieldCached(TYPE_TAG_CACHE, Javac.getJavaCompilerVersion() < 8 ? \"com.sun.tools.javac.code.TypeTags\" : \"com.sun.tools.javac.code.TypeTag\", identifier));\n\t\t}\n\t\t\n\t\tpublic static TypeTag typeTagPermissive(String identifier) {\n\t\t\ttry {\n\t\t\t\treturn typeTag(identifier);\n\t\t\t} catch (Exception e) {\n\t\t\t\tif (e instanceof NoSuchFieldException) return null;\n\t\t\t\tthrow Javac.sneakyThrow(e);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic static class TreeTag extends SchroedingerType {\n\t\tprivate static final ConcurrentMap<String, Object> TREE_TAG_CACHE = new ConcurrentHashMap<String, Object>();\n\t\tprivate static final Field TAG_FIELD;\n\t\tprivate static final Method TAG_METHOD;\n\t\tprivate static final MethodId<Integer> OP_PREC = MethodId(TreeInfo.class, \"opPrec\", int.class, TreeTag.class);\n\t\t\n\t\tstatic {\n\t\t\tMethod m = null;\n\t\t\ttry {\n\t\t\t\tm = Permit.getMethod(JCTree.class, \"getTag\");\n\t\t\t} catch (NoSuchMethodException e) {}\n\t\t\t\n\t\t\tif (m != null) {\n\t\t\t\tTAG_FIELD = null;\n\t\t\t\tTAG_METHOD = m;\n\t\t\t} else {\n\t\t\t\tField f = null;\n\t\t\t\ttry {\n\t\t\t\t\tf = Permit.getField(JCTree.class, \"tag\");\n\t\t\t\t} catch (NoSuchFieldException e) {}\n\t\t\t\tTAG_FIELD = f;\n\t\t\t\tTAG_METHOD = null;\n\t\t\t}\n\t\t}\n\t\t\n\t\tprivate TreeTag(Object value) {\n\t\t\tsuper(value);\n\t\t}\n\t\t\n\t\tpublic static TreeTag treeTag(JCTree o) {\n\t\t\ttry {\n\t\t\t\tif (TAG_METHOD != null) return new TreeTag(TAG_METHOD.invoke(o));\n\t\t\t\telse return new TreeTag(TAG_FIELD.get(o));\n\t\t\t} catch (InvocationTargetException e) {\n\t\t\t\tthrow Javac.sneakyThrow(e.getCause());\n\t\t\t} catch (IllegalAccessException e) {\n\t\t\t\tthrow Javac.sneakyThrow(e);\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic static TreeTag treeTag(String identifier) {\n\t\t\treturn new TreeTag(getFieldCached(TREE_TAG_CACHE, Javac.getJavaCompilerVersion() < 8 ? \"com.sun.tools.javac.tree.JCTree\" : \"com.sun.tools.javac.tree.JCTree$Tag\", identifier));\n\t\t}\n\t\t\n\t\tpublic int getOperatorPrecedenceLevel() {\n\t\t\treturn invokeAny(null, OP_PREC, value);\n\t\t}\n\t\t\n\t\tpublic boolean isPrefixUnaryOp() {\n\t\t\treturn Javac.CTC_NEG.equals(this) || Javac.CTC_POS.equals(this) || Javac.CTC_NOT.equals(this) || Javac.CTC_COMPL.equals(this) || Javac.CTC_PREDEC.equals(this) || Javac.CTC_PREINC.equals(this);\n\t\t}\n\t}\n\t\n\tstatic <J> MethodId<J> MethodId(Class<?> owner, String name, Class<J> returnType, Class<?>... types) {\n\t\treturn new MethodId<J>(owner, name, returnType, types);\n\t}\n\t\n\t/**\n\t * Creates a new method ID based on the name of the method to invoke, the return type of that method, and the types of the parameters.\n\t * \n\t * A method matches if the return type matches, and for each parameter the following holds:\n\t * \n\t * Either (A) the type listed here is the same as, or a subtype of, the type of the method in javac's TreeMaker, or\n\t *  (B) the type listed here is a subtype of SchroedingerType.\n\t */\n\tstatic <J> MethodId<J> MethodId(String name, Class<J> returnType, Class<?>... types) {\n\t\treturn new MethodId<J>(TreeMaker.class, name, returnType, types);\n\t}\n\t\n\t/**\n\t * Creates a new method ID based on the name of a method in this class, assuming the name of the method to invoke in TreeMaker has the same name,\n\t * the same return type, and the same parameters (under the same rules as the other MethodId method).\n\t */\n\tstatic <J> MethodId<J> MethodId(String name) {\n\t\tfor (Method m : JavacTreeMaker.class.getDeclaredMethods()) {\n\t\t\tif (m.getName().equals(name)) {\n\t\t\t\t@SuppressWarnings(\"unchecked\") Class<J> r = (Class<J>) m.getReturnType();\n\t\t\t\tClass<?>[] p = m.getParameterTypes();\n\t\t\t\treturn new MethodId<J>(TreeMaker.class, name, r, p);\n\t\t\t}\n\t\t}\n\t\t\n\t\tthrow new InternalError(\"Not found: \" + name);\n\t}\n\t\n\tstatic <J> FieldId<J> FieldId(Class<?> owner, String name, Class<J> fieldType) {\n\t\treturn new FieldId<J>(owner, name, fieldType);\n\t}\n\t\n\tprivate static final ConcurrentHashMap<FieldId<?>, Object> FIELD_CACHE = new ConcurrentHashMap<FieldId<?>, Object>();\n\t\n\tprivate static boolean has(FieldId<?> f) {\n\t\tObject field = FIELD_CACHE.get(f);\n\t\tif (field == REFLECTIVE_ITEM_NOT_FOUND) return false;\n\t\tif (field instanceof Field) return true;\n\t\t\n\t\ttry {\n\t\t\treturn getFromCache(f) != REFLECTIVE_ITEM_NOT_FOUND;\n\t\t} catch (IllegalStateException e) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\tprivate static <J> J get(Object owner, FieldId<J> f) {\n\t\tField field = getFromCache(f);\n\t\ttry {\n\t\t\treturn f.fieldType.cast(field.get(owner));\n\t\t} catch (IllegalAccessException e) {\n\t\t\tthrow Javac.sneakyThrow(e);\n\t\t}\n\t}\n\t\n\tprivate static <J> void set(Object owner, FieldId<J> f, J val) {\n\t\tField field = getFromCache(f);\n\t\ttry {\n\t\t\tfield.set(owner, val);\n\t\t} catch (IllegalAccessException e) {\n\t\t\tthrow Javac.sneakyThrow(e);\n\t\t} catch (IllegalArgumentException e) {\n\t\t\tSystem.err.println(\"Type mismatch for: \" + field);\n\t\t\tthrow e;\n\t\t}\n\t}\n\t\n\tprivate static Field getFromCache(FieldId<?> f) {\n\t\tObject s = FIELD_CACHE.get(f);\n\t\tif (s == null) s = addToCache(f);\n\t\tif (s == REFLECTIVE_ITEM_NOT_FOUND) throw new IllegalStateException(\"Lombok TreeMaker frontend issue: no match when looking for field: \" +  f);\n\t\treturn (Field) s;\n\t}\n\t\n\tprivate static Object addToCache(FieldId<?> f) {\n\t\tfor (Field field : f.owner.getDeclaredFields()) {\n\t\t\tif (f.name.equals(field.getName())) {\n\t\t\t\tif (!Modifier.isPublic(field.getModifiers())) field.setAccessible(true);\n\t\t\t\treturn FIELD_CACHE.putIfAbsent(f, field);\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn FIELD_CACHE.putIfAbsent(f, REFLECTIVE_ITEM_NOT_FOUND);\n\t}\n\t\n\tprivate static final Object REFLECTIVE_ITEM_NOT_FOUND = new Object[0];\n\tprivate static final Object REFLECTIVE_ITEM_MULTIPLE_FOUND = new Object[0];\n\tprivate static final ConcurrentHashMap<MethodId<?>, Object> METHOD_CACHE = new ConcurrentHashMap<MethodId<?>, Object>();\n\t\n\tprivate boolean has(MethodId<?> m) {\n\t\tObject method = METHOD_CACHE.get(m);\n\t\tif (method == REFLECTIVE_ITEM_NOT_FOUND) return false;\n\t\tif (method instanceof Method) return true;\n\t\t\n\t\ttry {\n\t\t\treturn getFromCache(m) != REFLECTIVE_ITEM_NOT_FOUND;\n\t\t} catch (IllegalStateException e) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\tprivate <J> J invoke(MethodId<J> m, Object... args) {\n\t\treturn invokeAny(tm, m, args);\n\t}\n\t\n\t@SuppressWarnings(\"unchecked\") private static <J> J invokeAny(Object owner, MethodId<J> m, Object... args) {\n\t\tMethod method = getFromCache(m);\n\t\ttry {\n\t\t\tif (m.returnType.isPrimitive()) {\n\t\t\t\treturn (J) method.invoke(owner, args);\n\t\t\t}\n\t\t\treturn m.returnType.cast(method.invoke(owner, args));\n\t\t} catch (InvocationTargetException e) {\n\t\t\tthrow Javac.sneakyThrow(e.getCause());\n\t\t} catch (IllegalAccessException e) {\n\t\t\tthrow Javac.sneakyThrow(e);\n\t\t} catch (IllegalArgumentException e) {\n\t\t\tSystem.err.println(\"Type mismatch for: \" + method);\n\t\t\tthrow e;\n\t\t}\n\t}\n\t\n\tprivate static boolean tryResolve(MethodId<?> m) {\n\t\tObject s = METHOD_CACHE.get(m);\n\t\tif (s == null) s = addToCache(m);\n\t\tif (s instanceof Method) return true;\n\t\treturn false;\n\t}\n\t\n\tprivate static Method getFromCache(MethodId<?> m) {\n\t\tObject s = METHOD_CACHE.get(m);\n\t\tif (s == null) s = addToCache(m);\n\t\tif (s == REFLECTIVE_ITEM_MULTIPLE_FOUND) throw new IllegalStateException(\"Lombok TreeMaker frontend issue: multiple matches when looking for method: \" + m);\n\t\tif (s == REFLECTIVE_ITEM_NOT_FOUND) throw new IllegalStateException(\"Lombok TreeMaker frontend issue: no match when looking for method: \" + m);\n\t\treturn (Method) s;\n\t}\n\t\n\tprivate static Object addToCache(MethodId<?> m) {\n\t\tMethod found = null;\n\t\t\n\t\touter:\n\t\tfor (Method method : m.owner.getDeclaredMethods()) {\n\t\t\tif (!m.name.equals(method.getName())) continue;\n\t\t\tClass<?>[] t = method.getParameterTypes();\n\t\t\tif (t.length != m.paramTypes.length) continue;\n\t\t\tfor (int i = 0; i < t.length; i++) {\n\t\t\t\tif (Symbol.class.isAssignableFrom(t[i])) continue outer;\n\t\t\t\tif (!SchroedingerType.class.isAssignableFrom(m.paramTypes[i])) {\n\t\t\t\t\tif (t[i].isPrimitive()) {\n\t\t\t\t\t\tif (t[i] != m.paramTypes[i]) continue outer;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (!t[i].isAssignableFrom(m.paramTypes[i])) continue outer;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (found == null) found = method;\n\t\t\telse {\n\t\t\t\tMETHOD_CACHE.putIfAbsent(m, REFLECTIVE_ITEM_MULTIPLE_FOUND);\n\t\t\t\treturn REFLECTIVE_ITEM_MULTIPLE_FOUND;\n\t\t\t}\n\t\t}\n\t\tif (found == null) {\n\t\t\tMETHOD_CACHE.putIfAbsent(m, REFLECTIVE_ITEM_NOT_FOUND);\n\t\t\treturn REFLECTIVE_ITEM_NOT_FOUND;\n\t\t}\n\t\tPermit.setAccessible(found);\n\t\tObject marker = METHOD_CACHE.putIfAbsent(m, found);\n\t\tif (marker == null) return found;\n\t\treturn marker;\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCCompilationUnit> TopLevel = MethodId(\"TopLevel\");\n\tpublic JCCompilationUnit TopLevel(List<JCAnnotation> packageAnnotations, JCExpression pid, List<JCTree> defs) {\n\t\treturn invoke(TopLevel, packageAnnotations, pid, defs);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCImport> Import = MethodId(\"Import\");\n\tpublic JCImport Import(JCTree qualid, boolean staticImport) {\n\t\treturn invoke(Import, qualid, staticImport);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCClassDecl> ClassDef = MethodId(\"ClassDef\");\n\tpublic JCClassDecl ClassDef(JCModifiers mods, Name name, List<JCTypeParameter> typarams, JCExpression extending, List<JCExpression> implementing, List<JCTree> defs) {\n\t\treturn invoke(ClassDef, mods, name, typarams, extending, implementing, defs);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCMethodDecl> MethodDef = MethodId(\"MethodDef\", JCMethodDecl.class, JCModifiers.class, Name.class, JCExpression.class, List.class, List.class, List.class, JCBlock.class, JCExpression.class);\n\tpublic JCMethodDecl MethodDef(JCModifiers mods, Name name, JCExpression resType, List<JCTypeParameter> typarams, List<JCVariableDecl> params, List<JCExpression> thrown, JCBlock body, JCExpression defaultValue) {\n\t\treturn invoke(MethodDef, mods, name, resType, typarams, params, thrown, body, defaultValue);\n\t}\n\t\n\t//javac versions: 8\n\tprivate static final MethodId<JCMethodDecl> MethodDefWithRecvParam = MethodId(\"MethodDef\", JCMethodDecl.class, JCModifiers.class, Name.class, JCExpression.class, List.class, JCVariableDecl.class, List.class, List.class, JCBlock.class, JCExpression.class);\n\tpublic boolean hasMethodDefWithRecvParam() {\n\t\treturn has(MethodDefWithRecvParam);\n\t}\n\t\n\tpublic JCMethodDecl MethodDefWithRecvParam(JCModifiers mods, Name name, JCExpression resType, List<JCTypeParameter> typarams, JCVariableDecl recvparam, List<JCVariableDecl> params, List<JCExpression> thrown, JCBlock body, JCExpression defaultValue) {\n\t\treturn invoke(MethodDefWithRecvParam, mods, name, resType, typarams, recvparam, params, thrown, body, defaultValue);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCVariableDecl> VarDef = MethodId(\"VarDef\");\n\tpublic JCVariableDecl VarDef(JCModifiers mods, Name name, JCExpression vartype, JCExpression init) {\n\t\tJCVariableDecl varDef = invoke(VarDef, mods, name, vartype, init);\n\t\t// We use 'position of the type is -1' as indicator in delombok that the original node was written using JDK10's 'var' feature, because javac desugars 'var' to the real type and doesn't leave any markers other than the\n\t\t// node position to indicate that it did so. Unfortunately, that means vardecls we generate look like 'var' to delombok. Adjust the position to avoid this.\n\t\tif (varDef.vartype != null && varDef.vartype.pos == -1) varDef.vartype.pos = 0;\n\t\treturn varDef;\n\t}\n\t\n\t//javac versions: 8\n\tprivate static final MethodId<JCVariableDecl> ReceiverVarDef = MethodId(\"ReceiverVarDef\");\n\tpublic JCVariableDecl ReceiverVarDef(JCModifiers mods, JCExpression name, JCExpression vartype) {\n\t\treturn invoke(ReceiverVarDef, mods, name, vartype);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCSkip> Skip = MethodId(\"Skip\");\n\tpublic JCSkip Skip() {\n\t\treturn invoke(Skip);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCBlock> Block = MethodId(\"Block\");\n\tpublic JCBlock Block(long flags, List<JCStatement> stats) {\n\t\treturn invoke(Block, flags, stats);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCDoWhileLoop> DoLoop = MethodId(\"DoLoop\");\n\tpublic JCDoWhileLoop DoLoop(JCStatement body, JCExpression cond) {\n\t\treturn invoke(DoLoop, body, cond);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCWhileLoop> WhileLoop = MethodId(\"WhileLoop\");\n\tpublic JCWhileLoop WhileLoop(JCExpression cond, JCStatement body) {\n\t\treturn invoke(WhileLoop, cond, body);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCForLoop> ForLoop = MethodId(\"ForLoop\");\n\tpublic JCForLoop ForLoop(List<JCStatement> init, JCExpression cond, List<JCExpressionStatement> step, JCStatement body) {\n\t\treturn invoke(ForLoop, init, cond, step, body);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCEnhancedForLoop> ForeachLoop = MethodId(\"ForeachLoop\");\n\tpublic JCEnhancedForLoop ForeachLoop(JCVariableDecl var, JCExpression expr, JCStatement body) {\n\t\treturn invoke(ForeachLoop, var, expr, body);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCLabeledStatement> Labelled = MethodId(\"Labelled\");\n\tpublic JCLabeledStatement Labelled(Name label, JCStatement body) {\n\t\treturn invoke(Labelled, label, body);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCSwitch> Switch = MethodId(\"Switch\");\n\tpublic JCSwitch Switch(JCExpression selector, List<JCCase> cases) {\n\t\treturn invoke(Switch, selector, cases);\n\t}\n\t\n\t//javac versions: 6-11\n\tprivate static final MethodId<JCCase> Case11 = MethodId(\"Case\", JCCase.class, JCExpression.class, com.sun.tools.javac.util.List.class);\n\t//javac version: 12+\n\tpublic static class Case {\n\t\tprivate static final Class<?> CASE_KIND_CLASS = classForName(TreeMaker.class, \"com.sun.source.tree.CaseTree$CaseKind\");\n\t\tstatic final MethodId<JCCase> Case12 = MethodId(\"Case\", JCCase.class, CASE_KIND_CLASS, com.sun.tools.javac.util.List.class, com.sun.tools.javac.util.List.class, JCTree.class);\n\t\tstatic final MethodId<JCCase> Case21 = MethodId(\"Case\", JCCase.class, CASE_KIND_CLASS, com.sun.tools.javac.util.List.class, JCExpression.class, com.sun.tools.javac.util.List.class, JCTree.class);\n\t\tstatic final Object CASE_KIND_STATEMENT = CASE_KIND_CLASS.getEnumConstants()[0];\n\t}\n\t\n\tstatic Class<?> classForName(Class<?> context, String name) {\n\t\ttry {\n\t\t\treturn context.getClassLoader().loadClass(name);\n\t\t} catch (ClassNotFoundException e) {\n\t\t\tError x = new NoClassDefFoundError(e.getMessage());\n\t\t\tx.setStackTrace(e.getStackTrace());\n\t\t\tthrow x;\n\t\t}\n\t}\n\t\n\tpublic JCCase Case(JCExpression pat, List<JCStatement> stats) {\n\t\tif (tryResolve(Case11)) return invoke(Case11, pat, stats);\n\t\tList<JCTree> labels;\n\t\tif (pat == null) {\n\t\t\tlabels = tryResolve(DefaultCaseLabel) ? List.of(DefaultCaseLabel()) : List.<JCTree>nil();\n\t\t} else if (tryResolve(ConstantCaseLabel)) {\n\t\t\tlabels = List.<JCTree>of(ConstantCaseLabel(pat));\n\t\t} else {\n\t\t\tlabels = List.<JCTree>of(pat);\n\t\t}\n\t\tif (tryResolve(Case.Case12)) {\n\t\t\treturn invoke(Case.Case12, Case.CASE_KIND_STATEMENT, labels, stats, null);\n\t\t}\n\t\treturn invoke(Case.Case21, Case.CASE_KIND_STATEMENT, labels, null, stats, null);\n\t}\n\t\n\t//javac versions: 17\n\tprivate static final MethodId<JCTree> DefaultCaseLabel = MethodId(\"DefaultCaseLabel\", JCTree.class);\n\tpublic JCTree DefaultCaseLabel() {\n\t\treturn invoke(DefaultCaseLabel);\n\t}\n\t\n\t//javac versions: 19\n\tprivate static final MethodId<JCTree> ConstantCaseLabel = MethodId(\"ConstantCaseLabel\", JCTree.class, JCExpression.class);\n\tpublic JCTree ConstantCaseLabel(JCExpression expr) {\n\t\treturn invoke(ConstantCaseLabel, expr);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCSynchronized> Synchronized = MethodId(\"Synchronized\");\n\tpublic JCSynchronized Synchronized(JCExpression lock, JCBlock body) {\n\t\treturn invoke(Synchronized, lock, body);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCTry> Try = MethodId(\"Try\", JCTry.class, JCBlock.class, List.class, JCBlock.class);\n\tpublic JCTry Try(JCBlock body, List<JCCatch> catchers, JCBlock finalizer) {\n\t\treturn invoke(Try, body, catchers, finalizer);\n\t}\n\t\n\t//javac versions: 7-8\n\tprivate static final MethodId<JCTry> TryWithResources = MethodId(\"Try\", JCTry.class, List.class, JCBlock.class, List.class, JCBlock.class);\n\tpublic JCTry Try(List<JCTree> resources, JCBlock body, List<JCCatch> catchers, JCBlock finalizer) {\n\t\treturn invoke(TryWithResources, resources, body, catchers, finalizer);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCCatch> Catch = MethodId(\"Catch\");\n\tpublic JCCatch Catch(JCVariableDecl param, JCBlock body) {\n\t\treturn invoke(Catch, param, body);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCConditional> Conditional = MethodId(\"Conditional\");\n\tpublic JCConditional Conditional(JCExpression cond, JCExpression thenpart, JCExpression elsepart) {\n\t\treturn invoke(Conditional, cond, thenpart, elsepart);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCIf> If = MethodId(\"If\");\n\tpublic JCIf If(JCExpression cond, JCStatement thenpart, JCStatement elsepart) {\n\t\treturn invoke(If, cond, thenpart, elsepart);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCExpressionStatement> Exec = MethodId(\"Exec\");\n\tpublic JCExpressionStatement Exec(JCExpression expr) {\n\t\treturn invoke(Exec, expr);\n\t}\n\t\n\t//javac version: 6-11\n\tprivate static final MethodId<JCBreak> Break11 = MethodId(\"Break\", JCBreak.class, Name.class);\n\t//javac version: 12+\n\tprivate static final MethodId<JCBreak> Break12 = MethodId(\"Break\", JCBreak.class, JCExpression.class);\n\t\n\tpublic JCBreak Break(Name label) {\n\t\tif (tryResolve(Break11)) return invoke(Break11, label);\n\t\treturn invoke(Break12, label != null ? Ident(label) : null);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCContinue> Continue = MethodId(\"Continue\");\n\tpublic JCContinue Continue(Name label) {\n\t\treturn invoke(Continue, label);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCReturn> Return = MethodId(\"Return\");\n\tpublic JCReturn Return(JCExpression expr) {\n\t\treturn invoke(Return, expr);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCThrow> Throw = MethodId(\"Throw\");\n\tpublic JCThrow Throw(JCExpression expr) {\n\t\treturn invoke(Throw, expr);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCAssert> Assert = MethodId(\"Assert\");\n\tpublic JCAssert Assert(JCExpression cond, JCExpression detail) {\n\t\treturn invoke(Assert, cond, detail);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCMethodInvocation> Apply = MethodId(\"Apply\");\n\tpublic JCMethodInvocation Apply(List<JCExpression> typeargs, JCExpression fn, List<JCExpression> args) {\n\t\treturn invoke(Apply, typeargs, fn, args);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCNewClass> NewClass = MethodId(\"NewClass\");\n\tpublic JCNewClass NewClass(JCExpression encl, List<JCExpression> typeargs, JCExpression clazz, List<JCExpression> args, JCClassDecl def) {\n\t\treturn invoke(NewClass, encl, typeargs, clazz, args, def);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCNewArray> NewArray = MethodId(\"NewArray\");\n\tpublic JCNewArray NewArray(JCExpression elemtype, List<JCExpression> dims, List<JCExpression> elems) {\n\t\treturn invoke(NewArray, elemtype, dims, elems);\n\t}\n\t\n\t//javac versions: 8\n//\tprivate static final MethodId<JCLambda> Lambda = MethodId(\"Lambda\");\n//\tpublic JCLambda Lambda(List<JCVariableDecl> params, JCTree body) {\n//\t\treturn invoke(Lambda, params, body);\n//\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCParens> Parens = MethodId(\"Parens\");\n\tpublic JCParens Parens(JCExpression expr) {\n\t\treturn invoke(Parens, expr);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCAssign> Assign = MethodId(\"Assign\");\n\tpublic JCAssign Assign(JCExpression lhs, JCExpression rhs) {\n\t\treturn invoke(Assign, lhs, rhs);\n\t}\n\t\n\t//javac versions: 6-8\n\t//opcode = [6-7] int  [8] JCTree.Tag\n\tprivate static final MethodId<JCAssignOp> Assignop = MethodId(\"Assignop\");\n\tpublic JCAssignOp Assignop(TreeTag opcode, JCTree lhs, JCTree rhs) {\n\t\treturn invoke(Assignop, opcode.value, lhs, rhs);\n\t}\n\t\n\t//javac versions: 6-8\n\t//opcode = [6-7] int  [8] JCTree.Tag\n\tprivate static final MethodId<JCUnary> Unary = MethodId(\"Unary\");\n\tpublic JCUnary Unary(TreeTag opcode, JCExpression arg) {\n\t\treturn invoke(Unary, opcode.value, arg);\n\t}\n\t\n\t//javac versions: 6-8\n\t//opcode = [6-7] int  [8] JCTree.Tag\n\tprivate static final MethodId<JCBinary> Binary = MethodId(\"Binary\");\n\tpublic JCBinary Binary(TreeTag opcode, JCExpression lhs, JCExpression rhs) {\n\t\treturn invoke(Binary, opcode.value, lhs, rhs);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCTypeCast> TypeCast = MethodId(\"TypeCast\");\n\tpublic JCTypeCast TypeCast(JCTree expr, JCExpression type) {\n\t\treturn invoke(TypeCast, expr, type);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCInstanceOf> TypeTest = MethodId(\"TypeTest\");\n\tpublic JCInstanceOf TypeTest(JCExpression expr, JCTree clazz) {\n\t\treturn invoke(TypeTest, expr, clazz);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCArrayAccess> Indexed = MethodId(\"Indexed\");\n\tpublic JCArrayAccess Indexed(JCExpression indexed, JCExpression index) {\n\t\treturn invoke(Indexed, indexed, index);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCFieldAccess> Select = MethodId(\"Select\");\n\tpublic JCFieldAccess Select(JCExpression selected, Name selector) {\n\t\treturn invoke(Select, selected, selector);\n\t}\n\t\n\t//javac versions: 8\n//\tprivate static final MethodId<JCMemberReference> Reference = MethodId(\"Reference\");\n//\tpublic JCMemberReference Reference(JCMemberReference.ReferenceMode mode, Name name, JCExpression expr, List<JCExpression> typeargs) {\n//\t\treturn invoke(Reference, mode, name, expr, typeargs);\n//\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCIdent> Ident = MethodId(\"Ident\", JCIdent.class, Name.class);\n\tpublic JCIdent Ident(Name idname) {\n\t\treturn invoke(Ident, idname);\n\t}\n\t\n\t//javac versions: 6-8\n\t//tag = [6-7] int  [8] TypeTag\n\tprivate static final MethodId<JCLiteral> Literal = MethodId(\"Literal\", JCLiteral.class, TypeTag.class, Object.class);\n\tpublic JCLiteral Literal(TypeTag tag, Object value) {\n\t\treturn invoke(Literal, tag.value, value);\n\t}\n\t\n\t//javac versions: 6-8\n\t//typetag = [6-7] int  [8] TypeTag\n\tprivate static final MethodId<JCPrimitiveTypeTree> TypeIdent = MethodId(\"TypeIdent\");\n\tpublic JCPrimitiveTypeTree TypeIdent(TypeTag typetag) {\n\t\treturn invoke(TypeIdent, typetag.value);\n\t}\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCArrayTypeTree> TypeArray = MethodId(\"TypeArray\");\n\tpublic JCArrayTypeTree TypeArray(JCExpression elemtype) {\n\t\treturn invoke(TypeArray, elemtype);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCTypeApply> TypeApply = MethodId(\"TypeApply\");\n\tpublic JCTypeApply TypeApply(JCExpression clazz, List<JCExpression> arguments) {\n\t\treturn invoke(TypeApply, clazz, arguments);\n\t}\n\t\n\t//javac versions: 7-8\n//\tprivate static final MethodId<JCTypeUnion> TypeUnion = MethodId(\"TypeUnion\");\n//\tpublic JCTypeUnion TypeUnion(List<JCExpression> components) {\n//\t\treturn invoke(TypeUnion, compoonents);\n//\t}\n\n\t//javac versions: 8\n//\tprivate static final MethodId<JCTypeIntersection> TypeIntersection = MethodId(\"TypeIntersection\");\n//\tpublic JCTypeIntersection TypeIntersection(List<JCExpression> components) {\n//\t\treturn invoke(TypeIntersection, components);\n//\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCTypeParameter> TypeParameter = MethodId(\"TypeParameter\", JCTypeParameter.class, Name.class, List.class);\n\tpublic JCTypeParameter TypeParameter(Name name, List<JCExpression> bounds) {\n\t\treturn invoke(TypeParameter, name, bounds);\n\t}\n\t\n\t//javac versions: 8\n\tprivate static final MethodId<JCTypeParameter> TypeParameterWithAnnos = MethodId(\"TypeParameter\", JCTypeParameter.class, Name.class, List.class, List.class);\n\tpublic JCTypeParameter TypeParameter(Name name, List<JCExpression> bounds, List<JCAnnotation> annos) {\n\t\treturn invoke(TypeParameterWithAnnos, name, bounds, annos);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCWildcard> Wildcard = MethodId(\"Wildcard\");\n\tpublic JCWildcard Wildcard(TypeBoundKind kind, JCTree type) {\n\t\treturn invoke(Wildcard, kind, type);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<TypeBoundKind> TypeBoundKind = MethodId(\"TypeBoundKind\");\n\tpublic TypeBoundKind TypeBoundKind(BoundKind kind) {\n\t\treturn invoke(TypeBoundKind, kind);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCAnnotation> Annotation = MethodId(\"Annotation\", JCAnnotation.class, JCTree.class, List.class);\n\tpublic JCAnnotation Annotation(JCTree annotationType, List<JCExpression> args) {\n\t\treturn invoke(Annotation, annotationType, args);\n\t}\n\t\n\t//javac versions: 8\n\tprivate static final MethodId<JCAnnotation> TypeAnnotation = MethodId(\"TypeAnnotation\", JCAnnotation.class, JCTree.class, List.class);\n\tpublic JCAnnotation TypeAnnotation(JCTree annotationType, List<JCExpression> args) {\n\t\treturn invoke(TypeAnnotation, annotationType, args);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCModifiers> ModifiersWithAnnotations = MethodId(\"Modifiers\", JCModifiers.class, long.class, List.class);\n\tpublic JCModifiers Modifiers(long flags, List<JCAnnotation> annotations) {\n\t\treturn invoke(ModifiersWithAnnotations, flags, annotations);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCModifiers> Modifiers = MethodId(\"Modifiers\", JCModifiers.class, long.class);\n\tpublic JCModifiers Modifiers(long flags) {\n\t\treturn invoke(Modifiers, flags);\n\t}\n\t\n\t//javac versions: 8\n//\tprivate static final MethodId<JCAnnotatedType> AnnotatedType = MethodId(\"AnnotatedType\");\n//\tpublic JCAnnotatedType AnnotatedType(List<JCAnnotation> annotations, JCExpression underlyingType) {\n//\t\treturn invoke(AnnotatedType, annotations, underlyingType);\n//\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCErroneous> Erroneous = MethodId(\"Erroneous\", JCErroneous.class);\n\tpublic JCErroneous Erroneous() {\n\t\treturn invoke(Erroneous);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCErroneous> ErroneousWithErrs = MethodId(\"Erroneous\", JCErroneous.class, List.class);\n\tpublic JCErroneous Erroneous(List<? extends JCTree> errs) {\n\t\treturn invoke(ErroneousWithErrs, errs);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<LetExpr> LetExpr = MethodId(\"LetExpr\", LetExpr.class, List.class, JCTree.class);\n\tpublic LetExpr LetExpr(List<JCVariableDecl> defs, JCTree expr) {\n\t\treturn invoke(LetExpr, defs, expr);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCClassDecl> AnonymousClassDef = MethodId(\"AnonymousClassDef\");\n\tpublic JCClassDecl AnonymousClassDef(JCModifiers mods, List<JCTree> defs) {\n\t\treturn invoke(AnonymousClassDef, mods, defs);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<LetExpr> LetExprSingle = MethodId(\"LetExpr\", LetExpr.class, JCVariableDecl.class, JCTree.class);\n\tpublic LetExpr LetExpr(JCVariableDecl def, JCTree expr) {\n\t\treturn invoke(LetExprSingle, def, expr);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCIdent> IdentVarDecl = MethodId(\"Ident\", JCIdent.class, JCVariableDecl.class);\n\tpublic JCExpression Ident(JCVariableDecl param) {\n\t\treturn invoke(IdentVarDecl, param);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<List<JCExpression>> Idents = MethodId(\"Idents\");\n\tpublic List<JCExpression> Idents(List<JCVariableDecl> params) {\n\t\treturn invoke(Idents, params);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCMethodInvocation> App2 = MethodId(\"App\", JCMethodInvocation.class, JCExpression.class, List.class);\n\tpublic JCMethodInvocation App(JCExpression meth, List<JCExpression> args) {\n\t\treturn invoke(App2, meth, args);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCMethodInvocation> App1 = MethodId(\"App\", JCMethodInvocation.class, JCExpression.class);\n\tpublic JCMethodInvocation App(JCExpression meth) {\n\t\treturn invoke(App1, meth);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<List<JCAnnotation>> Annotations = MethodId(\"Annotations\");\n\tpublic List<JCAnnotation> Annotations(List<Attribute.Compound> attributes) {\n\t\treturn invoke(Annotations, attributes);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCLiteral> LiteralWithValue = MethodId(\"Literal\", JCLiteral.class, Object.class);\n\tpublic JCLiteral Literal(Object value) {\n\t\treturn invoke(LiteralWithValue, value);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCAnnotation> AnnotationWithAttributeOnly = MethodId(\"Annotation\", JCAnnotation.class, Attribute.class);\n\tpublic JCAnnotation Annotation(Attribute a) {\n\t\treturn invoke(AnnotationWithAttributeOnly, a);\n\t}\n\t\n\t//javac versions: 8\n\tprivate static final MethodId<JCAnnotation> TypeAnnotationWithAttributeOnly = MethodId(\"TypeAnnotation\", JCAnnotation.class, Attribute.class);\n\tpublic JCAnnotation TypeAnnotation(Attribute a) {\n\t\treturn invoke(TypeAnnotationWithAttributeOnly, a);\n\t}\n\t\n\t//javac versions: 8\n\tprivate static final MethodId<JCExpression> AnnotatedType = MethodId(\"AnnotatedType\", JCExpression.class, List.class, JCExpression.class);\n\tpublic JCExpression AnnotatedType(List<JCAnnotation> annotations, JCExpression underlyingType) {\n\t\treturn invoke(AnnotatedType, annotations, underlyingType);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCStatement> Call = MethodId(\"Call\");\n\tpublic JCStatement Call(JCExpression apply) {\n\t\treturn invoke(Call, apply);\n\t}\n\t\n\t//javac versions: 6-8\n\tprivate static final MethodId<JCExpression> Type = MethodId(\"Type\");\n\tpublic JCExpression Type(Type type) {\n\t\treturn invoke(Type, type);\n\t}\n\t\n\tprivate static final FieldId<JCVariableDecl> MethodDecl_recvParam = FieldId(JCMethodDecl.class, \"recvparam\", JCVariableDecl.class);\n\t//javac versions: 8+\n\tpublic boolean hasReceiverParameter() {\n\t\treturn has(MethodDecl_recvParam);\n\t}\n\t\n\tpublic JCVariableDecl getReceiverParameter(JCMethodDecl method) {\n\t\treturn get(method, MethodDecl_recvParam);\n\t}\n\t\n\tpublic void setReceiverParameter(JCMethodDecl method, JCVariableDecl param) {\n\t\tset(method, MethodDecl_recvParam, param);\n\t}\n}"
  },
  {
    "path": "src/utils/lombok/javac/PackageName.java",
    "content": "/*\n * Copyright (C) 2017 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac;\n\nimport java.lang.reflect.Method;\n\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCCompilationUnit;\nimport com.sun.tools.javac.tree.JCTree.JCFieldAccess;\nimport com.sun.tools.javac.tree.JCTree.JCIdent;\n\nimport lombok.permit.Permit;\n\n// Supports JDK6-9\npublic class PackageName {\n\tprivate static final Method packageNameMethod = getPackageNameMethod();\n\t\n\tprivate static Method getPackageNameMethod() {\n\t\ttry {\n\t\t\treturn Permit.getMethod(JCCompilationUnit.class, \"getPackageName\");\n\t\t} catch (Exception e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic static String getPackageName(JCCompilationUnit cu) {\n\t\tJCTree t = getPackageNode(cu);\n\t\treturn t != null ? t.toString() : null;\n\t}\n\t\n\tpublic static JCTree getPackageNode(JCCompilationUnit cu) {\n\t\tif (packageNameMethod != null) try {\n\t\t\tObject pkg = packageNameMethod.invoke(cu);\n\t\t\treturn (pkg instanceof JCFieldAccess || pkg instanceof JCIdent) ? (JCTree) pkg : null;\n\t\t} catch (Exception e) {}\n\t\treturn cu.pid instanceof JCFieldAccess || cu.pid instanceof JCIdent ? cu.pid : null;\n\t}\n}\n"
  },
  {
    "path": "src/utils/lombok/javac/TreeMirrorMaker.java",
    "content": "/*\n * Copyright (C) 2010-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac;\n\nimport java.util.Collections;\nimport java.util.IdentityHashMap;\nimport java.util.Iterator;\nimport java.util.Map;\n\nimport static lombok.javac.Javac.*;\nimport lombok.javac.JavacTreeMaker.TypeTag;\n\nimport com.sun.source.tree.LabeledStatementTree;\nimport com.sun.source.tree.VariableTree;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCFieldAccess;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.tree.TreeCopier;\nimport com.sun.tools.javac.tree.TreeScanner;\nimport com.sun.tools.javac.util.Context;\nimport com.sun.tools.javac.util.List;\n\n/**\n * Makes a copy of any AST node, with some exceptions.\n * Exceptions:<ul>\n * <li>The symbol ('sym') of a copied variable isn't copied.\n * <li>all labels are removed.\n * </ul>\n * \n * The purpose of this class is to make a copy, and then the copy is attributed (resolution info is added). These exceptions\n * are to work around apparent bugs (or at least inconsistencies) in javac sources.\n */\npublic class TreeMirrorMaker extends TreeCopier<Void> {\n\tprivate final IdentityHashMap<JCTree, JCTree> originalToCopy = new IdentityHashMap<JCTree, JCTree>();\n\t\n\tpublic TreeMirrorMaker(JavacTreeMaker maker, Context context) {\n\t\tsuper(maker.getUnderlyingTreeMaker());\n\t}\n\t\n\t@Override public <T extends JCTree> T copy(T original) {\n\t\tT copy = super.copy(original);\n\t\tputIfAbsent(originalToCopy, original, copy);\n\t\treturn copy;\n\t}\n\t\n\t@Override public <T extends JCTree> T copy(T original, Void p) {\n\t\tT copy = super.copy(original, p);\n\t\tputIfAbsent(originalToCopy, original, copy);\n\t\treturn copy; \n\t}\n\t\n\t@Override public <T extends JCTree> List<T> copy(List<T> originals) {\n\t\tList<T> copies = super.copy(originals);\n\t\tif (originals != null) {\n\t\t\tIterator<T> it1 = originals.iterator();\n\t\t\tIterator<T> it2 = copies.iterator();\n\t\t\twhile (it1.hasNext()) putIfAbsent(originalToCopy, it1.next(), it2.next());\n\t\t}\n\t\treturn copies;\n\t}\n\t\n\t@Override public <T extends JCTree> List<T> copy(List<T> originals, Void p) {\n\t\tList<T> copies = super.copy(originals, p);\n\t\tif (originals != null) {\n\t\t\tIterator<T> it1 = originals.iterator();\n\t\t\tIterator<T> it2 = copies.iterator();\n\t\t\twhile (it1.hasNext()) putIfAbsent(originalToCopy, it1.next(), it2.next());\n\t\t}\n\t\treturn copies;\n\t}\n\t\n\tpublic Map<JCTree, JCTree> getOriginalToCopyMap() {\n\t\treturn Collections.unmodifiableMap(originalToCopy);\n\t}\n\t\n\t// Monitor the following issues when making changes here.\n\t// - https://github.com/projectlombok/lombok/issues/278\n\t// - https://github.com/projectlombok/lombok/issues/729\n\t@Override public JCTree visitVariable(VariableTree node, Void p) {\n\t\tJCVariableDecl original = node instanceof JCVariableDecl ? (JCVariableDecl) node : null;\n\t\tJCVariableDecl copy = (JCVariableDecl) super.visitVariable(node, p);\n\t\tif (original == null) return copy;\n\t\tcopy.sym = original.sym;\n\t\tif (copy.sym != null) copy.type = original.type;\n\t\tif (copy.type != null) {\n\t\t\tboolean wipeSymAndType = copy.type.isErroneous();\n\t\t\tif (!wipeSymAndType) {\n\t\t\t\tTypeTag typeTag = TypeTag.typeTag(copy.type);\n\t\t\t\twipeSymAndType = (typeTag.equals(CTC_NONE) || typeTag.equals(CTC_ERROR) || typeTag.equals(CTC_UNKNOWN) || typeTag.equals(CTC_UNDETVAR));\n\t\t\t}\n\t\t\t\n\t\t\tif (wipeSymAndType) {\n\t\t\t\tcopy.sym = null;\n\t\t\t\tcopy.type = null;\n\t\t\t} else {\n\t\t\t\tif (original.vartype != null) {\n\t\t\t\t\tcopy.vartype.type = original.vartype.type;\n\t\t\t\t\toriginal.vartype.accept(new TreeScanner() {\n\t\t\t\t\t\t@Override public void scan(JCTree tree) {\n\t\t\t\t\t\t\tsuper.scan(tree);\n\t\t\t\t\t\t\toriginalToCopy.get(tree).type = tree.type;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t@Override public void visitSelect(JCFieldAccess tree) {\n\t\t\t\t\t\t\tsuper.visitSelect(tree);\n\t\t\t\t\t\t\t((JCFieldAccess) originalToCopy.get(tree)).sym = tree.sym;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn copy;\n\t}\n\t\n\t// Fix for NPE in HandleVal. See https://github.com/projectlombok/lombok/issues/372\n\t// This and visitVariable is rather hacky but we're working around evident bugs or at least inconsistencies in javac.\n\t@Override public JCTree visitLabeledStatement(LabeledStatementTree node, Void p) {\n\t\treturn node.getStatement().accept(this, p);\n\t}\n\t\n\tprivate <K, V> void putIfAbsent(Map<K, V> map, K key, V value) {\n\t\tif (!map.containsKey(key)) {\n\t\t\tmap.put(key, value);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/utils/lombok/javac/java6/CommentCollectingParser.java",
    "content": "/*\n * Copyright (C) 2013-2014 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.java6;\n\nimport static lombok.javac.CommentCatcher.JCCompilationUnit_comments;\nimport lombok.javac.CommentInfo;\n\nimport com.sun.tools.javac.parser.EndPosParser;\nimport com.sun.tools.javac.parser.Lexer;\nimport com.sun.tools.javac.parser.Parser;\nimport com.sun.tools.javac.tree.JCTree.JCCompilationUnit;\nimport com.sun.tools.javac.util.List;\n\nclass CommentCollectingParser extends EndPosParser {\n\tprivate final Lexer lexer;\n\t\n\tprotected CommentCollectingParser(Parser.Factory fac, Lexer S, boolean keepDocComments) {\n\t\tsuper(fac, S, keepDocComments);\n\t\tlexer = S;\n\t}\n\t\n\t@Override public JCCompilationUnit compilationUnit() {\n\t\tJCCompilationUnit result = super.compilationUnit();\n\t\tif (lexer instanceof CommentCollectingScanner) {\n\t\t\tList<CommentInfo> comments = ((CommentCollectingScanner)lexer).getComments();\n\t\t\tJCCompilationUnit_comments.set(result, comments);\n\t\t}\n\t\treturn result;\n\t}\n}"
  },
  {
    "path": "src/utils/lombok/javac/java6/CommentCollectingParserFactory.java",
    "content": "/*\n * Copyright (C) 2013-2014 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.java6;\n\nimport java.lang.reflect.Field;\n\nimport com.sun.tools.javac.main.JavaCompiler;\nimport com.sun.tools.javac.parser.Lexer;\nimport com.sun.tools.javac.parser.Parser;\nimport com.sun.tools.javac.util.Context;\n\nimport lombok.permit.Permit;\n\npublic class CommentCollectingParserFactory extends Parser.Factory {\n\tstatic Context.Key<Parser.Factory> key() {\n\t\treturn parserFactoryKey;\n\t}\n\t\n\tprotected CommentCollectingParserFactory(Context context) {\n\t\tsuper(context);\n\t}\n\t\n\t@Override public Parser newParser(Lexer S, boolean keepDocComments, boolean genEndPos) {\n\t\tObject x = new CommentCollectingParser(this, S, true);\n\t\treturn (Parser) x;\n\t\t// CCP is based on a stub which extends nothing, but at runtime the stub is replaced with either\n\t\t//javac6's EndPosParser which extends Parser, or javac7's EndPosParser which implements Parser.\n\t\t//Either way this will work out.\n\t}\n\t\n\tpublic static void setInCompiler(JavaCompiler compiler, Context context) {\n\t\tcontext.put(CommentCollectingParserFactory.key(), (Parser.Factory)null);\n\t\tField field;\n\t\ttry {\n\t\t\tfield = Permit.getField(JavaCompiler.class, \"parserFactory\");\n\t\t\tfield.set(compiler, new CommentCollectingParserFactory(context));\n\t\t} catch (Exception e) {\n\t\t\tthrow new IllegalStateException(\"Could not set comment sensitive parser in the compiler\", e);\n\t\t}\n\t}\n}"
  },
  {
    "path": "src/utils/lombok/javac/java6/CommentCollectingScanner.java",
    "content": "/*\n * Copyright (C) 2011-2013 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.java6;\n\nimport java.nio.CharBuffer;\n\nimport lombok.javac.CommentInfo;\nimport lombok.javac.CommentInfo.EndConnection;\nimport lombok.javac.CommentInfo.StartConnection;\n\nimport com.sun.tools.javac.parser.Scanner;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.ListBuffer;\n\npublic class CommentCollectingScanner extends Scanner {\n\tprivate final ListBuffer<CommentInfo> comments = new ListBuffer<CommentInfo>();\n\tprivate int endComment = 0;\n\t\n\tpublic CommentCollectingScanner(CommentCollectingScannerFactory factory, CharBuffer charBuffer) {\n\t\tsuper(factory, charBuffer);\n\t}\n\t\n\tpublic CommentCollectingScanner(CommentCollectingScannerFactory factory, char[] input, int inputLength) {\n\t\tsuper(factory, input, inputLength);\n\t}\n\t\n\t@Override\n\tprotected void processComment(CommentStyle style) {\n\t\tint prevEndPos = Math.max(prevEndPos(), endComment);\n\t\tint pos = pos();\n\t\tint endPos = endPos();\n\t\tendComment = endPos;\n\t\tString content = new String(getRawCharacters(pos, endPos));\n\t\tStartConnection start = determineStartConnection(prevEndPos, pos);\n\t\tEndConnection end = determineEndConnection(endPos); \n\n\t\tCommentInfo comment = new CommentInfo(prevEndPos, pos, endPos, content, start, end);\n\t\tcomments.append(comment);\n\t\tsuper.processComment(style);\n\t}\n\t\n\tprivate EndConnection determineEndConnection(int pos) {\n\t\tboolean first = true;\n\t\tfor (int i = pos;; i++) {\n\t\t\tchar c;\n\t\t\ttry {\n\t\t\t\tc = getRawCharacters(i, i + 1)[0];\n\t\t\t} catch (IndexOutOfBoundsException e) {\n\t\t\t\tc = '\\n';\n\t\t\t}\n\t\t\tif (isNewLine(c)) {\n\t\t\t\treturn EndConnection.ON_NEXT_LINE;\n\t\t\t}\n\t\t\tif (Character.isWhitespace(c)) {\n\t\t\t\tfirst = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\treturn first ? EndConnection.DIRECT_AFTER_COMMENT : EndConnection.AFTER_COMMENT;\n\t\t}\n\t}\n\n\tprivate StartConnection determineStartConnection(int from, int to) {\n\t\tif (from == to) {\n\t\t\treturn StartConnection.DIRECT_AFTER_PREVIOUS;\n\t\t}\n\t\tchar[] between = getRawCharacters(from, to);\n\t\tif (isNewLine(between[between.length - 1])) {\n\t\t\treturn StartConnection.START_OF_LINE;\n\t\t}\n\t\tfor (char c : between) {\n\t\t\tif (isNewLine(c)) {\n\t\t\t\treturn StartConnection.ON_NEXT_LINE;\n\t\t\t}\n\t\t}\n\t\treturn StartConnection.AFTER_PREVIOUS;\n\t}\n\n\tprivate boolean isNewLine(char c) {\n\t\treturn c == '\\n' || c == '\\r';\n\t}\n\n\tpublic List<CommentInfo> getComments() {\n\t\treturn comments.toList();\n\t}\n}\n"
  },
  {
    "path": "src/utils/lombok/javac/java6/CommentCollectingScannerFactory.java",
    "content": "/*\n * Copyright (C) 2011-2013 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.java6;\n\nimport java.nio.CharBuffer;\n\nimport com.sun.tools.javac.parser.Scanner;\nimport com.sun.tools.javac.util.Context;\n\npublic class CommentCollectingScannerFactory extends Scanner.Factory {\n\t\n\t@SuppressWarnings(\"all\")\n\tpublic static void preRegister(final Context context) {\n\t\tif (context.get(scannerFactoryKey) == null) {\n\t\t\t// Careful! There is voodoo magic here!\n\t\t\t//\n\t\t\t// Context.Factory is parameterized. make() is for javac6 and below; make(Context) is for javac7 and up.\n\t\t\t// this anonymous inner class definition is intentionally 'raw' - the return type of both 'make' methods is 'T',\n\t\t\t// which means the compiler will only generate the correct \"real\" override method (with returntype Object, which is\n\t\t\t// the lower bound for T, as a synthetic accessor for the make with returntype ScannerFactory) for that make method which\n\t\t\t// is actually on the classpath (either make() for javac6-, or make(Context) for javac7+).\n\t\t\t//\n\t\t\t// We normally solve this issue via src/stubs, with BOTH make methods listed, but for some reason the presence of a stubbed out\n\t\t\t// Context (or even a complete copy, it doesn't matter) results in a really strange eclipse bug, where any mention of any kind\n\t\t\t// of com.sun.tools.javac.tree.TreeMaker in a source file disables ALL usage of 'go to declaration' and auto-complete in the entire\n\t\t\t// source file.\n\t\t\t//\n\t\t\t// Thus, in short:\n\t\t\t// * Do NOT parameterize the anonymous inner class literal.\n\t\t\t// * Leave the return types as 'j.l.Object'.\n\t\t\t// * Leave both make methods intact; deleting one has no effect on javac6- / javac7+, but breaks the other. Hard to test for.\n\t\t\t// * Do not stub com.sun.tools.javac.util.Context or any of its inner types, like Factory.\n\t\t\t@SuppressWarnings(\"all\")\n\t\t\tclass MyFactory implements Context.Factory {\n\t\t\t\t// This overrides the javac6- version of make.\n\t\t\t\tpublic Object make() {\n\t\t\t\t\treturn new CommentCollectingScannerFactory(context);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// This overrides the javac7+ version of make.\n\t\t\t\tpublic Object make(Context c) {\n\t\t\t\t\treturn new CommentCollectingScannerFactory(c);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t@SuppressWarnings(\"unchecked\") Context.Factory<Scanner.Factory> factory = new MyFactory();\n\t\t\tcontext.put(scannerFactoryKey, factory);\n\t\t}\n\t}\n\t\n\t/** Create a new scanner factory. */\n\tprotected CommentCollectingScannerFactory(Context context) {\n\t\tsuper(context);\n\t}\n\t\n\t@Override\n\tpublic Scanner newScanner(CharSequence input) {\n\t\tif (input instanceof CharBuffer) {\n\t\t\treturn new CommentCollectingScanner(this, (CharBuffer)input);\n\t\t}\n\t\tchar[] array = input.toString().toCharArray();\n\t\treturn newScanner(array, array.length);\n\t}\n\t\n\t@Override\n\tpublic Scanner newScanner(char[] input, int inputLength) {\n\t\treturn new CommentCollectingScanner(this, input, inputLength);\n\t}\n}"
  },
  {
    "path": "src/utils/lombok/javac/java7/CommentCollectingParser.java",
    "content": "/*\n * Copyright (C) 2013-2014 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.java7;\n\nimport static lombok.javac.CommentCatcher.JCCompilationUnit_comments;\n\nimport java.util.List;\n\nimport lombok.javac.CommentInfo;\n\nimport com.sun.tools.javac.parser.EndPosParser;\nimport com.sun.tools.javac.parser.Lexer;\nimport com.sun.tools.javac.parser.ParserFactory;\nimport com.sun.tools.javac.tree.JCTree.JCCompilationUnit;\n\nclass CommentCollectingParser extends EndPosParser {\n\tprivate final Lexer lexer;\n\t\n\tprotected CommentCollectingParser(ParserFactory fac, Lexer S,\n\t\t\tboolean keepDocComments, boolean keepLineMap) {\n\t\tsuper(fac, S, keepDocComments, keepLineMap);\n\t\tlexer = S;\n\t}\n\t\n\tpublic JCCompilationUnit parseCompilationUnit() {\n\t\tJCCompilationUnit result = super.parseCompilationUnit();\n\t\tif (lexer instanceof CommentCollectingScanner) {\n\t\t\tList<CommentInfo> comments = ((CommentCollectingScanner)lexer).getComments();\n\t\t\tJCCompilationUnit_comments.set(result, comments);\n\t\t}\n\t\treturn result;\n\t}\n}"
  },
  {
    "path": "src/utils/lombok/javac/java7/CommentCollectingParserFactory.java",
    "content": "/*\n * Copyright (C) 2013-2014 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.java7;\n\nimport java.lang.reflect.Field;\n\nimport com.sun.tools.javac.main.JavaCompiler;\nimport com.sun.tools.javac.parser.Lexer;\nimport com.sun.tools.javac.parser.Parser;\nimport com.sun.tools.javac.parser.ParserFactory;\nimport com.sun.tools.javac.parser.ScannerFactory;\nimport com.sun.tools.javac.util.Context;\n\nimport lombok.permit.Permit;\n\npublic class CommentCollectingParserFactory extends ParserFactory {\n\tprivate final Context context;\n\t\n\tstatic Context.Key<ParserFactory> key() {\n\t\treturn parserFactoryKey;\n\t}\n\t\n\tprotected CommentCollectingParserFactory(Context context) {\n\t\tsuper(context);\n\t\tthis.context = context;\n\t}\n\t\n\tpublic Parser newParser(CharSequence input, boolean keepDocComments, boolean keepEndPos, boolean keepLineMap) {\n\t\tScannerFactory scannerFactory = ScannerFactory.instance(context);\n\t\tLexer lexer = scannerFactory.newScanner(input, true);\n\t\tObject x = new CommentCollectingParser(this, lexer, true, keepLineMap);\n\t\treturn (Parser) x;\n\t\t// CCP is based on a stub which extends nothing, but at runtime the stub is replaced with either\n\t\t//javac6's EndPosParser which extends Parser, or javac7's EndPosParser which implements Parser.\n\t\t//Either way this will work out.\n\t}\n\t\n\tpublic static void setInCompiler(JavaCompiler compiler, Context context) {\n\t\tcontext.put(CommentCollectingParserFactory.key(), (ParserFactory)null);\n\t\tField field;\n\t\ttry {\n\t\t\tfield = Permit.getField(JavaCompiler.class, \"parserFactory\");\n\t\t\tfield.set(compiler, new CommentCollectingParserFactory(context));\n\t\t} catch (Exception e) {\n\t\t\tthrow new IllegalStateException(\"Could not set comment sensitive parser in the compiler\", e);\n\t\t}\n\t}\n}"
  },
  {
    "path": "src/utils/lombok/javac/java7/CommentCollectingScanner.java",
    "content": "/*\n * Copyright (C) 2011-2013 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.java7;\n\nimport java.nio.CharBuffer;\n\nimport lombok.javac.CommentInfo;\nimport lombok.javac.CommentInfo.EndConnection;\nimport lombok.javac.CommentInfo.StartConnection;\n\nimport com.sun.tools.javac.parser.Scanner;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.ListBuffer;\n\npublic class CommentCollectingScanner extends Scanner {\n\tprivate final ListBuffer<CommentInfo> comments = new ListBuffer<CommentInfo>();\n\tprivate int endComment = 0;\n\t\n\tpublic CommentCollectingScanner(CommentCollectingScannerFactory factory, CharBuffer charBuffer) {\n\t\tsuper(factory, charBuffer);\n\t}\n\t\n\tpublic CommentCollectingScanner(CommentCollectingScannerFactory factory, char[] input, int inputLength) {\n\t\tsuper(factory, input, inputLength);\n\t}\n\t\n\t@Override\n\tprotected void processComment(CommentStyle style) {\n\t\tint prevEndPos = Math.max(prevEndPos(), endComment);\n\t\tint pos = pos();\n\t\tint endPos = endPos();\n\t\tendComment = endPos;\n\t\tString content = new String(getRawCharacters(pos, endPos));\n\t\tStartConnection start = determineStartConnection(prevEndPos, pos);\n\t\tEndConnection end = determineEndConnection(endPos); \n\n\t\tCommentInfo comment = new CommentInfo(prevEndPos, pos, endPos, content, start, end);\n\t\tcomments.append(comment);\n\t\tsuper.processComment(style);\n\t}\n\t\n\tprivate EndConnection determineEndConnection(int pos) {\n\t\tboolean first = true;\n\t\tfor (int i = pos;; i++) {\n\t\t\tchar c;\n\t\t\ttry {\n\t\t\t\tc = getRawCharacters(i, i + 1)[0];\n\t\t\t} catch (IndexOutOfBoundsException e) {\n\t\t\t\tc = '\\n';\n\t\t\t}\n\t\t\tif (isNewLine(c)) {\n\t\t\t\treturn EndConnection.ON_NEXT_LINE;\n\t\t\t}\n\t\t\tif (Character.isWhitespace(c)) {\n\t\t\t\tfirst = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\treturn first ? EndConnection.DIRECT_AFTER_COMMENT : EndConnection.AFTER_COMMENT;\n\t\t}\n\t}\n\t\n\tprivate StartConnection determineStartConnection(int from, int to) {\n\t\tif (from == to) {\n\t\t\treturn StartConnection.DIRECT_AFTER_PREVIOUS;\n\t\t}\n\t\tchar[] between = getRawCharacters(from, to);\n\t\tif (isNewLine(between[between.length - 1])) {\n\t\t\treturn StartConnection.START_OF_LINE;\n\t\t}\n\t\tfor (char c : between) {\n\t\t\tif (isNewLine(c)) {\n\t\t\t\treturn StartConnection.ON_NEXT_LINE;\n\t\t\t}\n\t\t}\n\t\treturn StartConnection.AFTER_PREVIOUS;\n\t}\n\t\n\tprivate boolean isNewLine(char c) {\n\t\treturn c == '\\n' || c == '\\r';\n\t}\n\t\n\tpublic List<CommentInfo> getComments() {\n\t\treturn comments.toList();\n\t}\n}\n"
  },
  {
    "path": "src/utils/lombok/javac/java7/CommentCollectingScannerFactory.java",
    "content": "/*\n * Copyright (C) 2011-2013 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.java7;\n\nimport java.nio.CharBuffer;\n\nimport com.sun.tools.javac.parser.Scanner;\nimport com.sun.tools.javac.parser.ScannerFactory;\nimport com.sun.tools.javac.util.Context;\n\npublic class CommentCollectingScannerFactory extends ScannerFactory {\n\t\n\t@SuppressWarnings(\"all\")\n\tpublic static void preRegister(final Context context) {\n\t\tif (context.get(scannerFactoryKey) == null) {\n\t\t\t// Careful! There is voodoo magic here!\n\t\t\t//\n\t\t\t// Context.Factory is parameterized. make() is for javac6 and below; make(Context) is for javac7 and up.\n\t\t\t// this anonymous inner class definition is intentionally 'raw' - the return type of both 'make' methods is 'T',\n\t\t\t// which means the compiler will only generate the correct \"real\" override method (with returntype Object, which is\n\t\t\t// the lower bound for T, as a synthetic accessor for the make with returntype ScannerFactory) for that make method which\n\t\t\t// is actually on the classpath (either make() for javac6-, or make(Context) for javac7+).\n\t\t\t//\n\t\t\t// We normally solve this issue via src/stubs, with BOTH make methods listed, but for some reason the presence of a stubbed out\n\t\t\t// Context (or even a complete copy, it doesn't matter) results in a really strange eclipse bug, where any mention of any kind\n\t\t\t// of com.sun.tools.javac.tree.TreeMaker in a source file disables ALL usage of 'go to declaration' and auto-complete in the entire\n\t\t\t// source file.\n\t\t\t//\n\t\t\t// Thus, in short:\n\t\t\t// * Do NOT parameterize the anonymous inner class literal.\n\t\t\t// * Leave the return types as 'j.l.Object'.\n\t\t\t// * Leave both make methods intact; deleting one has no effect on javac6- / javac7+, but breaks the other. Hard to test for.\n\t\t\t// * Do not stub com.sun.tools.javac.util.Context or any of its inner types, like Factory.\n\t\t\t@SuppressWarnings(\"all\")\n\t\t\tclass MyFactory implements Context.Factory {\n\t\t\t\t// This overrides the javac6- version of make.\n\t\t\t\tpublic Object make() {\n\t\t\t\t\treturn new CommentCollectingScannerFactory(context);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// This overrides the javac7+ version.\n\t\t\t\tpublic Object make(Context c) {\n\t\t\t\t\treturn new CommentCollectingScannerFactory(c);\n\t\t\t\t}\n\t\t\t}\n\t\t\t@SuppressWarnings(\"unchecked\") Context.Factory<ScannerFactory> factory = new MyFactory();\n\t\t\tcontext.put(scannerFactoryKey, factory);\n\t\t}\n\t}\n\t\n\t/** Create a new scanner factory. */\n\tprotected CommentCollectingScannerFactory(Context context) {\n\t\tsuper(context);\n\t}\n\t\n\t@Override\n\tpublic Scanner newScanner(CharSequence input, boolean keepDocComments) {\n\t\tif (input instanceof CharBuffer) {\n\t\t\treturn new CommentCollectingScanner(this, (CharBuffer)input);\n\t\t}\n\t\tchar[] array = input.toString().toCharArray();\n\t\treturn newScanner(array, array.length, keepDocComments);\n\t}\n\t\n\t@Override\n\tpublic Scanner newScanner(char[] input, int inputLength, boolean keepDocComments) {\n\t\treturn new CommentCollectingScanner(this, input, inputLength);\n\t}\n}\n"
  },
  {
    "path": "src/utils/lombok/javac/java8/CommentCollectingParser.java",
    "content": "/*\n * Copyright (C) 2013-2019 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.java8;\n\nimport static lombok.javac.CommentCatcher.JCCompilationUnit_comments;\nimport static lombok.javac.CommentCatcher.JCCompilationUnit_textBlockStarts;\n\nimport com.sun.tools.javac.parser.JavacParser;\nimport com.sun.tools.javac.parser.Lexer;\nimport com.sun.tools.javac.parser.ParserFactory;\nimport com.sun.tools.javac.tree.JCTree.JCCompilationUnit;\n\nclass CommentCollectingParser extends JavacParser {\n\tprivate final Lexer lexer;\n\t\n\tprotected CommentCollectingParser(ParserFactory fac, Lexer S,\n\t\t\tboolean keepDocComments, boolean keepLineMap, boolean keepEndPositions) {\n\t\tsuper(fac, S, keepDocComments, keepLineMap, keepEndPositions);\n\t\tlexer = S;\n\t}\n\t\n\tpublic JCCompilationUnit parseCompilationUnit() {\n\t\tJCCompilationUnit result = super.parseCompilationUnit();\n\t\tif (lexer instanceof CommentCollectingScanner) {\n\t\t\tJCCompilationUnit_comments.set(result, ((CommentCollectingScanner) lexer).getComments());\n\t\t\tJCCompilationUnit_textBlockStarts.set(result, ((CommentCollectingScanner) lexer).getTextBlockStarts());\n\t\t}\n\t\treturn result;\n\t}\n}"
  },
  {
    "path": "src/utils/lombok/javac/java8/CommentCollectingParserFactory.java",
    "content": "/*\n * Copyright (C) 2013-2014 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.java8;\n\nimport java.lang.reflect.Field;\n\nimport com.sun.tools.javac.main.JavaCompiler;\nimport com.sun.tools.javac.parser.JavacParser;\nimport com.sun.tools.javac.parser.Lexer;\nimport com.sun.tools.javac.parser.ParserFactory;\nimport com.sun.tools.javac.parser.ScannerFactory;\nimport com.sun.tools.javac.util.Context;\n\nimport lombok.permit.Permit;\n\npublic class CommentCollectingParserFactory extends ParserFactory {\n\tprivate final Context context;\n\t\n\tstatic Context.Key<ParserFactory> key() {\n\t\treturn parserFactoryKey;\n\t}\n\t\n\tprotected CommentCollectingParserFactory(Context context) {\n\t\tsuper(context);\n\t\tthis.context = context;\n\t}\n\t\n\tpublic JavacParser newParser(CharSequence input, boolean keepDocComments, boolean keepEndPos, boolean keepLineMap) {\n\t\tScannerFactory scannerFactory = ScannerFactory.instance(context);\n\t\tLexer lexer = scannerFactory.newScanner(input, true);\n\t\tObject x = new CommentCollectingParser(this, lexer, true, keepLineMap, keepEndPos);\n\t\treturn (JavacParser) x;\n\t\t// CCP is based on a stub which extends nothing, but at runtime the stub is replaced with either\n\t\t//javac6's EndPosParser which extends Parser, or javac8's JavacParser which implements Parser.\n\t\t//Either way this will work out.\n\t}\n\t\n\tpublic JavacParser newParser(CharSequence input, boolean keepDocComments, boolean keepEndPos, boolean keepLineMap, boolean parseModuleInfo) {\n\t\tScannerFactory scannerFactory = ScannerFactory.instance(context);\n\t\tLexer lexer = scannerFactory.newScanner(input, true);\n\t\tObject x = new CommentCollectingParser(this, lexer, true, keepLineMap, keepEndPos);\n\t\treturn (JavacParser) x;\n\t\t// CCP is based on a stub which extends nothing, but at runtime the stub is replaced with either\n\t\t//javac6's EndPosParser which extends Parser, or javac8's JavacParser which implements Parser.\n\t\t//Either way this will work out.\n\t}\n\t\n\tpublic static void setInCompiler(JavaCompiler compiler, Context context) {\n\t\tcontext.put(CommentCollectingParserFactory.key(), (ParserFactory) null);\n\t\tField field;\n\t\ttry {\n\t\t\tfield = Permit.getField(JavaCompiler.class, \"parserFactory\");\n\t\t\tfield.set(compiler, new CommentCollectingParserFactory(context));\n\t\t} catch (Exception e) {\n\t\t\tthrow new IllegalStateException(\"Could not set comment sensitive parser in the compiler\", e);\n\t\t}\n\t}\n}"
  },
  {
    "path": "src/utils/lombok/javac/java8/CommentCollectingScanner.java",
    "content": "/*\n * Copyright (C) 2013-2019 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.java8;\n\nimport lombok.javac.CommentInfo;\n\nimport com.sun.tools.javac.parser.Scanner;\nimport com.sun.tools.javac.parser.ScannerFactory;\nimport com.sun.tools.javac.util.List;\n\npublic class CommentCollectingScanner extends Scanner {\n\t\n\tprivate CommentCollectingTokenizer tokenizer;\n\t\n\tpublic CommentCollectingScanner(ScannerFactory fac, CommentCollectingTokenizer tokenizer) {\n\t\tsuper(fac, tokenizer);\n\t\tthis.tokenizer = tokenizer;\n\t}\n\t\n\tpublic List<CommentInfo> getComments() {\n\t\treturn tokenizer.getComments();\n\t}\n\t\n\tpublic List<Integer> getTextBlockStarts() {\n\t\treturn tokenizer.getTextBlockStarts();\n\t}\n}"
  },
  {
    "path": "src/utils/lombok/javac/java8/CommentCollectingScannerFactory.java",
    "content": "/*\n * Copyright (C) 2011-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.java8;\n\nimport java.nio.Buffer;\nimport java.nio.CharBuffer;\n\nimport com.sun.tools.javac.parser.Scanner;\nimport com.sun.tools.javac.parser.ScannerFactory;\nimport com.sun.tools.javac.util.Context;\n\npublic class CommentCollectingScannerFactory extends ScannerFactory {\n\tpublic static boolean findTextBlocks;\n\t@SuppressWarnings(\"all\")\n\tpublic static void preRegister(final Context context) {\n\t\tif (context.get(scannerFactoryKey) == null) {\n\t\t\t// Careful! There is voodoo magic here!\n\t\t\t//\n\t\t\t// Context.Factory is parameterized. make() is for javac6 and below; make(Context) is for javac7 and up.\n\t\t\t// this anonymous inner class definition is intentionally 'raw' - the return type of both 'make' methods is 'T',\n\t\t\t// which means the compiler will only generate the correct \"real\" override method (with returntype Object, which is\n\t\t\t// the lower bound for T, as a synthetic accessor for the make with returntype ScannerFactory) for that make method which\n\t\t\t// is actually on the classpath (either make() for javac6-, or make(Context) for javac7+).\n\t\t\t//\n\t\t\t// We normally solve this issue via src/stubs, with BOTH make methods listed, but for some reason the presence of a stubbed out\n\t\t\t// Context (or even a complete copy, it doesn't matter) results in a really strange eclipse bug, where any mention of any kind\n\t\t\t// of com.sun.tools.javac.tree.TreeMaker in a source file disables ALL usage of 'go to declaration' and auto-complete in the entire\n\t\t\t// source file.\n\t\t\t//\n\t\t\t// Thus, in short:\n\t\t\t// * Do NOT parameterize the anonymous inner class literal.\n\t\t\t// * Leave the return types as 'j.l.Object'.\n\t\t\t// * Leave both make methods intact; deleting one has no effect on javac6- / javac7+, but breaks the other. Hard to test for.\n\t\t\t// * Do not stub com.sun.tools.javac.util.Context or any of its inner types, like Factory.\n\t\t\t@SuppressWarnings(\"all\")\n\t\t\tclass MyFactory implements Context.Factory {\n\t\t\t\t// This overrides the javac6- version of make.\n\t\t\t\tpublic Object make() {\n\t\t\t\t\treturn new CommentCollectingScannerFactory(context);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// This overrides the javac7+ version.\n\t\t\t\tpublic Object make(Context c) {\n\t\t\t\t\treturn new CommentCollectingScannerFactory(c);\n\t\t\t\t}\n\t\t\t}\n\t\t\t@SuppressWarnings(\"unchecked\") Context.Factory<ScannerFactory> factory = new MyFactory();\n\t\t\tcontext.put(scannerFactoryKey, factory);\n\t\t}\n\t}\n\t\n\t/** Create a new scanner factory. */\n\tprotected CommentCollectingScannerFactory(Context context) {\n\t\tsuper(context);\n\t}\n\t\n\t@SuppressWarnings(\"all\")\n\t@Override\n\tpublic Scanner newScanner(CharSequence input, boolean keepDocComments) {\n\t\tchar[] array;\n\t\tint limit;\n\t\tif (input instanceof CharBuffer && ((CharBuffer) input).hasArray()) {\n\t\t\tCharBuffer cb = (CharBuffer) input;\n\t\t\t((Buffer)cb.compact()).flip();\n\t\t\tarray = cb.array();\n\t\t\tlimit = cb.limit();\n\t\t} else {\n\t\t\tarray = input.toString().toCharArray();\n\t\t\tlimit = array.length;\n\t\t}\n\t\tif (array.length == limit) {\n\t\t\t// work around a bug where the last comment in a file falls away in this case.\n\t\t\tchar[] d = new char[limit + 1];\n\t\t\tSystem.arraycopy(array, 0, d, 0, limit);\n\t\t\tarray = d;\n\t\t}\n\t\treturn newScanner(array, limit, keepDocComments);\n\t}\n\t\n\t@Override\n\tpublic Scanner newScanner(char[] input, int inputLength, boolean keepDocComments) {\n\t\treturn new CommentCollectingScanner(this, CommentCollectingTokenizer.create(this, input, inputLength, findTextBlocks));\n\t}\n}\n"
  },
  {
    "path": "src/utils/lombok/javac/java8/CommentCollectingTokenizer.java",
    "content": "/*\n * Copyright (C) 2013-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.java8;\n\nimport java.nio.CharBuffer;\n\nimport com.sun.tools.javac.parser.JavaTokenizer;\nimport com.sun.tools.javac.parser.ScannerFactory;\nimport com.sun.tools.javac.parser.Tokens.Comment;\nimport com.sun.tools.javac.parser.Tokens.Comment.CommentStyle;\nimport com.sun.tools.javac.parser.Tokens.Token;\nimport com.sun.tools.javac.parser.UnicodeReader;\nimport com.sun.tools.javac.util.List;\nimport com.sun.tools.javac.util.ListBuffer;\n\nimport lombok.javac.CommentInfo;\nimport lombok.javac.CommentInfo.EndConnection;\nimport lombok.javac.CommentInfo.StartConnection;\n\nclass CommentCollectingTokenizer extends JavaTokenizer {\n\t\n\tprivate static final boolean tokenizerIsUnicodeReader = JavaTokenizer.class.getSuperclass().getSimpleName().equals(\"UnicodeReader\");\n\t\n\tprivate int prevEndPosition = 0;\n\tprivate final ListBuffer<CommentInfo> comments = new ListBuffer<CommentInfo>();\n\tprivate final ListBuffer<Integer> textBlockStarts;\n\tprivate int endComment = 0;\n\t\n\tstatic CommentCollectingTokenizer create(ScannerFactory fac, char[] buf, int inputLength, boolean findTextBlocks) {\n\t\tif (tokenizerIsUnicodeReader) {\n\t\t\treturn new CommentCollectingTokenizer(fac, buf, inputLength, findTextBlocks, true);\n\t\t}\n\t\treturn new CommentCollectingTokenizer(fac, buf, inputLength, findTextBlocks);\n\t}\n\t\n\t// pre java 16\n\tprivate CommentCollectingTokenizer(ScannerFactory fac, char[] buf, int inputLength, boolean findTextBlocks) {\n\t\tsuper(fac, new PositionUnicodeReader(fac, buf, inputLength));\n\t\ttextBlockStarts = findTextBlocks ? new ListBuffer<Integer>() : null;\n\t}\n\n\t// from java 16\n\tprivate CommentCollectingTokenizer(ScannerFactory fac, char[] buf, int inputLength, boolean findTextBlocks, boolean java16Signature) {\n\t\tsuper(fac, buf, inputLength);\n\t\ttextBlockStarts = findTextBlocks ? new ListBuffer<Integer>() : null;\n\t}\n\t\n\tint pos() {\n\t\tif (tokenizerIsUnicodeReader) {\n\t\t\treturn position();\n\t\t}\n\t\treturn ((PositionUnicodeReader) reader).pos();\n\t}\n\t\n\t@Override public Token readToken() {\n\t\tToken token = super.readToken();\n\t\tprevEndPosition = pos();\n\t\tif (textBlockStarts != null && (prevEndPosition - token.pos > 5) && token.getClass().getName().endsWith(\"$StringToken\")) {\n\t\t\tchar[] start = reader().getRawCharacters(token.pos, token.pos + 3);\n\t\t\tif (start[0] == '\"' && start[1] == '\"' && start[2] == '\"') textBlockStarts.append(token.pos);\n\t\t}\n\t\treturn token;\n\t}\n\t\n\t@Override\n\tprotected Comment processComment(int pos, int endPos, CommentStyle style) {\n\t\tint prevEndPos = Math.max(prevEndPosition, endComment);\n\t\tendComment = endPos;\n\t\tString content = new String(reader().getRawCharacters(pos, endPos));\n\t\tStartConnection start = determineStartConnection(prevEndPos, pos);\n\t\tEndConnection end = determineEndConnection(endPos); \n\n\t\tCommentInfo comment = new CommentInfo(prevEndPos, pos, endPos, content, start, end);\n\t\tcomments.append(comment);\n\n\t\treturn super.processComment(pos, endPos, style);\n\t}\n\t\n\tprivate EndConnection determineEndConnection(int pos) {\n\t\tboolean first = true;\n\t\tfor (int i = pos;; i++) {\n\t\t\tchar c;\n\t\t\ttry {\n\t\t\t\tc = reader().getRawCharacters(i, i + 1)[0];\n\t\t\t} catch (IndexOutOfBoundsException e) {\n\t\t\t\tc = '\\n';\n\t\t\t}\n\t\t\tif (isNewLine(c)) {\n\t\t\t\treturn EndConnection.ON_NEXT_LINE;\n\t\t\t}\n\t\t\tif (Character.isWhitespace(c)) {\n\t\t\t\tfirst = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\treturn first ? EndConnection.DIRECT_AFTER_COMMENT : EndConnection.AFTER_COMMENT;\n\t\t}\n\t}\n\t\n\tprivate StartConnection determineStartConnection(int from, int to) {\n\t\tif (from == to) {\n\t\t\treturn StartConnection.DIRECT_AFTER_PREVIOUS;\n\t\t}\n\t\tchar[] between = reader().getRawCharacters(from, to);\n\t\tif (isNewLine(between[between.length - 1])) {\n\t\t\treturn StartConnection.START_OF_LINE;\n\t\t}\n\t\tfor (char c : between) {\n\t\t\tif (isNewLine(c)) {\n\t\t\t\treturn StartConnection.ON_NEXT_LINE;\n\t\t\t}\n\t\t}\n\t\treturn StartConnection.AFTER_PREVIOUS;\n\t}\n\t\n\tprivate boolean isNewLine(char c) {\n\t\treturn c == '\\n' || c == '\\r';\n\t}\n\t\n\tpublic List<CommentInfo> getComments() {\n\t\treturn comments.toList();\n\t}\t\n\t\n\tpublic List<Integer> getTextBlockStarts() {\n\t\treturn textBlockStarts == null ? List.<Integer>nil() : textBlockStarts.toList();\n\t}\n\t\n\tprivate UnicodeReader reader() {\n\t\tif (tokenizerIsUnicodeReader) {\n\t\t\treturn (UnicodeReader) (Object) this;\n\t\t}\n\t\treturn reader;\n\t}\n\t\n\tstatic class PositionUnicodeReader extends UnicodeReader {\n\t\tprotected PositionUnicodeReader(ScannerFactory sf, char[] input, int inputLength) {\n\t\t\tsuper(sf, input, inputLength);\n\t\t}\n\t\t\n\t\tpublic PositionUnicodeReader(ScannerFactory sf, CharBuffer buffer) {\n\t\t\tsuper(sf, buffer);\n\t\t}\n\t\t\n\t\tint pos() {\n\t\t\treturn bp;\n\t\t}\n\t}\n}"
  },
  {
    "path": "src/utils/lombok/javac/java9/CommentCollectingParser.java",
    "content": "/*\n * Copyright (C) 2013-2019 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.java9;\n\nimport static lombok.javac.CommentCatcher.JCCompilationUnit_comments;\nimport static lombok.javac.CommentCatcher.JCCompilationUnit_textBlockStarts;\n\nimport lombok.javac.java8.CommentCollectingScanner;\n\nimport com.sun.tools.javac.parser.JavacParser;\nimport com.sun.tools.javac.parser.Lexer;\nimport com.sun.tools.javac.parser.ParserFactory;\nimport com.sun.tools.javac.tree.JCTree.JCCompilationUnit;\n\nclass CommentCollectingParser extends JavacParser {\n\tprivate final Lexer lexer;\n\t\n\tprotected CommentCollectingParser(ParserFactory fac, Lexer S,\n\t\t\tboolean keepDocComments, boolean keepLineMap, boolean keepEndPositions, boolean parseModuleInfo) {\n\t\tsuper(fac, S, keepDocComments, keepLineMap, keepEndPositions, parseModuleInfo);\n\t\tlexer = S;\n\t}\n\t\n\tpublic JCCompilationUnit parseCompilationUnit() {\n\t\tJCCompilationUnit result = super.parseCompilationUnit();\n\t\tif (lexer instanceof CommentCollectingScanner) {\n\t\t\tJCCompilationUnit_comments.set(result, ((CommentCollectingScanner) lexer).getComments());\n\t\t\tJCCompilationUnit_textBlockStarts.set(result, ((CommentCollectingScanner) lexer).getTextBlockStarts());\n\t\t}\n\t\treturn result;\n\t}\n}"
  },
  {
    "path": "src/utils/lombok/javac/java9/CommentCollectingParserFactory.java",
    "content": "/*\n * Copyright (C) 2013-2017 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.javac.java9;\n\nimport java.lang.reflect.Field;\n\nimport com.sun.tools.javac.main.JavaCompiler;\nimport com.sun.tools.javac.parser.JavacParser;\nimport com.sun.tools.javac.parser.Lexer;\nimport com.sun.tools.javac.parser.ParserFactory;\nimport com.sun.tools.javac.parser.ScannerFactory;\nimport com.sun.tools.javac.util.Context;\n\nimport lombok.permit.Permit;\n\npublic class CommentCollectingParserFactory extends ParserFactory {\n\tprivate final Context context;\n\t\n\tstatic Context.Key<ParserFactory> key() {\n\t\treturn parserFactoryKey;\n\t}\n\t\n\tprotected CommentCollectingParserFactory(Context context) {\n\t\tsuper(context);\n\t\tthis.context = context;\n\t}\n\t\n\tpublic JavacParser newParser(CharSequence input, boolean keepDocComments, boolean keepEndPos, boolean keepLineMap) {\n\t\treturn newParser(input, keepDocComments, keepEndPos, keepLineMap, false);\n\t}\n\t\n\tpublic JavacParser newParser(CharSequence input, boolean keepDocComments, boolean keepEndPos, boolean keepLineMap, boolean parseModuleInfo) {\n\t\tScannerFactory scannerFactory = ScannerFactory.instance(context);\n\t\tLexer lexer = scannerFactory.newScanner(input, true);\n\t\tObject x = new CommentCollectingParser(this, lexer, true, keepLineMap, keepEndPos, parseModuleInfo);\n\t\treturn (JavacParser) x;\n\t\t// CCP is based on a stub which extends nothing, but at runtime the stub is replaced with either\n\t\t//javac6's EndPosParser which extends Parser, or javac-9's JavacParser which implements Parser.\n\t\t//Either way this will work out.\n\t}\n\t\n\tpublic static void setInCompiler(JavaCompiler compiler, Context context) {\n\t\tcontext.put(CommentCollectingParserFactory.key(), (ParserFactory) null);\n\t\tField field;\n\t\ttry {\n\t\t\tfield = Permit.getField(JavaCompiler.class, \"parserFactory\");\n\t\t\tfield.set(compiler, new CommentCollectingParserFactory(context));\n\t\t} catch (Exception e) {\n\t\t\tthrow new IllegalStateException(\"Could not set comment sensitive parser in the compiler\", e);\n\t\t}\n\t}\n}"
  },
  {
    "path": "src/utils/lombok/permit/Permit.java",
    "content": "/*\n * Copyright (C) 2018-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.permit;\n\nimport java.lang.reflect.AccessibleObject;\nimport java.lang.reflect.Constructor;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\nimport java.net.URL;\n\nimport javax.tools.JavaFileManager;\n\nimport org.eclipse.jdt.internal.compiler.CompilationResult;\nimport org.eclipse.jdt.internal.compiler.ast.Annotation;\nimport org.eclipse.jdt.internal.compiler.ast.TypeReference;\n\nimport com.sun.tools.javac.main.JavaCompiler;\nimport com.sun.tools.javac.tree.JCTree.JCExpression;\nimport com.sun.tools.javac.util.List;\n\n// sunapi suppresses javac's warning about using Unsafe; 'all' suppresses eclipse's warning about the unspecified 'sunapi' key. Leave them both.\n// Yes, javac's definition of the word 'all' is quite contrary to what the dictionary says it means. 'all' does NOT include 'sunapi' according to javac.\n@SuppressWarnings({\"sunapi\", \"all\"})\npublic class Permit {\n\tprivate Permit() {}\n\t\n\t\n\tprivate static final long ACCESSIBLE_OVERRIDE_FIELD_OFFSET;\n\tprivate static final IllegalAccessException INIT_ERROR;\n\tprivate static final sun.misc.Unsafe UNSAFE = (sun.misc.Unsafe) reflectiveStaticFieldAccess(sun.misc.Unsafe.class, \"theUnsafe\");\n\t\n\tstatic {\n\t\tField f;\n\t\tlong g;\n\t\tThrowable ex;\n\t\t\n\t\ttry {\n\t\t\tg = getOverrideFieldOffset();\n\t\t\tex = null;\n\t\t} catch (Throwable t) {\n\t\t\tf = null;\n\t\t\tg = -1L;\n\t\t\tex = t;\n\t\t}\n\t\t\n\t\tACCESSIBLE_OVERRIDE_FIELD_OFFSET = g;\n\t\tif (ex == null) INIT_ERROR = null;\n\t\telse if (ex instanceof IllegalAccessException) INIT_ERROR = (IllegalAccessException) ex;\n\t\telse {\n\t\t\tINIT_ERROR = new IllegalAccessException(\"Cannot initialize Unsafe-based permit\");\n\t\t\tINIT_ERROR.initCause(ex);\n\t\t}\n\t}\n\t\n\tpublic static <T extends AccessibleObject> T setAccessible(T accessor) {\n\t\tif (INIT_ERROR == null) {\n\t\t\tUNSAFE.putBoolean(accessor, ACCESSIBLE_OVERRIDE_FIELD_OFFSET, true);\n\t\t} else {\n\t\t\taccessor.setAccessible(true);\n\t\t}\n\t\t\n\t\treturn accessor;\n\t}\n\t\n\tprivate static long getOverrideFieldOffset() throws Throwable {\n\t\tField f = null;\n\t\tThrowable saved = null;\n\t\ttry {\n\t\t\tf = AccessibleObject.class.getDeclaredField(\"override\");\n\t\t} catch (Throwable t) {\n\t\t\tsaved = t;\n\t\t}\n\t\t\n\t\tif (f != null) {\n\t\t\treturn UNSAFE.objectFieldOffset(f);\n\t\t}\n\t\t// The below seems very risky, but for all AccessibleObjects in java today it does work, and starting with JDK12, making the field accessible is no longer possible.\n\t\ttry {\n\t\t\treturn UNSAFE.objectFieldOffset(Fake.class.getDeclaredField(\"override\"));\n\t\t} catch (Throwable t) {\n\t\t\tthrow saved;\n\t\t}\n\t}\n\t\n\tstatic class Fake {\n\t\tboolean override;\n\t\tObject accessCheckCache;\n\t}\n\t\n\tpublic static Method getMethod(Class<?> c, String mName, Class<?>... parameterTypes) throws NoSuchMethodException {\n\t\tMethod m = null;\n\t\tClass<?> oc = c;\n\t\twhile (c != null) {\n\t\t\ttry {\n\t\t\t\tm = c.getDeclaredMethod(mName, parameterTypes);\n\t\t\t\tbreak;\n\t\t\t} catch (NoSuchMethodException e) {}\n\t\t\tc = c.getSuperclass();\n\t\t}\n\t\t\n\t\tif (m == null) throw new NoSuchMethodException(oc.getName() + \" :: \" + mName + \"(args)\");\n\t\treturn setAccessible(m);\n\t}\n\t\n\tpublic static Method permissiveGetMethod(Class<?> c, String mName, Class<?>... parameterTypes) {\n\t\ttry {\n\t\t\treturn getMethod(c, mName, parameterTypes);\n\t\t} catch (Exception ignore) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic static Field getField(Class<?> c, String fName) throws NoSuchFieldException {\n\t\tField f = null;\n\t\tClass<?> d = c;\n\t\twhile (d != null) {\n\t\t\ttry {\n\t\t\t\tf = d.getDeclaredField(fName);\n\t\t\t\tbreak;\n\t\t\t} catch (NoSuchFieldException e) {}\n\t\t\td = d.getSuperclass();\n\t\t}\n\t\tif (f == null) throw new NoSuchFieldException(c.getName() + \" :: \" + fName);\n\t\t\n\t\treturn setAccessible(f);\n\t}\n\t\n\tpublic static Field permissiveGetField(Class<?> c, String fName) {\n\t\ttry {\n\t\t\treturn getField(c, fName);\n\t\t} catch (Exception ignore) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic static <T> T permissiveReadField(Class<T> type, Field f, Object instance) {\n\t\ttry {\n\t\t\treturn type.cast(f.get(instance));\n\t\t} catch (Exception ignore) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic static <T> Constructor<T> getConstructor(Class<T> c, Class<?>... parameterTypes) throws NoSuchMethodException {\n\t\treturn setAccessible(c.getDeclaredConstructor(parameterTypes));\n\t}\n\t\n\tpublic static <T> Constructor<T> permissiveGetConstructor(Class<T> c, Class<?>... parameterTypes) {\n\t\ttry {\n\t\t\treturn getConstructor(c, parameterTypes);\n\t\t} catch (Exception ignore) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tprivate static Object reflectiveStaticFieldAccess(Class<?> c, String fName) {\n\t\ttry {\n\t\t\tField f = c.getDeclaredField(fName);\n\t\t\tf.setAccessible(true);\n\t\t\treturn f.get(null);\n\t\t} catch (Exception e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tpublic static boolean isDebugReflection() {\n\t\treturn !\"false\".equals(System.getProperty(\"lombok.debug.reflection\", \"false\"));\n\t}\n\t\n\tpublic static void handleReflectionDebug(Throwable t, Throwable initError) {\n\t\tif (!isDebugReflection()) return;\n\t\t\n\t\tSystem.err.println(\"** LOMBOK REFLECTION exception: \" + t.getClass() + \": \" + (t.getMessage() == null ? \"(no message)\" : t.getMessage()));\n\t\tt.printStackTrace(System.err);\n\t\tif (initError != null) {\n\t\t\tSystem.err.println(\"*** ADDITIONALLY, exception occurred setting up reflection: \");\n\t\t\tinitError.printStackTrace(System.err);\n\t\t}\n\t}\n\t\n\tpublic static Object invoke(Method m, Object receiver, Object... args) throws IllegalAccessException, InvocationTargetException {\n\t\treturn invoke(null, m, receiver, args);\n\t}\n\t\n\tpublic static Object invoke(Throwable initError, Method m, Object receiver, Object... args) throws IllegalAccessException, InvocationTargetException {\n\t\ttry {\n\t\t\treturn m.invoke(receiver, args);\n\t\t} catch (IllegalAccessException e) {\n\t\t\thandleReflectionDebug(e, initError);\n\t\t\tthrow e;\n\t\t} catch (RuntimeException e) {\n\t\t\thandleReflectionDebug(e, initError);\n\t\t\tthrow e;\n\t\t} catch (Error e) {\n\t\t\thandleReflectionDebug(e, initError);\n\t\t\tthrow e;\n\t\t}\n\t}\n\t\n\tpublic static Object invokeSneaky(Method m, Object receiver, Object... args) {\n\t\treturn invokeSneaky(null, m, receiver, args);\n\t}\n\t\n\tpublic static Object invokeSneaky(Throwable initError, Method m, Object receiver, Object... args) {\n\t\ttry {\n\t\t\treturn m.invoke(receiver, args);\n\t\t} catch (NoClassDefFoundError e) {\n\t\t\thandleReflectionDebug(e, initError);\n\t\t\t//ignore, we don't have access to the correct ECJ classes, so lombok can't possibly\n\t\t\t//do anything useful here.\n\t\t\treturn null;\n\t\t} catch (NullPointerException e) {\n\t\t\thandleReflectionDebug(e, initError);\n\t\t\t//ignore, we don't have access to the correct ECJ classes, so lombok can't possibly\n\t\t\t//do anything useful here.\n\t\t\treturn null;\n\t\t} catch (IllegalAccessException e) {\n\t\t\thandleReflectionDebug(e, initError);\n\t\t\tthrow sneakyThrow(e);\n\t\t} catch (InvocationTargetException e) {\n\t\t\tthrow sneakyThrow(e.getCause());\n\t\t} catch (RuntimeException e) {\n\t\t\thandleReflectionDebug(e, initError);\n\t\t\tthrow e;\n\t\t} catch (Error e) {\n\t\t\thandleReflectionDebug(e, initError);\n\t\t\tthrow e;\n\t\t}\n\t}\n\t\n\tpublic static <T> T newInstance(Constructor<T> c, Object... args) throws IllegalAccessException, InvocationTargetException, InstantiationException {\n\t\treturn newInstance(null, c, args);\n\t}\n\t\n\tpublic static <T> T newInstance(Throwable initError, Constructor<T> c, Object... args) throws IllegalAccessException, InvocationTargetException, InstantiationException {\n\t\ttry {\n\t\t\treturn c.newInstance(args);\n\t\t} catch (IllegalAccessException e) {\n\t\t\thandleReflectionDebug(e, initError);\n\t\t\tthrow e;\n\t\t} catch (InstantiationException e) {\n\t\t\thandleReflectionDebug(e, initError);\n\t\t\tthrow e;\n\t\t} catch (RuntimeException e) {\n\t\t\thandleReflectionDebug(e, initError);\n\t\t\tthrow e;\n\t\t} catch (Error e) {\n\t\t\thandleReflectionDebug(e, initError);\n\t\t\tthrow e;\n\t\t}\n\t}\n\t\n\tpublic static <T> T newInstanceSneaky(Constructor<T> c, Object... args) {\n\t\treturn newInstanceSneaky(null, c, args);\n\t}\n\t\n\tpublic static <T> T newInstanceSneaky(Throwable initError, Constructor<T> c, Object... args) {\n\t\ttry {\n\t\t\treturn c.newInstance(args);\n\t\t} catch (NoClassDefFoundError e) {\n\t\t\thandleReflectionDebug(e, initError);\n\t\t\t//ignore, we don't have access to the correct ECJ classes, so lombok can't possibly\n\t\t\t//do anything useful here.\n\t\t\treturn null;\n\t\t} catch (NullPointerException e) {\n\t\t\thandleReflectionDebug(e, initError);\n\t\t\t//ignore, we don't have access to the correct ECJ classes, so lombok can't possibly\n\t\t\t//do anything useful here.\n\t\t\treturn null;\n\t\t} catch (IllegalAccessException e) {\n\t\t\thandleReflectionDebug(e, initError);\n\t\t\tthrow sneakyThrow(e);\n\t\t} catch (InstantiationException e) {\n\t\t\thandleReflectionDebug(e, initError);\n\t\t\tthrow sneakyThrow(e);\n\t\t} catch (InvocationTargetException e) {\n\t\t\tthrow sneakyThrow(e.getCause());\n\t\t} catch (RuntimeException e) {\n\t\t\thandleReflectionDebug(e, initError);\n\t\t\tthrow e;\n\t\t} catch (Error e) {\n\t\t\thandleReflectionDebug(e, initError);\n\t\t\tthrow e;\n\t\t}\n\t}\n\t\n\tpublic static <T> T get(Field f, Object receiver) throws IllegalAccessException {\n\t\ttry {\n\t\t\treturn (T) f.get(receiver);\n\t\t} catch (IllegalAccessException e) {\n\t\t\thandleReflectionDebug(e, null);\n\t\t\tthrow e;\n\t\t} catch (RuntimeException e) {\n\t\t\thandleReflectionDebug(e, null);\n\t\t\tthrow e;\n\t\t} catch (Error e) {\n\t\t\thandleReflectionDebug(e, null);\n\t\t\tthrow e;\n\t\t}\n\t}\n\t\n\tpublic static void set(Field f, Object receiver, Object newValue) throws IllegalAccessException {\n\t\ttry {\n\t\t\tf.set(receiver, newValue);\n\t\t} catch (IllegalAccessException e) {\n\t\t\thandleReflectionDebug(e, null);\n\t\t\tthrow e;\n\t\t} catch (RuntimeException e) {\n\t\t\thandleReflectionDebug(e, null);\n\t\t\tthrow e;\n\t\t} catch (Error e) {\n\t\t\thandleReflectionDebug(e, null);\n\t\t\tthrow e;\n\t\t}\n\t}\n\t\n\tpublic static void reportReflectionProblem(Throwable initError, String msg) {\n\t\tif (!isDebugReflection()) return;\n\t\tSystem.err.println(\"** LOMBOK REFLECTION issue: \" + msg);\n\t\tif (initError != null) {\n\t\t\tSystem.err.println(\"*** ADDITIONALLY, exception occurred setting up reflection: \");\n\t\t\tinitError.printStackTrace(System.err);\n\t\t}\n\t}\n\t\n\tpublic static RuntimeException sneakyThrow(Throwable t) {\n\t\tif (t == null) throw new NullPointerException(\"t\");\n\t\treturn Permit.<RuntimeException>sneakyThrow0(t);\n\t}\n\t\n\t@SuppressWarnings(\"unchecked\")\n\tprivate static <T extends Throwable> T sneakyThrow0(Throwable t) throws T {\n\t\tthrow (T)t;\n\t}\n\t\n}\n"
  },
  {
    "path": "src/utils/lombok/permit/dummy/Child.java",
    "content": "package lombok.permit.dummy;\n\n@SuppressWarnings(\"all\")\npublic abstract class Child extends Parent {\n\tprivate transient volatile boolean foo;\n\tprivate transient volatile Object[] bar;\n\tprivate transient volatile Object baz;\n\t\n}\n"
  },
  {
    "path": "src/utils/lombok/permit/dummy/GrandChild.java",
    "content": "package lombok.permit.dummy;\n\n@SuppressWarnings(\"all\")\npublic final class GrandChild extends Child {\n\tprivate Class<?> a;\n\tprivate int b;\n\tprivate String c;\n\tprivate Class<?> d;\n\tprivate Class<?>[] e;\n\tprivate Class<?>[] f;\n\tprivate int g;\n\tprivate transient String h;\n\tprivate transient Object i;\n\tprivate byte[] j;\n\tprivate byte[] k;\n\tprivate byte[] l;\n\tprivate volatile Object m;\n\tprivate Object n;\n}\n"
  },
  {
    "path": "src/utils/lombok/permit/dummy/Parent.java",
    "content": "package lombok.permit.dummy;\n\nimport java.io.OutputStream;\n\n@SuppressWarnings(\"all\")\npublic class Parent {\n\tboolean first;\n\tstatic final Object staticObj = OutputStream.class;\n\tvolatile Object second;\n\tprivate static volatile boolean staticSecond;\n\tprivate static volatile boolean staticThird;\n}\n"
  },
  {
    "path": "src/utils/lombok/permit/dummy/package-info.java",
    "content": "/**\n * This package recreates the type hierarchy of {@code java.lang.reflect.AccessibleObject} and friends (such as {@code java.lang.reflect.Method});\n * its purpose is to allow us to ask {@code sun.misc.internal.Unsafe} about the exact offset of the {@code override} field of {@code AccessibleObject};\n * asking about that field directly doesn't work after jdk14, presumably because the fields of AO are expressly hidden somehow.\n * \n *  NB: It's usually 12, on the vast majority of OS, VM, and architecture combos.\n */\npackage lombok.permit.dummy;\n"
  },
  {
    "path": "src/utils/lombok/permit/package-info.java",
    "content": "/**\n * This is a reduced copy of the nqzero Permit-reflect project.\n * https://github.com/nqzero/permit-reflect\n * \n * Many thanks to nqzero. The permit-reflect project is, like lombok itself, licensed under the MIT license.\n * See https://github.com/nqzero/permit-reflect/blob/master/License for license info.\n */\npackage lombok.permit;"
  },
  {
    "path": "test/bytecode/resource/Bar.java",
    "content": "public interface Bar extends java.util.RandomAccess, java.util.Map {\n\tString getName();\n}"
  },
  {
    "path": "test/bytecode/resource/Baz.java",
    "content": "public interface Baz {\n}"
  },
  {
    "path": "test/bytecode/resource/Buux.java",
    "content": "public class Buux extends java.util.ArrayList {\n\tpublic Buux() {\n\t\tsuper(7);\n\t\taddSomething();\n\t}\n\t\n\tpublic void addSomething() {\n\t\tsuper.add(\"H\\u3404l\\0\");\n\t}\n}"
  },
  {
    "path": "test/bytecode/resource/Foo.java",
    "content": "public class Foo implements java.util.RandomAccess {\n\tprivate static final long LONG = 123L;\n\tprivate static final long LONG_OVERFLOW = 0x1FFFFFFFFL;\n\tprivate static final String ONE = \"E\\u00e9n\";\n\tprivate static final int INT = 123;\n\tprivate static final double DOUBLE = 1.23;\n\tprivate static final double DOUBLE_NAN = Double.NaN;\n\tprivate static final double DOUBLE_INF = Double.POSITIVE_INFINITY;\n\tprivate static final double DOUBLE_NEG_INF = Double.NEGATIVE_INFINITY;\n\t\n\tprivate static final float FLOAT = 1.23F;\n\tprivate static final float FLOAT_NAN = Float.NaN;\n\tprivate static final float FLOAT_INF = Float.POSITIVE_INFINITY;\n\tprivate static final float FLOAT_NEG_INF = Float.NEGATIVE_INFINITY;\n\t\n\t{\n\t\tString value = toString();\n\t\tSystem.out.print(value);\n\t\tSystem.out.print(\"Two\" + \"Four\");\n\t}\n}"
  },
  {
    "path": "test/bytecode/resource/PostCompilePreventNullAnalysis.java",
    "content": "public class PostCompilePreventNullAnalysis {\n\tpublic void test() {\n\t\tObject o = \"Hello World!\";\n\t\ttry {\n\t\t\tSystem.out.println(o);\n\t\t} finally {\n\t\t\tif (o != null) {\n\t\t\t\tif (lombok.Lombok.preventNullAnalysis(o) != null) {\n\t\t\t\t\to.toString();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "test/bytecode/resource/PostCompileSneaky.java",
    "content": "public class PostCompileSneaky {\n\tpublic void test() {\n\t\tthrow lombok.Lombok.sneakyThrow(new Exception());\n\t}\n}"
  },
  {
    "path": "test/bytecode/src/lombok/bytecode/RunBytecodeTests.java",
    "content": "/*\n * Copyright (C) 2011 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.bytecode;\n\nimport org.junit.runner.RunWith;\nimport org.junit.runners.Suite;\nimport org.junit.runners.Suite.SuiteClasses;\n\n@RunWith(Suite.class)\n@SuiteClasses({TestClassFileMetaData.class, TestPostCompiler.class})\npublic class RunBytecodeTests {\n}\n"
  },
  {
    "path": "test/bytecode/src/lombok/bytecode/TestClassFileMetaData.java",
    "content": "/*\n * Copyright (C) 2010-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.bytecode;\n\nimport static org.junit.Assert.*;\n\nimport java.io.BufferedReader;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.IOException;\nimport java.io.InputStreamReader;\nimport java.io.StringWriter;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\n\nimport javax.tools.Diagnostic;\nimport javax.tools.DiagnosticListener;\nimport javax.tools.JavaCompiler;\nimport javax.tools.JavaCompiler.CompilationTask;\nimport javax.tools.JavaFileObject;\nimport javax.tools.SimpleJavaFileObject;\nimport javax.tools.ToolProvider;\n\nimport lombok.Lombok;\n\nimport org.junit.Test;\n\npublic class TestClassFileMetaData {\n\t\n\tprivate static ClassFileMetaData foo = create(new File(\"test/bytecode/resource/Foo.java\"));\n\tprivate static ClassFileMetaData bar = create(new File(\"test/bytecode/resource/Bar.java\"));\n\tprivate static ClassFileMetaData baz = create(new File(\"test/bytecode/resource/Baz.java\"));\n\tprivate static ClassFileMetaData buux = create(new File(\"test/bytecode/resource/Buux.java\"));\n\t\n\t@Test\n\tpublic void testGetClassName() {\n\t\tassertTrue(foo.containsUtf8(\"Foo\"));\n\t\tassertEquals(\"Foo\", foo.getClassName());\n\t\t\n\t\tassertTrue(bar.containsUtf8(\"Bar\"));\n\t\tassertEquals(\"Bar\", bar.getClassName());\n\t\t\n\t\tassertTrue(baz.containsUtf8(\"Baz\"));\n\t\tassertEquals(\"Baz\", baz.getClassName());\n\t}\n\t\n\t@Test\n\tpublic void testGetSuperClassName() {\n\t\tassertTrue(foo.containsUtf8(\"java/lang/Object\"));\n\t\tassertEquals(\"java/lang/Object\", foo.getSuperClassName());\n\t\t\n\t\tassertEquals(\"java/lang/Object\", bar.getSuperClassName());\n\t\tassertEquals(\"java/lang/Object\", baz.getSuperClassName());\n\t\t\n\t\tassertEquals(\"java/util/ArrayList\", buux.getSuperClassName());\n\t}\n\t\n\t@Test\n\tpublic void testUsesClass() {\n\t\tassertTrue(foo.usesClass(\"java/lang/System\"));\n//\t\tassertTrue(foo.usesClass(\"java/lang/String\"));\n\t}\n\t\n\t@Test\n\tpublic void testUsesField() {\n\t\tassertTrue(foo.usesField(\"java/lang/System\", \"out\"));\n\t}\n\t\n\t@Test\n\tpublic void testUsesMethodWithName() {\n\t\tassertTrue(foo.usesMethod(\"java/io/PrintStream\", \"print\"));\n\t\t\n\t\tassertTrue(buux.usesMethod(\"java/util/ArrayList\", \"<init>\"));\n\t\tassertTrue(buux.usesMethod(\"java/util/ArrayList\", \"add\"));\n\t\tassertTrue(buux.usesMethod(\"Buux\", \"addSomething\"));\n\t}\n\t\n\t@Test\n\tpublic void testUsesMethodWithNameAndDescriptor() {\n\t\tassertTrue(foo.usesMethod(\"java/io/PrintStream\", \"print\", \"(Ljava/lang/String;)V\"));\n\t\t\n\t\tassertTrue(buux.usesMethod(\"java/util/ArrayList\", \"<init>\", \"(I)V\"));\n\t\tassertTrue(buux.usesMethod(\"java/util/ArrayList\", \"add\", \"(Ljava/lang/Object;)Z\"));\n\t\tassertTrue(buux.usesMethod(\"Buux\", \"addSomething\", \"()V\"));\n\t}\n\t\n\t@Test\n\tpublic void testGetInterfaces() {\n\t\tassertTrue(foo.containsUtf8(\"java/util/RandomAccess\"));\n\t\t\n\t\tList<String> fooInterfaces = foo.getInterfaces();\n\t\tassertEquals(1, fooInterfaces.size());\n\t\tassertEquals(\"java/util/RandomAccess\", fooInterfaces.get(0));\n\t\t\n\t\tassertTrue(bar.containsUtf8(\"java/util/RandomAccess\"));\n\t\tassertTrue(bar.containsUtf8(\"java/util/Map\"));\n\t\t\n\t\tList<String> barInterfaces = bar.getInterfaces();\n\t\tassertEquals(2, barInterfaces.size());\n\t\tassertEquals(\"java/util/RandomAccess\", barInterfaces.get(0));\n\t\tassertEquals(\"java/util/Map\", barInterfaces.get(1));\n\t}\n\t\n\t@Test\n\tpublic void testContainsStringConstant() {\n\t\tassertTrue(foo.containsStringConstant(\"Eén\"));\n\t\tassertTrue(foo.containsStringConstant(\"TwoFour\"));\n\t\t\n\t\tassertTrue(buux.containsStringConstant(\"H\\u3404l\\0\"));\n\t\t\n\t\tassertFalse(foo.containsStringConstant(\"Seven\"));\n\t}\n\t\n\t@Test\n\tpublic void testContainsDouble() {\n\t\tassertTrue(foo.containsDouble(1.23));\n\t\tassertTrue(foo.containsDouble(Double.NaN));\n\t\tassertTrue(foo.containsDouble(Double.POSITIVE_INFINITY));\n\t\tassertTrue(foo.containsDouble(Double.NEGATIVE_INFINITY));\n\t\t\n\t\tassertFalse(foo.containsDouble(1.0));\n\t\tassertFalse(buux.containsDouble(1.0));\n\t\tassertFalse(buux.containsDouble(Double.NaN));\n\t\tassertFalse(buux.containsDouble(Double.POSITIVE_INFINITY));\n\t\tassertFalse(buux.containsDouble(Double.NEGATIVE_INFINITY));\n\t}\t\n\t\n\t@Test\n\tpublic void testContainsFloat() {\n\t\tassertTrue(foo.containsFloat(1.23F));\n\t\tassertTrue(foo.containsFloat(Float.NaN));\n\t\tassertTrue(foo.containsFloat(Float.POSITIVE_INFINITY));\n\t\tassertTrue(foo.containsFloat(Float.NEGATIVE_INFINITY));\n\t\t\n\t\tassertFalse(foo.containsFloat(1.0F));\n\t\tassertFalse(buux.containsFloat(1.0F));\n\t\tassertFalse(buux.containsFloat(Float.NaN));\n\t\tassertFalse(buux.containsFloat(Float.POSITIVE_INFINITY));\n\t\tassertFalse(buux.containsFloat(Float.NEGATIVE_INFINITY));\n\t}\t\n\t\n\t@Test\n\tpublic void testContainsInteger() {\n\t\tassertTrue(foo.containsInteger(123));\n\t\t\n\t\tassertFalse(foo.containsInteger(1));\n\t\tassertFalse(buux.containsInteger(1));\n\t}\n\t\n\t@Test\n\tpublic void testContainsLong() {\n\t\tassertTrue(foo.containsLong(123));\n\t\tassertTrue(foo.containsLong(0x1FFFFFFFFL));\n\t\t\n\t\tassertFalse(foo.containsLong(1));\n\t\tassertFalse(buux.containsLong(1));\n\t}\n\t\n\tprivate static ClassFileMetaData create(File file) {\n\t\treturn new ClassFileMetaData(compile(file));\n\t}\n\t\n\tstatic byte[] compile(File file) {\n\t\ttry {\n\t\t\tJavaCompiler compiler = ToolProvider.getSystemJavaCompiler();\n\t\t\tif (compiler == null) {\n\t\t\t\t// The 'auto-find my compiler' code in java6 works because it hard-codes `c.s.t.j.a.JavacTool`, which we put on the classpath.\n\t\t\t\t// On java8, it fails, because it looks for tools.jar, which won't be there.\n\t\t\t\t// on J11+ place it succeeds again, as we run those on the real JDKs.\n\t\t\t\t\n\t\t\t\t// Thus, let's try this, in cae we're on java 8:\n\t\t\t\t\n\t\t\t\ttry {\n\t\t\t\t\tcompiler = (JavaCompiler) Class.forName(\"com.sun.tools.javac.api.JavacTool\").getConstructor().newInstance();\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t\tcompiler = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (compiler == null) throw new RuntimeException(\"No javac tool is available in this distribution. Using an old JRE perhaps?\");\n\t\t\t\n\t\t\tFile tempDir = getTempDir();\n\t\t\ttempDir.mkdirs();\n\t\t\tList<String> options = Arrays.asList(\"-proc:none\", \"-d\", tempDir.getAbsolutePath());\n\t\t\t\n\t\t\tStringWriter captureWarnings = new StringWriter();\n\t\t\tfinal StringBuilder compilerErrors = new StringBuilder();\n\t\t\tDiagnosticListener<JavaFileObject> diagnostics = new DiagnosticListener<JavaFileObject>() {\n\t\t\t\t@Override public void report(Diagnostic<? extends JavaFileObject> diagnostic) {\n\t\t\t\t\tcompilerErrors.append(diagnostic.toString()).append(\"\\n\");\n\t\t\t\t}\n\t\t\t};\n\t\t\t\n\t\t\tCompilationTask task = compiler.getTask(captureWarnings, null, diagnostics, options, null, Collections.singleton(new ContentBasedJavaFileObject(file.getPath(), readFileAsString(file))));\n\t\t\tBoolean taskResult = task.call();\n\t\t\tassertTrue(\"Compilation task didn't succeed: \\n<Warnings and Errors>\\n\" + compilerErrors.toString() + \"\\n\" + captureWarnings.toString() + \"\\n</Warnings and Errors>\", taskResult);\n\t\t\treturn PostCompilerApp.readFile(new File(tempDir, file.getName().replaceAll(\"\\\\.java$\", \".class\")));\n\t\t} catch (Exception e) {\n\t\t\tthrow Lombok.sneakyThrow(e);\n\t\t}\n\t}\n\t\n\tprivate static File getTempDir() {\n\t\tString[] rawDirs = {\n\t\t\t\tSystem.getProperty(\"java.io.tmpdir\"),\n\t\t\t\t\"/tmp\",\n\t\t\t\t\"C:\\\\Windows\\\\Temp\"\n\t\t};\n\t\t\n\t\tfor (String dir : rawDirs) {\n\t\t\tif (dir == null) continue;\n\t\t\tFile f = new File(dir);\n\t\t\tif (!f.isDirectory()) continue;\n\t\t\treturn new File(f, \"lombok.bytecode-test\");\n\t\t}\n\t\t\n\t\treturn new File(\"./build/tmp\");\n\t}\n\t\n\tstatic class ContentBasedJavaFileObject extends SimpleJavaFileObject {\n\t\tprivate final String content;\n\t\t\n\t\tprotected ContentBasedJavaFileObject(String name, String content) {\n\t\t\tsuper(new File(name).toURI(), Kind.SOURCE);\n\t\t\tthis.content = content;\n\t\t}\n\t\t\n\t\t@Override\n\t\tpublic CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {\n\t\t\treturn content;\n\t\t}\n\t}\n\t\n\tprivate static String readFileAsString(File file) {\n\t\ttry {\n\t\t\tFileInputStream in = new FileInputStream(file);\n\t\t\ttry {\n\t\t\t\tBufferedReader reader = new BufferedReader(new InputStreamReader(in, \"UTF-8\"));\n\t\t\t\tStringWriter writer = new StringWriter();\n\t\t\t\tString line = reader.readLine();\n\t\t\t\twhile(line != null) {\n\t\t\t\t\twriter.append(line).append(\"\\n\");\n\t\t\t\t\tline = reader.readLine();\n\t\t\t\t}\n\t\t\t\treader.close();\n\t\t\t\twriter.close();\n\t\t\t\treturn writer.toString();\n\t\t\t} finally {\n\t\t\t\tin.close();\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\tthrow Lombok.sneakyThrow(e);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/bytecode/src/lombok/bytecode/TestPostCompiler.java",
    "content": "/*\n * Copyright (C) 2014 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.bytecode;\n\nimport static org.junit.Assert.*;\n\nimport java.io.File;\n\nimport lombok.core.DiagnosticsReceiver;\nimport lombok.core.PostCompiler;\n\nimport org.junit.Test;\n\npublic class TestPostCompiler {\n\t@Test\n\tpublic void testPostCompilerSneakyThrows() {\n\t\tbyte[] compiled = TestClassFileMetaData.compile(new File(\"test/bytecode/resource/PostCompileSneaky.java\"));\n\t\tDiagnosticsReceiver receiver = new DiagnosticsReceiver() {\n\t\t\t@Override public void addWarning(String message) {\n\t\t\t\tfail(\"Warning during post compilation processing of a sneakyThrow call: \" + message);\n\t\t\t}\n\t\t\t\n\t\t\t@Override public void addError(String message) {\n\t\t\t\tfail(\"Error during post compilation processing of a sneakyThrow call: \" + message);\n\t\t\t}\n\t\t};\n\t\tassertTrue(\"Before post compilation, expected lombok.Lombok.sneakyThrow() call in compiled code, but it's not there\",\n\t\t\t\tnew ClassFileMetaData(compiled).usesMethod(\"lombok/Lombok\", \"sneakyThrow\"));\n\t\tbyte[] transformed = PostCompiler.applyTransformations(compiled, \"PostCompileSneaky.java\", receiver);\n\t\t\n\t\tassertNotSame(\"Post-compiler did not do anything; we expected it to remove a Lombok.sneakyThrow() call.\", compiled, transformed);\n\t\tassertTrue(\"After removing a sneakyThrow the classfile got... bigger (or stayed equal in size). Huh?\", transformed.length < compiled.length);\n\n\t\tassertFalse(\"After post compilation, expected no lombok.Lombok.sneakyThrow() call in compiled code, but it's there\",\n\t\t\t\tnew ClassFileMetaData(transformed).usesMethod(\"lombok/Lombok\", \"sneakyThrow\"));\n\t}\n\n\t@Test\n\tpublic void testPostCompilerPreventNullAnalysis() {\n\t\tbyte[] compiled = TestClassFileMetaData.compile(new File(\"test/bytecode/resource/PostCompilePreventNullAnalysis.java\"));\n\t\tDiagnosticsReceiver receiver = new DiagnosticsReceiver() {\n\t\t\t@Override public void addWarning(String message) {\n\t\t\t\tfail(\"Warning during post compilation processing of a sneakyThrow call: \" + message);\n\t\t\t}\n\n\t\t\t@Override public void addError(String message) {\n\t\t\t\tfail(\"Error during post compilation processing of a sneakyThrow call: \" + message);\n\t\t\t}\n\t\t};\n\t\tassertTrue(\"Before post compilation, expected lombok.Lombok.preventNullAnalysis() call in compiled code, but it's not there\",\n\t\t\t\tnew ClassFileMetaData(compiled).usesMethod(\"lombok/Lombok\", \"preventNullAnalysis\"));\n\t\tbyte[] transformed = PostCompiler.applyTransformations(compiled, \"PostCompilePreventNullAnalysis.java\", receiver);\n\n\t\tassertNotSame(\"Post-compiler did not do anything; we expected it to remove a Lombok.preventNullAnalysis() call.\", compiled, transformed);\n\t\tassertTrue(\"After removing a sneakyThrow the classfile got... bigger (or stayed equal in size). Huh?\", transformed.length < compiled.length);\n\n\t\tassertFalse(\"After post compilation, expected no lombok.Lombok.preventNullAnalysis() call in compiled code, but it's there\",\n\t\t\t\tnew ClassFileMetaData(transformed).usesMethod(\"lombok/Lombok\", \"preventNullAnalysis\"));\n\t}\n}\n"
  },
  {
    "path": "test/configuration/resource/configurationRoot/archives/a1/d1/include.config",
    "content": "import ../d2/include.config\nimport nonexisting\n\nlombok.addGeneratedAnnotation = true"
  },
  {
    "path": "test/configuration/resource/configurationRoot/archives/a1/d2/include.config",
    "content": "lombok.addJavaxGeneratedAnnotation = true"
  },
  {
    "path": "test/configuration/resource/configurationRoot/archives/a1/lombok.config",
    "content": "import d1/include.config\nimport /illegal\nlombok.anyConstructor.addConstructorProperties = true"
  },
  {
    "path": "test/configuration/resource/configurationRoot/archives/a2/reset.config",
    "content": "clear lombok.copyableAnnotations"
  },
  {
    "path": "test/configuration/resource/configurationRoot/d1/d11/d111/directory/lombok.config",
    "content": "lombok.accessors.prefix += x_"
  },
  {
    "path": "test/configuration/resource/configurationRoot/d1/d11/d111/f1.txt",
    "content": ""
  },
  {
    "path": "test/configuration/resource/configurationRoot/d1/d11/d111/import1.config",
    "content": "import missing\nimport import1.config\nimport ../d111/import1.config\nimport ../../../archives/a1.jar\nimport directory\nimport <env>/environment.config\nimport ~/home.config\nlombok.accessors.prefix += z_\nlombok.accessors.prefix += f"
  },
  {
    "path": "test/configuration/resource/configurationRoot/d1/d11/d111/lombok.config",
    "content": "import import1.config\nimport ../../../archives/a2.zip!reset.config\nclear lombok.accessors.chain\nlombok.accessors.prefix += m_\nlombok.copyableAnnotations += copy2"
  },
  {
    "path": "test/configuration/resource/configurationRoot/d1/d11/lombok.config",
    "content": "config.stopBubbling=true\n\nlombok.accessors.chain = false\nlombok.accessors.flagUsage = ERROR\nlombok.accessors.prefix += f\n\nlombok.copyableAnnotations += copy1"
  },
  {
    "path": "test/configuration/resource/configurationRoot/d1/d12/lombok.config",
    "content": "config.stopBubbling=true\n\nlombok.accessors.chain = true"
  },
  {
    "path": "test/configuration/resource/configurationRoot/d1/lombok.config",
    "content": "config.stopBubbling=true\n# this file shouldn't be read\nno error expected"
  },
  {
    "path": "test/configuration/resource/configurationRoot/e1/environment.config",
    "content": "lombok.accessors.prefix += e_"
  },
  {
    "path": "test/configuration/resource/configurationRoot/err.txt",
    "content": "Problems in the configuration files:\n- Imported file does not exist: import missing (BASE/d1/d11/d111/import1.config:1)\n- Imported file does not exist: import directory (BASE/d1/d11/d111/import1.config:5)\n- Import is not valid: import /illegal (BASE/archives/a1.jar!lombok.config:2)\n- Imported file does not exist: import nonexisting (BASE/archives/a1.jar!d1/include.config:2)"
  },
  {
    "path": "test/configuration/resource/configurationRoot/features/annotations/lombok.config",
    "content": "config.stopBubbling=true\n\nlombok.addNullAnnotations = jspecify"
  },
  {
    "path": "test/configuration/resource/configurationRoot/generate.bat",
    "content": "jar -c -M -f archives/a1.jar -C archives/a1 .\njar -c -M -f archives/a2.zip -C archives/a2 ."
  },
  {
    "path": "test/configuration/resource/configurationRoot/home/home.config",
    "content": "lombok.accessors.prefix += h_"
  },
  {
    "path": "test/configuration/resource/configurationRoot/out.txt",
    "content": "Configuration for 'BASE/d1/d11'.\n\n# Emit a warning or error if @Accessors is used.\nlombok.accessors.flagUsage = ERROR\n# BASE/d1/d11/lombok.config (stopped bubbling):\n#    4: lombok.accessors.flagUsage = ERROR\n\n# Generate setters that return 'this' instead of 'void' (default: false).\nlombok.accessors.chain = false\n# BASE/d1/d11/lombok.config (stopped bubbling):\n#    3: lombok.accessors.chain = false\n\n# Strip this field prefix, like 'f' or 'm_', from the names of generated getters, setters, and with-ers.\nlombok.accessors.prefix += f\n# BASE/d1/d11/lombok.config (stopped bubbling):\n#    5: lombok.accessors.prefix += f\n\n# Generate @javax.annotation.Generated on all generated code (default: false). Deprecated, use 'lombok.addJavaxGeneratedAnnotation' instead.\nclear lombok.addGeneratedAnnotation\n\n# Generate @javax.annotation.Generated on all generated code (default: follow lombok.addGeneratedAnnotation).\nclear lombok.addJavaxGeneratedAnnotation\n\n# Generate @ConstructorProperties for generated constructors (default: false).\nclear lombok.anyConstructor.addConstructorProperties\n\n# Use this name for the generated logger fields (default: 'log').\nclear lombok.log.fieldName\n\n# Copy these annotations to getters, setters, with methods, builder-setters, etc.\nlombok.copyableAnnotations += copy1\n# BASE/d1/d11/lombok.config (stopped bubbling):\n#    7: lombok.copyableAnnotations += copy1\n\n# Generate some style of null annotation for generated code where this is relevant. (default: none).\nclear lombok.addNullAnnotations\n\n\nConfiguration for:\n- BASE/d1/d11/d111\n- BASE/d1/d11/d111/f1.txt\n\n# Emit a warning or error if @Accessors is used.\nlombok.accessors.flagUsage = ERROR\n# BASE/d1/d11/lombok.config (stopped bubbling):\n#    4: lombok.accessors.flagUsage = ERROR\n\n# Generate setters that return 'this' instead of 'void' (default: false).\nclear lombok.accessors.chain\n# BASE/d1/d11/lombok.config (stopped bubbling):\n#    3: lombok.accessors.chain = false\n# \n# BASE/d1/d11/d111/lombok.config:\n#    3: clear lombok.accessors.chain\n\n# Strip this field prefix, like 'f' or 'm_', from the names of generated getters, setters, and with-ers.\nlombok.accessors.prefix += e_\nlombok.accessors.prefix += h_\nlombok.accessors.prefix += z_\nlombok.accessors.prefix += f\nlombok.accessors.prefix += m_\n# BASE/d1/d11/lombok.config (stopped bubbling):\n#    5: lombok.accessors.prefix += f\n# \n# BASE/e1/environment.config (imported from BASE/d1/d11/d111/import1.config:6):\n#    1: lombok.accessors.prefix += e_\n# \n# BASE/home/home.config (imported from BASE/d1/d11/d111/import1.config:7):\n#    1: lombok.accessors.prefix += h_\n# \n# BASE/d1/d11/d111/import1.config (imported from BASE/d1/d11/d111/lombok.config:1):\n#    8: lombok.accessors.prefix += z_\n#    9: lombok.accessors.prefix += f\n# \n# BASE/d1/d11/d111/lombok.config:\n#    4: lombok.accessors.prefix += m_\n\n# Generate @javax.annotation.Generated on all generated code (default: false). Deprecated, use 'lombok.addJavaxGeneratedAnnotation' instead.\nlombok.addGeneratedAnnotation = true\n# BASE/archives/a1.jar!d1/include.config (imported from BASE/archives/a1.jar!lombok.config:1) (stopped bubbling):\n#    4: lombok.addGeneratedAnnotation = true\n\n# Generate @javax.annotation.Generated on all generated code (default: follow lombok.addGeneratedAnnotation).\nlombok.addJavaxGeneratedAnnotation = true\n# BASE/archives/a1.jar!d2/include.config (imported from BASE/archives/a1.jar!d1/include.config:1) (stopped bubbling):\n#    1: lombok.addJavaxGeneratedAnnotation = true\n\n# Generate @ConstructorProperties for generated constructors (default: false).\nlombok.anyConstructor.addConstructorProperties = true\n# BASE/archives/a1.jar!lombok.config (imported from BASE/d1/d11/d111/import1.config:4) (stopped bubbling):\n#    3: lombok.anyConstructor.addConstructorProperties = true\n\n# Use this name for the generated logger fields (default: 'log').\nclear lombok.log.fieldName\n\n# Copy these annotations to getters, setters, with methods, builder-setters, etc.\nlombok.copyableAnnotations += copy2\n# BASE/d1/d11/lombok.config (stopped bubbling):\n#    7: lombok.copyableAnnotations += copy1\n# \n# BASE/archives/a2.zip!reset.config (imported from BASE/d1/d11/d111/lombok.config:2):\n#    1: clear lombok.copyableAnnotations\n# \n# BASE/d1/d11/d111/lombok.config:\n#    5: lombok.copyableAnnotations += copy2\n\n# Generate some style of null annotation for generated code where this is relevant. (default: none).\nclear lombok.addNullAnnotations\n\n\nConfiguration for 'BASE/d1/d12'.\n\n# Emit a warning or error if @Accessors is used.\nclear lombok.accessors.flagUsage\n\n# Generate setters that return 'this' instead of 'void' (default: false).\nlombok.accessors.chain = true\n# BASE/d1/d12/lombok.config (stopped bubbling):\n#    3: lombok.accessors.chain = true\n\n# Strip this field prefix, like 'f' or 'm_', from the names of generated getters, setters, and with-ers.\nclear lombok.accessors.prefix\n\n# Generate @javax.annotation.Generated on all generated code (default: false). Deprecated, use 'lombok.addJavaxGeneratedAnnotation' instead.\nclear lombok.addGeneratedAnnotation\n\n# Generate @javax.annotation.Generated on all generated code (default: follow lombok.addGeneratedAnnotation).\nclear lombok.addJavaxGeneratedAnnotation\n\n# Generate @ConstructorProperties for generated constructors (default: false).\nclear lombok.anyConstructor.addConstructorProperties\n\n# Use this name for the generated logger fields (default: 'log').\nclear lombok.log.fieldName\n\n# Copy these annotations to getters, setters, with methods, builder-setters, etc.\nclear lombok.copyableAnnotations\n\n# Generate some style of null annotation for generated code where this is relevant. (default: none).\nclear lombok.addNullAnnotations\n\n\nConfiguration for 'BASE/features/annotations'.\n\n# Emit a warning or error if @Accessors is used.\nclear lombok.accessors.flagUsage\n\n# Generate setters that return 'this' instead of 'void' (default: false).\nclear lombok.accessors.chain\n\n# Strip this field prefix, like 'f' or 'm_', from the names of generated getters, setters, and with-ers.\nclear lombok.accessors.prefix\n\n# Generate @javax.annotation.Generated on all generated code (default: false). Deprecated, use 'lombok.addJavaxGeneratedAnnotation' instead.\nclear lombok.addGeneratedAnnotation\n\n# Generate @javax.annotation.Generated on all generated code (default: follow lombok.addGeneratedAnnotation).\nclear lombok.addJavaxGeneratedAnnotation\n\n# Generate @ConstructorProperties for generated constructors (default: false).\nclear lombok.anyConstructor.addConstructorProperties\n\n# Use this name for the generated logger fields (default: 'log').\nclear lombok.log.fieldName\n\n# Copy these annotations to getters, setters, with methods, builder-setters, etc.\nclear lombok.copyableAnnotations\n\n# Generate some style of null annotation for generated code where this is relevant. (default: none).\nlombok.addNullAnnotations = jspecify\n# BASE/features/annotations/lombok.config (stopped bubbling):\n#    3: lombok.addNullAnnotations = jspecify\n"
  },
  {
    "path": "test/configuration/src/lombok/core/configuration/RunConfigurationTests.java",
    "content": "/*\n * Copyright (C) 2014 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\nimport org.junit.runner.RunWith;\nimport org.junit.runners.Suite;\nimport org.junit.runners.Suite.SuiteClasses;\n\n@RunWith(Suite.class)\n@SuiteClasses({TestConfiguration.class})\npublic class RunConfigurationTests {\n}\n"
  },
  {
    "path": "test/configuration/src/lombok/core/configuration/TestConfiguration.java",
    "content": "/*\n * Copyright (C) 2014-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core.configuration;\n\nimport static lombok.ConfigurationKeys.*;\nimport static org.junit.Assert.assertEquals;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.PrintStream;\nimport java.util.Arrays;\nimport java.util.Collection;\nimport java.util.regex.Pattern;\n\nimport org.junit.Test;\n\npublic class TestConfiguration {\n\t\n\t@Test\n\tpublic void testDisplayVerbose() throws Exception {\n\t\t\n\t\t@SuppressWarnings(value = {\"all\", \"unchecked\", \"deprecation\"})\n\t\tCollection<ConfigurationKey<?>> keys = Arrays.asList(ACCESSORS_FLAG_USAGE, ACCESSORS_CHAIN, ACCESSORS_PREFIX, ADD_GENERATED_ANNOTATIONS, ADD_JAVAX_GENERATED_ANNOTATIONS, ANY_CONSTRUCTOR_ADD_CONSTRUCTOR_PROPERTIES, LOG_ANY_FIELD_NAME, COPYABLE_ANNOTATIONS, ADD_NULL_ANNOTATIONS);\n\t\t\n\t\tString baseName = \"test/configuration/resource/configurationRoot/\";\n\t\tFile directory = new File(baseName);\n\t\tString normalizedName = new File(directory.getAbsoluteFile().toURI().normalize()).toString().replace('\\\\', '/') + \"/\";\n\t\tCollection<String> paths = Arrays.asList(normalizedName + \"d1/d11\", normalizedName + \"d1/d12\", normalizedName + \"d1/d11/d111\", normalizedName + \"d1/d11/d111/f1.txt\", normalizedName + \"features/annotations\");\n\t\t\n\t\tByteArrayOutputStream rawOut = new ByteArrayOutputStream();\n\t\tByteArrayOutputStream rawErr = new ByteArrayOutputStream();\n\t\tPrintStream outStream = new PrintStream(rawOut);\n\t\tPrintStream errStream = new PrintStream(rawErr);\n\t\t\n\t\tConfigurationFile.setEnvironment(\"env\", normalizedName + \"/e1\");\n\t\tString userHome = System.getProperty(\"user.home\");\n\t\tint result = -1;\n\t\ttry {\n\t\t\tSystem.setProperty(\"user.home\", normalizedName + \"/home\");\n\t\t\tresult = new ConfigurationApp().redirectOutput(outStream, errStream).display(keys, true, paths, true, false);\n\t\t} finally {\n\t\t\tSystem.setProperty(\"user.home\", userHome);\n\t\t}\n\t\t\n\t\toutStream.flush();\n\t\terrStream.flush();\n\t\t\n\t\tString out = new String(rawOut.toByteArray()).replace('\\\\', '/').replace(\"\\r\", \"\").replaceAll(Pattern.quote(normalizedName) + \"|\" + Pattern.quote(baseName), \"BASE/\").trim();\n\t\tString err = new String(rawErr.toByteArray()).replace('\\\\', '/').replace(\"\\r\", \"\").replaceAll(Pattern.quote(normalizedName) + \"|\" + Pattern.quote(baseName), \"BASE/\").trim();\n\t\t\n\t\tcheckContent(directory, out, \"out\");\n\t\tcheckContent(directory, err, \"err\");\n\t\tassertEquals(2, result);\n\t}\n\n\tprivate void checkContent(File dir, String actual, String type) throws Exception {\n\t\tString expected = fileToString(new File(dir, type + \".txt\")).replace(\"\\r\", \"\").trim();\n\t\tif (!expected.equals(actual)) {\n\t\t\tSystem.out.printf(\"**** Expected %s (@%s):\\n\", type, new File(dir, type + \".txt\").getCanonicalPath());\n\t\t\tSystem.out.println(expected);\n\t\t\tSystem.out.printf(\"**** Actual %s:\\n\", type);\n\t\t\tSystem.out.println(actual);\n\t\t\tSystem.out.println(\"****\");\n\t\t}\n\t\tassertEquals(expected, actual);\n\t}\n\t\n\tstatic String fileToString(File configFile) throws Exception {\n\t\tbyte[] b = new byte[65536];\n\t\tFileInputStream fis = new FileInputStream(configFile);\n\t\ttry {\n\t\t\tByteArrayOutputStream out = new ByteArrayOutputStream();\n\t\t\twhile (true) {\n\t\t\t\tint r = fis.read(b);\n\t\t\t\tif (r == -1) break;\n\t\t\t\tout.write(b, 0, r);\n\t\t\t}\n\t\t\treturn new String(out.toByteArray(), \"UTF-8\");\n\t\t} finally {\n\t\t\tfis.close();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/core/src/lombok/AbstractRunTests.java",
    "content": "/*\n * Copyright (C) 2009-2024 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport static org.junit.Assert.*;\n\nimport java.io.BufferedReader;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileNotFoundException;\nimport java.io.FileOutputStream;\nimport java.io.FileReader;\nimport java.io.IOException;\nimport java.io.InputStreamReader;\nimport java.net.URI;\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Iterator;\nimport java.util.LinkedHashSet;\nimport java.util.List;\n\nimport org.junit.Assert;\n\nimport lombok.DirectoryRunner.FileTester;\nimport lombok.core.LombokConfiguration;\nimport lombok.core.LombokImmutableList;\nimport lombok.core.configuration.ConfigurationKeysLoader;\nimport lombok.core.configuration.ConfigurationResolver;\nimport lombok.core.configuration.ConfigurationResolverFactory;\nimport lombok.javac.CapturingDiagnosticListener.CompilerMessage;\nimport lombok.transform.TestLombokFilesIdempotent;\nimport lombok.transform.TestSourceFiles;\n\npublic abstract class AbstractRunTests {\n\tpublic final FileTester createTester(final DirectoryRunner.TestParams params, final File file, String platform, int version, final boolean copyToSource) throws IOException {\n\t\tConfigurationKeysLoader.LoaderLoader.loadAllConfigurationKeys();\n\t\tAssertionError directiveFailure = null;\n\t\tLombokTestSource sourceDirectives = null;\n\t\ttry {\n\t\t\tsourceDirectives = LombokTestSource.readDirectives(file);\n\t\t\tif (sourceDirectives.isIgnore()) return null;\n\t\t\tif (!sourceDirectives.versionWithinLimit(version)) return null;\n\t\t\tif (!sourceDirectives.runOnPlatform(platform)) return null;\n\t\t} catch (AssertionError ae) {\n\t\t\tdirectiveFailure = ae;\n\t\t}\n\t\t\n\t\tString fileName = file.getName();\n\t\tfinal LombokTestSource expected = LombokTestSource.read(params.getAfterDirectory(), params.getMessagesDirectory(), fileName);\n\t\t\n\t\tif (expected.isIgnore()) return null;\n\t\tif (!expected.versionWithinLimit(params.getVersion())) return null;\n\t\tif (!expected.versionWithinLimit(version)) return null;\n\t\tif (expected.isSkipIdempotent() && params instanceof TestLombokFilesIdempotent) return null;\n\t\t\n\t\tfinal LombokTestSource sourceDirectives_ = sourceDirectives;\n\t\tfinal AssertionError directiveFailure_ = directiveFailure;\n\t\treturn new FileTester() {\n\t\t\t@Override public void runTest() throws Throwable {\n\t\t\t\tif (directiveFailure_ != null) throw directiveFailure_;\n\t\t\t\tLombokConfiguration.overrideConfigurationResolverFactory(new ConfigurationResolverFactory() {\n\t\t\t\t\t@Override public ConfigurationResolver createResolver(URI sourceLocation) {\n\t\t\t\t\t\treturn sourceDirectives_.getConfiguration();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tTestParameters testParameters = new TestParameters();\n\t\t\t\ttestParameters.setEncoding(sourceDirectives_.getSpecifiedEncoding());\n\t\t\t\ttestParameters.setFormatPreferences(sourceDirectives_.getFormatPreferences());\n\t\t\t\ttestParameters.setMinVersion(sourceDirectives_.minVersion());\n\t\t\t\ttestParameters.setVerifyDiet(sourceDirectives_.isVerifyDiet());\n\t\t\t\tboolean checkPositions = !(params instanceof TestLombokFilesIdempotent || params instanceof TestSourceFiles) && !sourceDirectives_.isSkipCompareContent();\n\t\t\t\ttestParameters.setCheckPositions(checkPositions);\n\t\t\t\tString javaVersionString = System.getProperty(\"compiler.compliance.level\");\n\t\t\t\tif (javaVersionString != null) {\n\t\t\t\t\tlong version = Long.parseLong(javaVersionString);\n\t\t\t\t\ttestParameters.setSourceVersion(version);\n\t\t\t\t\ttestParameters.setTargetVersion(version);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tTransformationResult result = transformCode(file, testParameters);\n\t\t\t\tboolean changed = result.isChanged();\n\t\t\t\tboolean forceUnchanged = sourceDirectives_.forceUnchanged() || sourceDirectives_.isSkipCompareContent();\n\t\t\t\tif (params.expectChanges() && !forceUnchanged && !changed) result.addMessage(new CompilerMessage(-1, -1, true, \"not flagged modified\"));\n\t\t\t\tif (!params.expectChanges() && changed) result.addMessage(new CompilerMessage(-1, -1, true, \"unexpected modification\"));\n\t\t\t\t\n\t\t\t\tcompare(file.getName(), expected, result, params.printErrors(), sourceDirectives_.isSkipCompareContent() || expected.isSkipCompareContent(), copyToSource);\n\t\t\t}\n\t\t};\n\t}\n\t\n\tprotected abstract TransformationResult transformCode(File file, TestParameters parameters) throws Throwable;\n\t\n\tprotected String readFile(File file) throws IOException {\n\t\tBufferedReader reader;\n\t\ttry {\n\t\t\treader = new BufferedReader(new FileReader(file));\n\t\t} catch (FileNotFoundException e) {\n\t\t\treturn null;\n\t\t}\n\t\tStringBuilder result = new StringBuilder();\n\t\tString line;\n\t\twhile ((line = reader.readLine()) != null) {\n\t\t\tresult.append(line);\n\t\t\tresult.append(\"\\n\");\n\t\t}\n\t\treader.close();\n\t\treturn result.toString();\n\t}\n\t\n\tprivate static void dumpToFile(File file, String content) throws IOException {\n\t\tList<String> directives = new ArrayList<String>();\n\t\t\n\t\tif (file.exists()) {\n\t\t\tBufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), \"UTF-8\"));\n\t\t\ttry {\n\t\t\t\twhile (true) {\n\t\t\t\t\tString line = br.readLine();\n\t\t\t\t\tif (line == null) break;\n\t\t\t\t\tif (line.startsWith(\"//\")) directives.add(line);\n\t\t\t\t\telse if (!line.isEmpty()) break;\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tbr.close();\n\t\t\t}\n\t\t}\n\t\t\n\t\tFileOutputStream fos = new FileOutputStream(file);\n\t\ttry {\n\t\t\tfor (String directive : directives) fos.write((directive + \"\\n\").getBytes(\"UTF-8\"));\n\t\t\t\n\t\t\tboolean atStart = true;\n\t\t\tfor (String line : content.split(\"(\\\\r?\\\\n)\")) {\n\t\t\t\tif (line.isEmpty()) continue;\n\t\t\t\tif (atStart && line.startsWith(\"//\")) continue;\n\t\t\t\tatStart = false;\n\t\t\t\tfos.write((line + \"\\n\").getBytes(\"UTF-8\"));\n\t\t\t}\n\t\t} finally {\n\t\t\tfos.close();\n\t\t}\n\t}\n\t\n\tprivate static void dumpToFile(File file, Collection<CompilerMessage> content) throws IOException {\n\t\tFileOutputStream fos = new FileOutputStream(file);\n\t\tSystem.err.println(\">>> DUMPING ERR MSG: \" + file.getAbsolutePath());\n\t\ttry {\n\t\t\tfor (CompilerMessage message : content) {\n\t\t\t\tfos.write(CompilerMessageMatcher.asCompilerMessageMatcher(message).toString().getBytes(\"UTF-8\"));\n\t\t\t\tfos.write('\\n');\n\t\t\t}\n\t\t} finally {\n\t\t\tfos.close();\n\t\t}\n\t}\n\t\n\tprivate void compare(String name, LombokTestSource expected, TransformationResult result, boolean printErrors, boolean skipCompareContent, boolean copyToSource) throws Throwable {\n\t\tString actualFile = result.getOutput();\n\t\tLinkedHashSet<CompilerMessage> actualMessages = result.getMessages();\n\t\t\n\t\tif (!skipCompareContent) try {\n\t\t\tcompareContent(name, expected.getContent(), actualFile);\n\t\t} catch (Throwable e) {\n\t\t\tif (copyToSource) {\n\t\t\t\tdumpToFile(expected.getSourceFile(), actualFile);\n\t\t\t\tSystem.out.println(\"UPDATED: \" + expected.getSourceFile());\n\t\t\t} else {\n\t\t\t\tif (printErrors) {\n\t\t\t\t\tSystem.out.println(\"***** \" + name + \" *****\");\n\t\t\t\t\tSystem.out.println(e.getMessage());\n\t\t\t\t\tSystem.out.println(\"**** Expected ******\");\n\t\t\t\t\tSystem.out.println(expected.getContent());\n\t\t\t\t\tSystem.out.println(\"****  Actual  ******\");\n\t\t\t\t\tSystem.out.println(actualFile);\n\t\t\t\t\tif (actualMessages != null && !actualMessages.isEmpty()) {\n\t\t\t\t\t\tSystem.out.println(\"**** Actual Errors *****\");\n\t\t\t\t\t\tfor (CompilerMessage actualMessage : actualMessages) {\n\t\t\t\t\t\t\tSystem.out.println(actualMessage);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tSystem.out.println(\"*******************\");\n\t\t\t\t}\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\t\t\n\t\ttry {\n\t\t\tcompareMessages(name, expected.getMessages(), actualMessages);\n\t\t} catch (Throwable e) {\n\t\t\tif (copyToSource) {\n\t\t\t\tif (actualMessages.isEmpty()) {\n\t\t\t\t\tif (expected.getMessagesFile().exists()) {\n\t\t\t\t\t\texpected.getMessagesFile().delete();\n\t\t\t\t\t\tSystem.out.println(\"DELETED: \" + expected.getMessagesFile());\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tdumpToFile(expected.getMessagesFile(), actualMessages);\n\t\t\t\t\tSystem.out.println(\"UPDATED: \" + expected.getMessagesFile());\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (printErrors) {\n\t\t\t\t\tSystem.out.println(\"***** \" + name + \" *****\");\n\t\t\t\t\tSystem.out.println(e.getMessage());\n\t\t\t\t\tSystem.out.println(\"**** Expected ******\");\n\t\t\t\t\tfor (CompilerMessageMatcher expectedMessage : expected.getMessages()) {\n\t\t\t\t\t\tSystem.out.println(expectedMessage);\n\t\t\t\t\t}\n\t\t\t\t\tSystem.out.println(\"****  Actual  ******\");\n\t\t\t\t\tfor (CompilerMessage actualMessage : actualMessages) {\n\t\t\t\t\t\tSystem.out.println(actualMessage);\n\t\t\t\t\t}\n\t\t\t\t\tSystem.out.println(\"****  Actual File  ******\");\n\t\t\t\t\tSystem.out.println(lineNumber(actualFile));\n\t\t\t\t\tSystem.out.println(\"*******************\");\n\t\t\t\t}\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate CharSequence lineNumber(String content) {\n\t\tStringBuilder out = new StringBuilder();\n\t\tint pos = 0;\n\t\tint ln = 1;\n\t\twhile (true) {\n\t\t\tout.append(String.format(\"%4d \", ln));\n\t\t\tint idx = content.indexOf('\\n', pos);\n\t\t\tif (idx == -1) {\n\t\t\t\treturn out.append(content.substring(pos));\n\t\t\t}\n\t\t\tout.append(content.substring(pos, idx + 1));\n\t\t\tln++;\n\t\t\tpos = idx + 1;\n\t\t}\n\t}\n\t\n\t@SuppressWarnings(\"null\") /* eclipse bug workaround; it falsely thinks stuffAc will always be null. */\n\tprivate static void compareMessages(String name, LombokImmutableList<CompilerMessageMatcher> expected, LinkedHashSet<CompilerMessage> actual) {\n\t\tIterator<CompilerMessageMatcher> expectedIterator = expected.iterator();\n\t\tIterator<CompilerMessage> actualIterator = actual.iterator();\n\t\t\n\t\tCompilerMessage stuffAc = null;\n\t\twhile (true) {\n\t\t\tboolean exHasNext = expectedIterator.hasNext();\n\t\t\tboolean acHasNext = stuffAc != null || actualIterator.hasNext();\n\t\t\tif (!exHasNext && !acHasNext) break;\n\t\t\tif (exHasNext && acHasNext) {\n\t\t\t\tCompilerMessageMatcher cmm = expectedIterator.next();\n\t\t\t\tCompilerMessage cm = stuffAc == null ? actualIterator.next() : stuffAc;\n\t\t\t\tif (cmm.matches(cm)) continue;\n\t\t\t\tif (cmm.isOptional()) stuffAc = cm;\n\t\t\t\tfail(String.format(\"[%s] Expected message '%s' but got message '%s'\", name, cmm, cm));\n\t\t\t\tthrow new AssertionError(\"fail should have aborted already.\");\n\t\t\t}\n\t\t\t\n\t\t\twhile (expectedIterator.hasNext()) {\n\t\t\t\tCompilerMessageMatcher next = expectedIterator.next();\n\t\t\t\tif (next.isOptional()) continue;\n\t\t\t\tfail(String.format(\"[%s] Expected message '%s' but ran out of actual messages\", name, next));\n\t\t\t}\n\t\t\tif (acHasNext) fail(String.format(\"[%s] Unexpected message: %s\", name, actualIterator.next()));\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tprivate static void compareContent(String name, String expectedFile, String actualFile) {\n\t\tString[] expectedLines = expectedFile.split(\"(\\\\r?\\\\n)\");\n\t\tString[] actualLines = actualFile.split(\"(\\\\r?\\\\n)\");\n\t\t\n\t\tfor (int i = 0; i < expectedLines.length; i++) {\n\t\t\tif (expectedLines[i].isEmpty() || expectedLines[i].startsWith(\"//\")) expectedLines[i] = \"\";\n\t\t\telse break;\n\t\t}\n\t\tfor (int i = 0; i < actualLines.length; i++) {\n\t\t\tif (actualLines[i].isEmpty() || actualLines[i].startsWith(\"//\")) actualLines[i] = \"\";\n\t\t\telse break;\n\t\t}\n\t\texpectedLines = removeBlanks(expectedLines);\n\t\tactualLines = removeBlanks(actualLines);\n\t\t\n\t\tint size = Math.min(expectedLines.length, actualLines.length);\n\t\tif (size == 0 && expectedLines.length + actualLines.length > 0) {\n\t\t\tAssert.fail(\"Missing / empty expected file: \" + name);\n\t\t}\n\t\t\n\t\tfor (int i = 0; i < size; i++) {\n\t\t\tString expected = trimRight(expectedLines[i]);\n\t\t\tString actual = trimRight(actualLines[i]);\n\t\t\tassertEquals(String.format(\"Difference in %s on line %d\", name, i + 1), expected, actual);\n\t\t}\n\t\tif (expectedLines.length > actualLines.length) {\n\t\t\tfail(String.format(\"Missing line %d in generated %s: %s\", size + 1, name, expectedLines[size]));\n\t\t}\n\t\tif (expectedLines.length < actualLines.length) {\n\t\t\tfail(String.format(\"Extra line %d in generated %s: %s\", size + 1, name, actualLines[size]));\n\t\t}\n\t}\n\t\n\tprivate static String trimRight(String in) {\n\t\tint endIdx = in.length() - 1;\n\t\twhile (endIdx > -1 && Character.isWhitespace(in.charAt(endIdx))) {\n\t\t\tendIdx--;\n\t\t}\n\t\t\n\t\treturn in.substring(0, endIdx + 1);\n\t}\n\t\n\tprivate static String[] removeBlanks(String[] in) {\n\t\tList<String> out = new ArrayList<String>();\n\t\tfor (String s : in) {\n\t\t\tif (!s.trim().isEmpty()) out.add(s);\n\t\t}\n\t\treturn out.toArray(new String[0]);\n\t}\n}\n"
  },
  {
    "path": "test/core/src/lombok/CompilerMessageMatcher.java",
    "content": "/*\n * Copyright (C) 2012-2024 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport java.io.BufferedReader;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\nimport lombok.javac.CapturingDiagnosticListener.CompilerMessage;\n\npublic class CompilerMessageMatcher {\n\t/** Line Number (starting at 1) */\n\tprivate final List<Integer> lineNumbers = new ArrayList<Integer>();\n\tprivate final List<Long> positions = new ArrayList<Long>();\n\tprivate final List<List<String>> messages = new ArrayList<List<String>>();\n\tprivate boolean optional;\n\t\n\tprivate CompilerMessageMatcher() {}\n\t\n\tpublic boolean isOptional() {\n\t\treturn optional;\n\t}\n\t\n\tpublic static CompilerMessageMatcher asCompilerMessageMatcher(CompilerMessage message) {\n\t\tCompilerMessageMatcher cmm = new CompilerMessageMatcher();\n\t\tcmm.lineNumbers.add((int) message.getLine());\n\t\tcmm.positions.add(message.getPosition());\n\t\tcmm.messages.add(Arrays.asList(message.getMessage().split(\"\\\\s+\")));\n\t\treturn cmm;\n\t}\n\t\n\t@Override public String toString() {\n\t\tStringBuilder out = new StringBuilder();\n\t\tfor (int i = 0; i < lineNumbers.size(); i++) {\n\t\t\tout.append(lineNumbers.get(i));\n\t\t\tif (positions.get(i) != null) out.append(\":\").append(positions.get(i));\n\t\t\tout.append(\" \");\n\t\t\tfor (String part : messages.get(i)) out.append(part).append(\" \");\n\t\t\tif (out.length() > 0) out.setLength(out.length() - 1);\n\t\t\tout.append(\" |||| \");\n\t\t}\n\t\tif (out.length() > 0) out.setLength(out.length() - 6);\n\t\treturn out.toString();\n\t}\n\t\n\tpublic boolean matches(CompilerMessage message) {\n\t\touter:\n\t\tfor (int i = 0; i < lineNumbers.size(); i++) {\n\t\t\tif (message.getLine() != lineNumbers.get(i)) continue;\n\t\t\tif (positions.get(i) != null && !positions.get(i).equals(message.getPosition())) continue;\n\t\t\tfor (String token : messages.get(i)) {\n\t\t\t\tif (!message.getMessage().contains(token)) continue outer;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\tpublic static List<CompilerMessageMatcher> readAll(InputStream rawIn) throws IOException {\n\t\tBufferedReader in = new BufferedReader(new InputStreamReader(rawIn, \"UTF-8\"));\n\t\tList<CompilerMessageMatcher> out = new ArrayList<CompilerMessageMatcher>();\n\t\tfor (String line = in.readLine(); line != null; line = in.readLine()) {\n\t\t\tCompilerMessageMatcher cmm = read(line);\n\t\t\tif (cmm != null) out.add(cmm);\n\t\t}\n\t\treturn out;\n\t}\n\t\n\tprivate static final Pattern PATTERN = Pattern.compile(\"^(-?\\\\d+)(?::(\\\\d+))? (.*)$\");\n\t\n\tprivate static CompilerMessageMatcher read(String line) {\n\t\tline = line.trim();\n\t\tif (line.isEmpty()) return null;\n\t\tboolean optional = false;\n\t\t\n\t\tif (line.startsWith(\"OPTIONAL \")) {\n\t\t\tline = line.substring(9);\n\t\t\toptional = true;\n\t\t}\n\t\t\n\t\tString[] parts = line.split(\"\\\\s*\\\\|\\\\|\\\\|\\\\|\\\\s*\");\n\t\t\n\t\tCompilerMessageMatcher cmm = new CompilerMessageMatcher();\n\t\tcmm.optional = optional;\n\t\tfor (String part : parts) {\n\t\t\tMatcher m = PATTERN.matcher(part);\n\t\t\tif (!m.matches()) throw new IllegalArgumentException(\"Typo in test file: \" + line);\n\t\t\tcmm.lineNumbers.add(Integer.parseInt(m.group(1)));\n\t\t\tcmm.positions.add(m.group(2) != null ? Long.parseLong(m.group(2)) : null);\n\t\t\tcmm.messages.add(Arrays.asList(m.group(3).split(\"\\\\s+\")));\n\t\t}\n\t\t\n\t\treturn cmm;\n\t}\n}\n"
  },
  {
    "path": "test/core/src/lombok/DirectoryRunner.java",
    "content": "/*\n * Copyright (C) 2009-2024 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport java.io.File;\nimport java.io.FileFilter;\nimport java.io.IOException;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.TreeMap;\n\nimport org.junit.runner.Description;\nimport org.junit.runner.Runner;\nimport org.junit.runner.notification.Failure;\nimport org.junit.runner.notification.RunNotifier;\n\nimport lombok.eclipse.Eclipse;\nimport lombok.javac.Javac;\n\npublic class DirectoryRunner extends Runner {\n\t/** Add 1 or more file names to reduce the testset to just the named file(s). No files = test it all. */\n\tprivate static final List<String> DEBUG_FOCUS_ON_FILE = Arrays.asList(\n\t\t);\n\t\n\t/*\n\t * If this is set to true, you are decreeing that all tests pass, and that any test that dares to say it does not, means the test is wrong and not lombok: The framework will <strong>update</strong> the 'target' so that it now passes.\n\t * This is, naturally, an exceedingly dangerous tool. The general way to use it is: First ensure all tests pass, then, do some minor refactor that massively impacts the tests, then, enable this, run the tests, then turn this off again,\n\t * then, thoroughly review your commit diff.\n\t */\n\tprivate static final boolean ITS_ALL_GOOD = false;\n\t\n\tpublic enum Compiler {\n\t\tDELOMBOK {\n\t\t\t@Override public int getVersion() {\n\t\t\t\treturn Javac.getJavaCompilerVersion();\n\t\t\t}\n\t\t},\n\t\tJAVAC {\n\t\t\t@Override public int getVersion() {\n\t\t\t\treturn DELOMBOK.getVersion();\n\t\t\t}\n\t\t},\n\t\tECJ {\n\t\t\t@Override public int getVersion() {\n\t\t\t\tString javaVersionString = System.getProperty(\"compiler.compliance.level\");\n\t\t\t\treturn javaVersionString != null ? Integer.parseInt(javaVersionString) : Eclipse.getEcjCompilerVersion();\n\t\t\t}\n\t\t};\n\t\t\n\t\tpublic abstract int getVersion();\n\t}\n\t\n\tpublic static abstract class TestParams {\n\t\tpublic abstract Compiler getCompiler();\n\t\tpublic abstract boolean printErrors();\n\t\tpublic abstract File getBeforeDirectory();\n\t\tpublic abstract File getAfterDirectory();\n\t\tpublic abstract File getMessagesDirectory();\n\t\t/** Version of the JDK dialect that the compiler can understand; for example, if you return '7', you should know what try-with-resources is. */\n\t\tpublic int getVersion() {\n\t\t\treturn getCompiler().getVersion();\n\t\t}\n\t\t\n\t\tpublic boolean accept(File file) {\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\tpublic abstract boolean expectChanges();\n\t\tpublic String testNamePrefix() {\n\t\t\treturn \"\";\n\t\t}\n\t}\n\t\n\tprivate static final FileFilter JAVA_FILE_FILTER = new FileFilter() {\n\t\t@Override public boolean accept(File file) {\n\t\t\tif (!file.isFile() || !file.getName().endsWith(\".java\")) return false;\n\t\t\tboolean positiveFilter = false;\n\t\t\tfor (String dfof : DEBUG_FOCUS_ON_FILE) {\n\t\t\t\tif (dfof.isEmpty()) continue;\n\t\t\t\tif (!dfof.endsWith(\".java\")) dfof = dfof + \".java\";\n\t\t\t\tboolean invert = dfof.startsWith(\"!\");\n\t\t\t\tif (invert) dfof = dfof.substring(1);\n\t\t\t\tpositiveFilter = positiveFilter || !invert;\n\t\t\t\tint starIdx = dfof.indexOf('*');\n\t\t\t\tif (starIdx == -1) {\n\t\t\t\t\tif (file.getName().equals(dfof)) return !invert;\n\t\t\t\t} else {\n\t\t\t\t\tif (file.getName().startsWith(dfof.substring(0, starIdx)) && file.getName().endsWith(dfof.substring(starIdx + 1))) return !invert;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn !positiveFilter;\n\t\t}\n\t};\n\t\n\tprivate final Description description;\n\tprivate final Map<String, Description> tests = new TreeMap<String, Description>();\n\tprivate final Throwable failure;\n\tprivate final TestParams params;\n\t\n\tpublic DirectoryRunner(Class<?> testClass) throws Exception {\n\t\tdescription = Description.createSuiteDescription(testClass);\n\t\t\n\t\tthis.params = (TestParams) testClass.getConstructor().newInstance();\n\t\t\n\t\tThrowable error = null;\n\t\ttry {\n\t\t\taddTests(testClass);\n\t\t} catch (Throwable t) {\n\t\t\terror = t;\n\t\t}\n\t\tthis.failure = error;\n\t}\n\t\n\tprivate void addTests(Class<?> testClass) throws Exception {\n\t\tfor (File file : params.getBeforeDirectory().listFiles(JAVA_FILE_FILTER)) {\n\t\t\tif (!params.accept(file)) continue;\n\t\t\tDescription testDescription = Description.createTestDescription(testClass, this.params.testNamePrefix() + file.getName());\n\t\t\tdescription.addChild(testDescription);\n\t\t\ttests.put(file.getName(), testDescription);\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic Description getDescription() {\n\t\treturn description;\n\t}\n\t\n\t@Override\n\tpublic void run(RunNotifier notifier) {\n\t\tif (failure != null) {\n\t\t\treportInitializationFailure(notifier, description, failure);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tfor (Map.Entry<String, Description> entry : tests.entrySet()) {\n\t\t\tDescription testDescription = entry.getValue();\n\t\t\t\n\t\t\tFileTester tester;\n\t\t\ttry {\n\t\t\t\ttester = createTester(entry.getKey());\n\t\t\t} catch (IOException e) {\n\t\t\t\treportInitializationFailure(notifier, testDescription, e);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tif (tester == null) {\n\t\t\t\tnotifier.fireTestIgnored(testDescription);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tnotifier.fireTestStarted(testDescription);\n\t\t\ttry {\n\t\t\t\ttester.runTest();\n\t\t\t} catch (Throwable t) {\n\t\t\t\tnotifier.fireTestFailure(new Failure(testDescription, t));\n\t\t\t}\n\t\t\tnotifier.fireTestFinished(testDescription);\n\t\t}\n\t}\n\t\n\tprivate void reportInitializationFailure(RunNotifier notifier, Description description, Throwable throwable) {\n\t\tnotifier.fireTestStarted(description);\n\t\tnotifier.fireTestFailure(new Failure(description, throwable));\n\t\tnotifier.fireTestFinished(description);\n\t}\n\t\n\tprivate FileTester createTester(String fileName) throws IOException {\n\t\tFile file = new File(params.getBeforeDirectory(), fileName);\n\t\tswitch (params.getCompiler()) {\n\t\tcase DELOMBOK:\n\t\t\treturn new RunTestsViaDelombok().createTester(params, file, \"javac\", params.getVersion(), ITS_ALL_GOOD);\n\t\tcase ECJ:\n\t\t\tString platform = RunTestsViaEcj.eclipseAvailable() ? \"eclipse\" : \"ecj\";\n\t\t\treturn new RunTestsViaEcj().createTester(params, file, platform, params.getVersion(), ITS_ALL_GOOD);\n\t\tdefault:\n\t\tcase JAVAC:\n\t\t\tthrow new UnsupportedOperationException();\n\t\t}\n\t}\n\t\n\tpublic interface FileTester {\n\t\tvoid runTest() throws Throwable;\n\t}\n}\n"
  },
  {
    "path": "test/core/src/lombok/LombokTestSource.java",
    "content": "/*\n * Copyright (C) 2014-2024 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport java.io.BufferedReader;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\nimport org.junit.Assert;\n\nimport lombok.core.LombokImmutableList;\nimport lombok.core.configuration.BubblingConfigurationResolver;\nimport lombok.core.configuration.ConfigurationFile;\nimport lombok.core.configuration.ConfigurationFileToSource;\nimport lombok.core.configuration.ConfigurationParser;\nimport lombok.core.configuration.ConfigurationProblemReporter;\nimport lombok.core.configuration.ConfigurationResolver;\nimport lombok.core.configuration.ConfigurationSource;\nimport lombok.core.configuration.SingleConfigurationSource;\n\npublic class LombokTestSource {\n\tprivate final File sourceFile;\n\tprivate final File messagesFile;\n\tprivate final String content;\n\tprivate final LombokImmutableList<CompilerMessageMatcher> messages;\n\tprivate final Map<String, String> formatPreferences;\n\tprivate final boolean ignore;\n\tprivate final boolean skipCompareContent;\n\tprivate final boolean skipIdempotent;\n\tprivate final boolean unchanged;\n\tprivate final boolean verifyDiet;\n\tprivate final int versionLowerLimit, versionUpperLimit;\n\tprivate final ConfigurationResolver configuration;\n\tprivate final String specifiedEncoding;\n\tprivate final List<String> platforms;\n\n\tpublic boolean runOnPlatform(String platform) {\n\t\tif (platforms == null || platforms.isEmpty()) return true;\n\t\tint inclusiveCount = 0;\n\t\tfor (String pl : platforms) {\n\t\t\tif (pl.startsWith(\"!\")) continue;\n\t\t\tinclusiveCount++;\n\t\t\tif (pl.equalsIgnoreCase(platform)) return true;\n\t\t}\n\t\tif (inclusiveCount == platforms.size()) {\n\t\t\treturn false;\n\t\t}\n\t\tfor (String pl : platforms) {\n\t\t\tif (!pl.startsWith(\"!\")) continue;\n\t\t\tif (pl.regionMatches(true, 1, platform, 0, platform.length())) return false;\n\t\t}\n\t\treturn true;\n\t}\n\t\n\tpublic boolean versionWithinLimit(int version) {\n\t\treturn version >= versionLowerLimit && version <= versionUpperLimit;\n\t}\n\t\n\tpublic File getSourceFile() {\n\t\treturn sourceFile;\n\t}\n\t\n\tpublic File getMessagesFile() {\n\t\treturn messagesFile;\n\t}\n\t\n\tpublic String getContent() {\n\t\treturn content;\n\t}\n\t\n\tpublic LombokImmutableList<CompilerMessageMatcher> getMessages() {\n\t\treturn messages;\n\t}\n\t\n\tpublic boolean isIgnore() {\n\t\treturn ignore;\n\t}\n\t\n\tpublic boolean forceUnchanged() {\n\t\treturn unchanged;\n\t}\n\t\n\tpublic boolean isSkipCompareContent() {\n\t\treturn skipCompareContent;\n\t}\n\t\n\tpublic boolean isSkipIdempotent() {\n\t\treturn skipIdempotent;\n\t}\n\t\n\tpublic boolean isVerifyDiet() {\n\t\treturn verifyDiet;\n\t}\n\t\n\tpublic String getSpecifiedEncoding() {\n\t\treturn specifiedEncoding;\n\t}\n\t\n\tpublic ConfigurationResolver getConfiguration() {\n\t\treturn configuration;\n\t}\n\t\n\tpublic Map<String, String> getFormatPreferences() {\n\t\treturn formatPreferences;\n\t}\n\t\n\tprivate static final Pattern VERSION_STYLE_1 = Pattern.compile(\"^(\\\\d+)(?:\\\\s+.*)?$\");\n\tprivate static final Pattern VERSION_STYLE_2 = Pattern.compile(\"^\\\\:(\\\\d+)(?:\\\\s+.*)?$\");\n\tprivate static final Pattern VERSION_STYLE_3 = Pattern.compile(\"^(\\\\d+):(?:\\\\s+.*)?$\");\n\tprivate static final Pattern VERSION_STYLE_4 = Pattern.compile(\"^(\\\\d+):(\\\\d+)(?:\\\\s+.*)?$\");\n\t\n\tprivate int[] parseVersionLimit(String spec) {\n\t\t/* Single version: '5' */ {\n\t\t\tMatcher m = VERSION_STYLE_1.matcher(spec);\n\t\t\tif (m.matches()) {\n\t\t\t\tint v = Integer.parseInt(m.group(1));\n\t\t\t\treturn new int[] {v, v};\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* Upper bound: ':5' (inclusive) */ {\n\t\t\tMatcher m = VERSION_STYLE_2.matcher(spec);\n\t\t\tif (m.matches()) return new int[] {0, Integer.parseInt(m.group(1))};\n\t\t}\n\t\t\n\t\t/* Lower bound '5:' (inclusive) */ {\n\t\t\tMatcher m = VERSION_STYLE_3.matcher(spec);\n\t\t\tif (m.matches()) return new int[] {Integer.parseInt(m.group(1)), Integer.MAX_VALUE};\n\t\t}\n\t\t\n\t\t/* Range '7:8' (inclusive) */ {\n\t\t\tMatcher m = VERSION_STYLE_4.matcher(spec);\n\t\t\tif (m.matches()) return new int[] {Integer.parseInt(m.group(1)), Integer.parseInt(m.group(2))};\n\t\t}\n\t\t\n\t\treturn null;\n\t}\n\t\n\tprivate static final Pattern IGNORE_PATTERN = Pattern.compile(\"^\\\\s*ignore\\\\s*(?:[-:].*)?$\", Pattern.CASE_INSENSITIVE);\n\tprivate static final Pattern UNCHANGED_PATTERN = Pattern.compile(\"^\\\\s*unchanged\\\\s*(?:[-:].*)?$\", Pattern.CASE_INSENSITIVE);\n\tprivate static final Pattern SKIP_COMPARE_CONTENT_PATTERN = Pattern.compile(\"^\\\\s*skip[- ]?compare[- ]?contents?\\\\s*(?:[-:].*)?$\", Pattern.CASE_INSENSITIVE);\n\tprivate static final Pattern SKIP_IDEMPOTENT_PATTERN = Pattern.compile(\"^\\\\s*skip[- ]?idempotent\\\\s*(?:[-:].*)?$\", Pattern.CASE_INSENSITIVE);\n\tprivate static final Pattern ISSUE_REF_PATTERN = Pattern.compile(\"^\\\\s*issue #?\\\\d+(:?\\\\s+.*)?$\", Pattern.CASE_INSENSITIVE);\n\tprivate static final Pattern VERIFY_DIET_PATTERN = Pattern.compile(\"^\\\\s*eclipse:\\\\s*verify[- ]?diet\\\\s*(?:[-:].*)?$\", Pattern.CASE_INSENSITIVE);\n\t\n\tprivate LombokTestSource(File sourceFile, File messagesFile, String content, List<CompilerMessageMatcher> messages, List<String> directives) {\n\t\tthis.sourceFile = sourceFile;\n\t\tthis.messagesFile = messagesFile;\n\t\tthis.content = content;\n\t\tthis.messages = messages == null ? LombokImmutableList.<CompilerMessageMatcher>of() : LombokImmutableList.copyOf(messages);\n\t\t\n\t\tStringBuilder conf = new StringBuilder();\n\t\tint versionLower = 0;\n\t\tint versionUpper = Integer.MAX_VALUE;\n\t\tboolean ignore = false;\n\t\tboolean skipCompareContent = false;\n\t\tboolean skipIdempotent = false;\n\t\tboolean unchanged = false;\n\t\tboolean verifyDiet = false;\n\t\tString encoding = null;\n\t\tMap<String, String> formats = new HashMap<String, String>();\n\t\tString[] platformLimit = null;\n\t\t\n\t\tfor (String directive : directives) {\n\t\t\tdirective = directive.trim();\n\t\t\tString lc = directive.toLowerCase();\n\t\t\tif (IGNORE_PATTERN.matcher(directive).matches()) {\n\t\t\t\tignore = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tif (UNCHANGED_PATTERN.matcher(directive).matches()) {\n\t\t\t\tunchanged = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tif (SKIP_COMPARE_CONTENT_PATTERN.matcher(directive).matches()) {\n\t\t\t\tskipCompareContent = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tif (SKIP_IDEMPOTENT_PATTERN.matcher(directive).matches()) {\n\t\t\t\tskipIdempotent = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (ISSUE_REF_PATTERN.matcher(directive).matches()) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (VERIFY_DIET_PATTERN.matcher(directive).matches()) {\n\t\t\t\tverifyDiet = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tif (lc.startsWith(\"platform \")) {\n\t\t\t\tString platformDesc = lc.substring(\"platform \".length());\n\t\t\t\tint idx = platformDesc.indexOf(':');\n\t\t\t\tif (idx != -1) platformDesc = platformDesc.substring(0, idx).trim();\n\t\t\t\tplatformLimit = platformDesc.split(\"\\\\s*,\\\\s*\");\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tif (lc.startsWith(\"version \")) {\n\t\t\t\tint[] limits = parseVersionLimit(lc.substring(7).trim());\n\t\t\t\tif (limits == null) {\n\t\t\t\t\tAssert.fail(\"Directive line \\\"\" + directive + \"\\\" in '\" + sourceFile.getAbsolutePath() + \"' invalid: version must be followed by a single integer.\");\n\t\t\t\t\tthrow new RuntimeException();\n\t\t\t\t}\n\t\t\t\tversionLower = limits[0];\n\t\t\t\tversionUpper = limits[1];\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tif (lc.startsWith(\"conf:\")) {\n\t\t\t\tString confLine = directive.substring(5).trim();\n\t\t\t\tconf.append(confLine).append(\"\\n\");\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tif (lc.startsWith(\"encoding:\")) {\n\t\t\t\tencoding = directive.substring(9).trim();\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tif (lc.startsWith(\"format:\")) {\n\t\t\t\tString formatLine = directive.substring(7).trim();\n\t\t\t\tint idx = formatLine.indexOf('=');\n\t\t\t\tif (idx == -1) throw new IllegalArgumentException(\"To add a format directive, use: \\\"//FORMAT: javaLangAsFQN = skip\\\"\");\n\t\t\t\tString key = formatLine.substring(0, idx).trim();\n\t\t\t\tString value = formatLine.substring(idx + 1).trim();\n\t\t\t\tformats.put(key.toLowerCase(), value);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tif (lc.startsWith(\"issue \")) continue;\n\t\t\t\n\t\t\tAssert.fail(\"Directive line \\\"\" + directive + \"\\\" in '\" + sourceFile.getAbsolutePath() + \"' invalid: unrecognized directive.\");\n\t\t\tthrow new RuntimeException();\n\t\t}\n\t\tthis.specifiedEncoding = encoding;\n\t\tthis.versionLowerLimit = versionLower;\n\t\tthis.versionUpperLimit = versionUpper;\n\t\tthis.ignore = ignore;\n\t\tthis.skipCompareContent = skipCompareContent;\n\t\tthis.skipIdempotent = skipIdempotent;\n\t\tthis.unchanged = unchanged;\n\t\tthis.verifyDiet = verifyDiet;\n\t\tthis.platforms = platformLimit == null ? null : Arrays.asList(platformLimit);\n\t\t\n\t\tConfigurationProblemReporter reporter = new ConfigurationProblemReporter() {\n\t\t\t@Override public void report(String sourceDescription, String problem, int lineNumber, CharSequence line) {\n\t\t\t\tAssert.fail(\"Problem on directive line: \" + problem + \" at conf line #\" + lineNumber + \" (\" + line + \")\");\n\t\t\t}\n\t\t};\n\t\tfinal ConfigurationFile configurationFile = ConfigurationFile.fromCharSequence(sourceFile.getAbsoluteFile().getPath(), conf, ConfigurationFile.getLastModifiedOrMissing(sourceFile));\n\t\tfinal ConfigurationSource source = SingleConfigurationSource.parse(configurationFile, new ConfigurationParser(reporter));\n\t\tConfigurationFileToSource sourceFinder = new ConfigurationFileToSource() {\n\t\t\t@Override public ConfigurationSource parsed(ConfigurationFile fileLocation) {\n\t\t\t\treturn fileLocation.equals(configurationFile) ? source : null;\n\t\t\t}\n\t\t};\n\t\t\n\t\tthis.configuration = new BubblingConfigurationResolver(configurationFile, sourceFinder);\n\t\tthis.formatPreferences = Collections.unmodifiableMap(formats);\n\t}\n\t\n\tpublic static LombokTestSource readDirectives(File file) throws IOException {\n\t\tList<String> directives = new ArrayList<String>();\n\t\t\n\t\t{\n\t\t\tInputStream rawIn = new FileInputStream(file);\n\t\t\ttry {\n\t\t\t\tBufferedReader in = new BufferedReader(new InputStreamReader(rawIn, \"UTF-8\"));\n\t\t\t\ttry {\n\t\t\t\t\tfor (String i = in.readLine(); i != null; i = in.readLine()) {\n\t\t\t\t\t\tif (i.isEmpty()) continue;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (i.startsWith(\"//\")) {\n\t\t\t\t\t\t\tdirectives.add(i.substring(2));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfinally {\n\t\t\t\t\tin.close();\n\t\t\t\t}\n\t\t\t}\n\t\t\tfinally {\n\t\t\t\trawIn.close();\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn new LombokTestSource(file, null, \"\", null, directives);\n\t}\n\t\n\tpublic static LombokTestSource read(File sourceFolder, File messagesFolder, String fileName) throws IOException {\n\t\treturn read0(sourceFolder, messagesFolder, fileName, \"UTF-8\");\n\t}\n\t\n\tprivate static LombokTestSource read0(File sourceFolder, File messagesFolder, String fileName, String encoding) throws IOException {\n\t\tStringBuilder content = null;\n\t\tList<String> directives = new ArrayList<String>();\n\t\t\n\t\tFile sourceFile = new File(sourceFolder, fileName);\n\t\tif (sourceFile.exists()) {\n\t\t\tInputStream rawIn = new FileInputStream(sourceFile);\n\t\t\ttry {\n\t\t\t\tBufferedReader in = new BufferedReader(new InputStreamReader(rawIn, encoding));\n\t\t\t\ttry {\n\t\t\t\t\tfor (String i = in.readLine(); i != null; i = in.readLine()) {\n\t\t\t\t\t\tif (content != null) {\n\t\t\t\t\t\t\tcontent.append(i).append(\"\\n\");\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (i.isEmpty()) continue;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (i.startsWith(\"//\")) {\n\t\t\t\t\t\t\tdirectives.add(i.substring(2));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontent = new StringBuilder();\n\t\t\t\t\t\t\tcontent.append(i).append(\"\\n\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfinally {\n\t\t\t\t\tin.close();\n\t\t\t\t}\n\t\t\t}\n\t\t\tfinally {\n\t\t\t\trawIn.close();\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (content == null) content = new StringBuilder();\n\t\t\n\t\tList<CompilerMessageMatcher> messages = null;\n\t\tFile messagesFile = null;\n\t\tif (messagesFolder != null) {\n\t\t\tmessagesFile = new File(messagesFolder, fileName + \".messages\");\n\t\t\ttry {\n\t\t\t\tInputStream rawIn = new FileInputStream(messagesFile);\n\t\t\t\ttry {\n\t\t\t\t\tmessages = CompilerMessageMatcher.readAll(rawIn);\n\t\t\t\t}\n\t\t\t\tfinally {\n\t\t\t\t\trawIn.close();\n\t\t\t\t}\n\t\t\t} catch (FileNotFoundException e) {\n\t\t\t\tmessages = null;\n\t\t\t\tmessagesFile = null;\n\t\t\t}\n\t\t}\n\t\t\n\t\tLombokTestSource source = new LombokTestSource(sourceFile, messagesFile, content.toString(), messages, directives);\n\t\tString specifiedEncoding = source.getSpecifiedEncoding();\n\t\t\n\t\t// The source file has an 'encoding' header to test encoding issues. Of course, reading the encoding header\n\t\t// requires knowing the encoding of the file first. In practice we get away with it, because UTF-8 and US-ASCII are compatible enough.\n\t\t// The fix is therefore to read in as UTF-8 initially, and if the file requests that it should be read as another encoding, toss it all\n\t\t// and reread that way.\n\t\t\n\t\tif (specifiedEncoding == null || specifiedEncoding.equalsIgnoreCase(encoding)) return source;\n\t\treturn read0(sourceFolder, messagesFolder, fileName, specifiedEncoding);\n\t}\n\t\n\tpublic int minVersion() {\n\t\treturn Math.max(6, versionLowerLimit);\n\t}\n\t\n\tpublic int maxVersion() {\n\t\treturn versionUpperLimit;\n\t}\n}\n"
  },
  {
    "path": "test/core/src/lombok/RunTestsViaDelombok.java",
    "content": "/*\n * Copyright (C) 2009-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport static org.junit.Assert.fail;\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.File;\nimport java.io.PrintStream;\nimport java.io.StringWriter;\nimport java.io.UnsupportedEncodingException;\nimport java.util.ArrayDeque;\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.Deque;\nimport java.util.HashMap;\nimport java.util.IdentityHashMap;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.Stack;\n\nimport javax.annotation.processing.AbstractProcessor;\nimport javax.annotation.processing.ProcessingEnvironment;\nimport javax.annotation.processing.RoundEnvironment;\nimport javax.lang.model.SourceVersion;\nimport javax.lang.model.element.Element;\nimport javax.lang.model.element.TypeElement;\n\nimport com.sun.source.util.TreePath;\nimport com.sun.source.util.Trees;\nimport com.sun.tools.javac.code.Flags;\nimport com.sun.tools.javac.code.Symbol;\nimport com.sun.tools.javac.tree.JCTree;\nimport com.sun.tools.javac.tree.JCTree.JCAnnotation;\nimport com.sun.tools.javac.tree.JCTree.JCAssign;\nimport com.sun.tools.javac.tree.JCTree.JCClassDecl;\nimport com.sun.tools.javac.tree.JCTree.JCCompilationUnit;\nimport com.sun.tools.javac.tree.JCTree.JCIdent;\nimport com.sun.tools.javac.tree.JCTree.JCMethodDecl;\nimport com.sun.tools.javac.tree.JCTree.JCModifiers;\nimport com.sun.tools.javac.tree.JCTree.JCPrimitiveTypeTree;\nimport com.sun.tools.javac.tree.JCTree.JCVariableDecl;\nimport com.sun.tools.javac.tree.JCTree.TypeBoundKind;\nimport com.sun.tools.javac.tree.TreeScanner;\n\nimport lombok.delombok.Delombok;\nimport lombok.javac.CapturingDiagnosticListener;\nimport lombok.javac.Javac;\n\npublic class RunTestsViaDelombok extends AbstractRunTests {\n\tprivate Delombok delombok = new Delombok();\n\t\n\t@Override\n\tpublic TransformationResult transformCode(final File file, TestParameters parameters) throws Throwable {\n\t\tTransformationResult result = new TransformationResult();\n\t\tdelombok.setVerbose(true);\n\t\tChangedChecker cc = new ChangedChecker();\n\t\tdelombok.setFeedback(cc.feedback);\n\t\tdelombok.setForceProcess(true);\n\t\tdelombok.setCharset(parameters.getEncoding() == null ? \"UTF-8\" : parameters.getEncoding());\n\t\tdelombok.setFormatPreferences(parameters.getFormatPreferences());\n\t\t\n\t\tdelombok.setDiagnosticsListener(new CapturingDiagnosticListener(file, result.getMessages()));\n\t\t\n\t\tif (parameters.isCheckPositions()) {\n\t\t\tNodePositionMapper nodePositionMapper = new NodePositionMapper();\n\t\t\tdelombok.addPreLombokProcessors(nodePositionMapper);\n\t\t\tdelombok.addAdditionalAnnotationProcessor(new ValidatePositionProcessor(parameters.getMinVersion(), nodePositionMapper));\n\t\t}\n\t\tdelombok.addAdditionalAnnotationProcessor(new ValidateTypesProcessor());\n\t\tdelombok.addAdditionalAnnotationProcessor(new ValidateNoDuplicateTreeNodeProcessor());\n\t\t\n\t\tdelombok.addFile(file.getAbsoluteFile().getParentFile(), file.getName());\n\t\tdelombok.setSourcepath(file.getAbsoluteFile().getParent());\n\t\tString bcp = System.getProperty(\"delombok.bootclasspath\");\n\t\tif (bcp != null) delombok.setBootclasspath(bcp);\n\t\tStringWriter sw = new StringWriter();\n\t\tdelombok.setWriter(sw);\n\t\tLocale originalLocale = Locale.getDefault();\n\t\ttry {\n\t\t\tLocale.setDefault(Locale.ENGLISH);\n\t\t\tdelombok.delombok();\n\t\t\tresult.setOutput(sw.toString());\n\t\t\tresult.setChanged(cc.isChanged());\n\t\t\treturn result;\n\t\t} finally {\n\t\t\tLocale.setDefault(originalLocale);\n\t\t}\n\t}\n\t\n\tpublic static class NodePositionMapper extends TreeProcessor {\n\t\tMap<JCTree, Integer> nodePositions = new HashMap<JCTree, Integer>();\n\t\t\n\t\t@Override void processCompilationUnit(final JCCompilationUnit unit) {\n\t\t\tunit.accept(new TreeScanner() {\n\t\t\t\t@Override public void scan(JCTree tree) {\n\t\t\t\t\tif (tree == null) return;\n\t\t\t\t\tif (tree instanceof JCMethodDecl && (((JCMethodDecl) tree).mods.flags & Flags.GENERATEDCONSTR) != 0) return;\n\t\t\t\t\tif (tree.pos >= 0) {\n\t\t\t\t\t\tnodePositions.put(tree, tree.pos);\n\t\t\t\t\t}\n\t\t\t\t\tsuper.scan(tree);\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t\n\t}\n\t\n\tpublic static class ValidatePositionProcessor extends TreeProcessor {\n\t\tprivate final int version;\n\t\tprivate final NodePositionMapper nodePositionMapper;\n\t\t\n\t\tpublic ValidatePositionProcessor(int version, NodePositionMapper nodePositionMapper) {\n\t\t\tthis.version = version;\n\t\t\tthis.nodePositionMapper = nodePositionMapper;\n\t\t}\n\t\t\n\t\tprivate String craftFailMsg(String problematicNode, Deque<JCTree> astContext) {\n\t\t\tStringBuilder msg = new StringBuilder(problematicNode);\n\t\t\tfor (JCTree t : astContext) {\n\t\t\t\tmsg.append(\"\\n  \").append(t.getClass().getSimpleName());\n\t\t\t\tString asStr = t.toString();\n\t\t\t\tif (asStr.length() < 80) msg.append(\": \").append(asStr);\n\t\t\t\telse if (t instanceof JCClassDecl) msg.append(\": \").append(((JCClassDecl) t).name);\n\t\t\t\telse if (t instanceof JCMethodDecl) msg.append(\": \").append(((JCMethodDecl) t).name);\n\t\t\t\telse if (t instanceof JCVariableDecl) msg.append(\": \").append(((JCVariableDecl) t).name);\n\t\t\t}\n\t\t\treturn msg.append(\"\\n-------\").toString();\n\t\t}\n\t\t\n\t\t@Override void processCompilationUnit(final JCCompilationUnit unit) {\n\t\t\tfinal Deque<JCTree> astContext = new ArrayDeque<JCTree>();\n\t\t\tunit.accept(new TreeScanner() {\n\t\t\t\t@Override public void scan(JCTree tree) {\n\t\t\t\t\tif (tree == null) return;\n\t\t\t\t\tif (tree instanceof JCMethodDecl && (((JCMethodDecl) tree).mods.flags & Flags.GENERATEDCONSTR) != 0) return;\n\t\t\t\t\tastContext.push(tree);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (tree instanceof JCModifiers) return;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (!Javac.validateDocComment(unit, tree)) {\n\t\t\t\t\t\t\tfail(\"Start position of doc comment (\" + Javac.getDocComment(unit, tree) + \") of \" + tree + \" not set\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tboolean check = true;\n\t\t\t\t\t\tif (version < 8 && tree instanceof TypeBoundKind) {\n\t\t\t\t\t\t\t// TypeBoundKind works differently in java6, and as a consequence,\n\t\t\t\t\t\t\t// the position is not set properly.\n\t\t\t\t\t\t\t// Given status of j6/j7, not worth properly testing.\n\t\t\t\t\t\t\tcheck = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (version < 8 && tree instanceof JCIdent) {\n\t\t\t\t\t\t\t// explicit `super()` invocations do not appear to have end pos in j6/7.\n\t\t\t\t\t\t\tif (\"super\".equals(\"\" + ((JCIdent) tree).name)) check = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (tree instanceof JCVariableDecl && (((JCVariableDecl) tree).mods.flags & Javac.GENERATED_MEMBER) != 0) return;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (check && tree.pos == -1) fail(craftFailMsg(\"Start position of node not set: \", astContext));\n\t\t\t\t\t\t\n\t\t\t\t\t\tInteger expectedPos = nodePositionMapper.nodePositions.get(tree);\n\t\t\t\t\t\tif (expectedPos != null && !expectedPos.equals(tree.pos)) {\n\t\t\t\t\t\t\tfail(craftFailMsg(String.format(\"Expected node position %d, actual node position %d: \", expectedPos, tree.pos), astContext));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (check && Javac.getEndPosition(tree, unit) == -1) {\n\t\t\t\t\t\t\tfail(craftFailMsg(\"End position of node not set: \", astContext));\n\t\t\t\t\t\t}\n\t\t\t\t\t} finally {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tsuper.scan(tree);\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tastContext.pop();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t@Override public void visitMethodDef(JCMethodDecl tree) {\n\t\t\t\t\tsuper.visitMethodDef(tree);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t@Override public void visitVarDef(JCVariableDecl tree) {\n\t\t\t\t\tif ((tree.mods.flags & Flags.ENUM) != 0) return;\n\t\t\t\t\tsuper.visitVarDef(tree);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t@Override public void visitAnnotation(JCAnnotation tree) {\n\t\t\t\t\tscan(tree.annotationType);\n\t\t\t\t\t// Javac parser maps @Annotation(\"val\") to @Annotation(value = \"val\") but does not add an end position for the new JCIdent...\n\t\t\t\t\tif (tree.args.length() == 1 && tree.args.head instanceof JCAssign && ((JCIdent)((JCAssign) tree.args.head).lhs).name.toString().equals(\"value\")) {\n\t\t\t\t\t\tscan(((JCAssign) tree.args.head).rhs);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tscan(tree.args);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\t\n\tpublic static class ValidateTypesProcessor extends TreeProcessor {\n\t\t@Override void processCompilationUnit(final JCCompilationUnit unit) {\n\t\t\tfinal Stack<JCTree> parents = new Stack<JCTree>();\n\t\t\tparents.add(unit);\n\t\t\t\n\t\t\tunit.accept(new TreeScanner() {\n\t\t\t\tprivate JCTree parent;\n\t\t\t\t@Override public void scan(JCTree tree) {\n\t\t\t\t\tparent = parents.peek();\n\t\t\t\t\t\n\t\t\t\t\tparents.push(tree);\n\t\t\t\t\tsuper.scan(tree);\n\t\t\t\t\tparents.pop();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t@Override public void visitClassDef(JCClassDecl tree) {\n\t\t\t\t\t// Skip anonymous or local classes, they have no symbol\n\t\t\t\t\tif (!(parent instanceof JCClassDecl || parent instanceof JCCompilationUnit)) return;\n\t\t\t\t\t\n\t\t\t\t\tvalidateSymbol(tree, tree.sym);\n\t\t\t\t\tsuper.visitClassDef(tree);\n\t\t\t\t};\n\n\t\t\t\t@Override public void visitMethodDef(JCMethodDecl tree) {\n\t\t\t\t\tvalidateSymbol(tree, tree.sym);\n\t\t\t\t\tsuper.visitMethodDef(tree);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t@Override public void visitVarDef(JCVariableDecl tree) {\n\t\t\t\t\t// Skip local variables\n\t\t\t\t\tif (!(parent instanceof JCClassDecl || parent instanceof JCMethodDecl)) return;\n\t\t\t\t\t\n\t\t\t\t\tvalidateSymbol(tree, tree.sym);\n\t\t\t\t\tsuper.visitVarDef(tree);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tprivate void validateSymbol(JCTree tree, Symbol sym) {\n\t\t\t\t\tif (sym == null) {\n\t\t\t\t\t\tfail(\"Missing symbol for \" + tree);\n\t\t\t\t\t}\n\t\t\t\t\t// Only classes have enclosed elements, skip everything else\n\t\t\t\t\tif (!sym.owner.getKind().isClass()) return;\n\t\t\t\t\t\n\t\t\t\t\tif (!sym.owner.getEnclosedElements().contains(sym)) {\n\t\t\t\t\t\tfail(tree + \" not added to parent\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\t\n\tpublic static class ValidateNoDuplicateTreeNodeProcessor extends TreeProcessor {\n\n\t\tprivate String craftFailMsg(Collection<JCTree> astContext) {\n\t\t\tStringBuilder msg = new StringBuilder();\n\t\t\tfor (JCTree t : astContext) {\n\t\t\t\tmsg.append(\"\\n  \").append(t.getClass().getSimpleName());\n\t\t\t\tString asStr = t.toString();\n\t\t\t\tif (asStr.length() < 80) msg.append(\": \").append(asStr);\n\t\t\t\telse if (t instanceof JCClassDecl) msg.append(\": \").append(((JCClassDecl) t).name);\n\t\t\t\telse if (t instanceof JCMethodDecl) msg.append(\": \").append(((JCMethodDecl) t).name);\n\t\t\t\telse if (t instanceof JCVariableDecl) msg.append(\": \").append(((JCVariableDecl) t).name);\n\t\t\t}\n\t\t\treturn msg.append(\"\\n-------\").toString();\n\t\t}\n\t\t\n\t\t@Override\n\t\tvoid processCompilationUnit(JCCompilationUnit unit) {\n\t\t\tfinal Deque<JCTree> parents = new ArrayDeque<JCTree>();\n\t\t\tparents.add(unit);\n\t\t\t\n\t\t\tfinal Map<JCTree, List<JCTree>> knownTreeNode = new IdentityHashMap<JCTree, List<JCTree>>();\n\t\t\t\n\t\t\tunit.accept(new TreeScanner() {\n\t\t\t\tprivate JCTree parent;\n\t\t\t\t\n\t\t\t\t@Override\n\t\t\t\tpublic void scan(JCTree tree) {\n\t\t\t\t\tparent = parents.peek();\n\t\t\t\t\t\n\t\t\t\t\tif (tree == null) return;\n\t\t\t\t\tif (tree instanceof JCPrimitiveTypeTree) return;\n\t\t\t\t\t// javac generates duplicates for record members\n\t\t\t\t\tif (tree instanceof JCVariableDecl && (((JCVariableDecl) tree).mods.flags & Javac.GENERATED_MEMBER) != 0) return;\n\t\t\t\t\t\n\t\t\t\t\tList<JCTree> knownNodeContext = knownTreeNode.put(tree, new ArrayList<JCTree>(parents));\n\t\t\t\t\tif (knownNodeContext != null) {\n\t\t\t\t\t\t// javac generates two JCVariableDecl elements for 'int a, b;'\n\t\t\t\t\t\tif (parent instanceof JCVariableDecl) {\n\t\t\t\t\t\t\tif (tree instanceof JCModifiers) return;\n\t\t\t\t\t\t\tif (tree instanceof JCIdent) return;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tfail(\"Node \" + tree + \" found twice:\" + craftFailMsg(knownNodeContext) + craftFailMsg(parents));\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tparents.push(tree);\n\t\t\t\t\tsuper.scan(tree);\n\t\t\t\t\tparents.pop();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t\n\t}\n\t\n\tpublic static abstract class TreeProcessor extends AbstractProcessor {\n\t\tprivate Trees trees;\n\t\t@Override public synchronized void init(ProcessingEnvironment processingEnv) {\n\t\t\tsuper.init(processingEnv);\n\t\t\ttrees = Trees.instance(processingEnv);\n\t\t}\n\t\t\n\t\t@Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {\n\t\t\tfor (Element element : roundEnv.getRootElements()) {\n\t\t\t\tJCCompilationUnit unit = toUnit(element);\n\t\t\t\tif (unit != null) {\n\t\t\t\t\tprocessCompilationUnit(unit);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tabstract void processCompilationUnit(JCCompilationUnit unit);\n\t\t\n\t\t@Override public Set<String> getSupportedAnnotationTypes() {\n\t\t\treturn Collections.singleton(\"*\");\n\t\t}\n\t\t\n\t\t@Override public SourceVersion getSupportedSourceVersion() {\n\t\t\treturn SourceVersion.latest();\n\t\t}\n\t\t\n\t\tprivate JCCompilationUnit toUnit(Element element) {\n\t\t\tTreePath path = null;\n\t\t\tif (trees != null) {\n\t\t\t\ttry {\n\t\t\t\t\tpath = trees.getPath(element);\n\t\t\t\t} catch (NullPointerException ignore) {\n\t\t\t\t\t// Happens if a package-info.java doesn't contain a package declaration.\n\t\t\t\t\t// https://github.com/projectlombok/lombok/issues/2184\n\t\t\t\t\t// We can safely ignore those, since they do not need any processing\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (path == null) return null;\n\t\t\t\n\t\t\treturn (JCCompilationUnit) path.getCompilationUnit();\n\t\t}\n\t}\n\n\tstatic class ChangedChecker {\n\t\tprivate final ByteArrayOutputStream bytes = new ByteArrayOutputStream();\n\t\tprivate final PrintStream feedback;\n\t\t\n\t\tChangedChecker() throws UnsupportedEncodingException {\n\t\t\tfeedback = new PrintStream(bytes, true, \"UTF-8\");\n\t\t}\n\t\t\n\t\tboolean isChanged() throws UnsupportedEncodingException {\n\t\t\tfeedback.flush();\n\t\t\treturn bytes.toString(\"UTF-8\").endsWith(\"[delomboked]\\n\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/core/src/lombok/RunTestsViaEcj.java",
    "content": "/*\n * Copyright (C) 2010-2025 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport java.io.File;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.Map;\nimport java.util.concurrent.atomic.AtomicReference;\n\nimport org.eclipse.core.internal.registry.ExtensionRegistry;\nimport org.eclipse.core.internal.runtime.Activator;\nimport org.eclipse.core.internal.runtime.PlatformActivator;\nimport org.eclipse.core.resources.ResourcesPlugin;\nimport org.eclipse.core.runtime.IExtensionRegistry;\nimport org.eclipse.core.runtime.RegistryFactory;\nimport org.eclipse.core.runtime.adaptor.EclipseStarter;\nimport org.eclipse.core.runtime.spi.IRegistryProvider;\nimport org.eclipse.jdt.core.JavaCore;\nimport org.eclipse.jdt.core.compiler.CategorizedProblem;\nimport org.eclipse.jdt.core.compiler.CharOperation;\nimport org.eclipse.jdt.core.dom.AST;\nimport org.eclipse.jdt.core.dom.CompilationUnit;\nimport org.eclipse.jdt.internal.compiler.CompilationResult;\nimport org.eclipse.jdt.internal.compiler.Compiler;\nimport org.eclipse.jdt.internal.compiler.ICompilerRequestor;\nimport org.eclipse.jdt.internal.compiler.IErrorHandlingPolicy;\nimport org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;\nimport org.eclipse.jdt.internal.compiler.batch.FileSystem;\nimport org.eclipse.jdt.internal.compiler.env.ICompilationUnit;\nimport org.eclipse.jdt.internal.compiler.impl.CompilerOptions;\nimport org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory;\nimport org.eclipse.jdt.internal.core.DefaultWorkingCopyOwner;\nimport org.eclipse.jdt.internal.core.JavaModelManager;\nimport org.osgi.framework.Bundle;\nimport org.osgi.framework.BundleContext;\n\nimport lombok.eclipse.Eclipse;\nimport lombok.javac.CapturingDiagnosticListener.CompilerMessage;\n\npublic class RunTestsViaEcj extends AbstractRunTests {\n\tprotected CompilerOptions ecjCompilerOptions(TestParameters parameters) {\n\t\tCompilerOptions options = new CompilerOptions();\n\t\tMap<String, String> warnings = new HashMap<String, String>();\n\t\t\n\t\tlong ecjCompilerVersionConstant = Eclipse.getLatestEcjCompilerVersionConstant();\n\t\tlong ecjCompilerVersion = Eclipse.getEcjCompilerVersion();\n\t\tif (parameters.getSourceVersion() != null) {\n\t\t\tecjCompilerVersionConstant = (parameters.getSourceVersion() + 44) << 16;\n\t\t\tecjCompilerVersion = parameters.getSourceVersion();\n\t\t} else {\n\t\t\t// Preview features are only allowed if the maximum compiler version is equal to the source version\n\t\t\twarnings.put(\"org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures\", \"enabled\");\n\t\t}\n\t\toptions.complianceLevel = ecjCompilerVersionConstant;\n\t\toptions.sourceLevel = ecjCompilerVersionConstant;\n\t\toptions.targetJDK = ecjCompilerVersionConstant;\n\t\toptions.docCommentSupport = false;\n\t\toptions.parseLiteralExpressionsAsConstants = true;\n\t\toptions.reportUnusedDeclaredThrownExceptionExemptExceptionAndThrowable = false;\n\t\toptions.reportUnusedDeclaredThrownExceptionIncludeDocCommentReference = false;\n\t\toptions.reportUnusedDeclaredThrownExceptionWhenOverriding = false;\n\t\toptions.reportUnusedParameterIncludeDocCommentReference = false;\n\t\toptions.reportUnusedParameterWhenImplementingAbstract = false;\n\t\toptions.reportUnusedParameterWhenOverridingConcrete = false;\n\t\toptions.reportDeadCodeInTrivialIfStatement = false;\n\t\toptions.generateClassFiles = false;\n\t\twarnings.put(CompilerOptions.OPTION_ReportUnusedLocal, \"ignore\");\n\t\twarnings.put(CompilerOptions.OPTION_ReportUnusedLabel, \"ignore\");\n\t\twarnings.put(CompilerOptions.OPTION_ReportUnusedImport, \"ignore\");\n\t\twarnings.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, \"ignore\");\n\t\twarnings.put(CompilerOptions.OPTION_ReportIndirectStaticAccess, \"warning\");\n\t\twarnings.put(CompilerOptions.OPTION_ReportNonStaticAccessToStatic, \"warning\");\n\t\twarnings.put(\"org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures\", \"ignore\");\n\t\twarnings.put(CompilerOptions.OPTION_Source, (ecjCompilerVersion < 9 ? \"1.\" : \"\") + ecjCompilerVersion);\n\t\twarnings.put(CompilerOptions.OPTION_TargetPlatform, (ecjCompilerVersion < 9 ? \"1.\" : \"\") + ecjCompilerVersion);\n\t\twarnings.put(\"org.eclipse.jdt.core.compiler.codegen.useStringConcatFactory\", \"disabled\");\n\t\toptions.set(warnings);\n\t\treturn options;\n\t}\n\t\n\tprotected IErrorHandlingPolicy ecjErrorHandlingPolicy() {\n\t\treturn new IErrorHandlingPolicy() {\n\t\t\tpublic boolean stopOnFirstError() {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\tpublic boolean proceedOnErrors() {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\t@SuppressWarnings(\"all\") // Added to the interface in later ecj version.\n\t\t\tpublic boolean ignoreAllErrors() {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t};\n\t}\n\t\n\tprivate ICompilationUnit getSourceUnit(File file, String source) {\n\t\tif (eclipseAvailable()) return new TestCompilationUnitEclipse(file.getName(), source);\n\t\treturn new TestCompilationUnitEcj(file.getName(), source);\n\t}\n\t\n\t@Override\n\tpublic TransformationResult transformCode(File file, final TestParameters parameters) throws Throwable {\n\t\tfinal TransformationResult result = new TransformationResult();\n\t\tfinal AtomicReference<CompilationResult> compilationResult_ = new AtomicReference<CompilationResult>();\n\t\tfinal AtomicReference<CompilationUnitDeclaration> compilationUnit_ = new AtomicReference<CompilationUnitDeclaration>();\n\t\tICompilerRequestor bitbucketRequestor = new ICompilerRequestor() {\n\t\t\t@Override public void acceptResult(CompilationResult result) {\n\t\t\t\tcompilationResult_.set(result);\n\t\t\t}\n\t\t};\n\t\t\n\t\tString source = readFile(file);\n\t\tchar[] sourceArray = source.toCharArray();\n\t\tfinal ICompilationUnit sourceUnit;\n\t\ttry {\n\t\t\tsourceUnit = getSourceUnit(file, source);\n\t\t} catch (Throwable t) {\n\t\t\tt.printStackTrace();\n\t\t\tresult.setChanged(false);\n\t\t\treturn result;\n\t\t}\n\t\t\n\t\tCompiler ecjCompiler = new Compiler(createFileSystem(file), ecjErrorHandlingPolicy(), ecjCompilerOptions(parameters), bitbucketRequestor, new DefaultProblemFactory(Locale.ENGLISH)) {\n\t\t\t@Override protected synchronized void addCompilationUnit(ICompilationUnit inUnit, CompilationUnitDeclaration parsedUnit) {\n\t\t\t\tif (inUnit == sourceUnit) {\n\t\t\t\t\tcompilationUnit_.set(parsedUnit);\n\t\t\t\t\tif (parameters.isVerifyDiet()) {\n\t\t\t\t\t\tresult.setOutput(parsedUnit.toString());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsuper.addCompilationUnit(inUnit, parsedUnit);\n\t\t\t}\n\t\t};\n\t\t\n\t\t// initializeEclipseBundles();\n\t\t\n\t\tecjCompiler.compile(new ICompilationUnit[] {sourceUnit});\n\t\t\n\t\tCompilationResult compilationResult = compilationResult_.get();\n\t\tCategorizedProblem[] problems = compilationResult.getAllProblems();\n\t\t\n\t\tif (problems != null) for (CategorizedProblem p : problems) {\n\t\t\tresult.addMessage(new CompilerMessage(p.getSourceLineNumber(), p.getSourceStart(), p.isError(), p.getMessage()));\n\t\t}\n\t\t\n\t\tCompilationUnitDeclaration cud = compilationUnit_.get();\n\t\t\n\t\tif (cud == null) {\n\t\t\tresult.setOutput(\"---- No CompilationUnit provided by ecj ----\");\n\t\t} else {\n\t\t\tif (!parameters.isVerifyDiet()) {\n\t\t\t\tString output = cud.toString();\n\t\t\t\t// starting somewhere around ecj16, the print code is a bit too cavalier with printing modifiers.\n\t\t\t\toutput = output.replace(\"non-sealed @val\", \"@val\");\n\t\t\t\tresult.setOutput(output);\n\t\t\t}\n\t\t\t\n\t\t\tif (eclipseAvailable()) {\n\t\t\t\tEclipseDomConversion.toDomAst(cud, sourceArray);\n\t\t\t}\n\t\t}\n\t\t\n\t\tresult.setChanged(true);\n\t\treturn result;\n\t}\n\t\n\t@SuppressWarnings(\"unused\")\n\tprivate static class EclipseInitializer {\n\t\tstatic void initializeEclipseBundles() throws Exception {\n\t\t\t// This code does not work yet, it's research-in-progress.\n\t\t\t// The problem is that parts of the eclipse handler (in `PatchValEclipse` and friends) do not work unless\n\t\t\t// an actual eclipse exists; PatchVal causes code to run that will end up running `ResourcesPlugin.getWorkspace()`, which\n\t\t\t// goes down a rabbit hole of pinging off of various static fields (or `getX()` calls which return static fields), all\n\t\t\t// of which are `null` until the plugin they belong to is properly initialized.\n\t\t\t// This code is work in progress to 'hack' the initialization of each plugin one-by-one, but I doubt this is the right\n\t\t\t// way to do it, as I bet it's fragile (will break when eclipse updates rather easily), and who knows how many fields\n\t\t\t// and things need to be initialized.\n\t\t\t// A better plan would be to start an actual, real eclipse, by telling `EclipseStarter.startup` to launch some sort of\n\t\t\t// application (or at least a bunch of bundles/products/apps, including the JDT). This will then take long enough that\n\t\t\t// it'll need to be cached and re-used for each test or the Eclipse test run would take far too long.\n\t\t\t\n\t\t\tBundleContext context = EclipseStarter.startup(new String[0], null);\n\t\t\tRegistryFactory.setDefaultRegistryProvider(new IRegistryProvider() {\n\t\t\t\tprivate final ExtensionRegistry REG = new ExtensionRegistry(null, null, null);\n\t\t\t\t@Override public IExtensionRegistry getRegistry() {\n\t\t\t\t\treturn REG;\n\t\t\t\t}\n\t\t\t});\n\t\t\tnew Activator().start(context);\n\t\t\tnew PlatformActivator().start(context);\n\t\t\tfor (Bundle b : context.getBundles()) System.out.println(\"BUNDLE: \" + b.getSymbolicName());\n\t\t\tnew ResourcesPlugin().start(context);\n\t\t\tJavaModelManager.getJavaModelManager().startup();\n\t\t}\n\t}\n\t\n\tstatic boolean eclipseAvailable() {\n\t\ttry {\n\t\t\tClass.forName(\"org.eclipse.jdt.core.dom.CompilationUnit\");\n\t\t} catch (Throwable t) {\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\tprivate static final String bootRuntimePath = System.getProperty(\"delombok.bootclasspath\");\n\t\n\tprivate static class EclipseDomConversion {\n\t\tstatic CompilationUnit toDomAst(CompilationUnitDeclaration cud, final char[] source) {\n\t\t\tMap<String, String> options = new HashMap<String, String>();\n\t\t\toptions.put(JavaCore.COMPILER_SOURCE, \"11\");\n\t\t\toptions.put(\"org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures\", \"enabled\");\n\t\t\t\n\t\t\torg.eclipse.jdt.internal.core.CompilationUnit ccu = new org.eclipse.jdt.internal.core.CompilationUnit(null, null, null) {\n\t\t\t\t@Override public char[] getContents() {\n\t\t\t\t\treturn source;\n\t\t\t\t}\n\t\t\t};\n\t\t\treturn AST.convertCompilationUnit(8, cud, options, false, ccu, 0, null);\n\t\t}\n\t}\n\t\n\tprivate FileSystem createFileSystem(File file) {\n\t\tList<String> classpath = new ArrayList<String>();\n\t\tif (new File(\"bin/main\").exists()) classpath.add(\"bin/main\");\n\t\tclasspath.add(\"dist/lombok.jar\");\n\t\tclasspath.add(\"build/teststubs\");\n\t\tif (bootRuntimePath == null || bootRuntimePath.isEmpty()) throw new IllegalStateException(\"System property delombok.bootclasspath is not set; set it to the rt of java6 or java8\");\n\t\tclasspath.add(bootRuntimePath);\n\t\tfor (File f : new File(\"lib/test\").listFiles()) {\n\t\t\tString fn = f.getName();\n\t\t\tif (fn.length() < 4) continue;\n\t\t\tif (!fn.substring(fn.length() - 4).toLowerCase().equals(\".jar\")) continue;\n\t\t\tclasspath.add(\"lib/test/\" + fn);\n\t\t}\n\t\tfor (Iterator<String> i = classpath.iterator(); i.hasNext();) {\n\t\t\tif (FileSystem.getClasspath(i.next(), \"UTF-8\", null) == null) {\n\t\t\t\ti.remove();\n\t\t\t}\n\t\t}\n\t\treturn new FileSystem(classpath.toArray(new String[0]), new String[] {file.getAbsolutePath()}, \"UTF-8\");\n\t}\n\t\n\tprivate static final class TestCompilationUnitEcj implements ICompilationUnit {\n\t\tprivate final char[] name, source, mainTypeName;\n\t\t\n\t\tTestCompilationUnitEcj(String name, String source) {\n\t\t\tthis.source = source.toCharArray();\n\t\t\tthis.name = name.toCharArray();\n\t\t\t\n\t\t\tchar[] fileNameCharArray = getFileName();\n\t\t\tint start = CharOperation.lastIndexOf(File.separatorChar, fileNameCharArray) + 1;\n\t\t\tint end = CharOperation.lastIndexOf('.', fileNameCharArray);\n\t\t\tif (end == -1) {\n\t\t\t\tend = fileNameCharArray.length;\n\t\t\t}\n\t\t\tmainTypeName = CharOperation.subarray(fileNameCharArray, start, end);\n\t\t}\n\t\t\n\t\t@Override public char[] getFileName() {\n\t\t\treturn name;\n\t\t}\n\t\t\n\t\t@Override public char[] getContents() {\n\t\t\treturn source;\n\t\t}\n\t\t\n\t\t@Override public char[] getMainTypeName() {\n\t\t\treturn mainTypeName;\n\t\t}\n\t\t\n\t\t@Override public char[][] getPackageName() {\n\t\t\treturn null;\n\t\t}\n\n\t\t@Override public boolean ignoreOptionalProblems() {\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\tprivate static final class TestCompilationUnitEclipse extends org.eclipse.jdt.internal.core.CompilationUnit {\n\t\tprivate final char[] source;\n\t\tprivate final char[] mainTypeName;\n\t\t\n\t\tprivate TestCompilationUnitEclipse(String name, String source) {\n\t\t\tsuper(null, name, DefaultWorkingCopyOwner.PRIMARY);\n\t\t\tthis.source = source.toCharArray();\n\t\t\t\n\t\t\tchar[] fileNameCharArray = getFileName();\n\t\t\tint start = CharOperation.lastIndexOf(File.separatorChar, fileNameCharArray) + 1;\n\t\t\tint end = CharOperation.lastIndexOf('.', fileNameCharArray);\n\t\t\tif (end == -1) {\n\t\t\t\tend = fileNameCharArray.length;\n\t\t\t}\n\t\t\tmainTypeName = CharOperation.subarray(fileNameCharArray, start, end);\n\t\t}\n\t\t\n\t\t@Override public char[] getContents() {\n\t\t\treturn source;\n\t\t}\n\t\t\n\t\t@Override public char[] getMainTypeName() {\n\t\t\treturn mainTypeName;\n\t\t}\n\t\t\n\t\t@Override public boolean ignoreOptionalProblems() {\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\t@Override public char[][] getPackageName() {\n\t\t\treturn null;\n\t\t}\n\t\t\n\t\tpublic char[] getModuleName() {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/core/src/lombok/TestBase.java",
    "content": "/*\n * Copyright (C) 2011-2020 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport org.junit.runner.RunWith;\nimport org.junit.runners.Suite;\nimport org.junit.runners.Suite.SuiteClasses;\n\n@RunWith(Suite.class)\n@SuiteClasses({lombok.core.configuration.RunConfigurationTests.class, lombok.core.RunCoreTests.class})\npublic class TestBase {\n}\n"
  },
  {
    "path": "test/core/src/lombok/TestEclipse.java",
    "content": "/*\n * Copyright (C) 2011-2020 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport org.junit.runner.RunWith;\nimport org.junit.runners.Suite;\nimport org.junit.runners.Suite.SuiteClasses;\n\n@RunWith(Suite.class)\n@SuiteClasses({lombok.transform.TestWithEcj.class})\npublic class TestEclipse {\n}\n"
  },
  {
    "path": "test/core/src/lombok/TestJavac.java",
    "content": "/*\n * Copyright (C) 2011-2020 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport org.junit.runner.RunWith;\nimport org.junit.runners.Suite;\nimport org.junit.runners.Suite.SuiteClasses;\n\n@RunWith(Suite.class)\n@SuiteClasses({lombok.bytecode.RunBytecodeTests.class, lombok.transform.TestLombokFilesIdempotent.class, lombok.transform.TestSourceFiles.class, lombok.transform.TestWithDelombok.class})\npublic class TestJavac {\n}\n"
  },
  {
    "path": "test/core/src/lombok/TestParameters.java",
    "content": "/*\n * Copyright (C) 2024 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport java.util.Map;\n\npublic class TestParameters {\n\tprivate Long sourceVersion;\n\tprivate Long targetVersion;\n\t\n\t// Javac only\n\tprivate Integer minVersion;\n\tprivate String encoding;\n\tprivate Map<String, String> formatPreferences;\n\tprivate boolean checkPositions;\n\t\n\t// Eclipse/Ecj only\n\tprivate boolean verifyDiet;\n\t\n\tpublic Long getSourceVersion() {\n\t\treturn sourceVersion;\n\t}\n\t\n\tpublic void setSourceVersion(Long sourceVersion) {\n\t\tthis.sourceVersion = sourceVersion;\n\t}\n\t\n\tpublic Long getTargetVersion() {\n\t\treturn targetVersion;\n\t}\n\t\n\tpublic void setTargetVersion(Long targetVersion) {\n\t\tthis.targetVersion = targetVersion;\n\t}\n\t\n\tpublic Integer getMinVersion() {\n\t\treturn minVersion;\n\t}\n\t\n\tpublic void setMinVersion(Integer minVersion) {\n\t\tthis.minVersion = minVersion;\n\t}\n\t\n\tpublic String getEncoding() {\n\t\treturn encoding;\n\t}\n\t\n\tpublic void setEncoding(String encoding) {\n\t\tthis.encoding = encoding;\n\t}\n\t\n\tpublic Map<String, String> getFormatPreferences() {\n\t\treturn formatPreferences;\n\t}\n\t\n\tpublic void setFormatPreferences(Map<String, String> formatPreferences) {\n\t\tthis.formatPreferences = formatPreferences;\n\t}\n\t\n\tpublic boolean isCheckPositions() {\n\t\treturn checkPositions;\n\t}\n\t\n\tpublic void setCheckPositions(boolean checkPositions) {\n\t\tthis.checkPositions = checkPositions;\n\t}\n\t\n\tpublic boolean isVerifyDiet() {\n\t\treturn verifyDiet;\n\t}\n\t\n\tpublic void setVerifyDiet(boolean verifyDiet) {\n\t\tthis.verifyDiet = verifyDiet;\n\t}\n}\n"
  },
  {
    "path": "test/core/src/lombok/TransformationResult.java",
    "content": "/*\n * Copyright (C) 2024 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok;\n\nimport java.util.LinkedHashSet;\n\nimport lombok.javac.CapturingDiagnosticListener.CompilerMessage;\n\npublic class TransformationResult {\n\tprivate boolean changed;\n\tprivate boolean success;\n\tprivate LinkedHashSet<CompilerMessage> messages = new LinkedHashSet<CompilerMessage>();\n\tprivate String output;\n\t\n\tpublic void addMessage(CompilerMessage message) {\n\t\tgetMessages().add(message);\n\t}\n\t\n\tpublic void setOutput(String output) {\n\t\tthis.output = output;\n\t}\n\t\n\tpublic String getOutput() {\n\t\treturn output;\n\t}\n\t\n\tpublic boolean isChanged() {\n\t\treturn changed;\n\t}\n\t\n\tpublic void setChanged(boolean changed) {\n\t\tthis.changed = changed;\n\t}\n\t\n\tpublic boolean isSuccess() {\n\t\treturn success;\n\t}\n\t\n\tpublic void setSuccess(boolean success) {\n\t\tthis.success = success;\n\t}\n\t\n\tpublic LinkedHashSet<CompilerMessage> getMessages() {\n\t\treturn messages;\n\t}\n}\n"
  },
  {
    "path": "test/core/src/lombok/core/RunCoreTests.java",
    "content": "/*\n * Copyright (C) 2015 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\nimport org.junit.runner.RunWith;\nimport org.junit.runners.Suite;\nimport org.junit.runners.Suite.SuiteClasses;\n\n@RunWith(Suite.class)\n@SuiteClasses({TestSingulars.class})\npublic class RunCoreTests {\n}\n"
  },
  {
    "path": "test/core/src/lombok/core/TestSingulars.java",
    "content": "/*\n * Copyright (C) 2015-2017 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.core;\n\nimport static lombok.core.handlers.Singulars.autoSingularize;\nimport static org.junit.Assert.*;\n\nimport org.junit.Test;\n\npublic class TestSingulars {\n\t@Test\n\tpublic void testSingulars() {\n\t\tassertNull(\"axes\", autoSingularize(\"axes\"));\n\t\tassertEquals(\"adjective\", autoSingularize(\"adjectives\"));\n\t\tassertEquals(\"bus\", autoSingularize(\"buses\"));\n\t\tassertEquals(\"octopus\", autoSingularize(\"octopodes\"));\n\t\tassertNull(\"octopi\", autoSingularize(\"octopi\"));\n\t\tassertEquals(\"elf\", autoSingularize(\"elves\"));\n\t\tassertEquals(\"jack\", autoSingularize(\"jacks\"));\n\t\tassertEquals(\"colloquy\", autoSingularize(\"colloquies\"));\n\t\tassertNull(\"series\", autoSingularize(\"series\"));\n\t\tassertEquals(\"man\", autoSingularize(\"men\"));\n\t\tassertNull(\"highwaymen\", autoSingularize(\"highwaymen\"));\n\t\tassertEquals(\"caveMan\", autoSingularize(\"caveMen\"));\n\t\tassertNull(\"jackss\", autoSingularize(\"jackss\"));\n\t\tassertNull(\"virus\", autoSingularize(\"virus\"));\n\t\tassertEquals(\"quiz\", autoSingularize(\"quizzes\"));\n\t\tassertEquals(\"database\", autoSingularize(\"databases\"));\n\t\tassertEquals(\"dataBase\", autoSingularize(\"dataBases\"));\n\t\tassertEquals(\"Query\", autoSingularize(\"Queries\"));\n\t\tassertEquals(\"Movie\", autoSingularize(\"Movies\"));\n\t\tassertEquals(\"cafe\", autoSingularize(\"cafes\"));\n\t\tassertNull(\"caves\", autoSingularize(\"caves\"));\n\t\tassertEquals(\"leaf\", autoSingularize(\"leaves\"));\n\t\tassertEquals(\"autosave\", autoSingularize(\"autosaves\"));\n\t}\n}\n"
  },
  {
    "path": "test/ecj/.gitignore",
    "content": "*.class"
  },
  {
    "path": "test/ecj/SimpleTest.java",
    "content": "@lombok.Data\npublic class SimpleTest {\n\tprivate final String test;\n\tprivate final int foo;\n\t\n\tpublic String bar() {\n\t\tint val = getFoo() + 5;\n\t\treturn new SimpleTest(\"\", 0).toString() + val;\n\t}\n}\n"
  },
  {
    "path": "test/eclipse/resource/cleanup/useThis/after/A.java",
    "content": "package pkg;\n\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.With;\nimport lombok.experimental.WithBy;\n\n@Data\n@Builder\n@With\n@WithBy\npublic class A {\n\tprivate String string;\n\t\n\tpublic void a() {\n\t\tthis.string = \"a\";\n\t}\n}"
  },
  {
    "path": "test/eclipse/resource/cleanup/useThis/before/A.java",
    "content": "package pkg;\n\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.With;\nimport lombok.experimental.WithBy;\n\n@Data\n@Builder\n@With\n@WithBy\npublic class A {\n\tprivate String string;\n\t\n\tpublic void a() {\n\t\tstring = \"a\";\n\t}\n}"
  },
  {
    "path": "test/eclipse/resource/delegate/model/DelegateModel.java",
    "content": "package pkg;\n\nimport lombok.experimental.Delegate;\n\npublic class DelegateModel {\n\t\n\t@Delegate\n\tprivate Runnable run;\n}"
  },
  {
    "path": "test/eclipse/resource/extractinterface/simple/after/A.java",
    "content": "package pkg;\n\nimport lombok.EqualsAndHashCode;\nimport lombok.Getter;\nimport lombok.Setter;\nimport lombok.ToString;\n\n@EqualsAndHashCode\n@Getter\n@Setter\n@ToString\npublic class A implements Interface {\n\tprivate String string;\n\tprivate int integer;\n}"
  },
  {
    "path": "test/eclipse/resource/extractinterface/simple/after/Interface.java",
    "content": "package pkg;\n\npublic interface Interface {\n\n\tboolean equals(java.lang.Object o);\n\n\tboolean canEqual(java.lang.Object other);\n\n\tint hashCode();\n\n\tString getString();\n\n\tint getInteger();\n\n\tvoid setString(String string);\n\n\tvoid setInteger(int integer);\n\n\tjava.lang.String toString();\n\n}"
  },
  {
    "path": "test/eclipse/resource/extractinterface/simple/before/A.java",
    "content": "package pkg;\n\nimport lombok.EqualsAndHashCode;\nimport lombok.Getter;\nimport lombok.Setter;\nimport lombok.ToString;\n\n@EqualsAndHashCode\n@Getter\n@Setter\n@ToString\npublic class A {\n\tprivate String string;\n\tprivate int integer;\n}"
  },
  {
    "path": "test/eclipse/resource/extractinterface/usage/after/A.java",
    "content": "package pkg;\n\nimport lombok.EqualsAndHashCode;\nimport lombok.Getter;\nimport lombok.Setter;\nimport lombok.ToString;\n\n@EqualsAndHashCode\n@Getter\n@Setter\n@ToString\npublic class A implements Interface {\n\tprivate String string;\n\tprivate int integer;\n}"
  },
  {
    "path": "test/eclipse/resource/extractinterface/usage/after/B.java",
    "content": "package pkg;\n\nimport lombok.Getter;\nimport lombok.Setter;\n\n@Getter\n@Setter\npublic class B {\n\tprivate Interface a = new A();\n\tprivate String string = a.getString();\n\tprivate int integer = a.getInteger();\n}"
  },
  {
    "path": "test/eclipse/resource/extractinterface/usage/after/Interface.java",
    "content": "package pkg;\n\npublic interface Interface {\n\n\tboolean equals(java.lang.Object o);\n\n\tboolean canEqual(java.lang.Object other);\n\n\tint hashCode();\n\n\tString getString();\n\n\tint getInteger();\n\n\tvoid setString(String string);\n\n\tvoid setInteger(int integer);\n\n\tjava.lang.String toString();\n\n}"
  },
  {
    "path": "test/eclipse/resource/extractinterface/usage/before/A.java",
    "content": "package pkg;\n\nimport lombok.EqualsAndHashCode;\nimport lombok.Getter;\nimport lombok.Setter;\nimport lombok.ToString;\n\n@EqualsAndHashCode\n@Getter\n@Setter\n@ToString\npublic class A {\n\tprivate String string;\n\tprivate int integer;\n}"
  },
  {
    "path": "test/eclipse/resource/extractinterface/usage/before/B.java",
    "content": "package pkg;\n\nimport lombok.Getter;\nimport lombok.Setter;\n\n@Getter\n@Setter\npublic class B {\n\tprivate A a = new A();\n\tprivate String string = a.getString();\n\tprivate int integer = a.getInteger();\n}"
  },
  {
    "path": "test/eclipse/resource/extractvariable/multiple/after/A.java",
    "content": "package pkg;\n\nimport java.util.Arrays;\n\nimport lombok.Getter;\n\n@Getter\npublic class A {\n\tprivate String string;\n\t\n\tpublic List<String> test() {\n\t\tString temp = getString();\n\t\treturn Arrays.asList(temp, temp, temp);\n\t}\n}"
  },
  {
    "path": "test/eclipse/resource/extractvariable/multiple/before/A.java",
    "content": "package pkg;\n\nimport java.util.Arrays;\n\nimport lombok.Getter;\n\n@Getter\npublic class A {\n\tprivate String string;\n\t\n\tpublic List<String> test() {\n\t\treturn Arrays.asList(getString(), getString(), getString());\n\t}\n}"
  },
  {
    "path": "test/eclipse/resource/extractvariable/single/after/A.java",
    "content": "package pkg;\n\nimport lombok.Getter;\n\n@Getter\npublic class A {\n\tprivate String string;\n\t\n\tpublic String test() {\n\t\tString temp = getString();\n\t\treturn temp;\n\t}\n}"
  },
  {
    "path": "test/eclipse/resource/extractvariable/single/before/A.java",
    "content": "package pkg;\n\nimport lombok.Getter;\n\n@Getter\npublic class A {\n\tprivate String string;\n\t\n\tpublic String test() {\n\t\treturn getString();\n\t}\n}"
  },
  {
    "path": "test/eclipse/resource/findreferences/extensionMethod/Extension.java",
    "content": "package pkg;\n\npublic static class Extension {\n\tpublic static String test(String s) {\n\t\treturn s;\n\t}\n\t\n\tpublic static String test(String s, int i) {\n\t\treturn s;\n\t}\n\t\n\tpublic static String test(String s, String... s2) {\n\t\treturn s;\n\t}\n}"
  },
  {
    "path": "test/eclipse/resource/findreferences/extensionMethod/Usage.java",
    "content": "package pkg;\n\nimport lombok.experimental.ExtensionMethod;\n\n@ExtensionMethod(Extension.class)\npublic class Usage {\n\tpublic void test() {\n\t\tprivate String string;\n\t\tstring.test();\n\t\tstring.test(\"a\");\n\t\tstring.test(1);\n\t}\n}"
  },
  {
    "path": "test/eclipse/resource/inline/getter/after/InlineGetter.java",
    "content": "package pkg;\n\nimport lombok.Getter;\n\n@Getter\npublic class InlineGetter {\n\tprivate String string;\n\t\n\tpublic String asReturn() {\n\t\treturn this.string;\n\t}\n\t\n\tpublic void asAssignment() {\n\t\tString a = this.string;\n\t}\n}"
  },
  {
    "path": "test/eclipse/resource/inline/getter/before/InlineGetter.java",
    "content": "package pkg;\n\nimport lombok.Getter;\n\n@Getter\npublic class InlineGetter {\n\tprivate String string;\n\t\n\tpublic String asReturn() {\n\t\treturn getString();\n\t}\n\t\n\tpublic void asAssignment() {\n\t\tString a = getString();\n\t}\n}"
  },
  {
    "path": "test/eclipse/resource/inline/setter/after/InlineSetter.java",
    "content": "package pkg;\n\nimport lombok.Setter;\n\n@Setter\npublic class InlineSetter {\n\tprivate String string;\n\t\n\tpublic void test() {\n\t\tthis.string=\"test\";\n\t}\n}"
  },
  {
    "path": "test/eclipse/resource/inline/setter/before/InlineSetter.java",
    "content": "package pkg;\n\nimport lombok.Setter;\n\n@Setter\npublic class InlineSetter {\n\tprivate String string;\n\t\n\tpublic void test() {\n\t\tsetString(\"test\");\n\t}\n}"
  },
  {
    "path": "test/eclipse/resource/javadoc/getterSetter/Javadoc.java",
    "content": "package pkg;\n\nimport lombok.Getter;\nimport lombok.Setter;\n\npublic class Javadoc {\n\t/**\n\t * Some text\n\t *\n\t * **SETTER**\n\t * Setter section\n\t * @param fieldName Hello, World3\n\t * **GETTER**\n\t * Getter section\n\t * @return Sky is blue3\n\t */\n\t@Getter\n\t@Setter\n\tprivate int field;\n\t\n\tpublic void usage() {\n\t\tgetField();\n\t\tsetField(0);\n\t}\n}"
  },
  {
    "path": "test/eclipse/resource/noerrors/builderJavadoc/BuilderJavadoc.java",
    "content": "package pkg;\n\nimport lombok.Builder;\n\n@Builder\npublic class BuilderJavadoc {\n\t/**\n\t * Javadoc\n\t * \n\t * @param test ABC\n\t * @return test\n\t */\n\tprivate String test;\n}"
  },
  {
    "path": "test/eclipse/resource/noerrors/builderJavadoc/Usage.java",
    "content": "package pkg;\n\npublic class Usage {\n\tpublic void test() {\n\t\tBuilderJavadoc.builder().test(\"test\").build();\n\t}\n}"
  },
  {
    "path": "test/eclipse/resource/noerrors/fieldNameConstantsInAnnotation/Annotation.java",
    "content": "package pkg;\n\npublic @interface Annotation {\n\tString value();\n}"
  },
  {
    "path": "test/eclipse/resource/noerrors/fieldNameConstantsInAnnotation/Constants.java",
    "content": "package pkg;\n\nimport lombok.experimental.FieldNameConstants;\n\n@FieldNameConstants\npublic class Constants {\n\tString test;\n}"
  },
  {
    "path": "test/eclipse/resource/noerrors/fieldNameConstantsInAnnotation/Usage.java",
    "content": "package pkg;\n\n@Annotation(Constants.Fields.test)\npublic class Usage {\n}"
  },
  {
    "path": "test/eclipse/resource/noerrors/synchronizedUsage/ClassWithSynchronized.java",
    "content": "package pkg;\n\nimport lombok.Synchronized;\n\npublic class ClassWithSynchronized {\n\t@Synchronized\n\tpublic void test() {\n\t}\n}"
  },
  {
    "path": "test/eclipse/resource/noerrors/synchronizedUsage/Usage.java",
    "content": "package pkg;\n\npublic class Usage {\n\tprivate ClassWithSynchronized test;\n\t\n\t// Prevent \"The value of the field Usage.test is not used\"\n\tpublic void test() {\n\t\ttest.test();\n\t}\n}"
  },
  {
    "path": "test/eclipse/resource/rename/builderField/after/A.java",
    "content": "package pkg;\n\nimport lombok.Builder;\n\n@Builder\npublic class A {\n\tprivate String newString;\n}"
  },
  {
    "path": "test/eclipse/resource/rename/builderField/before/A.java",
    "content": "package pkg;\n\nimport lombok.Builder;\n\n@Builder\npublic class A {\n\tprivate String string;\n}"
  },
  {
    "path": "test/eclipse/resource/rename/data/after/A.java",
    "content": "package pkg;\n\nimport lombok.Data;\n\n@Data\npublic class A {\n\tprivate String newString;\n\t\n\tpublic String test() {\n\t\treturn getNewString();\n\t}\n}"
  },
  {
    "path": "test/eclipse/resource/rename/data/before/A.java",
    "content": "package pkg;\n\nimport lombok.Data;\n\n@Data\npublic class A {\n\tprivate String string;\n\t\n\tpublic String test() {\n\t\treturn getString();\n\t}\n}"
  },
  {
    "path": "test/eclipse/resource/rename/extensionMethod/after/Extension.java",
    "content": "package pkg;\n\npublic static class Extension {\n\tpublic static String newTest(String s) {\n\t\treturn s;\n\t}\n\t\n\tpublic static String test(String s, int i) {\n\t\treturn s;\n\t}\n\t\n\tpublic static String test(String s, String... s2) {\n\t\treturn s;\n\t}\n}"
  },
  {
    "path": "test/eclipse/resource/rename/extensionMethod/after/Usage.java",
    "content": "package pkg;\n\nimport lombok.experimental.ExtensionMethod;\n\n@ExtensionMethod(Extension.class)\npublic class Usage {\n\tpublic void test() {\n\t\tprivate String string;\n\t\tstring.newTest();\n\t\tstring.test(\"a\");\n\t\tstring.test(1);\n\t}\n}"
  },
  {
    "path": "test/eclipse/resource/rename/extensionMethod/before/Extension.java",
    "content": "package pkg;\n\npublic static class Extension {\n\tpublic static String test(String s) {\n\t\treturn s;\n\t}\n\t\n\tpublic static String test(String s, int i) {\n\t\treturn s;\n\t}\n\t\n\tpublic static String test(String s, String... s2) {\n\t\treturn s;\n\t}\n}"
  },
  {
    "path": "test/eclipse/resource/rename/extensionMethod/before/Usage.java",
    "content": "package pkg;\n\nimport lombok.experimental.ExtensionMethod;\n\n@ExtensionMethod(Extension.class)\npublic class Usage {\n\tpublic void test() {\n\t\tprivate String string;\n\t\tstring.test();\n\t\tstring.test(\"a\");\n\t\tstring.test(1);\n\t}\n}"
  },
  {
    "path": "test/eclipse/resource/rename/nestedClass/after/A.java",
    "content": "package pkg;\n\npublic class A {\n\t@lombok.Getter\n\t@lombok.Setter\n\tpublic static class Nested {\n\t\tprivate String newString;\n\t}\n}"
  },
  {
    "path": "test/eclipse/resource/rename/nestedClass/before/A.java",
    "content": "package pkg;\n\npublic class A {\n\t@lombok.Getter\n\t@lombok.Setter\n\tpublic static class Nested {\n\t\tprivate String string;\n\t}\n}"
  },
  {
    "path": "test/eclipse/resource/rename/simple/after/A.java",
    "content": "package pkg;\n\nimport lombok.EqualsAndHashCode;\nimport lombok.Getter;\nimport lombok.Setter;\nimport lombok.ToString;\n\n@EqualsAndHashCode\n@Getter\n@Setter\n@ToString\npublic class A {\n\tprivate String newString;\n}"
  },
  {
    "path": "test/eclipse/resource/rename/simple/before/A.java",
    "content": "package pkg;\n\nimport lombok.EqualsAndHashCode;\nimport lombok.Getter;\nimport lombok.Setter;\nimport lombok.ToString;\n\n@EqualsAndHashCode\n@Getter\n@Setter\n@ToString\npublic class A {\n\tprivate String string;\n}"
  },
  {
    "path": "test/eclipse/resource/rename/withGetter/after/A.java",
    "content": "package pkg;\n\nimport lombok.EqualsAndHashCode;\nimport lombok.Getter;\nimport lombok.Setter;\nimport lombok.ToString;\n\n@EqualsAndHashCode\n@Getter\n@Setter\n@ToString\npublic class A {\n\tprivate String newString;\n\t\n\tpublic String test() {\n\t\treturn getNewString();\n\t}\n}"
  },
  {
    "path": "test/eclipse/resource/rename/withGetter/before/A.java",
    "content": "package pkg;\n\nimport lombok.EqualsAndHashCode;\nimport lombok.Getter;\nimport lombok.Setter;\nimport lombok.ToString;\n\n@EqualsAndHashCode\n@Getter\n@Setter\n@ToString\npublic class A {\n\tprivate String string;\n\t\n\tpublic String test() {\n\t\treturn getString();\n\t}\n}"
  },
  {
    "path": "test/eclipse/resource/rename/withGetterDifferentFile/after/A.java",
    "content": "package pkg;\n\nimport lombok.EqualsAndHashCode;\nimport lombok.Getter;\nimport lombok.Setter;\nimport lombok.ToString;\n\n@EqualsAndHashCode\n@Getter\n@Setter\n@ToString\npublic class A {\n\tprivate String newString;\n}"
  },
  {
    "path": "test/eclipse/resource/rename/withGetterDifferentFile/after/B.java",
    "content": "package pkg;\n\npublic class B {\n\tpublic String test() {\n\t\treturn new A().getNewString();\n\t}\n}"
  },
  {
    "path": "test/eclipse/resource/rename/withGetterDifferentFile/before/A.java",
    "content": "package pkg;\n\nimport lombok.EqualsAndHashCode;\nimport lombok.Getter;\nimport lombok.Setter;\nimport lombok.ToString;\n\n@EqualsAndHashCode\n@Getter\n@Setter\n@ToString\npublic class A {\n\tprivate String string;\n}"
  },
  {
    "path": "test/eclipse/resource/rename/withGetterDifferentFile/before/B.java",
    "content": "package pkg;\n\npublic class B {\n\tpublic String test() {\n\t\treturn new A().getString();\n\t}\n}"
  },
  {
    "path": "test/eclipse/resource/select/builderField/A.java",
    "content": "package pkg;\n\nimport lombok.Builder;\n\n@Builder\npublic class A {\n\tprivate String id;\n}"
  },
  {
    "path": "test/eclipse/resource/select/superbuilderField/A.java",
    "content": "package pkg;\n\nimport lombok.experimental.SuperBuilder;\n\n@SuperBuilder\npublic class A {\n\tprivate String id;\n}"
  },
  {
    "path": "test/eclipse/src/lombok/eclipse/EclipseRunner.java",
    "content": "/*\n * Copyright (C) 2022 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse;\n\nimport java.io.File;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\n\nimport org.eclipse.core.runtime.adaptor.EclipseStarter;\nimport org.eclipse.osgi.container.Module;\nimport org.eclipse.osgi.container.Module.StartOptions;\nimport org.eclipse.osgi.container.Module.State;\nimport org.eclipse.osgi.internal.location.EquinoxLocations;\nimport org.junit.runner.Description;\nimport org.junit.runner.Runner;\nimport org.junit.runner.notification.RunNotifier;\nimport org.junit.runners.BlockJUnit4ClassRunner;\nimport org.junit.runners.model.InitializationError;\nimport org.osgi.framework.Bundle;\nimport org.osgi.framework.BundleContext;\nimport org.osgi.framework.BundleException;\nimport org.osgi.framework.wiring.BundleRevision;\nimport org.osgi.framework.wiring.BundleWire;\nimport org.osgi.framework.wiring.BundleWiring;\n\n/**\n * We have to load the osgi/eclipse classes before we run the test case. This is only possible using a custom runner.\n *\n */\npublic class EclipseRunner extends Runner {\n\tprivate Runner runner;\n\tprivate boolean debug = false;\n\tprivate static boolean setupDone;\n\t\n\tpublic EclipseRunner(Class<?> klass) throws InitializationError {\n\t\ttry {\n\t\t\tif (!setupDone) {\n\t\t\t\tdebug = System.getProperty(\"lombok.debug\") != null;\n\t\t\t\tstartEclipse(System.getProperty(\"lombok.testenv\"));\n\t\t\t\tsetupDone = true;\n\t\t\t}\n\t\t} catch (Throwable e) {\n\t\t\tthrow new InitializationError(e);\n\t\t}\n\t\t\n\t\trunner = new BlockJUnit4ClassRunner(klass);\n\t\t\n\t}\n\t\n\t@Override\n\tpublic Description getDescription() {\n\t\treturn runner.getDescription();\n\t}\n\t\n\t@Override\n\tpublic void run(RunNotifier notifier) {\n\t\trunner.run(notifier);\n\t}\n\t\n\tprivate void startEclipse(String path) throws Exception {\n\t\tMap<String, String> initialProperties = new HashMap<String, String>();\n\t\t\n\t\tFile rootDir = new File(path);\n\t\tFile pluginDir = new File(rootDir, \"plugins/\");\n\t\t\n\t\tStringBuilder bundleString = new StringBuilder();\n\t\tString osgiPlugin = null;\n\t\tFile[] bundles = pluginDir.listFiles();\n\t\tArrays.sort(bundles);\n\t\tfor (File plugin : bundles) {\n\t\t\tString fileName = plugin.getName();\n\t\t\tString bundleName = fileName.substring(0, fileName.indexOf(\"_\"));\n\t\t\t\n\t\t\tif (bundleName.equals(\"org.eclipse.osgi\")) {\n\t\t\t\tosgiPlugin = plugin.toURI().toString();\n\t\t\t}\n\t\t\t\n\t\t\tif (bundleString.length() > 0) {\n\t\t\t\tbundleString.append(\",\");\n\t\t\t}\n\t\t\tbundleString.append(bundleName);\n\t\t}\n\t\t\n\t\tinitialProperties.put(EclipseStarter.PROP_BUNDLES, bundleString.toString());\n\t\tinitialProperties.put(EclipseStarter.PROP_INSTALL_AREA, \"file:\" + path);\n\t\tinitialProperties.put(EquinoxLocations.PROP_INSTANCE_AREA, \"file:\" + path);\n\t\tinitialProperties.put(EclipseStarter.PROP_FRAMEWORK, osgiPlugin);\n\t\tinitialProperties.put(\"osgi.framework.useSystemProperties\", \"false\");\n\t\tinitialProperties.put(EclipseStarter.PROP_NOSHUTDOWN, \"false\");\n\t\t\n\t\tinitialProperties.put(\"osgi.parentClassloader\", \"fwk\");\n\t\tinitialProperties.put(\"osgi.frameworkParentClassloader\", \"fwk\");\n\t\tinitialProperties.put(\"osgi.contextClassLoaderParent\", \"ext\");\n\t\tinitialProperties.put(\"osgi.context.bootdelegation\", \"*\");\n\t\tinitialProperties.put(\"org.osgi.framework.bootdelegation\", \"*\");\n\t\t\n\t\tEclipseStarter.setInitialProperties(initialProperties);\n\t\tString[] args = new String[] {\"-clean\"};\n\t\tif (debug) args = new String[] {\"-clean\", \"-console\", \"-consoleLog\", \"-debug\"};\n\t\tBundleContext context = EclipseStarter.startup(args, null);\n\t\t\n\t\tMap<String, Module> moduleMap = new HashMap<String, Module>();\n\t\tfor (Bundle b : context.getBundles()) {\n\t\t\tModule module = b.adapt(Module.class);\n\t\t\tmoduleMap.put(b.getSymbolicName(), module);\n\t\t}\n\t\t\n\t\tSet<String> startedBundles = new HashSet<String>();\n\t\t// Mark the debug bundle as started, it will fail anyway...\n\t\tstartedBundles.add(\"org.eclipse.debug.ui\");\n\t\t\n\t\tstartBundle(moduleMap, startedBundles, \"org.apache.felix.scr\");\n\t\tstartBundle(moduleMap, startedBundles, \"org.eclipse.jdt.core.manipulation\");\n\t\tstartBundle(moduleMap, startedBundles, \"org.eclipse.jdt.ui\");\n\t\t\n\t\tif (debug) {\n\t\t\tfor (Bundle b : context.getBundles()) {\n\t\t\t\tSystem.out.println(\"BUNDLE: \" + b.getSymbolicName() + \" \" + b.getVersion() + \" \" + b.getLocation() + \" \" + b.getState());\n\t\t\t}\n\t\t}\n\t}\n\t\n\tprivate void startBundle(Map<String, Module> moduleMap, Set<String> started, String bundle) throws BundleException {\n\t\tif (started.contains(bundle)) return;\n\t\t\n\t\tModule module = moduleMap.get(bundle);\n\t\tstarted.add(bundle);\n\t\t\n\t\tBundleWiring wiring = module.getBundle().adapt(BundleWiring.class);\n\t\tList<BundleWire> requiredWires = wiring.getRequiredWires(BundleRevision.PACKAGE_NAMESPACE);\n\t\trequiredWires.addAll(wiring.getRequiredWires(BundleRevision.BUNDLE_NAMESPACE));\n\t\t\n\t\tfor (BundleWire bundleWire : requiredWires) {\n\t\t\tstartBundle(moduleMap, started, bundleWire.getProvider().getSymbolicName());\n\t\t}\n\t\t\n\t\tstartModule(module);\n\t}\n\t\n\tprivate void startModule(Module module) throws BundleException {\n\t\tif (module.getState() == State.LAZY_STARTING || module.getState() == State.RESOLVED) {\n\t\t\tif (debug) System.out.print(\"Starting bundle \" + module.getBundle().getSymbolicName() + \"...\");\n\t\t\ttry {\n\t\t\t\tmodule.start(StartOptions.LAZY_TRIGGER);\n\t\t\t\tif (debug) System.out.println(\" [done]\");\n\t\t\t} catch (Exception e) {\n\t\t\t\tif (debug) System.out.println(\" [error]\");\n\t\t\t\te.printStackTrace();\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/eclipse/src/lombok/eclipse/EclipseTests.java",
    "content": "/*\n * Copyright (C) 2022-2024 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse;\n\nimport org.junit.runner.RunWith;\nimport org.junit.runners.Suite;\nimport org.junit.runners.Suite.SuiteClasses;\n\nimport lombok.eclipse.cleanup.CleanupTest;\nimport lombok.eclipse.compile.NoErrorsTest;\nimport lombok.eclipse.edit.SelectTest;\nimport lombok.eclipse.misc.DelegateTest;\nimport lombok.eclipse.misc.JavadocTest;\nimport lombok.eclipse.refactoring.ExtractInterfaceTest;\nimport lombok.eclipse.refactoring.ExtractVariableTest;\nimport lombok.eclipse.refactoring.InlineTest;\nimport lombok.eclipse.refactoring.RenameTest;\nimport lombok.eclipse.references.FindReferencesTest;\n\n@RunWith(Suite.class)\n@SuiteClasses({ExtractInterfaceTest.class, RenameTest.class, SelectTest.class, CleanupTest.class, FindReferencesTest.class, InlineTest.class, NoErrorsTest.class, JavadocTest.class, DelegateTest.class, ExtractVariableTest.class})\npublic class EclipseTests {\n\t\n}\n"
  },
  {
    "path": "test/eclipse/src/lombok/eclipse/RefactoringUtils.java",
    "content": "/*\n * Copyright (C) 2022-2024 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse;\n\nimport static org.junit.Assert.*;\n\nimport org.eclipse.core.resources.ResourcesPlugin;\nimport org.eclipse.core.runtime.CoreException;\nimport org.eclipse.ltk.core.refactoring.CheckConditionsOperation;\nimport org.eclipse.ltk.core.refactoring.CreateChangeOperation;\nimport org.eclipse.ltk.core.refactoring.PerformChangeOperation;\nimport org.eclipse.ltk.core.refactoring.Refactoring;\nimport org.eclipse.ltk.core.refactoring.RefactoringStatus;\nimport org.eclipse.ltk.core.refactoring.participants.ProcessorBasedRefactoring;\nimport org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor;\n\npublic class RefactoringUtils {\n\tpublic static void performRefactoring(RefactoringProcessor proccessor) throws CoreException {\n\t\tperformRefactoring(new ProcessorBasedRefactoring(proccessor));\n\t}\n\t\n\tpublic static void performRefactoring(Refactoring refactoring) throws CoreException {\n\t\tCheckConditionsOperation checkConditionsOperation = new CheckConditionsOperation(refactoring, CheckConditionsOperation.ALL_CONDITIONS);\n\t\tCreateChangeOperation change = new CreateChangeOperation(checkConditionsOperation, RefactoringStatus.FATAL);\n\t\tfinal PerformChangeOperation perform = new PerformChangeOperation(change);\n\t\t\n\t\tResourcesPlugin.getWorkspace().run(perform, null);\n\t\t\n\t\tassertEquals(\"Condition failed\", \"<OK\\n>\", change.getConditionCheckingStatus().toString());\n\t\tassertTrue(\"Perform failed\", perform.changeExecuted());\n\t}\n}\n"
  },
  {
    "path": "test/eclipse/src/lombok/eclipse/SetupBeforeAfterTest.java",
    "content": "/*\n * Copyright (C) 2022-2023 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse;\n\nimport static org.junit.Assert.assertEquals;\n\nimport java.io.File;\nimport java.io.FileNotFoundException;\n\nimport org.eclipse.jdt.core.ICompilationUnit;\nimport org.eclipse.jdt.core.JavaModelException;\nimport org.junit.runner.Description;\n\npublic class SetupBeforeAfterTest extends SetupTest {\n\t\n\tprivate File before;\n\tprivate File after;\n\t\n\t@Override\n\tprotected void starting(Description description) {\n\t\tsuper.starting(description);\n\t\t\n\t\tbefore = new File(root, \"/before/\");\n\t\tafter = new File(root, \"/after/\");\n\t\t\n\t\ttry {\n\t\t\tcopyBeforeFiles();\n\t\t} catch (Throwable e) {\n\t\t\tthrow new RuntimeException(e);\n\t\t}\n\t}\n\t\n\t@Override\n\tprotected void succeeded(Description description) {\n\t\ttry {\n\t\t\tcompareWithAfter();\n\t\t} catch (Exception e) {\n\t\t\tthrow new RuntimeException(e);\n\t\t}\n\t}\n\t\n\tprivate void compareWithAfter() throws FileNotFoundException, JavaModelException {\n\t\tfor (ICompilationUnit result : packageFragment.getCompilationUnits()) {\n\t\t\tassertEquals(getContent(new File(after, result.getElementName())), result.getSource());\n\t\t}\n\t}\n\t\n\tvoid copyBeforeFiles() throws JavaModelException, FileNotFoundException {\n\t\tfor (File file : before.listFiles()) {\n\t\t\tcreateCompilationUnit(file, packageFragment);\n\t\t}\n\t\t\n\t}\n}\n"
  },
  {
    "path": "test/eclipse/src/lombok/eclipse/SetupSingleFileTest.java",
    "content": "/*\n * Copyright (C) 2022 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse;\n\nimport java.io.File;\nimport java.io.FileNotFoundException;\n\nimport org.eclipse.jdt.core.JavaModelException;\nimport org.junit.runner.Description;\n\npublic class SetupSingleFileTest extends SetupTest {\n\t\n\t@Override\n\tprotected void starting(Description description) {\n\t\tsuper.starting(description);\n\t\t\n\t\ttry {\n\t\t\tcopyRootFiles();\n\t\t} catch (Exception e) {\n\t\t\tthrow new RuntimeException(e);\n\t\t}\n\t}\n\t\n\tprivate void copyRootFiles() throws JavaModelException, FileNotFoundException {\n\t\tfor (File file : root.listFiles()) {\n\t\t\tcreateCompilationUnit(file, packageFragment);\n\t\t}\n\t\t\n\t}\n}\n"
  },
  {
    "path": "test/eclipse/src/lombok/eclipse/SetupTest.java",
    "content": "/*\n * Copyright (C) 2022 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse;\n\nimport java.io.File;\nimport java.io.FileNotFoundException;\nimport java.util.Scanner;\n\nimport org.eclipse.core.resources.IFolder;\nimport org.eclipse.core.resources.IProject;\nimport org.eclipse.core.resources.IProjectDescription;\nimport org.eclipse.core.resources.IWorkspace;\nimport org.eclipse.core.resources.IWorkspaceRoot;\nimport org.eclipse.core.resources.ResourcesPlugin;\nimport org.eclipse.core.runtime.CoreException;\nimport org.eclipse.core.runtime.Path;\nimport org.eclipse.jdt.core.IClasspathEntry;\nimport org.eclipse.jdt.core.ICompilationUnit;\nimport org.eclipse.jdt.core.IJavaProject;\nimport org.eclipse.jdt.core.IPackageFragment;\nimport org.eclipse.jdt.core.JavaCore;\nimport org.eclipse.jdt.core.JavaModelException;\nimport org.junit.rules.TestWatcher;\nimport org.junit.runner.Description;\n\npublic abstract class SetupTest extends TestWatcher {\n\t\n\tprivate IJavaProject javaProject;\n\tprotected IPackageFragment packageFragment;\n\tprivate IWorkspace workspace;\n\tprotected File root;\n\t\n\tpublic IJavaProject getJavaProject() {\n\t\treturn javaProject;\n\t}\n\t\n\tpublic IPackageFragment getPackageFragment() {\n\t\treturn packageFragment;\n\t}\n\t\n\tpublic IWorkspace getWorkspace() {\n\t\treturn workspace;\n\t}\n\t\n\t@Override\n\tprotected void starting(Description description) {\n\t\tString category = description.getTestClass().getSimpleName().toLowerCase().replaceAll(\"test$\", \"\");\n\t\tString testname = description.getMethodName();\n\t\t\n\t\troot = new File(\"test/eclipse/resource/\" + category + \"/\" + testname);\n\t\t\n\t\ttry {\n\t\t\tcreateProject(category, description.getMethodName());\n\t\t} catch (Exception e) {\n\t\t\tthrow new RuntimeException(e);\n\t\t}\n\t}\n\t\n\tprivate void createProject(String category, String test) throws CoreException {\n\t\tworkspace = ResourcesPlugin.getWorkspace();\n\t\t\n\t\tIWorkspaceRoot root = getWorkspace().getRoot();\n\t\tIProject project = root.getProject(category + \"_\" + test);\n\t\t\n\t\tif (project.exists()) {\n\t\t\tproject.delete(true, true, null);\n\t\t}\n\t\tproject.create(null);\n\t\tproject.open(null);\n\t\t\n\t\tIFolder targetFolder = createFolder(project, \"target\");\n\t\tIFolder srcFolder = createFolder(project, \"src\");\n\t\t\n\t\tIProjectDescription description = project.getDescription();\n\t\tdescription.setNatureIds(new String[] {JavaCore.NATURE_ID});\n\t\tproject.setDescription(description, null);\n\t\t\n\t\tjavaProject = JavaCore.create(project);\n\t\tjavaProject.setOutputLocation(targetFolder.getFullPath(), null);\n\t\tJavaCore.setComplianceOptions(JavaCore.VERSION_1_8, javaProject.getOptions(false));\n\t\t\n\t\tIClasspathEntry classpathEntry = JavaCore.newSourceEntry(srcFolder.getFullPath());\n\t\tIClasspathEntry newLibraryEntry = JavaCore.newLibraryEntry(new Path(new File(\"dist/lombok.jar\").getAbsolutePath()), null, null);\n\t\tIClasspathEntry javaRtEntry = JavaCore.newLibraryEntry(new Path(new File(\"lib/rtstubs18.jar\").getAbsolutePath()), null, null);\n\t\tjavaProject.setRawClasspath(new IClasspathEntry[] {classpathEntry, newLibraryEntry, javaRtEntry}, null);\n\t\t\n\t\tpackageFragment = javaProject.getPackageFragmentRoot(srcFolder).createPackageFragment(\"pkg\", false, null);\n\t}\n\t\n\tprotected IFolder createFolder(IProject project, String name) throws CoreException {\n\t\tIFolder folder = project.getFolder(name);\n\t\tif (folder.exists()) {\n\t\t\tfolder.delete(true, null);\n\t\t}\n\t\tfolder.create(false, true, null);\n\t\treturn folder;\n\t}\n\t\n\tprotected ICompilationUnit createCompilationUnit(File file, IPackageFragment pkg) throws JavaModelException, FileNotFoundException {\n\t\treturn pkg.createCompilationUnit(file.getName(), getContent(file), true, null);\n\t}\n\t\n\tprotected String getContent(File f) throws FileNotFoundException {\n\t\tScanner scanner = new Scanner(f);\n\t\tString text = scanner.useDelimiter(\"\\\\A\").next();\n\t\tscanner.close();\n\t\treturn text;\n\t}\n}"
  },
  {
    "path": "test/eclipse/src/lombok/eclipse/cleanup/CleanupTest.java",
    "content": "/*\n * Copyright (C) 2022-2024 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.cleanup;\n\nimport static lombok.eclipse.RefactoringUtils.performRefactoring;\n\nimport java.lang.reflect.Constructor;\nimport java.util.Map;\nimport java.util.Map.Entry;\n\nimport org.eclipse.jdt.core.ICompilationUnit;\nimport org.eclipse.jdt.internal.corext.fix.CleanUpConstants;\nimport org.eclipse.jdt.internal.corext.fix.CleanUpRefactoring;\nimport org.eclipse.jdt.internal.corext.fix.CleanUpRegistry;\nimport org.eclipse.jdt.internal.ui.JavaPlugin;\nimport org.eclipse.jdt.internal.ui.fix.MapCleanUpOptions;\nimport org.eclipse.jdt.ui.cleanup.ICleanUp;\nimport org.junit.Rule;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport lombok.eclipse.EclipseRunner;\nimport lombok.eclipse.SetupBeforeAfterTest;\n\n@RunWith(EclipseRunner.class)\npublic class CleanupTest {\n\t\n\t@Rule\n\tpublic SetupBeforeAfterTest setup = new SetupBeforeAfterTest();\n\t\n\t@Test\n\tpublic void useThis() throws Exception {\n\t\tICompilationUnit cu = setup.getPackageFragment().getCompilationUnit(\"A.java\");\n\t\t\n\t\tCleanUpRegistry cleanUpRegistry = JavaPlugin.getDefault().getCleanUpRegistry();\n\t\tMapCleanUpOptions options = cleanUpRegistry.getDefaultOptions(CleanUpConstants.DEFAULT_CLEAN_UP_OPTIONS);\n\t\tfor (Entry<String, String> entry : options.getMap().entrySet()) {\n\t\t\tentry.setValue(MapCleanUpOptions.FALSE);\n\t\t}\n\t\toptions.setOption(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_FIELD_USE_THIS, MapCleanUpOptions.TRUE);\n\t\toptions.setOption(CleanUpConstants.MEMBER_ACCESSES_NON_STATIC_FIELD_USE_THIS_ALWAYS, MapCleanUpOptions.TRUE);\n\t\t\n\t\tCleanUpRefactoring ref = new CleanUpRefactoring();\n\t\tref.addCompilationUnit(cu);\n\t\t\n\t\t// Load the class dynamically to avoid compile errors when running with older versions of Eclipse\n\t\tClass<?> cleanUpClass;\n\t\ttry {\n\t\t\tcleanUpClass = Class.forName(\"org.eclipse.jdt.internal.ui.fix.CodeStyleCleanUp\");\n\t\t} catch (ClassNotFoundException e) {\n\t\t\tcleanUpClass = Class.forName(\"org.eclipse.jdt.internal.ui.fix.CodeStyleCleanUpCore\");\n\t\t}\n\t\tConstructor<?> cleanUpConstructor = cleanUpClass.getConstructor(Map.class);\n\t\tref.addCleanUp((ICleanUp) cleanUpConstructor.newInstance(options.getMap()));\n\t\t\n\t\tperformRefactoring(ref);\n\t}\n}\n"
  },
  {
    "path": "test/eclipse/src/lombok/eclipse/compile/NoErrorsTest.java",
    "content": "/*\n * Copyright (C) 2024 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.compile;\n\nimport static org.junit.Assert.*;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\n\nimport org.eclipse.jdt.core.ICompilationUnit;\nimport org.eclipse.jdt.core.IProblemRequestor;\nimport org.eclipse.jdt.core.JavaModelException;\nimport org.eclipse.jdt.core.WorkingCopyOwner;\nimport org.eclipse.jdt.core.compiler.IProblem;\nimport org.junit.Rule;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport lombok.eclipse.EclipseRunner;\nimport lombok.eclipse.SetupSingleFileTest;\n\n@RunWith(EclipseRunner.class)\npublic class NoErrorsTest {\n\t\n\t@Rule\n\tpublic SetupSingleFileTest setup = new SetupSingleFileTest();\n\t\n\t@Test\n\tpublic void fieldNameConstantsInAnnotation() throws Exception {\n\t\tICompilationUnit cu = setup.getPackageFragment().getCompilationUnit(\"Usage.java\");\n\t\t\n\t\tList<IProblem> problems = collectProblems(cu);\n\t\tassertEquals(Collections.emptyList(), problems);\n\t}\n\t\n\t@Test\n\tpublic void builderJavadoc() throws Exception {\n\t\tICompilationUnit cu = setup.getPackageFragment().getCompilationUnit(\"Usage.java\");\n\t\t\n\t\tList<IProblem> problems = collectProblems(cu);\n\t\tassertEquals(Collections.emptyList(), problems);\n\t}\n\t\n\t@Test\n\tpublic void synchronizedUsage() throws Exception {\n\t\tICompilationUnit cu = setup.getPackageFragment().getCompilationUnit(\"Usage.java\");\n\t\t\n\t\tList<IProblem> problems = collectProblems(cu);\n\t\tassertEquals(Collections.emptyList(), problems);\n\t}\n\t\n\tprivate List<IProblem> collectProblems(ICompilationUnit cu) throws JavaModelException {\n\t\tfinal List<IProblem> problems = new ArrayList<IProblem>();\n\t\tfinal IProblemRequestor requestor = new IProblemRequestor() {\n\t\t\t@Override\n\t\t\tpublic void acceptProblem(IProblem problem) {\n\t\t\t\tproblems.add(problem);\n\t\t\t}\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void beginReporting() {\n\t\t\t\tproblems.clear();\n\t\t\t}\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic void endReporting() {\n\t\t\t}\n\t\t\t\n\t\t\t@Override\n\t\t\tpublic boolean isActive() {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t};\n\t\t\n\t\tWorkingCopyOwner workingCopyOwner = new WorkingCopyOwner() {\n\t\t\t@Override\n\t\t\tpublic IProblemRequestor getProblemRequestor(ICompilationUnit workingCopy) {\n\t\t\t\treturn requestor;\n\t\t\t}\n\t\t};\n\t\t\n\t\tICompilationUnit workingCopy = cu.getWorkingCopy(workingCopyOwner, null);\n\t\ttry {\n\t\t\tworkingCopy.reconcile(ICompilationUnit.NO_AST, true, true, workingCopy.getOwner(), null);\n\t\t} finally {\n\t\t\tworkingCopy.discardWorkingCopy();\n\t\t}\n\t\t\n\t\treturn problems;\n\t}\n}\n"
  },
  {
    "path": "test/eclipse/src/lombok/eclipse/edit/SelectTest.java",
    "content": "/*\n * Copyright (C) 2022 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.edit;\n\nimport static org.junit.Assert.assertEquals;\n\nimport org.eclipse.jdt.core.ICompilationUnit;\nimport org.eclipse.jdt.core.IField;\nimport org.eclipse.jdt.core.IJavaElement;\nimport org.eclipse.jdt.core.ISourceRange;\nimport org.eclipse.jdt.core.IType;\nimport org.junit.Rule;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport lombok.eclipse.EclipseRunner;\nimport lombok.eclipse.SetupSingleFileTest;\n\n@RunWith(EclipseRunner.class)\npublic class SelectTest {\n\t\n\t@Rule\n\tpublic SetupSingleFileTest setup = new SetupSingleFileTest();\n\t\n\t@Test\n\tpublic void builderField() throws Exception {\n\t\tICompilationUnit cu = setup.getPackageFragment().getCompilationUnit(\"A.java\");\n\t\tIType type = cu.findPrimaryType();\n\t\tIField field = type.getField(\"id\");\n\t\t\n\t\tISourceRange sourceRange = field.getNameRange();\n\t\tIJavaElement[] codeSelect = cu.codeSelect(sourceRange.getOffset(), sourceRange.getLength());\n\t\t\n\t\tassertEquals(1, codeSelect.length);\n\t\tassertEquals(field, codeSelect[0]);\n\t}\n\t\n\t@Test\n\tpublic void superbuilderField() throws Exception {\n\t\tICompilationUnit cu = setup.getPackageFragment().getCompilationUnit(\"A.java\");\n\t\tIType type = cu.findPrimaryType();\n\t\tIField field = type.getField(\"id\");\n\t\t\n\t\tISourceRange sourceRange = field.getNameRange();\n\t\tIJavaElement[] codeSelect = cu.codeSelect(sourceRange.getOffset(), sourceRange.getLength());\n\t\t\n\t\tassertEquals(1, codeSelect.length);\n\t\tassertEquals(field, codeSelect[0]);\n\t}\n}\n"
  },
  {
    "path": "test/eclipse/src/lombok/eclipse/misc/DelegateTest.java",
    "content": "/*\n * Copyright (C) 2024 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.misc;\n\nimport static org.hamcrest.CoreMatchers.*;\nimport static org.junit.Assert.*;\n\nimport org.eclipse.jdt.core.ICompilationUnit;\nimport org.eclipse.jdt.core.IMethod;\nimport org.eclipse.jdt.core.ISourceRange;\nimport org.eclipse.jdt.core.WorkingCopyOwner;\nimport org.junit.Rule;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport lombok.eclipse.EclipseRunner;\nimport lombok.eclipse.SetupSingleFileTest;\n\n@RunWith(EclipseRunner.class)\npublic class DelegateTest {\n\t\n\t@Rule\n\tpublic SetupSingleFileTest setup = new SetupSingleFileTest();\n\t\n\t@Test\n\tpublic void model() throws Exception {\n\t\tICompilationUnit cu = setup.getPackageFragment().getCompilationUnit(\"DelegateModel.java\");\n\t\t\n\t\tWorkingCopyOwner workingCopyOwner = new WorkingCopyOwner() {};\n\t\tICompilationUnit workingCopy = cu.getWorkingCopy(workingCopyOwner, null);\n\t\ttry {\n\t\t\tworkingCopy.reconcile(ICompilationUnit.NO_AST, true, true, workingCopy.getOwner(), null);\n\t\t\t\n\t\t\tassertThat(workingCopy.findPrimaryType().getMethods().length, is(not(0)));\n\t\t\t\n\t\t\tIMethod runMethod = workingCopy.findPrimaryType().getMethods()[0];\n\t\t\tassertEquals(runMethod.getElementName(), \"run\");\n\t\t\t\n\t\t\tISourceRange sourceRange = runMethod.getSourceRange();\n\t\t\tassertNotNull(sourceRange);\n\t\t\tassertEquals(sourceRange.getOffset(), 84);\n\t\t\tassertEquals(sourceRange.getLength(), 9);\n\t\t} finally {\n\t\t\tworkingCopy.discardWorkingCopy();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/eclipse/src/lombok/eclipse/misc/JavadocTest.java",
    "content": "/*\n * Copyright (C) 2024 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.misc;\n\nimport static org.junit.Assert.assertThat;\n\nimport org.eclipse.jdt.core.ICompilationUnit;\nimport org.eclipse.jdt.core.IJavaElement;\nimport org.eclipse.jdt.internal.ui.text.javadoc.JavadocContentAccess2;\nimport org.hamcrest.CoreMatchers;\nimport org.junit.Rule;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport lombok.eclipse.EclipseRunner;\nimport lombok.eclipse.SetupSingleFileTest;\n\n@RunWith(EclipseRunner.class)\npublic class JavadocTest {\n\t\n\t@Rule\n\tpublic SetupSingleFileTest setup = new SetupSingleFileTest();\n\t\n\t@Test\n\tpublic void getterSetter() throws Exception {\n\t\tICompilationUnit cu = setup.getPackageFragment().getCompilationUnit(\"Javadoc.java\");\n\t\t\n\t\tIJavaElement getterInvocation = cu.codeSelect(306, 0)[0];\n\t\tString getterHtmlContent = JavadocContentAccess2.getHTMLContent(getterInvocation, true);\n\t\tassertThat(getterHtmlContent, CoreMatchers.containsString(\"Getter section\"));\n\t\tassertThat(getterHtmlContent, CoreMatchers.containsString(\"Returns:\"));\n\t\tassertThat(getterHtmlContent, CoreMatchers.containsString(\"Sky is blue3\"));\n\t\t\n\t\tIJavaElement setterInvocation = cu.codeSelect(320, 0)[0];\n\t\tString setterHtmlContent = JavadocContentAccess2.getHTMLContent(setterInvocation, true);\n\t\tassertThat(setterHtmlContent, CoreMatchers.containsString(\"Setter section\"));\n\t\tassertThat(setterHtmlContent, CoreMatchers.containsString(\"Parameters:\"));\n\t\tassertThat(setterHtmlContent, CoreMatchers.containsString(\"fieldName\"));\n\t\tassertThat(setterHtmlContent, CoreMatchers.containsString(\"Hello, World3\"));\n\t\tassertThat(setterHtmlContent, CoreMatchers.containsString(\"field\"));\n\t}\n}\n"
  },
  {
    "path": "test/eclipse/src/lombok/eclipse/refactoring/ExtractInterfaceTest.java",
    "content": "/*\n * Copyright (C) 2022 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.refactoring;\n\nimport static lombok.eclipse.RefactoringUtils.performRefactoring;\n\nimport org.eclipse.jdt.core.ICompilationUnit;\nimport org.eclipse.jdt.core.IType;\nimport org.eclipse.jdt.internal.corext.refactoring.structure.ExtractInterfaceProcessor;\nimport org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;\nimport org.junit.Rule;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport lombok.eclipse.EclipseRunner;\nimport lombok.eclipse.SetupBeforeAfterTest;\n\n@RunWith(EclipseRunner.class)\npublic class ExtractInterfaceTest {\n\t\n\t@Rule\n\tpublic SetupBeforeAfterTest setup = new SetupBeforeAfterTest();\n\t\n\t@Test\n\tpublic void simple() throws Exception {\n\t\tICompilationUnit cu = setup.getPackageFragment().getCompilationUnit(\"A.java\");\n\t\tIType type = cu.findPrimaryType();\n\t\t\n\t\tExtractInterfaceProcessor extractInterfaceProcessor = new ExtractInterfaceProcessor(type, JavaPreferencesSettings.getCodeGenerationSettings(setup.getJavaProject()));\n\t\textractInterfaceProcessor.setExtractedMembers(type.getMethods());\n\t\textractInterfaceProcessor.setTypeName(\"Interface\");\n\t\t\n\t\tperformRefactoring(extractInterfaceProcessor);\n\t}\n\t\n\t@Test\n\tpublic void usage() throws Exception {\n\t\tICompilationUnit cu = setup.getPackageFragment().getCompilationUnit(\"A.java\");\n\t\tIType type = cu.findPrimaryType();\n\t\t\n\t\tExtractInterfaceProcessor extractInterfaceProcessor = new ExtractInterfaceProcessor(type, JavaPreferencesSettings.getCodeGenerationSettings(setup.getJavaProject()));\n\t\textractInterfaceProcessor.setExtractedMembers(type.getMethods());\n\t\textractInterfaceProcessor.setTypeName(\"Interface\");\n\t\textractInterfaceProcessor.setReplace(true);\n\t\t\n\t\tperformRefactoring(extractInterfaceProcessor);\n\t}\n\t\n}\n"
  },
  {
    "path": "test/eclipse/src/lombok/eclipse/refactoring/ExtractVariableTest.java",
    "content": "/*\n * Copyright (C) 2024 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.refactoring;\n\nimport static lombok.eclipse.RefactoringUtils.performRefactoring;\n\nimport org.eclipse.jdt.core.ICompilationUnit;\nimport org.eclipse.jdt.core.dom.CompilationUnit;\nimport org.eclipse.jdt.internal.corext.refactoring.code.ExtractTempRefactoring;\nimport org.eclipse.jdt.internal.corext.refactoring.util.RefactoringASTParser;\nimport org.eclipse.jdt.internal.ui.javaeditor.ASTProvider;\nimport org.junit.Rule;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport lombok.eclipse.EclipseRunner;\nimport lombok.eclipse.SetupBeforeAfterTest;\n\n@RunWith(EclipseRunner.class)\npublic class ExtractVariableTest {\n\t\n\t@Rule\n\tpublic SetupBeforeAfterTest setup = new SetupBeforeAfterTest();\n\n\t@Test\n\tpublic void single() throws Exception {\n\t\tICompilationUnit cu = setup.getPackageFragment().getCompilationUnit(\"A.java\");\n\t\t\n\t\tCompilationUnit compilationUnit = new RefactoringASTParser(ASTProvider.SHARED_AST_LEVEL).parse(cu, true);\n\t\t\n\t\tExtractTempRefactoring extractTempRefactoring = new ExtractTempRefactoring(compilationUnit, 121, 11);\n\t\textractTempRefactoring.setTempName(\"temp\");\n\t\tperformRefactoring(extractTempRefactoring);\n\t}\n\n\t@Test\n\tpublic void multiple() throws Exception {\n\t\tICompilationUnit cu = setup.getPackageFragment().getCompilationUnit(\"A.java\");\n\t\t\n\t\tCompilationUnit compilationUnit = new RefactoringASTParser(ASTProvider.SHARED_AST_LEVEL).parse(cu, true);\n\t\t\n\t\tExtractTempRefactoring extractTempRefactoring = new ExtractTempRefactoring(compilationUnit, 167, 11);\n\t\textractTempRefactoring.setTempName(\"temp\");\n\t\tperformRefactoring(extractTempRefactoring);\n\t}\n}\n"
  },
  {
    "path": "test/eclipse/src/lombok/eclipse/refactoring/InlineTest.java",
    "content": "/*\n * Copyright (C) 2023 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.refactoring;\n\nimport static lombok.eclipse.RefactoringUtils.performRefactoring;\n\nimport org.eclipse.jdt.core.ICompilationUnit;\nimport org.eclipse.jdt.core.dom.CompilationUnit;\nimport org.eclipse.jdt.internal.corext.refactoring.code.InlineMethodRefactoring;\nimport org.eclipse.jdt.internal.corext.refactoring.util.RefactoringASTParser;\nimport org.eclipse.jdt.internal.ui.javaeditor.ASTProvider;\nimport org.junit.Rule;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport lombok.eclipse.EclipseRunner;\nimport lombok.eclipse.SetupBeforeAfterTest;\n\n@RunWith(EclipseRunner.class)\npublic class InlineTest {\n\t\n\t@Rule\n\tpublic SetupBeforeAfterTest setup = new SetupBeforeAfterTest();\n\t\n\t@Test\n\tpublic void getter() throws Exception {\n\t\tICompilationUnit cu = setup.getPackageFragment().getCompilationUnit(\"InlineGetter.java\");\n\t\t\n\t\tCompilationUnit compilationUnit = new RefactoringASTParser(ASTProvider.SHARED_AST_LEVEL).parse(cu, true);\n\t\t\n\t\tperformRefactoring(InlineMethodRefactoring.create(cu, compilationUnit, 139, 0));\n\t\tperformRefactoring(InlineMethodRefactoring.create(cu, compilationUnit, 200, 0));\n\t}\n\t\n\t@Test\n\tpublic void setter() throws Exception {\n\t\tICompilationUnit cu = setup.getPackageFragment().getCompilationUnit(\"InlineSetter.java\");\n\t\t\n\t\tCompilationUnit compilationUnit = new RefactoringASTParser(ASTProvider.SHARED_AST_LEVEL).parse(cu, true);\n\t\t\n\t\tperformRefactoring(InlineMethodRefactoring.create(cu, compilationUnit, 126, 0));\n\t}\n}\n"
  },
  {
    "path": "test/eclipse/src/lombok/eclipse/refactoring/RenameTest.java",
    "content": "/*\n * Copyright (C) 2022-2023 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.refactoring;\n\nimport static lombok.eclipse.RefactoringUtils.performRefactoring;\n\nimport org.eclipse.jdt.core.ICompilationUnit;\nimport org.eclipse.jdt.core.IField;\nimport org.eclipse.jdt.core.IMethod;\nimport org.eclipse.jdt.core.IType;\nimport org.eclipse.jdt.internal.corext.refactoring.rename.RenameFieldProcessor;\nimport org.eclipse.jdt.internal.corext.refactoring.rename.RenameMethodProcessor;\nimport org.eclipse.jdt.internal.corext.refactoring.rename.RenameNonVirtualMethodProcessor;\nimport org.junit.Rule;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport lombok.eclipse.EclipseRunner;\nimport lombok.eclipse.SetupBeforeAfterTest;\n\n@RunWith(EclipseRunner.class)\npublic class RenameTest {\n\t\n\t@Rule\n\tpublic SetupBeforeAfterTest setup = new SetupBeforeAfterTest();\n//\t\n\t@Test\n\tpublic void simple() throws Exception {\n\t\tICompilationUnit cu = setup.getPackageFragment().getCompilationUnit(\"A.java\");\n\t\tIType type = cu.findPrimaryType();\n\t\tIField field = type.getField(\"string\");\n\t\t\n\t\tRenameFieldProcessor renameFieldProcessor = new RenameFieldProcessor(field);\n\t\trenameFieldProcessor.setNewElementName(\"newString\");\n\t\trenameFieldProcessor.setRenameGetter(true);\n\t\trenameFieldProcessor.setRenameSetter(true);\n\t\t\n\t\tperformRefactoring(renameFieldProcessor);\n\t}\n\t\n\t@Test\n\tpublic void withGetter() throws Exception {\n\t\tICompilationUnit cu = setup.getPackageFragment().getCompilationUnit(\"A.java\");\n\t\tIType type = cu.findPrimaryType();\n\t\tIField field = type.getField(\"string\");\n\t\t\n\t\tRenameFieldProcessor renameFieldProcessor = new RenameFieldProcessor(field);\n\t\trenameFieldProcessor.setNewElementName(\"newString\");\n\t\trenameFieldProcessor.setRenameGetter(true);\n\t\t\n\t\tperformRefactoring(renameFieldProcessor);\n\t}\n\t\n\t@Test\n\tpublic void withGetterDifferentFile() throws Exception {\n\t\tICompilationUnit cu = setup.getPackageFragment().getCompilationUnit(\"A.java\");\n\t\tIType type = cu.findPrimaryType();\n\t\tIField field = type.getField(\"string\");\n\t\t\n\t\tRenameFieldProcessor renameFieldProcessor = new RenameFieldProcessor(field);\n\t\trenameFieldProcessor.setNewElementName(\"newString\");\n\t\trenameFieldProcessor.setRenameGetter(true);\n\t\t\n\t\tperformRefactoring(renameFieldProcessor);\n\t}\n\t\n\t@Test\n\tpublic void builderField() throws Exception {\n\t\tICompilationUnit cu = setup.getPackageFragment().getCompilationUnit(\"A.java\");\n\t\tIType type = cu.findPrimaryType();\n\t\tIField field = type.getField(\"string\");\n\t\t\n\t\tRenameFieldProcessor renameFieldProcessor = new RenameFieldProcessor(field);\n\t\trenameFieldProcessor.setNewElementName(\"newString\");\n\t\t\n\t\tperformRefactoring(renameFieldProcessor);\n\t}\n\t\n\t@Test\n\tpublic void extensionMethod() throws Exception {\n\t\tICompilationUnit cu = setup.getPackageFragment().getCompilationUnit(\"Extension.java\");\n\t\tIType type = cu.findPrimaryType();\n\t\tIMethod method = type.getMethods()[0];\n\t\t\n\t\tRenameMethodProcessor renameMethodProcessor = new RenameNonVirtualMethodProcessor(method);\n\t\trenameMethodProcessor.setNewElementName(\"newTest\");\n\t\t\n\t\tperformRefactoring(renameMethodProcessor);\n\t}\n\t\n\t@Test\n\tpublic void data() throws Exception {\n\t\tICompilationUnit cu = setup.getPackageFragment().getCompilationUnit(\"A.java\");\n\t\tIType type = cu.findPrimaryType();\n\t\tIField field = type.getField(\"string\");\n\t\t\n\t\tRenameFieldProcessor renameFieldProcessor = new RenameFieldProcessor(field);\n\t\trenameFieldProcessor.setNewElementName(\"newString\");\n\t\trenameFieldProcessor.setRenameGetter(true);\n\t\trenameFieldProcessor.setRenameSetter(true);\n\t\t\n\t\tperformRefactoring(renameFieldProcessor);\n\t}\n\t\n\t@Test\n\tpublic void nestedClass() throws Exception {\n\t\tICompilationUnit cu = setup.getPackageFragment().getCompilationUnit(\"A.java\");\n\t\tIType type = cu.findPrimaryType();\n\t\tIType nestedType = type.getType(\"Nested\");\n\t\tIField field = nestedType.getField(\"string\");\n\t\t\n\t\tRenameFieldProcessor renameFieldProcessor = new RenameFieldProcessor(field);\n\t\trenameFieldProcessor.setNewElementName(\"newString\");\n\t\trenameFieldProcessor.setRenameGetter(true);\n\t\trenameFieldProcessor.setRenameSetter(true);\n\t\t\n\t\tperformRefactoring(renameFieldProcessor);\n\t}\n}\n"
  },
  {
    "path": "test/eclipse/src/lombok/eclipse/references/FindReferencesTest.java",
    "content": "/*\n * Copyright (C) 2023 The Project Lombok Authors.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.eclipse.references;\n\nimport static org.junit.Assert.*;\n\nimport java.util.List;\n\nimport org.eclipse.core.runtime.CoreException;\nimport org.eclipse.jdt.core.ICompilationUnit;\nimport org.eclipse.jdt.core.IJavaElement;\nimport org.eclipse.jdt.core.IType;\nimport org.eclipse.jdt.core.JavaModelException;\nimport org.eclipse.jdt.core.search.IJavaSearchConstants;\nimport org.eclipse.jdt.core.search.SearchEngine;\nimport org.eclipse.jdt.core.search.SearchMatch;\nimport org.eclipse.jdt.core.search.SearchParticipant;\nimport org.eclipse.jdt.core.search.SearchPattern;\nimport org.eclipse.jdt.internal.corext.refactoring.CollectingSearchRequestor;\nimport org.junit.Rule;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport lombok.eclipse.EclipseRunner;\nimport lombok.eclipse.SetupSingleFileTest;\n\n@RunWith(EclipseRunner.class)\npublic class FindReferencesTest {\n\t\n\t@Rule\n\tpublic SetupSingleFileTest setup = new SetupSingleFileTest();\n\t\n\t@Test\n\tpublic void extensionMethod() throws Exception {\n\t\tICompilationUnit extensionCu = setup.getPackageFragment().getCompilationUnit(\"Extension.java\");\n\t\tIType type = extensionCu.findPrimaryType();\n\t\tList<SearchMatch> firstResult = searchInProject(type.getMethods()[0]);\n\t\tassertEquals(firstResult.size(), 2);\n\t\t\n\t\tICompilationUnit usageCu = setup.getPackageFragment().getCompilationUnit(\"Usage.java\");\n\t\tList<SearchMatch> secondResult = searchInProject(usageCu.codeSelect(170, 0)[0]);\n\t\tassertEquals(secondResult.size(), 2);\n\t}\n\n\tprivate List<SearchMatch> searchInProject(IJavaElement element) throws CoreException, JavaModelException {\n\t\tCollectingSearchRequestor requestor = new CollectingSearchRequestor();\n\t\tSearchEngine engine = new SearchEngine();\n\t\tengine.search(\n\t\t\tSearchPattern.createPattern(element, IJavaSearchConstants.ALL_OCCURRENCES, SearchPattern.R_EXACT_MATCH), \n\t\t\tnew SearchParticipant[] { SearchEngine.getDefaultSearchParticipant() }, \n\t\t\tSearchEngine.createJavaSearchScope(new IJavaElement[] { setup.getJavaProject() }), \n\t\t\trequestor, \n\t\t\tnull\n\t\t);\n\t\t\n\t\treturn requestor.getResults();\n\t}\n}\n"
  },
  {
    "path": "test/manual/about.txt",
    "content": "This directory contains test cases which must be manually run. The aim is to get these automated as unit tests, but, walk before you can run.\n"
  },
  {
    "path": "test/manual/compileTests/.gitignore",
    "content": "/out\n"
  },
  {
    "path": "test/manual/compileTests/runTests.sh",
    "content": "#!/bin/sh\nset -e\necho 'This will compile a selection of files in test/transform/resource/before. If the compilation works without error, lombok is working as designed.'\n\nmkdir -p out/\n\n# list of files to iterate over\nFILES=\"UtilityClassInner.java\"\nBASE_PATH=\"../../../test/transform/resource/before\"\nLOMBOK_JAR=\"../../../dist/lombok.jar\"\n\n# compile all files in list\nfor f in $FILES\ndo\n  \n  echo \"Compiling $f\"\n  javac -processorpath $LOMBOK_JAR -cp $LOMBOK_JAR -d out/ $BASE_PATH/$f\ndone\n\nrm -rf out/\n"
  },
  {
    "path": "test/manual/delombokAntTask/.gitignore",
    "content": "/tgt\n\n"
  },
  {
    "path": "test/manual/delombokAntTask/build.xml",
    "content": "<project name=\"delombokAntTest\" default=\"delombok\">\n\t<target name=\"delombok\">\n\t\t<taskdef classname=\"lombok.delombok.ant.Tasks$Delombok\" classpath=\"../../../dist/lombok.jar\" name=\"delombok\" />\n\t\t<mkdir dir=\"tgt\" />\n\t\t<delombok verbose=\"true\" encoding=\"UTF-8\" to=\"tgt\" from=\"src\">\n\t\t\t<format value=\"suppressWarnings:skip\" />\n\t\t</delombok>\n\t</target>\n</project>\n\n"
  },
  {
    "path": "test/manual/delombokAntTask/src/Test.java",
    "content": "@lombok.Builder @lombok.Value\npublic class Test {\n\tString hello;\n\tint world;\n}\n"
  },
  {
    "path": "test/manual/knownIssue-1976_2138-valPlusDelegateVsEclipseErrors/about.txt",
    "content": "PullRequest https://github.com/projectlombok/lombok/pull/2114 tries to fix issue https://github.com/projectlombok/lombok/issues/1976 but causes problems.\n\nThe problem is that the fail-fast resolver applied by PR 2114 causes the following issue:\n\nGiven:\n\nA.java:\n\n\tpublic class A {\n\t\tinterface Inner {\n\t\t\tdefault void example() {\n\t\t\t\tlombok.val v = doesNotExist();\n\t\t\t}\n\t\t}\n\tB b = new B();\n\t}\n\nB.java:\n\n\timport com.foo.pkg.A.Inner;\n\n\tpublic class B implements Inner {\n\t\tvoid foo() {\n\t\t\tlombok.val v = doesNotExist();\n\t\t}\n\t}\n\nwill cause A.java to be parsed such that nothing in it exists, in turn causing B to consider A.Inner to not exist at all,\neven though the error on the 'implements Inner' line offers 'import Inner' as a quickfix. This quickfix won't, obviously, fix it.\n\nIn addition, enough 'A refers to B refers to A' loops with errors like this and eclipse 2019-06 will eventually run out of heap and crash.\n\nThe key commit that attempts to fix 1976 but causes the above issue is commit 089f2ec5f45567c8c12e9d13bf9be8fa5c107c18.\n\nThe commit that undoes this, re-introducing 1976 but avoiding the problem above, is commit 877a169727a4c8078c43a4465929247c3390c897.\n"
  },
  {
    "path": "test/manual/moduleBasedMultiProject/.gitignore",
    "content": "/out\n"
  },
  {
    "path": "test/manual/moduleBasedMultiProject/projA/module-info.java",
    "content": "module projA {\n\trequires static lombok;\n\texports pkgA;\n}\n"
  },
  {
    "path": "test/manual/moduleBasedMultiProject/projA/pkgA/ClassA.java",
    "content": "package pkgA;\n\npublic class ClassA {\n\t@lombok.Getter private String hello = \"hello\";\n}\n"
  },
  {
    "path": "test/manual/moduleBasedMultiProject/projB/module-info.java",
    "content": "module projB {\n\trequires static lombok;\n\trequires projA;\n}\n\n"
  },
  {
    "path": "test/manual/moduleBasedMultiProject/projB/pkgB/ClassB.java",
    "content": "import lombok.Getter;\nimport pkgA.ClassA;\n\npublic class ClassB {\n\t@Getter private String world = \"world\";\n\tpublic void test() {\n\t\tnew ClassA().getHello();\n\t\tgetWorld();\n\t}\n}\n"
  },
  {
    "path": "test/manual/moduleBasedMultiProject/runTests",
    "content": "#!/bin/sh\necho 'This will build, module-style, 2 modules with lombok dependencies. If the compilation works without error or warning, lombok is working as designed.'\nmkdir -p out/projA\nmkdir -p out/projB\njavac --processor-path ../../../dist/lombok.jar -p ../../../dist/lombok.jar -d out/projA projA/module-info.java projA/pkgA/ClassA.java\njavac --processor-path ../../../dist/lombok.jar -p ../../../dist/lombok.jar:out/projA -d out/projB projB/module-info.java projB/pkgB/ClassB.java\n\necho Now we try to delombok and see if it works as designed.\n\njava -jar ../../../dist/lombok.jar delombok -p --module-path out/projA projB/pkgB/ClassB.java projB/module-info.java\n"
  },
  {
    "path": "test/pretty/resource/after/Annotation.java",
    "content": "@SuppressWarnings(\"all\")\nclass Annotation {\n\t@Override\n\tpublic String toString() {\n\t\treturn super.toString();\n\t}\n\tpublic void method(@SuppressWarnings(\"unused\") int x) {\n\t}\n\tpublic void method2(@SuppressWarnings({\"unused\"}) int y) {\n\t}\n\tpublic void method3(@SuppressWarnings({\"unused\", \"unchecked\"}) int z) {\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/after/ArrayAndVarargs.java",
    "content": "import java.util.List;\nclass ArrayAndVarargs {\n\tvoid test(List<String[]>... foo) {\n\t}\n\tvoid test2(byte[]... foo) {\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/after/Cast.java",
    "content": "import java.util.*;\npublic class Cast {\n\tpublic void test(List<?> list) {\n\t\tRandomAccess r = (/*before*/ RandomAccess /*after*/) list;\n\t}\n}"
  },
  {
    "path": "test/pretty/resource/after/CastWithIntersection.java",
    "content": "import java.util.*;\npublic class CastWithIntersection {\n\tpublic void test(List<?> list) {\n\t\tRandomAccess r = (RandomAccess & java.io.Serializable) list;\n\t}\n}"
  },
  {
    "path": "test/pretty/resource/after/CompactSourceFile.java",
    "content": "void main() {\n\tIO.print(\"This is valid java as of JDK25\");\n}\n"
  },
  {
    "path": "test/pretty/resource/after/DefaultMethod.java",
    "content": "interface DefaultMethod {\n\tint size();\n\tdefault boolean isEmpty() {\n\t\treturn size() == 0;\n\t}\n\tstrictfp default void run() {\n\t}\n}"
  },
  {
    "path": "test/pretty/resource/after/Enum.java",
    "content": "enum Ranks {\n\tCLUBS, HEARTS, DIAMONDS, SPADES;\n}\nenum Complex {\n\tRED(\"ff0000\"), GREEN(\"00ff00\"), BLUE(\"0000f\");\n\tprivate final String webColour;\n\tComplex(String webColour) {\n\t\tthis.webColour = webColour;\n\t}\n\tpublic String getWebColour() {\n\t\treturn webColour;\n\t}\n}\nenum Complexer {\n\tRED {\n\t\tpublic void foo() {\n\t\t}\n\t\tpublic void bar() {\n\t\t}\n\t},\n\tGREEN(\"foo\") {\n\t\tpublic void foo() {\n\t\t}\n\t};\n\tpublic abstract void foo();\n\tComplexer(String colour) {\n\t}\n\tComplexer() {\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/after/ExoticJava.java",
    "content": "import static java.lang.String.*;\nimport java.io.*;\nclass ExoticJava<V> {\n\tpublic <T> ExoticJava(T genericsInConstructor, V genericsInType) {\n\t\tSystem.out.println(new <String>ExoticJava<Integer>(\"Hello\", 5));\n\t}\n\tpublic void test() {\n\t\tint x = 5;\n\t\tint[] y = {10};\n\t\t;\n\t\tclass MethodLocal implements Serializable, java.util.RandomAccess {\n\t\t\t@SuppressWarnings({\"unchecked\", \"rawtypes\"})\n\t\t\tpublic final strictfp int foo() {\n\t\t\t\tint x = super.hashCode();\n\t\t\t\tx <<= 5;\n\t\t\t\tdo {\n\t\t\t\t\tx <<= 5;\n\t\t\t\t} while (Boolean.FALSE);\n\t\t\t\treturn x;\n\t\t\t}\n\t\t}\n\t\tfor (int i = 10, j[] = {20}; i < 5; i++, j[0]++) {\n\t\t\tString z = \"\";\n\t\t\ttry (\n\t\t\t\tPrintWriter pw = new PrintWriter(System.out);\n\t\t\t\tPrintWriter p2 = new PrintWriter(System.out)) {\n\t\t\t\tpw.println();\n\t\t\t} finally {\n\t\t\t\tsynchronized (z) {\n\t\t\t\t\tSystem.out.println(z);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ((y == null)) {\n\t\t\t}\n\t\t\tif (((y == null))) ;\n\t\t\t{\n\t\t\t\t;\n\t\t\t}\n\t\t\tjava.util.List<String> list = new java.util.ArrayList<>();\n\t\t\tassert Boolean.TRUE : \"That\\'s weird\";\n\t\t\tdouble d = -1.8E12;\n\t\t\tlong loooong = 305441741;\n\t\t\tint octal = 87;\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/pretty/resource/after/ForEach.java",
    "content": "import java.util.Arrays;\npublic class ForEach {\n\t{\n\t\tfor (int i : Arrays.asList(1, 2, 3)) {\n\t\t\tSystem.out.println(i);\n\t\t\t// Do something\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/after/ForLoop.java",
    "content": "public class ForLoop {\n\tpublic static void main(String[] args) {\n\t\t// before loop\n\t\tfor (int i = 0; i < 10; i++) {\n\t\t\t// start of block\n\t\t\tSystem.out.println(i);\n\t\t\t// end of block\n\t\t}\n\t\t// after loop\n\t}\n\t\n\t{\n\t\tint i;\n\t\tfor (i = 0; i < 10; i++) {\n\t\t\tSystem.out.println(i);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/after/Interfaces.java",
    "content": "@SuppressWarnings(\"all\")\ninterface Interfaces {\n\tenum Ranks {\n\t\tCLUBS, HEARTS, DIAMONDS, SPADES;\n\t}\n\tint x = 10;\n\tvoid y();\n\tint a = 20;\n\tvoid b();\n}\n"
  },
  {
    "path": "test/pretty/resource/after/Java11Var.java",
    "content": "public class Java11Var {\n\tpublic void test() {\n\t\tvar b = 10;\n\t\tint c = 11;\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/after/Javadoc.java",
    "content": "/**\n * Block comment\n */\nclass BlockComment {\n\t/**\n\t * Method\n\t */\n\tprivate void test() {\n\t}\n}\n/// Markdown\n/// Comment\nclass MarkdownComment {\n\t/// Method\n\tprivate void test() {\n\t}\n}"
  },
  {
    "path": "test/pretty/resource/after/Lambda.java",
    "content": "public class Lambda {\n\tRunnable r = () -> System.out.println();\n\tjava.util.Comparator<Integer> c1 = (a, b) -> a - b;\n\tjava.util.Comparator<Integer> c2 = (Integer a, Integer b) -> {\n\t\treturn a - b;\n\t};\n\tjava.util.function.Function<String, String> fnc = (String c) -> c;\n\tvoid testLambdaInArgsList(String name, java.util.function.Function<String, String> f) {\n\t}\n\tvoid testLambdaInArgsList2(java.util.function.Function<String, String> f, String name) {\n\t}\n\tvoid test() {\n\t\ttestLambdaInArgsList(\"hello\", (String c) -> c);\n\t\ttestLambdaInArgsList(\"hello\", c -> c);\n\t\ttestLambdaInArgsList2((String c) -> c, \"hello\");\n\t\ttestLambdaInArgsList2(c -> c, \"hello\");\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/after/MethodReference.java",
    "content": "class MethodReference {\n\tpublic MethodReference() {\n\t}\n\tpublic <T> MethodReference(T in) {\n\t}\n\tpublic void simpleInstanceReference() {\n\t\tRunnable r = this::foo;\n\t}\n\tpublic void simpleConstructorReference() {\n\t\tRunnable r = MethodReference::new;\n\t}\n\tpublic void simpleStaticReference() {\n\t\tRunnable r = MethodReference::staticFoo;\n\t}\n\tpublic void generifiedStaticReference() {\n\t\tStringConverter sc = MethodReference::<String>generifiedStaticFoo;\n\t}\n\tpublic void generifiedConstructorReference() {\n\t\tFooConverter<MethodReference> fc = MethodReference::<String>new;\n\t}\n\tpublic void foo() {\n\t}\n\tprivate static void staticFoo() {\n\t}\n\tpublic static <T> T generifiedStaticFoo(T foo) {\n\t\treturn foo;\n\t}\n\t@FunctionalInterface\n\tpublic interface StringConverter {\n\t\tString hello(String x);\n\t}\n\t@FunctionalInterface\n\tpublic interface FooConverter<K> {\n\t\tK hello(String x);\n\t}\n}"
  },
  {
    "path": "test/pretty/resource/after/ModuleImport.java",
    "content": "import module java.base;\n\npublic class ModuleImport {\n}\n"
  },
  {
    "path": "test/pretty/resource/after/MultiCatch.java",
    "content": "public class MultiCatch {\n\tpublic void test() {\n\t\ttry {\n\t\t\tSystem.out.println();\n\t\t} catch (IllegalArgumentException | IllegalStateException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/pretty/resource/after/PatternInstanceOf.java",
    "content": "public class PatternInstanceOf {\n\tpublic void foo(Object o) {\n\t\tif (o instanceof String y) {\n\t\t\tSystem.out.println(y);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/after/Record.java",
    "content": "public record Record<T>(T field) implements Cloneable {\n\t\n}"
  },
  {
    "path": "test/pretty/resource/after/RecordPattern19.java",
    "content": "record Point(int x, int y) {\n}\nrecord Rectangle(Point upperLeft, Point lowerRight) {\n}\n\npublic class RecordPattern19 {\n\tvoid recordPattern(Object o) {\n\t\tif (o instanceof Point(int x, int y)) {\n\t\t}\n\t\tif (o instanceof Point(int x, int y) p) {\n\t\t}\n\t\tif (o instanceof Rectangle(Point(var x1, var y1), Point(int x2, int y2))) {\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/pretty/resource/after/RecordPattern20.java",
    "content": "record Point(int x, int y) {\n}\nrecord Rectangle(Point upperLeft, Point lowerRight) {\n}\n\npublic class RecordPattern20 {\n\tvoid recordPattern(Object o) {\n\t\tif (o instanceof Point(int x, int y)) {\n\t\t}\n\t\tif (o instanceof Rectangle(Point(var x1, var y1), Point(int x2, int y2))) {\n\t\t}\n\t}\n\n\tvoid forEachSimple(Point[] pointArray) {\n\t\tfor (Point(var x, var y) : pointArray) {\n\t\t}\n\t}\n\tvoid forEachNested(Rectangle[] rectangleArray) {\n\t\tfor (Rectangle(Point(var x1, var y1), Point p) : rectangleArray) {\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/pretty/resource/after/RecordPattern21.java",
    "content": "record Point(int x, int y) {\n}\nrecord Rectangle(Point upperLeft, Point lowerRight) {\n}\n\npublic class RecordPattern21 {\n\tvoid recordPattern(Object o) {\n\t\tif (o instanceof Point(int x, int y)) {\n\t\t}\n\t\tif (o instanceof Rectangle(Point(var x1, var y1), Point(int x2, int y2))) {\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/pretty/resource/after/Sealed.java",
    "content": "public class Sealed {\n\tpublic abstract sealed class Parent permits Child1, Child2 {\n\t}\n\n\tpublic final class Child1 extends Parent {\n\t}\n\n\tpublic abstract non-sealed class Child2 extends Parent {\n\t}\n\n\tpublic sealed interface SealedInterface permits ChildInterface1 {\n\t}\n\n\tpublic non-sealed interface ChildInterface1 extends SealedInterface {\n\t}\n}"
  },
  {
    "path": "test/pretty/resource/after/Switch11.java",
    "content": "public class Switch11 {\n\tpublic void basic() {\n\t\tswitch (5) {\n\t\tcase 1: \n\t\tcase 2: \n\t\t\tSystem.out.println(\"OK\");\n\t\t\tbreak;\n\t\tdefault: \n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/after/Switch12.java",
    "content": "public class Switch12 {\n\tpublic void basic() {\n\t\tswitch (5) {\n\t\tcase 1: \n\t\tcase 2: \n\t\t\tSystem.out.println(\"OK\");\n\t\t\tbreak;\n\t\tdefault: \n\t\t}\n\t}\n\tpublic void multiCase() {\n\t\tswitch (5) {\n\t\tcase 1, 2: \n\t\t\tSystem.out.println(\"OK\");\n\t\tdefault: \n\t\t}\n\t}\n\n\tpublic int switchExpr() {\n\t\treturn switch (5) {\n\t\t\tcase 1, 2 -> 0;\n\t\t\tcase 3 -> {\n\t\t\t\tbreak 10;\n\t\t\t}\n\t\t\tdefault -> 10;\n\t\t} + 10;\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/after/Switch13.java",
    "content": "public class Switch13 {\n\tpublic void basic() {\n\t\tswitch (5) {\n\t\tcase 1: \n\t\tcase 2: \n\t\t\tSystem.out.println(\"OK\");\n\t\t\tbreak;\n\t\tdefault: \n\t\t}\n\t}\n\n\tpublic void multiCase() {\n\t\tswitch (5) {\n\t\tcase 1, 2: \n\t\t\tSystem.out.println(\"OK\");\n\t\tdefault: \n\t\t}\n\t}\n\n\tpublic int switchExpr1() {\n\t\treturn switch (5) {\n\t\t\tcase 1, 2 -> 0;\n\t\t\tcase 3 -> {\n\t\t\t\tyield 10;\n\t\t\t}\n\t\t\tdefault -> 10;\n\t\t} + 10;\n\t}\n\n\tpublic int switchExpr2() {\n\t\treturn switch (5) {\n\t\tcase 1, 2: \n\t\t\tSystem.out.println(\"Hello\");\n\t\tcase 3: \n\t\t\tyield 10;\n\t\tdefault: \n\t\t\tyield 20;\n\t\t} + 10;\n\t}\n\n\tpublic void arrowSwitch() {\n\t\tswitch (5) {\n\t\t\tcase 1, 2 -> System.out.println(\"Hello\");\n\t\t\tcase 3 -> {\n\t\t\t\tSystem.out.println(\"\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic void emptySwitch() {\n\t\tswitch (5) {\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/pretty/resource/after/Switch17.java",
    "content": "public class Switch17 {\n\tString switchPatternMatching(Object o) {\n\t\treturn switch (o) {\n\t\t\tcase Integer i -> String.format(\"int %d\", i);\n\t\t\tcase Long l -> String.format(\"long %d\", l);\n\t\t\tcase Double d -> String.format(\"double %f\", d);\n\t\t\tcase String s -> String.format(\"String %s\", s);\n\t\t\tdefault -> o.toString();\n\t\t};\n\t}\n\n\tString switchNull(Object o) {\n\t\treturn switch (o) {\n\t\t\tcase null, default -> \"?\";\n\t\t};\n\t}\n\n\tString switchGuardPattern(Object o) {\n\t\treturn switch (o) {\n\t\t\tcase String s && s.length() > 1 -> s;\n\t\t\tdefault -> o.toString();\n\t\t};\n\t}\n\n\tString switchParenthesizedPattern(Object o) {\n\t\treturn switch (o) {\n\t\t\tcase (String s) -> s;\n\t\t\tdefault -> o.toString();\n\t\t};\n\t}\n}"
  },
  {
    "path": "test/pretty/resource/after/Switch19.java",
    "content": "public class Switch19 {\n\tString switchPatternMatching(Object o) {\n\t\treturn switch (o) {\n\t\t\tcase Integer i -> String.format(\"int %d\", i);\n\t\t\tcase Long l -> String.format(\"long %d\", l);\n\t\t\tcase Double d -> String.format(\"double %f\", d);\n\t\t\tcase String s -> String.format(\"String %s\", s);\n\t\t\tdefault -> o.toString();\n\t\t};\n\t}\n\n\tString switchNull(Object o) {\n\t\treturn switch (o) {\n\t\t\tcase null, default -> \"?\";\n\t\t};\n\t}\n\n\tString switchGuardPattern(Object o) {\n\t\treturn switch (o) {\n\t\t\tcase String s when s.length() > 1 -> s;\n\t\t\tcase String s -> s;\n\t\t\tdefault -> o.toString();\n\t\t};\n\t}\n\n\tString switchParenthesizedPattern(Object o) {\n\t\treturn switch (o) {\n\t\t\tcase (String s) -> s;\n\t\t\tdefault -> o.toString();\n\t\t};\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/after/Switch21.java",
    "content": "public class Switch21 {\n\tString switchPatternMatching(Object o) {\n\t\treturn switch (o) {\n\t\t\tcase Integer i -> String.format(\"int %d\", i);\n\t\t\tcase Long l -> String.format(\"long %d\", l);\n\t\t\tcase Double d -> String.format(\"double %f\", d);\n\t\t\tcase String s -> String.format(\"String %s\", s);\n\t\t\tdefault -> o.toString();\n\t\t};\n\t}\n\n\tString switchNull(Object o) {\n\t\treturn switch (o) {\n\t\t\tcase null, default -> \"?\";\n\t\t};\n\t}\n\n\tString switchGuardPattern(Object o) {\n\t\treturn switch (o) {\n\t\t\tcase String s when s.length() > 1 -> s;\n\t\t\tcase String s -> s;\n\t\t\tdefault -> o.toString();\n\t\t};\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/after/TextBlocks.java",
    "content": "public class TextBlocks {\n\tprivate String example = \"\"\"\n\t\tThis should not be indented.\n\t\tline 2\n\t\tline 3\n\t\t\"\"\";\n\t\n\tprivate String ex2 = \"\"\"\n\t\t\tThis should be though.\n\t\t\"\"\";\n\t\n\tprivate String ex3 = \"This is a simple\\nstring\";\n\t\n\tprivate String ex4 = \"\"\"\n\t\t\"\"\";\n\t\n\tprivate String bizarroDent = \"\"\"\n\t\tfoo\n\t\t    bar\"\"\" + \"hey\" + \"\"\"\n\t\tweird!\"\"\";\n\t\n\tprivate String stringFolding = \"hmmm\" + \"\"\"\n\t\tline1\n\t\t\tline2\"\"\";\n}\n"
  },
  {
    "path": "test/pretty/resource/after/ThisParameter.java",
    "content": "import java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\nclass ThisParameter {\n\tvoid untagged(ThisParameter this, int i) {\n\t\t// no content\n\t}\n\tvoid sourceTagged(@SourceTagged(\"source\") ThisParameter this) {\n\t\t// no content\n\t}\n\tvoid classTagged(@ClassTagged(\"class\") ThisParameter this) {\n\t\t// no content\n\t}\n\tvoid runtimeTagged(@RuntimeTagged(\"runtime\") ThisParameter this) {\n\t\t// no content\n\t}\n\t@Target(ElementType.TYPE_USE)\n\t@Retention(RetentionPolicy.SOURCE)\n\t@interface SourceTagged {\n\t\tString value();\n\t}\n\t@Target(ElementType.TYPE_USE)\n\t@Retention(RetentionPolicy.CLASS)\n\t@interface ClassTagged {\n\t\tString value();\n\t}\n\t@Target(ElementType.TYPE_USE)\n\t@Retention(RetentionPolicy.RUNTIME)\n\t@interface RuntimeTagged {\n\t\tString value();\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/after/TryWithResources.java",
    "content": "//version 7:\nimport java.io.PrintWriter;\npublic class TryWithResources {\n\t{\n\t\ttry (PrintWriter pw = new PrintWriter(System.out)) {\n\t\t\tpw.println();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/after/TryWithResourcesVarRef.java",
    "content": "import java.io.PrintWriter;\npublic class TryWithResourcesVarRef {\n\t{\n\t\tPrintWriter pw = new PrintWriter(System.out);\n\t\ttry (pw) {\n\t\t\tpw.println();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/after/TypeAnnotations.java",
    "content": "import java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.List;\nimport java.util.Map;\npublic class TypeAnnotations {\n\t@Target({ElementType.TYPE_USE, ElementType.LOCAL_VARIABLE})\n\t@interface Foo {\n\t}\n\t@Target(ElementType.TYPE_USE)\n\t@interface Bar {\n\t}\n\t@Target(ElementType.TYPE_USE)\n\t@interface Baz {\n\t}\n\t@Target(ElementType.TYPE_USE)\n\t@interface Bat {\n\t}\n\tpublic List<@Foo String> test(@Foo String param) {\n\t\t@Bar\n\t\tString local = \"bar\";\n\t\t@Foo\n\t\tjava.io.@Foo File[] array = {};\n\t\treturn new java.util.@Foo ArrayList<java.lang.@Foo String>();\n\t}\n\tpublic <@Foo T extends java.lang.@Foo Number> T test2(@Bar String... varargs) {\n\t\treturn null;\n\t}\n\tpublic void test3(String[][] arg, String[]... arg2) {\n\t\t@Baz\n\t\tString @Bar [] @Foo [] x;\n\t}\n\tpublic void test4(@Foo String @Bar [] @Baz [] @Bat ... y) {\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/after/UnnamedVariables.java",
    "content": "// version 22:\nimport java.util.Arrays;\nimport java.util.Scanner;\nimport java.util.stream.Stream;\n\nrecord Box<T>(T content) {\n}\n\nrecord Pair<T, U>(T first, U second) {\n}\n\npublic class UnnamedVariables {\n\tvoid enhancedLoop() {\n\t\tfor (String _ : Arrays.asList(\"\")) {\n\t\t}\n\t}\n\n\tvoid initializationInForLoop() {\n\t\tfor (int i = 0, _ = Integer.MAX_VALUE; i < 10; i++) {\n\t\t}\n\t}\n\n\tvoid assignment() {\n\t\tvar _ = 1;\n\t}\n\n\tvoid catchBlock() {\n\t\ttry {\n\t\t} catch (Exception _) {\n\t\t}\n\t}\n\n\tvoid tryWithResources() {\n\t\ttry (var _ = new Scanner(\"\")) {\n\t\t}\n\t}\n\n\tvoid lambda() {\n\t\tStream.of(1).forEach(_ -> {\n\t\t});\n\t}\n\n\tObject switchStatement(Object o) {\n\t\treturn switch (o) {\n\t\t\tcase String _, Integer _ -> o;\n\t\t\tcase Long _ -> o;\n\t\t\tdefault -> o;\n\t\t};\n\t}\n\n\tvoid recordPattern(Object o) {\n\t\tif (o instanceof Pair(Box _, Box(Integer _))) {\n\t\t}\n\t\tif (o instanceof Box(String _)) {\n\t\t}\n\t\tif (o instanceof Box(var _)) {\n\t\t}\n\t\tif (o instanceof Box(_)) {\n\t\t}\n\t}\n\n\tObject recordPatternSwitch(Object o) {\n\t\treturn switch (o) {\n\t\t\tcase Box(String _), Box(Integer _) -> o;\n\t\t\tcase Box(Long _) -> o;\n\t\t\tcase Box(_) -> o;\n\t\t\tdefault -> o;\n\t\t};\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/after/WithComments.java",
    "content": "/*\nTry out pretty comments.\n */\npackage test;\n\n// Cool Comments\npublic class WithComments {\n\t// Also inside the body\n// On start of line\n}"
  },
  {
    "path": "test/pretty/resource/before/Annotation.java",
    "content": "@SuppressWarnings(\"all\")\nclass Annotation {\n\t@Override\n\tpublic String toString() {\n\t\treturn super.toString();\n\t}\n\tpublic void method(@SuppressWarnings(\"unused\") int x) {\n\t}\n\tpublic void method2(@SuppressWarnings(value={\"unused\"}) int y) {\n\t}\n\tpublic void method3(@SuppressWarnings({\"unused\", \"unchecked\"}) int z) {\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/before/ArrayAndVarargs.java",
    "content": "import java.util.List;\n\nclass ArrayAndVarargs {\n\tvoid test(List<String[]>... foo) {\n\t}\n\t\n\tvoid test2(byte[]... foo) {\n\t}\n}"
  },
  {
    "path": "test/pretty/resource/before/Cast.java",
    "content": "import java.util.*;\npublic class Cast {\n\tpublic void test(List<?> list) {\n\t\tRandomAccess r = (/*before*/ RandomAccess /*after*/) list;\n\t}\n}"
  },
  {
    "path": "test/pretty/resource/before/CastWithIntersection.java",
    "content": "// version 8:\nimport java.util.*;\npublic class CastWithIntersection {\n\tpublic void test(List<?> list) {\n\t\tRandomAccess r = (RandomAccess & java.io.Serializable) list;\n\t}\n}"
  },
  {
    "path": "test/pretty/resource/before/CompactSourceFile.java",
    "content": "// version 25:\n\nvoid main() {\n\tIO.print(\"This is valid java as of JDK25\");\n}\n"
  },
  {
    "path": "test/pretty/resource/before/DefaultMethod.java",
    "content": "// version 8:\ninterface DefaultMethod {\n\tint size();\n\t\n\tdefault boolean isEmpty() {\n\t\treturn size() == 0;\n\t}\n\t\n\tdefault strictfp void run() {\n\t}\n}"
  },
  {
    "path": "test/pretty/resource/before/Enum.java",
    "content": "enum Ranks {\n\tCLUBS, HEARTS, DIAMONDS, SPADES;;\n}\n\nenum Complex {\n\tRED(\"ff0000\"), GREEN(\"00ff00\"), BLUE(\"0000f\");\n\t\n\tprivate final String webColour;\n\t\n\tComplex(String webColour) {\n\t\tthis.webColour = webColour;\n\t}\n\t\n\tpublic String getWebColour() {\n\t\treturn webColour;\n\t}\n}\n\nenum Complexer {\n\tRED {\n\t\tpublic void foo() {\n\t\t}\n\t\tpublic void bar() {\n\t\t}\n\t},\n\tGREEN(\"foo\") {\n\t\tpublic void foo() {\n\t\t}\n\t};\n\tpublic abstract void foo();\n\tComplexer(String colour) {\n\t}\n\tComplexer() {\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/before/ExoticJava.java",
    "content": "//VERSION 7:\nimport static java.lang.String.*;\n\nimport java.io.*;\n\nclass ExoticJava<V> {\n\tpublic <T> ExoticJava(T genericsInConstructor, V genericsInType) {\n\t\tSystem.out.println(new <String>ExoticJava<Integer>(\"Hello\", 5));\n\t}\n\t;;;;\n\tpublic void test() {\n\t\tint x = 5, y[] = {10};\n\t\t;\n\t\tclass MethodLocal implements Serializable, java.util.RandomAccess {\n\t\t\t@SuppressWarnings({\"unchecked\", \"rawtypes\"})\n\t\t\tstrictfp public final int foo() {\n\t\t\t\tint x = super.hashCode();\n\t\t\t\tx <<= 5;\n\t\t\t\tdo {\n\t\t\t\t\tx <<= 5;\n\t\t\t\t} while (Boolean.FALSE);\n\t\t\t\treturn x;\n\t\t\t}\n\t\t}\n\t\t\n\t\tfor (int i = 10, j[] = {20}; i < 5; i++, j[0]++) {\n\t\t\tString z = \"\";\n\t\t\ttry (PrintWriter pw = new PrintWriter(System.out); PrintWriter p2 = new PrintWriter(System.out)) {\n\t\t\t\tpw.println();\n\t\t\t} finally {\n\t\t\t\tsynchronized (z) {\n\t\t\t\t\tSystem.out.println(z);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif ((y == null)) {}\n\t\t\tif (((y == null))) ;\n\t\t\t{;}\n\t\t\tjava.util.List<String> list = new java.util.ArrayList<>();\n\t\t\tassert Boolean.TRUE : \"That's weird\";\n\t\t\tdouble d = -1.8e12;\n\t\t\tlong loooong = 0x1234ABCD;\n\t\t\tint octal = 0127;\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/pretty/resource/before/ForEach.java",
    "content": "import java.util.Arrays;\npublic class ForEach {\n\t{\n\t\tfor (int i : Arrays.asList(1, 2, 3)) {\n\t\t\tSystem.out.println(i);\n\t\t\t// Do something\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/before/ForLoop.java",
    "content": "public class ForLoop {\n\n\tpublic static void main(String[] args) {\n\t\t// before loop\n\t\tfor (int i = 0; i < 10; i++) {\n\t\t\t// start of block\n\t\t\tSystem.out.println(i);\n\t\t\t// end of block\n\t\t}\n\t\t// after loop\n\t}\n\n\t{\n\t\tint i;\n\t\tfor (i = 0; i < 10; i++) {\n\t\t\tSystem.out.println(i);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/before/Interfaces.java",
    "content": "@SuppressWarnings(\"all\")\ninterface Interfaces {\n\tenum Ranks {\n\t\tCLUBS,\n\t\tHEARTS,\n\t\tDIAMONDS,\n\t\tSPADES;\n\t}\n\t;\n\t;\n\tint x = 10;\n\tvoid y();\n\tpublic static final int a = 20;\n\tpublic abstract void b();\n}\n"
  },
  {
    "path": "test/pretty/resource/before/Java11Var.java",
    "content": "//version 11:\npublic class Java11Var {\n\tpublic void test() {\n\t\tvar b = 10;\n\t\tint c = 11;\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/before/Javadoc.java",
    "content": "/**\n * Block comment\n */\nclass BlockComment {\n\t\n\t/**\n\t * Method\n\t */\n\tprivate void test() {}\n}\n\n/// Markdown\n/// Comment\nclass MarkdownComment {\n\t\n\t/// Method\n\tprivate void test() {}\n\t\n}"
  },
  {
    "path": "test/pretty/resource/before/Lambda.java",
    "content": "// version 8:\npublic class Lambda {\n\tRunnable r = () -> System.out.println();\n\tjava.util.Comparator<Integer> c1 = (a, b) -> a - b;\n\tjava.util.Comparator<Integer> c2 = (Integer a, Integer b) -> {\n\t\treturn a - b;\n\t};\n\tjava.util.function.Function<String, String> fnc = (String c) -> c;\n\t\n\tvoid testLambdaInArgsList(String name, java.util.function.Function<String, String> f) {\n\t\t\n\t}\n\t\n\tvoid testLambdaInArgsList2(java.util.function.Function<String, String> f, String name) {\n\t\t\n\t}\n\t\n\tvoid test() {\n\t\ttestLambdaInArgsList(\"hello\", (String c) -> c);\n\t\ttestLambdaInArgsList(\"hello\", c -> c);\n\t\ttestLambdaInArgsList2((String c) -> c, \"hello\");\n\t\ttestLambdaInArgsList2(c -> c, \"hello\");\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/before/MethodReference.java",
    "content": "// version 8:\nclass MethodReference {\n\tpublic MethodReference() {\n\t}\n\t\n\tpublic <T> MethodReference(T in) {\n\t}\n\t\n\tpublic void simpleInstanceReference() {\n\t\tRunnable r = this::foo;\n\t}\n\t\n\tpublic void simpleConstructorReference() {\n\t\tRunnable r = MethodReference::new;\n\t}\n\t\n\tpublic void simpleStaticReference() {\n\t\tRunnable r = MethodReference::staticFoo;\n\t}\n\t\n\tpublic void generifiedStaticReference() {\n\t\tStringConverter sc = MethodReference::<String>generifiedStaticFoo;\n\t}\n\t\n\tpublic void generifiedConstructorReference() {\n\t\tFooConverter<MethodReference> fc = MethodReference::<String>new;\n\t}\n\t\n\tpublic void foo() {\n\t}\n\t\n\tprivate static void staticFoo() {\n\t}\n\t\n\tpublic static <T> T generifiedStaticFoo(T foo) {\n\t\treturn foo;\n\t}\n\t\n\t@FunctionalInterface\n\tpublic interface StringConverter {\n\t\tpublic String hello(String x);\n\t}\n\t\n\t@FunctionalInterface\n\tpublic interface FooConverter<K> {\n\t\tpublic K hello(String x);\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/before/ModuleImport.java",
    "content": "// version 25:\n\nimport module java.base;\n\npublic class ModuleImport {}\n"
  },
  {
    "path": "test/pretty/resource/before/MultiCatch.java",
    "content": "// version 7:\npublic class MultiCatch {\n\tpublic void test() {\n\t\ttry {\n\t\t\tSystem.out.println();\n\t\t} catch (IllegalArgumentException | IllegalStateException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/pretty/resource/before/PatternInstanceOf.java",
    "content": "// version 14:\npublic class PatternInstanceOf {\n\tpublic void foo(Object o) {\n\t\tif (o instanceof String y) {\n\t\t\tSystem.out.println(y);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/before/Record.java",
    "content": "// version 14:\npublic record Record<T>(T field) implements Cloneable {\n\t\n}"
  },
  {
    "path": "test/pretty/resource/before/RecordPattern19.java",
    "content": "// version 19:19\nrecord Point(int x, int y) {\n}\nrecord Rectangle(Point upperLeft, Point lowerRight) {\n}\n\npublic class RecordPattern19 {\n\tvoid recordPattern(Object o) {\n\t\tif (o instanceof Point(int x, int y)) {\n\t\t}\n\t\tif (o instanceof Point(int x, int y) p) {\n\t\t}\n\t\tif (o instanceof Rectangle(Point(var x1, var y1), Point(int x2, int y2))) {\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/pretty/resource/before/RecordPattern20.java",
    "content": "// version 20:20\nrecord Point(int x, int y) {\n}\nrecord Rectangle(Point upperLeft, Point lowerRight) {\n}\n\npublic class RecordPattern20 {\n\tvoid recordPattern(Object o) {\n\t\tif (o instanceof Point(int x, int y)) {\n\t\t}\n\t\tif (o instanceof Rectangle(Point(var x1, var y1), Point(int x2, int y2))) {\n\t\t}\n\t}\n\n\tvoid forEachSimple(Point[] pointArray) {\n\t\tfor (Point(var x, var y) : pointArray) {\n\t\t}\n\t}\n\tvoid forEachNested(Rectangle[] rectangleArray) {\n\t\tfor (Rectangle(Point(var x1, var y1), Point p) : rectangleArray) {\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/pretty/resource/before/RecordPattern21.java",
    "content": "// version 21:\nrecord Point(int x, int y) {\n}\nrecord Rectangle(Point upperLeft, Point lowerRight) {\n}\n\npublic class RecordPattern21 {\n\tvoid recordPattern(Object o) {\n\t\tif (o instanceof Point(int x, int y)) {\n\t\t}\n\t\tif (o instanceof Rectangle(Point(var x1, var y1), Point(int x2, int y2))) {\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/pretty/resource/before/Sealed.java",
    "content": "// version 15:\npublic class Sealed {\n\tpublic abstract sealed class Parent permits Child1, Child2 {\n\t}\n\n\tpublic final class Child1 extends Parent {\n\t}\n\n\tpublic abstract non-sealed class Child2 extends Parent {\n\t}\n\n\tpublic sealed interface SealedInterface permits ChildInterface1 {\n\t}\n\n\tpublic non-sealed interface ChildInterface1 extends SealedInterface {\n\t}\n}"
  },
  {
    "path": "test/pretty/resource/before/Switch11.java",
    "content": "// version :11\npublic class Switch11 {\n\tpublic void basic() {\n\t\tswitch (5) {\n\t\tcase 1:\n\t\tcase 2:\n\t\t\tSystem.out.println(\"OK\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/before/Switch12.java",
    "content": "// version 12:12\npublic class Switch12 {\n\tpublic void basic() {\n\t\tswitch (5) {\n\t\tcase 1:\n\t\tcase 2:\n\t\t\tSystem.out.println(\"OK\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t}\n\t}\n\n\tpublic void multiCase() {\n\t\tswitch (5) {\n\t\tcase 1, 2:\n\t\t\tSystem.out.println(\"OK\");\n\t\tdefault:\n\t\t}\n\t}\n\n\tpublic int switchExpr() {\n\t\treturn switch (5) {\n\t\tcase 1, 2 -> 0;\n\t\tcase 3 -> {\n\t\t\tbreak 10;\n\t\t}\n\t\tdefault -> 10;\n\t\t} + 10;\n\t}\t\n}\n"
  },
  {
    "path": "test/pretty/resource/before/Switch13.java",
    "content": "// version 13:\npublic class Switch13 {\n\tpublic void basic() {\n\t\tswitch (5) {\n\t\tcase 1:\n\t\tcase 2:\n\t\t\tSystem.out.println(\"OK\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t}\n\t}\n\n\tpublic void multiCase() {\n\t\tswitch (5) {\n\t\tcase 1, 2:\n\t\t\tSystem.out.println(\"OK\");\n\t\tdefault:\n\t\t}\n\t}\n\n\tpublic int switchExpr1() {\n\t\treturn switch (5) {\n\t\t\tcase 1, 2 -> 0;\n\t\t\tcase 3 -> {\n\t\t\t\tyield 10;\n\t\t\t}\n\t\t\tdefault -> 10;\n\t\t} + 10;\n\t}\n\t\n\tpublic int switchExpr2() {\n\t\treturn switch (5) {\n\t\tcase 1, 2:\n\t\t\tSystem.out.println(\"Hello\");\n\t\tcase 3:\n\t\t\tyield 10;\n\t\tdefault:\n\t\t\tyield 20;\n\t\t} + 10;\n\t}\n\t\n\tpublic void arrowSwitch() {\n\t\tswitch (5) {\n\t\t\tcase 1, 2 -> System.out.println(\"Hello\");\n\t\t\tcase 3 -> {\n\t\t\t\tSystem.out.println(\"\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic void emptySwitch() {\n\t\tswitch (5) {\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/before/Switch17.java",
    "content": "// version 17:18\npublic class Switch17 {\n\tString switchPatternMatching(Object o) {\n\t\treturn switch (o) {\n\t\t\tcase Integer i\t-> String.format(\"int %d\", i);\n\t\t\tcase Long l\t\t-> String.format(\"long %d\", l);\n\t\t\tcase Double d\t-> String.format(\"double %f\", d);\n\t\t\tcase String s\t-> String.format(\"String %s\", s);\n\t\t\tdefault\t\t\t-> o.toString();\n\t\t};\n\t}\n\n\tString switchNull(Object o) {\n\t\treturn switch (o) {\n\t\t\tcase null, default\t-> \"?\";\n\t\t};\n\t}\n\n\tString switchGuardPattern(Object o) {\n\t\treturn switch (o) {\n\t\t\tcase String s && s.length() > 1\t-> s;\n\t\t\tdefault\t\t\t\t\t\t\t-> o.toString();\n\t\t};\n\t}\n\n\tString switchParenthesizedPattern(Object o) {\n\t\treturn switch (o) {\n\t\t\tcase (String s)\t-> s;\n\t\t\tdefault\t\t\t-> o.toString();\n\t\t};\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/before/Switch19.java",
    "content": "// version 19:20\npublic class Switch19 {\n\tString switchPatternMatching(Object o) {\n\t\treturn switch (o) {\n\t\t\tcase Integer i\t-> String.format(\"int %d\", i);\n\t\t\tcase Long l\t\t-> String.format(\"long %d\", l);\n\t\t\tcase Double d\t-> String.format(\"double %f\", d);\n\t\t\tcase String s\t-> String.format(\"String %s\", s);\n\t\t\tdefault\t\t\t-> o.toString();\n\t\t};\n\t}\n\n\tString switchNull(Object o) {\n\t\treturn switch (o) {\n\t\t\tcase null, default\t-> \"?\";\n\t\t};\n\t}\n\n\tString switchGuardPattern(Object o) {\n\t\treturn switch (o) {\n\t\t\tcase String s when s.length() > 1\t-> s;\n\t\t\tcase String s \t\t\t\t\t\t-> s;\n\t\t\tdefault\t\t\t\t\t\t\t\t-> o.toString();\n\t\t};\n\t}\n\n\tString switchParenthesizedPattern(Object o) {\n\t\treturn switch (o) {\n\t\t\tcase (String s)\t-> s;\n\t\t\tdefault\t\t\t-> o.toString();\n\t\t};\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/before/Switch21.java",
    "content": "// version 21:\npublic class Switch21 {\n\tString switchPatternMatching(Object o) {\n\t\treturn switch (o) {\n\t\t\tcase Integer i\t-> String.format(\"int %d\", i);\n\t\t\tcase Long l\t\t-> String.format(\"long %d\", l);\n\t\t\tcase Double d\t-> String.format(\"double %f\", d);\n\t\t\tcase String s\t-> String.format(\"String %s\", s);\n\t\t\tdefault\t\t\t-> o.toString();\n\t\t};\n\t}\n\n\tString switchNull(Object o) {\n\t\treturn switch (o) {\n\t\t\tcase null, default\t-> \"?\";\n\t\t};\n\t}\n\n\tString switchGuardPattern(Object o) {\n\t\treturn switch (o) {\n\t\t\tcase String s when s.length() > 1\t-> s;\n\t\t\tcase String s \t\t\t\t\t\t-> s;\n\t\t\tdefault\t\t\t\t\t\t\t\t-> o.toString();\n\t\t};\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/before/TextBlocks.java",
    "content": "// version 13:\npublic class TextBlocks {\n\tprivate String example = \"\"\"\n\t\tThis should not be indented.\\nline 2\n\t\tline 3\n\t\t\"\"\";\n\t\n\tprivate String ex2 = \"\"\"\n\t\tThis should be though.\n\t\"\"\";\n\t\n\tprivate String ex3 = \"This is a simple\\nstring\";\n\t\n\tprivate String ex4 = \"\"\"   \n\t\t\"\"\";\n\t\n\tprivate String bizarroDent = \"\"\"\n\t\t  foo\\n    bar\"\"\" + \"hey\" + \"\"\"\n\t\t\tweird!\"\"\";\n\t\n\tprivate String stringFolding = \"hmmm\" + \"\"\"\n\t\tline1\n\t\t\tline2\"\"\";\n}\n"
  },
  {
    "path": "test/pretty/resource/before/ThisParameter.java",
    "content": "// version 8:\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\nclass ThisParameter {\n\t\n\tvoid untagged(ThisParameter this, int i) {\n\t\t// no content\n\t}\n\t\n\tvoid sourceTagged(@SourceTagged(\"source\") ThisParameter this) {\n\t\t// no content\n\t}\n\t\n\tvoid classTagged(@ClassTagged(\"class\") ThisParameter this) {\n\t\t// no content\n\t}\t\n\t\n\tvoid runtimeTagged(@RuntimeTagged(\"runtime\") ThisParameter this) {\n\t\t// no content\n\t}\n\t\n\t@Target(ElementType.TYPE_USE)\n\t@Retention(RetentionPolicy.SOURCE)\n\t@interface SourceTagged {\n\t\tString value();\n\t}\n\t\n\t@Target(ElementType.TYPE_USE)\n\t@Retention(RetentionPolicy.CLASS)\n\t@interface ClassTagged {\n\t\tString value();\n\t}\n\t\n\t@Target(ElementType.TYPE_USE)\n\t@Retention(RetentionPolicy.RUNTIME)\n\t@interface RuntimeTagged {\n\t\tString value();\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/before/TryWithResources.java",
    "content": "//version 7:\nimport java.io.PrintWriter;\npublic class TryWithResources {\n\t{\n\t\ttry (PrintWriter pw = new PrintWriter(System.out)) {\n\t\t\tpw.println();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/before/TryWithResourcesVarRef.java",
    "content": "//version 9:\nimport java.io.PrintWriter;\npublic class TryWithResourcesVarRef {\n\t{\n\t\tPrintWriter pw = new PrintWriter(System.out);\n\t\ttry (pw) {\n\t\t\tpw.println();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/before/TypeAnnotations.java",
    "content": "// version 8:\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.List;\nimport java.util.Map;\n\npublic class TypeAnnotations {\n\t@Target({ElementType.TYPE_USE, ElementType.LOCAL_VARIABLE})\n\t@interface Foo {}\n\t\n\t@Target(ElementType.TYPE_USE)\n\t@interface Bar {}\n\t\n\t@Target(ElementType.TYPE_USE)\n\t@interface Baz {}\n\t\n\t@Target(ElementType.TYPE_USE)\n\t@interface Bat {}\n\t\n\tpublic List<@Foo String> test(@Foo String param) {\n\t\t@Bar String local = \"bar\";\n\t\t@Foo java.io.@Foo File[] array = {};\n\t\treturn new java.util.@Foo ArrayList<java.lang.@Foo String>();\n\t}\n\t\n\tpublic <@Foo T extends java.lang.@Foo Number> T test2(@Bar String... varargs) {\n\t\treturn null;\n\t}\n\t\n\tpublic void test3(String[][] arg, String[]... arg2) {\n\t\t@Baz String @Bar [] @Foo [] x;\n\t}\n\t\n\tpublic void test4(@Foo String @Bar [] @Baz [] @Bat ... y) {\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/before/UnnamedVariables.java",
    "content": "// version 22:\nimport java.util.Arrays;\nimport java.util.Scanner;\nimport java.util.stream.Stream;\n\nrecord Box<T>(T content) {\n}\n\nrecord Pair<T, U>(T first, U second) {\n}\n\npublic class UnnamedVariables {\n\tvoid enhancedLoop() {\n\t\tfor (String _ : Arrays.asList(\"\")) {\n\t\t}\n\t}\n\n\tvoid initializationInForLoop() {\n\t\tfor (int i = 0, _ = Integer.MAX_VALUE; i < 10; i++) {\n\t\t}\n\t}\n\n\tvoid assignment() {\n\t\tvar _ = 1;\n\t}\n\n\tvoid catchBlock() {\n\t\ttry {\n\t\t} catch (Exception _) {\n\t\t}\n\t}\n\n\tvoid tryWithResources() {\n\t\ttry (var _ = new Scanner(\"\")) {\n\t\t}\n\t}\n\n\tvoid lambda() {\n\t\tStream.of(1).forEach(_ -> {\n\t\t});\n\t}\n\n\tObject switchStatement(Object o) {\n\t\treturn switch (o) {\n\t\t\tcase String _, Integer _ -> o;\n\t\t\tcase Long _ -> o;\n\t\t\tdefault -> o;\n\t\t};\n\t}\n\n\tvoid recordPattern(Object o) {\n\t\tif (o instanceof Pair(Box _, Box(Integer _))) {\n\t\t}\n\t\tif (o instanceof Box(String _)) {\n\t\t}\n\t\tif (o instanceof Box(var _)) {\n\t\t}\n\t\tif (o instanceof Box(_)) {\n\t\t}\n\t}\n\n\tObject recordPatternSwitch(Object o) {\n\t\treturn switch (o) {\n\t\t\tcase Box(String _), Box(Integer _) -> o;\n\t\t\tcase Box(Long _) -> o;\n\t\t\tcase Box(_) -> o;\n\t\t\tdefault -> o;\n\t\t};\n\t}\n}\n"
  },
  {
    "path": "test/pretty/resource/before/WithComments.java",
    "content": "/*\nTry out pretty comments.\n */\npackage test;\n\n// Cool Comments\npublic class WithComments {\n\t// Also inside the body\n// On start of line\n}\n"
  },
  {
    "path": "test/pretty/resource/messages/DefaultMethod.java.messages",
    "content": "OPTIONAL 9 as of release 17, all floating-point expressions are evaluated strictly and 'strictfp' is not required"
  },
  {
    "path": "test/pretty/resource/messages/ExoticJava.java.messages",
    "content": "OPTIONAL 16 as of release 17, all floating-point expressions are evaluated strictly and 'strictfp' is not required"
  },
  {
    "path": "test/stubs/com/fasterxml/jackson/annotation/JsonAnySetter.java",
    "content": "package com.fasterxml.jackson.annotation;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD})\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface JsonAnySetter {\n\tboolean enabled() default true;\n}\n"
  },
  {
    "path": "test/stubs/com/fasterxml/jackson/annotation/JsonIgnoreProperties.java",
    "content": "package com.fasterxml.jackson.annotation;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Target({ElementType.ANNOTATION_TYPE, ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface JsonIgnoreProperties {\n\tpublic boolean ignoreUnknown() default false;\n}\n"
  },
  {
    "path": "test/stubs/com/fasterxml/jackson/annotation/JsonProperty.java",
    "content": "package com.fasterxml.jackson.annotation;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface JsonProperty {\n\tString value();\n}\n"
  },
  {
    "path": "test/stubs/com/fasterxml/jackson/annotation/JsonSetter.java",
    "content": "package com.fasterxml.jackson.annotation;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface JsonSetter {\n\tNulls nulls();\n}\n"
  },
  {
    "path": "test/stubs/com/fasterxml/jackson/annotation/Nulls.java",
    "content": "package com.fasterxml.jackson.annotation;\n\npublic enum Nulls {\n\tSKIP;\n}\n"
  },
  {
    "path": "test/stubs/com/fasterxml/jackson/databind/annotation/JsonDeserialize.java",
    "content": "package com.fasterxml.jackson.databind.annotation;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.TYPE, ElementType.PARAMETER})\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface JsonDeserialize {\n\tpublic Class<?> builder() default Void.class;\n}\n"
  },
  {
    "path": "test/stubs/com/fasterxml/jackson/databind/annotation/JsonPOJOBuilder.java",
    "content": "package com.fasterxml.jackson.databind.annotation;\n\nimport java.lang.annotation.*;\n\n@Target({ElementType.ANNOTATION_TYPE, ElementType.TYPE})\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface JsonPOJOBuilder {\n\tpublic String buildMethodName() default \"build\";\n\tpublic String withPrefix() default \"with\";\n}\n"
  },
  {
    "path": "test/stubs/jakarta/annotation/Generated.java",
    "content": "package jakarta.annotation;\n\nimport static java.lang.annotation.ElementType.*;\nimport static java.lang.annotation.RetentionPolicy.SOURCE;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.Target;\n\n@Documented\n@Retention(SOURCE)\n@Target({PACKAGE, TYPE, ANNOTATION_TYPE, METHOD, CONSTRUCTOR, FIELD, LOCAL_VARIABLE, PARAMETER})\npublic @interface Generated {\n\tString[] value();\n}\n"
  },
  {
    "path": "test/stubs/jakarta/annotation/Nonnull.java",
    "content": "package jakarta.annotation;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\n\n@Documented\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface Nonnull {}\n"
  },
  {
    "path": "test/stubs/jakarta/annotation/Nullable.java",
    "content": "package jakarta.annotation;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\n\n@Documented\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface Nullable {}\n"
  },
  {
    "path": "test/stubs/java/lang/Record.java",
    "content": "package java.lang;\n\npublic abstract class Record {}\n"
  },
  {
    "path": "test/stubs/java/lang/runtime/ObjectMethods.java",
    "content": "package java.lang.runtime;\n\n// import java.lang.invoke.MethodHandle;\n// import java.lang.invoke.MethodHandles;\n// import java.lang.invoke.TypeDescriptor;\n\npublic class ObjectMethods {\n// \tpublic static Object bootstrap(MethodHandles.Lookup lookup, String methodName, TypeDescriptor type, Class<?> recordClass, String names, MethodHandle... getters) throws Throwable {\n\tpublic static Object bootstrap(Object lookup, String methodName, Object type, Class<?> recordClass, String names, Object... getters) throws Throwable {\n\t\treturn null;\n    }\n}\n"
  },
  {
    "path": "test/stubs/javax/annotation/Generated.java",
    "content": "package javax.annotation;\n\nimport static java.lang.annotation.ElementType.*;\nimport static java.lang.annotation.RetentionPolicy.SOURCE;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.Target;\n\n@Documented\n@Retention(SOURCE)\n@Target({PACKAGE, TYPE, ANNOTATION_TYPE, METHOD, CONSTRUCTOR, FIELD, LOCAL_VARIABLE, PARAMETER})\npublic @interface Generated {\n\tString[] value();\n}\n"
  },
  {
    "path": "test/stubs/org/checkerframework/checker/calledmethods/qual/CalledMethods.java",
    "content": "package org.checkerframework.checker.calledmethods.qual;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.RUNTIME)\n@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})\npublic @interface CalledMethods {\n  /**\n   * Methods that have been called, on any expression whose type is annotated.\n   *\n   * @return methods that have been called\n   */\n  public String[] value() default {};\n}"
  },
  {
    "path": "test/stubs/org/checkerframework/checker/nullness/qual/NonNull.java",
    "content": "package org.checkerframework.checker.nullness.qual;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.RUNTIME)\n@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})\n@Documented\npublic @interface NonNull {}\n"
  },
  {
    "path": "test/stubs/org/checkerframework/checker/nullness/qual/Nullable.java",
    "content": "package org.checkerframework.checker.nullness.qual;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.RUNTIME)\n@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})\n@Documented\npublic @interface Nullable {}\n"
  },
  {
    "path": "test/stubs/org/checkerframework/common/aliasing/qual/Unique.java",
    "content": "package org.checkerframework.common.aliasing.qual;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Documented\n@Retention(RetentionPolicy.RUNTIME)\n@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})\npublic @interface Unique {}"
  },
  {
    "path": "test/stubs/org/checkerframework/common/returnsreceiver/qual/This.java",
    "content": "package org.checkerframework.common.returnsreceiver.qual;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.RUNTIME)\n@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})\npublic @interface This {}"
  },
  {
    "path": "test/stubs/org/checkerframework/dataflow/qual/Pure.java",
    "content": "package org.checkerframework.dataflow.qual;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Documented\n@Retention(RetentionPolicy.RUNTIME)\n@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})\npublic @interface Pure {}"
  },
  {
    "path": "test/stubs/org/checkerframework/dataflow/qual/SideEffectFree.java",
    "content": "package org.checkerframework.dataflow.qual;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Documented\n@Retention(RetentionPolicy.RUNTIME)\n@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})\npublic @interface SideEffectFree {}"
  },
  {
    "path": "test/stubs/org/eclipse/jdt/annotation/NonNull.java",
    "content": "package org.eclipse.jdt.annotation;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Documented\n@Retention(RetentionPolicy.CLASS)\n@Target(ElementType.TYPE_USE)\npublic @interface NonNull {}\n"
  },
  {
    "path": "test/stubs/org/eclipse/jdt/annotation/Nullable.java",
    "content": "package org.eclipse.jdt.annotation;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Documented\n@Retention(RetentionPolicy.CLASS)\n@Target(ElementType.TYPE_USE)\npublic @interface Nullable {}\n"
  },
  {
    "path": "test/stubs/org/springframework/lang/NonNull.java",
    "content": "package org.springframework.lang;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})\n@Retention(RetentionPolicy.RUNTIME)\n@Documented\npublic @interface NonNull {}\n"
  },
  {
    "path": "test/stubs/org/springframework/lang/Nullable.java",
    "content": "package org.springframework.lang;\n\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})\n@Retention(RetentionPolicy.RUNTIME)\n@Documented\npublic @interface Nullable {}\n"
  },
  {
    "path": "test/stubs/tools/jackson/databind/annotation/JsonDeserialize.java",
    "content": "package tools.jackson.databind.annotation;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.TYPE, ElementType.PARAMETER})\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface JsonDeserialize {\n\tpublic Class<?> builder() default Void.class;\n}\n"
  },
  {
    "path": "test/stubs/tools/jackson/databind/annotation/JsonPOJOBuilder.java",
    "content": "package tools.jackson.databind.annotation;\n\nimport java.lang.annotation.*;\n\n@Target({ElementType.ANNOTATION_TYPE, ElementType.TYPE})\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface JsonPOJOBuilder {\n\tpublic String buildMethodName() default \"build\";\n\tpublic String withPrefix() default \"with\";\n}\n"
  },
  {
    "path": "test/transform/knownBroken/before/I1132RecursiveGenerics.java",
    "content": "// Compile with javac, it'll think the T in the generated build() method isn't type compatible.\n// Yet, when you take the delomboked output (which delombok will give, but with errors), THAT does compile.\n\npublic class I1132RecursiveGenerics {\n\tpublic static class Recursive<T extends Recursive<T>> {}\n\tpublic static final class Rec extends Recursive<Rec> {}\n\n\t@lombok.Builder(builderClassName = \"MethodBuilder\")\n\tpublic static <T extends Recursive<T>> T create() {\n\t\treturn null;\n\t}\n\n\tpublic static void main(String[] args) {\n\t\tfinal MethodBuilder<Rec> builder = I1132RecursiveGenerics.builder();\n\t\tfinal Rec rec = builder.build();\n//\t\tfinal Rec rec = I1132RecursiveGenerics.<Rec>builder().build();\n\t}\n}\n\n"
  },
  {
    "path": "test/transform/knownBroken/before/I1302BuilderInInstanceInnerClass.java",
    "content": "public class I1302BuilderInInstanceInnerClass {\n  @lombok.Builder public class NonStaticInner {\n    private int test;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/Accessors.java",
    "content": "class AccessorsFluent {\n\tprivate String fieldName = \"\";\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String fieldName() {\n\t\treturn this.fieldName;\n\t}\n\t/**\n\t * @return {@code this}.\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic AccessorsFluent fieldName(final String fieldName) {\n\t\tthis.fieldName = fieldName;\n\t\treturn this;\n\t}\n}\nclass AccessorsFluentOnClass {\n\tprivate String fieldName = \"\";\n\tprivate String otherFieldWithOverride = \"\";\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String fieldName() {\n\t\treturn this.fieldName;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getOtherFieldWithOverride() {\n\t\treturn this.otherFieldWithOverride;\n\t}\n\t/**\n\t * @return {@code this}.\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic AccessorsFluentOnClass fieldName(final String fieldName) {\n\t\tthis.fieldName = fieldName;\n\t\treturn this;\n\t}\n}\nclass AccessorsChain {\n\tprivate boolean isRunning;\n\t/**\n\t * @return {@code this}.\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic AccessorsChain setRunning(final boolean isRunning) {\n\t\tthis.isRunning = isRunning;\n\t\treturn this;\n\t}\n}\nclass AccessorsPrefix {\n\tprivate String fieldName;\n\tprivate String fActualField;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setActualField(final String fActualField) {\n\t\tthis.fActualField = fActualField;\n\t}\n}\nclass AccessorsPrefix2 {\n\tprivate String fieldName;\n\tprivate String fActualField;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setFieldName(final String fieldName) {\n\t\tthis.fieldName = fieldName;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setActualField(final String fActualField) {\n\t\tthis.fActualField = fActualField;\n\t}\n}\nclass AccessorsPrefix3 {\n\tprivate String fName;\n\tprivate String getName() {\n\t\treturn fName;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"AccessorsPrefix3(fName=\" + this.getName() + \")\";\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof AccessorsPrefix3)) return false;\n\t\tfinal AccessorsPrefix3 other = (AccessorsPrefix3) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tfinal java.lang.Object this$fName = this.getName();\n\t\tfinal java.lang.Object other$fName = other.getName();\n\t\tif (this$fName == null ? other$fName != null : !this$fName.equals(other$fName)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof AccessorsPrefix3;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tfinal java.lang.Object $fName = this.getName();\n\t\tresult = result * PRIME + ($fName == null ? 43 : $fName.hashCode());\n\t\treturn result;\n\t}\n}\nclass AccessorsFluentGenerics<T extends Number> {\n\tprivate String name;\n\t/**\n\t * @return {@code this}.\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic AccessorsFluentGenerics<T> name(final String name) {\n\t\tthis.name = name;\n\t\treturn this;\n\t}\n}\nclass AccessorsFluentNoChaining {\n\tprivate String name;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void name(final String name) {\n\t\tthis.name = name;\n\t}\n}\nclass AccessorsFluentStatic<T extends Number> {\n\tprivate static String name;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static void name(final String name) {\n\t\tAccessorsFluentStatic.name = name;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/AccessorsCascade.java",
    "content": "//CONF: lombok.Accessors.prefix += f\nclass AccessorsOuter {\n\tprivate String fTest;\n\tprivate String zTest2;\n\tclass AccessorsInner1 {\n\t\tprivate String zTest3;\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic AccessorsOuter.AccessorsInner1 setTest3(final String zTest3) {\n\t\t\tthis.zTest3 = zTest3;\n\t\t\treturn this;\n\t\t}\n\t}\n\tclass AccessorsInner2 {\n\t\tprivate String fTest4;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic void setTest4(final String fTest4) {\n\t\t\tthis.fTest4 = fTest4;\n\t\t}\n\t}\n\t/**\n\t * @return {@code this}.\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic AccessorsOuter setTest(final String fTest) {\n\t\tthis.fTest = fTest;\n\t\treturn this;\n\t}\n\t/**\n\t * @return {@code this}.\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic AccessorsOuter setTest2(final String zTest2) {\n\t\tthis.zTest2 = zTest2;\n\t\treturn this;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/AccessorsConfiguration.java",
    "content": "class AccessorsConfiguration {\n\tprivate String m_FieldName = \"\";\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String fieldName() {\n\t\treturn this.m_FieldName;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void fieldName(final String m_FieldName) {\n\t\tthis.m_FieldName = m_FieldName;\n\t}\n}\nclass AccessorsConfiguration2 {\n\tprivate String m_FieldName = \"\";\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setM_FieldName(final String m_FieldName) {\n\t\tthis.m_FieldName = m_FieldName;\n\t}\n}\nclass AccessorsConfiguration3 {\n\tprivate String fFieldName = \"\";\n\t/**\n\t * @return {@code this}.\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic AccessorsConfiguration3 setFieldName(final String fFieldName) {\n\t\tthis.fFieldName = fFieldName;\n\t\treturn this;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/AccessorsInAnonymousClass.java",
    "content": "public class AccessorsInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\tclass Inner {\n\t\t\tprivate String string;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic String string() {\n\t\t\t\treturn this.string;\n\t\t\t}\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic Inner string(final String string) {\n\t\t\t\tthis.string = string;\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/AccessorsMakeFinal.java",
    "content": "class AccessorsMakeFinal1 {\n\tprivate String test;\n\t/**\n\t * @return {@code this}.\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic final AccessorsMakeFinal1 test(final String test) {\n\t\tthis.test = test;\n\t\treturn this;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/AccessorsMakeFinalLombokConfig.java",
    "content": "class AccessorsMakeFinalLombokConfig {\n\tprivate String test;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic final void setTest(final String test) {\n\t\tthis.test = test;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/AccessorsNoParamWarning.java",
    "content": "class AccessorsNoParams {\n\tprivate String otherFieldWithOverride = \"\";\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String otherFieldWithOverride() {\n\t\treturn this.otherFieldWithOverride;\n\t}\n}\nclass AccessorsNoParams2 {\n\tprivate boolean foo;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setFoo(final boolean foo) {\n\t\tthis.foo = foo;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderAccessWithGetter.java",
    "content": "public final class BuilderAccessWithGetter {\n    private final String string;\n    @java.lang.SuppressWarnings(\"all\")\n    @lombok.Generated\n    BuilderAccessWithGetter(final String string) {\n        this.string = string;\n    }\n    @java.lang.SuppressWarnings(\"all\")\n    @lombok.Generated\n    private static class BuilderAccessWithGetterBuilder {\n        @java.lang.SuppressWarnings(\"all\")\n        @lombok.Generated\n        private String string;\n        @java.lang.SuppressWarnings(\"all\")\n        @lombok.Generated\n        BuilderAccessWithGetterBuilder() {\n        }\n        /**\n         * @return {@code this}.\n         */\n        @java.lang.SuppressWarnings(\"all\")\n        @lombok.Generated\n        private BuilderAccessWithGetter.BuilderAccessWithGetterBuilder string(final String string) {\n            this.string = string;\n            return this;\n        }\n        @java.lang.SuppressWarnings(\"all\")\n        @lombok.Generated\n        private BuilderAccessWithGetter build() {\n            return new BuilderAccessWithGetter(this.string);\n        }\n        @java.lang.Override\n        @java.lang.SuppressWarnings(\"all\")\n        @lombok.Generated\n        public java.lang.String toString() {\n            return \"BuilderAccessWithGetter.BuilderAccessWithGetterBuilder(string=\" + this.string + \")\";\n        }\n    }\n    @java.lang.SuppressWarnings(\"all\")\n    @lombok.Generated\n    private static BuilderAccessWithGetter.BuilderAccessWithGetterBuilder builder() {\n        return new BuilderAccessWithGetter.BuilderAccessWithGetterBuilder();\n    }\n    @java.lang.SuppressWarnings(\"all\")\n    @lombok.Generated\n    public String getString() {\n        return this.string;\n    }\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderComplex.java",
    "content": "import java.util.List;\nclass BuilderComplex {\n\tprivate static <T extends Number> void testVoidWithGenerics(T number, int arg2, String arg3, BuilderComplex selfRef) {\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class TestVoidName<T extends Number> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate T number;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int arg2;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate String arg3;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate BuilderComplex selfRef;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tTestVoidName() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderComplex.TestVoidName<T> number(final T number) {\n\t\t\tthis.number = number;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderComplex.TestVoidName<T> arg2(final int arg2) {\n\t\t\tthis.arg2 = arg2;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderComplex.TestVoidName<T> arg3(final String arg3) {\n\t\t\tthis.arg3 = arg3;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderComplex.TestVoidName<T> selfRef(final BuilderComplex selfRef) {\n\t\t\tthis.selfRef = selfRef;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic void execute() {\n\t\t\tBuilderComplex.<T>testVoidWithGenerics(this.number, this.arg2, this.arg3, this.selfRef);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderComplex.TestVoidName(number=\" + this.number + \", arg2=\" + this.arg2 + \", arg3=\" + this.arg3 + \", selfRef=\" + this.selfRef + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static <T extends Number> BuilderComplex.TestVoidName<T> builder() {\n\t\treturn new BuilderComplex.TestVoidName<T>();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderConstructorJavadoc.java",
    "content": "import java.util.List;\nclass BuilderConstructorJavadoc<T> {\n\t/**\n\t * This is a comment\n\t * \n\t * @param basic tag is moved to the setter\n\t * @param multiline a param comment\n\t *        can be on multiple lines and can use \n\t *        {@code @code} or <code>tags</code>\n\t * @param predef don't copy this one\n\t * @param predefWithJavadoc don't copy this one\n\t * @param last also copy last param\n\t */\n\tBuilderConstructorJavadoc(int basic, int multiline, int predef, int predefWithJavadoc, int last) {\n\t}\n\tpublic static class BuilderConstructorJavadocBuilder<T> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int basic;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int multiline;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int predef;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int predefWithJavadoc;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int last;\n\t\tpublic BuilderConstructorJavadocBuilder<T> predef(final int x) {\n\t\t\tthis.predef = x;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * This javadoc remains untouched.\n\t\t * @param x 1/100 of the thing\n\t\t * @return the updated builder\n\t\t */\n\t\tpublic BuilderConstructorJavadocBuilder<T> predefWithJavadoc(final int x) {\n\t\t\tthis.predefWithJavadoc = x;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderConstructorJavadocBuilder() {\n\t\t}\n\t\t/**\n\t\t * @param basic tag is moved to the setter\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderConstructorJavadoc.BuilderConstructorJavadocBuilder<T> basic(final int basic) {\n\t\t\tthis.basic = basic;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @param multiline a param comment\n\t\t *        can be on multiple lines and can use \n\t\t *        {@code @code} or <code>tags</code>\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderConstructorJavadoc.BuilderConstructorJavadocBuilder<T> multiline(final int multiline) {\n\t\t\tthis.multiline = multiline;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @param last also copy last param\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderConstructorJavadoc.BuilderConstructorJavadocBuilder<T> last(final int last) {\n\t\t\tthis.last = last;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderConstructorJavadoc<T> build() {\n\t\t\treturn new BuilderConstructorJavadoc<T>(this.basic, this.multiline, this.predef, this.predefWithJavadoc, this.last);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderConstructorJavadoc.BuilderConstructorJavadocBuilder(basic=\" + this.basic + \", multiline=\" + this.multiline + \", predef=\" + this.predef + \", predefWithJavadoc=\" + this.predefWithJavadoc + \", last=\" + this.last + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static <T> BuilderConstructorJavadoc.BuilderConstructorJavadocBuilder<T> builder() {\n\t\treturn new BuilderConstructorJavadoc.BuilderConstructorJavadocBuilder<T>();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderDefaults.java",
    "content": "public final class BuilderDefaults {\n\tprivate final int x;\n\tprivate final String name;\n\tprivate final long z;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static int $default$x() {\n\t\treturn 10;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static long $default$z() {\n\t\treturn System.currentTimeMillis();\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderDefaults(final int x, final String name, final long z) {\n\t\tthis.x = x;\n\t\tthis.name = name;\n\t\tthis.z = z;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderDefaultsBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate boolean x$set;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int x$value;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate String name;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate boolean z$set;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate long z$value;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderDefaultsBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderDefaults.BuilderDefaultsBuilder x(final int x) {\n\t\t\tthis.x$value = x;\n\t\t\tx$set = true;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderDefaults.BuilderDefaultsBuilder name(final String name) {\n\t\t\tthis.name = name;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderDefaults.BuilderDefaultsBuilder z(final long z) {\n\t\t\tthis.z$value = z;\n\t\t\tz$set = true;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderDefaults build() {\n\t\t\tint x$value = this.x$value;\n\t\t\tif (!this.x$set) x$value = BuilderDefaults.$default$x();\n\t\t\tlong z$value = this.z$value;\n\t\t\tif (!this.z$set) z$value = BuilderDefaults.$default$z();\n\t\t\treturn new BuilderDefaults(x$value, this.name, z$value);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderDefaults.BuilderDefaultsBuilder(x$value=\" + this.x$value + \", name=\" + this.name + \", z$value=\" + this.z$value + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderDefaults.BuilderDefaultsBuilder builder() {\n\t\treturn new BuilderDefaults.BuilderDefaultsBuilder();\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getX() {\n\t\treturn this.x;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getName() {\n\t\treturn this.name;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic long getZ() {\n\t\treturn this.z;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof BuilderDefaults)) return false;\n\t\tfinal BuilderDefaults other = (BuilderDefaults) o;\n\t\tif (this.getX() != other.getX()) return false;\n\t\tif (this.getZ() != other.getZ()) return false;\n\t\tfinal java.lang.Object this$name = this.getName();\n\t\tfinal java.lang.Object other$name = other.getName();\n\t\tif (this$name == null ? other$name != null : !this$name.equals(other$name)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.getX();\n\t\tfinal long $z = this.getZ();\n\t\tresult = result * PRIME + (int) ($z >>> 32 ^ $z);\n\t\tfinal java.lang.Object $name = this.getName();\n\t\tresult = result * PRIME + ($name == null ? 43 : $name.hashCode());\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"BuilderDefaults(x=\" + this.getX() + \", name=\" + this.getName() + \", z=\" + this.getZ() + \")\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderDefaultsArray.java",
    "content": "import lombok.Value;\npublic class BuilderDefaultsArray {\n\tint[] x;\n\tjava.lang.String[][] y;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static int[] $default$x() {\n\t\treturn new int[] {1, 2};\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static java.lang.String[][] $default$y() {\n\t\treturn new java.lang.String[][] {};\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderDefaultsArray(final int[] x, final java.lang.String[][] y) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderDefaultsArrayBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate boolean x$set;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int[] x$value;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate boolean y$set;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.lang.String[][] y$value;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderDefaultsArrayBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderDefaultsArray.BuilderDefaultsArrayBuilder x(final int[] x) {\n\t\t\tthis.x$value = x;\n\t\t\tx$set = true;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderDefaultsArray.BuilderDefaultsArrayBuilder y(final java.lang.String[][] y) {\n\t\t\tthis.y$value = y;\n\t\t\ty$set = true;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderDefaultsArray build() {\n\t\t\tint[] x$value = this.x$value;\n\t\t\tif (!this.x$set) x$value = BuilderDefaultsArray.$default$x();\n\t\t\tjava.lang.String[][] y$value = this.y$value;\n\t\t\tif (!this.y$set) y$value = BuilderDefaultsArray.$default$y();\n\t\t\treturn new BuilderDefaultsArray(x$value, y$value);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderDefaultsArray.BuilderDefaultsArrayBuilder(x$value=\" + java.util.Arrays.toString(this.x$value) + \", y$value=\" + java.util.Arrays.deepToString(this.y$value) + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderDefaultsArray.BuilderDefaultsArrayBuilder builder() {\n\t\treturn new BuilderDefaultsArray.BuilderDefaultsArrayBuilder();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderDefaultsGenerics.java",
    "content": "import java.util.*;\npublic class BuilderDefaultsGenerics<N extends Number, T, R extends List<T>> {\n\tprivate java.util.concurrent.Callable<N> callable;\n\tprivate T tee;\n\tprivate R arrr;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static <N extends Number, T, R extends List<T>> java.util.concurrent.Callable<N> $default$callable() {\n\t\treturn null;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static <N extends Number, T, R extends List<T>> T $default$tee() {\n\t\treturn null;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static <N extends Number, T, R extends List<T>> R $default$arrr() {\n\t\treturn null;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderDefaultsGenerics(final java.util.concurrent.Callable<N> callable, final T tee, final R arrr) {\n\t\tthis.callable = callable;\n\t\tthis.tee = tee;\n\t\tthis.arrr = arrr;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderDefaultsGenericsBuilder<N extends Number, T, R extends List<T>> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate boolean callable$set;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.concurrent.Callable<N> callable$value;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate boolean tee$set;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate T tee$value;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate boolean arrr$set;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate R arrr$value;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderDefaultsGenericsBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderDefaultsGenerics.BuilderDefaultsGenericsBuilder<N, T, R> callable(final java.util.concurrent.Callable<N> callable) {\n\t\t\tthis.callable$value = callable;\n\t\t\tcallable$set = true;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderDefaultsGenerics.BuilderDefaultsGenericsBuilder<N, T, R> tee(final T tee) {\n\t\t\tthis.tee$value = tee;\n\t\t\ttee$set = true;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderDefaultsGenerics.BuilderDefaultsGenericsBuilder<N, T, R> arrr(final R arrr) {\n\t\t\tthis.arrr$value = arrr;\n\t\t\tarrr$set = true;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderDefaultsGenerics<N, T, R> build() {\n\t\t\tjava.util.concurrent.Callable<N> callable$value = this.callable$value;\n\t\t\tif (!this.callable$set) callable$value = BuilderDefaultsGenerics.<N, T, R>$default$callable();\n\t\t\tT tee$value = this.tee$value;\n\t\t\tif (!this.tee$set) tee$value = BuilderDefaultsGenerics.<N, T, R>$default$tee();\n\t\t\tR arrr$value = this.arrr$value;\n\t\t\tif (!this.arrr$set) arrr$value = BuilderDefaultsGenerics.<N, T, R>$default$arrr();\n\t\t\treturn new BuilderDefaultsGenerics<N, T, R>(callable$value, tee$value, arrr$value);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderDefaultsGenerics.BuilderDefaultsGenericsBuilder(callable$value=\" + this.callable$value + \", tee$value=\" + this.tee$value + \", arrr$value=\" + this.arrr$value + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static <N extends Number, T, R extends List<T>> BuilderDefaultsGenerics.BuilderDefaultsGenericsBuilder<N, T, R> builder() {\n\t\treturn new BuilderDefaultsGenerics.BuilderDefaultsGenericsBuilder<N, T, R>();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderDefaultsTargetTyping.java",
    "content": "import java.util.Arrays;\npublic class BuilderDefaultsTargetTyping {\n\tString foo;\n\tstatic String doSth(java.util.List<Integer> i, java.util.List<Character> c) {\n\t\treturn null;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static String $default$foo() {\n\t\treturn doSth(Arrays.asList(1), Arrays.asList('a'));\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderDefaultsTargetTyping(final String foo) {\n\t\tthis.foo = foo;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderDefaultsTargetTypingBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate boolean foo$set;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate String foo$value;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderDefaultsTargetTypingBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderDefaultsTargetTyping.BuilderDefaultsTargetTypingBuilder foo(final String foo) {\n\t\t\tthis.foo$value = foo;\n\t\t\tfoo$set = true;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderDefaultsTargetTyping build() {\n\t\t\tString foo$value = this.foo$value;\n\t\t\tif (!this.foo$set) foo$value = BuilderDefaultsTargetTyping.$default$foo();\n\t\t\treturn new BuilderDefaultsTargetTyping(foo$value);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderDefaultsTargetTyping.BuilderDefaultsTargetTypingBuilder(foo$value=\" + this.foo$value + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderDefaultsTargetTyping.BuilderDefaultsTargetTypingBuilder builder() {\n\t\treturn new BuilderDefaultsTargetTyping.BuilderDefaultsTargetTypingBuilder();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderDefaultsWarnings.java",
    "content": "//skip-idempotent\npublic class BuilderDefaultsWarnings {\n\tlong x = System.currentTimeMillis();\n\tfinal int y = 5;\n\tint z;\n\tjava.util.List<String> items;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderDefaultsWarnings(final long x, final int z, final java.util.List<String> items) {\n\t\tthis.x = x;\n\t\tthis.z = z;\n\t\tthis.items = items;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderDefaultsWarningsBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate long x;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int z;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<String> items;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderDefaultsWarningsBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderDefaultsWarnings.BuilderDefaultsWarningsBuilder x(final long x) {\n\t\t\tthis.x = x;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderDefaultsWarnings.BuilderDefaultsWarningsBuilder z(final int z) {\n\t\t\tthis.z = z;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderDefaultsWarnings.BuilderDefaultsWarningsBuilder item(final String item) {\n\t\t\tif (this.items == null) this.items = new java.util.ArrayList<String>();\n\t\t\tthis.items.add(item);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderDefaultsWarnings.BuilderDefaultsWarningsBuilder items(final java.util.Collection<? extends String> items) {\n\t\t\tif (items == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"items cannot be null\");\n\t\t\t}\n\t\t\tif (this.items == null) this.items = new java.util.ArrayList<String>();\n\t\t\tthis.items.addAll(items);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderDefaultsWarnings.BuilderDefaultsWarningsBuilder clearItems() {\n\t\t\tif (this.items != null) this.items.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderDefaultsWarnings build() {\n\t\t\tjava.util.List<String> items;\n\t\t\tswitch (this.items == null ? 0 : this.items.size()) {\n\t\t\tcase 0: \n\t\t\t\titems = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\titems = java.util.Collections.singletonList(this.items.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\titems = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.items));\n\t\t\t}\n\t\t\treturn new BuilderDefaultsWarnings(this.x, this.z, items);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderDefaultsWarnings.BuilderDefaultsWarningsBuilder(x=\" + this.x + \", z=\" + this.z + \", items=\" + this.items + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderDefaultsWarnings.BuilderDefaultsWarningsBuilder builder() {\n\t\treturn new BuilderDefaultsWarnings.BuilderDefaultsWarningsBuilder();\n\t}\n}\nclass NoBuilderButHasDefaults {\n\tprivate final long z = 5;\n\tpublic NoBuilderButHasDefaults() {\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class NoBuilderButHasDefaultsBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tNoBuilderButHasDefaultsBuilder() {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic NoBuilderButHasDefaults build() {\n\t\t\treturn new NoBuilderButHasDefaults();\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"NoBuilderButHasDefaults.NoBuilderButHasDefaultsBuilder()\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static NoBuilderButHasDefaults.NoBuilderButHasDefaultsBuilder builder() {\n\t\treturn new NoBuilderButHasDefaults.NoBuilderButHasDefaultsBuilder();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderGenericMethod.java",
    "content": "import java.util.List;\nimport java.util.*;\nclass BuilderGenericMethod<T> {\n\tpublic <N extends Number> Map<N, T> foo(int a, long b) {\n\t\treturn null;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic class MapBuilder<N extends Number> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int a;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate long b;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tMapBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderGenericMethod<T>.MapBuilder<N> a(final int a) {\n\t\t\tthis.a = a;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderGenericMethod<T>.MapBuilder<N> b(final long b) {\n\t\t\tthis.b = b;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic Map<N, T> build() {\n\t\t\treturn BuilderGenericMethod.this.<N>foo(this.a, this.b);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderGenericMethod.MapBuilder(a=\" + this.a + \", b=\" + this.b + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic <N extends Number> BuilderGenericMethod<T>.MapBuilder<N> builder() {\n\t\treturn this.new MapBuilder<N>();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderInAnonymousClass.java",
    "content": "public class BuilderInAnonymousClass {\n\tObject annonymous = new Object() {\n\n\t\tclass Inner {\n\t\t\tprivate String string;\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderInstanceMethod.java",
    "content": "import java.util.List;\nclass BuilderInstanceMethod<T> {\n\tpublic String create(int show, final int yes, List<T> also, int $andMe) {\n\t\treturn \"\" + show + yes + also + $andMe;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic class StringBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int show;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int yes;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate List<T> also;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int $andMe;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tStringBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderInstanceMethod<T>.StringBuilder show(final int show) {\n\t\t\tthis.show = show;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderInstanceMethod<T>.StringBuilder yes(final int yes) {\n\t\t\tthis.yes = yes;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderInstanceMethod<T>.StringBuilder also(final List<T> also) {\n\t\t\tthis.also = also;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderInstanceMethod<T>.StringBuilder $andMe(final int $andMe) {\n\t\t\tthis.$andMe = $andMe;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic String build() {\n\t\t\treturn BuilderInstanceMethod.this.create(this.show, this.yes, this.also, this.$andMe);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderInstanceMethod.StringBuilder(show=\" + this.show + \", yes=\" + this.yes + \", also=\" + this.also + \", $andMe=\" + this.$andMe + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic BuilderInstanceMethod<T>.StringBuilder builder() {\n\t\treturn this.new StringBuilder();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderJavadoc.java",
    "content": "import java.util.List;\nclass BuilderJavadoc<T> {\n\t/**\n\t * basic gets only a builder setter.\n\t * @see #getsetwith\n\t * @return tag is removed from the setter.\n\t */\n\tprivate final int basic;\n\t/**\n\t * getsetwith gets a builder setter, an instance getter and setter, and a wither.\n\t */\n\tprivate int getsetwith;\n\t/**\n\t * Predef has a predefined builder setter with no javadoc, and the builder setter does not get this one.\n\t * @param tag remains on the field.\n\t * @return tag remains on the field.\n\t */\n\tprivate final int predef;\n\t/**\n\t * predefWithJavadoc has a predefined builder setter with javadoc, so it keeps that one untouched.\n\t * @param tag is removed from the field.\n\t * @return tag remains on the field.\n\t */\n\tprivate final int predefWithJavadoc;\n\tpublic static class BuilderJavadocBuilder<T> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int basic;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int getsetwith;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int predef;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int predefWithJavadoc;\n\t\tpublic BuilderJavadocBuilder<T> predef(final int x) {\n\t\t\tthis.predef = x * 10;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * This javadoc remains untouched.\n\t\t * @param x 1/100 of the thing\n\t\t * @return the updated builder\n\t\t */\n\t\tpublic BuilderJavadocBuilder<T> predefWithJavadoc(final int x) {\n\t\t\tthis.predefWithJavadoc = x * 100;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderJavadocBuilder() {\n\t\t}\n\t\t/**\n\t\t * basic gets only a builder setter.\n\t\t * @see #getsetwith\n\t\t * @param tag is moved to the setter.\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderJavadoc.BuilderJavadocBuilder<T> basic(final int basic) {\n\t\t\tthis.basic = basic;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * getsetwith gets a builder setter, an instance getter and setter, and a wither.\n\t\t * @param tag is moved to the setters and wither.\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderJavadoc.BuilderJavadocBuilder<T> getsetwith(final int getsetwith) {\n\t\t\tthis.getsetwith = getsetwith;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderJavadoc<T> build() {\n\t\t\treturn new BuilderJavadoc<T>(this.basic, this.getsetwith, this.predef, this.predefWithJavadoc);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderJavadoc.BuilderJavadocBuilder(basic=\" + this.basic + \", getsetwith=\" + this.getsetwith + \", predef=\" + this.predef + \", predefWithJavadoc=\" + this.predefWithJavadoc + \")\";\n\t\t}\n\t}\n\t/**\n\t * Creates a new {@code BuilderJavadoc} instance.\n\t *\n\t * @param basic basic gets only a builder setter.\n\t * @see #getsetwith\n\t * @param getsetwith getsetwith gets a builder setter, an instance getter and setter, and a wither.\n\t * @param predef Predef has a predefined builder setter with no javadoc, and the builder setter does not get this one.\n\t * @param predefWithJavadoc predefWithJavadoc has a predefined builder setter with javadoc, so it keeps that one untouched.\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderJavadoc(final int basic, final int getsetwith, final int predef, final int predefWithJavadoc) {\n\t\tthis.basic = basic;\n\t\tthis.getsetwith = getsetwith;\n\t\tthis.predef = predef;\n\t\tthis.predefWithJavadoc = predefWithJavadoc;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static <T> BuilderJavadoc.BuilderJavadocBuilder<T> builder() {\n\t\treturn new BuilderJavadoc.BuilderJavadocBuilder<T>();\n\t}\n\t/**\n\t * getsetwith gets a builder setter, an instance getter and setter, and a wither.\n\t * @return tag is moved to the getter.\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getGetsetwith() {\n\t\treturn this.getsetwith;\n\t}\n\t/**\n\t * getsetwith gets a builder setter, an instance getter and setter, and a wither.\n\t * @param tag is moved to the setters and wither.\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setGetsetwith(final int getsetwith) {\n\t\tthis.getsetwith = getsetwith;\n\t}\n\t/**\n\t * getsetwith gets a builder setter, an instance getter and setter, and a wither.\n\t * @param tag is moved to the setters and wither.\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic BuilderJavadoc<T> withGetsetwith(final int getsetwith) {\n\t\treturn this.getsetwith == getsetwith ? this : new BuilderJavadoc<T>(this.basic, getsetwith, this.predef, this.predefWithJavadoc);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderNestedInEnum.java",
    "content": "class BuilderNestedInEnum {\n\tpublic enum TestEnum {\n\t\tFOO, BAR;\n\t\tpublic static final class TestBuilder {\n\t\t\tprivate final String field;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tTestBuilder(final String field) {\n\t\t\t\tthis.field = field;\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic static class TestBuilderBuilder {\n\t\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t\t@lombok.Generated\n\t\t\t\tprivate String field;\n\t\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t\t@lombok.Generated\n\t\t\t\tTestBuilderBuilder() {\n\t\t\t\t}\n\t\t\t\t/**\n\t\t\t\t * @return {@code this}.\n\t\t\t\t */\n\t\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t\t@lombok.Generated\n\t\t\t\tpublic BuilderNestedInEnum.TestEnum.TestBuilder.TestBuilderBuilder field(final String field) {\n\t\t\t\t\tthis.field = field;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t\t@lombok.Generated\n\t\t\t\tpublic BuilderNestedInEnum.TestEnum.TestBuilder build() {\n\t\t\t\t\treturn new BuilderNestedInEnum.TestEnum.TestBuilder(this.field);\n\t\t\t\t}\n\t\t\t\t@java.lang.Override\n\t\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t\t@lombok.Generated\n\t\t\t\tpublic java.lang.String toString() {\n\t\t\t\t\treturn \"BuilderNestedInEnum.TestEnum.TestBuilder.TestBuilderBuilder(field=\" + this.field + \")\";\n\t\t\t\t}\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic static BuilderNestedInEnum.TestEnum.TestBuilder.TestBuilderBuilder builder() {\n\t\t\t\treturn new BuilderNestedInEnum.TestEnum.TestBuilder.TestBuilderBuilder();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic String getField() {\n\t\t\t\treturn this.field;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic boolean equals(final java.lang.Object o) {\n\t\t\t\tif (o == this) return true;\n\t\t\t\tif (!(o instanceof BuilderNestedInEnum.TestEnum.TestBuilder)) return false;\n\t\t\t\tfinal BuilderNestedInEnum.TestEnum.TestBuilder other = (BuilderNestedInEnum.TestEnum.TestBuilder) o;\n\t\t\t\tfinal java.lang.Object this$field = this.getField();\n\t\t\t\tfinal java.lang.Object other$field = other.getField();\n\t\t\t\tif (this$field == null ? other$field != null : !this$field.equals(other$field)) return false;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic int hashCode() {\n\t\t\t\tfinal int PRIME = 59;\n\t\t\t\tint result = 1;\n\t\t\t\tfinal java.lang.Object $field = this.getField();\n\t\t\t\tresult = result * PRIME + ($field == null ? 43 : $field.hashCode());\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"BuilderNestedInEnum.TestEnum.TestBuilder(field=\" + this.getField() + \")\";\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderNestedJavadoc.java",
    "content": "public class BuilderNestedJavadoc {\n\tpublic static class NestedClass {\n\t\t/**\n\t\t * Example javadoc\n\t\t */\n\t\tString name;\n\t\t/**\n\t\t * Creates a new {@code NestedClass} instance.\n\t\t *\n\t\t * @param name Example javadoc\n\t\t */\t\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tNestedClass(final String name) {\n\t\t\tthis.name = name;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static class NestedClassBuilder {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate String name;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tNestedClassBuilder() {\n\t\t\t}\n\t\t\t/**\n\t\t\t * Example javadoc\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic BuilderNestedJavadoc.NestedClass.NestedClassBuilder name(final String name) {\n\t\t\t\tthis.name = name;\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic BuilderNestedJavadoc.NestedClass build() {\n\t\t\t\treturn new BuilderNestedJavadoc.NestedClass(this.name);\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"BuilderNestedJavadoc.NestedClass.NestedClassBuilder(name=\" + this.name + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static BuilderNestedJavadoc.NestedClass.NestedClassBuilder builder() {\n\t\t\treturn new BuilderNestedJavadoc.NestedClass.NestedClassBuilder();\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderNestedJavadoc() {\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderNestedJavadocBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderNestedJavadocBuilder() {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderNestedJavadoc build() {\n\t\t\treturn new BuilderNestedJavadoc();\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderNestedJavadoc.BuilderNestedJavadocBuilder()\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderNestedJavadoc.BuilderNestedJavadocBuilder builder() {\n\t\treturn new BuilderNestedJavadoc.BuilderNestedJavadocBuilder();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderOnNestedClass.java",
    "content": "public class BuilderOnNestedClass<T> {\n\tprivate T t;\n\tpublic static class Nested {\n\t\tprivate String a;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tNested(final String a) {\n\t\t\tthis.a = a;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static class NestedBuilder {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate String a;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tNestedBuilder() {\n\t\t\t}\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic BuilderOnNestedClass.Nested.NestedBuilder a(final String a) {\n\t\t\t\tthis.a = a;\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic BuilderOnNestedClass.Nested build() {\n\t\t\t\treturn new BuilderOnNestedClass.Nested(this.a);\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"BuilderOnNestedClass.Nested.NestedBuilder(a=\" + this.a + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static BuilderOnNestedClass.Nested.NestedBuilder builder() {\n\t\t\treturn new BuilderOnNestedClass.Nested.NestedBuilder();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderOnNestedRecord.java",
    "content": "// version 14:\npublic record BuilderOnNestedRecord<T>(T t) {\n\tpublic record Nested(String a) {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static class NestedBuilder {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate String a;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tNestedBuilder() {\n\t\t\t}\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic BuilderOnNestedRecord.Nested.NestedBuilder a(final String a) {\n\t\t\t\tthis.a = a;\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic BuilderOnNestedRecord.Nested build() {\n\t\t\t\treturn new BuilderOnNestedRecord.Nested(this.a);\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"BuilderOnNestedRecord.Nested.NestedBuilder(a=\" + this.a + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static BuilderOnNestedRecord.Nested.NestedBuilder builder() {\n\t\t\treturn new BuilderOnNestedRecord.Nested.NestedBuilder();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderSimple.java",
    "content": "import java.util.List;\nclass BuilderSimple<T> {\n\tprivate final int noshow = 0;\n\tprivate final int yes;\n\tprivate List<T> also;\n\tprivate int $butNotMe;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderSimple(final int yes, final List<T> also) {\n\t\tthis.yes = yes;\n\t\tthis.also = also;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected static class BuilderSimpleBuilder<T> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int yes;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate List<T> also;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderSimpleBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSimple.BuilderSimpleBuilder<T> yes(final int yes) {\n\t\t\tthis.yes = yes;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSimple.BuilderSimpleBuilder<T> also(final List<T> also) {\n\t\t\tthis.also = also;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSimple<T> build() {\n\t\t\treturn new BuilderSimple<T>(this.yes, this.also);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderSimple.BuilderSimpleBuilder(yes=\" + this.yes + \", also=\" + this.also + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected static <T> BuilderSimple.BuilderSimpleBuilder<T> builder() {\n\t\treturn new BuilderSimple.BuilderSimpleBuilder<T>();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderSimpleOnRecord.java",
    "content": "// version 14:\nimport java.util.List;\npublic record BuilderSimpleOnRecord<T>(List<T> l, String a) {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected static class BuilderSimpleOnRecordBuilder<T> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate List<T> l;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate String a;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderSimpleOnRecordBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSimpleOnRecord.BuilderSimpleOnRecordBuilder<T> l(final List<T> l) {\n\t\t\tthis.l = l;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSimpleOnRecord.BuilderSimpleOnRecordBuilder<T> a(final String a) {\n\t\t\tthis.a = a;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSimpleOnRecord<T> build() {\n\t\t\treturn new BuilderSimpleOnRecord<T>(this.l, this.a);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderSimpleOnRecord.BuilderSimpleOnRecordBuilder(l=\" + this.l + \", a=\" + this.a + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected static <T> BuilderSimpleOnRecord.BuilderSimpleOnRecordBuilder<T> builder() {\n\t\treturn new BuilderSimpleOnRecord.BuilderSimpleOnRecordBuilder<T>();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderSimpleWithSetterPrefix.java",
    "content": "import java.util.List;\nclass BuilderSimpleWithSetterPrefix<T> {\n\tprivate int unprefixed;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderSimpleWithSetterPrefix(final int unprefixed) {\n\t\tthis.unprefixed = unprefixed;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected static class BuilderSimpleWithSetterPrefixBuilder<T> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int unprefixed;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderSimpleWithSetterPrefixBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSimpleWithSetterPrefix.BuilderSimpleWithSetterPrefixBuilder<T> withUnprefixed(final int unprefixed) {\n\t\t\tthis.unprefixed = unprefixed;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSimpleWithSetterPrefix<T> build() {\n\t\t\treturn new BuilderSimpleWithSetterPrefix<T>(this.unprefixed);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderSimpleWithSetterPrefix.BuilderSimpleWithSetterPrefixBuilder(unprefixed=\" + this.unprefixed + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected static <T> BuilderSimpleWithSetterPrefix.BuilderSimpleWithSetterPrefixBuilder<T> builder() {\n\t\treturn new BuilderSimpleWithSetterPrefix.BuilderSimpleWithSetterPrefixBuilder<T>();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderSingularAnnotatedTypes.java",
    "content": "//version 8:\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.Set;\nimport java.util.Map;\nimport lombok.NonNull;\n@Target(ElementType.TYPE_USE)\n@interface MyAnnotation {\n}\nclass BuilderSingularAnnotatedTypes {\n\tprivate Set<@MyAnnotation @NonNull String> foos;\n\tprivate Map<@MyAnnotation @NonNull String, @MyAnnotation @NonNull Integer> bars;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderSingularAnnotatedTypes(final Set<@MyAnnotation @NonNull String> foos, final Map<@MyAnnotation @NonNull String, @MyAnnotation @NonNull Integer> bars) {\n\t\tthis.foos = foos;\n\t\tthis.bars = bars;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderSingularAnnotatedTypesBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<@MyAnnotation @NonNull String> foos;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<@MyAnnotation @NonNull String> bars$key;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<@MyAnnotation @NonNull Integer> bars$value;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderSingularAnnotatedTypesBuilder() {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularAnnotatedTypes.BuilderSingularAnnotatedTypesBuilder foo(@MyAnnotation @NonNull final String foo) {\n\t\t\tif (foo == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"foo is marked non-null but is null\");\n\t\t\t}\n\t\t\tif (this.foos == null) this.foos = new java.util.ArrayList<@MyAnnotation @NonNull String>();\n\t\t\tthis.foos.add(foo);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularAnnotatedTypes.BuilderSingularAnnotatedTypesBuilder foos(final java.util.Collection<? extends @MyAnnotation @NonNull String> foos) {\n\t\t\tif (foos == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"foos cannot be null\");\n\t\t\t}\n\t\t\tif (this.foos == null) this.foos = new java.util.ArrayList<@MyAnnotation @NonNull String>();\n\t\t\tthis.foos.addAll(foos);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularAnnotatedTypes.BuilderSingularAnnotatedTypesBuilder clearFoos() {\n\t\t\tif (this.foos != null) this.foos.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularAnnotatedTypes.BuilderSingularAnnotatedTypesBuilder bar(@MyAnnotation @NonNull final String barKey, @MyAnnotation @NonNull final Integer barValue) {\n\t\t\tif (barKey == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"barKey is marked non-null but is null\");\n\t\t\t}\n\t\t\tif (barValue == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"barValue is marked non-null but is null\");\n\t\t\t}\n\t\t\tif (this.bars$key == null) {\n\t\t\t\tthis.bars$key = new java.util.ArrayList<@MyAnnotation @NonNull String>();\n\t\t\t\tthis.bars$value = new java.util.ArrayList<@MyAnnotation @NonNull Integer>();\n\t\t\t}\n\t\t\tthis.bars$key.add(barKey);\n\t\t\tthis.bars$value.add(barValue);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularAnnotatedTypes.BuilderSingularAnnotatedTypesBuilder bars(final java.util.Map<? extends @MyAnnotation @NonNull String, ? extends @MyAnnotation @NonNull Integer> bars) {\n\t\t\tif (bars == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"bars cannot be null\");\n\t\t\t}\n\t\t\tif (this.bars$key == null) {\n\t\t\t\tthis.bars$key = new java.util.ArrayList<@MyAnnotation @NonNull String>();\n\t\t\t\tthis.bars$value = new java.util.ArrayList<@MyAnnotation @NonNull Integer>();\n\t\t\t}\n\t\t\tfor (final java.util.Map.Entry<? extends @MyAnnotation @NonNull String, ? extends @MyAnnotation @NonNull Integer> $lombokEntry : bars.entrySet()) {\n\t\t\t\tthis.bars$key.add($lombokEntry.getKey());\n\t\t\t\tthis.bars$value.add($lombokEntry.getValue());\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularAnnotatedTypes.BuilderSingularAnnotatedTypesBuilder clearBars() {\n\t\t\tif (this.bars$key != null) {\n\t\t\t\tthis.bars$key.clear();\n\t\t\t\tthis.bars$value.clear();\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularAnnotatedTypes build() {\n\t\t\tjava.util.Set<@MyAnnotation @NonNull String> foos;\n\t\t\tswitch (this.foos == null ? 0 : this.foos.size()) {\n\t\t\tcase 0: \n\t\t\t\tfoos = java.util.Collections.emptySet();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tfoos = java.util.Collections.singleton(this.foos.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tfoos = new java.util.LinkedHashSet<@MyAnnotation @NonNull String>(this.foos.size() < 1073741824 ? 1 + this.foos.size() + (this.foos.size() - 3) / 3 : java.lang.Integer.MAX_VALUE);\n\t\t\t\tfoos.addAll(this.foos);\n\t\t\t\tfoos = java.util.Collections.unmodifiableSet(foos);\n\t\t\t}\n\t\t\tjava.util.Map<@MyAnnotation @NonNull String, @MyAnnotation @NonNull Integer> bars;\n\t\t\tswitch (this.bars$key == null ? 0 : this.bars$key.size()) {\n\t\t\tcase 0: \n\t\t\t\tbars = java.util.Collections.emptyMap();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tbars = java.util.Collections.singletonMap(this.bars$key.get(0), this.bars$value.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tbars = new java.util.LinkedHashMap<@MyAnnotation @NonNull String, @MyAnnotation @NonNull Integer>(this.bars$key.size() < 1073741824 ? 1 + this.bars$key.size() + (this.bars$key.size() - 3) / 3 : java.lang.Integer.MAX_VALUE);\n\t\t\t\tfor (int $i = 0; $i < this.bars$key.size(); $i++) bars.put(this.bars$key.get($i), (@MyAnnotation @NonNull Integer) this.bars$value.get($i));\n\t\t\t\tbars = java.util.Collections.unmodifiableMap(bars);\n\t\t\t}\n\t\t\treturn new BuilderSingularAnnotatedTypes(foos, bars);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderSingularAnnotatedTypes.BuilderSingularAnnotatedTypesBuilder(foos=\" + this.foos + \", bars$key=\" + this.bars$key + \", bars$value=\" + this.bars$value + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderSingularAnnotatedTypes.BuilderSingularAnnotatedTypesBuilder builder() {\n\t\treturn new BuilderSingularAnnotatedTypes.BuilderSingularAnnotatedTypesBuilder();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderSingularAnnotatedTypesWithSetterPrefix.java",
    "content": "//version 8:\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.Set;\nimport java.util.Map;\nimport lombok.NonNull;\n@Target(ElementType.TYPE_USE)\n@interface MyAnnotation {\n}\nclass BuilderSingularAnnotatedTypesWithSetterPrefix {\n\tprivate Set<@MyAnnotation @NonNull String> foos;\n\tprivate Map<@MyAnnotation @NonNull String, @MyAnnotation @NonNull Integer> bars;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderSingularAnnotatedTypesWithSetterPrefix(final Set<@MyAnnotation @NonNull String> foos, final Map<@MyAnnotation @NonNull String, @MyAnnotation @NonNull Integer> bars) {\n\t\tthis.foos = foos;\n\t\tthis.bars = bars;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderSingularAnnotatedTypesWithSetterPrefixBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<@MyAnnotation @NonNull String> foos;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<@MyAnnotation @NonNull String> bars$key;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<@MyAnnotation @NonNull Integer> bars$value;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderSingularAnnotatedTypesWithSetterPrefixBuilder() {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularAnnotatedTypesWithSetterPrefix.BuilderSingularAnnotatedTypesWithSetterPrefixBuilder withFoo(@MyAnnotation @NonNull final String foo) {\n\t\t\tif (foo == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"foo is marked non-null but is null\");\n\t\t\t}\n\t\t\tif (this.foos == null) this.foos = new java.util.ArrayList<@MyAnnotation @NonNull String>();\n\t\t\tthis.foos.add(foo);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularAnnotatedTypesWithSetterPrefix.BuilderSingularAnnotatedTypesWithSetterPrefixBuilder withFoos(final java.util.Collection<? extends @MyAnnotation @NonNull String> foos) {\n\t\t\tif (foos == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"foos cannot be null\");\n\t\t\t}\n\t\t\tif (this.foos == null) this.foos = new java.util.ArrayList<@MyAnnotation @NonNull String>();\n\t\t\tthis.foos.addAll(foos);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularAnnotatedTypesWithSetterPrefix.BuilderSingularAnnotatedTypesWithSetterPrefixBuilder clearFoos() {\n\t\t\tif (this.foos != null) this.foos.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularAnnotatedTypesWithSetterPrefix.BuilderSingularAnnotatedTypesWithSetterPrefixBuilder withBar(@MyAnnotation @NonNull final String barKey, @MyAnnotation @NonNull final Integer barValue) {\n\t\t\tif (barKey == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"barKey is marked non-null but is null\");\n\t\t\t}\n\t\t\tif (barValue == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"barValue is marked non-null but is null\");\n\t\t\t}\n\t\t\tif (this.bars$key == null) {\n\t\t\t\tthis.bars$key = new java.util.ArrayList<@MyAnnotation @NonNull String>();\n\t\t\t\tthis.bars$value = new java.util.ArrayList<@MyAnnotation @NonNull Integer>();\n\t\t\t}\n\t\t\tthis.bars$key.add(barKey);\n\t\t\tthis.bars$value.add(barValue);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularAnnotatedTypesWithSetterPrefix.BuilderSingularAnnotatedTypesWithSetterPrefixBuilder withBars(final java.util.Map<? extends @MyAnnotation @NonNull String, ? extends @MyAnnotation @NonNull Integer> bars) {\n\t\t\tif (bars == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"bars cannot be null\");\n\t\t\t}\n\t\t\tif (this.bars$key == null) {\n\t\t\t\tthis.bars$key = new java.util.ArrayList<@MyAnnotation @NonNull String>();\n\t\t\t\tthis.bars$value = new java.util.ArrayList<@MyAnnotation @NonNull Integer>();\n\t\t\t}\n\t\t\tfor (final java.util.Map.Entry<? extends @MyAnnotation @NonNull String, ? extends @MyAnnotation @NonNull Integer> $lombokEntry : bars.entrySet()) {\n\t\t\t\tthis.bars$key.add($lombokEntry.getKey());\n\t\t\t\tthis.bars$value.add($lombokEntry.getValue());\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularAnnotatedTypesWithSetterPrefix.BuilderSingularAnnotatedTypesWithSetterPrefixBuilder clearBars() {\n\t\t\tif (this.bars$key != null) {\n\t\t\t\tthis.bars$key.clear();\n\t\t\t\tthis.bars$value.clear();\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularAnnotatedTypesWithSetterPrefix build() {\n\t\t\tjava.util.Set<@MyAnnotation @NonNull String> foos;\n\t\t\tswitch (this.foos == null ? 0 : this.foos.size()) {\n\t\t\tcase 0: \n\t\t\t\tfoos = java.util.Collections.emptySet();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tfoos = java.util.Collections.singleton(this.foos.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tfoos = new java.util.LinkedHashSet<@MyAnnotation @NonNull String>(this.foos.size() < 1073741824 ? 1 + this.foos.size() + (this.foos.size() - 3) / 3 : java.lang.Integer.MAX_VALUE);\n\t\t\t\tfoos.addAll(this.foos);\n\t\t\t\tfoos = java.util.Collections.unmodifiableSet(foos);\n\t\t\t}\n\t\t\tjava.util.Map<@MyAnnotation @NonNull String, @MyAnnotation @NonNull Integer> bars;\n\t\t\tswitch (this.bars$key == null ? 0 : this.bars$key.size()) {\n\t\t\tcase 0: \n\t\t\t\tbars = java.util.Collections.emptyMap();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tbars = java.util.Collections.singletonMap(this.bars$key.get(0), this.bars$value.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tbars = new java.util.LinkedHashMap<@MyAnnotation @NonNull String, @MyAnnotation @NonNull Integer>(this.bars$key.size() < 1073741824 ? 1 + this.bars$key.size() + (this.bars$key.size() - 3) / 3 : java.lang.Integer.MAX_VALUE);\n\t\t\t\tfor (int $i = 0; $i < this.bars$key.size(); $i++) bars.put(this.bars$key.get($i), (@MyAnnotation @NonNull Integer) this.bars$value.get($i));\n\t\t\t\tbars = java.util.Collections.unmodifiableMap(bars);\n\t\t\t}\n\t\t\treturn new BuilderSingularAnnotatedTypesWithSetterPrefix(foos, bars);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderSingularAnnotatedTypesWithSetterPrefix.BuilderSingularAnnotatedTypesWithSetterPrefixBuilder(foos=\" + this.foos + \", bars$key=\" + this.bars$key + \", bars$value=\" + this.bars$value + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderSingularAnnotatedTypesWithSetterPrefix.BuilderSingularAnnotatedTypesWithSetterPrefixBuilder builder() {\n\t\treturn new BuilderSingularAnnotatedTypesWithSetterPrefix.BuilderSingularAnnotatedTypesWithSetterPrefixBuilder();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderSingularGuavaListsSets.java",
    "content": "import com.google.common.collect.ImmutableList;\nimport com.google.common.collect.ImmutableCollection;\nimport com.google.common.collect.ImmutableSet;\nimport com.google.common.collect.ImmutableSortedSet;\nimport com.google.common.collect.ImmutableTable;\nclass BuilderSingularGuavaListsSets<T> {\n\tprivate ImmutableList<T> cards;\n\tprivate ImmutableCollection<? extends Number> frogs;\n\t@SuppressWarnings(\"all\")\n\tprivate ImmutableSet rawSet;\n\tprivate ImmutableSortedSet<String> passes;\n\tprivate ImmutableTable<? extends Number, ? extends Number, String> users;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderSingularGuavaListsSets(final ImmutableList<T> cards, final ImmutableCollection<? extends Number> frogs, final ImmutableSet rawSet, final ImmutableSortedSet<String> passes, final ImmutableTable<? extends Number, ? extends Number, String> users) {\n\t\tthis.cards = cards;\n\t\tthis.frogs = frogs;\n\t\tthis.rawSet = rawSet;\n\t\tthis.passes = passes;\n\t\tthis.users = users;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderSingularGuavaListsSetsBuilder<T> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate com.google.common.collect.ImmutableList.Builder<T> cards;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate com.google.common.collect.ImmutableList.Builder<Number> frogs;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate com.google.common.collect.ImmutableSet.Builder<java.lang.Object> rawSet;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate com.google.common.collect.ImmutableSortedSet.Builder<String> passes;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate com.google.common.collect.ImmutableTable.Builder<Number, Number, String> users;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderSingularGuavaListsSetsBuilder() {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> card(final T card) {\n\t\t\tif (this.cards == null) this.cards = com.google.common.collect.ImmutableList.builder();\n\t\t\tthis.cards.add(card);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> cards(final java.lang.Iterable<? extends T> cards) {\n\t\t\tif (cards == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"cards cannot be null\");\n\t\t\t}\n\t\t\tif (this.cards == null) this.cards = com.google.common.collect.ImmutableList.builder();\n\t\t\tthis.cards.addAll(cards);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> clearCards() {\n\t\t\tthis.cards = null;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> frog(final Number frog) {\n\t\t\tif (this.frogs == null) this.frogs = com.google.common.collect.ImmutableList.builder();\n\t\t\tthis.frogs.add(frog);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> frogs(final java.lang.Iterable<? extends Number> frogs) {\n\t\t\tif (frogs == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"frogs cannot be null\");\n\t\t\t}\n\t\t\tif (this.frogs == null) this.frogs = com.google.common.collect.ImmutableList.builder();\n\t\t\tthis.frogs.addAll(frogs);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> clearFrogs() {\n\t\t\tthis.frogs = null;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> rawSet(final java.lang.Object rawSet) {\n\t\t\tif (this.rawSet == null) this.rawSet = com.google.common.collect.ImmutableSet.builder();\n\t\t\tthis.rawSet.add(rawSet);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> rawSet(final java.lang.Iterable<?> rawSet) {\n\t\t\tif (rawSet == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"rawSet cannot be null\");\n\t\t\t}\n\t\t\tif (this.rawSet == null) this.rawSet = com.google.common.collect.ImmutableSet.builder();\n\t\t\tthis.rawSet.addAll(rawSet);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> clearRawSet() {\n\t\t\tthis.rawSet = null;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> pass(final String pass) {\n\t\t\tif (this.passes == null) this.passes = com.google.common.collect.ImmutableSortedSet.naturalOrder();\n\t\t\tthis.passes.add(pass);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> passes(final java.lang.Iterable<? extends String> passes) {\n\t\t\tif (passes == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"passes cannot be null\");\n\t\t\t}\n\t\t\tif (this.passes == null) this.passes = com.google.common.collect.ImmutableSortedSet.naturalOrder();\n\t\t\tthis.passes.addAll(passes);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> clearPasses() {\n\t\t\tthis.passes = null;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> user(final Number rowKey, final Number columnKey, final String value) {\n\t\t\tif (this.users == null) this.users = com.google.common.collect.ImmutableTable.builder();\n\t\t\tthis.users.put(rowKey, columnKey, value);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> users(final com.google.common.collect.Table<? extends Number, ? extends Number, ? extends String> users) {\n\t\t\tif (users == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"users cannot be null\");\n\t\t\t}\n\t\t\tif (this.users == null) this.users = com.google.common.collect.ImmutableTable.builder();\n\t\t\tthis.users.putAll(users);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> clearUsers() {\n\t\t\tthis.users = null;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularGuavaListsSets<T> build() {\n\t\t\tcom.google.common.collect.ImmutableList<T> cards = this.cards == null ? com.google.common.collect.ImmutableList.<T>of() : this.cards.build();\n\t\t\tcom.google.common.collect.ImmutableCollection<Number> frogs = this.frogs == null ? com.google.common.collect.ImmutableList.<Number>of() : this.frogs.build();\n\t\t\tcom.google.common.collect.ImmutableSet<java.lang.Object> rawSet = this.rawSet == null ? com.google.common.collect.ImmutableSet.<java.lang.Object>of() : this.rawSet.build();\n\t\t\tcom.google.common.collect.ImmutableSortedSet<String> passes = this.passes == null ? com.google.common.collect.ImmutableSortedSet.<String>of() : this.passes.build();\n\t\t\tcom.google.common.collect.ImmutableTable<Number, Number, String> users = this.users == null ? com.google.common.collect.ImmutableTable.<Number, Number, String>of() : this.users.build();\n\t\t\treturn new BuilderSingularGuavaListsSets<T>(cards, frogs, rawSet, passes, users);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder(cards=\" + this.cards + \", frogs=\" + this.frogs + \", rawSet=\" + this.rawSet + \", passes=\" + this.passes + \", users=\" + this.users + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static <T> BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> builder() {\n\t\treturn new BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T>();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderSingularGuavaMaps.java",
    "content": "import com.google.common.collect.ImmutableMap;\nimport com.google.common.collect.ImmutableBiMap;\nimport com.google.common.collect.ImmutableSortedMap;\nclass BuilderSingularGuavaMaps<K, V> {\n\tprivate ImmutableMap<K, V> battleaxes;\n\tprivate ImmutableSortedMap<Integer, ? extends V> vertices;\n\t@SuppressWarnings(\"all\")\n\tprivate ImmutableBiMap rawMap;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderSingularGuavaMaps(final ImmutableMap<K, V> battleaxes, final ImmutableSortedMap<Integer, ? extends V> vertices, final ImmutableBiMap rawMap) {\n\t\tthis.battleaxes = battleaxes;\n\t\tthis.vertices = vertices;\n\t\tthis.rawMap = rawMap;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderSingularGuavaMapsBuilder<K, V> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate com.google.common.collect.ImmutableMap.Builder<K, V> battleaxes;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate com.google.common.collect.ImmutableSortedMap.Builder<Integer, V> vertices;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate com.google.common.collect.ImmutableBiMap.Builder<java.lang.Object, java.lang.Object> rawMap;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderSingularGuavaMapsBuilder() {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularGuavaMaps.BuilderSingularGuavaMapsBuilder<K, V> battleaxe(final K key, final V value) {\n\t\t\tif (this.battleaxes == null) this.battleaxes = com.google.common.collect.ImmutableMap.builder();\n\t\t\tthis.battleaxes.put(key, value);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularGuavaMaps.BuilderSingularGuavaMapsBuilder<K, V> battleaxes(final java.util.Map<? extends K, ? extends V> battleaxes) {\n\t\t\tif (battleaxes == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"battleaxes cannot be null\");\n\t\t\t}\n\t\t\tif (this.battleaxes == null) this.battleaxes = com.google.common.collect.ImmutableMap.builder();\n\t\t\tthis.battleaxes.putAll(battleaxes);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularGuavaMaps.BuilderSingularGuavaMapsBuilder<K, V> clearBattleaxes() {\n\t\t\tthis.battleaxes = null;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularGuavaMaps.BuilderSingularGuavaMapsBuilder<K, V> vertex(final Integer key, final V value) {\n\t\t\tif (this.vertices == null) this.vertices = com.google.common.collect.ImmutableSortedMap.naturalOrder();\n\t\t\tthis.vertices.put(key, value);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularGuavaMaps.BuilderSingularGuavaMapsBuilder<K, V> vertices(final java.util.Map<? extends Integer, ? extends V> vertices) {\n\t\t\tif (vertices == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"vertices cannot be null\");\n\t\t\t}\n\t\t\tif (this.vertices == null) this.vertices = com.google.common.collect.ImmutableSortedMap.naturalOrder();\n\t\t\tthis.vertices.putAll(vertices);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularGuavaMaps.BuilderSingularGuavaMapsBuilder<K, V> clearVertices() {\n\t\t\tthis.vertices = null;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularGuavaMaps.BuilderSingularGuavaMapsBuilder<K, V> rawMap(final java.lang.Object key, final java.lang.Object value) {\n\t\t\tif (this.rawMap == null) this.rawMap = com.google.common.collect.ImmutableBiMap.builder();\n\t\t\tthis.rawMap.put(key, value);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularGuavaMaps.BuilderSingularGuavaMapsBuilder<K, V> rawMap(final java.util.Map<?, ?> rawMap) {\n\t\t\tif (rawMap == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"rawMap cannot be null\");\n\t\t\t}\n\t\t\tif (this.rawMap == null) this.rawMap = com.google.common.collect.ImmutableBiMap.builder();\n\t\t\tthis.rawMap.putAll(rawMap);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularGuavaMaps.BuilderSingularGuavaMapsBuilder<K, V> clearRawMap() {\n\t\t\tthis.rawMap = null;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularGuavaMaps<K, V> build() {\n\t\t\tcom.google.common.collect.ImmutableMap<K, V> battleaxes = this.battleaxes == null ? com.google.common.collect.ImmutableMap.<K, V>of() : this.battleaxes.build();\n\t\t\tcom.google.common.collect.ImmutableSortedMap<Integer, V> vertices = this.vertices == null ? com.google.common.collect.ImmutableSortedMap.<Integer, V>of() : this.vertices.build();\n\t\t\tcom.google.common.collect.ImmutableBiMap<java.lang.Object, java.lang.Object> rawMap = this.rawMap == null ? com.google.common.collect.ImmutableBiMap.<java.lang.Object, java.lang.Object>of() : this.rawMap.build();\n\t\t\treturn new BuilderSingularGuavaMaps<K, V>(battleaxes, vertices, rawMap);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderSingularGuavaMaps.BuilderSingularGuavaMapsBuilder(battleaxes=\" + this.battleaxes + \", vertices=\" + this.vertices + \", rawMap=\" + this.rawMap + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static <K, V> BuilderSingularGuavaMaps.BuilderSingularGuavaMapsBuilder<K, V> builder() {\n\t\treturn new BuilderSingularGuavaMaps.BuilderSingularGuavaMapsBuilder<K, V>();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderSingularLists.java",
    "content": "import java.util.List;\nimport java.util.Collection;\nclass BuilderSingularLists<T> {\n\tprivate List<T> children;\n\tprivate Collection<? extends Number> scarves;\n\t@SuppressWarnings(\"all\")\n\tprivate List rawList;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderSingularLists(final List<T> children, final Collection<? extends Number> scarves, final List rawList) {\n\t\tthis.children = children;\n\t\tthis.scarves = scarves;\n\t\tthis.rawList = rawList;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderSingularListsBuilder<T> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<T> children;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<Number> scarves;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<java.lang.Object> rawList;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderSingularListsBuilder() {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularLists.BuilderSingularListsBuilder<T> child(final T child) {\n\t\t\tif (this.children == null) this.children = new java.util.ArrayList<T>();\n\t\t\tthis.children.add(child);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularLists.BuilderSingularListsBuilder<T> children(final java.util.Collection<? extends T> children) {\n\t\t\tif (children == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"children cannot be null\");\n\t\t\t}\n\t\t\tif (this.children == null) this.children = new java.util.ArrayList<T>();\n\t\t\tthis.children.addAll(children);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularLists.BuilderSingularListsBuilder<T> clearChildren() {\n\t\t\tif (this.children != null) this.children.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularLists.BuilderSingularListsBuilder<T> scarf(final Number scarf) {\n\t\t\tif (this.scarves == null) this.scarves = new java.util.ArrayList<Number>();\n\t\t\tthis.scarves.add(scarf);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularLists.BuilderSingularListsBuilder<T> scarves(final java.util.Collection<? extends Number> scarves) {\n\t\t\tif (scarves == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"scarves cannot be null\");\n\t\t\t}\n\t\t\tif (this.scarves == null) this.scarves = new java.util.ArrayList<Number>();\n\t\t\tthis.scarves.addAll(scarves);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularLists.BuilderSingularListsBuilder<T> clearScarves() {\n\t\t\tif (this.scarves != null) this.scarves.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularLists.BuilderSingularListsBuilder<T> rawList(final java.lang.Object rawList) {\n\t\t\tif (this.rawList == null) this.rawList = new java.util.ArrayList<java.lang.Object>();\n\t\t\tthis.rawList.add(rawList);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularLists.BuilderSingularListsBuilder<T> rawList(final java.util.Collection<?> rawList) {\n\t\t\tif (rawList == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"rawList cannot be null\");\n\t\t\t}\n\t\t\tif (this.rawList == null) this.rawList = new java.util.ArrayList<java.lang.Object>();\n\t\t\tthis.rawList.addAll(rawList);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularLists.BuilderSingularListsBuilder<T> clearRawList() {\n\t\t\tif (this.rawList != null) this.rawList.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularLists<T> build() {\n\t\t\tjava.util.List<T> children;\n\t\t\tswitch (this.children == null ? 0 : this.children.size()) {\n\t\t\tcase 0: \n\t\t\t\tchildren = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tchildren = java.util.Collections.singletonList(this.children.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tchildren = java.util.Collections.unmodifiableList(new java.util.ArrayList<T>(this.children));\n\t\t\t}\n\t\t\tjava.util.Collection<Number> scarves;\n\t\t\tswitch (this.scarves == null ? 0 : this.scarves.size()) {\n\t\t\tcase 0: \n\t\t\t\tscarves = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tscarves = java.util.Collections.singletonList(this.scarves.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tscarves = java.util.Collections.unmodifiableList(new java.util.ArrayList<Number>(this.scarves));\n\t\t\t}\n\t\t\tjava.util.List<java.lang.Object> rawList;\n\t\t\tswitch (this.rawList == null ? 0 : this.rawList.size()) {\n\t\t\tcase 0: \n\t\t\t\trawList = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\trawList = java.util.Collections.singletonList(this.rawList.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\trawList = java.util.Collections.unmodifiableList(new java.util.ArrayList<java.lang.Object>(this.rawList));\n\t\t\t}\n\t\t\treturn new BuilderSingularLists<T>(children, scarves, rawList);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderSingularLists.BuilderSingularListsBuilder(children=\" + this.children + \", scarves=\" + this.scarves + \", rawList=\" + this.rawList + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static <T> BuilderSingularLists.BuilderSingularListsBuilder<T> builder() {\n\t\treturn new BuilderSingularLists.BuilderSingularListsBuilder<T>();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderSingularMaps.java",
    "content": "import java.util.Map;\nimport java.util.SortedMap;\nclass BuilderSingularMaps<K, V> {\n\tprivate Map<K, V> women;\n\tprivate SortedMap<K, ? extends Number> men;\n\t@SuppressWarnings(\"all\")\n\tprivate Map rawMap;\n\tprivate Map<String, V> stringMap;\n\t@SuppressWarnings(\"all\")\n\tBuilderSingularMaps(Map<K, V> women, SortedMap<K, ? extends Number> men, Map rawMap, Map<String, V> stringMap) {\n\t\tthis.women = women;\n\t\tthis.men = men;\n\t\tthis.rawMap = rawMap;\n\t\tthis.stringMap = stringMap;\n\t}\n\t@SuppressWarnings(\"all\")\n\tpublic static class BuilderSingularMapsBuilder<K, V> {\n\t\t@SuppressWarnings(\"all\")\n\t\tprivate java.util.ArrayList<K> women$key;\n\t\t@SuppressWarnings(\"all\")\n\t\tprivate java.util.ArrayList<V> women$value;\n\t\t@SuppressWarnings(\"all\")\n\t\tprivate java.util.ArrayList<K> men$key;\n\t\t@SuppressWarnings(\"all\")\n\t\tprivate java.util.ArrayList<Number> men$value;\n\t\t@SuppressWarnings(\"all\")\n\t\tprivate java.util.ArrayList<Object> rawMap$key;\n\t\t@SuppressWarnings(\"all\")\n\t\tprivate java.util.ArrayList<Object> rawMap$value;\n\t\t@SuppressWarnings(\"all\")\n\t\tprivate java.util.ArrayList<String> stringMap$key;\n\t\t@SuppressWarnings(\"all\")\n\t\tprivate java.util.ArrayList<V> stringMap$value;\n\t\t@SuppressWarnings(\"all\")\n\t\tBuilderSingularMapsBuilder() {\n\t\t}\n\t\t@SuppressWarnings(\"all\")\n\t\tpublic BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> woman(K womanKey, V womanValue) {\n\t\t\tif (this.women$key == null) {\n\t\t\t\tthis.women$key = new java.util.ArrayList<K>();\n\t\t\t\tthis.women$value = new java.util.ArrayList<V>();\n\t\t\t}\n\t\t\tthis.women$key.add(womanKey);\n\t\t\tthis.women$value.add(womanValue);\n\t\t\treturn this;\n\t\t}\n\t\t@SuppressWarnings(\"all\")\n\t\tpublic BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> women(java.util.Map<? extends K, ? extends V> women) {\n\t\t\tif (women == null) {\n\t\t\t\tthrow new NullPointerException(\"women cannot be null\");\n\t\t\t}\n\t\t\tif (this.women$key == null) {\n\t\t\t\tthis.women$key = new java.util.ArrayList<K>();\n\t\t\t\tthis.women$value = new java.util.ArrayList<V>();\n\t\t\t}\n\t\t\tfor (java.util.Map.Entry<? extends K, ? extends V> $lombokEntry : women.entrySet()) {\n\t\t\t\tthis.women$key.add($lombokEntry.getKey());\n\t\t\t\tthis.women$value.add($lombokEntry.getValue());\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\t@SuppressWarnings(\"all\")\n\t\tpublic BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> clearWomen() {\n\t\t\tif (this.women$key != null) {\n\t\t\t\tthis.women$key.clear();\n\t\t\t\tthis.women$value.clear();\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\t@SuppressWarnings(\"all\")\n\t\tpublic BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> man(K manKey, Number manValue) {\n\t\t\tif (this.men$key == null) {\n\t\t\t\tthis.men$key = new java.util.ArrayList<K>();\n\t\t\t\tthis.men$value = new java.util.ArrayList<Number>();\n\t\t\t}\n\t\t\tthis.men$key.add(manKey);\n\t\t\tthis.men$value.add(manValue);\n\t\t\treturn this;\n\t\t}\n\t\t@SuppressWarnings(\"all\")\n\t\tpublic BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> men(java.util.Map<? extends K, ? extends Number> men) {\n\t\t\tif (men == null) {\n\t\t\t\tthrow new NullPointerException(\"men cannot be null\");\n\t\t\t}\n\t\t\tif (this.men$key == null) {\n\t\t\t\tthis.men$key = new java.util.ArrayList<K>();\n\t\t\t\tthis.men$value = new java.util.ArrayList<Number>();\n\t\t\t}\n\t\t\tfor (java.util.Map.Entry<? extends K, ? extends Number> $lombokEntry : men.entrySet()) {\n\t\t\t\tthis.men$key.add($lombokEntry.getKey());\n\t\t\t\tthis.men$value.add($lombokEntry.getValue());\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\t@SuppressWarnings(\"all\")\n\t\tpublic BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> clearMen() {\n\t\t\tif (this.men$key != null) {\n\t\t\t\tthis.men$key.clear();\n\t\t\t\tthis.men$value.clear();\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\t@SuppressWarnings(\"all\")\n\t\tpublic BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> rawMap(Object rawMapKey, Object rawMapValue) {\n\t\t\tif (this.rawMap$key == null) {\n\t\t\t\tthis.rawMap$key = new java.util.ArrayList<Object>();\n\t\t\t\tthis.rawMap$value = new java.util.ArrayList<Object>();\n\t\t\t}\n\t\t\tthis.rawMap$key.add(rawMapKey);\n\t\t\tthis.rawMap$value.add(rawMapValue);\n\t\t\treturn this;\n\t\t}\n\t\t@SuppressWarnings(\"all\")\n\t\tpublic BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> rawMap(java.util.Map<?, ?> rawMap) {\n\t\t\tif (rawMap == null) {\n\t\t\t\tthrow new NullPointerException(\"rawMap cannot be null\");\n\t\t\t}\n\t\t\tif (this.rawMap$key == null) {\n\t\t\t\tthis.rawMap$key = new java.util.ArrayList<Object>();\n\t\t\t\tthis.rawMap$value = new java.util.ArrayList<Object>();\n\t\t\t}\n\t\t\tfor (java.util.Map.Entry<?, ?> $lombokEntry : rawMap.entrySet()) {\n\t\t\t\tthis.rawMap$key.add($lombokEntry.getKey());\n\t\t\t\tthis.rawMap$value.add($lombokEntry.getValue());\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\t@SuppressWarnings(\"all\")\n\t\tpublic BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> clearRawMap() {\n\t\t\tif (this.rawMap$key != null) {\n\t\t\t\tthis.rawMap$key.clear();\n\t\t\t\tthis.rawMap$value.clear();\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\t@SuppressWarnings(\"all\")\n\t\tpublic BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> stringMap(String stringMapKey, V stringMapValue) {\n\t\t\tif (this.stringMap$key == null) {\n\t\t\t\tthis.stringMap$key = new java.util.ArrayList<String>();\n\t\t\t\tthis.stringMap$value = new java.util.ArrayList<V>();\n\t\t\t}\n\t\t\tthis.stringMap$key.add(stringMapKey);\n\t\t\tthis.stringMap$value.add(stringMapValue);\n\t\t\treturn this;\n\t\t}\n\t\t@SuppressWarnings(\"all\")\n\t\tpublic BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> stringMap(java.util.Map<? extends String, ? extends V> stringMap) {\n\t\t\tif (stringMap == null) {\n\t\t\t\tthrow new NullPointerException(\"stringMap cannot be null\");\n\t\t\t}\n\t\t\tif (this.stringMap$key == null) {\n\t\t\t\tthis.stringMap$key = new java.util.ArrayList<String>();\n\t\t\t\tthis.stringMap$value = new java.util.ArrayList<V>();\n\t\t\t}\n\t\t\tfor (java.util.Map.Entry<? extends String, ? extends V> $lombokEntry : stringMap.entrySet()) {\n\t\t\t\tthis.stringMap$key.add($lombokEntry.getKey());\n\t\t\t\tthis.stringMap$value.add($lombokEntry.getValue());\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\t@SuppressWarnings(\"all\")\n\t\tpublic BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> clearStringMap() {\n\t\t\tif (this.stringMap$key != null) {\n\t\t\t\tthis.stringMap$key.clear();\n\t\t\t\tthis.stringMap$value.clear();\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\t@SuppressWarnings(\"all\")\n\t\tpublic BuilderSingularMaps<K, V> build() {\n\t\t\tjava.util.Map<K, V> women;\n\t\t\tswitch (this.women$key == null ? 0 : this.women$key.size()) {\n\t\t\tcase 0:\n\t\t\t\twomen = java.util.Collections.emptyMap();\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\twomen = java.util.Collections.singletonMap(this.women$key.get(0), this.women$value.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\twomen = new java.util.LinkedHashMap<K, V>(this.women$key.size() < 1073741824 ? 1 + this.women$key.size() + (this.women$key.size() - 3) / 3 : Integer.MAX_VALUE);\n\t\t\t\tfor (int $i = 0; $i < this.women$key.size(); $i++) women.put(this.women$key.get($i), (V) this.women$value.get($i));\n\t\t\t\twomen = java.util.Collections.unmodifiableMap(women);\n\t\t\t}\n\t\t\tjava.util.SortedMap<K, Number> men = new java.util.TreeMap<K, Number>();\n\t\t\tif (this.men$key != null) for (int $i = 0; $i < (this.men$key == null ? 0 : this.men$key.size()); $i++) men.put(this.men$key.get($i), (Number) this.men$value.get($i));\n\t\t\tmen = java.util.Collections.unmodifiableSortedMap(men);\n\t\t\tjava.util.Map<Object, Object> rawMap;\n\t\t\tswitch (this.rawMap$key == null ? 0 : this.rawMap$key.size()) {\n\t\t\tcase 0:\n\t\t\t\trawMap = java.util.Collections.emptyMap();\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\trawMap = java.util.Collections.singletonMap(this.rawMap$key.get(0), this.rawMap$value.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\trawMap = new java.util.LinkedHashMap<Object, Object>(this.rawMap$key.size() < 1073741824 ? 1 + this.rawMap$key.size() + (this.rawMap$key.size() - 3) / 3 : Integer.MAX_VALUE);\n\t\t\t\tfor (int $i = 0; $i < this.rawMap$key.size(); $i++) rawMap.put(this.rawMap$key.get($i), (Object) this.rawMap$value.get($i));\n\t\t\t\trawMap = java.util.Collections.unmodifiableMap(rawMap);\n\t\t\t}\n\t\t\tjava.util.Map<String, V> stringMap;\n\t\t\tswitch (this.stringMap$key == null ? 0 : this.stringMap$key.size()) {\n\t\t\tcase 0:\n\t\t\t\tstringMap = java.util.Collections.emptyMap();\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tstringMap = java.util.Collections.singletonMap(this.stringMap$key.get(0), this.stringMap$value.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tstringMap = new java.util.LinkedHashMap<String, V>(this.stringMap$key.size() < 1073741824 ? 1 + this.stringMap$key.size() + (this.stringMap$key.size() - 3) / 3 : Integer.MAX_VALUE);\n\t\t\t\tfor (int $i = 0; $i < this.stringMap$key.size(); $i++) stringMap.put(this.stringMap$key.get($i), (V) this.stringMap$value.get($i));\n\t\t\t\tstringMap = java.util.Collections.unmodifiableMap(stringMap);\n\t\t\t}\n\t\t\treturn new BuilderSingularMaps<K, V>(women, men, rawMap, stringMap);\n\t\t}\n\t\t@Override\n\t\t@SuppressWarnings(\"all\")\n\t\tpublic String toString() {\n\t\t\treturn \"BuilderSingularMaps.BuilderSingularMapsBuilder(women$key=\" + this.women$key + \", women$value=\" + this.women$value + \", men$key=\" + this.men$key + \", men$value=\" + this.men$value + \", rawMap$key=\" + this.rawMap$key + \", rawMap$value=\" + this.rawMap$value + \", stringMap$key=\" + this.stringMap$key + \", stringMap$value=\" + this.stringMap$value + \")\";\n\t\t}\n\t}\n\t@SuppressWarnings(\"all\")\n\tpublic static <K, V> BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> builder() {\n\t\treturn new BuilderSingularMaps.BuilderSingularMapsBuilder<K, V>();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderSingularMapsWithSetterPrefix.java",
    "content": "import java.util.Map;\nimport java.util.SortedMap;\nclass BuilderSingularMapsWithSetterPrefix<K, V> {\n\tprivate Map<K, V> women;\n\tprivate SortedMap<K, ? extends Number> men;\n\t@SuppressWarnings(\"all\")\n\tprivate Map rawMap;\n\tprivate Map<String, V> stringMap;\n\t@SuppressWarnings(\"all\")\n\tBuilderSingularMapsWithSetterPrefix(Map<K, V> women, SortedMap<K, ? extends Number> men, Map rawMap, Map<String, V> stringMap) {\n\t\tthis.women = women;\n\t\tthis.men = men;\n\t\tthis.rawMap = rawMap;\n\t\tthis.stringMap = stringMap;\n\t}\n\t@SuppressWarnings(\"all\")\n\tpublic static class BuilderSingularMapsWithSetterPrefixBuilder<K, V> {\n\t\t@SuppressWarnings(\"all\")\n\t\tprivate java.util.ArrayList<K> women$key;\n\t\t@SuppressWarnings(\"all\")\n\t\tprivate java.util.ArrayList<V> women$value;\n\t\t@SuppressWarnings(\"all\")\n\t\tprivate java.util.ArrayList<K> men$key;\n\t\t@SuppressWarnings(\"all\")\n\t\tprivate java.util.ArrayList<Number> men$value;\n\t\t@SuppressWarnings(\"all\")\n\t\tprivate java.util.ArrayList<Object> rawMap$key;\n\t\t@SuppressWarnings(\"all\")\n\t\tprivate java.util.ArrayList<Object> rawMap$value;\n\t\t@SuppressWarnings(\"all\")\n\t\tprivate java.util.ArrayList<String> stringMap$key;\n\t\t@SuppressWarnings(\"all\")\n\t\tprivate java.util.ArrayList<V> stringMap$value;\n\t\t@SuppressWarnings(\"all\")\n\t\tBuilderSingularMapsWithSetterPrefixBuilder() {\n\t\t}\n\t\t@SuppressWarnings(\"all\")\n\t\tpublic BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder<K, V> withWoman(K womanKey, V womanValue) {\n\t\t\tif (this.women$key == null) {\n\t\t\t\tthis.women$key = new java.util.ArrayList<K>();\n\t\t\t\tthis.women$value = new java.util.ArrayList<V>();\n\t\t\t}\n\t\t\tthis.women$key.add(womanKey);\n\t\t\tthis.women$value.add(womanValue);\n\t\t\treturn this;\n\t\t}\n\t\t@SuppressWarnings(\"all\")\n\t\tpublic BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder<K, V> withWomen(java.util.Map<? extends K, ? extends V> women) {\n\t\t\tif (women == null) {\n\t\t\t\tthrow new NullPointerException(\"women cannot be null\");\n\t\t\t}\n\t\t\tif (this.women$key == null) {\n\t\t\t\tthis.women$key = new java.util.ArrayList<K>();\n\t\t\t\tthis.women$value = new java.util.ArrayList<V>();\n\t\t\t}\n\t\t\tfor (java.util.Map.Entry<? extends K, ? extends V> $lombokEntry : women.entrySet()) {\n\t\t\t\tthis.women$key.add($lombokEntry.getKey());\n\t\t\t\tthis.women$value.add($lombokEntry.getValue());\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\t@SuppressWarnings(\"all\")\n\t\tpublic BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder<K, V> clearWomen() {\n\t\t\tif (this.women$key != null) {\n\t\t\t\tthis.women$key.clear();\n\t\t\t\tthis.women$value.clear();\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\t@SuppressWarnings(\"all\")\n\t\tpublic BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder<K, V> withMan(K manKey, Number manValue) {\n\t\t\tif (this.men$key == null) {\n\t\t\t\tthis.men$key = new java.util.ArrayList<K>();\n\t\t\t\tthis.men$value = new java.util.ArrayList<Number>();\n\t\t\t}\n\t\t\tthis.men$key.add(manKey);\n\t\t\tthis.men$value.add(manValue);\n\t\t\treturn this;\n\t\t}\n\t\t@SuppressWarnings(\"all\")\n\t\tpublic BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder<K, V> withMen(java.util.Map<? extends K, ? extends Number> men) {\n\t\t\tif (men == null) {\n\t\t\t\tthrow new NullPointerException(\"men cannot be null\");\n\t\t\t}\n\t\t\tif (this.men$key == null) {\n\t\t\t\tthis.men$key = new java.util.ArrayList<K>();\n\t\t\t\tthis.men$value = new java.util.ArrayList<Number>();\n\t\t\t}\n\t\t\tfor (java.util.Map.Entry<? extends K, ? extends Number> $lombokEntry : men.entrySet()) {\n\t\t\t\tthis.men$key.add($lombokEntry.getKey());\n\t\t\t\tthis.men$value.add($lombokEntry.getValue());\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\t@SuppressWarnings(\"all\")\n\t\tpublic BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder<K, V> clearMen() {\n\t\t\tif (this.men$key != null) {\n\t\t\t\tthis.men$key.clear();\n\t\t\t\tthis.men$value.clear();\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\t@SuppressWarnings(\"all\")\n\t\tpublic BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder<K, V> withRawMap(Object rawMapKey, Object rawMapValue) {\n\t\t\tif (this.rawMap$key == null) {\n\t\t\t\tthis.rawMap$key = new java.util.ArrayList<Object>();\n\t\t\t\tthis.rawMap$value = new java.util.ArrayList<Object>();\n\t\t\t}\n\t\t\tthis.rawMap$key.add(rawMapKey);\n\t\t\tthis.rawMap$value.add(rawMapValue);\n\t\t\treturn this;\n\t\t}\n\t\t@SuppressWarnings(\"all\")\n\t\tpublic BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder<K, V> withRawMap(java.util.Map<?, ?> rawMap) {\n\t\t\tif (rawMap != null) {\n\t\t\t\tif (this.rawMap$key == null) {\n\t\t\t\t\tthis.rawMap$key = new java.util.ArrayList<Object>();\n\t\t\t\t\tthis.rawMap$value = new java.util.ArrayList<Object>();\n\t\t\t\t}\n\t\t\t\tfor (java.util.Map.Entry<?, ?> $lombokEntry : rawMap.entrySet()) {\n\t\t\t\t\tthis.rawMap$key.add($lombokEntry.getKey());\n\t\t\t\t\tthis.rawMap$value.add($lombokEntry.getValue());\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\t@SuppressWarnings(\"all\")\n\t\tpublic BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder<K, V> clearRawMap() {\n\t\t\tif (this.rawMap$key != null) {\n\t\t\t\tthis.rawMap$key.clear();\n\t\t\t\tthis.rawMap$value.clear();\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\t@SuppressWarnings(\"all\")\n\t\tpublic BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder<K, V> withStringMap(String stringMapKey, V stringMapValue) {\n\t\t\tif (this.stringMap$key == null) {\n\t\t\t\tthis.stringMap$key = new java.util.ArrayList<String>();\n\t\t\t\tthis.stringMap$value = new java.util.ArrayList<V>();\n\t\t\t}\n\t\t\tthis.stringMap$key.add(stringMapKey);\n\t\t\tthis.stringMap$value.add(stringMapValue);\n\t\t\treturn this;\n\t\t}\n\t\t@SuppressWarnings(\"all\")\n\t\tpublic BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder<K, V> withStringMap(java.util.Map<? extends String, ? extends V> stringMap) {\n\t\t\tif (stringMap == null) {\n\t\t\t\tthrow new NullPointerException(\"stringMap cannot be null\");\n\t\t\t}\n\t\t\tif (this.stringMap$key == null) {\n\t\t\t\tthis.stringMap$key = new java.util.ArrayList<String>();\n\t\t\t\tthis.stringMap$value = new java.util.ArrayList<V>();\n\t\t\t}\n\t\t\tfor (java.util.Map.Entry<? extends String, ? extends V> $lombokEntry : stringMap.entrySet()) {\n\t\t\t\tthis.stringMap$key.add($lombokEntry.getKey());\n\t\t\t\tthis.stringMap$value.add($lombokEntry.getValue());\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\t@SuppressWarnings(\"all\")\n\t\tpublic BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder<K, V> clearStringMap() {\n\t\t\tif (this.stringMap$key != null) {\n\t\t\t\tthis.stringMap$key.clear();\n\t\t\t\tthis.stringMap$value.clear();\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\t@SuppressWarnings(\"all\")\n\t\tpublic BuilderSingularMapsWithSetterPrefix<K, V> build() {\n\t\t\tjava.util.Map<K, V> women;\n\t\t\tswitch (this.women$key == null ? 0 : this.women$key.size()) {\n\t\t\tcase 0:\n\t\t\t\twomen = java.util.Collections.emptyMap();\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\twomen = java.util.Collections.singletonMap(this.women$key.get(0), this.women$value.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\twomen = new java.util.LinkedHashMap<K, V>(this.women$key.size() < 1073741824 ? 1 + this.women$key.size() + (this.women$key.size() - 3) / 3 : Integer.MAX_VALUE);\n\t\t\t\tfor (int $i = 0; $i < this.women$key.size(); $i++) women.put(this.women$key.get($i), (V) this.women$value.get($i));\n\t\t\t\twomen = java.util.Collections.unmodifiableMap(women);\n\t\t\t}\n\t\t\tjava.util.SortedMap<K, Number> men = new java.util.TreeMap<K, Number>();\n\t\t\tif (this.men$key != null) for (int $i = 0; $i < (this.men$key == null ? 0 : this.men$key.size()); $i++) men.put(this.men$key.get($i), (Number) this.men$value.get($i));\n\t\t\tmen = java.util.Collections.unmodifiableSortedMap(men);\n\t\t\tjava.util.Map<Object, Object> rawMap;\n\t\t\tswitch (this.rawMap$key == null ? 0 : this.rawMap$key.size()) {\n\t\t\tcase 0:\n\t\t\t\trawMap = java.util.Collections.emptyMap();\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\trawMap = java.util.Collections.singletonMap(this.rawMap$key.get(0), this.rawMap$value.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\trawMap = new java.util.LinkedHashMap<Object, Object>(this.rawMap$key.size() < 1073741824 ? 1 + this.rawMap$key.size() + (this.rawMap$key.size() - 3) / 3 : Integer.MAX_VALUE);\n\t\t\t\tfor (int $i = 0; $i < this.rawMap$key.size(); $i++) rawMap.put(this.rawMap$key.get($i), (Object) this.rawMap$value.get($i));\n\t\t\t\trawMap = java.util.Collections.unmodifiableMap(rawMap);\n\t\t\t}\n\t\t\tjava.util.Map<String, V> stringMap;\n\t\t\tswitch (this.stringMap$key == null ? 0 : this.stringMap$key.size()) {\n\t\t\tcase 0:\n\t\t\t\tstringMap = java.util.Collections.emptyMap();\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tstringMap = java.util.Collections.singletonMap(this.stringMap$key.get(0), this.stringMap$value.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tstringMap = new java.util.LinkedHashMap<String, V>(this.stringMap$key.size() < 1073741824 ? 1 + this.stringMap$key.size() + (this.stringMap$key.size() - 3) / 3 : Integer.MAX_VALUE);\n\t\t\t\tfor (int $i = 0; $i < this.stringMap$key.size(); $i++) stringMap.put(this.stringMap$key.get($i), (V) this.stringMap$value.get($i));\n\t\t\t\tstringMap = java.util.Collections.unmodifiableMap(stringMap);\n\t\t\t}\n\t\t\treturn new BuilderSingularMapsWithSetterPrefix<K, V>(women, men, rawMap, stringMap);\n\t\t}\n\t\t@Override\n\t\t@SuppressWarnings(\"all\")\n\t\tpublic String toString() {\n\t\t\treturn \"BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder(women$key=\" + this.women$key + \", women$value=\" + this.women$value + \", men$key=\" + this.men$key + \", men$value=\" + this.men$value + \", rawMap$key=\" + this.rawMap$key + \", rawMap$value=\" + this.rawMap$value + \", stringMap$key=\" + this.stringMap$key + \", stringMap$value=\" + this.stringMap$value + \")\";\n\t\t}\n\t}\n\t@SuppressWarnings(\"all\")\n\tpublic static <K, V> BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder<K, V> builder() {\n\t\treturn new BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder<K, V>();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderSingularNoAuto.java",
    "content": "//skip-idempotent\nimport java.util.List;\nclass BuilderSingularNoAuto {\n\tprivate List<String> things;\n\tprivate List<String> widgets;\n\tprivate List<String> items;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderSingularNoAuto(final List<String> things, final List<String> widgets, final List<String> items) {\n\t\tthis.things = things;\n\t\tthis.widgets = widgets;\n\t\tthis.items = items;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderSingularNoAutoBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<String> things;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<String> widgets;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<String> items;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderSingularNoAutoBuilder() {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNoAuto.BuilderSingularNoAutoBuilder things(final String things) {\n\t\t\tif (this.things == null) this.things = new java.util.ArrayList<String>();\n\t\t\tthis.things.add(things);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNoAuto.BuilderSingularNoAutoBuilder things(final java.util.Collection<? extends String> things) {\n\t\t\tif (things == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"things cannot be null\");\n\t\t\t}\n\t\t\tif (this.things == null) this.things = new java.util.ArrayList<String>();\n\t\t\tthis.things.addAll(things);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNoAuto.BuilderSingularNoAutoBuilder clearThings() {\n\t\t\tif (this.things != null) this.things.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNoAuto.BuilderSingularNoAutoBuilder widget(final String widget) {\n\t\t\tif (this.widgets == null) this.widgets = new java.util.ArrayList<String>();\n\t\t\tthis.widgets.add(widget);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNoAuto.BuilderSingularNoAutoBuilder widgets(final java.util.Collection<? extends String> widgets) {\n\t\t\tif (widgets == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"widgets cannot be null\");\n\t\t\t}\n\t\t\tif (this.widgets == null) this.widgets = new java.util.ArrayList<String>();\n\t\t\tthis.widgets.addAll(widgets);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNoAuto.BuilderSingularNoAutoBuilder clearWidgets() {\n\t\t\tif (this.widgets != null) this.widgets.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNoAuto.BuilderSingularNoAutoBuilder items(final String items) {\n\t\t\tif (this.items == null) this.items = new java.util.ArrayList<String>();\n\t\t\tthis.items.add(items);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNoAuto.BuilderSingularNoAutoBuilder items(final java.util.Collection<? extends String> items) {\n\t\t\tif (items == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"items cannot be null\");\n\t\t\t}\n\t\t\tif (this.items == null) this.items = new java.util.ArrayList<String>();\n\t\t\tthis.items.addAll(items);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNoAuto.BuilderSingularNoAutoBuilder clearItems() {\n\t\t\tif (this.items != null) this.items.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNoAuto build() {\n\t\t\tjava.util.List<String> things;\n\t\t\tswitch (this.things == null ? 0 : this.things.size()) {\n\t\t\tcase 0: \n\t\t\t\tthings = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tthings = java.util.Collections.singletonList(this.things.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tthings = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.things));\n\t\t\t}\n\t\t\tjava.util.List<String> widgets;\n\t\t\tswitch (this.widgets == null ? 0 : this.widgets.size()) {\n\t\t\tcase 0: \n\t\t\t\twidgets = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\twidgets = java.util.Collections.singletonList(this.widgets.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\twidgets = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.widgets));\n\t\t\t}\n\t\t\tjava.util.List<String> items;\n\t\t\tswitch (this.items == null ? 0 : this.items.size()) {\n\t\t\tcase 0: \n\t\t\t\titems = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\titems = java.util.Collections.singletonList(this.items.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\titems = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.items));\n\t\t\t}\n\t\t\treturn new BuilderSingularNoAuto(things, widgets, items);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderSingularNoAuto.BuilderSingularNoAutoBuilder(things=\" + this.things + \", widgets=\" + this.widgets + \", items=\" + this.items + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderSingularNoAuto.BuilderSingularNoAutoBuilder builder() {\n\t\treturn new BuilderSingularNoAuto.BuilderSingularNoAutoBuilder();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderSingularNoAutoWithSetterPrefix.java",
    "content": "//skip-idempotent\nimport java.util.List;\nclass BuilderSingularNoAutoWithSetterPrefix {\n\tprivate List<String> things;\n\tprivate List<String> widgets;\n\tprivate List<String> items;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderSingularNoAutoWithSetterPrefix(final List<String> things, final List<String> widgets, final List<String> items) {\n\t\tthis.things = things;\n\t\tthis.widgets = widgets;\n\t\tthis.items = items;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderSingularNoAutoWithSetterPrefixBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<String> things;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<String> widgets;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<String> items;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderSingularNoAutoWithSetterPrefixBuilder() {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNoAutoWithSetterPrefix.BuilderSingularNoAutoWithSetterPrefixBuilder withThings(final String things) {\n\t\t\tif (this.things == null) this.things = new java.util.ArrayList<String>();\n\t\t\tthis.things.add(things);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNoAutoWithSetterPrefix.BuilderSingularNoAutoWithSetterPrefixBuilder withThings(final java.util.Collection<? extends String> things) {\n\t\t\tif (things == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"things cannot be null\");\n\t\t\t}\n\t\t\tif (this.things == null) this.things = new java.util.ArrayList<String>();\n\t\t\tthis.things.addAll(things);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNoAutoWithSetterPrefix.BuilderSingularNoAutoWithSetterPrefixBuilder clearThings() {\n\t\t\tif (this.things != null) this.things.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNoAutoWithSetterPrefix.BuilderSingularNoAutoWithSetterPrefixBuilder withWidget(final String widget) {\n\t\t\tif (this.widgets == null) this.widgets = new java.util.ArrayList<String>();\n\t\t\tthis.widgets.add(widget);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNoAutoWithSetterPrefix.BuilderSingularNoAutoWithSetterPrefixBuilder withWidgets(final java.util.Collection<? extends String> widgets) {\n\t\t\tif (widgets == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"widgets cannot be null\");\n\t\t\t}\n\t\t\tif (this.widgets == null) this.widgets = new java.util.ArrayList<String>();\n\t\t\tthis.widgets.addAll(widgets);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNoAutoWithSetterPrefix.BuilderSingularNoAutoWithSetterPrefixBuilder clearWidgets() {\n\t\t\tif (this.widgets != null) this.widgets.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNoAutoWithSetterPrefix.BuilderSingularNoAutoWithSetterPrefixBuilder withItems(final String items) {\n\t\t\tif (this.items == null) this.items = new java.util.ArrayList<String>();\n\t\t\tthis.items.add(items);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNoAutoWithSetterPrefix.BuilderSingularNoAutoWithSetterPrefixBuilder withItems(final java.util.Collection<? extends String> items) {\n\t\t\tif (items == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"items cannot be null\");\n\t\t\t}\n\t\t\tif (this.items == null) this.items = new java.util.ArrayList<String>();\n\t\t\tthis.items.addAll(items);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNoAutoWithSetterPrefix.BuilderSingularNoAutoWithSetterPrefixBuilder clearItems() {\n\t\t\tif (this.items != null) this.items.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNoAutoWithSetterPrefix build() {\n\t\t\tjava.util.List<String> things;\n\t\t\tswitch (this.things == null ? 0 : this.things.size()) {\n\t\t\tcase 0: \n\t\t\t\tthings = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tthings = java.util.Collections.singletonList(this.things.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tthings = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.things));\n\t\t\t}\n\t\t\tjava.util.List<String> widgets;\n\t\t\tswitch (this.widgets == null ? 0 : this.widgets.size()) {\n\t\t\tcase 0: \n\t\t\t\twidgets = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\twidgets = java.util.Collections.singletonList(this.widgets.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\twidgets = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.widgets));\n\t\t\t}\n\t\t\tjava.util.List<String> items;\n\t\t\tswitch (this.items == null ? 0 : this.items.size()) {\n\t\t\tcase 0: \n\t\t\t\titems = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\titems = java.util.Collections.singletonList(this.items.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\titems = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.items));\n\t\t\t}\n\t\t\treturn new BuilderSingularNoAutoWithSetterPrefix(things, widgets, items);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderSingularNoAutoWithSetterPrefix.BuilderSingularNoAutoWithSetterPrefixBuilder(things=\" + this.things + \", widgets=\" + this.widgets + \", items=\" + this.items + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderSingularNoAutoWithSetterPrefix.BuilderSingularNoAutoWithSetterPrefixBuilder builder() {\n\t\treturn new BuilderSingularNoAutoWithSetterPrefix.BuilderSingularNoAutoWithSetterPrefixBuilder();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderSingularNullBehavior1.java",
    "content": "//version 8:\nimport java.util.List;\nimport java.util.Collection;\nclass BuilderSingularNullBehavior1 {\n\tprivate List<String> names;\n\tprivate List<String> locations;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderSingularNullBehavior1(final List<String> names, final List<String> locations) {\n\t\tthis.names = names;\n\t\tthis.locations = locations;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderSingularNullBehavior1Builder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<String> names;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<String> locations;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderSingularNullBehavior1Builder() {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNullBehavior1.@org.checkerframework.checker.nullness.qual.NonNull BuilderSingularNullBehavior1Builder name(final String name) {\n\t\t\tif (this.names == null) this.names = new java.util.ArrayList<String>();\n\t\t\tthis.names.add(name);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNullBehavior1.@org.checkerframework.checker.nullness.qual.NonNull BuilderSingularNullBehavior1Builder names(final java.util.@org.checkerframework.checker.nullness.qual.NonNull Collection<? extends String> names) {\n\t\t\tassert names != null : \"names cannot be null\";\n\t\t\tif (this.names == null) this.names = new java.util.ArrayList<String>();\n\t\t\tthis.names.addAll(names);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNullBehavior1.@org.checkerframework.checker.nullness.qual.NonNull BuilderSingularNullBehavior1Builder clearNames() {\n\t\t\tif (this.names != null) this.names.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNullBehavior1.@org.checkerframework.checker.nullness.qual.NonNull BuilderSingularNullBehavior1Builder location(final String location) {\n\t\t\tif (this.locations == null) this.locations = new java.util.ArrayList<String>();\n\t\t\tthis.locations.add(location);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNullBehavior1.@org.checkerframework.checker.nullness.qual.NonNull BuilderSingularNullBehavior1Builder locations(final java.util.@org.checkerframework.checker.nullness.qual.Nullable Collection<? extends String> locations) {\n\t\t\tif (locations != null) {\n\t\t\t\tif (this.locations == null) this.locations = new java.util.ArrayList<String>();\n\t\t\t\tthis.locations.addAll(locations);\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNullBehavior1.@org.checkerframework.checker.nullness.qual.NonNull BuilderSingularNullBehavior1Builder clearLocations() {\n\t\t\tif (this.locations != null) this.locations.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@org.checkerframework.checker.nullness.qual.NonNull\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNullBehavior1 build() {\n\t\t\tjava.util.List<String> names;\n\t\t\tswitch (this.names == null ? 0 : this.names.size()) {\n\t\t\tcase 0: \n\t\t\t\tnames = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tnames = java.util.Collections.singletonList(this.names.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tnames = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.names));\n\t\t\t}\n\t\t\tjava.util.List<String> locations;\n\t\t\tswitch (this.locations == null ? 0 : this.locations.size()) {\n\t\t\tcase 0: \n\t\t\t\tlocations = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tlocations = java.util.Collections.singletonList(this.locations.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tlocations = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.locations));\n\t\t\t}\n\t\t\treturn new BuilderSingularNullBehavior1(names, locations);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.@org.checkerframework.checker.nullness.qual.NonNull String toString() {\n\t\t\treturn \"BuilderSingularNullBehavior1.BuilderSingularNullBehavior1Builder(names=\" + this.names + \", locations=\" + this.locations + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderSingularNullBehavior1.@org.checkerframework.checker.nullness.qual.NonNull BuilderSingularNullBehavior1Builder builder() {\n\t\treturn new BuilderSingularNullBehavior1.BuilderSingularNullBehavior1Builder();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderSingularNullBehavior2.java",
    "content": "//version 8: springframework dep is too new to run on j6\nimport java.util.List;\nclass BuilderSingularNullBehavior2 {\n\tprivate List<String> locations;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderSingularNullBehavior2(final List<String> locations) {\n\t\tthis.locations = locations;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderSingularNullBehavior2Builder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<String> locations;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderSingularNullBehavior2Builder() {\n\t\t}\n\t\t@org.springframework.lang.NonNull\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNullBehavior2.BuilderSingularNullBehavior2Builder location(final String location) {\n\t\t\tif (this.locations == null) this.locations = new java.util.ArrayList<String>();\n\t\t\tthis.locations.add(location);\n\t\t\treturn this;\n\t\t}\n\t\t@org.springframework.lang.NonNull\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNullBehavior2.BuilderSingularNullBehavior2Builder locations(@org.springframework.lang.NonNull final java.util.Collection<? extends String> locations) {\n\t\t\tjava.util.Objects.requireNonNull(locations, \"locations cannot be null\");\n\t\t\tif (this.locations == null) this.locations = new java.util.ArrayList<String>();\n\t\t\tthis.locations.addAll(locations);\n\t\t\treturn this;\n\t\t}\n\t\t@org.springframework.lang.NonNull\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNullBehavior2.BuilderSingularNullBehavior2Builder clearLocations() {\n\t\t\tif (this.locations != null) this.locations.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@org.springframework.lang.NonNull\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularNullBehavior2 build() {\n\t\t\tjava.util.List<String> locations;\n\t\t\tswitch (this.locations == null ? 0 : this.locations.size()) {\n\t\t\tcase 0: \n\t\t\t\tlocations = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tlocations = java.util.Collections.singletonList(this.locations.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tlocations = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.locations));\n\t\t\t}\n\t\t\treturn new BuilderSingularNullBehavior2(locations);\n\t\t}\n\t\t@org.springframework.lang.NonNull\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderSingularNullBehavior2.BuilderSingularNullBehavior2Builder(locations=\" + this.locations + \")\";\n\t\t}\n\t}\n\t@org.springframework.lang.NonNull\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderSingularNullBehavior2.BuilderSingularNullBehavior2Builder builder() {\n\t\treturn new BuilderSingularNullBehavior2.BuilderSingularNullBehavior2Builder();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderSingularOnRecord.java",
    "content": "// version 14:\nimport java.util.Collection;\nimport java.util.List;\npublic record BuilderSingularOnRecord<T>(List<T> children, Collection<? extends Number> scarves, @SuppressWarnings(\"all\") List rawList) {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderSingularOnRecordBuilder<T> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<T> children;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<Number> scarves;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<java.lang.Object> rawList;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderSingularOnRecordBuilder() {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularOnRecord.BuilderSingularOnRecordBuilder<T> child(final T child) {\n\t\t\tif (this.children == null) this.children = new java.util.ArrayList<T>();\n\t\t\tthis.children.add(child);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularOnRecord.BuilderSingularOnRecordBuilder<T> children(final java.util.Collection<? extends T> children) {\n\t\t\tif (children == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"children cannot be null\");\n\t\t\t}\n\t\t\tif (this.children == null) this.children = new java.util.ArrayList<T>();\n\t\t\tthis.children.addAll(children);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularOnRecord.BuilderSingularOnRecordBuilder<T> clearChildren() {\n\t\t\tif (this.children != null) this.children.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularOnRecord.BuilderSingularOnRecordBuilder<T> scarf(final Number scarf) {\n\t\t\tif (this.scarves == null) this.scarves = new java.util.ArrayList<Number>();\n\t\t\tthis.scarves.add(scarf);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularOnRecord.BuilderSingularOnRecordBuilder<T> scarves(final java.util.Collection<? extends Number> scarves) {\n\t\t\tif (scarves == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"scarves cannot be null\");\n\t\t\t}\n\t\t\tif (this.scarves == null) this.scarves = new java.util.ArrayList<Number>();\n\t\t\tthis.scarves.addAll(scarves);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularOnRecord.BuilderSingularOnRecordBuilder<T> clearScarves() {\n\t\t\tif (this.scarves != null) this.scarves.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularOnRecord.BuilderSingularOnRecordBuilder<T> rawList(final java.lang.Object rawList) {\n\t\t\tif (this.rawList == null) this.rawList = new java.util.ArrayList<java.lang.Object>();\n\t\t\tthis.rawList.add(rawList);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularOnRecord.BuilderSingularOnRecordBuilder<T> rawList(final java.util.Collection<?> rawList) {\n\t\t\tif (rawList == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"rawList cannot be null\");\n\t\t\t}\n\t\t\tif (this.rawList == null) this.rawList = new java.util.ArrayList<java.lang.Object>();\n\t\t\tthis.rawList.addAll(rawList);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularOnRecord.BuilderSingularOnRecordBuilder<T> clearRawList() {\n\t\t\tif (this.rawList != null) this.rawList.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularOnRecord<T> build() {\n\t\t\tjava.util.List<T> children;\n\t\t\tswitch (this.children == null ? 0 : this.children.size()) {\n\t\t\tcase 0: \n\t\t\t\tchildren = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tchildren = java.util.Collections.singletonList(this.children.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tchildren = java.util.Collections.unmodifiableList(new java.util.ArrayList<T>(this.children));\n\t\t\t}\n\t\t\tjava.util.Collection<Number> scarves;\n\t\t\tswitch (this.scarves == null ? 0 : this.scarves.size()) {\n\t\t\tcase 0: \n\t\t\t\tscarves = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tscarves = java.util.Collections.singletonList(this.scarves.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tscarves = java.util.Collections.unmodifiableList(new java.util.ArrayList<Number>(this.scarves));\n\t\t\t}\n\t\t\tjava.util.List<java.lang.Object> rawList;\n\t\t\tswitch (this.rawList == null ? 0 : this.rawList.size()) {\n\t\t\tcase 0: \n\t\t\t\trawList = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\trawList = java.util.Collections.singletonList(this.rawList.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\trawList = java.util.Collections.unmodifiableList(new java.util.ArrayList<java.lang.Object>(this.rawList));\n\t\t\t}\n\t\t\treturn new BuilderSingularOnRecord<T>(children, scarves, rawList);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderSingularOnRecord.BuilderSingularOnRecordBuilder(children=\" + this.children + \", scarves=\" + this.scarves + \", rawList=\" + this.rawList + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static <T> BuilderSingularOnRecord.BuilderSingularOnRecordBuilder<T> builder() {\n\t\treturn new BuilderSingularOnRecord.BuilderSingularOnRecordBuilder<T>();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderSingularRedirectToGuava.java",
    "content": "import java.util.Set;\nimport java.util.NavigableMap;\nimport java.util.Collection;\nclass BuilderSingularRedirectToGuava {\n\tprivate Set<String> dangerMice;\n\tprivate NavigableMap<Integer, Number> things;\n\tprivate Collection<Class<?>> doohickeys;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderSingularRedirectToGuava(final Set<String> dangerMice, final NavigableMap<Integer, Number> things, final Collection<Class<?>> doohickeys) {\n\t\tthis.dangerMice = dangerMice;\n\t\tthis.things = things;\n\t\tthis.doohickeys = doohickeys;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderSingularRedirectToGuavaBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate com.google.common.collect.ImmutableSet.Builder<String> dangerMice;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate com.google.common.collect.ImmutableSortedMap.Builder<Integer, Number> things;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate com.google.common.collect.ImmutableList.Builder<Class<?>> doohickeys;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderSingularRedirectToGuavaBuilder() {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularRedirectToGuava.BuilderSingularRedirectToGuavaBuilder dangerMouse(final String dangerMouse) {\n\t\t\tif (this.dangerMice == null) this.dangerMice = com.google.common.collect.ImmutableSet.builder();\n\t\t\tthis.dangerMice.add(dangerMouse);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularRedirectToGuava.BuilderSingularRedirectToGuavaBuilder dangerMice(final java.lang.Iterable<? extends String> dangerMice) {\n\t\t\tif (dangerMice == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"dangerMice cannot be null\");\n\t\t\t}\n\t\t\tif (this.dangerMice == null) this.dangerMice = com.google.common.collect.ImmutableSet.builder();\n\t\t\tthis.dangerMice.addAll(dangerMice);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularRedirectToGuava.BuilderSingularRedirectToGuavaBuilder clearDangerMice() {\n\t\t\tthis.dangerMice = null;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularRedirectToGuava.BuilderSingularRedirectToGuavaBuilder thing(final Integer key, final Number value) {\n\t\t\tif (this.things == null) this.things = com.google.common.collect.ImmutableSortedMap.naturalOrder();\n\t\t\tthis.things.put(key, value);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularRedirectToGuava.BuilderSingularRedirectToGuavaBuilder things(final java.util.Map<? extends Integer, ? extends Number> things) {\n\t\t\tif (things == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"things cannot be null\");\n\t\t\t}\n\t\t\tif (this.things == null) this.things = com.google.common.collect.ImmutableSortedMap.naturalOrder();\n\t\t\tthis.things.putAll(things);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularRedirectToGuava.BuilderSingularRedirectToGuavaBuilder clearThings() {\n\t\t\tthis.things = null;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularRedirectToGuava.BuilderSingularRedirectToGuavaBuilder doohickey(final Class<?> doohickey) {\n\t\t\tif (this.doohickeys == null) this.doohickeys = com.google.common.collect.ImmutableList.builder();\n\t\t\tthis.doohickeys.add(doohickey);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularRedirectToGuava.BuilderSingularRedirectToGuavaBuilder doohickeys(final java.lang.Iterable<? extends Class<?>> doohickeys) {\n\t\t\tif (doohickeys == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"doohickeys cannot be null\");\n\t\t\t}\n\t\t\tif (this.doohickeys == null) this.doohickeys = com.google.common.collect.ImmutableList.builder();\n\t\t\tthis.doohickeys.addAll(doohickeys);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularRedirectToGuava.BuilderSingularRedirectToGuavaBuilder clearDoohickeys() {\n\t\t\tthis.doohickeys = null;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularRedirectToGuava build() {\n\t\t\tjava.util.Set<String> dangerMice = this.dangerMice == null ? com.google.common.collect.ImmutableSet.<String>of() : this.dangerMice.build();\n\t\t\tjava.util.NavigableMap<Integer, Number> things = this.things == null ? com.google.common.collect.ImmutableSortedMap.<Integer, Number>of() : this.things.build();\n\t\t\tjava.util.Collection<Class<?>> doohickeys = this.doohickeys == null ? com.google.common.collect.ImmutableList.<Class<?>>of() : this.doohickeys.build();\n\t\t\treturn new BuilderSingularRedirectToGuava(dangerMice, things, doohickeys);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderSingularRedirectToGuava.BuilderSingularRedirectToGuavaBuilder(dangerMice=\" + this.dangerMice + \", things=\" + this.things + \", doohickeys=\" + this.doohickeys + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderSingularRedirectToGuava.BuilderSingularRedirectToGuavaBuilder builder() {\n\t\treturn new BuilderSingularRedirectToGuava.BuilderSingularRedirectToGuavaBuilder();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderSingularSets.java",
    "content": "import java.util.Set;\nimport java.util.SortedSet;\nclass BuilderSingularSets<T> {\n\tprivate Set<T> dangerMice;\n\tprivate SortedSet<? extends Number> octopodes;\n\t@SuppressWarnings(\"all\")\n\tprivate Set rawSet;\n\tprivate Set<String> stringSet;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderSingularSets(final Set<T> dangerMice, final SortedSet<? extends Number> octopodes, final Set rawSet, final Set<String> stringSet) {\n\t\tthis.dangerMice = dangerMice;\n\t\tthis.octopodes = octopodes;\n\t\tthis.rawSet = rawSet;\n\t\tthis.stringSet = stringSet;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderSingularSetsBuilder<T> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<T> dangerMice;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<Number> octopodes;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<java.lang.Object> rawSet;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<String> stringSet;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderSingularSetsBuilder() {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularSets.BuilderSingularSetsBuilder<T> dangerMouse(final T dangerMouse) {\n\t\t\tif (this.dangerMice == null) this.dangerMice = new java.util.ArrayList<T>();\n\t\t\tthis.dangerMice.add(dangerMouse);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularSets.BuilderSingularSetsBuilder<T> dangerMice(final java.util.Collection<? extends T> dangerMice) {\n\t\t\tif (dangerMice == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"dangerMice cannot be null\");\n\t\t\t}\n\t\t\tif (this.dangerMice == null) this.dangerMice = new java.util.ArrayList<T>();\n\t\t\tthis.dangerMice.addAll(dangerMice);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularSets.BuilderSingularSetsBuilder<T> clearDangerMice() {\n\t\t\tif (this.dangerMice != null) this.dangerMice.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularSets.BuilderSingularSetsBuilder<T> octopus(final Number octopus) {\n\t\t\tif (this.octopodes == null) this.octopodes = new java.util.ArrayList<Number>();\n\t\t\tthis.octopodes.add(octopus);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularSets.BuilderSingularSetsBuilder<T> octopodes(final java.util.Collection<? extends Number> octopodes) {\n\t\t\tif (octopodes == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"octopodes cannot be null\");\n\t\t\t}\n\t\t\tif (this.octopodes == null) this.octopodes = new java.util.ArrayList<Number>();\n\t\t\tthis.octopodes.addAll(octopodes);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularSets.BuilderSingularSetsBuilder<T> clearOctopodes() {\n\t\t\tif (this.octopodes != null) this.octopodes.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularSets.BuilderSingularSetsBuilder<T> rawSet(final java.lang.Object rawSet) {\n\t\t\tif (this.rawSet == null) this.rawSet = new java.util.ArrayList<java.lang.Object>();\n\t\t\tthis.rawSet.add(rawSet);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularSets.BuilderSingularSetsBuilder<T> rawSet(final java.util.Collection<?> rawSet) {\n\t\t\tif (rawSet == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"rawSet cannot be null\");\n\t\t\t}\n\t\t\tif (this.rawSet == null) this.rawSet = new java.util.ArrayList<java.lang.Object>();\n\t\t\tthis.rawSet.addAll(rawSet);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularSets.BuilderSingularSetsBuilder<T> clearRawSet() {\n\t\t\tif (this.rawSet != null) this.rawSet.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularSets.BuilderSingularSetsBuilder<T> stringSet(final String stringSet) {\n\t\t\tif (this.stringSet == null) this.stringSet = new java.util.ArrayList<String>();\n\t\t\tthis.stringSet.add(stringSet);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularSets.BuilderSingularSetsBuilder<T> stringSet(final java.util.Collection<? extends String> stringSet) {\n\t\t\tif (stringSet == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"stringSet cannot be null\");\n\t\t\t}\n\t\t\tif (this.stringSet == null) this.stringSet = new java.util.ArrayList<String>();\n\t\t\tthis.stringSet.addAll(stringSet);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularSets.BuilderSingularSetsBuilder<T> clearStringSet() {\n\t\t\tif (this.stringSet != null) this.stringSet.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularSets<T> build() {\n\t\t\tjava.util.Set<T> dangerMice;\n\t\t\tswitch (this.dangerMice == null ? 0 : this.dangerMice.size()) {\n\t\t\tcase 0: \n\t\t\t\tdangerMice = java.util.Collections.emptySet();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tdangerMice = java.util.Collections.singleton(this.dangerMice.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tdangerMice = new java.util.LinkedHashSet<T>(this.dangerMice.size() < 1073741824 ? 1 + this.dangerMice.size() + (this.dangerMice.size() - 3) / 3 : java.lang.Integer.MAX_VALUE);\n\t\t\t\tdangerMice.addAll(this.dangerMice);\n\t\t\t\tdangerMice = java.util.Collections.unmodifiableSet(dangerMice);\n\t\t\t}\n\t\t\tjava.util.SortedSet<Number> octopodes = new java.util.TreeSet<Number>();\n\t\t\tif (this.octopodes != null) octopodes.addAll(this.octopodes);\n\t\t\toctopodes = java.util.Collections.unmodifiableSortedSet(octopodes);\n\t\t\tjava.util.Set<java.lang.Object> rawSet;\n\t\t\tswitch (this.rawSet == null ? 0 : this.rawSet.size()) {\n\t\t\tcase 0: \n\t\t\t\trawSet = java.util.Collections.emptySet();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\trawSet = java.util.Collections.singleton(this.rawSet.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\trawSet = new java.util.LinkedHashSet<java.lang.Object>(this.rawSet.size() < 1073741824 ? 1 + this.rawSet.size() + (this.rawSet.size() - 3) / 3 : java.lang.Integer.MAX_VALUE);\n\t\t\t\trawSet.addAll(this.rawSet);\n\t\t\t\trawSet = java.util.Collections.unmodifiableSet(rawSet);\n\t\t\t}\n\t\t\tjava.util.Set<String> stringSet;\n\t\t\tswitch (this.stringSet == null ? 0 : this.stringSet.size()) {\n\t\t\tcase 0: \n\t\t\t\tstringSet = java.util.Collections.emptySet();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tstringSet = java.util.Collections.singleton(this.stringSet.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tstringSet = new java.util.LinkedHashSet<String>(this.stringSet.size() < 1073741824 ? 1 + this.stringSet.size() + (this.stringSet.size() - 3) / 3 : java.lang.Integer.MAX_VALUE);\n\t\t\t\tstringSet.addAll(this.stringSet);\n\t\t\t\tstringSet = java.util.Collections.unmodifiableSet(stringSet);\n\t\t\t}\n\t\t\treturn new BuilderSingularSets<T>(dangerMice, octopodes, rawSet, stringSet);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderSingularSets.BuilderSingularSetsBuilder(dangerMice=\" + this.dangerMice + \", octopodes=\" + this.octopodes + \", rawSet=\" + this.rawSet + \", stringSet=\" + this.stringSet + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static <T> BuilderSingularSets.BuilderSingularSetsBuilder<T> builder() {\n\t\treturn new BuilderSingularSets.BuilderSingularSetsBuilder<T>();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderSingularSetsWithSetterPrefix.java",
    "content": "import java.util.Set;\nimport java.util.SortedSet;\nclass BuilderSingularSetsWithSetterPrefix<T> {\n\tprivate Set<T> dangerMice;\n\tprivate SortedSet<? extends Number> octopodes;\n\t@SuppressWarnings(\"all\")\n\tprivate Set rawSet;\n\tprivate Set<String> stringSet;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderSingularSetsWithSetterPrefix(final Set<T> dangerMice, final SortedSet<? extends Number> octopodes, final Set rawSet, final Set<String> stringSet) {\n\t\tthis.dangerMice = dangerMice;\n\t\tthis.octopodes = octopodes;\n\t\tthis.rawSet = rawSet;\n\t\tthis.stringSet = stringSet;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderSingularSetsWithSetterPrefixBuilder<T> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<T> dangerMice;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<Number> octopodes;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<java.lang.Object> rawSet;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<String> stringSet;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderSingularSetsWithSetterPrefixBuilder() {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder<T> withDangerMouse(final T dangerMouse) {\n\t\t\tif (this.dangerMice == null) this.dangerMice = new java.util.ArrayList<T>();\n\t\t\tthis.dangerMice.add(dangerMouse);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder<T> withDangerMice(final java.util.Collection<? extends T> dangerMice) {\n\t\t\tif (dangerMice == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"dangerMice cannot be null\");\n\t\t\t}\n\t\t\tif (this.dangerMice == null) this.dangerMice = new java.util.ArrayList<T>();\n\t\t\tthis.dangerMice.addAll(dangerMice);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder<T> clearDangerMice() {\n\t\t\tif (this.dangerMice != null) this.dangerMice.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder<T> withOctopus(final Number octopus) {\n\t\t\tif (this.octopodes == null) this.octopodes = new java.util.ArrayList<Number>();\n\t\t\tthis.octopodes.add(octopus);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder<T> withOctopodes(final java.util.Collection<? extends Number> octopodes) {\n\t\t\tif (octopodes == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"octopodes cannot be null\");\n\t\t\t}\n\t\t\tif (this.octopodes == null) this.octopodes = new java.util.ArrayList<Number>();\n\t\t\tthis.octopodes.addAll(octopodes);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder<T> clearOctopodes() {\n\t\t\tif (this.octopodes != null) this.octopodes.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder<T> withRawSet(final java.lang.Object rawSet) {\n\t\t\tif (this.rawSet == null) this.rawSet = new java.util.ArrayList<java.lang.Object>();\n\t\t\tthis.rawSet.add(rawSet);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder<T> withRawSet(final java.util.Collection<?> rawSet) {\n\t\t\tif (rawSet == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"rawSet cannot be null\");\n\t\t\t}\n\t\t\tif (this.rawSet == null) this.rawSet = new java.util.ArrayList<java.lang.Object>();\n\t\t\tthis.rawSet.addAll(rawSet);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder<T> clearRawSet() {\n\t\t\tif (this.rawSet != null) this.rawSet.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder<T> withStringSet(final String stringSet) {\n\t\t\tif (this.stringSet == null) this.stringSet = new java.util.ArrayList<String>();\n\t\t\tthis.stringSet.add(stringSet);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder<T> withStringSet(final java.util.Collection<? extends String> stringSet) {\n\t\t\tif (stringSet == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"stringSet cannot be null\");\n\t\t\t}\n\t\t\tif (this.stringSet == null) this.stringSet = new java.util.ArrayList<String>();\n\t\t\tthis.stringSet.addAll(stringSet);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder<T> clearStringSet() {\n\t\t\tif (this.stringSet != null) this.stringSet.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularSetsWithSetterPrefix<T> build() {\n\t\t\tjava.util.Set<T> dangerMice;\n\t\t\tswitch (this.dangerMice == null ? 0 : this.dangerMice.size()) {\n\t\t\tcase 0: \n\t\t\t\tdangerMice = java.util.Collections.emptySet();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tdangerMice = java.util.Collections.singleton(this.dangerMice.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tdangerMice = new java.util.LinkedHashSet<T>(this.dangerMice.size() < 1073741824 ? 1 + this.dangerMice.size() + (this.dangerMice.size() - 3) / 3 : java.lang.Integer.MAX_VALUE);\n\t\t\t\tdangerMice.addAll(this.dangerMice);\n\t\t\t\tdangerMice = java.util.Collections.unmodifiableSet(dangerMice);\n\t\t\t}\n\t\t\tjava.util.SortedSet<Number> octopodes = new java.util.TreeSet<Number>();\n\t\t\tif (this.octopodes != null) octopodes.addAll(this.octopodes);\n\t\t\toctopodes = java.util.Collections.unmodifiableSortedSet(octopodes);\n\t\t\tjava.util.Set<java.lang.Object> rawSet;\n\t\t\tswitch (this.rawSet == null ? 0 : this.rawSet.size()) {\n\t\t\tcase 0: \n\t\t\t\trawSet = java.util.Collections.emptySet();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\trawSet = java.util.Collections.singleton(this.rawSet.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\trawSet = new java.util.LinkedHashSet<java.lang.Object>(this.rawSet.size() < 1073741824 ? 1 + this.rawSet.size() + (this.rawSet.size() - 3) / 3 : java.lang.Integer.MAX_VALUE);\n\t\t\t\trawSet.addAll(this.rawSet);\n\t\t\t\trawSet = java.util.Collections.unmodifiableSet(rawSet);\n\t\t\t}\n\t\t\tjava.util.Set<String> stringSet;\n\t\t\tswitch (this.stringSet == null ? 0 : this.stringSet.size()) {\n\t\t\tcase 0: \n\t\t\t\tstringSet = java.util.Collections.emptySet();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tstringSet = java.util.Collections.singleton(this.stringSet.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tstringSet = new java.util.LinkedHashSet<String>(this.stringSet.size() < 1073741824 ? 1 + this.stringSet.size() + (this.stringSet.size() - 3) / 3 : java.lang.Integer.MAX_VALUE);\n\t\t\t\tstringSet.addAll(this.stringSet);\n\t\t\t\tstringSet = java.util.Collections.unmodifiableSet(stringSet);\n\t\t\t}\n\t\t\treturn new BuilderSingularSetsWithSetterPrefix<T>(dangerMice, octopodes, rawSet, stringSet);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder(dangerMice=\" + this.dangerMice + \", octopodes=\" + this.octopodes + \", rawSet=\" + this.rawSet + \", stringSet=\" + this.stringSet + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static <T> BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder<T> builder() {\n\t\treturn new BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder<T>();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderSingularToBuilderWithNull.java",
    "content": "class BuilderSingularToBuilderWithNull {\n\tprivate java.util.List<String> elems;\n\tpublic static void test() {\n\t\tnew BuilderSingularToBuilderWithNull(null).toBuilder();\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderSingularToBuilderWithNull(final java.util.List<String> elems) {\n\t\tthis.elems = elems;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderSingularToBuilderWithNullBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<String> elems;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderSingularToBuilderWithNullBuilder() {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularToBuilderWithNull.BuilderSingularToBuilderWithNullBuilder elem(final String elem) {\n\t\t\tif (this.elems == null) this.elems = new java.util.ArrayList<String>();\n\t\t\tthis.elems.add(elem);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularToBuilderWithNull.BuilderSingularToBuilderWithNullBuilder elems(final java.util.Collection<? extends String> elems) {\n\t\t\tif (elems == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"elems cannot be null\");\n\t\t\t}\n\t\t\tif (this.elems == null) this.elems = new java.util.ArrayList<String>();\n\t\t\tthis.elems.addAll(elems);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularToBuilderWithNull.BuilderSingularToBuilderWithNullBuilder clearElems() {\n\t\t\tif (this.elems != null) this.elems.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularToBuilderWithNull build() {\n\t\t\tjava.util.List<String> elems;\n\t\t\tswitch (this.elems == null ? 0 : this.elems.size()) {\n\t\t\tcase 0: \n\t\t\t\telems = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\telems = java.util.Collections.singletonList(this.elems.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\telems = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.elems));\n\t\t\t}\n\t\t\treturn new BuilderSingularToBuilderWithNull(elems);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderSingularToBuilderWithNull.BuilderSingularToBuilderWithNullBuilder(elems=\" + this.elems + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderSingularToBuilderWithNull.BuilderSingularToBuilderWithNullBuilder builder() {\n\t\treturn new BuilderSingularToBuilderWithNull.BuilderSingularToBuilderWithNullBuilder();\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic BuilderSingularToBuilderWithNull.BuilderSingularToBuilderWithNullBuilder toBuilder() {\n\t\tfinal BuilderSingularToBuilderWithNull.BuilderSingularToBuilderWithNullBuilder builder = new BuilderSingularToBuilderWithNull.BuilderSingularToBuilderWithNullBuilder();\n\t\tif (this.elems != null) builder.elems(this.elems);\n\t\treturn builder;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderSingularToBuilderWithNullWithSetterPrefix.java",
    "content": "class BuilderSingularToBuilderWithNullWithSetterPrefix {\n\tprivate java.util.List<String> elems;\n\tpublic static void test() {\n\t\tnew BuilderSingularToBuilderWithNullWithSetterPrefix(null).toBuilder();\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderSingularToBuilderWithNullWithSetterPrefix(final java.util.List<String> elems) {\n\t\tthis.elems = elems;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderSingularToBuilderWithNullWithSetterPrefixBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<String> elems;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderSingularToBuilderWithNullWithSetterPrefixBuilder() {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularToBuilderWithNullWithSetterPrefix.BuilderSingularToBuilderWithNullWithSetterPrefixBuilder withElem(final String elem) {\n\t\t\tif (this.elems == null) this.elems = new java.util.ArrayList<String>();\n\t\t\tthis.elems.add(elem);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularToBuilderWithNullWithSetterPrefix.BuilderSingularToBuilderWithNullWithSetterPrefixBuilder withElems(final java.util.Collection<? extends String> elems) {\n\t\t\tif (elems == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"elems cannot be null\");\n\t\t\t}\n\t\t\tif (this.elems == null) this.elems = new java.util.ArrayList<String>();\n\t\t\tthis.elems.addAll(elems);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularToBuilderWithNullWithSetterPrefix.BuilderSingularToBuilderWithNullWithSetterPrefixBuilder clearElems() {\n\t\t\tif (this.elems != null) this.elems.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularToBuilderWithNullWithSetterPrefix build() {\n\t\t\tjava.util.List<String> elems;\n\t\t\tswitch (this.elems == null ? 0 : this.elems.size()) {\n\t\t\tcase 0: \n\t\t\t\telems = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\telems = java.util.Collections.singletonList(this.elems.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\telems = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.elems));\n\t\t\t}\n\t\t\treturn new BuilderSingularToBuilderWithNullWithSetterPrefix(elems);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderSingularToBuilderWithNullWithSetterPrefix.BuilderSingularToBuilderWithNullWithSetterPrefixBuilder(elems=\" + this.elems + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderSingularToBuilderWithNullWithSetterPrefix.BuilderSingularToBuilderWithNullWithSetterPrefixBuilder builder() {\n\t\treturn new BuilderSingularToBuilderWithNullWithSetterPrefix.BuilderSingularToBuilderWithNullWithSetterPrefixBuilder();\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic BuilderSingularToBuilderWithNullWithSetterPrefix.BuilderSingularToBuilderWithNullWithSetterPrefixBuilder toBuilder() {\n\t\tfinal BuilderSingularToBuilderWithNullWithSetterPrefix.BuilderSingularToBuilderWithNullWithSetterPrefixBuilder builder = new BuilderSingularToBuilderWithNullWithSetterPrefix.BuilderSingularToBuilderWithNullWithSetterPrefixBuilder();\n\t\tif (this.elems != null) builder.withElems(this.elems);\n\t\treturn builder;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderSingularWildcardListsWithToBuilder.java",
    "content": "import java.util.List;\nimport java.util.Collection;\nclass BuilderSingularWildcardListsWithToBuilder {\n\tprivate List<?> objects;\n\tprivate Collection<? extends Number> numbers;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderSingularWildcardListsWithToBuilder(final List<?> objects, final Collection<? extends Number> numbers) {\n\t\tthis.objects = objects;\n\t\tthis.numbers = numbers;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderSingularWildcardListsWithToBuilderBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<java.lang.Object> objects;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<Number> numbers;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderSingularWildcardListsWithToBuilderBuilder() {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularWildcardListsWithToBuilder.BuilderSingularWildcardListsWithToBuilderBuilder object(final java.lang.Object object) {\n\t\t\tif (this.objects == null) this.objects = new java.util.ArrayList<java.lang.Object>();\n\t\t\tthis.objects.add(object);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularWildcardListsWithToBuilder.BuilderSingularWildcardListsWithToBuilderBuilder objects(final java.util.Collection<?> objects) {\n\t\t\tif (objects == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"objects cannot be null\");\n\t\t\t}\n\t\t\tif (this.objects == null) this.objects = new java.util.ArrayList<java.lang.Object>();\n\t\t\tthis.objects.addAll(objects);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularWildcardListsWithToBuilder.BuilderSingularWildcardListsWithToBuilderBuilder clearObjects() {\n\t\t\tif (this.objects != null) this.objects.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularWildcardListsWithToBuilder.BuilderSingularWildcardListsWithToBuilderBuilder number(final Number number) {\n\t\t\tif (this.numbers == null) this.numbers = new java.util.ArrayList<Number>();\n\t\t\tthis.numbers.add(number);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularWildcardListsWithToBuilder.BuilderSingularWildcardListsWithToBuilderBuilder numbers(final java.util.Collection<? extends Number> numbers) {\n\t\t\tif (numbers == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"numbers cannot be null\");\n\t\t\t}\n\t\t\tif (this.numbers == null) this.numbers = new java.util.ArrayList<Number>();\n\t\t\tthis.numbers.addAll(numbers);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularWildcardListsWithToBuilder.BuilderSingularWildcardListsWithToBuilderBuilder clearNumbers() {\n\t\t\tif (this.numbers != null) this.numbers.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularWildcardListsWithToBuilder build() {\n\t\t\tjava.util.List<java.lang.Object> objects;\n\t\t\tswitch (this.objects == null ? 0 : this.objects.size()) {\n\t\t\tcase 0: \n\t\t\t\tobjects = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tobjects = java.util.Collections.singletonList(this.objects.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tobjects = java.util.Collections.unmodifiableList(new java.util.ArrayList<java.lang.Object>(this.objects));\n\t\t\t}\n\t\t\tjava.util.Collection<Number> numbers;\n\t\t\tswitch (this.numbers == null ? 0 : this.numbers.size()) {\n\t\t\tcase 0: \n\t\t\t\tnumbers = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tnumbers = java.util.Collections.singletonList(this.numbers.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tnumbers = java.util.Collections.unmodifiableList(new java.util.ArrayList<Number>(this.numbers));\n\t\t\t}\n\t\t\treturn new BuilderSingularWildcardListsWithToBuilder(objects, numbers);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderSingularWildcardListsWithToBuilder.BuilderSingularWildcardListsWithToBuilderBuilder(objects=\" + this.objects + \", numbers=\" + this.numbers + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderSingularWildcardListsWithToBuilder.BuilderSingularWildcardListsWithToBuilderBuilder builder() {\n\t\treturn new BuilderSingularWildcardListsWithToBuilder.BuilderSingularWildcardListsWithToBuilderBuilder();\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic BuilderSingularWildcardListsWithToBuilder.BuilderSingularWildcardListsWithToBuilderBuilder toBuilder() {\n\t\tfinal BuilderSingularWildcardListsWithToBuilder.BuilderSingularWildcardListsWithToBuilderBuilder builder = new BuilderSingularWildcardListsWithToBuilder.BuilderSingularWildcardListsWithToBuilderBuilder();\n\t\tif (this.objects != null) builder.objects(this.objects);\n\t\tif (this.numbers != null) builder.numbers(this.numbers);\n\t\treturn builder;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderSingularWithPrefixes.java",
    "content": "class BuilderSingularWithPrefixes {\n\tprivate java.util.List<String> _elems;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderSingularWithPrefixes(final java.util.List<String> elems) {\n\t\tthis._elems = elems;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderSingularWithPrefixesBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<String> elems;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderSingularWithPrefixesBuilder() {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularWithPrefixes.BuilderSingularWithPrefixesBuilder elem(final String elem) {\n\t\t\tif (this.elems == null) this.elems = new java.util.ArrayList<String>();\n\t\t\tthis.elems.add(elem);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularWithPrefixes.BuilderSingularWithPrefixesBuilder elems(final java.util.Collection<? extends String> elems) {\n\t\t\tif (elems == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"elems cannot be null\");\n\t\t\t}\n\t\t\tif (this.elems == null) this.elems = new java.util.ArrayList<String>();\n\t\t\tthis.elems.addAll(elems);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularWithPrefixes.BuilderSingularWithPrefixesBuilder clearElems() {\n\t\t\tif (this.elems != null) this.elems.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularWithPrefixes build() {\n\t\t\tjava.util.List<String> elems;\n\t\t\tswitch (this.elems == null ? 0 : this.elems.size()) {\n\t\t\tcase 0: \n\t\t\t\telems = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\telems = java.util.Collections.singletonList(this.elems.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\telems = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.elems));\n\t\t\t}\n\t\t\treturn new BuilderSingularWithPrefixes(elems);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderSingularWithPrefixes.BuilderSingularWithPrefixesBuilder(elems=\" + this.elems + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderSingularWithPrefixes.BuilderSingularWithPrefixesBuilder builder() {\n\t\treturn new BuilderSingularWithPrefixes.BuilderSingularWithPrefixesBuilder();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderSingularWithPrefixesWithSetterPrefix.java",
    "content": "class BuilderSingularWithPrefixesWithSetterPrefix {\n\tprivate java.util.List<String> _elems;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderSingularWithPrefixesWithSetterPrefix(final java.util.List<String> elems) {\n\t\tthis._elems = elems;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderSingularWithPrefixesWithSetterPrefixBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<String> elems;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderSingularWithPrefixesWithSetterPrefixBuilder() {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularWithPrefixesWithSetterPrefix.BuilderSingularWithPrefixesWithSetterPrefixBuilder withElem(final String elem) {\n\t\t\tif (this.elems == null) this.elems = new java.util.ArrayList<String>();\n\t\t\tthis.elems.add(elem);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularWithPrefixesWithSetterPrefix.BuilderSingularWithPrefixesWithSetterPrefixBuilder withElems(final java.util.Collection<? extends String> elems) {\n\t\t\tif (elems == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"elems cannot be null\");\n\t\t\t}\n\t\t\tif (this.elems == null) this.elems = new java.util.ArrayList<String>();\n\t\t\tthis.elems.addAll(elems);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularWithPrefixesWithSetterPrefix.BuilderSingularWithPrefixesWithSetterPrefixBuilder clearElems() {\n\t\t\tif (this.elems != null) this.elems.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderSingularWithPrefixesWithSetterPrefix build() {\n\t\t\tjava.util.List<String> elems;\n\t\t\tswitch (this.elems == null ? 0 : this.elems.size()) {\n\t\t\tcase 0: \n\t\t\t\telems = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\telems = java.util.Collections.singletonList(this.elems.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\telems = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.elems));\n\t\t\t}\n\t\t\treturn new BuilderSingularWithPrefixesWithSetterPrefix(elems);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderSingularWithPrefixesWithSetterPrefix.BuilderSingularWithPrefixesWithSetterPrefixBuilder(elems=\" + this.elems + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderSingularWithPrefixesWithSetterPrefix.BuilderSingularWithPrefixesWithSetterPrefixBuilder builder() {\n\t\treturn new BuilderSingularWithPrefixesWithSetterPrefix.BuilderSingularWithPrefixesWithSetterPrefixBuilder();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderTypeAnnos.java",
    "content": "import java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.List;\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})\n@interface TA {\n}\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})\n@interface TB {\n}\nclass BuilderTypeAnnos {\n\t@TA\n\t@TB\n\tprivate List<String> foo;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderTypeAnnos(@TA final List<String> foo) {\n\t\tthis.foo = foo;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderTypeAnnosBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate List<String> foo;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderTypeAnnosBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderTypeAnnos.BuilderTypeAnnosBuilder foo(@TA final List<String> foo) {\n\t\t\tthis.foo = foo;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderTypeAnnos build() {\n\t\t\treturn new BuilderTypeAnnos(this.foo);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderTypeAnnos.BuilderTypeAnnosBuilder(foo=\" + this.foo + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderTypeAnnos.BuilderTypeAnnosBuilder builder() {\n\t\treturn new BuilderTypeAnnos.BuilderTypeAnnosBuilder();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderTypeAnnosWithSetterPrefix.java",
    "content": "import java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.List;\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})\n@interface TA {\n}\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})\n@interface TB {\n}\nclass BuilderTypeAnnosWithSetterPrefix {\n\t@TA\n\t@TB\n\tprivate List<String> foo;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderTypeAnnosWithSetterPrefix(@TA final List<String> foo) {\n\t\tthis.foo = foo;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderTypeAnnosWithSetterPrefixBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate List<String> foo;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderTypeAnnosWithSetterPrefixBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderTypeAnnosWithSetterPrefix.BuilderTypeAnnosWithSetterPrefixBuilder withFoo(@TA final List<String> foo) {\n\t\t\tthis.foo = foo;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderTypeAnnosWithSetterPrefix build() {\n\t\t\treturn new BuilderTypeAnnosWithSetterPrefix(this.foo);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderTypeAnnosWithSetterPrefix.BuilderTypeAnnosWithSetterPrefixBuilder(foo=\" + this.foo + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderTypeAnnosWithSetterPrefix.BuilderTypeAnnosWithSetterPrefixBuilder builder() {\n\t\treturn new BuilderTypeAnnosWithSetterPrefix.BuilderTypeAnnosWithSetterPrefixBuilder();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderValueData.java",
    "content": "import java.util.List;\nfinal class BuilderAndValue {\n\tprivate final int zero = 0;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderAndValue() {\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderAndValueBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderAndValueBuilder() {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderAndValue build() {\n\t\t\treturn new BuilderAndValue();\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderAndValue.BuilderAndValueBuilder()\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderAndValue.BuilderAndValueBuilder builder() {\n\t\treturn new BuilderAndValue.BuilderAndValueBuilder();\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getZero() {\n\t\treturn this.zero;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof BuilderAndValue)) return false;\n\t\tfinal BuilderAndValue other = (BuilderAndValue) o;\n\t\tif (this.getZero() != other.getZero()) return false;\n\t\treturn true;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.getZero();\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"BuilderAndValue(zero=\" + this.getZero() + \")\";\n\t}\n}\nclass BuilderAndData {\n\tprivate final int zero = 0;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderAndData() {\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderAndDataBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderAndDataBuilder() {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderAndData build() {\n\t\t\treturn new BuilderAndData();\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderAndData.BuilderAndDataBuilder()\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderAndData.BuilderAndDataBuilder builder() {\n\t\treturn new BuilderAndData.BuilderAndDataBuilder();\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getZero() {\n\t\treturn this.zero;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof BuilderAndData)) return false;\n\t\tfinal BuilderAndData other = (BuilderAndData) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (this.getZero() != other.getZero()) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof BuilderAndData;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.getZero();\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"BuilderAndData(zero=\" + this.getZero() + \")\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderValueDataWithSetterPrefix.java",
    "content": "import java.util.List;\nfinal class BuilderAndValueWithSetterPrefix {\n\tprivate final int zero = 0;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderAndValueWithSetterPrefix() {\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderAndValueWithSetterPrefixBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderAndValueWithSetterPrefixBuilder() {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderAndValueWithSetterPrefix build() {\n\t\t\treturn new BuilderAndValueWithSetterPrefix();\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderAndValueWithSetterPrefix.BuilderAndValueWithSetterPrefixBuilder()\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderAndValueWithSetterPrefix.BuilderAndValueWithSetterPrefixBuilder builder() {\n\t\treturn new BuilderAndValueWithSetterPrefix.BuilderAndValueWithSetterPrefixBuilder();\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getZero() {\n\t\treturn this.zero;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof BuilderAndValueWithSetterPrefix)) return false;\n\t\tfinal BuilderAndValueWithSetterPrefix other = (BuilderAndValueWithSetterPrefix) o;\n\t\tif (this.getZero() != other.getZero()) return false;\n\t\treturn true;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.getZero();\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"BuilderAndValueWithSetterPrefix(zero=\" + this.getZero() + \")\";\n\t}\n}\nclass BuilderAndDataWithSetterPrefix {\n\tprivate final int zero = 0;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderAndDataWithSetterPrefix() {\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderAndDataWithSetterPrefixBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderAndDataWithSetterPrefixBuilder() {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderAndDataWithSetterPrefix build() {\n\t\t\treturn new BuilderAndDataWithSetterPrefix();\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderAndDataWithSetterPrefix.BuilderAndDataWithSetterPrefixBuilder()\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderAndDataWithSetterPrefix.BuilderAndDataWithSetterPrefixBuilder builder() {\n\t\treturn new BuilderAndDataWithSetterPrefix.BuilderAndDataWithSetterPrefixBuilder();\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getZero() {\n\t\treturn this.zero;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof BuilderAndDataWithSetterPrefix)) return false;\n\t\tfinal BuilderAndDataWithSetterPrefix other = (BuilderAndDataWithSetterPrefix) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (this.getZero() != other.getZero()) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof BuilderAndDataWithSetterPrefix;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.getZero();\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"BuilderAndDataWithSetterPrefix(zero=\" + this.getZero() + \")\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderWithAccessors.java",
    "content": "class BuilderWithAccessors {\n\tprivate final int plower;\n\tprivate final int pUpper;\n\tprivate int _foo;\n\tprivate int __bar;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderWithAccessors(final int plower, final int upper, final int foo, final int _bar) {\n\t\tthis.plower = plower;\n\t\tthis.pUpper = upper;\n\t\tthis._foo = foo;\n\t\tthis.__bar = _bar;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderWithAccessorsBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int plower;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int upper;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int foo;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int _bar;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderWithAccessorsBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithAccessors.BuilderWithAccessorsBuilder plower(final int plower) {\n\t\t\tthis.plower = plower;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithAccessors.BuilderWithAccessorsBuilder upper(final int upper) {\n\t\t\tthis.upper = upper;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithAccessors.BuilderWithAccessorsBuilder foo(final int foo) {\n\t\t\tthis.foo = foo;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithAccessors.BuilderWithAccessorsBuilder _bar(final int _bar) {\n\t\t\tthis._bar = _bar;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithAccessors build() {\n\t\t\treturn new BuilderWithAccessors(this.plower, this.upper, this.foo, this._bar);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderWithAccessors.BuilderWithAccessorsBuilder(plower=\" + this.plower + \", upper=\" + this.upper + \", foo=\" + this.foo + \", _bar=\" + this._bar + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderWithAccessors.BuilderWithAccessorsBuilder builder() {\n\t\treturn new BuilderWithAccessors.BuilderWithAccessorsBuilder();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderWithBadNames.java",
    "content": "public class BuilderWithBadNames {\n\tString build;\n\tString toString;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderWithBadNames(final String build, final String toString) {\n\t\tthis.build = build;\n\t\tthis.toString = toString;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderWithBadNamesBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate String build;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate String toString;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderWithBadNamesBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithBadNames.BuilderWithBadNamesBuilder build(final String build) {\n\t\t\tthis.build = build;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithBadNames.BuilderWithBadNamesBuilder toString(final String toString) {\n\t\t\tthis.toString = toString;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithBadNames build() {\n\t\t\treturn new BuilderWithBadNames(this.build, this.toString);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderWithBadNames.BuilderWithBadNamesBuilder(build=\" + this.build + \", toString=\" + this.toString + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderWithBadNames.BuilderWithBadNamesBuilder builder() {\n\t\treturn new BuilderWithBadNames.BuilderWithBadNamesBuilder();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderWithDeprecated.java",
    "content": "import com.google.common.collect.ImmutableList;\npublic class BuilderWithDeprecated {\n\t/**\n\t * @deprecated since always\n\t */\n\tString dep1;\n\t@Deprecated\n\tint dep2;\n\t@Deprecated\n\tjava.util.List<String> strings;\n\t@Deprecated\n\tImmutableList<Integer> numbers;\n\t/**\n\t * Creates a new {@code BuilderWithDeprecated} instance.\n\t *\n\t * @param dep1 @deprecated since always\n\t * @param dep2 \n\t * @param strings \n\t * @param numbers \n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderWithDeprecated(final String dep1, final int dep2, final java.util.List<String> strings, final ImmutableList<Integer> numbers) {\n\t\tthis.dep1 = dep1;\n\t\tthis.dep2 = dep2;\n\t\tthis.strings = strings;\n\t\tthis.numbers = numbers;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderWithDeprecatedBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate String dep1;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int dep2;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<String> strings;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate com.google.common.collect.ImmutableList.Builder<Integer> numbers;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderWithDeprecatedBuilder() {\n\t\t}\n\t\t/**\n\t\t * @deprecated since always\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.Deprecated\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithDeprecated.BuilderWithDeprecatedBuilder dep1(final String dep1) {\n\t\t\tthis.dep1 = dep1;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.Deprecated\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithDeprecated.BuilderWithDeprecatedBuilder dep2(final int dep2) {\n\t\t\tthis.dep2 = dep2;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.Deprecated\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithDeprecated.BuilderWithDeprecatedBuilder string(final String string) {\n\t\t\tif (this.strings == null) this.strings = new java.util.ArrayList<String>();\n\t\t\tthis.strings.add(string);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.Deprecated\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithDeprecated.BuilderWithDeprecatedBuilder strings(final java.util.Collection<? extends String> strings) {\n\t\t\tif (strings == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"strings cannot be null\");\n\t\t\t}\n\t\t\tif (this.strings == null) this.strings = new java.util.ArrayList<String>();\n\t\t\tthis.strings.addAll(strings);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.Deprecated\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithDeprecated.BuilderWithDeprecatedBuilder clearStrings() {\n\t\t\tif (this.strings != null) this.strings.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.Deprecated\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithDeprecated.BuilderWithDeprecatedBuilder number(final Integer number) {\n\t\t\tif (this.numbers == null) this.numbers = com.google.common.collect.ImmutableList.builder();\n\t\t\tthis.numbers.add(number);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.Deprecated\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithDeprecated.BuilderWithDeprecatedBuilder numbers(final java.lang.Iterable<? extends Integer> numbers) {\n\t\t\tif (numbers == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"numbers cannot be null\");\n\t\t\t}\n\t\t\tif (this.numbers == null) this.numbers = com.google.common.collect.ImmutableList.builder();\n\t\t\tthis.numbers.addAll(numbers);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.Deprecated\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithDeprecated.BuilderWithDeprecatedBuilder clearNumbers() {\n\t\t\tthis.numbers = null;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithDeprecated build() {\n\t\t\tjava.util.List<String> strings;\n\t\t\tswitch (this.strings == null ? 0 : this.strings.size()) {\n\t\t\tcase 0: \n\t\t\t\tstrings = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tstrings = java.util.Collections.singletonList(this.strings.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tstrings = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.strings));\n\t\t\t}\n\t\t\tcom.google.common.collect.ImmutableList<Integer> numbers = this.numbers == null ? com.google.common.collect.ImmutableList.<Integer>of() : this.numbers.build();\n\t\t\treturn new BuilderWithDeprecated(this.dep1, this.dep2, strings, numbers);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderWithDeprecated.BuilderWithDeprecatedBuilder(dep1=\" + this.dep1 + \", dep2=\" + this.dep2 + \", strings=\" + this.strings + \", numbers=\" + this.numbers + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderWithDeprecated.BuilderWithDeprecatedBuilder builder() {\n\t\treturn new BuilderWithDeprecated.BuilderWithDeprecatedBuilder();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderWithDeprecatedAnnOnly.java",
    "content": "import com.google.common.collect.ImmutableList;\npublic class BuilderWithDeprecatedAnnOnly {\n\t@Deprecated\n\tint dep1;\n\t@Deprecated\n\tjava.util.List<String> strings;\n\t@Deprecated\n\tImmutableList<Integer> numbers;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderWithDeprecatedAnnOnly(final int dep1, final java.util.List<String> strings, final ImmutableList<Integer> numbers) {\n\t\tthis.dep1 = dep1;\n\t\tthis.strings = strings;\n\t\tthis.numbers = numbers;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderWithDeprecatedAnnOnlyBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int dep1;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<String> strings;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate com.google.common.collect.ImmutableList.Builder<Integer> numbers;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderWithDeprecatedAnnOnlyBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.Deprecated\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithDeprecatedAnnOnly.BuilderWithDeprecatedAnnOnlyBuilder dep1(final int dep1) {\n\t\t\tthis.dep1 = dep1;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.Deprecated\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithDeprecatedAnnOnly.BuilderWithDeprecatedAnnOnlyBuilder string(final String string) {\n\t\t\tif (this.strings == null) this.strings = new java.util.ArrayList<String>();\n\t\t\tthis.strings.add(string);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.Deprecated\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithDeprecatedAnnOnly.BuilderWithDeprecatedAnnOnlyBuilder strings(final java.util.Collection<? extends String> strings) {\n\t\t\tif (strings == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"strings cannot be null\");\n\t\t\t}\n\t\t\tif (this.strings == null) this.strings = new java.util.ArrayList<String>();\n\t\t\tthis.strings.addAll(strings);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.Deprecated\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithDeprecatedAnnOnly.BuilderWithDeprecatedAnnOnlyBuilder clearStrings() {\n\t\t\tif (this.strings != null) this.strings.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.Deprecated\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithDeprecatedAnnOnly.BuilderWithDeprecatedAnnOnlyBuilder number(final Integer number) {\n\t\t\tif (this.numbers == null) this.numbers = com.google.common.collect.ImmutableList.builder();\n\t\t\tthis.numbers.add(number);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.Deprecated\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithDeprecatedAnnOnly.BuilderWithDeprecatedAnnOnlyBuilder numbers(final java.lang.Iterable<? extends Integer> numbers) {\n\t\t\tif (numbers == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"numbers cannot be null\");\n\t\t\t}\n\t\t\tif (this.numbers == null) this.numbers = com.google.common.collect.ImmutableList.builder();\n\t\t\tthis.numbers.addAll(numbers);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.Deprecated\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithDeprecatedAnnOnly.BuilderWithDeprecatedAnnOnlyBuilder clearNumbers() {\n\t\t\tthis.numbers = null;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithDeprecatedAnnOnly build() {\n\t\t\tjava.util.List<String> strings;\n\t\t\tswitch (this.strings == null ? 0 : this.strings.size()) {\n\t\t\tcase 0: \n\t\t\t\tstrings = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tstrings = java.util.Collections.singletonList(this.strings.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tstrings = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.strings));\n\t\t\t}\n\t\t\tcom.google.common.collect.ImmutableList<Integer> numbers = this.numbers == null ? com.google.common.collect.ImmutableList.<Integer>of() : this.numbers.build();\n\t\t\treturn new BuilderWithDeprecatedAnnOnly(this.dep1, strings, numbers);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderWithDeprecatedAnnOnly.BuilderWithDeprecatedAnnOnlyBuilder(dep1=\" + this.dep1 + \", strings=\" + this.strings + \", numbers=\" + this.numbers + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderWithDeprecatedAnnOnly.BuilderWithDeprecatedAnnOnlyBuilder builder() {\n\t\treturn new BuilderWithDeprecatedAnnOnly.BuilderWithDeprecatedAnnOnlyBuilder();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderWithExistingBuilderClass.java",
    "content": "class BuilderWithExistingBuilderClass<T, K extends Number> {\n\tpublic static <Z extends Number> BuilderWithExistingBuilderClass<String, Z> staticMethod(Z arg1, boolean arg2, String arg3) {\n\t\treturn null;\n\t}\n\tpublic static class BuilderWithExistingBuilderClassBuilder<Z extends Number> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate boolean arg2;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate String arg3;\n\t\tprivate Z arg1;\n\t\tpublic void arg2(boolean arg) {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderWithExistingBuilderClassBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithExistingBuilderClass.BuilderWithExistingBuilderClassBuilder<Z> arg1(final Z arg1) {\n\t\t\tthis.arg1 = arg1;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithExistingBuilderClass.BuilderWithExistingBuilderClassBuilder<Z> arg3(final String arg3) {\n\t\t\tthis.arg3 = arg3;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithExistingBuilderClass<String, Z> build() {\n\t\t\treturn BuilderWithExistingBuilderClass.<Z>staticMethod(this.arg1, this.arg2, this.arg3);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderWithExistingBuilderClass.BuilderWithExistingBuilderClassBuilder(arg1=\" + this.arg1 + \", arg2=\" + this.arg2 + \", arg3=\" + this.arg3 + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static <Z extends Number> BuilderWithExistingBuilderClass.BuilderWithExistingBuilderClassBuilder<Z> builder() {\n\t\treturn new BuilderWithExistingBuilderClass.BuilderWithExistingBuilderClassBuilder<Z>();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderWithExistingBuilderClassWithSetterPrefix.java",
    "content": "class BuilderWithExistingBuilderClassWithSetterPrefix<T, K extends Number> {\n\tpublic static <Z extends Number> BuilderWithExistingBuilderClassWithSetterPrefix<String, Z> staticMethod(Z arg1, boolean arg2, String arg3) {\n\t\treturn null;\n\t}\n\tpublic static class BuilderWithExistingBuilderClassWithSetterPrefixBuilder<Z extends Number> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate boolean arg2;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate String arg3;\n\t\tprivate Z arg1;\n\t\tpublic void withArg2(boolean arg) {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderWithExistingBuilderClassWithSetterPrefixBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithExistingBuilderClassWithSetterPrefix.BuilderWithExistingBuilderClassWithSetterPrefixBuilder<Z> withArg1(final Z arg1) {\n\t\t\tthis.arg1 = arg1;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithExistingBuilderClassWithSetterPrefix.BuilderWithExistingBuilderClassWithSetterPrefixBuilder<Z> withArg3(final String arg3) {\n\t\t\tthis.arg3 = arg3;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithExistingBuilderClassWithSetterPrefix<String, Z> build() {\n\t\t\treturn BuilderWithExistingBuilderClassWithSetterPrefix.<Z>staticMethod(this.arg1, this.arg2, this.arg3);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderWithExistingBuilderClassWithSetterPrefix.BuilderWithExistingBuilderClassWithSetterPrefixBuilder(arg1=\" + this.arg1 + \", arg2=\" + this.arg2 + \", arg3=\" + this.arg3 + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static <Z extends Number> BuilderWithExistingBuilderClassWithSetterPrefix.BuilderWithExistingBuilderClassWithSetterPrefixBuilder<Z> builder() {\n\t\treturn new BuilderWithExistingBuilderClassWithSetterPrefix.BuilderWithExistingBuilderClassWithSetterPrefixBuilder<Z>();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderWithJavaBeansSpecCapitalization.java",
    "content": "class BuilderWithJavaBeansSpecCapitalization {\n\tjava.util.List<String> a;\n\tjava.util.List<String> aField;\n\tString bField;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderWithJavaBeansSpecCapitalization(final java.util.List<String> a, final java.util.List<String> aField, final String bField) {\n\t\tthis.a = a;\n\t\tthis.aField = aField;\n\t\tthis.bField = bField;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderWithJavaBeansSpecCapitalizationBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<String> a;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<String> aField;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate String bField;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderWithJavaBeansSpecCapitalizationBuilder() {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithJavaBeansSpecCapitalization.BuilderWithJavaBeansSpecCapitalizationBuilder setZ(final String z) {\n\t\t\tif (this.a == null) this.a = new java.util.ArrayList<String>();\n\t\t\tthis.a.add(z);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithJavaBeansSpecCapitalization.BuilderWithJavaBeansSpecCapitalizationBuilder setA(final java.util.Collection<? extends String> a) {\n\t\t\tif (a == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"a cannot be null\");\n\t\t\t}\n\t\t\tif (this.a == null) this.a = new java.util.ArrayList<String>();\n\t\t\tthis.a.addAll(a);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithJavaBeansSpecCapitalization.BuilderWithJavaBeansSpecCapitalizationBuilder clearA() {\n\t\t\tif (this.a != null) this.a.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithJavaBeansSpecCapitalization.BuilderWithJavaBeansSpecCapitalizationBuilder setyField(final String yField) {\n\t\t\tif (this.aField == null) this.aField = new java.util.ArrayList<String>();\n\t\t\tthis.aField.add(yField);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithJavaBeansSpecCapitalization.BuilderWithJavaBeansSpecCapitalizationBuilder setaField(final java.util.Collection<? extends String> aField) {\n\t\t\tif (aField == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"aField cannot be null\");\n\t\t\t}\n\t\t\tif (this.aField == null) this.aField = new java.util.ArrayList<String>();\n\t\t\tthis.aField.addAll(aField);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithJavaBeansSpecCapitalization.BuilderWithJavaBeansSpecCapitalizationBuilder clearaField() {\n\t\t\tif (this.aField != null) this.aField.clear();\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithJavaBeansSpecCapitalization.BuilderWithJavaBeansSpecCapitalizationBuilder setbField(final String bField) {\n\t\t\tthis.bField = bField;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithJavaBeansSpecCapitalization build() {\n\t\t\tjava.util.List<String> a;\n\t\t\tswitch (this.a == null ? 0 : this.a.size()) {\n\t\t\tcase 0: \n\t\t\t\ta = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\ta = java.util.Collections.singletonList(this.a.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\ta = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.a));\n\t\t\t}\n\t\t\tjava.util.List<String> aField;\n\t\t\tswitch (this.aField == null ? 0 : this.aField.size()) {\n\t\t\tcase 0: \n\t\t\t\taField = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\taField = java.util.Collections.singletonList(this.aField.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\taField = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.aField));\n\t\t\t}\n\t\t\treturn new BuilderWithJavaBeansSpecCapitalization(a, aField, this.bField);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderWithJavaBeansSpecCapitalization.BuilderWithJavaBeansSpecCapitalizationBuilder(a=\" + this.a + \", aField=\" + this.aField + \", bField=\" + this.bField + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderWithJavaBeansSpecCapitalization.BuilderWithJavaBeansSpecCapitalizationBuilder builder() {\n\t\treturn new BuilderWithJavaBeansSpecCapitalization.BuilderWithJavaBeansSpecCapitalizationBuilder();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderWithNoBuilderMethod.java",
    "content": "class BuilderWithNoBuilderMethod {\n\tprivate String a = \"\";\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderWithNoBuilderMethod(final String a) {\n\t\tthis.a = a;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderWithNoBuilderMethodBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate String a;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderWithNoBuilderMethodBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithNoBuilderMethod.BuilderWithNoBuilderMethodBuilder a(final String a) {\n\t\t\tthis.a = a;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithNoBuilderMethod build() {\n\t\t\treturn new BuilderWithNoBuilderMethod(this.a);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderWithNoBuilderMethod.BuilderWithNoBuilderMethodBuilder(a=\" + this.a + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic BuilderWithNoBuilderMethod.BuilderWithNoBuilderMethodBuilder toBuilder() {\n\t\treturn new BuilderWithNoBuilderMethod.BuilderWithNoBuilderMethodBuilder().a(this.a);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderWithNonNull.java",
    "content": "//version 8:\nclass BuilderWithNonNull {\n\t@lombok.NonNull\n\tprivate final String id;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderWithNonNull(@lombok.NonNull final String id) {\n\t\tif (id == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"id is marked non-null but is null\");\n\t\t}\n\t\tthis.id = id;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderWithNonNullBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate String id;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderWithNonNullBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithNonNull.BuilderWithNonNullBuilder id(@lombok.NonNull final String id) {\n\t\t\tif (id == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"id is marked non-null but is null\");\n\t\t\t}\n\t\t\tthis.id = id;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithNonNull build() {\n\t\t\treturn new BuilderWithNonNull(this.id);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderWithNonNull.BuilderWithNonNullBuilder(id=\" + this.id + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderWithNonNull.BuilderWithNonNullBuilder builder() {\n\t\treturn new BuilderWithNonNull.BuilderWithNonNullBuilder();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderWithNonNullWithSetterPrefix.java",
    "content": "//version 8:\nclass BuilderWithNonNullWithSetterPrefix {\n\t@lombok.NonNull\n\tprivate final String id;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderWithNonNullWithSetterPrefix(@lombok.NonNull final String id) {\n\t\tif (id == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"id is marked non-null but is null\");\n\t\t}\n\t\tthis.id = id;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderWithNonNullWithSetterPrefixBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate String id;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderWithNonNullWithSetterPrefixBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithNonNullWithSetterPrefix.BuilderWithNonNullWithSetterPrefixBuilder withId(@lombok.NonNull final String id) {\n\t\t\tif (id == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"id is marked non-null but is null\");\n\t\t\t}\n\t\t\tthis.id = id;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithNonNullWithSetterPrefix build() {\n\t\t\treturn new BuilderWithNonNullWithSetterPrefix(this.id);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderWithNonNullWithSetterPrefix.BuilderWithNonNullWithSetterPrefixBuilder(id=\" + this.id + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderWithNonNullWithSetterPrefix.BuilderWithNonNullWithSetterPrefixBuilder builder() {\n\t\treturn new BuilderWithNonNullWithSetterPrefix.BuilderWithNonNullWithSetterPrefixBuilder();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderWithRecursiveGenerics.java",
    "content": "import java.util.Set;\npublic class BuilderWithRecursiveGenerics {\n\tinterface Inter<T, U extends Inter<T, U>> {\n\t}\n\tpublic static final class Test<Foo, Bar extends Set<Foo>, Quz extends Inter<Bar, Quz>> {\n\t\tprivate final Foo foo;\n\t\tprivate final Bar bar;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tTest(final Foo foo, final Bar bar) {\n\t\t\tthis.foo = foo;\n\t\t\tthis.bar = bar;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static class TestBuilder<Foo, Bar extends Set<Foo>, Quz extends Inter<Bar, Quz>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate Foo foo;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate Bar bar;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tTestBuilder() {\n\t\t\t}\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic BuilderWithRecursiveGenerics.Test.TestBuilder<Foo, Bar, Quz> foo(final Foo foo) {\n\t\t\t\tthis.foo = foo;\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic BuilderWithRecursiveGenerics.Test.TestBuilder<Foo, Bar, Quz> bar(final Bar bar) {\n\t\t\t\tthis.bar = bar;\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic BuilderWithRecursiveGenerics.Test<Foo, Bar, Quz> build() {\n\t\t\t\treturn new BuilderWithRecursiveGenerics.Test<Foo, Bar, Quz>(this.foo, this.bar);\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"BuilderWithRecursiveGenerics.Test.TestBuilder(foo=\" + this.foo + \", bar=\" + this.bar + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static <Foo, Bar extends Set<Foo>, Quz extends Inter<Bar, Quz>> BuilderWithRecursiveGenerics.Test.TestBuilder<Foo, Bar, Quz> builder() {\n\t\t\treturn new BuilderWithRecursiveGenerics.Test.TestBuilder<Foo, Bar, Quz>();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic Foo getFoo() {\n\t\t\treturn this.foo;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic Bar getBar() {\n\t\t\treturn this.bar;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic boolean equals(final java.lang.Object o) {\n\t\t\tif (o == this) return true;\n\t\t\tif (!(o instanceof BuilderWithRecursiveGenerics.Test)) return false;\n\t\t\tfinal BuilderWithRecursiveGenerics.Test<?, ?, ?> other = (BuilderWithRecursiveGenerics.Test<?, ?, ?>) o;\n\t\t\tfinal java.lang.Object this$foo = this.getFoo();\n\t\t\tfinal java.lang.Object other$foo = other.getFoo();\n\t\t\tif (this$foo == null ? other$foo != null : !this$foo.equals(other$foo)) return false;\n\t\t\tfinal java.lang.Object this$bar = this.getBar();\n\t\t\tfinal java.lang.Object other$bar = other.getBar();\n\t\t\tif (this$bar == null ? other$bar != null : !this$bar.equals(other$bar)) return false;\n\t\t\treturn true;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic int hashCode() {\n\t\t\tfinal int PRIME = 59;\n\t\t\tint result = 1;\n\t\t\tfinal java.lang.Object $foo = this.getFoo();\n\t\t\tresult = result * PRIME + ($foo == null ? 43 : $foo.hashCode());\n\t\t\tfinal java.lang.Object $bar = this.getBar();\n\t\t\tresult = result * PRIME + ($bar == null ? 43 : $bar.hashCode());\n\t\t\treturn result;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderWithRecursiveGenerics.Test(foo=\" + this.getFoo() + \", bar=\" + this.getBar() + \")\";\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderWithToBuilder.java",
    "content": "import java.util.List;\nclass BuilderWithToBuilder<T> {\n\tprivate String mOne;\n\tprivate String mTwo;\n\tprivate T foo;\n\tprivate List<T> bars;\n\tpublic static <K> K rrr(BuilderWithToBuilder<K> x) {\n\t\treturn x.foo;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderWithToBuilder(final String one, final String two, final T foo, final List<T> bars) {\n\t\tthis.mOne = one;\n\t\tthis.mTwo = two;\n\t\tthis.foo = foo;\n\t\tthis.bars = bars;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BuilderWithToBuilderBuilder<T> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate String one;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate String two;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate T foo;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<T> bars;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderWithToBuilderBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithToBuilder.BuilderWithToBuilderBuilder<T> one(final String one) {\n\t\t\tthis.one = one;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithToBuilder.BuilderWithToBuilderBuilder<T> two(final String two) {\n\t\t\tthis.two = two;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithToBuilder.BuilderWithToBuilderBuilder<T> foo(final T foo) {\n\t\t\tthis.foo = foo;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithToBuilder.BuilderWithToBuilderBuilder<T> bar(final T bar) {\n\t\t\tif (this.bars == null) this.bars = new java.util.ArrayList<T>();\n\t\t\tthis.bars.add(bar);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithToBuilder.BuilderWithToBuilderBuilder<T> bars(final java.util.Collection<? extends T> bars) {\n\t\t\tif (bars == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"bars cannot be null\");\n\t\t\t}\n\t\t\tif (this.bars == null) this.bars = new java.util.ArrayList<T>();\n\t\t\tthis.bars.addAll(bars);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithToBuilder.BuilderWithToBuilderBuilder<T> clearBars() {\n\t\t\tif (this.bars != null) this.bars.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithToBuilder<T> build() {\n\t\t\tjava.util.List<T> bars;\n\t\t\tswitch (this.bars == null ? 0 : this.bars.size()) {\n\t\t\tcase 0: \n\t\t\t\tbars = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tbars = java.util.Collections.singletonList(this.bars.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tbars = java.util.Collections.unmodifiableList(new java.util.ArrayList<T>(this.bars));\n\t\t\t}\n\t\t\treturn new BuilderWithToBuilder<T>(this.one, this.two, this.foo, bars);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderWithToBuilder.BuilderWithToBuilderBuilder(one=\" + this.one + \", two=\" + this.two + \", foo=\" + this.foo + \", bars=\" + this.bars + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static <T> BuilderWithToBuilder.BuilderWithToBuilderBuilder<T> builder() {\n\t\treturn new BuilderWithToBuilder.BuilderWithToBuilderBuilder<T>();\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic BuilderWithToBuilder.BuilderWithToBuilderBuilder<T> toBuilder() {\n\t\tfinal T foo = BuilderWithToBuilder.<T>rrr(this);\n\t\tfinal BuilderWithToBuilder.BuilderWithToBuilderBuilder<T> builder = new BuilderWithToBuilder.BuilderWithToBuilderBuilder<T>().one(this.mOne).two(this.mTwo).foo(foo);\n\t\tif (this.bars != null) builder.bars(this.bars);\n\t\treturn builder;\n\t}\n}\nclass ConstructorWithToBuilder<T> {\n\tprivate String mOne;\n\tprivate String mTwo;\n\tprivate T foo;\n\tprivate com.google.common.collect.ImmutableList<T> bars;\n\tpublic ConstructorWithToBuilder(String mOne, T baz, com.google.common.collect.ImmutableList<T> bars) {\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class ConstructorWithToBuilderBuilder<T> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate String mOne;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate T baz;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate com.google.common.collect.ImmutableList<T> bars;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tConstructorWithToBuilderBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic ConstructorWithToBuilder.ConstructorWithToBuilderBuilder<T> mOne(final String mOne) {\n\t\t\tthis.mOne = mOne;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic ConstructorWithToBuilder.ConstructorWithToBuilderBuilder<T> baz(final T baz) {\n\t\t\tthis.baz = baz;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic ConstructorWithToBuilder.ConstructorWithToBuilderBuilder<T> bars(final com.google.common.collect.ImmutableList<T> bars) {\n\t\t\tthis.bars = bars;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic ConstructorWithToBuilder<T> build() {\n\t\t\treturn new ConstructorWithToBuilder<T>(this.mOne, this.baz, this.bars);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"ConstructorWithToBuilder.ConstructorWithToBuilderBuilder(mOne=\" + this.mOne + \", baz=\" + this.baz + \", bars=\" + this.bars + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static <T> ConstructorWithToBuilder.ConstructorWithToBuilderBuilder<T> builder() {\n\t\treturn new ConstructorWithToBuilder.ConstructorWithToBuilderBuilder<T>();\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic ConstructorWithToBuilder.ConstructorWithToBuilderBuilder<T> toBuilder() {\n\t\treturn new ConstructorWithToBuilder.ConstructorWithToBuilderBuilder<T>().mOne(this.mOne).baz(this.foo).bars(this.bars);\n\t}\n}\nclass StaticMethodWithToBuilder<T> {\n\tprivate T foo;\n\tpublic StaticMethodWithToBuilder(T foo) {\n\t\tthis.foo = foo;\n\t}\n\tpublic static <T> StaticMethodWithToBuilder<T> of(T foo) {\n\t\treturn new StaticMethodWithToBuilder<T>(foo);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class StaticMethodWithToBuilderBuilder<T> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate T foo;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tStaticMethodWithToBuilderBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic StaticMethodWithToBuilder.StaticMethodWithToBuilderBuilder<T> foo(final T foo) {\n\t\t\tthis.foo = foo;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic StaticMethodWithToBuilder<T> build() {\n\t\t\treturn StaticMethodWithToBuilder.<T>of(this.foo);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"StaticMethodWithToBuilder.StaticMethodWithToBuilderBuilder(foo=\" + this.foo + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static <T> StaticMethodWithToBuilder.StaticMethodWithToBuilderBuilder<T> builder() {\n\t\treturn new StaticMethodWithToBuilder.StaticMethodWithToBuilderBuilder<T>();\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic StaticMethodWithToBuilder.StaticMethodWithToBuilderBuilder<T> toBuilder() {\n\t\treturn new StaticMethodWithToBuilder.StaticMethodWithToBuilderBuilder<T>().foo(this.foo);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/BuilderWithTolerate.java",
    "content": "import lombok.experimental.Tolerate;\npublic class BuilderWithTolerate {\n\tprivate final int value;\n\tpublic static void main(String[] args) {\n\t\tBuilderWithTolerate.builder().value(\"42\").build();\n\t}\n\tpublic static class BuilderWithTolerateBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int value;\n\t\t@Tolerate\n\t\tpublic BuilderWithTolerateBuilder value(String s) {\n\t\t\treturn this.value(Integer.parseInt(s));\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBuilderWithTolerateBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithTolerate.BuilderWithTolerateBuilder value(final int value) {\n\t\t\tthis.value = value;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic BuilderWithTolerate build() {\n\t\t\treturn new BuilderWithTolerate(this.value);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"BuilderWithTolerate.BuilderWithTolerateBuilder(value=\" + this.value + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBuilderWithTolerate(final int value) {\n\t\tthis.value = value;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static BuilderWithTolerate.BuilderWithTolerateBuilder builder() {\n\t\treturn new BuilderWithTolerate.BuilderWithTolerateBuilder();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/CheckerFrameworkBasic.java",
    "content": "// skip-idempotent\n//version 8:\nclass CheckerFrameworkBasic {\n\tprivate final int x;\n\tprivate final int y;\n\tprivate int z;\n\t@org.checkerframework.dataflow.qual.Pure\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getX() {\n\t\treturn this.x;\n\t}\n\t@org.checkerframework.dataflow.qual.Pure\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getY() {\n\t\treturn this.y;\n\t}\n\t@org.checkerframework.dataflow.qual.SideEffectFree\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getZ() {\n\t\treturn this.z;\n\t}\n\t/**\n\t * @return {@code this}.\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic @org.checkerframework.common.returnsreceiver.qual.This CheckerFrameworkBasic setZ(final int z) {\n\t\tthis.z = z;\n\t\treturn this;\n\t}\n\t@org.checkerframework.dataflow.qual.SideEffectFree\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof CheckerFrameworkBasic)) return false;\n\t\tfinal CheckerFrameworkBasic other = (CheckerFrameworkBasic) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (this.getX() != other.getX()) return false;\n\t\tif (this.getY() != other.getY()) return false;\n\t\tif (this.getZ() != other.getZ()) return false;\n\t\treturn true;\n\t}\n\t@org.checkerframework.dataflow.qual.Pure\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof CheckerFrameworkBasic;\n\t}\n\t@org.checkerframework.dataflow.qual.SideEffectFree\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.getX();\n\t\tresult = result * PRIME + this.getY();\n\t\tresult = result * PRIME + this.getZ();\n\t\treturn result;\n\t}\n\t@org.checkerframework.dataflow.qual.SideEffectFree\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"CheckerFrameworkBasic(x=\" + this.getX() + \", y=\" + this.getY() + \", z=\" + this.getZ() + \")\";\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic CheckerFrameworkBasic(final int x, final int y, final int z) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t}\n\t/**\n\t * @return {@code this}.\n\t */\n\t@org.checkerframework.dataflow.qual.SideEffectFree\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic CheckerFrameworkBasic withX(final int x) {\n\t\treturn this.x == x ? this : new CheckerFrameworkBasic(x, this.y, this.z);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/CheckerFrameworkBuilder.java",
    "content": "//version 8:\n//skip-idempotent\nimport java.util.List;\nclass CheckerFrameworkBuilder {\n\tint x;\n\tint y;\n\tint z;\n\tList<String> names;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static int $default$x() {\n\t\treturn 5;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tCheckerFrameworkBuilder(final int x, final int y, final int z, final List<String> names) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.names = names;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class CheckerFrameworkBuilderBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate boolean x$set;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int x$value;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int y;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int z;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<String> names;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tCheckerFrameworkBuilderBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic CheckerFrameworkBuilder.@org.checkerframework.common.returnsreceiver.qual.This CheckerFrameworkBuilderBuilder x(final int x) {\n\t\t\tthis.x$value = x;\n\t\t\tx$set = true;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic CheckerFrameworkBuilder.@org.checkerframework.common.returnsreceiver.qual.This CheckerFrameworkBuilderBuilder y(final int y) {\n\t\t\tthis.y = y;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic CheckerFrameworkBuilder.@org.checkerframework.common.returnsreceiver.qual.This CheckerFrameworkBuilderBuilder z(final int z) {\n\t\t\tthis.z = z;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic CheckerFrameworkBuilder.@org.checkerframework.common.returnsreceiver.qual.This CheckerFrameworkBuilderBuilder name(final String name) {\n\t\t\tif (this.names == null) this.names = new java.util.ArrayList<String>();\n\t\t\tthis.names.add(name);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic CheckerFrameworkBuilder.@org.checkerframework.common.returnsreceiver.qual.This CheckerFrameworkBuilderBuilder names(final java.util.Collection<? extends String> names) {\n\t\t\tif (names == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"names cannot be null\");\n\t\t\t}\n\t\t\tif (this.names == null) this.names = new java.util.ArrayList<String>();\n\t\t\tthis.names.addAll(names);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic CheckerFrameworkBuilder.@org.checkerframework.common.returnsreceiver.qual.This CheckerFrameworkBuilderBuilder clearNames() {\n\t\t\tif (this.names != null) this.names.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@org.checkerframework.dataflow.qual.SideEffectFree\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic CheckerFrameworkBuilder build(CheckerFrameworkBuilder.@org.checkerframework.checker.calledmethods.qual.CalledMethods({\"y\", \"z\"}) CheckerFrameworkBuilderBuilder this) {\n\t\t\tjava.util.List<String> names;\n\t\t\tswitch (this.names == null ? 0 : this.names.size()) {\n\t\t\tcase 0: \n\t\t\t\tnames = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tnames = java.util.Collections.singletonList(this.names.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tnames = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.names));\n\t\t\t}\n\t\t\tint x$value = this.x$value;\n\t\t\tif (!this.x$set) x$value = CheckerFrameworkBuilder.$default$x();\n\t\t\treturn new CheckerFrameworkBuilder(x$value, this.y, this.z, names);\n\t\t}\n\t\t@org.checkerframework.dataflow.qual.SideEffectFree\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"CheckerFrameworkBuilder.CheckerFrameworkBuilderBuilder(x$value=\" + this.x$value + \", y=\" + this.y + \", z=\" + this.z + \", names=\" + this.names + \")\";\n\t\t}\n\t}\n\t@org.checkerframework.dataflow.qual.SideEffectFree\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static CheckerFrameworkBuilder.@org.checkerframework.common.aliasing.qual.Unique CheckerFrameworkBuilderBuilder builder() {\n\t\treturn new CheckerFrameworkBuilder.CheckerFrameworkBuilderBuilder();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/CheckerFrameworkSuperBuilder.java",
    "content": "// skip-idempotent\n//version 8:\nimport java.util.List;\nclass CheckerFrameworkSuperBuilder {\n\tpublic static class Parent {\n\t\tint x;\n\t\tint y;\n\t\tint z;\n\t\tList<String> names;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static int $default$x() {\n\t\t\treturn 5;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ParentBuilder<C extends CheckerFrameworkSuperBuilder.Parent, B extends CheckerFrameworkSuperBuilder.Parent.ParentBuilder<C, B>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate boolean x$set;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate int x$value;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate int y;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate int z;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate java.util.ArrayList<String> names;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic @org.checkerframework.common.returnsreceiver.qual.This B x(final int x) {\n\t\t\t\tthis.x$value = x;\n\t\t\t\tx$set = true;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic @org.checkerframework.common.returnsreceiver.qual.This B y(final int y) {\n\t\t\t\tthis.y = y;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic @org.checkerframework.common.returnsreceiver.qual.This B z(final int z) {\n\t\t\t\tthis.z = z;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic @org.checkerframework.common.returnsreceiver.qual.This B name(final String name) {\n\t\t\t\tif (this.names == null) this.names = new java.util.ArrayList<String>();\n\t\t\t\tthis.names.add(name);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic @org.checkerframework.common.returnsreceiver.qual.This B names(final java.util.Collection<? extends String> names) {\n\t\t\t\tif (names == null) {\n\t\t\t\t\tthrow new java.lang.NullPointerException(\"names cannot be null\");\n\t\t\t\t}\n\t\t\t\tif (this.names == null) this.names = new java.util.ArrayList<String>();\n\t\t\t\tthis.names.addAll(names);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic @org.checkerframework.common.returnsreceiver.qual.This B clearNames() {\n\t\t\t\tif (this.names != null) this.names.clear();\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@org.checkerframework.dataflow.qual.Pure\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract @org.checkerframework.common.returnsreceiver.qual.This B self();\n\t\t\t@org.checkerframework.dataflow.qual.SideEffectFree\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build(CheckerFrameworkSuperBuilder.Parent.@org.checkerframework.checker.calledmethods.qual.CalledMethods({\"y\", \"z\"}) ParentBuilder<C, B> this);\n\t\t\t@org.checkerframework.dataflow.qual.SideEffectFree\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"CheckerFrameworkSuperBuilder.Parent.ParentBuilder(x$value=\" + this.x$value + \", y=\" + this.y + \", z=\" + this.z + \", names=\" + this.names + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ParentBuilderImpl extends CheckerFrameworkSuperBuilder.Parent.ParentBuilder<CheckerFrameworkSuperBuilder.Parent, CheckerFrameworkSuperBuilder.Parent.ParentBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ParentBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@org.checkerframework.dataflow.qual.Pure\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected CheckerFrameworkSuperBuilder.Parent.@org.checkerframework.common.returnsreceiver.qual.This ParentBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@org.checkerframework.dataflow.qual.SideEffectFree\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic CheckerFrameworkSuperBuilder.Parent build(CheckerFrameworkSuperBuilder.Parent.@org.checkerframework.checker.calledmethods.qual.CalledMethods({\"y\", \"z\"}) ParentBuilderImpl this) {\n\t\t\t\treturn new CheckerFrameworkSuperBuilder.Parent(this);\n\t\t\t}\n\t\t}\n\t\t@org.checkerframework.dataflow.qual.SideEffectFree\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Parent(final CheckerFrameworkSuperBuilder.Parent.ParentBuilder<?, ?> b) {\n\t\t\tif (b.x$set) this.x = b.x$value;\n\t\t\t else this.x = CheckerFrameworkSuperBuilder.Parent.$default$x();\n\t\t\tthis.y = b.y;\n\t\t\tthis.z = b.z;\n\t\t\tjava.util.List<String> names;\n\t\t\tswitch (b.names == null ? 0 : b.names.size()) {\n\t\t\tcase 0: \n\t\t\t\tnames = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tnames = java.util.Collections.singletonList(b.names.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tnames = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(b.names));\n\t\t\t}\n\t\t\tthis.names = names;\n\t\t}\n\t\t@org.checkerframework.dataflow.qual.SideEffectFree\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static CheckerFrameworkSuperBuilder.Parent.@org.checkerframework.common.aliasing.qual.Unique ParentBuilder<?, ?> builder() {\n\t\t\treturn new CheckerFrameworkSuperBuilder.Parent.ParentBuilderImpl();\n\t\t}\n\t}\n\tpublic static class ZChild extends Parent {\n\t\tint a;\n\t\tint b;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static int $default$a() {\n\t\t\treturn 1;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ZChildBuilder<C extends CheckerFrameworkSuperBuilder.ZChild, B extends CheckerFrameworkSuperBuilder.ZChild.ZChildBuilder<C, B>> extends Parent.ParentBuilder<C, B> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate boolean a$set;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate int a$value;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate int b;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic @org.checkerframework.common.returnsreceiver.qual.This B a(final int a) {\n\t\t\t\tthis.a$value = a;\n\t\t\t\ta$set = true;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic @org.checkerframework.common.returnsreceiver.qual.This B b(final int b) {\n\t\t\t\tthis.b = b;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@org.checkerframework.dataflow.qual.Pure\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract @org.checkerframework.common.returnsreceiver.qual.This B self();\n\t\t\t@org.checkerframework.dataflow.qual.SideEffectFree\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build(CheckerFrameworkSuperBuilder.ZChild.@org.checkerframework.checker.calledmethods.qual.CalledMethods(\"b\") ZChildBuilder<C, B> this);\n\t\t\t@org.checkerframework.dataflow.qual.SideEffectFree\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"CheckerFrameworkSuperBuilder.ZChild.ZChildBuilder(super=\" + super.toString() + \", a$value=\" + this.a$value + \", b=\" + this.b + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ZChildBuilderImpl extends CheckerFrameworkSuperBuilder.ZChild.ZChildBuilder<CheckerFrameworkSuperBuilder.ZChild, CheckerFrameworkSuperBuilder.ZChild.ZChildBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ZChildBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@org.checkerframework.dataflow.qual.Pure\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected CheckerFrameworkSuperBuilder.ZChild.@org.checkerframework.common.returnsreceiver.qual.This ZChildBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@org.checkerframework.dataflow.qual.SideEffectFree\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic CheckerFrameworkSuperBuilder.ZChild build(CheckerFrameworkSuperBuilder.ZChild.@org.checkerframework.checker.calledmethods.qual.CalledMethods(\"b\") ZChildBuilderImpl this) {\n\t\t\t\treturn new CheckerFrameworkSuperBuilder.ZChild(this);\n\t\t\t}\n\t\t}\n\t\t@org.checkerframework.dataflow.qual.SideEffectFree\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected ZChild(final CheckerFrameworkSuperBuilder.ZChild.ZChildBuilder<?, ?> b) {\n\t\t\tsuper(b);\n\t\t\tif (b.a$set) this.a = b.a$value;\n\t\t\t else this.a = CheckerFrameworkSuperBuilder.ZChild.$default$a();\n\t\t\tthis.b = b.b;\n\t\t}\n\t\t@org.checkerframework.dataflow.qual.SideEffectFree\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static CheckerFrameworkSuperBuilder.ZChild.@org.checkerframework.common.aliasing.qual.Unique ZChildBuilder<?, ?> builder() {\n\t\t\treturn new CheckerFrameworkSuperBuilder.ZChild.ZChildBuilderImpl();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ClassNamedAfterGetter.java",
    "content": "class GetFoo {\n\tprivate int foo;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getFoo() {\n\t\treturn this.foo;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/CleanupName.java",
    "content": "class CleanupName {\n\tvoid test() {\n\t\tObject o = \"Hello World!\";\n\t\ttry {\n\t\t\tSystem.out.println(o);\n\t\t} finally {\n\t\t\tif (java.util.Collections.singletonList(o).get(0) != null) {\n\t\t\t\to.toString();\n\t\t\t}\n\t\t}\n\t}\n\tvoid test2() {\n\t\tObject o = \"Hello World too!\";\n\t\ttry {\n\t\t\tSystem.out.println(o);\n\t\t} finally {\n\t\t\tif (java.util.Collections.singletonList(o).get(0) != null) {\n\t\t\t\to.toString();\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/CleanupPlain.java",
    "content": "import java.io.*;\nclass CleanupPlain {\n\tvoid test() throws Exception {\n\t\tInputStream in = new FileInputStream(\"in\");\n\t\ttry {\n\t\t\tOutputStream out = new FileOutputStream(\"out\");\n\t\t\ttry {\n\t\t\t\tif (in.markSupported()) {\n\t\t\t\t\tout.flush();\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (java.util.Collections.singletonList(out).get(0) != null) {\n\t\t\t\t\tout.close();\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tif (java.util.Collections.singletonList(in).get(0) != null) {\n\t\t\t\tin.close();\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/CommentsInterspersed.java",
    "content": "/* cmt *//* cmt2 */ /* cmt3 */ /*bla */\npublic class CommentsInterspersed {\n\t/**\n\t * javadoc for field\n\t */\n\tprivate int x;\n\t/* bla2 */ private String test = \"foo\"; //$NON-NLS-1$\n\t/**\n\t * Javadoc on method\n\t */\n\tpublic native void gwtTest(); /*-{\n\t\tjavascript;\n\t}-*/\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getTest() {\n\t\treturn this.test;\n\t}\n} //haha!\n//hahaha!\n//hahahaha!\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ConflictingStaticConstructorNames.java",
    "content": "class ConflictingStaticConstructorNames {\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof ConflictingStaticConstructorNames)) return false;\n\t\tfinal ConflictingStaticConstructorNames other = (ConflictingStaticConstructorNames) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof ConflictingStaticConstructorNames;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int result = 1;\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"ConflictingStaticConstructorNames()\";\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic ConflictingStaticConstructorNames() {\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ConstructorInner.java",
    "content": "class ConstructorInner {\n\tstatic class Inner {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate Inner() {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static ConstructorInner.Inner of() {\n\t\t\treturn new ConstructorInner.Inner();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ConstructorJavadoc.java",
    "content": "public class ConstructorJavadoc {\n\t/**\n\t * Some text\n\t *\n\t * @param fieldName Hello, World1\n\t * --- GETTER ---\n\t * Getter section\n\t *\n\t * @return Sky is blue1\n\t */\n\tprivate int fieldName;\n\t/**\n\t * Sky is blue\n\t */\n\tprivate int fieldName2;\n\t/**\n\t * Creates a new {@code ConstructorJavadoc} instance.\n\t *\n\t * @param fieldName Hello, World1\n\t * @param fieldName2 Sky is blue\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic ConstructorJavadoc(final int fieldName, final int fieldName2) {\n\t\tthis.fieldName = fieldName;\n\t\tthis.fieldName2 = fieldName2;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/Constructors.java",
    "content": "class RequiredArgsConstructor1 {\n\tfinal int x;\n\tString name;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic RequiredArgsConstructor1(final int x) {\n\t\tthis.x = x;\n\t}\n}\nclass RequiredArgsConstructorAccess {\n\tfinal int x;\n\tString name;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected RequiredArgsConstructorAccess(final int x) {\n\t\tthis.x = x;\n\t}\n}\nclass RequiredArgsConstructorStaticName {\n\tfinal int x;\n\tString name;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate RequiredArgsConstructorStaticName(final int x) {\n\t\tthis.x = x;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static RequiredArgsConstructorStaticName staticname(final int x) {\n\t\treturn new RequiredArgsConstructorStaticName(x);\n\t}\n}\nclass RequiredArgsConstructorWithAnnotations {\n\tfinal int x;\n\tString name;\n\t@Deprecated\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic RequiredArgsConstructorWithAnnotations(final int x) {\n\t\tthis.x = x;\n\t}\n}\nclass AllArgsConstructor1 {\n\tfinal int x;\n\tString name;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic AllArgsConstructor1(final int x, final String name) {\n\t\tthis.x = x;\n\t\tthis.name = name;\n\t}\n}\nclass NoArgsConstructor1 {\n\tint x;\n\tString name;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic NoArgsConstructor1() {\n\t}\n}\nclass RequiredArgsConstructorStaticNameGenerics<T extends Number> {\n\tfinal T x;\n\tString name;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate RequiredArgsConstructorStaticNameGenerics(final T x) {\n\t\tthis.x = x;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static <T extends Number> RequiredArgsConstructorStaticNameGenerics<T> of(final T x) {\n\t\treturn new RequiredArgsConstructorStaticNameGenerics<T>(x);\n\t}\n}\nclass RequiredArgsConstructorStaticNameGenerics2<T extends Number> {\n\tfinal Class<T> x;\n\tString name;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate RequiredArgsConstructorStaticNameGenerics2(final Class<T> x) {\n\t\tthis.x = x;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static <T extends Number> RequiredArgsConstructorStaticNameGenerics2<T> of(final Class<T> x) {\n\t\treturn new RequiredArgsConstructorStaticNameGenerics2<T>(x);\n\t}\n}\nclass AllArgsConstructorPackageAccess {\n\tfinal String x;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tAllArgsConstructorPackageAccess(final String x) {\n\t\tthis.x = x;\n\t}\n}\nclass NoArgsConstructor2 {\n\tfinal int x;\n\tfinal double y;\n\tfinal char c;\n\tfinal boolean b;\n\tfinal float f;\n\tfinal String s;\n\tbyte z;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic NoArgsConstructor2() {\n\t\tthis.x = 0;\n\t\tthis.y = 0.0;\n\t\tthis.c = '\\000';\n\t\tthis.b = false;\n\t\tthis.f = 0.0F;\n\t\tthis.s = null;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ConstructorsConfiguration.java",
    "content": "class ConstructorsConfiguration {\n\tint x;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic ConstructorsConfiguration(final int x) {\n\t\tthis.x = x;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ConstructorsInAnonymousClass.java",
    "content": "//version 8:\nimport lombok.NonNull;\npublic class ConstructorsInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\tclass Inner {\n\t\t\tprivate String string;\n\t\t\t@NonNull\n\t\t\tprivate String string2;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic Inner(final String string, @NonNull final String string2) {\n\t\t\t\tif (string2 == null) {\n\t\t\t\t\tthrow new java.lang.NullPointerException(\"string2 is marked non-null but is null\");\n\t\t\t\t}\n\t\t\t\tthis.string = string;\n\t\t\t\tthis.string2 = string2;\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic Inner(@NonNull final String string2) {\n\t\t\t\tif (string2 == null) {\n\t\t\t\t\tthrow new java.lang.NullPointerException(\"string2 is marked non-null but is null\");\n\t\t\t\t}\n\t\t\t\tthis.string2 = string2;\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic Inner() {\n\t\t\t}\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ConstructorsOnRecord.java",
    "content": "// version 14:\npublic record ConstructorsOnRecord(String a, String b) {\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ConstructorsTypeAnnos.java",
    "content": "import java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.List;\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})\n@interface TA {\n}\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})\n@interface TB {\n}\nclass ConstructorsTypeAnnos {\n\t@TA\n\t@TB\n\tList<String> foo;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic ConstructorsTypeAnnos(@TA final List<String> foo) {\n\t\tthis.foo = foo;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ConstructorsWithAccessors.java",
    "content": "//version 8:\nclass ConstructorsWithAccessors {\n\tint plower;\n\tint pUpper;\n\tint _huh;\n\tint __huh2;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic ConstructorsWithAccessors(final int plower, final int upper, final int huh, final int _huh2) {\n\t\tthis.plower = plower;\n\t\tthis.pUpper = upper;\n\t\tthis._huh = huh;\n\t\tthis.__huh2 = _huh2;\n\t}\n}\nclass ConstructorsWithAccessorsNonNull {\n\t@lombok.NonNull\n\tInteger plower;\n\t@lombok.NonNull\n\tInteger pUpper;\n\t@lombok.NonNull\n\tInteger _huh;\n\t@lombok.NonNull\n\tfinal Integer __huh2;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic ConstructorsWithAccessorsNonNull(@lombok.NonNull final Integer plower, @lombok.NonNull final Integer upper, @lombok.NonNull final Integer huh, @lombok.NonNull final Integer _huh2) {\n\t\tif (plower == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"plower is marked non-null but is null\");\n\t\t}\n\t\tif (upper == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"upper is marked non-null but is null\");\n\t\t}\n\t\tif (huh == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"huh is marked non-null but is null\");\n\t\t}\n\t\tif (_huh2 == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"_huh2 is marked non-null but is null\");\n\t\t}\n\t\tthis.plower = plower;\n\t\tthis.pUpper = upper;\n\t\tthis._huh = huh;\n\t\tthis.__huh2 = _huh2;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ConstructorsWithBuilderDefaults.java",
    "content": "final class ConstructorsWithBuilderDefaults {\n\tprivate final int x;\n\tprivate final int y;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static int $default$x() {\n\t\treturn 5;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class ConstructorsWithBuilderDefaultsBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate boolean x$set;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int x$value;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int y;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tConstructorsWithBuilderDefaultsBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder x(final int x) {\n\t\t\tthis.x$value = x;\n\t\t\tx$set = true;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder y(final int y) {\n\t\t\tthis.y = y;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic ConstructorsWithBuilderDefaults build() {\n\t\t\tint x$value = this.x$value;\n\t\t\tif (!this.x$set) x$value = ConstructorsWithBuilderDefaults.$default$x();\n\t\t\treturn new ConstructorsWithBuilderDefaults(x$value, this.y);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder(x$value=\" + this.x$value + \", y=\" + this.y + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder builder() {\n\t\treturn new ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder();\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getX() {\n\t\treturn this.x;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getY() {\n\t\treturn this.y;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof ConstructorsWithBuilderDefaults)) return false;\n\t\tfinal ConstructorsWithBuilderDefaults other = (ConstructorsWithBuilderDefaults) o;\n\t\tif (this.getX() != other.getX()) return false;\n\t\tif (this.getY() != other.getY()) return false;\n\t\treturn true;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.getX();\n\t\tresult = result * PRIME + this.getY();\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"ConstructorsWithBuilderDefaults(x=\" + this.getX() + \", y=\" + this.getY() + \")\";\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic ConstructorsWithBuilderDefaults() {\n\t\tthis.y = 0;\n\t\tthis.x = ConstructorsWithBuilderDefaults.$default$x();\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic ConstructorsWithBuilderDefaults(final int x, final int y) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ConstructorsWithBuilderDefaults2.java",
    "content": "//CONF: lombok.noArgsConstructor.extraPrivate = true\nimport lombok.NoArgsConstructor;\nfinal class ConstructorsWithBuilderDefaults<T> {\n\tprivate final java.util.List<T> z;\n\tprivate final T x;\n\tprivate final T q;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static <T> java.util.List<T> $default$z() {\n\t\treturn new java.util.ArrayList<T>();\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static <T> T $default$x() {\n\t\treturn null;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tConstructorsWithBuilderDefaults(final java.util.List<T> z, final T x, final T q) {\n\t\tthis.z = z;\n\t\tthis.x = x;\n\t\tthis.q = q;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class ConstructorsWithBuilderDefaultsBuilder<T> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate boolean z$set;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.List<T> z$value;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate boolean x$set;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate T x$value;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate T q;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tConstructorsWithBuilderDefaultsBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder<T> z(final java.util.List<T> z) {\n\t\t\tthis.z$value = z;\n\t\t\tz$set = true;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder<T> x(final T x) {\n\t\t\tthis.x$value = x;\n\t\t\tx$set = true;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder<T> q(final T q) {\n\t\t\tthis.q = q;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic ConstructorsWithBuilderDefaults<T> build() {\n\t\t\tjava.util.List<T> z$value = this.z$value;\n\t\t\tif (!this.z$set) z$value = ConstructorsWithBuilderDefaults.<T>$default$z();\n\t\t\tT x$value = this.x$value;\n\t\t\tif (!this.x$set) x$value = ConstructorsWithBuilderDefaults.<T>$default$x();\n\t\t\treturn new ConstructorsWithBuilderDefaults<T>(z$value, x$value, this.q);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder(z$value=\" + this.z$value + \", x$value=\" + this.x$value + \", q=\" + this.q + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static <T> ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder<T> builder() {\n\t\treturn new ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder<T>();\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate ConstructorsWithBuilderDefaults() {\n\t\tthis.q = null;\n\t\tthis.z = ConstructorsWithBuilderDefaults.$default$z();\n\t\tthis.x = ConstructorsWithBuilderDefaults.$default$x();\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.util.List<T> getZ() {\n\t\treturn this.z;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic T getX() {\n\t\treturn this.x;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic T getQ() {\n\t\treturn this.q;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof ConstructorsWithBuilderDefaults)) return false;\n\t\tfinal ConstructorsWithBuilderDefaults<?> other = (ConstructorsWithBuilderDefaults<?>) o;\n\t\tfinal java.lang.Object this$z = this.getZ();\n\t\tfinal java.lang.Object other$z = other.getZ();\n\t\tif (this$z == null ? other$z != null : !this$z.equals(other$z)) return false;\n\t\tfinal java.lang.Object this$x = this.getX();\n\t\tfinal java.lang.Object other$x = other.getX();\n\t\tif (this$x == null ? other$x != null : !this$x.equals(other$x)) return false;\n\t\tfinal java.lang.Object this$q = this.getQ();\n\t\tfinal java.lang.Object other$q = other.getQ();\n\t\tif (this$q == null ? other$q != null : !this$q.equals(other$q)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tfinal java.lang.Object $z = this.getZ();\n\t\tresult = result * PRIME + ($z == null ? 43 : $z.hashCode());\n\t\tfinal java.lang.Object $x = this.getX();\n\t\tresult = result * PRIME + ($x == null ? 43 : $x.hashCode());\n\t\tfinal java.lang.Object $q = this.getQ();\n\t\tresult = result * PRIME + ($q == null ? 43 : $q.hashCode());\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"ConstructorsWithBuilderDefaults(z=\" + this.getZ() + \", x=\" + this.getX() + \", q=\" + this.getQ() + \")\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ConstructorsWithSuperBuilderDefaults.java",
    "content": "class ConstructorsWithSuperBuilderDefaults {\n\tint x;\n\tint y;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static int $default$x() {\n\t\treturn 5;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static abstract class ConstructorsWithSuperBuilderDefaultsBuilder<C extends ConstructorsWithSuperBuilderDefaults, B extends ConstructorsWithSuperBuilderDefaults.ConstructorsWithSuperBuilderDefaultsBuilder<C, B>> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate boolean x$set;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int x$value;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int y;\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic B x(final int x) {\n\t\t\tthis.x$value = x;\n\t\t\tx$set = true;\n\t\t\treturn self();\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic B y(final int y) {\n\t\t\tthis.y = y;\n\t\t\treturn self();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected abstract B self();\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic abstract C build();\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"ConstructorsWithSuperBuilderDefaults.ConstructorsWithSuperBuilderDefaultsBuilder(x$value=\" + this.x$value + \", y=\" + this.y + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final class ConstructorsWithSuperBuilderDefaultsBuilderImpl extends ConstructorsWithSuperBuilderDefaults.ConstructorsWithSuperBuilderDefaultsBuilder<ConstructorsWithSuperBuilderDefaults, ConstructorsWithSuperBuilderDefaults.ConstructorsWithSuperBuilderDefaultsBuilderImpl> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate ConstructorsWithSuperBuilderDefaultsBuilderImpl() {\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected ConstructorsWithSuperBuilderDefaults.ConstructorsWithSuperBuilderDefaultsBuilderImpl self() {\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic ConstructorsWithSuperBuilderDefaults build() {\n\t\t\treturn new ConstructorsWithSuperBuilderDefaults(this);\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected ConstructorsWithSuperBuilderDefaults(final ConstructorsWithSuperBuilderDefaults.ConstructorsWithSuperBuilderDefaultsBuilder<?, ?> b) {\n\t\tif (b.x$set) this.x = b.x$value;\n\t\t else this.x = ConstructorsWithSuperBuilderDefaults.$default$x();\n\t\tthis.y = b.y;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static ConstructorsWithSuperBuilderDefaults.ConstructorsWithSuperBuilderDefaultsBuilder<?, ?> builder() {\n\t\treturn new ConstructorsWithSuperBuilderDefaults.ConstructorsWithSuperBuilderDefaultsBuilderImpl();\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic ConstructorsWithSuperBuilderDefaults() {\n\t\tthis.x = ConstructorsWithSuperBuilderDefaults.$default$x();\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic ConstructorsWithSuperBuilderDefaults(final int x, final int y) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/DataConfiguration.java",
    "content": "class DataConfiguration {\n\tfinal int x;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic DataConfiguration(final int x) {\n\t\tthis.x = x;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate DataConfiguration() {\n\t\tthis.x = 0;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getX() {\n\t\treturn this.x;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof DataConfiguration)) return false;\n\t\tfinal DataConfiguration other = (DataConfiguration) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (this.x != other.x) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof DataConfiguration;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.x;\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"DataConfiguration(x=\" + this.x + \")\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/DataExtended.java",
    "content": "class DataExtended {\n\tint x;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic DataExtended() {\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getX() {\n\t\treturn this.x;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setX(final int x) {\n\t\tthis.x = x;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof DataExtended)) return false;\n\t\tfinal DataExtended other = (DataExtended) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (this.getX() != other.getX()) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof DataExtended;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.getX();\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"DataExtended(x=\" + this.x + \")\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/DataIgnore.java",
    "content": "class DataIgnore {\n\tfinal int x;\n\tString $name;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic DataIgnore(final int x) {\n\t\tthis.x = x;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getX() {\n\t\treturn this.x;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof DataIgnore)) return false;\n\t\tfinal DataIgnore other = (DataIgnore) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (this.getX() != other.getX()) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof DataIgnore;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.getX();\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"DataIgnore(x=\" + this.getX() + \")\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/DataInAnonymousClass.java",
    "content": "public class DataInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\tclass Inner {\n\t\t\tprivate String string;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic Inner() {\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic String getString() {\n\t\t\t\treturn this.string;\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic void setString(final String string) {\n\t\t\t\tthis.string = string;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic boolean equals(final java.lang.Object o) {\n\t\t\t\tif (o == this) return true;\n\t\t\t\tif (!(o instanceof Inner)) return false;\n\t\t\t\tfinal Inner other = (Inner) o;\n\t\t\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\t\t\tfinal java.lang.Object this$string = this.getString();\n\t\t\t\tfinal java.lang.Object other$string = other.getString();\n\t\t\t\tif (this$string == null ? other$string != null : !this$string.equals(other$string)) return false;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected boolean canEqual(final java.lang.Object other) {\n\t\t\t\treturn other instanceof Inner;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic int hashCode() {\n\t\t\t\tfinal int PRIME = 59;\n\t\t\t\tint result = 1;\n\t\t\t\tfinal java.lang.Object $string = this.getString();\n\t\t\t\tresult = result * PRIME + ($string == null ? 43 : $string.hashCode());\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"Inner(string=\" + this.getString() + \")\";\n\t\t\t}\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/DataOnEnum.java",
    "content": "public enum DataOnEnum {\n\tA(\"hello\");\n\tprivate final String someField;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getSomeField() {\n\t\treturn this.someField;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"DataOnEnum.\" + this.name() + \"(someField=\" + this.getSomeField() + \")\";\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate DataOnEnum(final String someField) {\n\t\tthis.someField = someField;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/DataOnLocalClass.java",
    "content": "//version 8:\nclass DataOnLocalClass1 {\n\tpublic static void main(String[] args) {\n\t\tclass Local {\n\t\t\tfinal int x;\n\t\t\tString name;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic Local(final int x) {\n\t\t\t\tthis.x = x;\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic int getX() {\n\t\t\t\treturn this.x;\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic String getName() {\n\t\t\t\treturn this.name;\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic void setName(final String name) {\n\t\t\t\tthis.name = name;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic boolean equals(final java.lang.Object o) {\n\t\t\t\tif (o == this) return true;\n\t\t\t\tif (!(o instanceof Local)) return false;\n\t\t\t\tfinal Local other = (Local) o;\n\t\t\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\t\t\tif (this.getX() != other.getX()) return false;\n\t\t\t\tfinal java.lang.Object this$name = this.getName();\n\t\t\t\tfinal java.lang.Object other$name = other.getName();\n\t\t\t\tif (this$name == null ? other$name != null : !this$name.equals(other$name)) return false;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected boolean canEqual(final java.lang.Object other) {\n\t\t\t\treturn other instanceof Local;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic int hashCode() {\n\t\t\t\tfinal int PRIME = 59;\n\t\t\t\tint result = 1;\n\t\t\t\tresult = result * PRIME + this.getX();\n\t\t\t\tfinal java.lang.Object $name = this.getName();\n\t\t\t\tresult = result * PRIME + ($name == null ? 43 : $name.hashCode());\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"Local(x=\" + this.getX() + \", name=\" + this.getName() + \")\";\n\t\t\t}\n\t\t}\n\t}\n}\nclass DataOnLocalClass2 {\n\t{\n\t\tclass Local {\n\t\t\tfinal int x;\n\t\t\tclass InnerLocal {\n\t\t\t\t@lombok.NonNull\n\t\t\t\tString name;\n\t\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t\t@lombok.Generated\n\t\t\t\tpublic InnerLocal(@lombok.NonNull final String name) {\n\t\t\t\t\tif (name == null) {\n\t\t\t\t\t\tthrow new java.lang.NullPointerException(\"name is marked non-null but is null\");\n\t\t\t\t\t}\n\t\t\t\t\tthis.name = name;\n\t\t\t\t}\n\t\t\t\t@lombok.NonNull\n\t\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t\t@lombok.Generated\n\t\t\t\tpublic String getName() {\n\t\t\t\t\treturn this.name;\n\t\t\t\t}\n\t\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t\t@lombok.Generated\n\t\t\t\tpublic void setName(@lombok.NonNull final String name) {\n\t\t\t\t\tif (name == null) {\n\t\t\t\t\t\tthrow new java.lang.NullPointerException(\"name is marked non-null but is null\");\n\t\t\t\t\t}\n\t\t\t\t\tthis.name = name;\n\t\t\t\t}\n\t\t\t\t@java.lang.Override\n\t\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t\t@lombok.Generated\n\t\t\t\tpublic boolean equals(final java.lang.Object o) {\n\t\t\t\t\tif (o == this) return true;\n\t\t\t\t\tif (!(o instanceof Local.InnerLocal)) return false;\n\t\t\t\t\tfinal Local.InnerLocal other = (Local.InnerLocal) o;\n\t\t\t\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\t\t\t\tfinal java.lang.Object this$name = this.getName();\n\t\t\t\t\tfinal java.lang.Object other$name = other.getName();\n\t\t\t\t\tif (this$name == null ? other$name != null : !this$name.equals(other$name)) return false;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t\t@lombok.Generated\n\t\t\t\tprotected boolean canEqual(final java.lang.Object other) {\n\t\t\t\t\treturn other instanceof Local.InnerLocal;\n\t\t\t\t}\n\t\t\t\t@java.lang.Override\n\t\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t\t@lombok.Generated\n\t\t\t\tpublic int hashCode() {\n\t\t\t\t\tfinal int PRIME = 59;\n\t\t\t\t\tint result = 1;\n\t\t\t\t\tfinal java.lang.Object $name = this.getName();\n\t\t\t\t\tresult = result * PRIME + ($name == null ? 43 : $name.hashCode());\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\t@java.lang.Override\n\t\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t\t@lombok.Generated\n\t\t\t\tpublic java.lang.String toString() {\n\t\t\t\t\treturn \"Local.InnerLocal(name=\" + this.getName() + \")\";\n\t\t\t\t}\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic Local(final int x) {\n\t\t\t\tthis.x = x;\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic int getX() {\n\t\t\t\treturn this.x;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic boolean equals(final java.lang.Object o) {\n\t\t\t\tif (o == this) return true;\n\t\t\t\tif (!(o instanceof Local)) return false;\n\t\t\t\tfinal Local other = (Local) o;\n\t\t\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\t\t\tif (this.getX() != other.getX()) return false;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected boolean canEqual(final java.lang.Object other) {\n\t\t\t\treturn other instanceof Local;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic int hashCode() {\n\t\t\t\tfinal int PRIME = 59;\n\t\t\t\tint result = 1;\n\t\t\t\tresult = result * PRIME + this.getX();\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"Local(x=\" + this.getX() + \")\";\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/DataOnRecord.java",
    "content": "// version 14:\npublic record DataOnRecord(String a, String b) {\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/DataPlain.java",
    "content": "class Data1 {\n\tfinal int x;\n\tString name;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic Data1(final int x) {\n\t\tthis.x = x;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getX() {\n\t\treturn this.x;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getName() {\n\t\treturn this.name;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setName(final String name) {\n\t\tthis.name = name;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof Data1)) return false;\n\t\tfinal Data1 other = (Data1) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (this.getX() != other.getX()) return false;\n\t\tfinal java.lang.Object this$name = this.getName();\n\t\tfinal java.lang.Object other$name = other.getName();\n\t\tif (this$name == null ? other$name != null : !this$name.equals(other$name)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof Data1;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.getX();\n\t\tfinal java.lang.Object $name = this.getName();\n\t\tresult = result * PRIME + ($name == null ? 43 : $name.hashCode());\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"Data1(x=\" + this.getX() + \", name=\" + this.getName() + \")\";\n\t}\n}\nclass Data2 {\n\tfinal int x;\n\tString name;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic Data2(final int x) {\n\t\tthis.x = x;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getX() {\n\t\treturn this.x;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getName() {\n\t\treturn this.name;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setName(final String name) {\n\t\tthis.name = name;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof Data2)) return false;\n\t\tfinal Data2 other = (Data2) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (this.getX() != other.getX()) return false;\n\t\tfinal java.lang.Object this$name = this.getName();\n\t\tfinal java.lang.Object other$name = other.getName();\n\t\tif (this$name == null ? other$name != null : !this$name.equals(other$name)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof Data2;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.getX();\n\t\tfinal java.lang.Object $name = this.getName();\n\t\tresult = result * PRIME + ($name == null ? 43 : $name.hashCode());\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"Data2(x=\" + this.getX() + \", name=\" + this.getName() + \")\";\n\t}\n}\nfinal class Data3 {\n\tfinal int x;\n\tString name;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic Data3(final int x) {\n\t\tthis.x = x;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getX() {\n\t\treturn this.x;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getName() {\n\t\treturn this.name;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setName(final String name) {\n\t\tthis.name = name;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof Data3)) return false;\n\t\tfinal Data3 other = (Data3) o;\n\t\tif (this.getX() != other.getX()) return false;\n\t\tfinal java.lang.Object this$name = this.getName();\n\t\tfinal java.lang.Object other$name = other.getName();\n\t\tif (this$name == null ? other$name != null : !this$name.equals(other$name)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.getX();\n\t\tfinal java.lang.Object $name = this.getName();\n\t\tresult = result * PRIME + ($name == null ? 43 : $name.hashCode());\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"Data3(x=\" + this.getX() + \", name=\" + this.getName() + \")\";\n\t}\n}\nfinal class Data4 extends java.util.Timer {\n\tint x;\n\tData4() {\n\t\tsuper();\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getX() {\n\t\treturn this.x;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setX(final int x) {\n\t\tthis.x = x;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"Data4(x=\" + this.getX() + \")\";\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof Data4)) return false;\n\t\tfinal Data4 other = (Data4) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (!super.equals(o)) return false;\n\t\tif (this.getX() != other.getX()) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof Data4;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = super.hashCode();\n\t\tresult = result * PRIME + this.getX();\n\t\treturn result;\n\t}\n}\nclass Data5 {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic Data5() {\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof Data5)) return false;\n\t\tfinal Data5 other = (Data5) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof Data5;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int result = 1;\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"Data5()\";\n\t}\n}\nfinal class Data6 {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic Data6() {\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof Data6)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int result = 1;\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"Data6()\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/DataWithGetter.java",
    "content": "class DataWithGetter {\n\tprivate int x;\n\tprivate int y;\n\tprivate final String z;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic DataWithGetter(final String z) {\n\t\tthis.z = z;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setX(final int x) {\n\t\tthis.x = x;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setY(final int y) {\n\t\tthis.y = y;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof DataWithGetter)) return false;\n\t\tfinal DataWithGetter other = (DataWithGetter) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (this.getX() != other.getX()) return false;\n\t\tif (this.getY() != other.getY()) return false;\n\t\tfinal java.lang.Object this$z = this.getZ();\n\t\tfinal java.lang.Object other$z = other.getZ();\n\t\tif (this$z == null ? other$z != null : !this$z.equals(other$z)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof DataWithGetter;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.getX();\n\t\tresult = result * PRIME + this.getY();\n\t\tfinal java.lang.Object $z = this.getZ();\n\t\tresult = result * PRIME + ($z == null ? 43 : $z.hashCode());\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"DataWithGetter(x=\" + this.getX() + \", y=\" + this.getY() + \", z=\" + this.getZ() + \")\";\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getX() {\n\t\treturn this.x;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getY() {\n\t\treturn this.y;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getZ() {\n\t\treturn this.z;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/DataWithGetterNone.java",
    "content": "class DataWithGetterNone {\n\tprivate int x;\n\tprivate int y;\n\tprivate final String z;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic DataWithGetterNone(final String z) {\n\t\tthis.z = z;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setX(final int x) {\n\t\tthis.x = x;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setY(final int y) {\n\t\tthis.y = y;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof DataWithGetterNone)) return false;\n\t\tfinal DataWithGetterNone other = (DataWithGetterNone) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (this.x != other.x) return false;\n\t\tif (this.y != other.y) return false;\n\t\tfinal java.lang.Object this$z = this.z;\n\t\tfinal java.lang.Object other$z = other.z;\n\t\tif (this$z == null ? other$z != null : !this$z.equals(other$z)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof DataWithGetterNone;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.x;\n\t\tresult = result * PRIME + this.y;\n\t\tfinal java.lang.Object $z = this.z;\n\t\tresult = result * PRIME + ($z == null ? 43 : $z.hashCode());\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"DataWithGetterNone(x=\" + this.x + \", y=\" + this.y + \", z=\" + this.z + \")\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/DataWithOverrideEqualsAndHashCode.java",
    "content": "class DataWithOverrideEqualsAndHashCode {\n\tclass Data1 {\n\t}\n\tclass Data2 extends Data1 {\n\t\tpublic int hashCode() {\n\t\t\treturn 42;\n\t\t}\n\t\tpublic boolean equals(Object other) {\n\t\t\treturn false;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic Data2() {\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"DataWithOverrideEqualsAndHashCode.Data2()\";\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/DelegateAlreadyImplemented.java",
    "content": "public class DelegateAlreadyImplemented<T> {\n\tprivate A<Integer, T> a;\n\n\tpublic void a() {\n\t}\n\n\tpublic void b(java.util.List<String> l) {\n\t}\n\n\tpublic void c(java.util.List<Integer> l, String[] a, Integer... varargs) {\n\t}\n\n\tpublic void d(String[][][][] d) {\n\t}\n\n\tpublic <Y> void e(Y x) {\n\t}\n\n\t@SuppressWarnings(\"unchecked\")\n\tpublic void f(T s, java.util.List<T> l, T[] a, T... varargs) {\n\t}\n\n\tpublic void g(Number g) {\n\t}\n}\n\ninterface A<T, T2> {\n\tvoid a();\n\n\tvoid b(java.util.List<T> l);\n\n\t@SuppressWarnings(\"unchecked\")\n\tvoid c(java.util.List<T> l, String[] a, T... varargs);\n\n\tvoid d(String[][][][] d);\n\n\t<X> X e(X x);\n\n\t@SuppressWarnings(\"unchecked\")\n\tvoid f(T2 s, java.util.List<T2> l, T2[] a, T2... varargs);\n\n\t<G extends Number> void g(G g);\n}"
  },
  {
    "path": "test/transform/resource/after-delombok/DelegateGenerics.java",
    "content": "public class DelegateGenerics<T> {\n\tI1<T> target;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.Integer t(final java.lang.Integer t) {\n\t\treturn this.target.t(t);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String i(final java.lang.String a) {\n\t\treturn this.target.i(a);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic T a(final T a) {\n\t\treturn this.target.a(a);\n\t}\n}\ninterface I1<T> extends I2<T, Integer, String> {\n}\ninterface I2<A, T, I> extends I3<Integer, I, A> {\n}\ninterface I3<T, I, A> {\n\tT t(T t);\n\tI i(I a);\n\tA a(A a);\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/DelegateOnGetter.java",
    "content": "class DelegateOnGetter {\n\tprivate final java.util.concurrent.atomic.AtomicReference<java.lang.Object> bar = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n\tprivate interface Bar {\n\t\tvoid setList(java.util.ArrayList<java.lang.String> list);\n\t\tint getInt();\n\t}\n\t@java.lang.SuppressWarnings({\"all\", \"unchecked\"})\n\t@lombok.Generated\n\tpublic Bar getBar() {\n\t\tjava.lang.Object $value = this.bar.get();\n\t\tif ($value == null) {\n\t\t\tsynchronized (this.bar) {\n\t\t\t\t$value = this.bar.get();\n\t\t\t\tif ($value == null) {\n\t\t\t\t\tfinal Bar actualValue = new Bar() {\n\t\t\t\t\t\tpublic void setList(java.util.ArrayList<String> list) {\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpublic int getInt() {\n\t\t\t\t\t\t\treturn 42;\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t$value = actualValue == null ? this.bar : actualValue;\n\t\t\t\t\tthis.bar.set($value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn (Bar) ($value == this.bar ? null : $value);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setList(final java.util.ArrayList<java.lang.String> list) {\n\t\tthis.getBar().setList(list);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getInt() {\n\t\treturn this.getBar().getInt();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/DelegateOnGetterNone.java",
    "content": "class DelegateOnGetterNone {\n\tprivate final Bar bar = null;\n\tprivate interface Bar {\n\t\tvoid setList(java.util.ArrayList<java.lang.String> list);\n\t\tint getInt();\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setList(final java.util.ArrayList<java.lang.String> list) {\n\t\tthis.bar.setList(list);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getInt() {\n\t\treturn this.bar.getInt();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/DelegateOnMethods.java",
    "content": "abstract class DelegateOnMethods {\n\tpublic abstract Bar getBar();\n\tpublic static interface Bar {\n\t\tvoid bar(java.util.ArrayList<java.lang.String> list);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void bar(final java.util.ArrayList<java.lang.String> list) {\n\t\tthis.getBar().bar(list);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/DelegateOnRecord.java",
    "content": "// version 14:\nrecord DelegateOnRecord(Runnable runnable) {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void run() {\n\t\tthis.runnable.run();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/DelegateTypesAndExcludes.java",
    "content": "class DelegatePlain {\n\tprivate final BarImpl bar = new BarImpl();\n\tprivate final FooImpl foo = new FooImpl();\n\tprivate static class FooImpl implements Foo {\n\t\tpublic void foo() {\n\t\t}\n\t\tpublic void bar(java.util.ArrayList<java.lang.String> list) {\n\t\t}\n\t}\n\tprivate static class BarImpl implements Bar {\n\t\tpublic void bar(java.util.ArrayList<java.lang.String> list) {\n\t\t}\n\t}\n\tprivate static interface Foo extends Bar {\n\t\tvoid foo();\n\t}\n\tprivate static interface Bar {\n\t\tvoid bar(java.util.ArrayList<java.lang.String> list);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void bar(final java.util.ArrayList<java.lang.String> list) {\n\t\tthis.bar.bar(list);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void foo() {\n\t\tthis.foo.foo();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/DelegateWithDeprecated.java",
    "content": "class DelegateWithDeprecated {\n\tprivate Bar bar;\n\tprivate interface Bar {\n\t\t@Deprecated\n\t\tvoid deprecatedAnnotation();\n\t\t/**\n\t\t * @deprecated\n\t\t */\n\t\tvoid deprecatedComment();\n\t\tvoid notDeprecated();\n\t}\n\t@java.lang.Deprecated\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void deprecatedAnnotation() {\n\t\tthis.bar.deprecatedAnnotation();\n\t}\n\t@java.lang.Deprecated\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void deprecatedComment() {\n\t\tthis.bar.deprecatedComment();\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void notDeprecated() {\n\t\tthis.bar.notDeprecated();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/DelegateWithVarargs.java",
    "content": "class DelegateWithVarargs {\n\tprivate Bar bar;\n\tprivate interface Bar {\n\t\tvoid justOneParameter(int... varargs);\n\t\tvoid multipleParameters(String first, int... varargs);\n\t\tvoid array(int[] array);\n\t\tvoid arrayVarargs(int[]... arrayVarargs);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void justOneParameter(final int... varargs) {\n\t\tthis.bar.justOneParameter(varargs);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void multipleParameters(final java.lang.String first, final int... varargs) {\n\t\tthis.bar.multipleParameters(first, varargs);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void array(final int[] array) {\n\t\tthis.bar.array(array);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void arrayVarargs(final int[]... arrayVarargs) {\n\t\tthis.bar.arrayVarargs(arrayVarargs);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/DelegateWithVarargs2.java",
    "content": "class DelegateWithVarargs2 {\n\tprivate DelegateWithVarargs2.B bar;\n\tpublic class B {\n\t\tpublic void varargs(Object[]... keys) {\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void varargs(final java.lang.Object[]... keys) {\n\t\tthis.bar.varargs(keys);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/EncodingUsAscii.java",
    "content": "//ENCODING: US-ASCII\nclass EncodingUsAscii {\n\tString foo\\u0e51\\u0e51 = \"\\016\\t\\b \";\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"EncodingUsAscii(foo\\u0e51\\u0e51=\" + this.foo\\u0e51\\u0e51 + \")\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/EncodingUtf8.java",
    "content": "class EncodingUtf8 {\n\tString foo๑๑ = \"\\016\\t\\b \";\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"EncodingUtf8(foo๑๑=\" + this.foo๑๑ + \")\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/EqualsAndHashCode.java",
    "content": "class EqualsAndHashCode {\n\tint x;\n\tboolean[] y;\n\tObject[] z;\n\tString a;\n\tString b;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCode)) return false;\n\t\tfinal EqualsAndHashCode other = (EqualsAndHashCode) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (this.x != other.x) return false;\n\t\tif (!java.util.Arrays.equals(this.y, other.y)) return false;\n\t\tif (!java.util.Arrays.deepEquals(this.z, other.z)) return false;\n\t\tfinal java.lang.Object this$a = this.a;\n\t\tfinal java.lang.Object other$a = other.a;\n\t\tif (this$a == null ? other$a != null : !this$a.equals(other$a)) return false;\n\t\tfinal java.lang.Object this$b = this.b;\n\t\tfinal java.lang.Object other$b = other.b;\n\t\tif (this$b == null ? other$b != null : !this$b.equals(other$b)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof EqualsAndHashCode;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.x;\n\t\tresult = result * PRIME + java.util.Arrays.hashCode(this.y);\n\t\tresult = result * PRIME + java.util.Arrays.deepHashCode(this.z);\n\t\tfinal java.lang.Object $a = this.a;\n\t\tresult = result * PRIME + ($a == null ? 43 : $a.hashCode());\n\t\tfinal java.lang.Object $b = this.b;\n\t\tresult = result * PRIME + ($b == null ? 43 : $b.hashCode());\n\t\treturn result;\n\t}\n}\nfinal class EqualsAndHashCode2 {\n\tint x;\n\tlong y;\n\tfloat f;\n\tdouble d;\n\tboolean b;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCode2)) return false;\n\t\tfinal EqualsAndHashCode2 other = (EqualsAndHashCode2) o;\n\t\tif (this.x != other.x) return false;\n\t\tif (this.y != other.y) return false;\n\t\tif (java.lang.Float.compare(this.f, other.f) != 0) return false;\n\t\tif (java.lang.Double.compare(this.d, other.d) != 0) return false;\n\t\tif (this.b != other.b) return false;\n\t\treturn true;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.x;\n\t\tfinal long $y = this.y;\n\t\tresult = result * PRIME + (int) ($y >>> 32 ^ $y);\n\t\tresult = result * PRIME + java.lang.Float.floatToIntBits(this.f);\n\t\tfinal long $d = java.lang.Double.doubleToLongBits(this.d);\n\t\tresult = result * PRIME + (int) ($d >>> 32 ^ $d);\n\t\tresult = result * PRIME + (this.b ? 79 : 97);\n\t\treturn result;\n\t}\n}\nfinal class EqualsAndHashCode3 extends EqualsAndHashCode {\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCode3)) return false;\n\t\tfinal EqualsAndHashCode3 other = (EqualsAndHashCode3) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof EqualsAndHashCode3;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int result = 1;\n\t\treturn result;\n\t}\n}\nclass EqualsAndHashCode4 extends EqualsAndHashCode {\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCode4)) return false;\n\t\tfinal EqualsAndHashCode4 other = (EqualsAndHashCode4) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (!super.equals(o)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof EqualsAndHashCode4;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int result = super.hashCode();\n\t\treturn result;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/EqualsAndHashCodeAnnotated.java",
    "content": "//version 8:\nimport java.lang.annotation.*;\nclass EqualsAndHashCodeAnnotated {\n\t@Annotated\n\tint primitive;\n\t@Annotated\n\tObject object;\n\tint @Annotated [] primitiveValues;\n\tint @Annotated [] @Annotated [] morePrimitiveValues;\n\tInteger @Annotated [] objectValues;\n\tInteger @Annotated [] @Annotated [] moreObjectValues;\n\t@Target(ElementType.TYPE_USE)\n\t@Retention(RetentionPolicy.SOURCE)\n\t@interface Annotated {\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCodeAnnotated)) return false;\n\t\tfinal EqualsAndHashCodeAnnotated other = (EqualsAndHashCodeAnnotated) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (this.primitive != other.primitive) return false;\n\t\tfinal java.lang.Object this$object = this.object;\n\t\tfinal java.lang.Object other$object = other.object;\n\t\tif (this$object == null ? other$object != null : !this$object.equals(other$object)) return false;\n\t\tif (!java.util.Arrays.equals(this.primitiveValues, other.primitiveValues)) return false;\n\t\tif (!java.util.Arrays.deepEquals(this.morePrimitiveValues, other.morePrimitiveValues)) return false;\n\t\tif (!java.util.Arrays.deepEquals(this.objectValues, other.objectValues)) return false;\n\t\tif (!java.util.Arrays.deepEquals(this.moreObjectValues, other.moreObjectValues)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof EqualsAndHashCodeAnnotated;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.primitive;\n\t\tfinal java.lang.Object $object = this.object;\n\t\tresult = result * PRIME + ($object == null ? 43 : $object.hashCode());\n\t\tresult = result * PRIME + java.util.Arrays.hashCode(this.primitiveValues);\n\t\tresult = result * PRIME + java.util.Arrays.deepHashCode(this.morePrimitiveValues);\n\t\tresult = result * PRIME + java.util.Arrays.deepHashCode(this.objectValues);\n\t\tresult = result * PRIME + java.util.Arrays.deepHashCode(this.moreObjectValues);\n\t\treturn result;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/EqualsAndHashCodeAutoExclude.java",
    "content": "class EqualsAndHashCodeAutoExclude {\n\tint x;\n\tString $a;\n\ttransient String b;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCodeAutoExclude)) return false;\n\t\tfinal EqualsAndHashCodeAutoExclude other = (EqualsAndHashCodeAutoExclude) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (this.x != other.x) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof EqualsAndHashCodeAutoExclude;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.x;\n\t\treturn result;\n\t}\n}\nclass EqualsAndHashCodeAutoExclude2 {\n\tint x;\n\tString $a;\n\ttransient String b;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCodeAutoExclude2)) return false;\n\t\tfinal EqualsAndHashCodeAutoExclude2 other = (EqualsAndHashCodeAutoExclude2) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (this.x != other.x) return false;\n\t\tfinal java.lang.Object this$$a = this.$a;\n\t\tfinal java.lang.Object other$$a = other.$a;\n\t\tif (this$$a == null ? other$$a != null : !this$$a.equals(other$$a)) return false;\n\t\tfinal java.lang.Object this$b = this.b;\n\t\tfinal java.lang.Object other$b = other.b;\n\t\tif (this$b == null ? other$b != null : !this$b.equals(other$b)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof EqualsAndHashCodeAutoExclude2;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.x;\n\t\tfinal java.lang.Object $$a = this.$a;\n\t\tresult = result * PRIME + ($$a == null ? 43 : $$a.hashCode());\n\t\tfinal java.lang.Object $b = this.b;\n\t\tresult = result * PRIME + ($b == null ? 43 : $b.hashCode());\n\t\treturn result;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/EqualsAndHashCodeCache.java",
    "content": "class EqualsAndHashCode {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate transient int $hashCodeCache;\n\tint x;\n\tboolean[] y;\n\tObject[] z;\n\tString a;\n\tString b;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCode)) return false;\n\t\tfinal EqualsAndHashCode other = (EqualsAndHashCode) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (this.x != other.x) return false;\n\t\tif (!java.util.Arrays.equals(this.y, other.y)) return false;\n\t\tif (!java.util.Arrays.deepEquals(this.z, other.z)) return false;\n\t\tfinal java.lang.Object this$a = this.a;\n\t\tfinal java.lang.Object other$a = other.a;\n\t\tif (this$a == null ? other$a != null : !this$a.equals(other$a)) return false;\n\t\tfinal java.lang.Object this$b = this.b;\n\t\tfinal java.lang.Object other$b = other.b;\n\t\tif (this$b == null ? other$b != null : !this$b.equals(other$b)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof EqualsAndHashCode;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tif (this.$hashCodeCache != 0) return this.$hashCodeCache;\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.x;\n\t\tresult = result * PRIME + java.util.Arrays.hashCode(this.y);\n\t\tresult = result * PRIME + java.util.Arrays.deepHashCode(this.z);\n\t\tfinal java.lang.Object $a = this.a;\n\t\tresult = result * PRIME + ($a == null ? 43 : $a.hashCode());\n\t\tfinal java.lang.Object $b = this.b;\n\t\tresult = result * PRIME + ($b == null ? 43 : $b.hashCode());\n\t\tif (result == 0) result = java.lang.Integer.MIN_VALUE;\n\t\tthis.$hashCodeCache = result;\n\t\treturn result;\n\t}\n}\nfinal class EqualsAndHashCode2 {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate transient int $hashCodeCache;\n\tint x;\n\tlong y;\n\tfloat f;\n\tdouble d;\n\tboolean b;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCode2)) return false;\n\t\tfinal EqualsAndHashCode2 other = (EqualsAndHashCode2) o;\n\t\tif (this.x != other.x) return false;\n\t\tif (this.y != other.y) return false;\n\t\tif (java.lang.Float.compare(this.f, other.f) != 0) return false;\n\t\tif (java.lang.Double.compare(this.d, other.d) != 0) return false;\n\t\tif (this.b != other.b) return false;\n\t\treturn true;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tif (this.$hashCodeCache != 0) return this.$hashCodeCache;\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.x;\n\t\tfinal long $y = this.y;\n\t\tresult = result * PRIME + (int) ($y >>> 32 ^ $y);\n\t\tresult = result * PRIME + java.lang.Float.floatToIntBits(this.f);\n\t\tfinal long $d = java.lang.Double.doubleToLongBits(this.d);\n\t\tresult = result * PRIME + (int) ($d >>> 32 ^ $d);\n\t\tresult = result * PRIME + (this.b ? 79 : 97);\n\t\tif (result == 0) result = java.lang.Integer.MIN_VALUE;\n\t\tthis.$hashCodeCache = result;\n\t\treturn result;\n\t}\n}\nfinal class EqualsAndHashCode3 extends EqualsAndHashCode {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate transient int $hashCodeCache;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCode3)) return false;\n\t\tfinal EqualsAndHashCode3 other = (EqualsAndHashCode3) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof EqualsAndHashCode3;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tif (this.$hashCodeCache != 0) return this.$hashCodeCache;\n\t\tint result = 1;\n\t\tif (result == 0) result = java.lang.Integer.MIN_VALUE;\n\t\tthis.$hashCodeCache = result;\n\t\treturn result;\n\t}\n}\nclass EqualsAndHashCode4 extends EqualsAndHashCode {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate transient int $hashCodeCache;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCode4)) return false;\n\t\tfinal EqualsAndHashCode4 other = (EqualsAndHashCode4) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (!super.equals(o)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof EqualsAndHashCode4;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tif (this.$hashCodeCache != 0) return this.$hashCodeCache;\n\t\tint result = super.hashCode();\n\t\tif (result == 0) result = java.lang.Integer.MIN_VALUE;\n\t\tthis.$hashCodeCache = result;\n\t\treturn result;\n\t}\n}\nfinal class EqualsAndHashCode5 extends EqualsAndHashCode {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate transient int $hashCodeCache;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCode5)) return false;\n\t\tfinal EqualsAndHashCode5 other = (EqualsAndHashCode5) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (!super.equals(o)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof EqualsAndHashCode5;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tif (this.$hashCodeCache != 0) return this.$hashCodeCache;\n\t\tint result = super.hashCode();\n\t\tif (result == 0) result = java.lang.Integer.MIN_VALUE;\n\t\tthis.$hashCodeCache = result;\n\t\treturn result;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/EqualsAndHashCodeConfigKeys1.java",
    "content": "class EqualsAndHashCodeConfigKeys1Parent {\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCodeConfigKeys1Parent)) return false;\n\t\tfinal EqualsAndHashCodeConfigKeys1Parent other = (EqualsAndHashCodeConfigKeys1Parent) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof EqualsAndHashCodeConfigKeys1Parent;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int result = 1;\n\t\treturn result;\n\t}\n}\nclass EqualsAndHashCodeConfigKeys1 extends EqualsAndHashCodeConfigKeys1Parent {\n\tint x;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCodeConfigKeys1)) return false;\n\t\tfinal EqualsAndHashCodeConfigKeys1 other = (EqualsAndHashCodeConfigKeys1) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (this.x != other.x) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof EqualsAndHashCodeConfigKeys1;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.x;\n\t\treturn result;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/EqualsAndHashCodeConfigKeys2.java",
    "content": "class EqualsAndHashCodeConfigKeys2Object extends Object {\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCodeConfigKeys2Object)) return false;\n\t\tfinal EqualsAndHashCodeConfigKeys2Object other = (EqualsAndHashCodeConfigKeys2Object) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof EqualsAndHashCodeConfigKeys2Object;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int result = 1;\n\t\treturn result;\n\t}\n}\nclass EqualsAndHashCodeConfigKeys2Parent {\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCodeConfigKeys2Parent)) return false;\n\t\tfinal EqualsAndHashCodeConfigKeys2Parent other = (EqualsAndHashCodeConfigKeys2Parent) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof EqualsAndHashCodeConfigKeys2Parent;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int result = 1;\n\t\treturn result;\n\t}\n}\nclass EqualsAndHashCodeConfigKeys2 extends EqualsAndHashCodeConfigKeys2Parent {\n\tint x;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCodeConfigKeys2)) return false;\n\t\tfinal EqualsAndHashCodeConfigKeys2 other = (EqualsAndHashCodeConfigKeys2) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (!super.equals(o)) return false;\n\t\tif (this.x != other.x) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof EqualsAndHashCodeConfigKeys2;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = super.hashCode();\n\t\tresult = result * PRIME + this.x;\n\t\treturn result;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/EqualsAndHashCodeEmpty.java",
    "content": "class EqualsAndHashCodeEmpty {\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCodeEmpty)) return false;\n\t\tfinal EqualsAndHashCodeEmpty other = (EqualsAndHashCodeEmpty) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof EqualsAndHashCodeEmpty;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int result = 1;\n\t\treturn result;\n\t}\n}\nclass EqualsAndHashCodeEmptyWithSuper extends EqualsAndHashCodeEmpty {\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCodeEmptyWithSuper)) return false;\n\t\tfinal EqualsAndHashCodeEmptyWithSuper other = (EqualsAndHashCodeEmptyWithSuper) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (!super.equals(o)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof EqualsAndHashCodeEmptyWithSuper;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int result = super.hashCode();\n\t\treturn result;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/EqualsAndHashCodeExplicitInclude.java",
    "content": "class EqualsAndHashCodeExplicitInclude {\n\tint x;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCodeExplicitInclude)) return false;\n\t\tfinal EqualsAndHashCodeExplicitInclude other = (EqualsAndHashCodeExplicitInclude) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof EqualsAndHashCodeExplicitInclude;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int result = 1;\n\t\treturn result;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/EqualsAndHashCodeInAnonymousClass.java",
    "content": "public class EqualsAndHashCodeInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\tclass Inner {\n\t\t\tprivate String string;\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic boolean equals(final java.lang.Object o) {\n\t\t\t\tif (o == this) return true;\n\t\t\t\tif (!(o instanceof Inner)) return false;\n\t\t\t\tfinal Inner other = (Inner) o;\n\t\t\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\t\t\tfinal java.lang.Object this$string = this.string;\n\t\t\t\tfinal java.lang.Object other$string = other.string;\n\t\t\t\tif (this$string == null ? other$string != null : !this$string.equals(other$string)) return false;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected boolean canEqual(final java.lang.Object other) {\n\t\t\t\treturn other instanceof Inner;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic int hashCode() {\n\t\t\t\tfinal int PRIME = 59;\n\t\t\t\tint result = 1;\n\t\t\t\tfinal java.lang.Object $string = this.string;\n\t\t\t\tresult = result * PRIME + ($string == null ? 43 : $string.hashCode());\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/EqualsAndHashCodeNestedShadow.java",
    "content": "interface EqualsAndHashCodeNestedShadow {\n\tinterface Foo {\n\t}\n\tclass Bar {\n\t\tpublic static class Foo extends Bar implements EqualsAndHashCodeNestedShadow.Foo {\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic boolean equals(final java.lang.Object o) {\n\t\t\t\tif (o == this) return true;\n\t\t\t\tif (!(o instanceof EqualsAndHashCodeNestedShadow.Bar.Foo)) return false;\n\t\t\t\tfinal EqualsAndHashCodeNestedShadow.Bar.Foo other = (EqualsAndHashCodeNestedShadow.Bar.Foo) o;\n\t\t\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected boolean canEqual(final java.lang.Object other) {\n\t\t\t\treturn other instanceof EqualsAndHashCodeNestedShadow.Bar.Foo;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic int hashCode() {\n\t\t\t\tfinal int result = 1;\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t}\n\tclass Baz {\n\t\tpublic static class Foo<T> extends Bar implements EqualsAndHashCodeNestedShadow.Foo {\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic boolean equals(final java.lang.Object o) {\n\t\t\t\tif (o == this) return true;\n\t\t\t\tif (!(o instanceof EqualsAndHashCodeNestedShadow.Baz.Foo)) return false;\n\t\t\t\tfinal EqualsAndHashCodeNestedShadow.Baz.Foo<?> other = (EqualsAndHashCodeNestedShadow.Baz.Foo<?>) o;\n\t\t\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected boolean canEqual(final java.lang.Object other) {\n\t\t\t\treturn other instanceof EqualsAndHashCodeNestedShadow.Baz.Foo;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic int hashCode() {\n\t\t\t\tfinal int result = 1;\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/EqualsAndHashCodeNewStyle.java",
    "content": "public class EqualsAndHashCodeNewStyle {\n\tint b;\n\tdouble c;\n\tint f;\n\tint d;\n\tint f() {\n\t\treturn 0;\n\t}\n\tint g;\n\tlong i() {\n\t\treturn 0;\n\t}\n\tint j;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCodeNewStyle)) return false;\n\t\tfinal EqualsAndHashCodeNewStyle other = (EqualsAndHashCodeNewStyle) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (this.b != other.b) return false;\n\t\tif (java.lang.Double.compare(this.c, other.c) != 0) return false;\n\t\tif (this.d != other.d) return false;\n\t\tif (this.f() != other.f()) return false;\n\t\tif (this.i() != other.i()) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof EqualsAndHashCodeNewStyle;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.b;\n\t\tfinal long $c = java.lang.Double.doubleToLongBits(this.c);\n\t\tresult = result * PRIME + (int) ($c >>> 32 ^ $c);\n\t\tresult = result * PRIME + this.d;\n\t\tresult = result * PRIME + this.f();\n\t\tfinal long $$i = this.i();\n\t\tresult = result * PRIME + (int) ($$i >>> 32 ^ $$i);\n\t\treturn result;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/EqualsAndHashCodeOfAndExclude.java",
    "content": "final class EqualsAndHashCodeOf {\n\tint x;\n\tint y;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCodeOf)) return false;\n\t\tfinal EqualsAndHashCodeOf other = (EqualsAndHashCodeOf) o;\n\t\tif (this.x != other.x) return false;\n\t\treturn true;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.x;\n\t\treturn result;\n\t}\n}\nfinal class EqualsAndHashCodeExclude {\n\tint x;\n\tint y;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCodeExclude)) return false;\n\t\tfinal EqualsAndHashCodeExclude other = (EqualsAndHashCodeExclude) o;\n\t\tif (this.x != other.x) return false;\n\t\treturn true;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.x;\n\t\treturn result;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/EqualsAndHashCodeOnRecord.java",
    "content": "// version 14:\npublic record EqualsAndHashCodeOnRecord(String a, String b) {\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/EqualsAndHashCodeRank.java",
    "content": "public class EqualsAndHashCodeRank {\n\tint a;\n\tint b;\n\tint c;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCodeRank)) return false;\n\t\tfinal EqualsAndHashCodeRank other = (EqualsAndHashCodeRank) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (this.a != other.a) return false;\n\t\tif (this.c != other.c) return false;\n\t\tif (this.b != other.b) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof EqualsAndHashCodeRank;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.a;\n\t\tresult = result * PRIME + this.c;\n\t\tresult = result * PRIME + this.b;\n\t\treturn result;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/EqualsAndHashCodeWithExistingMethods.java",
    "content": "class EqualsAndHashCodeWithExistingMethods {\n\tint x;\n\tpublic int hashCode() {\n\t\treturn 42;\n\t}\n}\nfinal class EqualsAndHashCodeWithExistingMethods2 {\n\tint x;\n\tpublic boolean equals(Object other) {\n\t\treturn false;\n\t}\n}\nfinal class EqualsAndHashCodeWithExistingMethods3 extends EqualsAndHashCodeWithExistingMethods {\n\tint x;\n\tprivate boolean canEqual(Object other) {\n\t\treturn true;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCodeWithExistingMethods3)) return false;\n\t\tfinal EqualsAndHashCodeWithExistingMethods3 other = (EqualsAndHashCodeWithExistingMethods3) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (!super.equals(o)) return false;\n\t\tif (this.x != other.x) return false;\n\t\treturn true;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = super.hashCode();\n\t\tresult = result * PRIME + this.x;\n\t\treturn result;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/EqualsAndHashCodeWithGenericsOnInners.java",
    "content": "//version 7:\npublic class EqualsAndHashCodeWithGenericsOnInners<A> {\n\tclass Inner<B> {\n\t\tint x;\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic boolean equals(final java.lang.Object o) {\n\t\t\tif (o == this) return true;\n\t\t\tif (!(o instanceof EqualsAndHashCodeWithGenericsOnInners.Inner)) return false;\n\t\t\tfinal EqualsAndHashCodeWithGenericsOnInners<?>.Inner<?> other = (EqualsAndHashCodeWithGenericsOnInners<?>.Inner<?>) o;\n\t\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\t\tif (this.x != other.x) return false;\n\t\t\treturn true;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected boolean canEqual(final java.lang.Object other) {\n\t\t\treturn other instanceof EqualsAndHashCodeWithGenericsOnInners.Inner;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic int hashCode() {\n\t\t\tfinal int PRIME = 59;\n\t\t\tint result = 1;\n\t\t\tresult = result * PRIME + this.x;\n\t\t\treturn result;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/EqualsAndHashCodeWithGenericsOnInnersInInterfaces.java",
    "content": "public interface EqualsAndHashCodeWithGenericsOnInnersInInterfaces<A> {\n\tclass Inner<B> {\n\t\tint x;\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic boolean equals(final java.lang.Object o) {\n\t\t\tif (o == this) return true;\n\t\t\tif (!(o instanceof EqualsAndHashCodeWithGenericsOnInnersInInterfaces.Inner)) return false;\n\t\t\tfinal EqualsAndHashCodeWithGenericsOnInnersInInterfaces.Inner<?> other = (EqualsAndHashCodeWithGenericsOnInnersInInterfaces.Inner<?>) o;\n\t\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\t\tif (this.x != other.x) return false;\n\t\t\treturn true;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected boolean canEqual(final java.lang.Object other) {\n\t\t\treturn other instanceof EqualsAndHashCodeWithGenericsOnInnersInInterfaces.Inner;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic int hashCode() {\n\t\t\tfinal int PRIME = 59;\n\t\t\tint result = 1;\n\t\t\tresult = result * PRIME + this.x;\n\t\t\treturn result;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/EqualsAndHashCodeWithNonNullByDefault.java",
    "content": "import javax.annotation.ParametersAreNonnullByDefault;\n@ParametersAreNonnullByDefault\nclass EqualsAndHashCodeWithNonNullByDefault {\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(@javax.annotation.Nullable final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCodeWithNonNullByDefault)) return false;\n\t\tfinal EqualsAndHashCodeWithNonNullByDefault other = (EqualsAndHashCodeWithNonNullByDefault) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(@javax.annotation.Nullable final java.lang.Object other) {\n\t\treturn other instanceof EqualsAndHashCodeWithNonNullByDefault;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int result = 1;\n\t\treturn result;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/EqualsAndHashCodeWithOnParam.java",
    "content": "@interface Nullable {\n}\nclass EqualsAndHashCodeWithOnParam {\n\tint x;\n\tboolean[] y;\n\tObject[] z;\n\tString a;\n\tString b;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(@Nullable final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCodeWithOnParam)) return false;\n\t\tfinal EqualsAndHashCodeWithOnParam other = (EqualsAndHashCodeWithOnParam) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (this.x != other.x) return false;\n\t\tif (!java.util.Arrays.equals(this.y, other.y)) return false;\n\t\tif (!java.util.Arrays.deepEquals(this.z, other.z)) return false;\n\t\tfinal java.lang.Object this$a = this.a;\n\t\tfinal java.lang.Object other$a = other.a;\n\t\tif (this$a == null ? other$a != null : !this$a.equals(other$a)) return false;\n\t\tfinal java.lang.Object this$b = this.b;\n\t\tfinal java.lang.Object other$b = other.b;\n\t\tif (this$b == null ? other$b != null : !this$b.equals(other$b)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(@Nullable final java.lang.Object other) {\n\t\treturn other instanceof EqualsAndHashCodeWithOnParam;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.x;\n\t\tresult = result * PRIME + java.util.Arrays.hashCode(this.y);\n\t\tresult = result * PRIME + java.util.Arrays.deepHashCode(this.z);\n\t\tfinal java.lang.Object $a = this.a;\n\t\tresult = result * PRIME + ($a == null ? 43 : $a.hashCode());\n\t\tfinal java.lang.Object $b = this.b;\n\t\tresult = result * PRIME + ($b == null ? 43 : $b.hashCode());\n\t\treturn result;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/EqualsAndHashCodeWithSomeExistingMethods.java",
    "content": "import lombok.*;\nimport static lombok.AccessLevel.NONE;\nclass EqualsAndHashCodeWithSomeExistingMethods {\n\tint x;\n\tpublic int hashCode() {\n\t\treturn 42;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic EqualsAndHashCodeWithSomeExistingMethods() {\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"EqualsAndHashCodeWithSomeExistingMethods(x=\" + this.x + \")\";\n\t}\n}\nclass EqualsAndHashCodeWithSomeExistingMethods2 {\n\tint x;\n\tprotected boolean canEqual(Object other) {\n\t\treturn false;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic EqualsAndHashCodeWithSomeExistingMethods2() {\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCodeWithSomeExistingMethods2)) return false;\n\t\tfinal EqualsAndHashCodeWithSomeExistingMethods2 other = (EqualsAndHashCodeWithSomeExistingMethods2) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (this.x != other.x) return false;\n\t\treturn true;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.x;\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"EqualsAndHashCodeWithSomeExistingMethods2(x=\" + this.x + \")\";\n\t}\n}\nclass EqualsAndHashCodeWithAllExistingMethods {\n\tint x;\n\tpublic int hashCode() {\n\t\treturn 42;\n\t}\n\tpublic boolean equals(Object other) {\n\t\treturn false;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic EqualsAndHashCodeWithAllExistingMethods() {\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"EqualsAndHashCodeWithAllExistingMethods(x=\" + this.x + \")\";\n\t}\n}\nclass EqualsAndHashCodeWithNoExistingMethods {\n\tint x;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic EqualsAndHashCodeWithNoExistingMethods() {\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCodeWithNoExistingMethods)) return false;\n\t\tfinal EqualsAndHashCodeWithNoExistingMethods other = (EqualsAndHashCodeWithNoExistingMethods) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (this.x != other.x) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof EqualsAndHashCodeWithNoExistingMethods;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.x;\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"EqualsAndHashCodeWithNoExistingMethods(x=\" + this.x + \")\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ExtensionMethodAmbiguousFunctional.java",
    "content": "//skip-idempotent\nimport java.util.function.Consumer;\nimport java.util.function.Function;\n\nclass ExtensionMethodAmbiguousFunctional {\n\tpublic void test() {\n\t\tExtensionMethodAmbiguousFunctional.Extensions.ambiguous(\"\", System.out::println);\n\t}\n\n\tstatic class Extensions {\n\t\tpublic static <T, R> void ambiguous(T t, Function<T, R> function) {\n\t\t}\n\n\t\tpublic static <T> void ambiguous(T t, Consumer<T> function) {\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ExtensionMethodAutoboxing.java",
    "content": "class ExtensionMethodAutoboxing {\n\tpublic void test() {\n\t\tLong l1 = 1L;\n\t\tlong l2 = 1L;\n\t\tInteger i1 = 1;\n\t\tint i2 = 1;\n\t\tString string = \"test\";\n\t\tExtensionMethodAutoboxing.Extensions.boxing(string, l1, i1);\n\t\tExtensionMethodAutoboxing.Extensions.boxing(string, l1, i2);\n\t\tExtensionMethodAutoboxing.Extensions.boxing(string, l2, i1);\n\t\tExtensionMethodAutoboxing.Extensions.boxing(string, l2, i2);\n\t}\n\n\n\tstatic class Extensions {\n\t\tpublic static String boxing(String string, Long a, int b) {\n\t\t\treturn string + \" \" + a + \" \" + b;\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/transform/resource/after-delombok/ExtensionMethodChain.java",
    "content": "import java.util.Arrays;\nimport java.util.List;\n\nclass ExtensionMethodChain {\n\tpublic void test() {\n\t\tExtensionMethodChain.Extensions.intValue(\"1\").intValue();\n\t}\n\n\n\tstatic class Extensions {\n\t\tpublic static Integer intValue(String s) {\n\t\t\treturn Integer.valueOf(s);\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/transform/resource/after-delombok/ExtensionMethodFunctional.java",
    "content": "// version 8:\nimport java.util.function.Consumer;\nimport java.util.function.Function;\nimport java.util.List;\nimport java.util.stream.Collectors;\nimport java.util.stream.Stream;\n\nclass ExtensionMethodFunctional {\n\tpublic void test() {\n\t\tString test = \"test\";\n\t\ttest = ExtensionMethodFunctional.Extensions.map(test, s -> ExtensionMethodFunctional.Extensions.reverse(s));\n\t\tExtensionMethodFunctional.Extensions.consume(test, s -> System.out.println(\"1: \" + s), s -> System.out.println(\"2: \" + s));\n\t\tExtensionMethodFunctional.Extensions.consume(test, System.out::println, System.out::println);\n\t\tExtensionMethodFunctional.Extensions.consume(test, test.length() > 0 ? System.out::println : null);\n\t\tExtensionMethodFunctional.Extensions.toList1(Stream.of(\"a\", \"b\", \"c\").map(String::toUpperCase));\n\t\tList<Integer> i2 = ExtensionMethodFunctional.Extensions.toList2(Stream.of(\"a\", \"b\", \"c\").map(String::toUpperCase));\n\t}\n\n\tstatic class Extensions {\n\t\tpublic static <T, R> R map(T value, Function<T, R> mapper) {\n\t\t\treturn mapper.apply(value);\n\t\t}\n\n\t\tpublic static String reverse(String string) {\n\t\t\treturn new StringBuilder(string).reverse().toString();\n\t\t}\n\n\t\t@SafeVarargs\n\t\tpublic static <T> void consume(T o, Consumer<T>... consumer) {\n\t\t\tfor (int i = 0; i < consumer.length; i++) {\n\t\t\t\tconsumer[i].accept(o);\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic static <T> List<T> toList1(Stream<T> stream) {\n\t\t\treturn (List<T>) stream.collect(Collectors.toList());\n\t\t}\n\n\t\tpublic static <T, U> List<U> toList2(Stream<T> stream) {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ExtensionMethodGeneric.java",
    "content": "import java.util.List;\nimport java.util.Map;\n\nclass ExtensionMethodGeneric {\n\tpublic void test() {\n\t\tList<String> stringList = null;\n\t\tList<Number> numberList = null;\n\t\tExtensionMethodGeneric.Extensions.test(stringList);\n\t\tExtensionMethodGeneric.Extensions.test(stringList, numberList);\n\t\tExtensionMethodGeneric.Extensions.test(ExtensionMethodGeneric.Extensions.test(stringList, stringList), numberList);\n\t\tInteger i = ExtensionMethodGeneric.Extensions.test2(stringList);\n\t\tMap<String, Integer> map = null;\n\t\tList<String> l = ExtensionMethodGeneric.Extensions.test(map, stringList, numberList);\n\t}\n\t\n\tstatic class Extensions {\n\t\tpublic static <T> List<T> test(List<String> obj, List<T> list) {\n\t\t\treturn null;\n\t\t}\n\n\t\tpublic static <K, V> K test(Map<String, Integer> obj, K k, V v) {\n\t\t\treturn k;\n\t\t}\n\n\t\tpublic static <T> T test(List<T> list) {\n\t\t\treturn null;\n\t\t}\n\n\t\tpublic static <T, U> U test2(List<T> list) {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ExtensionMethodInLambda.java",
    "content": "// version 8:\nimport java.util.function.Function;\n\npublic class ExtensionMethodInLambda {\n\tprivate static final Function<String, String> testStatic = s -> ExtensionMethodInLambda.Extensions.reverse(s);\n\t\n\tpublic void testSimple() {\n\t\tString test = \"test\";\n\t\ttest = ExtensionMethodInLambda.Extensions.map(test, s -> ExtensionMethodInLambda.Extensions.reverse(s));\n\t}\n\n\tpublic void testSameName() {\n\t\tString test = \"test\";\n\t\ttest = ExtensionMethodInLambda.Extensions.map(test, s -> s.trim());\n\t}\n\n\tpublic void testArgumentOfInvalidMethod() {\n\t\tString test = \"test\";\n\t\ttest.invalid(s -> s.reverse());\n\t}\n\n\n\tstatic class Extensions {\n\t\tpublic static <T, R> R map(T value, Function<T, R> mapper) {\n\t\t\treturn mapper.apply(value);\n\t\t}\n\n\t\tpublic static String reverse(String string) {\n\t\t\treturn new StringBuilder(string).reverse().toString();\n\t\t}\n\n\t\tpublic static String trim(Integer integer) {\n\t\t\treturn \"0\";\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ExtensionMethodNames.java",
    "content": "package a;\n\nclass ExtensionMethodNames {\n\t\n\tpublic void instanceCalls() {\n\t\ta.Extensions.ext((new Test()));\n\t\tTest t = new Test();\n\t\ta.Extensions.ext(t);\n\t\tTest Test = new Test();\n\t\ta.Extensions.ext(Test);\n\t}\n\t\n\tpublic void staticCalls() {\n\t\tTest.ext();\n\t\ta.Test.ext();\n\t}\n}\n\nclass Extensions {\n\tpublic static void ext(Test t) {\n\t}\n}\n\nclass Test {\n\tpublic static void ext() {\n\t}\n}"
  },
  {
    "path": "test/transform/resource/after-delombok/ExtensionMethodNonStatic.java",
    "content": "class ExtensionMethodNonStatic {\n\tpublic void test() {\n\t\tString s = \"test\";\n\t\ts.startsWith(\"\");\n\t}\n\n\tstatic class Extensions {\n\t\tpublic boolean startsWith(String s, String prefix) {\n\t\t\treturn s.startsWith(prefix);\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/transform/resource/after-delombok/ExtensionMethodOnRecord.java",
    "content": "// version 14:\npublic record ExtensionMethodOnRecord() {\n\tpublic void test() {\n\t\tExtensionMethodOnRecord.Extensions.intValue(\"1\");\n\t}\n\n\tstatic class Extensions {\n\t\tpublic static Integer intValue(String s) {\n\t\t\treturn Integer.valueOf(s);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ExtensionMethodPlain.java",
    "content": "class ExtensionMethodPlain {\n\tpublic String test() {\n\t\tint[] intArray = {5, 3, 8, 2};\n\t\tjava.util.Arrays.sort(intArray);\n\t\tString iAmNull = null;\n\t\treturn ExtensionMethodPlain.Extensions.or(iAmNull, ExtensionMethodPlain.Extensions.toTitleCase(\"hELlO, WORlD!\"));\n\t}\n\tstatic class Extensions {\n\t\tpublic static <T> T or(T obj, T ifNull) {\n\t\t\treturn obj != null ? obj : ifNull;\n\t\t}\n\t\tpublic static String toTitleCase(String in) {\n\t\t\tif (in.isEmpty()) return in;\n\t\t\treturn \"\" + Character.toTitleCase(in.charAt(0)) + in.substring(1).toLowerCase();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ExtensionMethodSuppress.java",
    "content": "class ExtensionMethodSuppress {\n\tpublic void test() {\n\t\tTest.staticMethod();\n\t\tTest test = new Test();\n\t\tExtensions.instanceMethod(test);\n\t\tExtensions.staticMethod(test);\n\t}\n}\n\nclass ExtensionMethodKeep {\n\tpublic void test() {\n\t\tTest.staticMethod();\n\t\tTest test = new Test();\n\t\ttest.instanceMethod();\n\t\ttest.staticMethod();\n\t}\n}\n\nclass Test {\n\tpublic static void staticMethod() {\n\t}\n\t\n\tpublic void instanceMethod() {\n\t}\n}\n\nclass Extensions {\n\tpublic static void staticMethod(Test test) {\n\t}\n\t\n\tpublic static void instanceMethod(Test test) {\n\t}\n}"
  },
  {
    "path": "test/transform/resource/after-delombok/ExtensionMethodVarargs.java",
    "content": "class ExtensionMethodVarargs {\n\tpublic void test() {\n\t\tLong l1 = 1L;\n\t\tlong l2 = 1L;\n\t\tInteger i1 = 1;\n\t\tint i2 = 1;\n\t\tExtensionMethodVarargs.Extensions.format(\"%d %d %d %d\", l1, l2, i1, i2);\n\t\tExtensionMethodVarargs.Extensions.format(\"%d\", l1);\n\t\tExtensionMethodVarargs.Extensions.format(\"\", new Integer[] {1, 2});\n\t\tExtensionMethodVarargs.Extensions.format(\"\", new Integer[] {1, 2}, new Integer[] {1, 2});\n\t}\n\n\n\tstatic class Extensions {\n\t\tpublic static String format(String string, Object... params) {\n\t\t\treturn String.format(string, params);\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/transform/resource/after-delombok/ExtensionMethodWidening.java",
    "content": "class ExtensionMethodWidening {\n\tpublic void test() {\n\t\tString string = \"test\";\n\t\tExtensionMethodWidening.Extensions.widening(string, 1);\n\t}\n\n\n\tstatic class Extensions {\n\t\tpublic static String widening(String string, long a) {\n\t\t\treturn string + \" \" + a;\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/transform/resource/after-delombok/FieldDefaults.java",
    "content": "class FieldDefaults1 {\n\tstatic int STATIC = 3;\n\tfinal int x;\n\tint y;\n\tFieldDefaults1(int x) {\n\t\tthis.x = x;\n\t}\n}\nclass FieldDefaults2 {\n\tstatic int STATIC = 3;\n\tint x;\n\tprivate int y;\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/FieldDefaultsNoop.java",
    "content": "class FieldDefaultsNoop {\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/FieldDefaultsOnRecord.java",
    "content": "// version 14:\npublic record FieldDefaultsOnRecord(String a, String b) {\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/FieldDefaultsViaConfig.java",
    "content": "class FieldDefaultsViaConfig1 {\n\tprivate final int x;\n\tprivate int y;\n\tFieldDefaultsViaConfig1(int x) {\n\t\tthis.x = x;\n\t}\n}\nclass FieldDefaultsViaConfig2 {\n\tfinal int x = 2;\n\tprotected final int y = 0;\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/FieldDefaultsViaConfigAndRequiredArgsConstructor.java",
    "content": "class FieldDefaultsViaConfigAndRequiredArgsConstructor {\n\tfinal int x;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic FieldDefaultsViaConfigAndRequiredArgsConstructor(final int x) {\n\t\tthis.x = x;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/FieldDefaultsViaConfigOnRecord.java",
    "content": "// version 14:\npublic record FieldDefaultsViaConfigOnRecord(String a, String b) {\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/FieldNameConstantsBasic.java",
    "content": "public class FieldNameConstantsBasic {\n\tString iAmADvdPlayer;\n\tint $skipMe;\n\tstatic double skipMeToo;\n\tint andMe;\n\tString butPrintMePlease;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tstatic final class Fields {\n\t\tpublic static final java.lang.String iAmADvdPlayer = \"iAmADvdPlayer\";\n\t\tpublic static final java.lang.String butPrintMePlease = \"butPrintMePlease\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/FieldNameConstantsConfigKeys.java",
    "content": "public class FieldNameConstantsConfigKeys {\n\tString iAmADvdPlayer;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static final class Foobar {\n\t\tpublic static final java.lang.String iAmADvdPlayer = \"iAmADvdPlayer\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/FieldNameConstantsEnum.java",
    "content": "public class FieldNameConstantsEnum {\n\tString iAmADvdPlayer;\n\tint $dontSkipMe;\n\tstatic double alsoDontSkipMe;\n\tint butSkipMe;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic enum TypeTest {\n\t\tiAmADvdPlayer, $dontSkipMe, alsoDontSkipMe;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/FieldNameConstantsHandrolled.java",
    "content": "class FieldNameConstantsHandrolled1 {\n\tint field1;\n\tint alsoAField;\n\tint thirdField;\n\tpublic enum TypeTest {\n\t\talsoAField, thirdField, field1;\n\t}\n}\nclass FieldNameConstantsHandrolled2 {\n\tint field1;\n\tint alsoAField;\n\tint thirdField;\n\tpublic enum TypeTest {\n\t\talsoAField, thirdField, field1;\n\t\tpublic String foo() {\n\t\t\treturn name();\n\t\t}\n\t}\n}\n\nclass FieldNameConstantsHandrolled3 {\n\tint field1;\n\tint alsoAField;\n\tint thirdField;\n\tstatic class Fields {\n\t\tpublic static final java.lang.String field1 = \"field1\";\n\t\tpublic static final java.lang.String thirdField = \"thirdField\";\n\t\tpublic static final int alsoAField = 5;\n\t}\n}"
  },
  {
    "path": "test/transform/resource/after-delombok/FieldNameConstantsInAnonymousClass.java",
    "content": "public class FieldNameConstantsInAnonymousClass {\n\tObject annonymous = new Object() {\n\n\t\tclass Inner {\n\t\t\tprivate String string;\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/FieldNameConstantsOnRecord.java",
    "content": "// version 14:\npublic record FieldNameConstantsOnRecord(String iAmADvdPlayer, int $skipMe, int andMe, String butPrintMePlease) {\n\tstatic double skipMeToo;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tstatic final class Fields {\n\t\tpublic static final java.lang.String iAmADvdPlayer = \"iAmADvdPlayer\";\n\t\tpublic static final java.lang.String butPrintMePlease = \"butPrintMePlease\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/FieldNameConstantsUppercased.java",
    "content": "public class FieldNameConstantsUppercased {\n\tString iAmADvdPlayer;\n\tint $skipMe;\n\tstatic double skipMeToo;\n\tint andMe;\n\tString butPrintMePlease;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tstatic final class Fields {\n\t\tpublic static final java.lang.String I_AM_A_DVD_PLAYER = \"iAmADvdPlayer\";\n\t\tpublic static final java.lang.String BUT_PRINT_ME_PLEASE = \"butPrintMePlease\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GenerateSuppressFBWarnings.java",
    "content": "//VERSION 7:\nclass GenerateSuppressFBWarnings {\n\tint y;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(justification = \"generated code\")\n\t@lombok.Generated\n\tpublic int getY() {\n\t\treturn this.y;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GeneratedJavaxJakarta.java",
    "content": "class GeneratedJavaxJakarta {\n\tint x;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@javax.annotation.Generated(\"lombok\")\n\t@jakarta.annotation.Generated(\"lombok\")\n\t@lombok.Generated\n\tpublic int getX() {\n\t\treturn this.x;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GeneratedJavaxOffLombokOff.java",
    "content": "class GeneratedJavaxOffLombokOff {\n\tint x;\n\t@java.lang.SuppressWarnings(\"all\")\n\tpublic int getX() {\n\t\treturn this.x;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GeneratedJavaxOnLombokOn.java",
    "content": "class GeneratedJavaxOnLombokOn {\n\tint x;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@javax.annotation.Generated(\"lombok\")\n\t@lombok.Generated\n\tpublic int getX() {\n\t\treturn this.x;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GeneratedOff.java",
    "content": "class GeneratedOff {\n\tint x;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getX() {\n\t\treturn this.x;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GeneratedOffJavaxOn.java",
    "content": "class GeneratedOffJavaxOn {\n\tint x;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@javax.annotation.Generated(\"lombok\")\n\t@lombok.Generated\n\tpublic int getX() {\n\t\treturn this.x;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GeneratedOffLombokOn.java",
    "content": "class GeneratedOffLombokOn {\n\tint x;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getX() {\n\t\treturn this.x;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GeneratedOn.java",
    "content": "class GeneratedOn {\n\tint x;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@javax.annotation.Generated(\"lombok\")\n\t@lombok.Generated\n\tpublic int getX() {\n\t\treturn this.x;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterAccessLevel.java",
    "content": "class GetterAccessLevel {\n\tboolean isNone;\n\tboolean isPrivate;\n\tboolean isPackage;\n\tboolean isProtected;\n\tboolean isPublic;\n\tString noneString;\n\tString privateString;\n\tString packageString;\n\tString protectedString;\n\tString publicString;\n\tString value;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate boolean isPrivate() {\n\t\treturn this.isPrivate;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tboolean isPackage() {\n\t\treturn this.isPackage;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean isProtected() {\n\t\treturn this.isProtected;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean isPublic() {\n\t\treturn this.isPublic;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate String getPrivateString() {\n\t\treturn this.privateString;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tString getPackageString() {\n\t\treturn this.packageString;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected String getProtectedString() {\n\t\treturn this.protectedString;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getPublicString() {\n\t\treturn this.publicString;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getValue() {\n\t\treturn this.value;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterAlreadyExists.java",
    "content": "class Getter1 {\n\tboolean foo;\n\tboolean hasFoo() {\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean isFoo() {\n\t\treturn this.foo;\n\t}\n}\nclass Getter2 {\n\tboolean foo;\n\tboolean isFoo() {\n\t\treturn true;\n\t}\n}\nclass Getter3 {\n\tboolean foo;\n\tboolean getFoo() {\n\t\treturn true;\n\t}\n}\nclass Getter4 {\n\tString foo;\n\tString hasFoo() {\n\t\treturn null;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getFoo() {\n\t\treturn this.foo;\n\t}\n}\nclass Getter5 {\n\tString foo;\n\tString isFoo() {\n\t\treturn null;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getFoo() {\n\t\treturn this.foo;\n\t}\n}\nclass Getter6 {\n\tString foo;\n\tString getFoo() {\n\t\treturn null;\n\t}\n}\nclass Getter7 {\n\tString foo;\n\tboolean hasFoo() {\n\t\treturn false;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getFoo() {\n\t\treturn this.foo;\n\t}\n}\nclass Getter8 {\n\tString foo;\n\tboolean isFoo() {\n\t\treturn false;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getFoo() {\n\t\treturn this.foo;\n\t}\n}\nclass Getter9 {\n\tString foo;\n\tboolean getFoo() {\n\t\treturn false;\n\t}\n}\nclass Getter10 {\n\tboolean foo;\n\tstatic boolean hasFoo() {\n\t\treturn false;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean isFoo() {\n\t\treturn this.foo;\n\t}\n}\nclass Getter11 {\n\tboolean foo;\n\tstatic boolean isFoo() {\n\t\treturn false;\n\t}\n}\nclass Getter12 {\n\tboolean foo;\n\tstatic boolean getFoo() {\n\t\treturn false;\n\t}\n}\nclass Getter13 {\n\tString foo;\n\tstatic boolean hasFoo() {\n\t\treturn false;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getFoo() {\n\t\treturn this.foo;\n\t}\n}\nclass Getter14 {\n\tString foo;\n\tstatic boolean isFoo() {\n\t\treturn false;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getFoo() {\n\t\treturn this.foo;\n\t}\n}\nclass Getter15 {\n\tString foo;\n\tstatic boolean getFoo() {\n\t\treturn false;\n\t}\n}\nclass Getter16 {\n\tString foo;\n\tstatic String hasFoo() {\n\t\treturn \"\";\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getFoo() {\n\t\treturn this.foo;\n\t}\n}\nclass Getter17 {\n\tString foo;\n\tstatic String isFoo() {\n\t\treturn \"\";\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getFoo() {\n\t\treturn this.foo;\n\t}\n}\nclass Getter18 {\n\tString foo;\n\tstatic String getFoo() {\n\t\treturn \"\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterBoolean.java",
    "content": "class Getter {\n\tboolean foo;\n\tboolean isBar;\n\tboolean hasBaz;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean isFoo() {\n\t\treturn this.foo;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean isBar() {\n\t\treturn this.isBar;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean isHasBaz() {\n\t\treturn this.hasBaz;\n\t}\n}\nclass MoreGetter {\n\tboolean foo;\n\tboolean hasFoo() {\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean isFoo() {\n\t\treturn this.foo;\n\t}\n}\nclass YetMoreGetter {\n\tboolean foo;\n\tboolean getFoo() {\n\t\treturn true;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterDeprecated.java",
    "content": "class GetterDeprecated {\n\t@Deprecated\n\tint annotation;\n\t/**\n\t * @deprecated\n\t */\n\tint javadoc;\n\t@java.lang.Deprecated\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getAnnotation() {\n\t\treturn this.annotation;\n\t}\n\t/**\n\t * @deprecated\n\t */\n\t@java.lang.Deprecated\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getJavadoc() {\n\t\treturn this.javadoc;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterEnum.java",
    "content": "enum GetterEnum {\n\tONE(1, \"One\");\n\tprivate final int id;\n\tprivate final String name;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate GetterEnum(final int id, final String name) {\n\t\tthis.id = id;\n\t\tthis.name = name;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getId() {\n\t\treturn this.id;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getName() {\n\t\treturn this.name;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterEnumConstant.java",
    "content": "enum GetterEnumConstant {\n\tONE;\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterInAnonymousClass.java",
    "content": "public class GetterInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\tclass Inner {\n\t\t\tprivate String string;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic String getString() {\n\t\t\t\treturn this.string;\n\t\t\t}\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterLazy.java",
    "content": "class GetterLazy {\n\tstatic class ValueType {\n\t}\n\tprivate final java.util.concurrent.atomic.AtomicReference<java.lang.Object> fieldName = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n\t@java.lang.SuppressWarnings({\"all\", \"unchecked\"})\n\t@lombok.Generated\n\tpublic ValueType getFieldName() {\n\t\tjava.lang.Object $value = this.fieldName.get();\n\t\tif ($value == null) {\n\t\t\tsynchronized (this.fieldName) {\n\t\t\t\t$value = this.fieldName.get();\n\t\t\t\tif ($value == null) {\n\t\t\t\t\tfinal ValueType actualValue = new ValueType();\n\t\t\t\t\t$value = actualValue == null ? this.fieldName : actualValue;\n\t\t\t\t\tthis.fieldName.set($value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn (ValueType) ($value == this.fieldName ? null : $value);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterLazyArguments.java",
    "content": "// version 8:\nclass GetterLazyArguments {\n\tstatic String fun() {\n\t\treturn null;\n\t}\n\tstatic String stringInt(String arg1, Integer arg2) {\n\t\treturn null;\n\t}\n\tstatic String stringRunnable(String arg1, Runnable arg2) {\n\t\treturn null;\n\t}\n\tprivate final java.util.concurrent.atomic.AtomicReference<java.lang.Object> field1 = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n\tprivate final java.util.concurrent.atomic.AtomicReference<java.lang.Object> field2 = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n\tprivate final java.util.concurrent.atomic.AtomicReference<java.lang.Object> field3 = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n\tprivate final java.util.concurrent.atomic.AtomicReference<java.lang.Object> field4 = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n\tprivate final java.util.concurrent.atomic.AtomicReference<java.lang.Object> field5 = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n\tprivate final java.util.concurrent.atomic.AtomicReference<java.lang.Object> field6 = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n\t@java.lang.SuppressWarnings({\"all\", \"unchecked\"})\n\t@lombok.Generated\n\tpublic String getField1() {\n\t\tjava.lang.Object $value = this.field1.get();\n\t\tif ($value == null) {\n\t\t\tsynchronized (this.field1) {\n\t\t\t\t$value = this.field1.get();\n\t\t\t\tif ($value == null) {\n\t\t\t\t\tfinal String actualValue = stringInt((\"a\"), (1));\n\t\t\t\t\t$value = actualValue == null ? this.field1 : actualValue;\n\t\t\t\t\tthis.field1.set($value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn (String) ($value == this.field1 ? null : $value);\n\t}\n\t@java.lang.SuppressWarnings({\"all\", \"unchecked\"})\n\t@lombok.Generated\n\tpublic String getField2() {\n\t\tjava.lang.Object $value = this.field2.get();\n\t\tif ($value == null) {\n\t\t\tsynchronized (this.field2) {\n\t\t\t\t$value = this.field2.get();\n\t\t\t\tif ($value == null) {\n\t\t\t\t\tfinal String actualValue = stringInt(true ? \"a\" : \"b\", true ? 1 : 0);\n\t\t\t\t\t$value = actualValue == null ? this.field2 : actualValue;\n\t\t\t\t\tthis.field2.set($value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn (String) ($value == this.field2 ? null : $value);\n\t}\n\t@java.lang.SuppressWarnings({\"all\", \"unchecked\"})\n\t@lombok.Generated\n\tpublic String getField3() {\n\t\tjava.lang.Object $value = this.field3.get();\n\t\tif ($value == null) {\n\t\t\tsynchronized (this.field3) {\n\t\t\t\t$value = this.field3.get();\n\t\t\t\tif ($value == null) {\n\t\t\t\t\tfinal String actualValue = stringInt((\"a\"), true ? 1 : 0);\n\t\t\t\t\t$value = actualValue == null ? this.field3 : actualValue;\n\t\t\t\t\tthis.field3.set($value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn (String) ($value == this.field3 ? null : $value);\n\t}\n\t@java.lang.SuppressWarnings({\"all\", \"unchecked\"})\n\t@lombok.Generated\n\tpublic String getField4() {\n\t\tjava.lang.Object $value = this.field4.get();\n\t\tif ($value == null) {\n\t\t\tsynchronized (this.field4) {\n\t\t\t\t$value = this.field4.get();\n\t\t\t\tif ($value == null) {\n\t\t\t\t\tfinal String actualValue = stringRunnable(fun(), () -> {\n\t\t\t\t\t});\n\t\t\t\t\t$value = actualValue == null ? this.field4 : actualValue;\n\t\t\t\t\tthis.field4.set($value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn (String) ($value == this.field4 ? null : $value);\n\t}\n\t@java.lang.SuppressWarnings({\"all\", \"unchecked\"})\n\t@lombok.Generated\n\tpublic String getField5() {\n\t\tjava.lang.Object $value = this.field5.get();\n\t\tif ($value == null) {\n\t\t\tsynchronized (this.field5) {\n\t\t\t\t$value = this.field5.get();\n\t\t\t\tif ($value == null) {\n\t\t\t\t\tfinal String actualValue = stringRunnable((\"a\"), () -> {\n\t\t\t\t\t});\n\t\t\t\t\t$value = actualValue == null ? this.field5 : actualValue;\n\t\t\t\t\tthis.field5.set($value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn (String) ($value == this.field5 ? null : $value);\n\t}\n\t@java.lang.SuppressWarnings({\"all\", \"unchecked\"})\n\t@lombok.Generated\n\tpublic String getField6() {\n\t\tjava.lang.Object $value = this.field6.get();\n\t\tif ($value == null) {\n\t\t\tsynchronized (this.field6) {\n\t\t\t\t$value = this.field6.get();\n\t\t\t\tif ($value == null) {\n\t\t\t\t\tfinal String actualValue = true ? stringInt(true ? \"a\" : \"b\", true ? 1 : 0) : \"\";\n\t\t\t\t\t$value = actualValue == null ? this.field6 : actualValue;\n\t\t\t\t\tthis.field6.set($value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn (String) ($value == this.field6 ? null : $value);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterLazyBoolean.java",
    "content": "class GetterLazyBoolean {\n\tprivate final java.util.concurrent.atomic.AtomicReference<java.lang.Object> booleanValue = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n\tprivate final java.util.concurrent.atomic.AtomicReference<java.lang.Object> otherBooleanValue = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n\tprivate static boolean calculateBoolean() {\n\t\treturn true;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof GetterLazyBoolean)) return false;\n\t\tfinal GetterLazyBoolean other = (GetterLazyBoolean) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (this.isBooleanValue() != other.isBooleanValue()) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof GetterLazyBoolean;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + (this.isBooleanValue() ? 79 : 97);\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"GetterLazyBoolean(booleanValue=\" + this.isBooleanValue() + \")\";\n\t}\n\t@java.lang.SuppressWarnings({\"all\", \"unchecked\"})\n\t@lombok.Generated\n\tpublic boolean isBooleanValue() {\n\t\tjava.lang.Object $value = this.booleanValue.get();\n\t\tif ($value == null) {\n\t\t\tsynchronized (this.booleanValue) {\n\t\t\t\t$value = this.booleanValue.get();\n\t\t\t\tif ($value == null) {\n\t\t\t\t\tfinal boolean actualValue = calculateBoolean();\n\t\t\t\t\t$value = actualValue;\n\t\t\t\t\tthis.booleanValue.set($value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn (java.lang.Boolean) $value;\n\t}\n\t@java.lang.SuppressWarnings({\"all\", \"unchecked\"})\n\t@lombok.Generated\n\tpublic boolean isOtherBooleanValue() {\n\t\tjava.lang.Object $value = this.otherBooleanValue.get();\n\t\tif ($value == null) {\n\t\t\tsynchronized (this.otherBooleanValue) {\n\t\t\t\t$value = this.otherBooleanValue.get();\n\t\t\t\tif ($value == null) {\n\t\t\t\t\tfinal boolean actualValue = !calculateBoolean();\n\t\t\t\t\t$value = actualValue;\n\t\t\t\t\tthis.otherBooleanValue.set($value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn (java.lang.Boolean) $value;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterLazyEahcToString.java",
    "content": "class GetterLazyEahcToString {\n\tprivate final java.util.concurrent.atomic.AtomicReference<java.lang.Object> value = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n\tprivate final String value2 = \"\";\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof GetterLazyEahcToString)) return false;\n\t\tfinal GetterLazyEahcToString other = (GetterLazyEahcToString) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tfinal java.lang.Object this$value = this.getValue();\n\t\tfinal java.lang.Object other$value = other.getValue();\n\t\tif (this$value == null ? other$value != null : !this$value.equals(other$value)) return false;\n\t\tfinal java.lang.Object this$value2 = this.value2;\n\t\tfinal java.lang.Object other$value2 = other.value2;\n\t\tif (this$value2 == null ? other$value2 != null : !this$value2.equals(other$value2)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof GetterLazyEahcToString;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tfinal java.lang.Object $value = this.getValue();\n\t\tresult = result * PRIME + ($value == null ? 43 : $value.hashCode());\n\t\tfinal java.lang.Object $value2 = this.value2;\n\t\tresult = result * PRIME + ($value2 == null ? 43 : $value2.hashCode());\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"GetterLazyEahcToString(value=\" + this.getValue() + \", value2=\" + this.value2 + \")\";\n\t}\n\t@java.lang.SuppressWarnings({\"all\", \"unchecked\"})\n\t@lombok.Generated\n\tpublic String getValue() {\n\t\tjava.lang.Object $value = this.value.get();\n\t\tif ($value == null) {\n\t\t\tsynchronized (this.value) {\n\t\t\t\t$value = this.value.get();\n\t\t\t\tif ($value == null) {\n\t\t\t\t\tfinal String actualValue = \"\";\n\t\t\t\t\t$value = actualValue == null ? this.value : actualValue;\n\t\t\t\t\tthis.value.set($value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn (String) ($value == this.value ? null : $value);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getValue2() {\n\t\treturn this.value2;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterLazyErrorPosition.java",
    "content": "class GetterLazyErrorPosition {\n\tprivate final java.util.concurrent.atomic.AtomicReference<java.lang.Object> field = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n\t@java.lang.SuppressWarnings({\"all\", \"unchecked\"})\n\t@lombok.Generated\n\tpublic String getField() {\n\t\tjava.lang.Object $value = this.field.get();\n\t\tif ($value == null) {\n\t\t\tsynchronized (this.field) {\n\t\t\t\t$value = this.field.get();\n\t\t\t\tif ($value == null) {\n\t\t\t\t\tfinal String actualValue = true ? \"\" : new ErrorPosition();\n\t\t\t\t\t$value = actualValue == null ? this.field : actualValue;\n\t\t\t\t\tthis.field.set($value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn (String) ($value == this.field ? null : $value);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterLazyGenerics.java",
    "content": "class GetterLazyGenerics<E> {\n\tprivate final java.util.concurrent.atomic.AtomicReference<java.lang.Object> field = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n\tprivate final java.util.concurrent.atomic.AtomicReference<java.lang.Object> field2 = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n\tpublic static <E> E getAny() {\n\t\treturn null;\n\t}\n\t@java.lang.SuppressWarnings({\"all\", \"unchecked\"})\n\t@lombok.Generated\n\tpublic E getField() {\n\t\tjava.lang.Object $value = this.field.get();\n\t\tif ($value == null) {\n\t\t\tsynchronized (this.field) {\n\t\t\t\t$value = this.field.get();\n\t\t\t\tif ($value == null) {\n\t\t\t\t\tfinal E actualValue = getAny();\n\t\t\t\t\t$value = actualValue == null ? this.field : actualValue;\n\t\t\t\t\tthis.field.set($value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn (E) ($value == this.field ? null : $value);\n\t}\n\t@java.lang.SuppressWarnings({\"all\", \"unchecked\"})\n\t@lombok.Generated\n\tpublic long getField2() {\n\t\tjava.lang.Object $value = this.field2.get();\n\t\tif ($value == null) {\n\t\t\tsynchronized (this.field2) {\n\t\t\t\t$value = this.field2.get();\n\t\t\t\tif ($value == null) {\n\t\t\t\t\tfinal long actualValue = System.currentTimeMillis();\n\t\t\t\t\t$value = actualValue;\n\t\t\t\t\tthis.field2.set($value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn (java.lang.Long) $value;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterLazyInAnonymousClass.java",
    "content": "public class GetterLazyInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\tclass Inner {\n\t\t\tprivate final java.util.concurrent.atomic.AtomicReference<java.lang.Object> string = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n\t\t\t@java.lang.SuppressWarnings({\"all\", \"unchecked\"})\n\t\t\t@lombok.Generated\n\t\t\tpublic String getString() {\n\t\t\t\tjava.lang.Object $value = this.string.get();\n\t\t\t\tif ($value == null) {\n\t\t\t\t\tsynchronized (this.string) {\n\t\t\t\t\t\t$value = this.string.get();\n\t\t\t\t\t\tif ($value == null) {\n\t\t\t\t\t\t\tfinal String actualValue = \"test\";\n\t\t\t\t\t\t\t$value = actualValue == null ? this.string : actualValue;\n\t\t\t\t\t\t\tthis.string.set($value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn (String) ($value == this.string ? null : $value);\n\t\t\t}\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterLazyInvalid.java",
    "content": "class GetterLazyInvalidNotFinal {\n\tprivate String fieldName = \"\";\n}\nclass GetterLazyInvalidNotPrivate {\n\tfinal String fieldName = \"\";\n}\nclass GetterLazyInvalidNotPrivateFinal {\n\tString fieldName = \"\";\n}\nclass GetterLazyInvalidNone {\n\tprivate final String fieldName = \"\";\n}\nclass GetterLazyInvalidClass {\n\tprivate final String fieldName = \"\";\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getFieldName() {\n\t\treturn this.fieldName;\n\t}\n}\nclass GetterLazyInvalidNoInit {\n\tprivate final String fieldName;\n\tGetterLazyInvalidNoInit() {\n\t\tthis.fieldName = \"foo\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterLazyNative.java",
    "content": "class GetterLazyNative {\n\tprivate final java.util.concurrent.atomic.AtomicReference<java.lang.Object> booleanField = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n\tprivate final java.util.concurrent.atomic.AtomicReference<java.lang.Object> byteField = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n\tprivate final java.util.concurrent.atomic.AtomicReference<java.lang.Object> shortField = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n\tprivate final java.util.concurrent.atomic.AtomicReference<java.lang.Object> intField = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n\tprivate final java.util.concurrent.atomic.AtomicReference<java.lang.Object> longField = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n\tprivate final java.util.concurrent.atomic.AtomicReference<java.lang.Object> floatField = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n\tprivate final java.util.concurrent.atomic.AtomicReference<java.lang.Object> doubleField = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n\tprivate final java.util.concurrent.atomic.AtomicReference<java.lang.Object> charField = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n\tprivate final java.util.concurrent.atomic.AtomicReference<java.lang.Object> intArrayField = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n\t@java.lang.SuppressWarnings({\"all\", \"unchecked\"})\n\t@lombok.Generated\n\tpublic boolean isBooleanField() {\n\t\tjava.lang.Object $value = this.booleanField.get();\n\t\tif ($value == null) {\n\t\t\tsynchronized (this.booleanField) {\n\t\t\t\t$value = this.booleanField.get();\n\t\t\t\tif ($value == null) {\n\t\t\t\t\tfinal boolean actualValue = true;\n\t\t\t\t\t$value = actualValue;\n\t\t\t\t\tthis.booleanField.set($value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn (java.lang.Boolean) $value;\n\t}\n\t@java.lang.SuppressWarnings({\"all\", \"unchecked\"})\n\t@lombok.Generated\n\tpublic byte getByteField() {\n\t\tjava.lang.Object $value = this.byteField.get();\n\t\tif ($value == null) {\n\t\t\tsynchronized (this.byteField) {\n\t\t\t\t$value = this.byteField.get();\n\t\t\t\tif ($value == null) {\n\t\t\t\t\tfinal byte actualValue = 1;\n\t\t\t\t\t$value = actualValue;\n\t\t\t\t\tthis.byteField.set($value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn (java.lang.Byte) $value;\n\t}\n\t@java.lang.SuppressWarnings({\"all\", \"unchecked\"})\n\t@lombok.Generated\n\tpublic short getShortField() {\n\t\tjava.lang.Object $value = this.shortField.get();\n\t\tif ($value == null) {\n\t\t\tsynchronized (this.shortField) {\n\t\t\t\t$value = this.shortField.get();\n\t\t\t\tif ($value == null) {\n\t\t\t\t\tfinal short actualValue = 1;\n\t\t\t\t\t$value = actualValue;\n\t\t\t\t\tthis.shortField.set($value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn (java.lang.Short) $value;\n\t}\n\t@java.lang.SuppressWarnings({\"all\", \"unchecked\"})\n\t@lombok.Generated\n\tpublic int getIntField() {\n\t\tjava.lang.Object $value = this.intField.get();\n\t\tif ($value == null) {\n\t\t\tsynchronized (this.intField) {\n\t\t\t\t$value = this.intField.get();\n\t\t\t\tif ($value == null) {\n\t\t\t\t\tfinal int actualValue = 1;\n\t\t\t\t\t$value = actualValue;\n\t\t\t\t\tthis.intField.set($value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn (java.lang.Integer) $value;\n\t}\n\t@java.lang.SuppressWarnings({\"all\", \"unchecked\"})\n\t@lombok.Generated\n\tpublic long getLongField() {\n\t\tjava.lang.Object $value = this.longField.get();\n\t\tif ($value == null) {\n\t\t\tsynchronized (this.longField) {\n\t\t\t\t$value = this.longField.get();\n\t\t\t\tif ($value == null) {\n\t\t\t\t\tfinal long actualValue = 1;\n\t\t\t\t\t$value = actualValue;\n\t\t\t\t\tthis.longField.set($value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn (java.lang.Long) $value;\n\t}\n\t@java.lang.SuppressWarnings({\"all\", \"unchecked\"})\n\t@lombok.Generated\n\tpublic float getFloatField() {\n\t\tjava.lang.Object $value = this.floatField.get();\n\t\tif ($value == null) {\n\t\t\tsynchronized (this.floatField) {\n\t\t\t\t$value = this.floatField.get();\n\t\t\t\tif ($value == null) {\n\t\t\t\t\tfinal float actualValue = 1.0F;\n\t\t\t\t\t$value = actualValue;\n\t\t\t\t\tthis.floatField.set($value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn (java.lang.Float) $value;\n\t}\n\t@java.lang.SuppressWarnings({\"all\", \"unchecked\"})\n\t@lombok.Generated\n\tpublic double getDoubleField() {\n\t\tjava.lang.Object $value = this.doubleField.get();\n\t\tif ($value == null) {\n\t\t\tsynchronized (this.doubleField) {\n\t\t\t\t$value = this.doubleField.get();\n\t\t\t\tif ($value == null) {\n\t\t\t\t\tfinal double actualValue = 1.0;\n\t\t\t\t\t$value = actualValue;\n\t\t\t\t\tthis.doubleField.set($value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn (java.lang.Double) $value;\n\t}\n\t@java.lang.SuppressWarnings({\"all\", \"unchecked\"})\n\t@lombok.Generated\n\tpublic char getCharField() {\n\t\tjava.lang.Object $value = this.charField.get();\n\t\tif ($value == null) {\n\t\t\tsynchronized (this.charField) {\n\t\t\t\t$value = this.charField.get();\n\t\t\t\tif ($value == null) {\n\t\t\t\t\tfinal char actualValue = '1';\n\t\t\t\t\t$value = actualValue;\n\t\t\t\t\tthis.charField.set($value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn (java.lang.Character) $value;\n\t}\n\t@java.lang.SuppressWarnings({\"all\", \"unchecked\"})\n\t@lombok.Generated\n\tpublic int[] getIntArrayField() {\n\t\tjava.lang.Object $value = this.intArrayField.get();\n\t\tif ($value == null) {\n\t\t\tsynchronized (this.intArrayField) {\n\t\t\t\t$value = this.intArrayField.get();\n\t\t\t\tif ($value == null) {\n\t\t\t\t\tfinal int[] actualValue = new int[] {1};\n\t\t\t\t\t$value = actualValue == null ? this.intArrayField : actualValue;\n\t\t\t\t\tthis.intArrayField.set($value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn (int[]) ($value == this.intArrayField ? null : $value);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterLazyTransient.java",
    "content": "class GetterLazyTransient {\n\tprivate final java.util.concurrent.atomic.AtomicReference<java.lang.Object> nonTransientField = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n\tprivate final transient int transientField = 2;\n\tprivate final transient int nonLazyTransientField = 3;\n\t@java.lang.SuppressWarnings({\"all\", \"unchecked\"})\n\t@lombok.Generated\n\tpublic int getNonTransientField() {\n\t\tjava.lang.Object $value = this.nonTransientField.get();\n\t\tif ($value == null) {\n\t\t\tsynchronized (this.nonTransientField) {\n\t\t\t\t$value = this.nonTransientField.get();\n\t\t\t\tif ($value == null) {\n\t\t\t\t\tfinal int actualValue = 1;\n\t\t\t\t\t$value = actualValue;\n\t\t\t\t\tthis.nonTransientField.set($value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn (java.lang.Integer) $value;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getNonLazyTransientField() {\n\t\treturn this.nonLazyTransientField;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterNone.java",
    "content": "class GetterNone {\n\tint i;\n\tint foo;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getI() {\n\t\treturn this.i;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterOnClass.java",
    "content": "//version 8:\nclass GetterOnClass1 {\n\tboolean isNone;\n\tboolean isPublic;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean isPublic() {\n\t\treturn this.isPublic;\n\t}\n}\nclass GetterOnClass2 {\n\tboolean isNone;\n\tboolean isProtected;\n\tboolean isPackage;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean isProtected() {\n\t\treturn this.isProtected;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tboolean isPackage() {\n\t\treturn this.isPackage;\n\t}\n}\nclass GetterOnClass3 {\n\tboolean isNone;\n\tboolean isPackage;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tboolean isPackage() {\n\t\treturn this.isPackage;\n\t}\n}\nclass GetterOnClass4 {\n\tboolean isNone;\n\tboolean isPrivate;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate boolean isPrivate() {\n\t\treturn this.isPrivate;\n\t}\n}\nclass GetterOnClass5 {\n\tboolean isNone;\n\tboolean isPublic;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean isPublic() {\n\t\treturn this.isPublic;\n\t}\n}\nclass GetterOnClass6 {\n\tString couldBeNull;\n\t@lombok.NonNull\n\tString nonNull;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getCouldBeNull() {\n\t\treturn this.couldBeNull;\n\t}\n\t@lombok.NonNull\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getNonNull() {\n\t\treturn this.nonNull;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterOnMethod.java",
    "content": "class GetterOnMethod {\n\tint i;\n\tint j;\n\tint k;\n\tpublic @interface Test {\n\t}\n\t@Deprecated\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getI() {\n\t\treturn this.i;\n\t}\n\t@java.lang.Deprecated\n\t@Test\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getJ() {\n\t\treturn this.j;\n\t}\n\t@java.lang.Deprecated\n\t@Test\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getK() {\n\t\treturn this.k;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterOnMethodErrors2.java",
    "content": "class GetterOnMethodErrors2 {\n\tprivate int bad1;\n\tprivate int bad2;\n\tprivate int bad3;\n\tprivate int bad4;\n\tprivate int good1;\n\tprivate int good2;\n\tprivate int good3;\n\tprivate int good4;\n\tpublic @interface Test {\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getBad1() {\n\t\treturn this.bad1;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getBad2() {\n\t\treturn this.bad2;\n\t}\n\t@Deprecated\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getBad3() {\n\t\treturn this.bad3;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getBad4() {\n\t\treturn this.bad4;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getGood1() {\n\t\treturn this.good1;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getGood2() {\n\t\treturn this.good2;\n\t}\n\t@Deprecated\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getGood3() {\n\t\treturn this.good3;\n\t}\n\t@Deprecated\n\t@Test\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getGood4() {\n\t\treturn this.good4;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterOnMethodOnType.java",
    "content": "class GetterOnMethodOnType {\n\tprivate int test;\n\tprivate String name;\n\t@Deprecated\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getTest() {\n\t\treturn this.test;\n\t}\n\t@Deprecated\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getName() {\n\t\treturn this.name;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterOnRecord.java",
    "content": "// version 14:\npublic record GetterOnRecord(String a, String b) {\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterOnStatic.java",
    "content": "class Getter {\n\tstatic boolean foo;\n\tstatic int bar;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static boolean isFoo() {\n\t\treturn Getter.foo;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static int getBar() {\n\t\treturn Getter.bar;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterPlain.java",
    "content": "class GetterPlain {\n\tint i;\n\tint foo;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getI() {\n\t\treturn this.i;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getFoo() {\n\t\treturn this.foo;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterSetterJavadoc.java",
    "content": "class GetterSetterJavadoc1 {\n\t/**\n\t * Some text\n\t */\n\tprivate int fieldName;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic GetterSetterJavadoc1() {\n\t}\n\t/**\n\t * Getter section\n\t *\n\t * @return Sky is blue1\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getFieldName() {\n\t\treturn this.fieldName;\n\t}\n\t/**\n\t * Some text\n\t *\n\t * @param fieldName Hello, World1\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setFieldName(final int fieldName) {\n\t\tthis.fieldName = fieldName;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof GetterSetterJavadoc1)) return false;\n\t\tfinal GetterSetterJavadoc1 other = (GetterSetterJavadoc1) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (this.getFieldName() != other.getFieldName()) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof GetterSetterJavadoc1;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.getFieldName();\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"GetterSetterJavadoc1(fieldName=\" + this.getFieldName() + \")\";\n\t}\n}\nclass GetterSetterJavadoc2 {\n\t/**\n\t * Some text\n\t */\n\tprivate int fieldName;\n\t/**\n\t * Some text\n\t *\n\t * @return Sky is blue2\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getFieldName() {\n\t\treturn this.fieldName;\n\t}\n\t/**\n\t * Some text\n\t *\n\t * @param fieldName Hello, World2\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setFieldName(final int fieldName) {\n\t\tthis.fieldName = fieldName;\n\t}\n}\nclass GetterSetterJavadoc3 {\n\t/**\n\t * Some text\n\t */\n\tprivate int fieldName;\n\t/**\n\t * Getter section\n\t * @return Sky is blue3\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getFieldName() {\n\t\treturn this.fieldName;\n\t}\n\t/**\n\t * Setter section\n\t * @param fieldName Hello, World3\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setFieldName(final int fieldName) {\n\t\tthis.fieldName = fieldName;\n\t}\n}\nclass GetterSetterJavadoc4 {\n\t/**\n\t * Some text\n\t */\n\tprivate int fieldName;\n\t/**\n\t * Some text\n\t *\n\t * @return Sky is blue4\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int fieldName() {\n\t\treturn this.fieldName;\n\t}\n\t/**\n\t * Some text\n\t *\n\t * @param fieldName Hello, World4\n\t * @return {@code this}.\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic GetterSetterJavadoc4 fieldName(final int fieldName) {\n\t\tthis.fieldName = fieldName;\n\t\treturn this;\n\t}\n}\nclass GetterSetterJavadoc5 {\n\t/**\n\t * Some text\n\t */\n\tprivate int fieldName;\n\t/**\n\t * Getter section\n\t * @return Sky is blue5\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int fieldName() {\n\t\treturn this.fieldName;\n\t}\n\t/**\n\t * Setter section\n\t * @param fieldName Hello, World5\n\t * @return Sky is blue5\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic GetterSetterJavadoc5 fieldName(final int fieldName) {\n\t\tthis.fieldName = fieldName;\n\t\treturn this;\n\t}\n}\nclass GetterSetterJavadocLong {\n\t/**\n\t * This field represents the unique identifier for a user in the system. It is used \n\t * throughout the application to uniquely identify and retrieve user-related data. \n\t * The ID is typically generated by the database and is guaranteed to be unique \n\t * within the context of the system. \n\t * \n\t * <p>The ID is an integral part of various operations, including but not limited to:\n\t * <ul>\n\t *   <li>Authenticating users during login processes.</li>\n\t *   <li>Associating user-specific preferences and settings.</li>\n\t *   <li>Tracking user activity and logs for auditing purposes.</li>\n\t *   <li>Facilitating relationships between users and other entities such as orders,\n\t *       messages, or roles within the system.</li>\n\t * </ul>\n\t * \n\t * <p>Key characteristics of the {@code userId} field:\n\t * <ul>\n\t *   <li><strong>Immutability:</strong> Once assigned, the ID must not be modified to\n\t *       ensure data integrity.</li>\n\t *   <li><strong>Security:</strong> Access to this field should be controlled to prevent\n\t *       unauthorized modifications or data leakage.</li>\n\t *   <li><strong>Uniqueness:</strong> The ID must be unique within the system. For \n\t *       distributed systems, consider using GUIDs or UUIDs to avoid collisions.</li>\n\t * </ul>\n\t * \n\t * <p>Example usage:\n\t * <pre>\n\t *     User user = userService.getUserById(userId);\n\t *     if (user != null) {\n\t *         System.out.println(\"User found: \" + user.getName());\n\t *     } else {\n\t *         System.out.println(\"User not found.\");\n\t *     }\n\t * </pre>\n\t * \n\t * <p>Developers should ensure that the ID complies with constraints imposed by the \n\t * database schema, such as length and format restrictions. Furthermore, it is \n\t * recommended to validate the ID before persisting or using it in critical operations.\n\t * \n\t * <p>For methods or constructors that accept the {@code userId} as a parameter, the \n\t * following guidelines should be followed:\n\t * <ul>\n\t *   <li>Validate the format of the ID to ensure it adheres to system requirements.</li>\n\t *   <li>Handle null or empty values gracefully, providing appropriate error messages\n\t *       or default behavior where necessary.</li>\n\t * </ul>\n\t */\n\tprivate String userId;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic GetterSetterJavadocLong() {\n\t}\n\t/**\n\t * This field represents the unique identifier for a user in the system. It is used \n\t * throughout the application to uniquely identify and retrieve user-related data. \n\t * The ID is typically generated by the database and is guaranteed to be unique \n\t * within the context of the system. \n\t * \n\t * <p>The ID is an integral part of various operations, including but not limited to:\n\t * <ul>\n\t *   <li>Authenticating users during login processes.</li>\n\t *   <li>Associating user-specific preferences and settings.</li>\n\t *   <li>Tracking user activity and logs for auditing purposes.</li>\n\t *   <li>Facilitating relationships between users and other entities such as orders,\n\t *       messages, or roles within the system.</li>\n\t * </ul>\n\t * \n\t * <p>Key characteristics of the {@code userId} field:\n\t * <ul>\n\t *   <li><strong>Immutability:</strong> Once assigned, the ID must not be modified to\n\t *       ensure data integrity.</li>\n\t *   <li><strong>Security:</strong> Access to this field should be controlled to prevent\n\t *       unauthorized modifications or data leakage.</li>\n\t *   <li><strong>Uniqueness:</strong> The ID must be unique within the system. For \n\t *       distributed systems, consider using GUIDs or UUIDs to avoid collisions.</li>\n\t * </ul>\n\t * \n\t * <p>Example usage:\n\t * <pre>\n\t *     User user = userService.getUserById(userId);\n\t *     if (user != null) {\n\t *         System.out.println(\"User found: \" + user.getName());\n\t *     } else {\n\t *         System.out.println(\"User not found.\");\n\t *     }\n\t * </pre>\n\t * \n\t * <p>Developers should ensure that the ID complies with constraints imposed by the \n\t * database schema, such as length and format restrictions. Furthermore, it is \n\t * recommended to validate the ID before persisting or using it in critical operations.\n\t * \n\t * <p>For methods or constructors that accept the {@code userId} as a parameter, the \n\t * following guidelines should be followed:\n\t * <ul>\n\t *   <li>Validate the format of the ID to ensure it adheres to system requirements.</li>\n\t *   <li>Handle null or empty values gracefully, providing appropriate error messages\n\t *       or default behavior where necessary.</li>\n\t * </ul>\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getUserId() {\n\t\treturn this.userId;\n\t}\n\t/**\n\t * This field represents the unique identifier for a user in the system. It is used \n\t * throughout the application to uniquely identify and retrieve user-related data. \n\t * The ID is typically generated by the database and is guaranteed to be unique \n\t * within the context of the system. \n\t * \n\t * <p>The ID is an integral part of various operations, including but not limited to:\n\t * <ul>\n\t *   <li>Authenticating users during login processes.</li>\n\t *   <li>Associating user-specific preferences and settings.</li>\n\t *   <li>Tracking user activity and logs for auditing purposes.</li>\n\t *   <li>Facilitating relationships between users and other entities such as orders,\n\t *       messages, or roles within the system.</li>\n\t * </ul>\n\t * \n\t * <p>Key characteristics of the {@code userId} field:\n\t * <ul>\n\t *   <li><strong>Immutability:</strong> Once assigned, the ID must not be modified to\n\t *       ensure data integrity.</li>\n\t *   <li><strong>Security:</strong> Access to this field should be controlled to prevent\n\t *       unauthorized modifications or data leakage.</li>\n\t *   <li><strong>Uniqueness:</strong> The ID must be unique within the system. For \n\t *       distributed systems, consider using GUIDs or UUIDs to avoid collisions.</li>\n\t * </ul>\n\t * \n\t * <p>Example usage:\n\t * <pre>\n\t *     User user = userService.getUserById(userId);\n\t *     if (user != null) {\n\t *         System.out.println(\"User found: \" + user.getName());\n\t *     } else {\n\t *         System.out.println(\"User not found.\");\n\t *     }\n\t * </pre>\n\t * \n\t * <p>Developers should ensure that the ID complies with constraints imposed by the \n\t * database schema, such as length and format restrictions. Furthermore, it is \n\t * recommended to validate the ID before persisting or using it in critical operations.\n\t * \n\t * <p>For methods or constructors that accept the {@code userId} as a parameter, the \n\t * following guidelines should be followed:\n\t * <ul>\n\t *   <li>Validate the format of the ID to ensure it adheres to system requirements.</li>\n\t *   <li>Handle null or empty values gracefully, providing appropriate error messages\n\t *       or default behavior where necessary.</li>\n\t * </ul>\n\t * \n\t * @param userId the unique identifier assigned to a user. This value must be non-null \n\t *               and conform to the format defined by the system. Passing a null or \n\t *               invalid ID may result in an {@link IllegalArgumentException} or \n\t *               similar error.\n\t * @param databaseConnection the connection to the database used for retrieving or \n\t *                           persisting the user ID. This parameter is required for \n\t *                           database-related operations and must be properly closed \n\t *                           after use to prevent resource leaks.\n\t * @param userRole the role associated with the user (e.g., \"admin\", \"user\", \"guest\"). \n\t *                 This parameter may influence access control and permissions \n\t *                 granted to the user within the system.\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setUserId(final String userId) {\n\t\tthis.userId = userId;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof GetterSetterJavadocLong)) return false;\n\t\tfinal GetterSetterJavadocLong other = (GetterSetterJavadocLong) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tfinal java.lang.Object this$userId = this.getUserId();\n\t\tfinal java.lang.Object other$userId = other.getUserId();\n\t\tif (this$userId == null ? other$userId != null : !this$userId.equals(other$userId)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof GetterSetterJavadocLong;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tfinal java.lang.Object $userId = this.getUserId();\n\t\tresult = result * PRIME + ($userId == null ? 43 : $userId.hashCode());\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"GetterSetterJavadocLong(userId=\" + this.getUserId() + \")\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterTypeAnnos.java",
    "content": "import java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.List;\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})\n@interface TA {\n}\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})\n@interface TB {\n}\nclass GetterTypeAnnos {\n\t@TA\n\t@TB\n\tList<String> foo;\n\t@TA\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic List<String> getFoo() {\n\t\treturn this.foo;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterWithDollar.java",
    "content": "class GetterWithDollar1 {\n\tint $i;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int get$i() {\n\t\treturn this.$i;\n\t}\n}\nclass GetterWithDollar2 {\n\tint $i;\n\tint i;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int get$i() {\n\t\treturn this.$i;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getI() {\n\t\treturn this.i;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/GetterWithJavaBeansSpecCapitalization.java",
    "content": "class GetterWithJavaBeansSpecCapitalization {\n\tint a;\n\tint aField;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getA() {\n\t\treturn this.a;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getaField() {\n\t\treturn this.aField;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/HelperInInitializationBlock.java",
    "content": "public class HelperInInitializationBlock {\n\t{\n\t\tfinal int z = 5;\n\t\tif (Boolean.TRUE) {\n\t\t\tclass H1 {\n\t\t\t\tvoid foo(int x) {\n\t\t\t\t\tSystem.out.println(\"Hello, \" + (x + z));\n\t\t\t\t}\n\t\t\t}\n\t\t\tfinal H1 $H1 = new H1();\n\t\t\t$H1.foo(10);\n\t\t\tclass H2 {\n\t\t\t\tvoid bar() {\n\t\t\t\t\t$H1.foo(12);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/HelperInMethod.java",
    "content": "public class HelperInMethod {\n\tint someMethod(int arg1) {\n\t\tfinal int localVar = 5;\n\n\t\tclass Helpers {\n\t\t\tint helperMethod(int arg) {\n\t\t\t\treturn arg + localVar;\n\t\t\t}\n\t\t}\n\t\tfinal Helpers $Helpers = new Helpers();\n\t\treturn $Helpers.helperMethod(10);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/I2335_BuilderMultipleObtainVia.java",
    "content": "public class I2335_BuilderMultipleObtainVia {\n\tprivate String theString;\n\tprivate Long theLong;\n\tpublic I2335_BuilderMultipleObtainVia(String theString, Long theLong) {\n\t\tsetTheString(theString);\n\t\tsetTheLong(theLong);\n\t}\n\tpublic String getTheString() {\n\t\treturn theString;\n\t}\n\tpublic Long getTheLong() {\n\t\treturn theLong;\n\t}\n\tpublic void setTheString(String theString) {\n\t\tthis.theString = theString;\n\t}\n\tpublic void setTheLong(Long theLong) {\n\t\tthis.theLong = theLong;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class I2335_BuilderMultipleObtainViaBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate String theString;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate Long theLong;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tI2335_BuilderMultipleObtainViaBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic I2335_BuilderMultipleObtainVia.I2335_BuilderMultipleObtainViaBuilder theString(final String theString) {\n\t\t\tthis.theString = theString;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic I2335_BuilderMultipleObtainVia.I2335_BuilderMultipleObtainViaBuilder theLong(final Long theLong) {\n\t\t\tthis.theLong = theLong;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic I2335_BuilderMultipleObtainVia build() {\n\t\t\treturn new I2335_BuilderMultipleObtainVia(this.theString, this.theLong);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"I2335_BuilderMultipleObtainVia.I2335_BuilderMultipleObtainViaBuilder(theString=\" + this.theString + \", theLong=\" + this.theLong + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static I2335_BuilderMultipleObtainVia.I2335_BuilderMultipleObtainViaBuilder builder() {\n\t\treturn new I2335_BuilderMultipleObtainVia.I2335_BuilderMultipleObtainViaBuilder();\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic I2335_BuilderMultipleObtainVia.I2335_BuilderMultipleObtainViaBuilder toBuilder() {\n\t\tfinal String theString = this.getTheString();\n\t\tfinal Long theLong = this.getTheLong();\n\t\treturn new I2335_BuilderMultipleObtainVia.I2335_BuilderMultipleObtainViaBuilder().theString(theString).theLong(theLong);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/InjectField.java",
    "content": "import java.util.logging.Level;\nenum InjectField1 {\n\tA, B;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(InjectField1.class.getName());\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate final java.lang.Object $lock = new java.lang.Object[0];\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final java.lang.Object $LOCK = new java.lang.Object[0];\n\tprivate static final String LOG_MESSAGE = \"static initializer\";\n\tprivate String fieldA;\n\tstatic {\n\t\tlog.log(Level.FINE, LOG_MESSAGE);\n\t}\n\tprivate String fieldB;\n\tvoid generateLockField() {\n\t\tsynchronized (this.$lock) {\n\t\t\tSystem.out.println(\"lock field\");\n\t\t}\n\t}\n\tstatic void generateStaticLockField() {\n\t\tsynchronized (InjectField1.$LOCK) {\n\t\t\tSystem.out.println(\"static lock field\");\n\t\t}\n\t}\n}\nclass InjectField2 {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(InjectField2.class.getName());\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate final java.lang.Object $lock = new java.lang.Object[0];\n\tprivate static final String LOG_MESSAGE = \"static initializer\";\n\tstatic {\n\t\tlog.log(Level.FINE, LOG_MESSAGE);\n\t}\n\tvoid generateLockField() {\n\t\tsynchronized (this.$lock) {\n\t\t\tSystem.out.println(\"lock field\");\n\t\t}\n\t}\n}\nclass InjectField3 {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(InjectField3.class.getName());\n\tstatic {\n\t\tlog.log(Level.FINE, \"static initializer\");\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/InnerClass.java",
    "content": "//version 8:\nclass A {\n\tclass B {\n\t\tString s;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic B(final String s) {\n\t\t\tthis.s = s;\n\t\t}\n\t}\n}\nclass C {\n\tfinal class D {\n\t\tprivate final A a;\n\t\tA.B test(String s) {\n\t\t\treturn a.new B(s) {\n\t\t\t};\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic D(final A a) {\n\t\t\tthis.a = a;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic A getA() {\n\t\t\treturn this.a;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic boolean equals(final java.lang.Object o) {\n\t\t\tif (o == this) return true;\n\t\t\tif (!(o instanceof C.D)) return false;\n\t\t\tfinal C.D other = (C.D) o;\n\t\t\tfinal java.lang.Object this$a = this.getA();\n\t\t\tfinal java.lang.Object other$a = other.getA();\n\t\t\tif (this$a == null ? other$a != null : !this$a.equals(other$a)) return false;\n\t\t\treturn true;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic int hashCode() {\n\t\t\tfinal int PRIME = 59;\n\t\t\tint result = 1;\n\t\t\tfinal java.lang.Object $a = this.getA();\n\t\t\tresult = result * PRIME + ($a == null ? 43 : $a.hashCode());\n\t\t\treturn result;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"C.D(a=\" + this.getA() + \")\";\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/JacksonJsonProperty.java",
    "content": "//version 8: Jackson deps are at least Java7+.\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport com.fasterxml.jackson.annotation.JsonSetter;\nimport com.fasterxml.jackson.annotation.Nulls;\npublic class JacksonJsonProperty {\n\t@JsonProperty(\"kebab-case-prop\")\n\t@JsonSetter(nulls = Nulls.SKIP)\n\tpublic String kebabCaseProp;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tJacksonJsonProperty(final String kebabCaseProp) {\n\t\tthis.kebabCaseProp = kebabCaseProp;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class JacksonJsonPropertyBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate String kebabCaseProp;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tJacksonJsonPropertyBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@JsonProperty(\"kebab-case-prop\")\n\t\t@JsonSetter(nulls = Nulls.SKIP)\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonJsonProperty.JacksonJsonPropertyBuilder kebabCaseProp(final String kebabCaseProp) {\n\t\t\tthis.kebabCaseProp = kebabCaseProp;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonJsonProperty build() {\n\t\t\treturn new JacksonJsonProperty(this.kebabCaseProp);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"JacksonJsonProperty.JacksonJsonPropertyBuilder(kebabCaseProp=\" + this.kebabCaseProp + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static JacksonJsonProperty.JacksonJsonPropertyBuilder builder() {\n\t\treturn new JacksonJsonProperty.JacksonJsonPropertyBuilder();\n\t}\n\t@JsonProperty(\"kebab-case-prop\")\n\t@JsonSetter(nulls = Nulls.SKIP)\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setKebabCaseProp(final String kebabCaseProp) {\n\t\tthis.kebabCaseProp = kebabCaseProp;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/JacksonizedAccessors.java",
    "content": "public class JacksonizedAccessors {\n\t@com.fasterxml.jackson.annotation.JsonProperty(\"intValue\")\n\tprivate int intValue;\n\t@com.fasterxml.jackson.annotation.JsonProperty(\"intValue\")\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int intValue() {\n\t\treturn this.intValue;\n\t}\n\t/**\n\t * @return {@code this}.\n\t */\n\t@com.fasterxml.jackson.annotation.JsonProperty(\"intValue\")\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic JacksonizedAccessors intValue(final int intValue) {\n\t\tthis.intValue = intValue;\n\t\treturn this;\n\t}\n}"
  },
  {
    "path": "test/transform/resource/after-delombok/JacksonizedAccessorsTransient.java",
    "content": "public class JacksonizedAccessorsTransient {\n\t@com.fasterxml.jackson.annotation.JsonIgnore\n\tprivate transient int intValue;\n\t@com.fasterxml.jackson.annotation.JsonIgnore\n\tprivate transient long longValue;\n\t@com.fasterxml.jackson.annotation.JsonIgnore\n\tprivate double doubleValue;\n\n\t@com.fasterxml.jackson.annotation.JsonIgnore\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int intValue() {\n\t\treturn this.intValue;\n\t}\n\t\n\t@com.fasterxml.jackson.annotation.JsonIgnore\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic long longValue() {\n\t\treturn this.longValue;\n\t}\n\t\n\t@com.fasterxml.jackson.annotation.JsonIgnore\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic double doubleValue() {\n\t\treturn this.doubleValue;\n\t}\n\t\n\t/**\n\t * @return {@code this}.\n\t */\n\t@com.fasterxml.jackson.annotation.JsonIgnore\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic JacksonizedAccessorsTransient intValue(final int intValue) {\n\t\tthis.intValue = intValue;\n\t\treturn this;\n\t}\n\t\n\t/**\n\t * @return {@code this}.\n\t */\n\t@com.fasterxml.jackson.annotation.JsonIgnore\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic JacksonizedAccessorsTransient longValue(final long longValue) {\n\t\tthis.longValue = longValue;\n\t\treturn this;\n\t}\n\t\n\t/**\n\t * @return {@code this}.\n\t */\n\t@com.fasterxml.jackson.annotation.JsonIgnore\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic JacksonizedAccessorsTransient doubleValue(final double doubleValue) {\n\t\tthis.doubleValue = doubleValue;\n\t\treturn this;\n\t}\n}"
  },
  {
    "path": "test/transform/resource/after-delombok/JacksonizedBuilderComplex.java",
    "content": "//version 8: Jackson deps are at least Java7+.\n//CONF: lombok.builder.className = Test*Name\nimport java.util.List;\n@com.fasterxml.jackson.databind.annotation.JsonDeserialize(builder = JacksonizedBuilderComplex.TestVoidName.class)\n@tools.jackson.databind.annotation.JsonDeserialize(builder = JacksonizedBuilderComplex.TestVoidName.class)\nclass JacksonizedBuilderComplex {\n\tprivate static <T extends Number> void testVoidWithGenerics(T number, int arg2, String arg3, JacksonizedBuilderComplex selfRef) {\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\t@com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = \"with\", buildMethodName = \"execute\")\n\t@tools.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = \"with\", buildMethodName = \"execute\")\n\tpublic static class TestVoidName<T extends Number> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate T number;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int arg2;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate String arg3;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate JacksonizedBuilderComplex selfRef;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tTestVoidName() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonizedBuilderComplex.TestVoidName<T> withNumber(final T number) {\n\t\t\tthis.number = number;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonizedBuilderComplex.TestVoidName<T> withArg2(final int arg2) {\n\t\t\tthis.arg2 = arg2;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonizedBuilderComplex.TestVoidName<T> withArg3(final String arg3) {\n\t\t\tthis.arg3 = arg3;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonizedBuilderComplex.TestVoidName<T> withSelfRef(final JacksonizedBuilderComplex selfRef) {\n\t\t\tthis.selfRef = selfRef;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic void execute() {\n\t\t\tJacksonizedBuilderComplex.<T>testVoidWithGenerics(this.number, this.arg2, this.arg3, this.selfRef);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"JacksonizedBuilderComplex.TestVoidName(number=\" + this.number + \", arg2=\" + this.arg2 + \", arg3=\" + this.arg3 + \", selfRef=\" + this.selfRef + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static <T extends Number> JacksonizedBuilderComplex.TestVoidName<T> builder() {\n\t\treturn new JacksonizedBuilderComplex.TestVoidName<T>();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/JacksonizedBuilderSimple.java",
    "content": "//version 8: Jackson deps are at least Java7+.\nimport java.util.List;\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\n@JsonIgnoreProperties(ignoreUnknown = true)\n@com.fasterxml.jackson.databind.annotation.JsonDeserialize(builder = JacksonizedBuilderSimple.JacksonizedBuilderSimpleBuilder.class)\n@tools.jackson.databind.annotation.JsonDeserialize(builder = JacksonizedBuilderSimple.JacksonizedBuilderSimpleBuilder.class)\nclass JacksonizedBuilderSimple<T> {\n\tprivate final int noshow = 0;\n\tprivate final int yes;\n\tprivate List<T> also;\n\tprivate int $butNotMe;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tJacksonizedBuilderSimple(final int yes, final List<T> also) {\n\t\tthis.yes = yes;\n\t\tthis.also = also;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\t@JsonIgnoreProperties(ignoreUnknown = true)\n\t@com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = \"\", buildMethodName = \"build\")\n\t@tools.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = \"\", buildMethodName = \"build\")\n\tprotected static class JacksonizedBuilderSimpleBuilder<T> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int yes;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate List<T> also;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tJacksonizedBuilderSimpleBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonizedBuilderSimple.JacksonizedBuilderSimpleBuilder<T> yes(final int yes) {\n\t\t\tthis.yes = yes;\n\t\t\treturn this;\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonizedBuilderSimple.JacksonizedBuilderSimpleBuilder<T> also(final List<T> also) {\n\t\t\tthis.also = also;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonizedBuilderSimple<T> build() {\n\t\t\treturn new JacksonizedBuilderSimple<T>(this.yes, this.also);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"JacksonizedBuilderSimple.JacksonizedBuilderSimpleBuilder(yes=\" + this.yes + \", also=\" + this.also + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected static <T> JacksonizedBuilderSimple.JacksonizedBuilderSimpleBuilder<T> builder() {\n\t\treturn new JacksonizedBuilderSimple.JacksonizedBuilderSimpleBuilder<T>();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/JacksonizedBuilderSingular.java",
    "content": "//version 8: Jackson deps are at least Java7+.\nimport java.util.List;\nimport java.util.Map;\nimport com.fasterxml.jackson.annotation.JsonAnySetter;\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport com.google.common.collect.ImmutableList;\nimport com.google.common.collect.ImmutableMap;\n@com.fasterxml.jackson.databind.annotation.JsonDeserialize(builder = JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder.class)\n@tools.jackson.databind.annotation.JsonDeserialize(builder = JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder.class)\npublic class JacksonizedBuilderSingular {\n\t@JsonAnySetter\n\tprivate Map<String, Object> any;\n\t@JsonProperty(\"v_a_l_u_e_s\")\n\tprivate List<String> values;\n\t@JsonAnySetter\n\tprivate ImmutableMap<String, Object> guavaAny;\n\t@JsonProperty(\"guava_v_a_l_u_e_s\")\n\tprivate ImmutableList<String> guavaValues;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tJacksonizedBuilderSingular(final Map<String, Object> any, final List<String> values, final ImmutableMap<String, Object> guavaAny, final ImmutableList<String> guavaValues) {\n\t\tthis.any = any;\n\t\tthis.values = values;\n\t\tthis.guavaAny = guavaAny;\n\t\tthis.guavaValues = guavaValues;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\t@com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = \"\", buildMethodName = \"build\")\n\t@tools.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = \"\", buildMethodName = \"build\")\n\tpublic static class JacksonizedBuilderSingularBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<String> any$key;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<Object> any$value;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<String> values;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate com.google.common.collect.ImmutableMap.Builder<String, Object> guavaAny;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate com.google.common.collect.ImmutableList.Builder<String> guavaValues;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tJacksonizedBuilderSingularBuilder() {\n\t\t}\n\t\t@JsonAnySetter\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder any(final String anyKey, final Object anyValue) {\n\t\t\tif (this.any$key == null) {\n\t\t\t\tthis.any$key = new java.util.ArrayList<String>();\n\t\t\t\tthis.any$value = new java.util.ArrayList<Object>();\n\t\t\t}\n\t\t\tthis.any$key.add(anyKey);\n\t\t\tthis.any$value.add(anyValue);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder any(final java.util.Map<? extends String, ? extends Object> any) {\n\t\t\tif (any == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"any cannot be null\");\n\t\t\t}\n\t\t\tif (this.any$key == null) {\n\t\t\t\tthis.any$key = new java.util.ArrayList<String>();\n\t\t\t\tthis.any$value = new java.util.ArrayList<Object>();\n\t\t\t}\n\t\t\tfor (final java.util.Map.Entry<? extends String, ? extends Object> $lombokEntry : any.entrySet()) {\n\t\t\t\tthis.any$key.add($lombokEntry.getKey());\n\t\t\t\tthis.any$value.add($lombokEntry.getValue());\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder clearAny() {\n\t\t\tif (this.any$key != null) {\n\t\t\t\tthis.any$key.clear();\n\t\t\t\tthis.any$value.clear();\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder value(final String value) {\n\t\t\tif (this.values == null) this.values = new java.util.ArrayList<String>();\n\t\t\tthis.values.add(value);\n\t\t\treturn this;\n\t\t}\n\t\t@JsonProperty(\"v_a_l_u_e_s\")\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder values(final java.util.Collection<? extends String> values) {\n\t\t\tif (values == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"values cannot be null\");\n\t\t\t}\n\t\t\tif (this.values == null) this.values = new java.util.ArrayList<String>();\n\t\t\tthis.values.addAll(values);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder clearValues() {\n\t\t\tif (this.values != null) this.values.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@JsonAnySetter\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder guavaAny(final String key, final Object value) {\n\t\t\tif (this.guavaAny == null) this.guavaAny = com.google.common.collect.ImmutableMap.builder();\n\t\t\tthis.guavaAny.put(key, value);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder guavaAny(final java.util.Map<? extends String, ? extends Object> guavaAny) {\n\t\t\tif (guavaAny == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"guavaAny cannot be null\");\n\t\t\t}\n\t\t\tif (this.guavaAny == null) this.guavaAny = com.google.common.collect.ImmutableMap.builder();\n\t\t\tthis.guavaAny.putAll(guavaAny);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder clearGuavaAny() {\n\t\t\tthis.guavaAny = null;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder guavaValue(final String guavaValue) {\n\t\t\tif (this.guavaValues == null) this.guavaValues = com.google.common.collect.ImmutableList.builder();\n\t\t\tthis.guavaValues.add(guavaValue);\n\t\t\treturn this;\n\t\t}\n\t\t@JsonProperty(\"guava_v_a_l_u_e_s\")\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder guavaValues(final java.lang.Iterable<? extends String> guavaValues) {\n\t\t\tif (guavaValues == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"guavaValues cannot be null\");\n\t\t\t}\n\t\t\tif (this.guavaValues == null) this.guavaValues = com.google.common.collect.ImmutableList.builder();\n\t\t\tthis.guavaValues.addAll(guavaValues);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder clearGuavaValues() {\n\t\t\tthis.guavaValues = null;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonizedBuilderSingular build() {\n\t\t\tjava.util.Map<String, Object> any;\n\t\t\tswitch (this.any$key == null ? 0 : this.any$key.size()) {\n\t\t\tcase 0: \n\t\t\t\tany = java.util.Collections.emptyMap();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tany = java.util.Collections.singletonMap(this.any$key.get(0), this.any$value.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tany = new java.util.LinkedHashMap<String, Object>(this.any$key.size() < 1073741824 ? 1 + this.any$key.size() + (this.any$key.size() - 3) / 3 : java.lang.Integer.MAX_VALUE);\n\t\t\t\tfor (int $i = 0; $i < this.any$key.size(); $i++) any.put(this.any$key.get($i), (Object) this.any$value.get($i));\n\t\t\t\tany = java.util.Collections.unmodifiableMap(any);\n\t\t\t}\n\t\t\tjava.util.List<String> values;\n\t\t\tswitch (this.values == null ? 0 : this.values.size()) {\n\t\t\tcase 0: \n\t\t\t\tvalues = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tvalues = java.util.Collections.singletonList(this.values.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tvalues = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.values));\n\t\t\t}\n\t\t\tcom.google.common.collect.ImmutableMap<String, Object> guavaAny = this.guavaAny == null ? com.google.common.collect.ImmutableMap.<String, Object>of() : this.guavaAny.build();\n\t\t\tcom.google.common.collect.ImmutableList<String> guavaValues = this.guavaValues == null ? com.google.common.collect.ImmutableList.<String>of() : this.guavaValues.build();\n\t\t\treturn new JacksonizedBuilderSingular(any, values, guavaAny, guavaValues);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder(any$key=\" + this.any$key + \", any$value=\" + this.any$value + \", values=\" + this.values + \", guavaAny=\" + this.guavaAny + \", guavaValues=\" + this.guavaValues + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder builder() {\n\t\treturn new JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder();\n\t}\n}"
  },
  {
    "path": "test/transform/resource/after-delombok/JacksonizedNoConfigChoice.java",
    "content": "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(builder = JacksonizedNoConfigChoice.JacksonizedNoConfigChoiceBuilder.class)\npublic class JacksonizedNoConfigChoice {\n\tint field1;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tJacksonizedNoConfigChoice(final int field1) {\n\t\tthis.field1 = field1;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\t@com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = \"\", buildMethodName = \"build\")\n\tpublic static class JacksonizedNoConfigChoiceBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int field1;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tJacksonizedNoConfigChoiceBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonizedNoConfigChoice.JacksonizedNoConfigChoiceBuilder field1(final int field1) {\n\t\t\tthis.field1 = field1;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonizedNoConfigChoice build() {\n\t\t\treturn new JacksonizedNoConfigChoice(this.field1);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"JacksonizedNoConfigChoice.JacksonizedNoConfigChoiceBuilder(field1=\" + this.field1 + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static JacksonizedNoConfigChoice.JacksonizedNoConfigChoiceBuilder builder() {\n\t\treturn new JacksonizedNoConfigChoice.JacksonizedNoConfigChoiceBuilder();\n\t}\n}"
  },
  {
    "path": "test/transform/resource/after-delombok/JacksonizedOnRecord.java",
    "content": "//version 14:\nimport java.util.List;\nimport javax.annotation.Nullable;\nimport com.fasterxml.jackson.annotation.JsonAnySetter;\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimport com.fasterxml.jackson.annotation.JsonProperty;\n@JsonIgnoreProperties\n@com.fasterxml.jackson.databind.annotation.JsonDeserialize(builder = JacksonizedOnRecord.JacksonizedOnRecordBuilder.class)\n@tools.jackson.databind.annotation.JsonDeserialize(builder = JacksonizedOnRecord.JacksonizedOnRecordBuilder.class)\npublic record JacksonizedOnRecord(@JsonProperty(\"test\") @Nullable String string, @JsonAnySetter List<String> values) {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\t@JsonIgnoreProperties\n\t@com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = \"\", buildMethodName = \"build\")\n\t@tools.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = \"\", buildMethodName = \"build\")\n\tpublic static class JacksonizedOnRecordBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate String string;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<String> values;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tJacksonizedOnRecordBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@JsonProperty(\"test\")\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonizedOnRecord.JacksonizedOnRecordBuilder string(@Nullable final String string) {\n\t\t\tthis.string = string;\n\t\t\treturn this;\n\t\t}\n\t\t@JsonAnySetter\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonizedOnRecord.JacksonizedOnRecordBuilder value(final String value) {\n\t\t\tif (this.values == null) this.values = new java.util.ArrayList<String>();\n\t\t\tthis.values.add(value);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonizedOnRecord.JacksonizedOnRecordBuilder values(final java.util.Collection<? extends String> values) {\n\t\t\tif (values == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"values cannot be null\");\n\t\t\t}\n\t\t\tif (this.values == null) this.values = new java.util.ArrayList<String>();\n\t\t\tthis.values.addAll(values);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonizedOnRecord.JacksonizedOnRecordBuilder clearValues() {\n\t\t\tif (this.values != null) this.values.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonizedOnRecord build() {\n\t\t\tjava.util.List<String> values;\n\t\t\tswitch (this.values == null ? 0 : this.values.size()) {\n\t\t\tcase 0: \n\t\t\t\tvalues = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tvalues = java.util.Collections.singletonList(this.values.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tvalues = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.values));\n\t\t\t}\n\t\t\treturn new JacksonizedOnRecord(this.string, values);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"JacksonizedOnRecord.JacksonizedOnRecordBuilder(string=\" + this.string + \", values=\" + this.values + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static JacksonizedOnRecord.JacksonizedOnRecordBuilder builder() {\n\t\treturn new JacksonizedOnRecord.JacksonizedOnRecordBuilder();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/JacksonizedSuperBuilderSimple.java",
    "content": "//version 8: Jackson deps are at least Java7+.\npublic class JacksonizedSuperBuilderSimple {\n\t@com.fasterxml.jackson.annotation.JsonIgnoreProperties(ignoreUnknown = true)\n\t@com.fasterxml.jackson.databind.annotation.JsonDeserialize(builder = JacksonizedSuperBuilderSimple.Parent.ParentBuilderImpl.class)\n\t@tools.jackson.databind.annotation.JsonDeserialize(builder = JacksonizedSuperBuilderSimple.Parent.ParentBuilderImpl.class)\n\tpublic static class Parent {\n\t\tint field1;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ParentBuilder<C extends JacksonizedSuperBuilderSimple.Parent, B extends JacksonizedSuperBuilderSimple.Parent.ParentBuilder<C, B>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate int field1;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B field1(final int field1) {\n\t\t\t\tthis.field1 = field1;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"JacksonizedSuperBuilderSimple.Parent.ParentBuilder(field1=\" + this.field1 + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\t@com.fasterxml.jackson.annotation.JsonIgnoreProperties(ignoreUnknown = true)\n\t\t@com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = \"\", buildMethodName = \"build\")\n\t\t@tools.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = \"\", buildMethodName = \"build\")\n\t\tstatic final class ParentBuilderImpl extends JacksonizedSuperBuilderSimple.Parent.ParentBuilder<JacksonizedSuperBuilderSimple.Parent, JacksonizedSuperBuilderSimple.Parent.ParentBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ParentBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected JacksonizedSuperBuilderSimple.Parent.ParentBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic JacksonizedSuperBuilderSimple.Parent build() {\n\t\t\t\treturn new JacksonizedSuperBuilderSimple.Parent(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Parent(final JacksonizedSuperBuilderSimple.Parent.ParentBuilder<?, ?> b) {\n\t\t\tthis.field1 = b.field1;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static JacksonizedSuperBuilderSimple.Parent.ParentBuilder<?, ?> builder() {\n\t\t\treturn new JacksonizedSuperBuilderSimple.Parent.ParentBuilderImpl();\n\t\t}\n\t}\n\tpublic static void test() {\n\t\tParent x = Parent.builder().field1(5).build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/JacksonizedSuperBuilderWithJsonDeserialize.java",
    "content": "//skip-idempotent\n@com.fasterxml.jackson.databind.annotation.JsonDeserialize\npublic class JacksonizedSuperBuilderWithJsonDeserialize {\n\tint field1;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static abstract class JacksonizedSuperBuilderWithJsonDeserializeBuilder<C extends JacksonizedSuperBuilderWithJsonDeserialize, B extends JacksonizedSuperBuilderWithJsonDeserialize.JacksonizedSuperBuilderWithJsonDeserializeBuilder<C, B>> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int field1;\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic B field1(final int field1) {\n\t\t\tthis.field1 = field1;\n\t\t\treturn self();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected abstract B self();\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic abstract C build();\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"JacksonizedSuperBuilderWithJsonDeserialize.JacksonizedSuperBuilderWithJsonDeserializeBuilder(field1=\" + this.field1 + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final class JacksonizedSuperBuilderWithJsonDeserializeBuilderImpl extends JacksonizedSuperBuilderWithJsonDeserialize.JacksonizedSuperBuilderWithJsonDeserializeBuilder<JacksonizedSuperBuilderWithJsonDeserialize, JacksonizedSuperBuilderWithJsonDeserialize.JacksonizedSuperBuilderWithJsonDeserializeBuilderImpl> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate JacksonizedSuperBuilderWithJsonDeserializeBuilderImpl() {\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected JacksonizedSuperBuilderWithJsonDeserialize.JacksonizedSuperBuilderWithJsonDeserializeBuilderImpl self() {\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic JacksonizedSuperBuilderWithJsonDeserialize build() {\n\t\t\treturn new JacksonizedSuperBuilderWithJsonDeserialize(this);\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected JacksonizedSuperBuilderWithJsonDeserialize(final JacksonizedSuperBuilderWithJsonDeserialize.JacksonizedSuperBuilderWithJsonDeserializeBuilder<?, ?> b) {\n\t\tthis.field1 = b.field1;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static JacksonizedSuperBuilderWithJsonDeserialize.JacksonizedSuperBuilderWithJsonDeserializeBuilder<?, ?> builder() {\n\t\treturn new JacksonizedSuperBuilderWithJsonDeserialize.JacksonizedSuperBuilderWithJsonDeserializeBuilderImpl();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/JavadocGenerally.java",
    "content": "/**\n * Doc on package\n */\npackage testPackage;\n/** Weird doc */\n/**\n * Doc on class\n */\nclass JavadocGenerally {\n\t/**\n\t * Doc on field\n\t * <pre>\n\t * \t// code\n\t * </pre>\n\t */\n\tprivate int someField;\n\t/**\n\t * Doc on method\n\t */\n\tpublic void test() {\n\t}\n\t/**\n\t * Doc on inner\n\t */\n\tpublic interface TestingInner {\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/JavadocMultiline.java",
    "content": "class JavadocMultiline {\n    /**\n     * This is a list of booleans.\n     */\n    private java.util.List<Boolean> booleans;\n    /**\n     * This is a list of booleans.\n     */\n    private java.util.List<Boolean> booleans2;\n    /**\n     * This is a list of booleans.\n     *\n     * @return A list of booleans to set for this object. This is a Javadoc return that is long\n     *         enough to wrap to multiple lines.\n     */\n    @java.lang.SuppressWarnings(\"all\")\n    @lombok.Generated\n    public java.util.List<Boolean> getBooleans() {\n        return this.booleans;\n    }\n    /**\n     * This is a list of booleans.\n     */\n    @java.lang.SuppressWarnings(\"all\")\n    @lombok.Generated\n    public java.util.List<Boolean> getBooleans2() {\n        return this.booleans2;\n    }\n    /**\n     * This is a list of booleans.\n     *\n     * @param booleans A list of booleans to set for this object. This is a Javadoc param that is\n     *        long enough to wrap to multiple lines.\n     */\n    @java.lang.SuppressWarnings(\"all\")\n    @lombok.Generated\n    public void setBooleans(final java.util.List<Boolean> booleans) {\n        this.booleans = booleans;\n    }\n    /**\n     * This is a list of booleans.\n     *\n     * @param booleans A list of booleans to set for this object. This is a Javadoc param that is\n     *        long enough to wrap to multiple lines.\n     */\n    @java.lang.SuppressWarnings(\"all\")\n    @lombok.Generated\n    public void setBooleans2(final java.util.List<Boolean> booleans2) {\n        this.booleans2 = booleans2;\n    }\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LockedInInitializer.java",
    "content": "public class LockedInInitializer {\n\tpublic static final Runnable LOCKED = new Runnable() {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate final java.util.concurrent.locks.Lock $lock = new java.util.concurrent.locks.ReentrantLock();\n\t\t@Override\n\t\tpublic void run() {\n\t\t\tthis.$lock.lock();\n\t\t\ttry {\n\t\t\t\tSystem.out.println(\"test\");\n\t\t\t} finally {\n\t\t\t\tthis.$lock.unlock();\n\t\t\t}\n\t\t}\n\t};\n\tpublic static final Runnable LOCKED_READ = new Runnable() {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate final java.util.concurrent.locks.ReadWriteLock $lock = new java.util.concurrent.locks.ReentrantReadWriteLock();\n\t\t@Override\n\t\tpublic void run() {\n\t\t\tthis.$lock.readLock().lock();\n\t\t\ttry {\n\t\t\t\tSystem.out.println(\"test\");\n\t\t\t} finally {\n\t\t\t\tthis.$lock.readLock().unlock();\n\t\t\t}\n\t\t}\n\t};\n\tpublic static final Runnable LOCKED_WRITE = new Runnable() {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate final java.util.concurrent.locks.ReadWriteLock $lock = new java.util.concurrent.locks.ReentrantReadWriteLock();\n\t\t@Override\n\t\tpublic void run() {\n\t\t\tthis.$lock.writeLock().lock();\n\t\t\ttry {\n\t\t\t\tSystem.out.println(\"test\");\n\t\t\t} finally {\n\t\t\t\tthis.$lock.writeLock().unlock();\n\t\t\t}\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LockedInRecord.java",
    "content": "// version 14:\npublic record LockedInRecord(String a, String b) {\n\tpublic void foo() {\n\t\tString foo = \"bar\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LockedName.java",
    "content": "import java.util.concurrent.locks.*;\nclass LockedName {\n\tprivate final Lock basicLock = new ReentrantLock();\n\tprivate final ReadWriteLock rwLock = new ReentrantReadWriteLock();\n\tvoid test() {\n\t\tthis.basicLock.lock();\n\t\ttry {\n\t\t\tSystem.out.println(\"one\");\n\t\t} finally {\n\t\t\tthis.basicLock.unlock();\n\t\t}\n\t}\n\tvoid test2() {\n\t\tthis.rwLock.readLock().lock();\n\t\ttry {\n\t\t\tSystem.out.println(\"two\");\n\t\t} finally {\n\t\t\tthis.rwLock.readLock().unlock();\n\t\t}\n\t}\n\tvoid test3() {\n\t\tthis.rwLock.writeLock().lock();\n\t\ttry {\n\t\t\tSystem.out.println(\"three\");\n\t\t} finally {\n\t\t\tthis.rwLock.writeLock().unlock();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LockedOnStatic.java",
    "content": "class LockedOnStatic<Z> {\n\tstatic class Inner {\n\t\tprivate static final java.util.concurrent.locks.Lock LCK = new java.util.concurrent.locks.ReentrantLock();\n\t\tpublic void foo() {\n\t\t\tLockedOnStatic.Inner.LCK.lock();\n\t\t\ttry {\n\t\t\t\tSystem.out.println();\n\t\t\t} finally {\n\t\t\t\tLockedOnStatic.Inner.LCK.unlock();\n\t\t\t}\n\t\t}\n\t}\n\tclass Inner2 {\n\t\tprivate final java.util.concurrent.locks.ReentrantLock LCK = new java.util.concurrent.locks.ReentrantLock();\n\t\tpublic void foo() {\n\t\t\tthis.LCK.lock();\n\t\t\ttry {\n\t\t\t\tSystem.out.println();\n\t\t\t} finally {\n\t\t\t\tthis.LCK.unlock();\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LockedPlain.java",
    "content": "class LockedPlain {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate final java.util.concurrent.locks.Lock $lock = new java.util.concurrent.locks.ReentrantLock();\n\tvoid test() {\n\t\tthis.$lock.lock();\n\t\ttry {\n\t\t\tSystem.out.println(\"one\");\n\t\t} finally {\n\t\t\tthis.$lock.unlock();\n\t\t}\n\t}\n\tvoid test2() {\n\t\tthis.$lock.lock();\n\t\ttry {\n\t\t\tSystem.out.println(\"two\");\n\t\t} finally {\n\t\t\tthis.$lock.unlock();\n\t\t}\n\t}\n}\nclass LockedPlainStatic {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final java.util.concurrent.locks.Lock $LOCK = new java.util.concurrent.locks.ReentrantLock();\n\tstatic void test() {\n\t\tLockedPlainStatic.$LOCK.lock();\n\t\ttry {\n\t\t\tSystem.out.println(\"three\");\n\t\t} finally {\n\t\t\tLockedPlainStatic.$LOCK.unlock();\n\t\t}\n\t}\n\tstatic void test2() {\n\t\tLockedPlainStatic.$LOCK.lock();\n\t\ttry {\n\t\t\tSystem.out.println(\"four\");\n\t\t} finally {\n\t\t\tLockedPlainStatic.$LOCK.unlock();\n\t\t}\n\t}\n}\nclass LockedPlainRead {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final java.util.concurrent.locks.ReadWriteLock $LOCK = new java.util.concurrent.locks.ReentrantReadWriteLock();\n\tstatic void test() {\n\t\tLockedPlainRead.$LOCK.readLock().lock();\n\t\ttry {\n\t\t\tSystem.out.println(\"five\");\n\t\t} finally {\n\t\t\tLockedPlainRead.$LOCK.readLock().unlock();\n\t\t}\n\t}\n\tstatic void test2() {\n\t\tLockedPlainRead.$LOCK.readLock().lock();\n\t\ttry {\n\t\t\tSystem.out.println(\"six\");\n\t\t} finally {\n\t\t\tLockedPlainRead.$LOCK.readLock().unlock();\n\t\t}\n\t}\n}\nclass LockedPlainWrite {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate final java.util.concurrent.locks.ReadWriteLock $lock = new java.util.concurrent.locks.ReentrantReadWriteLock();\n\tvoid test() {\n\t\tthis.$lock.writeLock().lock();\n\t\ttry {\n\t\t\tSystem.out.println(\"seven\");\n\t\t} finally {\n\t\t\tthis.$lock.writeLock().unlock();\n\t\t}\n\t}\n\tvoid test2() {\n\t\tthis.$lock.writeLock().lock();\n\t\ttry {\n\t\t\tSystem.out.println(\"eight\");\n\t\t} finally {\n\t\t\tthis.$lock.writeLock().unlock();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LockedStaticMix.java",
    "content": "class LockedGeneratedStaticMismatch {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final java.util.concurrent.locks.Lock $LOCK = new java.util.concurrent.locks.ReentrantLock();\n\tstatic void test() {\n\t\tLockedGeneratedStaticMismatch.$LOCK.lock();\n\t\ttry {\n\t\t\tSystem.out.println(\"one\");\n\t\t} finally {\n\t\t\tLockedGeneratedStaticMismatch.$LOCK.unlock();\n\t\t}\n\t}\n\tvoid test2() {\n\t\tSystem.out.println(\"two\");\n\t}\n}\nclass LockedUserStaticMismatch {\n\tprivate static final java.util.concurrent.locks.Lock userLock = new java.util.concurrent.locks.ReentrantLock();\n\tstatic void test() {\n\t\tLockedUserStaticMismatch.userLock.lock();\n\t\ttry {\n\t\t\tSystem.out.println(\"one\");\n\t\t} finally {\n\t\t\tLockedUserStaticMismatch.userLock.unlock();\n\t\t}\n\t}\n\tvoid test2() {\n\t\tLockedUserStaticMismatch.userLock.lock();\n\t\ttry {\n\t\t\tSystem.out.println(\"two\");\n\t\t} finally {\n\t\t\tLockedUserStaticMismatch.userLock.unlock();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LockedTypeMismatch.java",
    "content": "class LockedGeneratedTypeMismatch {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate final java.util.concurrent.locks.Lock $lock = new java.util.concurrent.locks.ReentrantLock();\n\tvoid test() {\n\t\tthis.$lock.lock();\n\t\ttry {\n\t\t\tSystem.out.println(\"one\");\n\t\t} finally {\n\t\t\tthis.$lock.unlock();\n\t\t}\n\t}\n\tvoid test2() {\n\t\tSystem.out.println(\"two\");\n\t}\n}\nclass LockedUserTypeMismatch {\n\tprivate final java.util.concurrent.locks.Lock userLock = new java.util.concurrent.locks.ReentrantLock();\n\tvoid test() {\n\t\tthis.userLock.lock();\n\t\ttry {\n\t\t\tSystem.out.println(\"one\");\n\t\t} finally {\n\t\t\tthis.userLock.unlock();\n\t\t}\n\t}\n\tvoid test2() {\n\t\tthis.userLock.readLock().lock();\n\t\ttry {\n\t\t\tSystem.out.println(\"two\");\n\t\t} finally {\n\t\t\tthis.userLock.readLock().unlock();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerCommons.java",
    "content": "class LoggerCommons {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LoggerCommons.class);\n}\nclass LoggerCommonsWithImport {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LoggerCommonsWithImport.class);\n}\nclass LoggerCommonsWithDifferentName {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(\"DifferentName\");\n}\nclass LoggerCommonsWithStaticField {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LoggerCommonsWithStaticField.TOPIC);\n\tstatic final String TOPIC = \"StaticField\";\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerCommonsAccess.java",
    "content": "import lombok.AccessLevel;\nclass LoggerCommonsAccessPublic {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LoggerCommonsAccessPublic.class);\n\n}\nclass LoggerCommonsAccessProtected {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LoggerCommonsAccessProtected.class);\n\n}\nclass LoggerCommonsAccessPackage {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tstatic final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LoggerCommonsAccessPackage.class);\n\n}\nclass LoggerCommonsAccessPrivate {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LoggerCommonsAccessPrivate.class);\n\n}\nclass LoggerCommonsAccessNone {\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerConfig.java",
    "content": "class LoggerWithConfig {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate final org.slf4j.Logger myLogger = org.slf4j.LoggerFactory.getLogger(LoggerWithConfig.class);\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerConfigOnRecord.java",
    "content": "// version 14:\npublic record LoggerConfigOnRecord(String a, String b) {\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerCustom.java",
    "content": "class LoggerCustomLog {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final MyLogger log = MyLoggerFactory.create(LoggerCustomLog.class);\n}\nclass MyLoggerFactory {\n\tstatic MyLogger create(Class<?> clazz) {\n\t\treturn null;\n\t}\n}\nclass MyLogger {\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerCustomAccess.java",
    "content": "import lombok.AccessLevel;\nclass LoggerCustomAccessPublic {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static final MyLogger log = MyLoggerFactory.create(LoggerCustomAccessPublic.class);\n\n}\nclass LoggerCustomAccessProtected {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected static final MyLogger log = MyLoggerFactory.create(LoggerCustomAccessProtected.class);\n\n}\nclass LoggerCustomAccessPackage {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tstatic final MyLogger log = MyLoggerFactory.create(LoggerCustomAccessPackage.class);\n\n}\nclass LoggerCustomAccessPrivate {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final MyLogger log = MyLoggerFactory.create(LoggerCustomAccessPrivate.class);\n\n}\nclass LoggerCustomAccessNone {\n}\nclass MyLoggerFactory {\n\tstatic MyLogger create(Class<?> clazz) {\n\t\treturn null;\n\t}\n}\nclass MyLogger {\n}\n\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerCustomWithPackage.java",
    "content": "package before;\nclass LoggerCustomLog {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final before.MyLogger log = before.MyLoggerFactory.create(LoggerCustomLog.class);\n}\nclass MyLoggerFactory {\n\tstatic MyLogger create(Class<?> clazz) {\n\t\treturn null;\n\t}\n}\nclass MyLogger {\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerCustomWithTopicAndName.java",
    "content": "class LoggerCustomLog {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final MyLoggerFactory log = MyLoggerFactory.create(LoggerCustomLog.class.getName(), \"t\", null, LoggerCustomLog.class, \"t\");\n}\nclass LoggerCustomLogWithStaticField {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final MyLoggerFactory log = MyLoggerFactory.create(LoggerCustomLogWithStaticField.class.getName(), LoggerCustomLogWithStaticField.TOPIC, null, LoggerCustomLogWithStaticField.class, LoggerCustomLogWithStaticField.TOPIC);\n\tstatic final String TOPIC = \"StaticField\";\n}\nclass MyLoggerFactory {\n\tstatic MyLoggerFactory create(String name, String t1, Object o, Class<?> clazz, String t2) {\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerFlogger.java",
    "content": "class LoggerFlogger {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();\n}\nclass LoggerFloggerWithImport {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();\n}\nclass LoggerFloggerOuter {\n\tstatic class Inner {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();\n\t}\n}\nenum LoggerFloggerWithEnum {\n\tCONSTANT;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();\n}\nclass LoggerFloggerWithInnerEnum {\n\tenum Inner {\n\t\tCONSTANT;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerFloggerAccess.java",
    "content": "import lombok.AccessLevel;\nclass LoggerFloggerAccessPublic {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static final com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();\n\n}\nclass LoggerFloggerAccessProtected {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected static final com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();\n\n}\nclass LoggerFloggerAccessPackage {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tstatic final com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();\n\n}\nclass LoggerFloggerAccessPrivate {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();\n\n}\nclass LoggerFloggerAccessNone {\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerFloggerRecord.java",
    "content": "// version 16:\nclass LoggerFloggerRecord {\n\tpublic record Inner(String x) {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerJBossLog.java",
    "content": "class LoggerJBossLog {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LoggerJBossLog.class);\n}\nclass LoggerJBossLogWithImport {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LoggerJBossLogWithImport.class);\n}\nclass LoggerJBossLogOuter {\n\tstatic class Inner {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(Inner.class);\n\t}\n}\nenum LoggerJBossLogWithEnum {\n\tCONSTANT;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LoggerJBossLogWithEnum.class);\n}\nclass LoggerJBossLogWithInnerEnum {\n\tenum Inner {\n\t\tCONSTANT;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(Inner.class);\n\t}\n}\nclass LoggerJBossLogWithDifferentLoggerName {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(\"DifferentLogger\");\n}\nclass LoggerJBossLogWithStaticField {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LoggerJBossLogWithStaticField.TOPIC);\n\tstatic final String TOPIC = \"StaticField\";\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerJBossLogAccess.java",
    "content": "import lombok.AccessLevel;\nclass LoggerJBossLogAccessPublic {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LoggerJBossLogAccessPublic.class);\n\n}\nclass LoggerJBossLogAccessProtected {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LoggerJBossLogAccessProtected.class);\n\n}\nclass LoggerJBossLogAccessPackage {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tstatic final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LoggerJBossLogAccessPackage.class);\n\n}\nclass LoggerJBossLogAccessPrivate {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LoggerJBossLogAccessPrivate.class);\n\n}\nclass LoggerJBossLogAccessNone {\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerJul.java",
    "content": "class LoggerJul {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LoggerJul.class.getName());\n}\nclass LoggerJulWithImport {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LoggerJulWithImport.class.getName());\n}\nclass LoggerJulWithDifferentName {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(\"DifferentName\");\n}\nclass LoggerJulWithStaticField {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LoggerJulWithStaticField.TOPIC);\n\tstatic final String TOPIC = \"StaticField\";\n}\nenum LoggerJulWithEnum {\n\tCONSTANT;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LoggerJulWithEnum.class.getName());\n}\nclass LoggerJulWithInnerEnum {\n\tenum Inner {\n\t\tCONSTANT;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(Inner.class.getName());\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerJulAccess.java",
    "content": "import lombok.AccessLevel;\nclass LoggerJulAccessPublic {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LoggerJulAccessPublic.class.getName());\n\n}\nclass LoggerJulAccessProtected {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LoggerJulAccessProtected.class.getName());\n\n}\nclass LoggerJulAccessPackage {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tstatic final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LoggerJulAccessPackage.class.getName());\n\n}\nclass LoggerJulAccessPrivate {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LoggerJulAccessPrivate.class.getName());\n\n}\nclass LoggerJulAccessNone {\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerLog4j.java",
    "content": "class LoggerLog4j {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LoggerLog4j.class);\n}\nclass LoggerLog4jWithImport {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LoggerLog4jWithImport.class);\n}\nclass LoggerLog4jWithDifferentName {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(\"DifferentName\");\n}\nclass LoggerLog4jWithStaticField {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LoggerLog4jWithStaticField.TOPIC);\n\tstatic final String TOPIC = \"StaticField\";\n}\nenum LoggerLog4jWithEnum {\n\tCONSTANT;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LoggerLog4jWithEnum.class);\n}\nclass LoggerLog4jWithInnerEnum {\n\tenum Inner {\n\t\tCONSTANT;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(Inner.class);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerLog4j2.java",
    "content": "//version 8: Our Log4j2 version doesn't support Java 6\nclass LoggerLog4j2 {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LoggerLog4j2.class);\n}\nclass LoggerLog4j2WithImport {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LoggerLog4j2WithImport.class);\n}\nclass LoggerLog4j2WithDifferentName {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(\"DifferentName\");\n}\nclass LoggerLog4j2WithStaticField {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LoggerLog4j2WithStaticField.TOPIC);\n\tstatic final String TOPIC = \"StaticField\";\n}\nenum LoggerLog4j2WithEnum {\n\tCONSTANT;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LoggerLog4j2WithEnum.class);\n}\nclass LoggerLog4j2WithInnerEnum {\n\tenum Inner {\n\t\tCONSTANT;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(Inner.class);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerLog4j2Access.java",
    "content": "//version 8: Our Log4j2 version doesn't support Java 6\nimport lombok.AccessLevel;\nclass LoggerLog4j2AccessPublic {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LoggerLog4j2AccessPublic.class);\n\n}\nclass LoggerLog4j2AccessProtected {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LoggerLog4j2AccessProtected.class);\n\n}\nclass LoggerLog4j2AccessPackage {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tstatic final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LoggerLog4j2AccessPackage.class);\n\n}\nclass LoggerLog4j2AccessPrivate {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LoggerLog4j2AccessPrivate.class);\n\n}\nclass LoggerLog4j2AccessNone {\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerLog4jAccess.java",
    "content": "import lombok.AccessLevel;\nclass LoggerLog4jAccessPublic {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LoggerLog4jAccessPublic.class);\n\n}\nclass LoggerLog4jAccessProtected {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LoggerLog4jAccessProtected.class);\n\n}\nclass LoggerLog4jAccessPackage {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tstatic final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LoggerLog4jAccessPackage.class);\n\n}\nclass LoggerLog4jAccessPrivate {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LoggerLog4jAccessPrivate.class);\n\n}\nclass LoggerLog4jAccessNone {\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerSlf4j.java",
    "content": "class LoggerSlf4j {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoggerSlf4j.class);\n}\nclass LoggerSlf4jWithImport {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoggerSlf4jWithImport.class);\n}\nenum LoggerSlf4jWithEnum {\n\tCONSTANT;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoggerSlf4jWithEnum.class);\n}\nclass LoggerSlf4jWithInnerEnum {\n\tenum Inner {\n\t\tCONSTANT;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(Inner.class);\n\t}\n}\nclass LoggerSlf4jOuter {\n\tstatic class Inner {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(Inner.class);\n\t}\n}\nclass LoggerSlf4jWithDifferentLoggerName {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(\"DifferentLogger\");\n}\nclass LoggerSlf4jWithStaticField {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoggerSlf4jWithStaticField.TOPIC);\n\tstatic final String TOPIC = \"StaticField\";\n}\nclass LoggerSlf4jWithTwoStaticFields {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoggerSlf4jWithTwoStaticFields.TOPIC + LoggerSlf4jWithTwoStaticFields.TOPIC);\n\tstatic final String TOPIC = \"StaticField\";\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerSlf4jAccess.java",
    "content": "import lombok.AccessLevel;\nclass LoggerSlf4jAccessPublic {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoggerSlf4jAccessPublic.class);\n\n}\nclass LoggerSlf4jAccessProtected {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoggerSlf4jAccessProtected.class);\n\n}\nclass LoggerSlf4jAccessPackage {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tstatic final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoggerSlf4jAccessPackage.class);\n\n}\nclass LoggerSlf4jAccessPrivate {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoggerSlf4jAccessPrivate.class);\n\n}\nclass LoggerSlf4jAccessNone {\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerSlf4jAlreadyExists.java",
    "content": "class LoggerSlf4jAlreadyExists {\n\tint log;\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerSlf4jInAnonymousClass.java",
    "content": "public class LoggerSlf4jInAnonymousClass {\n\tObject annonymous = new Object() {\n\n\t\tclass Inner {\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerSlf4jNonStaticOnRecord.java",
    "content": "// version 14:\nrecord LoggerSlf4jOnRecord(String a, String b) {\n\tprivate static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoggerSlf4jOnRecord.class);\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerSlf4jOnRecord.java",
    "content": "// version 16: the SuppressWarnings is not emitted in java14/15 to work around a javac bug.\npublic record LoggerSlf4jOnRecord(String a, String b) {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoggerSlf4jOnRecord.class);\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerSlf4jTypes.java",
    "content": "interface LoggerSlf4jTypesInterface {\n}\n@interface LoggerSlf4jTypesAnnotation {\n}\nenum LoggerSlf4jTypesEnum {\n\t;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoggerSlf4jTypesEnum.class);\n}\nenum LoggerSlf4jTypesEnumWithElement {\n\tFOO;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoggerSlf4jTypesEnumWithElement.class);\n}\ninterface LoggerSlf4jTypesInterfaceOuter {\n\tclass Inner {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(Inner.class);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerSlf4jWithPackage.java",
    "content": "package before;\nclass LoggerSlf4jWithPackage {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoggerSlf4jWithPackage.class);\n}\nclass LoggerSlf4jWithPackageOuter {\n\tstatic class Inner {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(Inner.class);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerXSlf4j.java",
    "content": "class LoggerXSlf4j {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LoggerXSlf4j.class);\n}\nclass LoggerXSlf4jWithImport {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LoggerXSlf4jWithImport.class);\n}\nclass LoggerXSlf4jWithDifferentName {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(\"DifferentName\");\n}\nclass LoggerXSlf4jWithStaticField {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LoggerXSlf4jWithStaticField.TOPIC);\n\tstatic final String TOPIC = \"StaticField\";\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/LoggerXSlf4jAccess.java",
    "content": "import lombok.AccessLevel;\nclass LoggerXSlf4jAccessPublic {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LoggerXSlf4jAccessPublic.class);\n\n}\nclass LoggerXSlf4jAccessProtected {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LoggerXSlf4jAccessProtected.class);\n\n}\nclass LoggerXSlf4jAccessPackage {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tstatic final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LoggerXSlf4jAccessPackage.class);\n\n}\nclass LoggerXSlf4jAccessPrivate {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LoggerXSlf4jAccessPrivate.class);\n\n}\nclass LoggerXSlf4jAccessNone {\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/MixGetterVal.java",
    "content": "class MixGetterVal {\n\tprivate int x;\n\tpublic void m(int z) {\n\t}\n\tpublic void test() {\n\t\tfinal int y = x;\n\t\tm(y);\n\t\tfinal int a = getX();\n\t\tm(a);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getX() {\n\t\treturn this.x;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/MultiFieldGetter.java",
    "content": "class MultiFieldGetter {\n\tint x;\n\tint y;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected int getX() {\n\t\treturn this.x;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected int getY() {\n\t\treturn this.y;\n\t}\n}\nclass MultiFieldGetter2 {\n\tint x;\n\tint y;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tint getX() {\n\t\treturn this.x;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tint getY() {\n\t\treturn this.y;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/NoArgsConstructorForce.java",
    "content": "public class NoArgsConstructorForce {\n\tprivate final int[] i;\n\tprivate final Object[] o;\n\tprivate final java.util.List<?>[] fullQualifiedList;\n\tprivate final String alreadyInitialized = \"yes\";\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic NoArgsConstructorForce() {\n\t\tthis.i = null;\n\t\tthis.o = null;\n\t\tthis.fullQualifiedList = null;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/NoPrivateNoArgsConstructor.java",
    "content": "public class NoPrivateNoArgsConstructor {\n\tpublic static class NoPrivateNoArgsConstructorData {\n\t\tprivate final int i;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic NoPrivateNoArgsConstructorData(final int i) {\n\t\t\tthis.i = i;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic int getI() {\n\t\t\treturn this.i;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic boolean equals(final java.lang.Object o) {\n\t\t\tif (o == this) return true;\n\t\t\tif (!(o instanceof NoPrivateNoArgsConstructor.NoPrivateNoArgsConstructorData)) return false;\n\t\t\tfinal NoPrivateNoArgsConstructor.NoPrivateNoArgsConstructorData other = (NoPrivateNoArgsConstructor.NoPrivateNoArgsConstructorData) o;\n\t\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\t\tif (this.getI() != other.getI()) return false;\n\t\t\treturn true;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected boolean canEqual(final java.lang.Object other) {\n\t\t\treturn other instanceof NoPrivateNoArgsConstructor.NoPrivateNoArgsConstructorData;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic int hashCode() {\n\t\t\tfinal int PRIME = 59;\n\t\t\tint result = 1;\n\t\t\tresult = result * PRIME + this.getI();\n\t\t\treturn result;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"NoPrivateNoArgsConstructor.NoPrivateNoArgsConstructorData(i=\" + this.getI() + \")\";\n\t\t}\n\t}\n\tpublic static final class NoPrivateNoArgsConstructorValue {\n\t\tprivate final int i;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic NoPrivateNoArgsConstructorValue(final int i) {\n\t\t\tthis.i = i;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic int getI() {\n\t\t\treturn this.i;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic boolean equals(final java.lang.Object o) {\n\t\t\tif (o == this) return true;\n\t\t\tif (!(o instanceof NoPrivateNoArgsConstructor.NoPrivateNoArgsConstructorValue)) return false;\n\t\t\tfinal NoPrivateNoArgsConstructor.NoPrivateNoArgsConstructorValue other = (NoPrivateNoArgsConstructor.NoPrivateNoArgsConstructorValue) o;\n\t\t\tif (this.getI() != other.getI()) return false;\n\t\t\treturn true;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic int hashCode() {\n\t\t\tfinal int PRIME = 59;\n\t\t\tint result = 1;\n\t\t\tresult = result * PRIME + this.getI();\n\t\t\treturn result;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"NoPrivateNoArgsConstructor.NoPrivateNoArgsConstructorValue(i=\" + this.getI() + \")\";\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/NonNullExistingConstructorOnRecord.java",
    "content": "// version 16:\nimport lombok.NonNull;\npublic record NonNullExistingConstructorOnRecord(@NonNull String a, @NonNull String b) {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic NonNullExistingConstructorOnRecord {\n\t\tif (a == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"a is marked non-null but is null\");\n\t\t}\n\t\tif (b == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"b is marked non-null but is null\");\n\t\t}\n\t}\n\tpublic NonNullExistingConstructorOnRecord(@NonNull String b) {\n\t\tthis(\"default\", b);\n\t\tif (b == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"b is marked non-null but is null\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/NonNullOnParameter.java",
    "content": "//version 8:\nclass NonNullOnParameter extends Thread {\n\tNonNullOnParameter(@lombok.NonNull String arg) {\n\t\tthis(arg, \"\");\n\t\tif (arg == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"arg is marked non-null but is null\");\n\t\t}\n\t}\n\tNonNullOnParameter(@lombok.NonNull String arg, @lombok.NonNull String arg2) {\n\t\tsuper(arg);\n\t\tif (arg2 == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"arg2 is marked non-null but is null\");\n\t\t}\n\t\tif (arg == null) throw new NullPointerException();\n\t}\n\tpublic void test2(@lombok.NonNull String arg, @lombok.NonNull String arg2, @lombok.NonNull String arg3) {\n\t\tif (arg == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"arg is marked non-null but is null\");\n\t\t}\n\t\tif (arg3 == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"arg3 is marked non-null but is null\");\n\t\t}\n\t\tif (arg2 == null) {\n\t\t\tthrow new NullPointerException(\"arg2\");\n\t\t}\n\t\tif (arg == null) System.out.println(\"Hello\");\n\t}\n\tpublic void test3(@lombok.NonNull String arg) {\n\t\tif (arg == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"arg is marked non-null but is null\");\n\t\t}\n\t\tif (arg != null) throw new IllegalStateException();\n\t}\n\tpublic void test(@lombok.NonNull String stringArg, @lombok.NonNull String arg2, @lombok.NonNull int primitiveArg) {\n\t\tif (stringArg == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"stringArg is marked non-null but is null\");\n\t\t}\n\t\tif (arg2 == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"arg2 is marked non-null but is null\");\n\t\t}\n\t}\n\tpublic void test(@lombok.NonNull String arg) {\n\t\tif (arg == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"arg is marked non-null but is null\");\n\t\t}\n\t\tSystem.out.println(\"Hey\");\n\t\tif (arg == null) throw new NullPointerException();\n\t}\n\tpublic void testWithAssert(@lombok.NonNull String param) {\n\t\tassert param != null;\n\t}\n\tpublic void testWithAssertAndMessage(@lombok.NonNull String param) {\n\t\tassert param != null : \"Oops\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/NonNullOnParameterAbstract.java",
    "content": "//version 8:\nabstract class NonNullOnParameterAbstract {\n\tpublic void test(@lombok.NonNull String arg) {\n\t\tif (arg == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"arg is marked non-null but is null\");\n\t\t}\n\t\tSystem.out.println(\"Hey\");\n\t}\n\t\n\tpublic abstract void test2(@lombok.NonNull String arg);\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/NonNullOnParameterOfDefaultMethod.java",
    "content": "// version 8:\ninterface NonNullOnParameterOfDefaultMethod {\n\tvoid test(@lombok.NonNull String arg);\n\tdefault void test2(@lombok.NonNull String arg) {\n\t\tif (arg == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"arg is marked non-null but is null\");\n\t\t}\n\t\tSystem.out.println(arg);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/NonNullOnRecordExistingConstructor.java",
    "content": "// version 16:\nimport lombok.NonNull;\npublic record NonNullOnRecordExistingConstructor(@NonNull String a) {\n\tpublic NonNullOnRecordExistingConstructor {\n\t\tif (a == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"a is marked non-null but is null\");\n\t\t}\n\t\tSystem.out.println(\"Hello\");\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/NonNullOnRecordExistingSetter.java",
    "content": "// version 14:\nimport lombok.NonNull;\npublic record NonNullOnRecordExistingSetter(@NonNull String a) {\n\tpublic NonNullOnRecordExistingSetter(String a) {\n\t\tthis.a = a;\n\t}\n\tpublic void method(@NonNull String param) {\n\t\tif (param == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"param is marked non-null but is null\");\n\t\t}\n\t\tString asd = \"a\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/NonNullOnRecordSimple.java",
    "content": "// version 16:\nimport lombok.NonNull;\npublic record NonNullOnRecordSimple(@NonNull String a, @NonNull String b) {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic NonNullOnRecordSimple {\n\t\tif (a == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"a is marked non-null but is null\");\n\t\t}\n\t\tif (b == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"b is marked non-null but is null\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/NonNullOnRecordTypeUse.java",
    "content": "// version 16:\nimport lombok.NonNull;\npublic record NonNullOnRecordTypeUse(@NonNull int[] a, int @NonNull [] b, int[] @NonNull [] c) {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic NonNullOnRecordTypeUse {\n\t\tif (a == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"a is marked non-null but is null\");\n\t\t}\n\t\tif (b == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"b is marked non-null but is null\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/NonNullPlain.java",
    "content": "//version 8:\nimport java.lang.annotation.*;\nclass NonNullPlain {\n\t@lombok.NonNull\n\tint i;\n\t@lombok.NonNull\n\tString s;\n\t@NotNull\n\tObject o;\n\t@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE})\n\t@Retention(RetentionPolicy.CLASS)\n\tpublic @interface NotNull {\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic NonNullPlain(@lombok.NonNull final int i, @lombok.NonNull final String s) {\n\t\tif (s == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"s is marked non-null but is null\");\n\t\t}\n\t\tthis.i = i;\n\t\tthis.s = s;\n\t}\n\t@lombok.NonNull\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getI() {\n\t\treturn this.i;\n\t}\n\t@lombok.NonNull\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getS() {\n\t\treturn this.s;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic Object getO() {\n\t\treturn this.o;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setI(@lombok.NonNull final int i) {\n\t\tthis.i = i;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setS(@lombok.NonNull final String s) {\n\t\tif (s == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"s is marked non-null but is null\");\n\t\t}\n\t\tthis.s = s;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setO(final Object o) {\n\t\tthis.o = o;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/NonNullTypeUse.java",
    "content": "//version 8:\nimport lombok.NonNull;\nclass NonNullTypeUse {\n\tvoid test1(@NonNull String[][][] args) {\n\t\tif (args == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"args is marked non-null but is null\");\n\t\t}\n\t}\n\tvoid test2(String @NonNull [][][] args) {\n\t\tif (args == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"args is marked non-null but is null\");\n\t\t}\n\t}\n\tvoid test3(String[] @NonNull [][] args) {\n\t}\n\tvoid test4(String[][] @NonNull [] args) {\n\t}\n\tvoid test5(@NonNull String simple) {\n\t\tif (simple == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"simple is marked non-null but is null\");\n\t\t}\n\t}\n\tvoid test6(java.lang.@NonNull String weird) {\n\t\tif (weird == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"weird is marked non-null but is null\");\n\t\t}\n\t}\n\tvoid test7(java.lang.String @NonNull [][] weird) {\n\t\tif (weird == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"weird is marked non-null but is null\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/NonNullWithAlternateException.java",
    "content": "//version 8:\npublic class NonNullWithAlternateException {\n\t@lombok.NonNull\n\tprivate String test;\n\tpublic void testMethod(@lombok.NonNull String arg) {\n\t\tif (arg == null) {\n\t\t\tthrow new java.lang.IllegalArgumentException(\"arg is marked non-null but is null\");\n\t\t}\n\t\tSystem.out.println(arg);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setTest(@lombok.NonNull final String test) {\n\t\tif (test == null) {\n\t\t\tthrow new java.lang.IllegalArgumentException(\"test is marked non-null but is null\");\n\t\t}\n\t\tthis.test = test;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/NonNullWithAssertion.java",
    "content": "//version 8:\npublic class NonNullWithAssertion {\n\t@lombok.NonNull\n\tprivate String test;\n\tpublic void testMethod(@lombok.NonNull String arg) {\n\t\tassert arg != null : \"arg is marked non-null but is null\";\n\t\tSystem.out.println(arg);\n\t}\n\tpublic void testMethodWithIf(@lombok.NonNull String arg) {\n\t\tif (arg == null) throw new NullPointerException(\"Oops\");\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setTest(@lombok.NonNull final String test) {\n\t\tassert test != null : \"test is marked non-null but is null\";\n\t\tthis.test = test;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/NonNullWithGuava.java",
    "content": "//version 8:\nimport static com.google.common.base.Preconditions.*;\npublic class NonNullWithGuava {\n\t@lombok.NonNull\n\tprivate String test;\n\tpublic void testMethod(@lombok.NonNull String arg) {\n\t\tcom.google.common.base.Preconditions.checkNotNull(arg, \"arg is marked non-null but is null\");\n\t\tSystem.out.println(arg);\n\t}\n\tpublic void testMethodWithCheck1(@lombok.NonNull String arg) {\n\t\tcheckNotNull(arg);\n\t}\n\tpublic void testMethodWithCheckAssign(@lombok.NonNull String arg) {\n\t\ttest = checkNotNull(arg);\n\t}\n\tpublic void testMethodWithCheck2(@lombok.NonNull String arg) {\n\t\tcom.google.common.base.Preconditions.checkNotNull(arg);\n\t}\n\tpublic void testMethodWithFakeCheck1(@lombok.NonNull String arg) {\n\t\tcom.google.common.base.Preconditions.checkNotNull(arg, \"arg is marked non-null but is null\");\n\t\tcheckNotNull(\"\");\n\t}\n\tpublic void testMethodWithFakeCheck2(@lombok.NonNull String arg) {\n\t\tcom.google.common.base.Preconditions.checkNotNull(arg, \"arg is marked non-null but is null\");\n\t\tcom.google.common.base.Preconditions.checkNotNull(test);\n\t}\n\tpublic void testMethodWithFakeCheckAssign(@lombok.NonNull String arg) {\n\t\tcom.google.common.base.Preconditions.checkNotNull(arg, \"arg is marked non-null but is null\");\n\t\ttest = checkNotNull(test);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setTest(@lombok.NonNull final String test) {\n\t\tcom.google.common.base.Preconditions.checkNotNull(test, \"test is marked non-null but is null\");\n\t\tthis.test = test;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/NonNullWithJdk.java",
    "content": "//version 8:\nimport static java.util.Objects.*;\npublic class NonNullWithJdk {\n\t@lombok.NonNull\n\tprivate String test;\n\tpublic void testMethod(@lombok.NonNull String arg) {\n\t\tjava.util.Objects.requireNonNull(arg, \"arg is marked non-null but is null\");\n\t\tSystem.out.println(arg);\n\t}\n\tpublic void testMethodWithCheck1(@lombok.NonNull String arg) {\n\t\trequireNonNull(arg);\n\t}\n\tpublic void testMethodWithCheckAssign(@lombok.NonNull String arg) {\n\t\ttest = requireNonNull(arg);\n\t}\n\tpublic void testMethodWithCheck2(@lombok.NonNull String arg) {\n\t\tjava.util.Objects.requireNonNull(arg);\n\t}\n\tpublic void testMethodWithFakeCheck1(@lombok.NonNull String arg) {\n\t\tjava.util.Objects.requireNonNull(arg, \"arg is marked non-null but is null\");\n\t\trequireNonNull(\"\");\n\t}\n\tpublic void testMethodWithFakeCheck2(@lombok.NonNull String arg) {\n\t\tjava.util.Objects.requireNonNull(arg, \"arg is marked non-null but is null\");\n\t\tjava.util.Objects.requireNonNull(test);\n\t}\n\tpublic void testMethodWithFakeCheckAssign(@lombok.NonNull String arg) {\n\t\tjava.util.Objects.requireNonNull(arg, \"arg is marked non-null but is null\");\n\t\ttest = requireNonNull(test);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setTest(@lombok.NonNull final String test) {\n\t\tjava.util.Objects.requireNonNull(test, \"test is marked non-null but is null\");\n\t\tthis.test = test;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/NonNullWithSneakyThrows.java",
    "content": "//version 8:\nclass NonNullWithSneakyThrows {\n\tvoid test(@lombok.NonNull String in) {\n\t\ttry {\n\t\t\tif (in == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"in is marked non-null but is null\");\n\t\t\t}\n\t\t\tSystem.out.println(in);\n\t\t} catch (final java.lang.Throwable $ex) {\n\t\t\tthrow lombok.Lombok.sneakyThrow($ex);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/NullAnnotatedCheckerFrameworkSuperBuilder.java",
    "content": "//version 8:\n//CONF: lombok.addNullAnnotations = checkerframework\nimport java.util.List;\nclass NullAnnotatedCheckerFrameworkSuperBuilder {\n\tpublic static class Parent {\n\t\tint x;\n\t\tint y;\n\t\tint z;\n\t\tList<String> names;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static int $default$x() {\n\t\t\treturn 5;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ParentBuilder<C extends NullAnnotatedCheckerFrameworkSuperBuilder.Parent, B extends NullAnnotatedCheckerFrameworkSuperBuilder.Parent.ParentBuilder<C, B>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate boolean x$set;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate int x$value;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate int y;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate int z;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate java.util.ArrayList<String> names;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@org.checkerframework.checker.nullness.qual.NonNull\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B x(final int x) {\n\t\t\t\tthis.x$value = x;\n\t\t\t\tx$set = true;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@org.checkerframework.checker.nullness.qual.NonNull\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B y(final int y) {\n\t\t\t\tthis.y = y;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@org.checkerframework.checker.nullness.qual.NonNull\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B z(final int z) {\n\t\t\t\tthis.z = z;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@org.checkerframework.checker.nullness.qual.NonNull\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B name(final String name) {\n\t\t\t\tif (this.names == null) this.names = new java.util.ArrayList<String>();\n\t\t\t\tthis.names.add(name);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@org.checkerframework.checker.nullness.qual.NonNull\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B names(final java.util.@org.checkerframework.checker.nullness.qual.NonNull Collection<? extends String> names) {\n\t\t\t\tif (names == null) {\n\t\t\t\t\tthrow new java.lang.NullPointerException(\"names cannot be null\");\n\t\t\t\t}\n\t\t\t\tif (this.names == null) this.names = new java.util.ArrayList<String>();\n\t\t\t\tthis.names.addAll(names);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@org.checkerframework.checker.nullness.qual.NonNull\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B clearNames() {\n\t\t\t\tif (this.names != null) this.names.clear();\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.@org.checkerframework.checker.nullness.qual.NonNull String toString() {\n\t\t\t\treturn \"NullAnnotatedCheckerFrameworkSuperBuilder.Parent.ParentBuilder(x$value=\" + this.x$value + \", y=\" + this.y + \", z=\" + this.z + \", names=\" + this.names + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ParentBuilderImpl extends NullAnnotatedCheckerFrameworkSuperBuilder.Parent.ParentBuilder<NullAnnotatedCheckerFrameworkSuperBuilder.Parent, NullAnnotatedCheckerFrameworkSuperBuilder.Parent.ParentBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ParentBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected NullAnnotatedCheckerFrameworkSuperBuilder.Parent.ParentBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic NullAnnotatedCheckerFrameworkSuperBuilder.@org.checkerframework.checker.nullness.qual.NonNull Parent build() {\n\t\t\t\treturn new NullAnnotatedCheckerFrameworkSuperBuilder.Parent(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Parent(final NullAnnotatedCheckerFrameworkSuperBuilder.Parent.ParentBuilder<?, ?> b) {\n\t\t\tif (b.x$set) this.x = b.x$value;\n\t\t\t else this.x = NullAnnotatedCheckerFrameworkSuperBuilder.Parent.$default$x();\n\t\t\tthis.y = b.y;\n\t\t\tthis.z = b.z;\n\t\t\tjava.util.List<String> names;\n\t\t\tswitch (b.names == null ? 0 : b.names.size()) {\n\t\t\tcase 0: \n\t\t\t\tnames = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tnames = java.util.Collections.singletonList(b.names.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tnames = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(b.names));\n\t\t\t}\n\t\t\tthis.names = names;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static NullAnnotatedCheckerFrameworkSuperBuilder.Parent.@org.checkerframework.checker.nullness.qual.NonNull ParentBuilder<?, ?> builder() {\n\t\t\treturn new NullAnnotatedCheckerFrameworkSuperBuilder.Parent.ParentBuilderImpl();\n\t\t}\n\t}\n\tpublic static class ZChild extends Parent {\n\t\tint a;\n\t\tint b;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static int $default$a() {\n\t\t\treturn 1;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ZChildBuilder<C extends NullAnnotatedCheckerFrameworkSuperBuilder.ZChild, B extends NullAnnotatedCheckerFrameworkSuperBuilder.ZChild.ZChildBuilder<C, B>> extends Parent.ParentBuilder<C, B> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate boolean a$set;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate int a$value;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate int b;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@org.checkerframework.checker.nullness.qual.NonNull\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B a(final int a) {\n\t\t\t\tthis.a$value = a;\n\t\t\t\ta$set = true;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@org.checkerframework.checker.nullness.qual.NonNull\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B b(final int b) {\n\t\t\t\tthis.b = b;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.@org.checkerframework.checker.nullness.qual.NonNull String toString() {\n\t\t\t\treturn \"NullAnnotatedCheckerFrameworkSuperBuilder.ZChild.ZChildBuilder(super=\" + super.toString() + \", a$value=\" + this.a$value + \", b=\" + this.b + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ZChildBuilderImpl extends NullAnnotatedCheckerFrameworkSuperBuilder.ZChild.ZChildBuilder<NullAnnotatedCheckerFrameworkSuperBuilder.ZChild, NullAnnotatedCheckerFrameworkSuperBuilder.ZChild.ZChildBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ZChildBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected NullAnnotatedCheckerFrameworkSuperBuilder.ZChild.ZChildBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic NullAnnotatedCheckerFrameworkSuperBuilder.@org.checkerframework.checker.nullness.qual.NonNull ZChild build() {\n\t\t\t\treturn new NullAnnotatedCheckerFrameworkSuperBuilder.ZChild(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected ZChild(final NullAnnotatedCheckerFrameworkSuperBuilder.ZChild.ZChildBuilder<?, ?> b) {\n\t\t\tsuper(b);\n\t\t\tif (b.a$set) this.a = b.a$value;\n\t\t\t else this.a = NullAnnotatedCheckerFrameworkSuperBuilder.ZChild.$default$a();\n\t\t\tthis.b = b.b;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static NullAnnotatedCheckerFrameworkSuperBuilder.ZChild.@org.checkerframework.checker.nullness.qual.NonNull ZChildBuilder<?, ?> builder() {\n\t\t\treturn new NullAnnotatedCheckerFrameworkSuperBuilder.ZChild.ZChildBuilderImpl();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/NullLibrary1.java",
    "content": "//version 8:\npublic class NullLibrary1 {\n\tString foo;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.@org.eclipse.jdt.annotation.Nullable Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof NullLibrary1)) return false;\n\t\tfinal NullLibrary1 other = (NullLibrary1) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tfinal java.lang.Object this$foo = this.foo;\n\t\tfinal java.lang.Object other$foo = other.foo;\n\t\tif (this$foo == null ? other$foo != null : !this$foo.equals(other$foo)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.@org.eclipse.jdt.annotation.Nullable Object other) {\n\t\treturn other instanceof NullLibrary1;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tfinal java.lang.Object $foo = this.foo;\n\t\tresult = result * PRIME + ($foo == null ? 43 : $foo.hashCode());\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.@org.eclipse.jdt.annotation.NonNull String toString() {\n\t\treturn \"NullLibrary1(foo=\" + this.foo + \")\";\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic NullLibrary1(final String foo) {\n\t\tthis.foo = foo;\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@org.eclipse.jdt.annotation.NonNull\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic NullLibrary1 withFoo(final String foo) {\n\t\treturn this.foo == foo ? this : new NullLibrary1(foo);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/NullLibrary2.java",
    "content": "//version 8: springframework dep is too new to run on j6\npublic class NullLibrary2 {\n\tString foo;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(@org.springframework.lang.Nullable final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof NullLibrary2)) return false;\n\t\tfinal NullLibrary2 other = (NullLibrary2) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tfinal java.lang.Object this$foo = this.foo;\n\t\tfinal java.lang.Object other$foo = other.foo;\n\t\tif (this$foo == null ? other$foo != null : !this$foo.equals(other$foo)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(@org.springframework.lang.Nullable final java.lang.Object other) {\n\t\treturn other instanceof NullLibrary2;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tfinal java.lang.Object $foo = this.foo;\n\t\tresult = result * PRIME + ($foo == null ? 43 : $foo.hashCode());\n\t\treturn result;\n\t}\n\t@org.springframework.lang.NonNull\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"NullLibrary2(foo=\" + this.foo + \")\";\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic NullLibrary2(final String foo) {\n\t\tthis.foo = foo;\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@org.springframework.lang.NonNull\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic NullLibrary2 withFoo(final String foo) {\n\t\treturn this.foo == foo ? this : new NullLibrary2(foo);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/NullLibrary3.java",
    "content": "public class NullLibrary3 {\n\t@jakarta.annotation.Nonnull\n\tString foo;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(@jakarta.annotation.Nullable final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof NullLibrary3)) return false;\n\t\tfinal NullLibrary3 other = (NullLibrary3) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tfinal java.lang.Object this$foo = this.foo;\n\t\tfinal java.lang.Object other$foo = other.foo;\n\t\tif (this$foo == null ? other$foo != null : !this$foo.equals(other$foo)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(@jakarta.annotation.Nullable final java.lang.Object other) {\n\t\treturn other instanceof NullLibrary3;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tfinal java.lang.Object $foo = this.foo;\n\t\tresult = result * PRIME + ($foo == null ? 43 : $foo.hashCode());\n\t\treturn result;\n\t}\n\t@jakarta.annotation.Nonnull\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"NullLibrary3(foo=\" + this.foo + \")\";\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic NullLibrary3(@jakarta.annotation.Nonnull final String foo) {\n\t\tif (foo == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"foo is marked non-null but is null\");\n\t\t}\n\t\tthis.foo = foo;\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@jakarta.annotation.Nonnull\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic NullLibrary3 withFoo(@jakarta.annotation.Nonnull final String foo) {\n\t\tif (foo == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"foo is marked non-null but is null\");\n\t\t}\n\t\treturn this.foo == foo ? this : new NullLibrary3(foo);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/OnXJava7Style.java",
    "content": "//version :7\npublic class OnXJava7Style {\n\t@interface Foo {\n\t\tString value() default \"\";\n\t}\n\t@interface Bar {\n\t\tString stuff() default \"\";\n\t}\n\t@interface Array {\n\t\tString[] value() default {};\n\t}\n\tString a;\n\tString b;\n\tString c;\n\tString d;\n\tString e;\n\tString f;\n\tString g;\n\tString h;\n\tString i;\n\t@Foo\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getA() {\n\t\treturn this.a;\n\t}\n\t@Foo\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setB(final String b) {\n\t\tthis.b = b;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setC(@Foo(\"a\") final String c) {\n\t\tthis.c = c;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setD(@Bar(stuff = \"b\") final String d) {\n\t\tthis.d = d;\n\t}\n\t@Foo(\"c\")\n\t@Bar(stuff = \"d\")\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getE() {\n\t\treturn this.e;\n\t}\n\t@Array\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getF() {\n\t\treturn this.f;\n\t}\n\t@Array\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getG() {\n\t\treturn this.g;\n\t}\n\t@Array({})\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getH() {\n\t\treturn this.h;\n\t}\n\t@Array({\"a\", \"b\"})\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getI() {\n\t\treturn this.i;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/OnXJava8Style.java",
    "content": "//version 8:\npublic class OnXJava8Style {\n\t@interface Foo {\n\t\tString value() default \"\";\n\t}\n\t@interface Bar {\n\t\tString stuff() default \"\";\n\t}\n\t@interface Array {\n\t\tString[] value() default {};\n\t}\n\tString a;\n\tString b;\n\tString c;\n\tString d;\n\tString e;\n\tString f;\n\tString g;\n\tString h;\n\tString i;\n\t@Foo\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getA() {\n\t\treturn this.a;\n\t}\n\t@Foo\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setB(final String b) {\n\t\tthis.b = b;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setC(@Foo(\"a\") final String c) {\n\t\tthis.c = c;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setD(@Bar(stuff = \"b\") final String d) {\n\t\tthis.d = d;\n\t}\n\t@Foo(\"c\")\n\t@Bar(stuff = \"d\")\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getE() {\n\t\treturn this.e;\n\t}\n\t@Array\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getF() {\n\t\treturn this.f;\n\t}\n\t@Array\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getG() {\n\t\treturn this.g;\n\t}\n\t@Array({})\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getH() {\n\t\treturn this.h;\n\t}\n\t@Array({\"a\", \"b\"})\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getI() {\n\t\treturn this.i;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/PrivateNoArgsConstructor.java",
    "content": "public class PrivateNoArgsConstructor {\n\tprivate static class Base {\n\t}\n\tpublic static class PrivateNoArgsConstructorNotOnExtends extends Base {\n\t\tprivate final int a;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic PrivateNoArgsConstructorNotOnExtends(final int a) {\n\t\t\tthis.a = a;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic int getA() {\n\t\t\treturn this.a;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic boolean equals(final java.lang.Object o) {\n\t\t\tif (o == this) return true;\n\t\t\tif (!(o instanceof PrivateNoArgsConstructor.PrivateNoArgsConstructorNotOnExtends)) return false;\n\t\t\tfinal PrivateNoArgsConstructor.PrivateNoArgsConstructorNotOnExtends other = (PrivateNoArgsConstructor.PrivateNoArgsConstructorNotOnExtends) o;\n\t\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\t\tif (!super.equals(o)) return false;\n\t\t\tif (this.getA() != other.getA()) return false;\n\t\t\treturn true;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected boolean canEqual(final java.lang.Object other) {\n\t\t\treturn other instanceof PrivateNoArgsConstructor.PrivateNoArgsConstructorNotOnExtends;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic int hashCode() {\n\t\t\tfinal int PRIME = 59;\n\t\t\tint result = super.hashCode();\n\t\t\tresult = result * PRIME + this.getA();\n\t\t\treturn result;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"PrivateNoArgsConstructor.PrivateNoArgsConstructorNotOnExtends(a=\" + this.getA() + \")\";\n\t\t}\n\t}\n\tpublic static class PrivateNoArgsConstructorOnExtendsObject extends Object {\n\t\tprivate final int b;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic PrivateNoArgsConstructorOnExtendsObject(final int b) {\n\t\t\tthis.b = b;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate PrivateNoArgsConstructorOnExtendsObject() {\n\t\t\tthis.b = 0;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic int getB() {\n\t\t\treturn this.b;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic boolean equals(final java.lang.Object o) {\n\t\t\tif (o == this) return true;\n\t\t\tif (!(o instanceof PrivateNoArgsConstructor.PrivateNoArgsConstructorOnExtendsObject)) return false;\n\t\t\tfinal PrivateNoArgsConstructor.PrivateNoArgsConstructorOnExtendsObject other = (PrivateNoArgsConstructor.PrivateNoArgsConstructorOnExtendsObject) o;\n\t\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\t\tif (this.getB() != other.getB()) return false;\n\t\t\treturn true;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected boolean canEqual(final java.lang.Object other) {\n\t\t\treturn other instanceof PrivateNoArgsConstructor.PrivateNoArgsConstructorOnExtendsObject;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic int hashCode() {\n\t\t\tfinal int PRIME = 59;\n\t\t\tint result = 1;\n\t\t\tresult = result * PRIME + this.getB();\n\t\t\treturn result;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"PrivateNoArgsConstructor.PrivateNoArgsConstructorOnExtendsObject(b=\" + this.getB() + \")\";\n\t\t}\n\t}\n\tpublic static class PrivateNoArgsConstructorExplicitBefore {\n\t\tprivate final int c;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic PrivateNoArgsConstructorExplicitBefore() {\n\t\t\tthis.c = 0;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic int getC() {\n\t\t\treturn this.c;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic boolean equals(final java.lang.Object o) {\n\t\t\tif (o == this) return true;\n\t\t\tif (!(o instanceof PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitBefore)) return false;\n\t\t\tfinal PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitBefore other = (PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitBefore) o;\n\t\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\t\tif (this.getC() != other.getC()) return false;\n\t\t\treturn true;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected boolean canEqual(final java.lang.Object other) {\n\t\t\treturn other instanceof PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitBefore;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic int hashCode() {\n\t\t\tfinal int PRIME = 59;\n\t\t\tint result = 1;\n\t\t\tresult = result * PRIME + this.getC();\n\t\t\treturn result;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitBefore(c=\" + this.getC() + \")\";\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic PrivateNoArgsConstructorExplicitBefore(final int c) {\n\t\t\tthis.c = c;\n\t\t}\n\t}\n\tpublic static class PrivateNoArgsConstructorExplicitAfter {\n\t\tprivate final int d;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic int getD() {\n\t\t\treturn this.d;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic boolean equals(final java.lang.Object o) {\n\t\t\tif (o == this) return true;\n\t\t\tif (!(o instanceof PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitAfter)) return false;\n\t\t\tfinal PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitAfter other = (PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitAfter) o;\n\t\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\t\tif (this.getD() != other.getD()) return false;\n\t\t\treturn true;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected boolean canEqual(final java.lang.Object other) {\n\t\t\treturn other instanceof PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitAfter;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic int hashCode() {\n\t\t\tfinal int PRIME = 59;\n\t\t\tint result = 1;\n\t\t\tresult = result * PRIME + this.getD();\n\t\t\treturn result;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitAfter(d=\" + this.getD() + \")\";\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic PrivateNoArgsConstructorExplicitAfter() {\n\t\t\tthis.d = 0;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic PrivateNoArgsConstructorExplicitAfter(final int d) {\n\t\t\tthis.d = d;\n\t\t}\n\t}\n\tpublic static class PrivateNoArgsConstructorExplicitNone {\n\t\tprivate final int e;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic int getE() {\n\t\t\treturn this.e;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic boolean equals(final java.lang.Object o) {\n\t\t\tif (o == this) return true;\n\t\t\tif (!(o instanceof PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitNone)) return false;\n\t\t\tfinal PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitNone other = (PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitNone) o;\n\t\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\t\tif (this.getE() != other.getE()) return false;\n\t\t\treturn true;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected boolean canEqual(final java.lang.Object other) {\n\t\t\treturn other instanceof PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitNone;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic int hashCode() {\n\t\t\tfinal int PRIME = 59;\n\t\t\tint result = 1;\n\t\t\tresult = result * PRIME + this.getE();\n\t\t\treturn result;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitNone(e=\" + this.getE() + \")\";\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic PrivateNoArgsConstructorExplicitNone(final int e) {\n\t\t\tthis.e = e;\n\t\t}\n\t}\n\tpublic static class PrivateNoArgsConstructorNoFields {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic PrivateNoArgsConstructorNoFields() {\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic boolean equals(final java.lang.Object o) {\n\t\t\tif (o == this) return true;\n\t\t\tif (!(o instanceof PrivateNoArgsConstructor.PrivateNoArgsConstructorNoFields)) return false;\n\t\t\tfinal PrivateNoArgsConstructor.PrivateNoArgsConstructorNoFields other = (PrivateNoArgsConstructor.PrivateNoArgsConstructorNoFields) o;\n\t\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\t\treturn true;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected boolean canEqual(final java.lang.Object other) {\n\t\t\treturn other instanceof PrivateNoArgsConstructor.PrivateNoArgsConstructorNoFields;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic int hashCode() {\n\t\t\tfinal int result = 1;\n\t\t\treturn result;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"PrivateNoArgsConstructor.PrivateNoArgsConstructorNoFields()\";\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SetterAccessLevel.java",
    "content": "class SetterAccessLevel {\n\tboolean isNone;\n\tboolean isPrivate;\n\tboolean isPackage;\n\tboolean isProtected;\n\tboolean isPublic;\n\tboolean value;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate void setPrivate(final boolean isPrivate) {\n\t\tthis.isPrivate = isPrivate;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tvoid setPackage(final boolean isPackage) {\n\t\tthis.isPackage = isPackage;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected void setProtected(final boolean isProtected) {\n\t\tthis.isProtected = isProtected;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setPublic(final boolean isPublic) {\n\t\tthis.isPublic = isPublic;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setValue(final boolean value) {\n\t\tthis.value = value;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SetterAlreadyExists.java",
    "content": "class Setter1 {\n\tboolean foo;\n\tvoid setFoo(boolean foo) {\n\t}\n}\nclass Setter2 {\n\tboolean foo;\n\tvoid setFoo(String foo) {\n\t}\n}\nclass Setter3 {\n\tString foo;\n\tvoid setFoo(boolean foo) {\n\t}\n}\nclass Setter4 {\n\tString foo;\n\tvoid setFoo(String foo) {\n\t}\n}\nclass Setter5 {\n\tString foo;\n\tvoid setFoo() {\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setFoo(final String foo) {\n\t\tthis.foo = foo;\n\t}\n}\nclass Setter6 {\n\tString foo;\n\tvoid setFoo(String foo, int x) {\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setFoo(final String foo) {\n\t\tthis.foo = foo;\n\t}\n}\nclass Setter7 {\n\tString foo;\n\tvoid setFoo(String foo, Object... x) {\n\t}\n}\nclass Setter8 {\n\tboolean isFoo;\n\tvoid setIsFoo(boolean foo) {\n\t}\n}\nclass Setter9 {\n\tboolean isFoo;\n\tvoid setFoo(boolean foo) {\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SetterAndWithMethodJavadoc.java",
    "content": "class SetterAndWithMethodJavadoc {\n\t/**\n\t * Some value.\n\t */\n\tint i;\n\t/**\n\t * Some other value.\n\t */\n\tint j;\n\tSetterAndWithMethodJavadoc(int i, int j) {\n\t\tthis.i = i;\n\t\tthis.j = j;\n\t}\n\t/**\n\t * Some value.\n\t * @param the new value\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setI(final int i) {\n\t\tthis.i = i;\n\t}\n\t/**\n\t * Some value.\n\t * @param the new value\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic SetterAndWithMethodJavadoc withI(final int i) {\n\t\treturn this.i == i ? this : new SetterAndWithMethodJavadoc(i, this.j);\n\t}\n\t/**\n\t * Set some other value.\n\t * @param the new other value\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setJ(final int j) {\n\t\tthis.j = j;\n\t}\n\t/**\n\t * Reinstantiate with some other value.\n\t * @param the other new other value\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic SetterAndWithMethodJavadoc withJ(final int j) {\n\t\treturn this.j == j ? this : new SetterAndWithMethodJavadoc(this.i, j);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SetterDeprecated.java",
    "content": "class SetterDeprecated {\n\t@Deprecated\n\tint annotation;\n\t/**\n\t * @deprecated\n\t */\n\tint javadoc;\n\t@java.lang.Deprecated\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setAnnotation(final int annotation) {\n\t\tthis.annotation = annotation;\n\t}\n\t/**\n\t * @deprecated\n\t */\n\t@java.lang.Deprecated\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setJavadoc(final int javadoc) {\n\t\tthis.javadoc = javadoc;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SetterInAnonymousClass.java",
    "content": "public class SetterInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\tclass Inner {\n\t\t\tprivate String string;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic void setString(final String string) {\n\t\t\t\tthis.string = string;\n\t\t\t}\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SetterOnClass.java",
    "content": "//version 8:\nclass SetterOnClass1 {\n\tboolean isNone;\n\tboolean isPublic;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setPublic(final boolean isPublic) {\n\t\tthis.isPublic = isPublic;\n\t}\n}\nclass SetterOnClass2 {\n\tboolean isNone;\n\tboolean isProtected;\n\tboolean isPackage;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected void setProtected(final boolean isProtected) {\n\t\tthis.isProtected = isProtected;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tvoid setPackage(final boolean isPackage) {\n\t\tthis.isPackage = isPackage;\n\t}\n}\nclass SetterOnClass3 {\n\tboolean isNone;\n\tboolean isPackage;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tvoid setPackage(final boolean isPackage) {\n\t\tthis.isPackage = isPackage;\n\t}\n}\nclass SetterOnClass4 {\n\tboolean isNone;\n\tboolean isPrivate;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate void setPrivate(final boolean isPrivate) {\n\t\tthis.isPrivate = isPrivate;\n\t}\n}\nclass SetterOnClass5 {\n\tboolean isNone;\n\tboolean isPublic;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setPublic(final boolean isPublic) {\n\t\tthis.isPublic = isPublic;\n\t}\n}\nclass SetterOnClass6 {\n\tString couldBeNull;\n\t@lombok.NonNull\n\tString nonNull;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setCouldBeNull(final String couldBeNull) {\n\t\tthis.couldBeNull = couldBeNull;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setNonNull(@lombok.NonNull final String nonNull) {\n\t\tif (nonNull == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"nonNull is marked non-null but is null\");\n\t\t}\n\t\tthis.nonNull = nonNull;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SetterOnMethodOnParam.java",
    "content": "class SetterOnMethodOnParam {\n\tint i;\n\tint j;\n\tint k;\n\tpublic @interface Test {\n\t}\n\t@Deprecated\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setI(final int i) {\n\t\tthis.i = i;\n\t}\n\t@java.lang.Deprecated\n\t@Test\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setJ(@Test final int j) {\n\t\tthis.j = j;\n\t}\n\t@java.lang.Deprecated\n\t@Test\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setK(@Test final int k) {\n\t\tthis.k = k;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SetterOnRecord.java",
    "content": "// version 14:\npublic record SetterOnRecord(String a, String b) {\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SetterOnStatic.java",
    "content": "class Setter {\n\tstatic boolean foo;\n\tstatic int bar;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static void setFoo(final boolean foo) {\n\t\tSetter.foo = foo;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static void setBar(final int bar) {\n\t\tSetter.bar = bar;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SetterPlain.java",
    "content": "class SetterPlain {\n\tint i;\n\tint foo;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setI(final int i) {\n\t\tthis.i = i;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setFoo(final int foo) {\n\t\tthis.foo = foo;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SetterTypeAnnos.java",
    "content": "import java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.List;\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})\n@interface TA {\n}\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})\n@interface TB {\n}\nclass SetterTypeAnnos {\n\t@TA\n\t@TB\n\tList<String> foo;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setFoo(@TA final List<String> foo) {\n\t\tthis.foo = foo;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SetterWithDollar.java",
    "content": "class SetterWithDollar1 {\n\tint $i;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void set$i(final int $i) {\n\t\tthis.$i = $i;\n\t}\n}\nclass SetterWithDollar2 {\n\tint $i;\n\tint i;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void set$i(final int $i) {\n\t\tthis.$i = $i;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setI(final int i) {\n\t\tthis.i = i;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SetterWithJavaBeansSpecCapitalization.java",
    "content": "class SetterWithJavaBeansSpecCapitalization {\n\tint a;\n\tint aField;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setA(final int a) {\n\t\tthis.a = a;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setaField(final int aField) {\n\t\tthis.aField = aField;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SimpleTypeResolution.java",
    "content": "class SimpleTypeResolutionFail {\n\t@Getter\n\tprivate int x;\n}\nclass SimpleTypeResolutionSuccess {\n\tprivate int x;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getX() {\n\t\treturn this.x;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SingularCleanupForDelombok.java",
    "content": "// version 8:\nimport java.util.Set;\nimport lombok.NonNull;\nclass Book {\n\t@NonNull\n\tprivate final String name;\n\t@NonNull\n\tprivate final Set<String> authors;\n\tprivate final int numberOfAuthors;\n\tpublic Book(String name, Set<String> authors) {\n\t\tthis(name, authors, authors.size());\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class BookBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate String name;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<String> authors;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tBookBuilder() {\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic Book.BookBuilder name(final String name) {\n\t\t\tthis.name = name;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic Book.BookBuilder author(final String author) {\n\t\t\tif (this.authors == null) this.authors = new java.util.ArrayList<String>();\n\t\t\tthis.authors.add(author);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic Book.BookBuilder authors(final java.util.Collection<? extends String> authors) {\n\t\t\tif (authors == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"authors cannot be null\");\n\t\t\t}\n\t\t\tif (this.authors == null) this.authors = new java.util.ArrayList<String>();\n\t\t\tthis.authors.addAll(authors);\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic Book.BookBuilder clearAuthors() {\n\t\t\tif (this.authors != null) this.authors.clear();\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic Book build() {\n\t\t\tjava.util.Set<String> authors;\n\t\t\tswitch (this.authors == null ? 0 : this.authors.size()) {\n\t\t\tcase 0: \n\t\t\t\tauthors = java.util.Collections.emptySet();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\tauthors = java.util.Collections.singleton(this.authors.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\tauthors = new java.util.LinkedHashSet<String>(this.authors.size() < 1073741824 ? 1 + this.authors.size() + (this.authors.size() - 3) / 3 : java.lang.Integer.MAX_VALUE);\n\t\t\t\tauthors.addAll(this.authors);\n\t\t\t\tauthors = java.util.Collections.unmodifiableSet(authors);\n\t\t\t}\n\t\t\treturn new Book(this.name, authors);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"Book.BookBuilder(name=\" + this.name + \", authors=\" + this.authors + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static Book.BookBuilder builder() {\n\t\treturn new Book.BookBuilder();\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tBook(@NonNull final String name, @NonNull final Set<String> authors, final int numberOfAuthors) {\n\t\tif (name == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"name is marked non-null but is null\");\n\t\t}\n\t\tif (authors == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"authors is marked non-null but is null\");\n\t\t}\n\t\tthis.name = name;\n\t\tthis.authors = authors;\n\t\tthis.numberOfAuthors = numberOfAuthors;\n\t}\n\t@NonNull\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String name() {\n\t\treturn this.name;\n\t}\n\t@NonNull\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic Set<String> authors() {\n\t\treturn this.authors;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SkipSuppressWarnings.java",
    "content": "class SkipSuppressWarnings {\n\tprivate String field = \"\";\n\tprivate final java.util.concurrent.atomic.AtomicReference<java.lang.Object> field2 = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n\t@lombok.Generated\n\tpublic String getField() {\n\t\treturn this.field;\n\t}\n\t@java.lang.SuppressWarnings({\"unchecked\"})\n\t@lombok.Generated\n\tpublic String getField2() {\n\t\tjava.lang.Object $value = this.field2.get();\n\t\tif ($value == null) {\n\t\t\tsynchronized (this.field2) {\n\t\t\t\t$value = this.field2.get();\n\t\t\t\tif ($value == null) {\n\t\t\t\t\tfinal String actualValue = \"\";\n\t\t\t\t\t$value = actualValue == null ? this.field2 : actualValue;\n\t\t\t\t\tthis.field2.set($value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn (String) ($value == this.field2 ? null : $value);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SneakyThrowsInInitializer.java",
    "content": "public class SneakyThrowsInInitializer {\n\tpublic static final Runnable R = new Runnable() {\n\t\t@Override\n\t\tpublic void run() {\n\t\t\ttry {\n\t\t\t\tSystem.out.println(\"test\");\n\t\t\t} catch (final java.lang.Throwable $ex) {\n\t\t\t\tthrow lombok.Lombok.sneakyThrow($ex);\n\t\t\t}\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SneakyThrowsMultiple.java",
    "content": "import java.awt.AWTException;\nimport java.io.IOException;\nimport java.util.Random;\nclass SneakyThrowsMultiple {\n\tpublic void test() {\n\t\ttry {\n\t\t\ttry {\n\t\t\t\tSystem.out.println(\"test1\");\n\t\t\t\tthrow new IOException();\n\t\t\t} catch (final IOException $ex) {\n\t\t\t\tthrow lombok.Lombok.sneakyThrow($ex);\n\t\t\t}\n\t\t} catch (final Throwable $ex) {\n\t\t\tthrow lombok.Lombok.sneakyThrow($ex);\n\t\t}\n\t}\n\tpublic void test2() {\n\t\ttry {\n\t\t\ttry {\n\t\t\t\tSystem.out.println(\"test2\");\n\t\t\t\tif (new Random().nextBoolean()) {\n\t\t\t\t\tthrow new IOException();\n\t\t\t\t} else {\n\t\t\t\t\tthrow new AWTException(\"WHAT\");\n\t\t\t\t}\n\t\t\t} catch (final AWTException $ex) {\n\t\t\t\tthrow lombok.Lombok.sneakyThrow($ex);\n\t\t\t}\n\t\t} catch (final IOException $ex) {\n\t\t\tthrow lombok.Lombok.sneakyThrow($ex);\n\t\t}\n\t}\n\tpublic void test3() {\n\t\ttry {\n\t\t\ttry {\n\t\t\t\tSystem.out.println(\"test3\");\n\t\t\t\tthrow new IOException();\n\t\t\t} catch (final IOException $ex) {\n\t\t\t\tthrow lombok.Lombok.sneakyThrow($ex);\n\t\t\t}\n\t\t} catch (final Throwable $ex) {\n\t\t\tthrow lombok.Lombok.sneakyThrow($ex);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SneakyThrowsPlain.java",
    "content": "class SneakyThrowsPlain {\n\tSneakyThrowsPlain() {\n\t\tsuper();\n\t\ttry {\n\t\t\tSystem.out.println(\"constructor\");\n\t\t} catch (final java.lang.Throwable $ex) {\n\t\t\tthrow lombok.Lombok.sneakyThrow($ex);\n\t\t}\n\t}\n\tSneakyThrowsPlain(int x) {\n\t\tthis();\n\t\ttry {\n\t\t\tSystem.out.println(\"constructor2\");\n\t\t} catch (final java.lang.Throwable $ex) {\n\t\t\tthrow lombok.Lombok.sneakyThrow($ex);\n\t\t}\n\t}\n\tpublic void test() {\n\t\ttry {\n\t\t\tSystem.out.println(\"test1\");\n\t\t} catch (final java.lang.Throwable $ex) {\n\t\t\tthrow lombok.Lombok.sneakyThrow($ex);\n\t\t}\n\t}\n\tpublic void test2() {\n\t\ttry {\n\t\t\tSystem.out.println(\"test2\");\n\t\t} catch (final java.lang.Throwable $ex) {\n\t\t\tthrow lombok.Lombok.sneakyThrow($ex);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SneakyThrowsSingle.java",
    "content": "import java.io.IOException;\nclass SneakyThrowsSingle {\n\tpublic void test() {\n\t\ttry {\n\t\t\tSystem.out.println(\"test1\");\n\t\t} catch (final Throwable $ex) {\n\t\t\tthrow lombok.Lombok.sneakyThrow($ex);\n\t\t}\n\t}\n\tpublic void test2() {\n\t\ttry {\n\t\t\tSystem.out.println(\"test2\");\n\t\t\tthrow new IOException();\n\t\t} catch (final IOException $ex) {\n\t\t\tthrow lombok.Lombok.sneakyThrow($ex);\n\t\t}\n\t}\n\tpublic void test3() {\n\t\ttry {\n\t\t\tSystem.out.println(\"test3\");\n\t\t\tthrow new IOException();\n\t\t} catch (final IOException $ex) {\n\t\t\tthrow lombok.Lombok.sneakyThrow($ex);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/StandardExceptionWithConstructor.java",
    "content": "public class StandardExceptionWithConstructor extends Exception {\n\tpublic StandardExceptionWithConstructor(Integer x, Integer y) {\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic StandardExceptionWithConstructor() {\n\t\tthis((java.lang.String) null, (java.lang.Throwable) null);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic StandardExceptionWithConstructor(final java.lang.String message) {\n\t\tthis(message, (java.lang.Throwable) null);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic StandardExceptionWithConstructor(final java.lang.Throwable cause) {\n\t\tthis(cause != null ? cause.getMessage() : null, cause);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic StandardExceptionWithConstructor(final java.lang.String message, final java.lang.Throwable cause) {\n\t\tsuper(message);\n\t\tif (cause != null) super.initCause(cause);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/StandardExceptions.java",
    "content": "class EmptyException extends Exception {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic EmptyException() {\n\t\tthis((java.lang.String) null, (java.lang.Throwable) null);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic EmptyException(final java.lang.String message) {\n\t\tthis(message, (java.lang.Throwable) null);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic EmptyException(final java.lang.Throwable cause) {\n\t\tthis(cause != null ? cause.getMessage() : null, cause);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic EmptyException(final java.lang.String message, final java.lang.Throwable cause) {\n\t\tsuper(message);\n\t\tif (cause != null) super.initCause(cause);\n\t}\n}\nclass NoArgsException extends Exception {\n\tpublic NoArgsException() {\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected NoArgsException(final java.lang.String message) {\n\t\tthis(message, (java.lang.Throwable) null);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected NoArgsException(final java.lang.Throwable cause) {\n\t\tthis(cause != null ? cause.getMessage() : null, cause);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected NoArgsException(final java.lang.String message, final java.lang.Throwable cause) {\n\t\tsuper(message);\n\t\tif (cause != null) super.initCause(cause);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/StaticConstructor.java",
    "content": "//version 8:\npublic class StaticConstructor {\n\tString name;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate StaticConstructor(final String name) {\n\t\tthis.name = name;\n\t}\n\t@org.checkerframework.checker.nullness.qual.NonNull\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static StaticConstructor of(final String name) {\n\t\treturn new StaticConstructor(name);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderAbstract.java",
    "content": "public class SuperBuilderAbstract {\n\tpublic static class Parent {\n\t\tint parentField;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ParentBuilder<C extends SuperBuilderAbstract.Parent, B extends SuperBuilderAbstract.Parent.ParentBuilder<C, B>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate int parentField;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B parentField(final int parentField) {\n\t\t\t\tthis.parentField = parentField;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderAbstract.Parent.ParentBuilder(parentField=\" + this.parentField + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ParentBuilderImpl extends SuperBuilderAbstract.Parent.ParentBuilder<SuperBuilderAbstract.Parent, SuperBuilderAbstract.Parent.ParentBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ParentBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderAbstract.Parent.ParentBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderAbstract.Parent build() {\n\t\t\t\treturn new SuperBuilderAbstract.Parent(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Parent(final SuperBuilderAbstract.Parent.ParentBuilder<?, ?> b) {\n\t\t\tthis.parentField = b.parentField;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static SuperBuilderAbstract.Parent.ParentBuilder<?, ?> builder() {\n\t\t\treturn new SuperBuilderAbstract.Parent.ParentBuilderImpl();\n\t\t}\n\t}\n\tpublic static abstract class Child extends Parent {\n\t\tdouble childField;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ChildBuilder<C extends SuperBuilderAbstract.Child, B extends SuperBuilderAbstract.Child.ChildBuilder<C, B>> extends Parent.ParentBuilder<C, B> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate double childField;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B childField(final double childField) {\n\t\t\t\tthis.childField = childField;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderAbstract.Child.ChildBuilder(super=\" + super.toString() + \", childField=\" + this.childField + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Child(final SuperBuilderAbstract.Child.ChildBuilder<?, ?> b) {\n\t\t\tsuper(b);\n\t\t\tthis.childField = b.childField;\n\t\t}\n\t}\n\tpublic static class GrandChild extends Child {\n\t\tString grandChildField;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class GrandChildBuilder<C extends SuperBuilderAbstract.GrandChild, B extends SuperBuilderAbstract.GrandChild.GrandChildBuilder<C, B>> extends Child.ChildBuilder<C, B> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate String grandChildField;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B grandChildField(final String grandChildField) {\n\t\t\t\tthis.grandChildField = grandChildField;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderAbstract.GrandChild.GrandChildBuilder(super=\" + super.toString() + \", grandChildField=\" + this.grandChildField + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class GrandChildBuilderImpl extends SuperBuilderAbstract.GrandChild.GrandChildBuilder<SuperBuilderAbstract.GrandChild, SuperBuilderAbstract.GrandChild.GrandChildBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate GrandChildBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderAbstract.GrandChild.GrandChildBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderAbstract.GrandChild build() {\n\t\t\t\treturn new SuperBuilderAbstract.GrandChild(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected GrandChild(final SuperBuilderAbstract.GrandChild.GrandChildBuilder<?, ?> b) {\n\t\t\tsuper(b);\n\t\t\tthis.grandChildField = b.grandChildField;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static SuperBuilderAbstract.GrandChild.GrandChildBuilder<?, ?> builder() {\n\t\t\treturn new SuperBuilderAbstract.GrandChild.GrandChildBuilderImpl();\n\t\t}\n\t}\n\tpublic static void test() {\n\t\tGrandChild x = GrandChild.builder().grandChildField(\"\").parentField(5).childField(2.5).build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderAbstractToBuilder.java",
    "content": "public class SuperBuilderAbstractToBuilder {\n\tpublic static class Parent {\n\t\tint parentField;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ParentBuilder<C extends SuperBuilderAbstractToBuilder.Parent, B extends SuperBuilderAbstractToBuilder.Parent.ParentBuilder<C, B>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate int parentField;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected B $fillValuesFrom(final C instance) {\n\t\t\t\tSuperBuilderAbstractToBuilder.Parent.ParentBuilder.$fillValuesFromInstanceIntoBuilder(instance, this);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate static void $fillValuesFromInstanceIntoBuilder(final SuperBuilderAbstractToBuilder.Parent instance, final SuperBuilderAbstractToBuilder.Parent.ParentBuilder<?, ?> b) {\n\t\t\t\tb.parentField(instance.parentField);\n\t\t\t}\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B parentField(final int parentField) {\n\t\t\t\tthis.parentField = parentField;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderAbstractToBuilder.Parent.ParentBuilder(parentField=\" + this.parentField + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ParentBuilderImpl extends SuperBuilderAbstractToBuilder.Parent.ParentBuilder<SuperBuilderAbstractToBuilder.Parent, SuperBuilderAbstractToBuilder.Parent.ParentBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ParentBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderAbstractToBuilder.Parent.ParentBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderAbstractToBuilder.Parent build() {\n\t\t\t\treturn new SuperBuilderAbstractToBuilder.Parent(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Parent(final SuperBuilderAbstractToBuilder.Parent.ParentBuilder<?, ?> b) {\n\t\t\tthis.parentField = b.parentField;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static SuperBuilderAbstractToBuilder.Parent.ParentBuilder<?, ?> builder() {\n\t\t\treturn new SuperBuilderAbstractToBuilder.Parent.ParentBuilderImpl();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic SuperBuilderAbstractToBuilder.Parent.ParentBuilder<?, ?> toBuilder() {\n\t\t\treturn new SuperBuilderAbstractToBuilder.Parent.ParentBuilderImpl().$fillValuesFrom(this);\n\t\t}\n\t}\n\tpublic static abstract class Child extends Parent {\n\t\tdouble childField;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ChildBuilder<C extends SuperBuilderAbstractToBuilder.Child, B extends SuperBuilderAbstractToBuilder.Child.ChildBuilder<C, B>> extends Parent.ParentBuilder<C, B> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate double childField;\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected B $fillValuesFrom(final C instance) {\n\t\t\t\tsuper.$fillValuesFrom(instance);\n\t\t\t\tSuperBuilderAbstractToBuilder.Child.ChildBuilder.$fillValuesFromInstanceIntoBuilder(instance, this);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate static void $fillValuesFromInstanceIntoBuilder(final SuperBuilderAbstractToBuilder.Child instance, final SuperBuilderAbstractToBuilder.Child.ChildBuilder<?, ?> b) {\n\t\t\t\tb.childField(instance.childField);\n\t\t\t}\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B childField(final double childField) {\n\t\t\t\tthis.childField = childField;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderAbstractToBuilder.Child.ChildBuilder(super=\" + super.toString() + \", childField=\" + this.childField + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Child(final SuperBuilderAbstractToBuilder.Child.ChildBuilder<?, ?> b) {\n\t\t\tsuper(b);\n\t\t\tthis.childField = b.childField;\n\t\t}\n\t}\n\tpublic static class GrandChild extends Child {\n\t\tString grandChildField;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class GrandChildBuilder<C extends SuperBuilderAbstractToBuilder.GrandChild, B extends SuperBuilderAbstractToBuilder.GrandChild.GrandChildBuilder<C, B>> extends Child.ChildBuilder<C, B> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate String grandChildField;\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected B $fillValuesFrom(final C instance) {\n\t\t\t\tsuper.$fillValuesFrom(instance);\n\t\t\t\tSuperBuilderAbstractToBuilder.GrandChild.GrandChildBuilder.$fillValuesFromInstanceIntoBuilder(instance, this);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate static void $fillValuesFromInstanceIntoBuilder(final SuperBuilderAbstractToBuilder.GrandChild instance, final SuperBuilderAbstractToBuilder.GrandChild.GrandChildBuilder<?, ?> b) {\n\t\t\t\tb.grandChildField(instance.grandChildField);\n\t\t\t}\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B grandChildField(final String grandChildField) {\n\t\t\t\tthis.grandChildField = grandChildField;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderAbstractToBuilder.GrandChild.GrandChildBuilder(super=\" + super.toString() + \", grandChildField=\" + this.grandChildField + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class GrandChildBuilderImpl extends SuperBuilderAbstractToBuilder.GrandChild.GrandChildBuilder<SuperBuilderAbstractToBuilder.GrandChild, SuperBuilderAbstractToBuilder.GrandChild.GrandChildBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate GrandChildBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderAbstractToBuilder.GrandChild.GrandChildBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderAbstractToBuilder.GrandChild build() {\n\t\t\t\treturn new SuperBuilderAbstractToBuilder.GrandChild(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected GrandChild(final SuperBuilderAbstractToBuilder.GrandChild.GrandChildBuilder<?, ?> b) {\n\t\t\tsuper(b);\n\t\t\tthis.grandChildField = b.grandChildField;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static SuperBuilderAbstractToBuilder.GrandChild.GrandChildBuilder<?, ?> builder() {\n\t\t\treturn new SuperBuilderAbstractToBuilder.GrandChild.GrandChildBuilderImpl();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic SuperBuilderAbstractToBuilder.GrandChild.GrandChildBuilder<?, ?> toBuilder() {\n\t\t\treturn new SuperBuilderAbstractToBuilder.GrandChild.GrandChildBuilderImpl().$fillValuesFrom(this);\n\t\t}\n\t}\n\tpublic static void test() {\n\t\tGrandChild x = GrandChild.builder().grandChildField(\"\").parentField(5).childField(2.5).build().toBuilder().build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderBasic.java",
    "content": "import java.util.List;\npublic class SuperBuilderBasic {\n\tpublic static class Parent {\n\t\tint field1;\n\t\tList<String> items;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ParentBuilder<C extends SuperBuilderBasic.Parent, B extends SuperBuilderBasic.Parent.ParentBuilder<C, B>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate int field1;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate java.util.ArrayList<String> items;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B field1(final int field1) {\n\t\t\t\tthis.field1 = field1;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B item(final String item) {\n\t\t\t\tif (this.items == null) this.items = new java.util.ArrayList<String>();\n\t\t\t\tthis.items.add(item);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B items(final java.util.Collection<? extends String> items) {\n\t\t\t\tif (items == null) {\n\t\t\t\t\tthrow new java.lang.NullPointerException(\"items cannot be null\");\n\t\t\t\t}\n\t\t\t\tif (this.items == null) this.items = new java.util.ArrayList<String>();\n\t\t\t\tthis.items.addAll(items);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B clearItems() {\n\t\t\t\tif (this.items != null) this.items.clear();\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderBasic.Parent.ParentBuilder(field1=\" + this.field1 + \", items=\" + this.items + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ParentBuilderImpl extends SuperBuilderBasic.Parent.ParentBuilder<SuperBuilderBasic.Parent, SuperBuilderBasic.Parent.ParentBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ParentBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderBasic.Parent.ParentBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderBasic.Parent build() {\n\t\t\t\treturn new SuperBuilderBasic.Parent(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Parent(final SuperBuilderBasic.Parent.ParentBuilder<?, ?> b) {\n\t\t\tthis.field1 = b.field1;\n\t\t\tjava.util.List<String> items;\n\t\t\tswitch (b.items == null ? 0 : b.items.size()) {\n\t\t\tcase 0: \n\t\t\t\titems = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\titems = java.util.Collections.singletonList(b.items.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\titems = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(b.items));\n\t\t\t}\n\t\t\tthis.items = items;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static SuperBuilderBasic.Parent.ParentBuilder<?, ?> builder() {\n\t\t\treturn new SuperBuilderBasic.Parent.ParentBuilderImpl();\n\t\t}\n\t}\n\tpublic static class Child extends SuperBuilderBasic.Parent {\n\t\tdouble field3;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ChildBuilder<C extends SuperBuilderBasic.Child, B extends SuperBuilderBasic.Child.ChildBuilder<C, B>> extends SuperBuilderBasic.Parent.ParentBuilder<C, B> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate double field3;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B field3(final double field3) {\n\t\t\t\tthis.field3 = field3;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderBasic.Child.ChildBuilder(super=\" + super.toString() + \", field3=\" + this.field3 + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ChildBuilderImpl extends SuperBuilderBasic.Child.ChildBuilder<SuperBuilderBasic.Child, SuperBuilderBasic.Child.ChildBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ChildBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderBasic.Child.ChildBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderBasic.Child build() {\n\t\t\t\treturn new SuperBuilderBasic.Child(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Child(final SuperBuilderBasic.Child.ChildBuilder<?, ?> b) {\n\t\t\tsuper(b);\n\t\t\tthis.field3 = b.field3;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static SuperBuilderBasic.Child.ChildBuilder<?, ?> builder() {\n\t\t\treturn new SuperBuilderBasic.Child.ChildBuilderImpl();\n\t\t}\n\t}\n\tpublic static void test() {\n\t\tChild x = Child.builder().field3(0.0).field1(5).item(\"\").build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderBasicToBuilder.java",
    "content": "import java.util.List;\npublic class SuperBuilderBasicToBuilder {\n\tpublic static class Parent {\n\t\tprivate int field1;\n\t\tint obtainViaField;\n\t\tint obtainViaMethod;\n\t\tString obtainViaStaticMethod;\n\t\tList<String> items;\n\t\tprivate int method() {\n\t\t\treturn 2;\n\t\t}\n\t\tprivate static String staticMethod(Parent instance) {\n\t\t\treturn \"staticMethod\";\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ParentBuilder<C extends SuperBuilderBasicToBuilder.Parent, B extends SuperBuilderBasicToBuilder.Parent.ParentBuilder<C, B>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate int field1;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate int obtainViaField;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate int obtainViaMethod;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate String obtainViaStaticMethod;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate java.util.ArrayList<String> items;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected B $fillValuesFrom(final C instance) {\n\t\t\t\tSuperBuilderBasicToBuilder.Parent.ParentBuilder.$fillValuesFromInstanceIntoBuilder(instance, this);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate static void $fillValuesFromInstanceIntoBuilder(final SuperBuilderBasicToBuilder.Parent instance, final SuperBuilderBasicToBuilder.Parent.ParentBuilder<?, ?> b) {\n\t\t\t\tb.field1(instance.field1);\n\t\t\t\tb.obtainViaField(instance.field1);\n\t\t\t\tb.obtainViaMethod(instance.method());\n\t\t\t\tb.obtainViaStaticMethod(SuperBuilderBasicToBuilder.Parent.staticMethod(instance));\n\t\t\t\tb.items(instance.items == null ? java.util.Collections.<String>emptyList() : instance.items);\n\t\t\t}\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B field1(final int field1) {\n\t\t\t\tthis.field1 = field1;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B obtainViaField(final int obtainViaField) {\n\t\t\t\tthis.obtainViaField = obtainViaField;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B obtainViaMethod(final int obtainViaMethod) {\n\t\t\t\tthis.obtainViaMethod = obtainViaMethod;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B obtainViaStaticMethod(final String obtainViaStaticMethod) {\n\t\t\t\tthis.obtainViaStaticMethod = obtainViaStaticMethod;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B item(final String item) {\n\t\t\t\tif (this.items == null) this.items = new java.util.ArrayList<String>();\n\t\t\t\tthis.items.add(item);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B items(final java.util.Collection<? extends String> items) {\n\t\t\t\tif (items == null) {\n\t\t\t\t\tthrow new java.lang.NullPointerException(\"items cannot be null\");\n\t\t\t\t}\n\t\t\t\tif (this.items == null) this.items = new java.util.ArrayList<String>();\n\t\t\t\tthis.items.addAll(items);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B clearItems() {\n\t\t\t\tif (this.items != null) this.items.clear();\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderBasicToBuilder.Parent.ParentBuilder(field1=\" + this.field1 + \", obtainViaField=\" + this.obtainViaField + \", obtainViaMethod=\" + this.obtainViaMethod + \", obtainViaStaticMethod=\" + this.obtainViaStaticMethod + \", items=\" + this.items + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ParentBuilderImpl extends SuperBuilderBasicToBuilder.Parent.ParentBuilder<SuperBuilderBasicToBuilder.Parent, SuperBuilderBasicToBuilder.Parent.ParentBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ParentBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderBasicToBuilder.Parent.ParentBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderBasicToBuilder.Parent build() {\n\t\t\t\treturn new SuperBuilderBasicToBuilder.Parent(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Parent(final SuperBuilderBasicToBuilder.Parent.ParentBuilder<?, ?> b) {\n\t\t\tthis.field1 = b.field1;\n\t\t\tthis.obtainViaField = b.obtainViaField;\n\t\t\tthis.obtainViaMethod = b.obtainViaMethod;\n\t\t\tthis.obtainViaStaticMethod = b.obtainViaStaticMethod;\n\t\t\tjava.util.List<String> items;\n\t\t\tswitch (b.items == null ? 0 : b.items.size()) {\n\t\t\tcase 0: \n\t\t\t\titems = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\titems = java.util.Collections.singletonList(b.items.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\titems = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(b.items));\n\t\t\t}\n\t\t\tthis.items = items;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static SuperBuilderBasicToBuilder.Parent.ParentBuilder<?, ?> builder() {\n\t\t\treturn new SuperBuilderBasicToBuilder.Parent.ParentBuilderImpl();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic SuperBuilderBasicToBuilder.Parent.ParentBuilder<?, ?> toBuilder() {\n\t\t\treturn new SuperBuilderBasicToBuilder.Parent.ParentBuilderImpl().$fillValuesFrom(this);\n\t\t}\n\t}\n\tpublic static class Child extends Parent {\n\t\tprivate double field3;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ChildBuilder<C extends SuperBuilderBasicToBuilder.Child, B extends SuperBuilderBasicToBuilder.Child.ChildBuilder<C, B>> extends Parent.ParentBuilder<C, B> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate double field3;\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected B $fillValuesFrom(final C instance) {\n\t\t\t\tsuper.$fillValuesFrom(instance);\n\t\t\t\tSuperBuilderBasicToBuilder.Child.ChildBuilder.$fillValuesFromInstanceIntoBuilder(instance, this);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate static void $fillValuesFromInstanceIntoBuilder(final SuperBuilderBasicToBuilder.Child instance, final SuperBuilderBasicToBuilder.Child.ChildBuilder<?, ?> b) {\n\t\t\t\tb.field3(instance.field3);\n\t\t\t}\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B field3(final double field3) {\n\t\t\t\tthis.field3 = field3;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderBasicToBuilder.Child.ChildBuilder(super=\" + super.toString() + \", field3=\" + this.field3 + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ChildBuilderImpl extends SuperBuilderBasicToBuilder.Child.ChildBuilder<SuperBuilderBasicToBuilder.Child, SuperBuilderBasicToBuilder.Child.ChildBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ChildBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderBasicToBuilder.Child.ChildBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderBasicToBuilder.Child build() {\n\t\t\t\treturn new SuperBuilderBasicToBuilder.Child(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Child(final SuperBuilderBasicToBuilder.Child.ChildBuilder<?, ?> b) {\n\t\t\tsuper(b);\n\t\t\tthis.field3 = b.field3;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static SuperBuilderBasicToBuilder.Child.ChildBuilder<?, ?> builder() {\n\t\t\treturn new SuperBuilderBasicToBuilder.Child.ChildBuilderImpl();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic SuperBuilderBasicToBuilder.Child.ChildBuilder<?, ?> toBuilder() {\n\t\t\treturn new SuperBuilderBasicToBuilder.Child.ChildBuilderImpl().$fillValuesFrom(this);\n\t\t}\n\t}\n\tpublic static void test() {\n\t\tChild x = Child.builder().field3(0.0).field1(5).item(\"\").build().toBuilder().build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderCustomName.java",
    "content": "import java.util.List;\nclass SuperBuilderCustomName<T> {\n\tprivate final int field;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static abstract class SimpleTestBuilder<T, C extends SuperBuilderCustomName<T>, B extends SuperBuilderCustomName.SimpleTestBuilder<T, C, B>> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int field;\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic B field(final int field) {\n\t\t\tthis.field = field;\n\t\t\treturn self();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected abstract B self();\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic abstract C build();\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"SuperBuilderCustomName.SimpleTestBuilder(field=\" + this.field + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final class SimpleTestBuilderImpl<T> extends SuperBuilderCustomName.SimpleTestBuilder<T, SuperBuilderCustomName<T>, SuperBuilderCustomName.SimpleTestBuilderImpl<T>> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate SimpleTestBuilderImpl() {\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected SuperBuilderCustomName.SimpleTestBuilderImpl<T> self() {\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic SuperBuilderCustomName<T> build() {\n\t\t\treturn new SuperBuilderCustomName<T>(this);\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected SuperBuilderCustomName(final SuperBuilderCustomName.SimpleTestBuilder<T, ?, ?> b) {\n\t\tthis.field = b.field;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static <T> SuperBuilderCustomName.SimpleTestBuilder<T, ?, ?> builder() {\n\t\treturn new SuperBuilderCustomName.SimpleTestBuilderImpl<T>();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderCustomized.java",
    "content": "import java.util.List;\npublic class SuperBuilderCustomized {\n\tpublic static class Parent {\n\t\tpublic static abstract class ParentBuilder<C extends Parent, B extends ParentBuilder<C, B>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate int field1;\n\t\t\tpublic B resetToDefault() {\n\t\t\t\tfield1 = 0;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\tpublic B field1(int field1) {\n\t\t\t\tthis.field1 = field1 + 1;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderCustomized.Parent.ParentBuilder(field1=\" + this.field1 + \")\";\n\t\t\t}\n\t\t}\n\t\tint field1;\n\t\tprotected Parent(ParentBuilder<?, ?> b) {\n\t\t\tif (b.field1 == 0) throw new IllegalArgumentException(\"field1 must be != 0\");\n\t\t\tthis.field1 = b.field1;\n\t\t}\n\t\tpublic static SuperBuilderCustomized.Parent.ParentBuilder<?, ?> builder(int field1) {\n\t\t\treturn new SuperBuilderCustomized.Parent.ParentBuilderImpl().field1(field1);\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ParentBuilderImpl extends SuperBuilderCustomized.Parent.ParentBuilder<SuperBuilderCustomized.Parent, SuperBuilderCustomized.Parent.ParentBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ParentBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderCustomized.Parent.ParentBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderCustomized.Parent build() {\n\t\t\t\treturn new SuperBuilderCustomized.Parent(this);\n\t\t\t}\n\t\t}\n\t}\n\tpublic static class Child extends Parent {\n\t\tprivate static final class ChildBuilderImpl extends ChildBuilder<Child, ChildBuilderImpl> {\n\t\t\t@Override\n\t\t\tpublic Child build() {\n\t\t\t\tthis.resetToDefault();\n\t\t\t\treturn new Child(this);\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ChildBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderCustomized.Child.ChildBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\t\tdouble field2;\n\t\tpublic static ChildBuilder<?, ?> builder() {\n\t\t\treturn new ChildBuilderImpl().field2(10.0);\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ChildBuilder<C extends SuperBuilderCustomized.Child, B extends SuperBuilderCustomized.Child.ChildBuilder<C, B>> extends Parent.ParentBuilder<C, B> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate double field2;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B field2(final double field2) {\n\t\t\t\tthis.field2 = field2;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderCustomized.Child.ChildBuilder(super=\" + super.toString() + \", field2=\" + this.field2 + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Child(final SuperBuilderCustomized.Child.ChildBuilder<?, ?> b) {\n\t\t\tsuper(b);\n\t\t\tthis.field2 = b.field2;\n\t\t}\n\t}\n\tpublic static void test() {\n\t\tChild x = Child.builder().field2(1.0).field1(5).resetToDefault().build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderCustomizedWithSetterPrefix.java",
    "content": "import java.util.List;\npublic class SuperBuilderCustomizedWithSetterPrefix {\n\tpublic static class Parent {\n\t\tpublic static abstract class ParentBuilder<C extends Parent, B extends ParentBuilder<C, B>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate int field1;\n\t\t\tpublic B setField1(int field1) {\n\t\t\t\tthis.field1 = field1 + 1;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderCustomizedWithSetterPrefix.Parent.ParentBuilder(field1=\" + this.field1 + \")\";\n\t\t\t}\n\t\t}\n\t\tint field1;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ParentBuilderImpl extends SuperBuilderCustomizedWithSetterPrefix.Parent.ParentBuilder<SuperBuilderCustomizedWithSetterPrefix.Parent, SuperBuilderCustomizedWithSetterPrefix.Parent.ParentBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ParentBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderCustomizedWithSetterPrefix.Parent.ParentBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderCustomizedWithSetterPrefix.Parent build() {\n\t\t\t\treturn new SuperBuilderCustomizedWithSetterPrefix.Parent(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Parent(final SuperBuilderCustomizedWithSetterPrefix.Parent.ParentBuilder<?, ?> b) {\n\t\t\tthis.field1 = b.field1;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static SuperBuilderCustomizedWithSetterPrefix.Parent.ParentBuilder<?, ?> builder() {\n\t\t\treturn new SuperBuilderCustomizedWithSetterPrefix.Parent.ParentBuilderImpl();\n\t\t}\n\t}\n\tpublic static void test() {\n\t\tParent x = Parent.builder().setField1(5).build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderInAnonymousClass.java",
    "content": "public class SuperBuilderInAnonymousClass {\n\tObject annonymous = new Object() {\n\n\t\tclass InnerParent {\n\t\t\tprivate String string;\n\t\t}\n\n\t\tclass InnerChild {\n\t\t\tprivate String string;\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderInitializer.java",
    "content": "class SuperBuilderInitializer {\n\tpublic static class One {\n\t\tprivate String world;\n\t\t{\n\t\t\tworld = \"Hello\";\n\t\t}\n\t\tprivate static final String world2;\n\t\tstatic {\n\t\t\tworld2 = \"Hello\";\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class OneBuilder<C extends SuperBuilderInitializer.One, B extends SuperBuilderInitializer.One.OneBuilder<C, B>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate String world;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B world(final String world) {\n\t\t\t\tthis.world = world;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderInitializer.One.OneBuilder(world=\" + this.world + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class OneBuilderImpl extends SuperBuilderInitializer.One.OneBuilder<SuperBuilderInitializer.One, SuperBuilderInitializer.One.OneBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate OneBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderInitializer.One.OneBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderInitializer.One build() {\n\t\t\t\treturn new SuperBuilderInitializer.One(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected One(final SuperBuilderInitializer.One.OneBuilder<?, ?> b) {\n\t\t\tthis.world = b.world;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static SuperBuilderInitializer.One.OneBuilder<?, ?> builder() {\n\t\t\treturn new SuperBuilderInitializer.One.OneBuilderImpl();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderJavadoc.java",
    "content": "import java.util.List;\npublic abstract class SuperBuilderJavadoc {\n\t/**\n\t * basic gets only a builder setter.\n\t * @see #getsetwith\n\t * @return tag is removed from the setter.\n\t */\n\tprivate final int basic;\n\t/**\n\t * getsetwith gets a builder setter, an instance getter and setter, and a wither.\n\t */\n\tprivate int getsetwith;\n\t/**\n\t * Predef has a predefined builder setter with no javadoc, and the builder setter does not get this one.\n\t * @param tag remains on the field.\n\t * @return tag remains on the field.\n\t */\n\tprivate final int predef;\n\t/**\n\t * predefWithJavadoc has a predefined builder setter with javadoc, so it keeps that one untouched.\n\t * @param tag is removed from the field.\n\t * @return tag remains on the field.\n\t */\n\tprivate final int predefWithJavadoc;\n\tpublic static abstract class SuperBuilderJavadocBuilder<C extends SuperBuilderJavadoc, B extends SuperBuilderJavadocBuilder<C, B>> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int basic;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int getsetwith;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int predef;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int predefWithJavadoc;\n\t\tpublic B predef(final int x) {\n\t\t\tthis.predef = x * 10;\n\t\t\treturn self();\n\t\t}\n\t\t/**\n\t\t * This javadoc remains untouched.\n\t\t * @param x 1/100 of the thing\n\t\t * @return the updated builder\n\t\t */\n\t\tpublic B predefWithJavadoc(final int x) {\n\t\t\tthis.predefWithJavadoc = x * 100;\n\t\t\treturn self();\n\t\t}\n\t\t/**\n\t\t * basic gets only a builder setter.\n\t\t * @see #getsetwith\n\t\t * @param tag is moved to the setter.\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic B basic(final int basic) {\n\t\t\tthis.basic = basic;\n\t\t\treturn self();\n\t\t}\n\t\t/**\n\t\t * getsetwith gets a builder setter, an instance getter and setter, and a wither.\n\t\t * @param tag is moved to the setters and wither.\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic B getsetwith(final int getsetwith) {\n\t\t\tthis.getsetwith = getsetwith;\n\t\t\treturn self();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected abstract B self();\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic abstract C build();\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"SuperBuilderJavadoc.SuperBuilderJavadocBuilder(basic=\" + this.basic + \", getsetwith=\" + this.getsetwith + \", predef=\" + this.predef + \", predefWithJavadoc=\" + this.predefWithJavadoc + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected SuperBuilderJavadoc(final SuperBuilderJavadoc.SuperBuilderJavadocBuilder<?, ?> b) {\n\t\tthis.basic = b.basic;\n\t\tthis.getsetwith = b.getsetwith;\n\t\tthis.predef = b.predef;\n\t\tthis.predefWithJavadoc = b.predefWithJavadoc;\n\t}\n\t/**\n\t * getsetwith gets a builder setter, an instance getter and setter, and a wither.\n\t * @return tag is moved to the getter.\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getGetsetwith() {\n\t\treturn this.getsetwith;\n\t}\n\t/**\n\t * getsetwith gets a builder setter, an instance getter and setter, and a wither.\n\t * @param tag is moved to the setters and wither.\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setGetsetwith(final int getsetwith) {\n\t\tthis.getsetwith = getsetwith;\n\t}\n\t/**\n\t * getsetwith gets a builder setter, an instance getter and setter, and a wither.\n\t * @param tag is moved to the setters and wither.\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic abstract SuperBuilderJavadoc withGetsetwith(final int getsetwith);\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderNameClashes.java",
    "content": "public class SuperBuilderNameClashes {\n\tpublic static class GenericsClash<B, C, C2> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class GenericsClashBuilder<B, C, C2, C3 extends SuperBuilderNameClashes.GenericsClash<B, C, C2>, B2 extends SuperBuilderNameClashes.GenericsClash.GenericsClashBuilder<B, C, C2, C3, B2>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B2 self();\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C3 build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderNameClashes.GenericsClash.GenericsClashBuilder()\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class GenericsClashBuilderImpl<B, C, C2> extends SuperBuilderNameClashes.GenericsClash.GenericsClashBuilder<B, C, C2, SuperBuilderNameClashes.GenericsClash<B, C, C2>, SuperBuilderNameClashes.GenericsClash.GenericsClashBuilderImpl<B, C, C2>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate GenericsClashBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderNameClashes.GenericsClash.GenericsClashBuilderImpl<B, C, C2> self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderNameClashes.GenericsClash<B, C, C2> build() {\n\t\t\t\treturn new SuperBuilderNameClashes.GenericsClash<B, C, C2>(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected GenericsClash(final SuperBuilderNameClashes.GenericsClash.GenericsClashBuilder<B, C, C2, ?, ?> b) {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static <B, C, C2> SuperBuilderNameClashes.GenericsClash.GenericsClashBuilder<B, C, C2, ?, ?> builder() {\n\t\t\treturn new SuperBuilderNameClashes.GenericsClash.GenericsClashBuilderImpl<B, C, C2>();\n\t\t}\n\t}\n\tpublic static class B {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class BBuilder<C extends SuperBuilderNameClashes.B, B2 extends SuperBuilderNameClashes.B.BBuilder<C, B2>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B2 self();\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderNameClashes.B.BBuilder()\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class BBuilderImpl extends SuperBuilderNameClashes.B.BBuilder<SuperBuilderNameClashes.B, SuperBuilderNameClashes.B.BBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate BBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderNameClashes.B.BBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderNameClashes.B build() {\n\t\t\t\treturn new SuperBuilderNameClashes.B(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected B(final SuperBuilderNameClashes.B.BBuilder<?, ?> b) {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static SuperBuilderNameClashes.B.BBuilder<?, ?> builder() {\n\t\t\treturn new SuperBuilderNameClashes.B.BBuilderImpl();\n\t\t}\n\t}\n\tpublic static class C2 {\n\t}\n\tpublic static class C {\n\t\tC2 c2;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class CBuilder<C3 extends SuperBuilderNameClashes.C, B extends SuperBuilderNameClashes.C.CBuilder<C3, B>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate C2 c2;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B c2(final C2 c2) {\n\t\t\t\tthis.c2 = c2;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C3 build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderNameClashes.C.CBuilder(c2=\" + this.c2 + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class CBuilderImpl extends SuperBuilderNameClashes.C.CBuilder<SuperBuilderNameClashes.C, SuperBuilderNameClashes.C.CBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate CBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderNameClashes.C.CBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderNameClashes.C build() {\n\t\t\t\treturn new SuperBuilderNameClashes.C(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected C(final SuperBuilderNameClashes.C.CBuilder<?, ?> b) {\n\t\t\tthis.c2 = b.c2;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static SuperBuilderNameClashes.C.CBuilder<?, ?> builder() {\n\t\t\treturn new SuperBuilderNameClashes.C.CBuilderImpl();\n\t\t}\n\t}\n\tinterface B2 {\n\t\tinterface B4<X> {\n\t\t}\n\t}\n\tinterface B3<Y> {\n\t}\n\tpublic static class ExtendsClauseCollision extends B implements B2.B4<Object>, B3<Object> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ExtendsClauseCollisionBuilder<C extends SuperBuilderNameClashes.ExtendsClauseCollision, B4 extends SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilder<C, B4>> extends B.BBuilder<C, B4> {\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B4 self();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilder(super=\" + super.toString() + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ExtendsClauseCollisionBuilderImpl extends SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilder<SuperBuilderNameClashes.ExtendsClauseCollision, SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ExtendsClauseCollisionBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderNameClashes.ExtendsClauseCollision build() {\n\t\t\t\treturn new SuperBuilderNameClashes.ExtendsClauseCollision(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected ExtendsClauseCollision(final SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilder<?, ?> b) {\n\t\t\tsuper(b);\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilder<?, ?> builder() {\n\t\t\treturn new SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilderImpl();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderNestedGenericTypes.java",
    "content": "public class SuperBuilderNestedGenericTypes {\n\tpublic static abstract class Generic<T extends Generic<?>> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class GenericBuilder<T extends Generic<?>, C extends SuperBuilderNestedGenericTypes.Generic<T>, B extends SuperBuilderNestedGenericTypes.Generic.GenericBuilder<T, C, B>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderNestedGenericTypes.Generic.GenericBuilder()\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Generic(final SuperBuilderNestedGenericTypes.Generic.GenericBuilder<T, ?, ?> b) {\n\t\t}\n\t}\n\tpublic static abstract class NestedGeneric<T extends OtherGeneric<?>> extends Generic<NestedGeneric<? extends OtherGeneric<?>>> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class NestedGenericBuilder<T extends OtherGeneric<?>, C extends SuperBuilderNestedGenericTypes.NestedGeneric<T>, B extends SuperBuilderNestedGenericTypes.NestedGeneric.NestedGenericBuilder<T, C, B>> extends Generic.GenericBuilder<NestedGeneric<? extends OtherGeneric<?>>, C, B> {\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderNestedGenericTypes.NestedGeneric.NestedGenericBuilder(super=\" + super.toString() + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected NestedGeneric(final SuperBuilderNestedGenericTypes.NestedGeneric.NestedGenericBuilder<T, ?, ?> b) {\n\t\t\tsuper(b);\n\t\t}\n\t}\n\tpublic interface OtherGeneric<T> {\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderSingularAnnotatedTypes.java",
    "content": "//version 8:\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.Set;\nimport java.util.Map;\nimport lombok.NonNull;\n@Target(ElementType.TYPE_USE)\n@interface MyAnnotation {\n}\nclass SuperBuilderSingularAnnotatedTypes {\n\tprivate Set<@MyAnnotation @NonNull String> foos;\n\tprivate Map<@MyAnnotation @NonNull String, @MyAnnotation @NonNull Integer> bars;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static abstract class SuperBuilderSingularAnnotatedTypesBuilder<C extends SuperBuilderSingularAnnotatedTypes, B extends SuperBuilderSingularAnnotatedTypes.SuperBuilderSingularAnnotatedTypesBuilder<C, B>> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<@MyAnnotation @NonNull String> foos;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<@MyAnnotation @NonNull String> bars$key;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<@MyAnnotation @NonNull Integer> bars$value;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic B foo(@MyAnnotation @NonNull final String foo) {\n\t\t\tif (foo == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"foo is marked non-null but is null\");\n\t\t\t}\n\t\t\tif (this.foos == null) this.foos = new java.util.ArrayList<@MyAnnotation @NonNull String>();\n\t\t\tthis.foos.add(foo);\n\t\t\treturn self();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic B foos(final java.util.Collection<? extends @MyAnnotation @NonNull String> foos) {\n\t\t\tif (foos == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"foos cannot be null\");\n\t\t\t}\n\t\t\tif (this.foos == null) this.foos = new java.util.ArrayList<@MyAnnotation @NonNull String>();\n\t\t\tthis.foos.addAll(foos);\n\t\t\treturn self();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic B clearFoos() {\n\t\t\tif (this.foos != null) this.foos.clear();\n\t\t\treturn self();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic B bar(@MyAnnotation @NonNull final String barKey, @MyAnnotation @NonNull final Integer barValue) {\n\t\t\tif (barKey == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"barKey is marked non-null but is null\");\n\t\t\t}\n\t\t\tif (barValue == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"barValue is marked non-null but is null\");\n\t\t\t}\n\t\t\tif (this.bars$key == null) {\n\t\t\t\tthis.bars$key = new java.util.ArrayList<@MyAnnotation @NonNull String>();\n\t\t\t\tthis.bars$value = new java.util.ArrayList<@MyAnnotation @NonNull Integer>();\n\t\t\t}\n\t\t\tthis.bars$key.add(barKey);\n\t\t\tthis.bars$value.add(barValue);\n\t\t\treturn self();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic B bars(final java.util.Map<? extends @MyAnnotation @NonNull String, ? extends @MyAnnotation @NonNull Integer> bars) {\n\t\t\tif (bars == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"bars cannot be null\");\n\t\t\t}\n\t\t\tif (this.bars$key == null) {\n\t\t\t\tthis.bars$key = new java.util.ArrayList<@MyAnnotation @NonNull String>();\n\t\t\t\tthis.bars$value = new java.util.ArrayList<@MyAnnotation @NonNull Integer>();\n\t\t\t}\n\t\t\tfor (final java.util.Map.Entry<? extends @MyAnnotation @NonNull String, ? extends @MyAnnotation @NonNull Integer> $lombokEntry : bars.entrySet()) {\n\t\t\t\tthis.bars$key.add($lombokEntry.getKey());\n\t\t\t\tthis.bars$value.add($lombokEntry.getValue());\n\t\t\t}\n\t\t\treturn self();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic B clearBars() {\n\t\t\tif (this.bars$key != null) {\n\t\t\t\tthis.bars$key.clear();\n\t\t\t\tthis.bars$value.clear();\n\t\t\t}\n\t\t\treturn self();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected abstract B self();\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic abstract C build();\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"SuperBuilderSingularAnnotatedTypes.SuperBuilderSingularAnnotatedTypesBuilder(foos=\" + this.foos + \", bars$key=\" + this.bars$key + \", bars$value=\" + this.bars$value + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final class SuperBuilderSingularAnnotatedTypesBuilderImpl extends SuperBuilderSingularAnnotatedTypes.SuperBuilderSingularAnnotatedTypesBuilder<SuperBuilderSingularAnnotatedTypes, SuperBuilderSingularAnnotatedTypes.SuperBuilderSingularAnnotatedTypesBuilderImpl> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate SuperBuilderSingularAnnotatedTypesBuilderImpl() {\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected SuperBuilderSingularAnnotatedTypes.SuperBuilderSingularAnnotatedTypesBuilderImpl self() {\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic SuperBuilderSingularAnnotatedTypes build() {\n\t\t\treturn new SuperBuilderSingularAnnotatedTypes(this);\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected SuperBuilderSingularAnnotatedTypes(final SuperBuilderSingularAnnotatedTypes.SuperBuilderSingularAnnotatedTypesBuilder<?, ?> b) {\n\t\tjava.util.Set<@MyAnnotation @NonNull String> foos;\n\t\tswitch (b.foos == null ? 0 : b.foos.size()) {\n\t\tcase 0: \n\t\t\tfoos = java.util.Collections.emptySet();\n\t\t\tbreak;\n\t\tcase 1: \n\t\t\tfoos = java.util.Collections.singleton(b.foos.get(0));\n\t\t\tbreak;\n\t\tdefault: \n\t\t\tfoos = new java.util.LinkedHashSet<@MyAnnotation @NonNull String>(b.foos.size() < 1073741824 ? 1 + b.foos.size() + (b.foos.size() - 3) / 3 : java.lang.Integer.MAX_VALUE);\n\t\t\tfoos.addAll(b.foos);\n\t\t\tfoos = java.util.Collections.unmodifiableSet(foos);\n\t\t}\n\t\tthis.foos = foos;\n\t\tjava.util.Map<@MyAnnotation @NonNull String, @MyAnnotation @NonNull Integer> bars;\n\t\tswitch (b.bars$key == null ? 0 : b.bars$key.size()) {\n\t\tcase 0: \n\t\t\tbars = java.util.Collections.emptyMap();\n\t\t\tbreak;\n\t\tcase 1: \n\t\t\tbars = java.util.Collections.singletonMap(b.bars$key.get(0), b.bars$value.get(0));\n\t\t\tbreak;\n\t\tdefault: \n\t\t\tbars = new java.util.LinkedHashMap<@MyAnnotation @NonNull String, @MyAnnotation @NonNull Integer>(b.bars$key.size() < 1073741824 ? 1 + b.bars$key.size() + (b.bars$key.size() - 3) / 3 : java.lang.Integer.MAX_VALUE);\n\t\t\tfor (int $i = 0; $i < b.bars$key.size(); $i++) bars.put(b.bars$key.get($i), (@MyAnnotation @NonNull Integer) b.bars$value.get($i));\n\t\t\tbars = java.util.Collections.unmodifiableMap(bars);\n\t\t}\n\t\tthis.bars = bars;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static SuperBuilderSingularAnnotatedTypes.SuperBuilderSingularAnnotatedTypesBuilder<?, ?> builder() {\n\t\treturn new SuperBuilderSingularAnnotatedTypes.SuperBuilderSingularAnnotatedTypesBuilderImpl();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderSingularCustomized.java",
    "content": "import java.util.Set;\nclass SuperBuilderSingularCustomized {\n\tprivate Set<String> foos;\n\tpublic static abstract class SuperBuilderSingularCustomizedBuilder<C extends SuperBuilderSingularCustomized, B extends SuperBuilderSingularCustomized.SuperBuilderSingularCustomizedBuilder<C, B>> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<String> foos;\n\t\tpublic B custom(final String value) {\n\t\t\treturn self();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic B foo(final String foo) {\n\t\t\tif (this.foos == null) this.foos = new java.util.ArrayList<String>();\n\t\t\tthis.foos.add(foo);\n\t\t\treturn self();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic B foos(final java.util.Collection<? extends String> foos) {\n\t\t\tif (foos == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"foos cannot be null\");\n\t\t\t}\n\t\t\tif (this.foos == null) this.foos = new java.util.ArrayList<String>();\n\t\t\tthis.foos.addAll(foos);\n\t\t\treturn self();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic B clearFoos() {\n\t\t\tif (this.foos != null) this.foos.clear();\n\t\t\treturn self();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected abstract B self();\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic abstract C build();\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"SuperBuilderSingularCustomized.SuperBuilderSingularCustomizedBuilder(foos=\" + this.foos + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final class SuperBuilderSingularCustomizedBuilderImpl extends SuperBuilderSingularCustomized.SuperBuilderSingularCustomizedBuilder<SuperBuilderSingularCustomized, SuperBuilderSingularCustomized.SuperBuilderSingularCustomizedBuilderImpl> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate SuperBuilderSingularCustomizedBuilderImpl() {\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected SuperBuilderSingularCustomized.SuperBuilderSingularCustomizedBuilderImpl self() {\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic SuperBuilderSingularCustomized build() {\n\t\t\treturn new SuperBuilderSingularCustomized(this);\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected SuperBuilderSingularCustomized(final SuperBuilderSingularCustomized.SuperBuilderSingularCustomizedBuilder<?, ?> b) {\n\t\tjava.util.Set<String> foos;\n\t\tswitch (b.foos == null ? 0 : b.foos.size()) {\n\t\tcase 0: \n\t\t\tfoos = java.util.Collections.emptySet();\n\t\t\tbreak;\n\t\tcase 1: \n\t\t\tfoos = java.util.Collections.singleton(b.foos.get(0));\n\t\t\tbreak;\n\t\tdefault: \n\t\t\tfoos = new java.util.LinkedHashSet<String>(b.foos.size() < 1073741824 ? 1 + b.foos.size() + (b.foos.size() - 3) / 3 : java.lang.Integer.MAX_VALUE);\n\t\t\tfoos.addAll(b.foos);\n\t\t\tfoos = java.util.Collections.unmodifiableSet(foos);\n\t\t}\n\t\tthis.foos = foos;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static SuperBuilderSingularCustomized.SuperBuilderSingularCustomizedBuilder<?, ?> builder() {\n\t\treturn new SuperBuilderSingularCustomized.SuperBuilderSingularCustomizedBuilderImpl();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderSingularToBuilderGuava.java",
    "content": "public class SuperBuilderSingularToBuilderGuava {\n\tpublic static class Parent<T> {\n\t\tprivate com.google.common.collect.ImmutableList<T> cards;\n\t\tprivate com.google.common.collect.ImmutableCollection<? extends Number> frogs;\n\t\t@SuppressWarnings(\"all\")\n\t\tprivate com.google.common.collect.ImmutableSet rawSet;\n\t\tprivate com.google.common.collect.ImmutableSortedSet<String> passes;\n\t\tprivate com.google.common.collect.ImmutableTable<? extends Number, ? extends Number, String> users;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ParentBuilder<T, C extends SuperBuilderSingularToBuilderGuava.Parent<T>, B extends SuperBuilderSingularToBuilderGuava.Parent.ParentBuilder<T, C, B>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate com.google.common.collect.ImmutableList.Builder<T> cards;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate com.google.common.collect.ImmutableList.Builder<Number> frogs;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate com.google.common.collect.ImmutableSet.Builder<java.lang.Object> rawSet;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate com.google.common.collect.ImmutableSortedSet.Builder<String> passes;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate com.google.common.collect.ImmutableTable.Builder<Number, Number, String> users;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected B $fillValuesFrom(final C instance) {\n\t\t\t\tSuperBuilderSingularToBuilderGuava.Parent.ParentBuilder.$fillValuesFromInstanceIntoBuilder(instance, this);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate static <T> void $fillValuesFromInstanceIntoBuilder(final SuperBuilderSingularToBuilderGuava.Parent<T> instance, final SuperBuilderSingularToBuilderGuava.Parent.ParentBuilder<T, ?, ?> b) {\n\t\t\t\tb.cards(instance.cards == null ? com.google.common.collect.ImmutableList.<T>of() : instance.cards);\n\t\t\t\tb.frogs(instance.frogs == null ? com.google.common.collect.ImmutableList.<Number>of() : instance.frogs);\n\t\t\t\tb.rawSet(instance.rawSet == null ? com.google.common.collect.ImmutableSet.<java.lang.Object>of() : instance.rawSet);\n\t\t\t\tb.passes(instance.passes == null ? com.google.common.collect.ImmutableSortedSet.<String>of() : instance.passes);\n\t\t\t\tb.users(instance.users == null ? com.google.common.collect.ImmutableTable.<Number, Number, String>of() : instance.users);\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B card(final T card) {\n\t\t\t\tif (this.cards == null) this.cards = com.google.common.collect.ImmutableList.builder();\n\t\t\t\tthis.cards.add(card);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B cards(final java.lang.Iterable<? extends T> cards) {\n\t\t\t\tif (cards == null) {\n\t\t\t\t\tthrow new java.lang.NullPointerException(\"cards cannot be null\");\n\t\t\t\t}\n\t\t\t\tif (this.cards == null) this.cards = com.google.common.collect.ImmutableList.builder();\n\t\t\t\tthis.cards.addAll(cards);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B clearCards() {\n\t\t\t\tthis.cards = null;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B frog(final Number frog) {\n\t\t\t\tif (this.frogs == null) this.frogs = com.google.common.collect.ImmutableList.builder();\n\t\t\t\tthis.frogs.add(frog);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B frogs(final java.lang.Iterable<? extends Number> frogs) {\n\t\t\t\tif (frogs == null) {\n\t\t\t\t\tthrow new java.lang.NullPointerException(\"frogs cannot be null\");\n\t\t\t\t}\n\t\t\t\tif (this.frogs == null) this.frogs = com.google.common.collect.ImmutableList.builder();\n\t\t\t\tthis.frogs.addAll(frogs);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B clearFrogs() {\n\t\t\t\tthis.frogs = null;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B rawSet(final java.lang.Object rawSet) {\n\t\t\t\tif (this.rawSet == null) this.rawSet = com.google.common.collect.ImmutableSet.builder();\n\t\t\t\tthis.rawSet.add(rawSet);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B rawSet(final java.lang.Iterable<?> rawSet) {\n\t\t\t\tif (rawSet == null) {\n\t\t\t\t\tthrow new java.lang.NullPointerException(\"rawSet cannot be null\");\n\t\t\t\t}\n\t\t\t\tif (this.rawSet == null) this.rawSet = com.google.common.collect.ImmutableSet.builder();\n\t\t\t\tthis.rawSet.addAll(rawSet);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B clearRawSet() {\n\t\t\t\tthis.rawSet = null;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B pass(final String pass) {\n\t\t\t\tif (this.passes == null) this.passes = com.google.common.collect.ImmutableSortedSet.naturalOrder();\n\t\t\t\tthis.passes.add(pass);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B passes(final java.lang.Iterable<? extends String> passes) {\n\t\t\t\tif (passes == null) {\n\t\t\t\t\tthrow new java.lang.NullPointerException(\"passes cannot be null\");\n\t\t\t\t}\n\t\t\t\tif (this.passes == null) this.passes = com.google.common.collect.ImmutableSortedSet.naturalOrder();\n\t\t\t\tthis.passes.addAll(passes);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B clearPasses() {\n\t\t\t\tthis.passes = null;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B user(final Number rowKey, final Number columnKey, final String value) {\n\t\t\t\tif (this.users == null) this.users = com.google.common.collect.ImmutableTable.builder();\n\t\t\t\tthis.users.put(rowKey, columnKey, value);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B users(final com.google.common.collect.Table<? extends Number, ? extends Number, ? extends String> users) {\n\t\t\t\tif (users == null) {\n\t\t\t\t\tthrow new java.lang.NullPointerException(\"users cannot be null\");\n\t\t\t\t}\n\t\t\t\tif (this.users == null) this.users = com.google.common.collect.ImmutableTable.builder();\n\t\t\t\tthis.users.putAll(users);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B clearUsers() {\n\t\t\t\tthis.users = null;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderSingularToBuilderGuava.Parent.ParentBuilder(cards=\" + this.cards + \", frogs=\" + this.frogs + \", rawSet=\" + this.rawSet + \", passes=\" + this.passes + \", users=\" + this.users + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ParentBuilderImpl<T> extends SuperBuilderSingularToBuilderGuava.Parent.ParentBuilder<T, SuperBuilderSingularToBuilderGuava.Parent<T>, SuperBuilderSingularToBuilderGuava.Parent.ParentBuilderImpl<T>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ParentBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderSingularToBuilderGuava.Parent.ParentBuilderImpl<T> self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderSingularToBuilderGuava.Parent<T> build() {\n\t\t\t\treturn new SuperBuilderSingularToBuilderGuava.Parent<T>(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Parent(final SuperBuilderSingularToBuilderGuava.Parent.ParentBuilder<T, ?, ?> b) {\n\t\t\tcom.google.common.collect.ImmutableList<T> cards = b.cards == null ? com.google.common.collect.ImmutableList.<T>of() : b.cards.build();\n\t\t\tthis.cards = cards;\n\t\t\tcom.google.common.collect.ImmutableCollection<Number> frogs = b.frogs == null ? com.google.common.collect.ImmutableList.<Number>of() : b.frogs.build();\n\t\t\tthis.frogs = frogs;\n\t\t\tcom.google.common.collect.ImmutableSet<java.lang.Object> rawSet = b.rawSet == null ? com.google.common.collect.ImmutableSet.<java.lang.Object>of() : b.rawSet.build();\n\t\t\tthis.rawSet = rawSet;\n\t\t\tcom.google.common.collect.ImmutableSortedSet<String> passes = b.passes == null ? com.google.common.collect.ImmutableSortedSet.<String>of() : b.passes.build();\n\t\t\tthis.passes = passes;\n\t\t\tcom.google.common.collect.ImmutableTable<Number, Number, String> users = b.users == null ? com.google.common.collect.ImmutableTable.<Number, Number, String>of() : b.users.build();\n\t\t\tthis.users = users;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static <T> SuperBuilderSingularToBuilderGuava.Parent.ParentBuilder<T, ?, ?> builder() {\n\t\t\treturn new SuperBuilderSingularToBuilderGuava.Parent.ParentBuilderImpl<T>();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic SuperBuilderSingularToBuilderGuava.Parent.ParentBuilder<T, ?, ?> toBuilder() {\n\t\t\treturn new SuperBuilderSingularToBuilderGuava.Parent.ParentBuilderImpl<T>().$fillValuesFrom(this);\n\t\t}\n\t}\n\tpublic static class Child<T> extends Parent<T> {\n\t\tprivate double field3;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ChildBuilder<T, C extends SuperBuilderSingularToBuilderGuava.Child<T>, B extends SuperBuilderSingularToBuilderGuava.Child.ChildBuilder<T, C, B>> extends Parent.ParentBuilder<T, C, B> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate double field3;\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected B $fillValuesFrom(final C instance) {\n\t\t\t\tsuper.$fillValuesFrom(instance);\n\t\t\t\tSuperBuilderSingularToBuilderGuava.Child.ChildBuilder.$fillValuesFromInstanceIntoBuilder(instance, this);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate static <T> void $fillValuesFromInstanceIntoBuilder(final SuperBuilderSingularToBuilderGuava.Child<T> instance, final SuperBuilderSingularToBuilderGuava.Child.ChildBuilder<T, ?, ?> b) {\n\t\t\t\tb.field3(instance.field3);\n\t\t\t}\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B field3(final double field3) {\n\t\t\t\tthis.field3 = field3;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderSingularToBuilderGuava.Child.ChildBuilder(super=\" + super.toString() + \", field3=\" + this.field3 + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ChildBuilderImpl<T> extends SuperBuilderSingularToBuilderGuava.Child.ChildBuilder<T, SuperBuilderSingularToBuilderGuava.Child<T>, SuperBuilderSingularToBuilderGuava.Child.ChildBuilderImpl<T>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ChildBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderSingularToBuilderGuava.Child.ChildBuilderImpl<T> self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderSingularToBuilderGuava.Child<T> build() {\n\t\t\t\treturn new SuperBuilderSingularToBuilderGuava.Child<T>(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Child(final SuperBuilderSingularToBuilderGuava.Child.ChildBuilder<T, ?, ?> b) {\n\t\t\tsuper(b);\n\t\t\tthis.field3 = b.field3;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static <T> SuperBuilderSingularToBuilderGuava.Child.ChildBuilder<T, ?, ?> builder() {\n\t\t\treturn new SuperBuilderSingularToBuilderGuava.Child.ChildBuilderImpl<T>();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic SuperBuilderSingularToBuilderGuava.Child.ChildBuilder<T, ?, ?> toBuilder() {\n\t\t\treturn new SuperBuilderSingularToBuilderGuava.Child.ChildBuilderImpl<T>().$fillValuesFrom(this);\n\t\t}\n\t}\n\tpublic static void test() {\n\t\tChild<Integer> x = Child.<Integer>builder().card(1).build().toBuilder().build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderWithAnnotatedTypeParam.java",
    "content": "//version 8:\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\nimport java.util.List;\npublic class SuperBuilderWithAnnotatedTypeParam {\n\t@Documented\n\t@Target({ElementType.TYPE_USE, ElementType.ANNOTATION_TYPE})\n\t@Retention(RetentionPolicy.RUNTIME)\n\tpublic @interface MyAnnotation {\n\t}\n\tpublic static class Parent<A> {\n\t\tA field1;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ParentBuilder<A, C extends SuperBuilderWithAnnotatedTypeParam.Parent<A>, B extends SuperBuilderWithAnnotatedTypeParam.Parent.ParentBuilder<A, C, B>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate A field1;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B field1(final A field1) {\n\t\t\t\tthis.field1 = field1;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderWithAnnotatedTypeParam.Parent.ParentBuilder(field1=\" + this.field1 + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ParentBuilderImpl<A> extends SuperBuilderWithAnnotatedTypeParam.Parent.ParentBuilder<A, SuperBuilderWithAnnotatedTypeParam.Parent<A>, SuperBuilderWithAnnotatedTypeParam.Parent.ParentBuilderImpl<A>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ParentBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderWithAnnotatedTypeParam.Parent.ParentBuilderImpl<A> self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderWithAnnotatedTypeParam.Parent<A> build() {\n\t\t\t\treturn new SuperBuilderWithAnnotatedTypeParam.Parent<A>(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Parent(final SuperBuilderWithAnnotatedTypeParam.Parent.ParentBuilder<A, ?, ?> b) {\n\t\t\tthis.field1 = b.field1;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static <A> SuperBuilderWithAnnotatedTypeParam.Parent.ParentBuilder<A, ?, ?> builder() {\n\t\t\treturn new SuperBuilderWithAnnotatedTypeParam.Parent.ParentBuilderImpl<A>();\n\t\t}\n\t}\n\tpublic static class Child extends Parent<@MyAnnotation String> {\n\t\tdouble field3;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ChildBuilder<C extends SuperBuilderWithAnnotatedTypeParam.Child, B extends SuperBuilderWithAnnotatedTypeParam.Child.ChildBuilder<C, B>> extends Parent.ParentBuilder<@MyAnnotation String, C, B> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate double field3;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B field3(final double field3) {\n\t\t\t\tthis.field3 = field3;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderWithAnnotatedTypeParam.Child.ChildBuilder(super=\" + super.toString() + \", field3=\" + this.field3 + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ChildBuilderImpl extends SuperBuilderWithAnnotatedTypeParam.Child.ChildBuilder<SuperBuilderWithAnnotatedTypeParam.Child, SuperBuilderWithAnnotatedTypeParam.Child.ChildBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ChildBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderWithAnnotatedTypeParam.Child.ChildBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderWithAnnotatedTypeParam.Child build() {\n\t\t\t\treturn new SuperBuilderWithAnnotatedTypeParam.Child(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Child(final SuperBuilderWithAnnotatedTypeParam.Child.ChildBuilder<?, ?> b) {\n\t\t\tsuper(b);\n\t\t\tthis.field3 = b.field3;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static SuperBuilderWithAnnotatedTypeParam.Child.ChildBuilder<?, ?> builder() {\n\t\t\treturn new SuperBuilderWithAnnotatedTypeParam.Child.ChildBuilderImpl();\n\t\t}\n\t}\n\tpublic static void test() {\n\t\tChild x = Child.builder().field3(0.0).field1(\"string\").build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderWithArrayTypeParam.java",
    "content": "//version 8:\npublic class SuperBuilderWithArrayTypeParam {\n\tpublic static class Parent<A> {\n\t\tA field1;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ParentBuilder<A, C extends SuperBuilderWithArrayTypeParam.Parent<A>, B extends SuperBuilderWithArrayTypeParam.Parent.ParentBuilder<A, C, B>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate A field1;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B field1(final A field1) {\n\t\t\t\tthis.field1 = field1;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderWithArrayTypeParam.Parent.ParentBuilder(field1=\" + this.field1 + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ParentBuilderImpl<A> extends SuperBuilderWithArrayTypeParam.Parent.ParentBuilder<A, SuperBuilderWithArrayTypeParam.Parent<A>, SuperBuilderWithArrayTypeParam.Parent.ParentBuilderImpl<A>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ParentBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderWithArrayTypeParam.Parent.ParentBuilderImpl<A> self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderWithArrayTypeParam.Parent<A> build() {\n\t\t\t\treturn new SuperBuilderWithArrayTypeParam.Parent<A>(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Parent(final SuperBuilderWithArrayTypeParam.Parent.ParentBuilder<A, ?, ?> b) {\n\t\t\tthis.field1 = b.field1;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static <A> SuperBuilderWithArrayTypeParam.Parent.ParentBuilder<A, ?, ?> builder() {\n\t\t\treturn new SuperBuilderWithArrayTypeParam.Parent.ParentBuilderImpl<A>();\n\t\t}\n\t}\n\tpublic static class Child extends Parent<Integer[]> {\n\t\tdouble field3;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ChildBuilder<C extends SuperBuilderWithArrayTypeParam.Child, B extends SuperBuilderWithArrayTypeParam.Child.ChildBuilder<C, B>> extends Parent.ParentBuilder<Integer[], C, B> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate double field3;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B field3(final double field3) {\n\t\t\t\tthis.field3 = field3;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderWithArrayTypeParam.Child.ChildBuilder(super=\" + super.toString() + \", field3=\" + this.field3 + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ChildBuilderImpl extends SuperBuilderWithArrayTypeParam.Child.ChildBuilder<SuperBuilderWithArrayTypeParam.Child, SuperBuilderWithArrayTypeParam.Child.ChildBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ChildBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderWithArrayTypeParam.Child.ChildBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderWithArrayTypeParam.Child build() {\n\t\t\t\treturn new SuperBuilderWithArrayTypeParam.Child(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Child(final SuperBuilderWithArrayTypeParam.Child.ChildBuilder<?, ?> b) {\n\t\t\tsuper(b);\n\t\t\tthis.field3 = b.field3;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static SuperBuilderWithArrayTypeParam.Child.ChildBuilder<?, ?> builder() {\n\t\t\treturn new SuperBuilderWithArrayTypeParam.Child.ChildBuilderImpl();\n\t\t}\n\t}\n\tpublic static void test() {\n\t\tChild x = Child.builder().field3(0.0).field1(new Integer[] {2}).build();\n\t}\n}"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderWithCustomBuilderClassName.java",
    "content": "class SuperBuilderWithCustomBuilderClassName {\n\tstatic class SuperClass {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class Builder<C extends SuperBuilderWithCustomBuilderClassName.SuperClass, B extends SuperBuilderWithCustomBuilderClassName.SuperClass.Builder<C, B>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderWithCustomBuilderClassName.SuperClass.Builder()\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class BuilderImpl extends SuperBuilderWithCustomBuilderClassName.SuperClass.Builder<SuperBuilderWithCustomBuilderClassName.SuperClass, SuperBuilderWithCustomBuilderClassName.SuperClass.BuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate BuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderWithCustomBuilderClassName.SuperClass.BuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderWithCustomBuilderClassName.SuperClass build() {\n\t\t\t\treturn new SuperBuilderWithCustomBuilderClassName.SuperClass(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected SuperClass(final SuperBuilderWithCustomBuilderClassName.SuperClass.Builder<?, ?> b) {\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static SuperBuilderWithCustomBuilderClassName.SuperClass.Builder<?, ?> builder() {\n\t\t\treturn new SuperBuilderWithCustomBuilderClassName.SuperClass.BuilderImpl();\n\t\t}\n\t}\n\tstatic class SubClass extends SuperClass {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class Builder<C extends SuperBuilderWithCustomBuilderClassName.SubClass, B extends SuperBuilderWithCustomBuilderClassName.SubClass.Builder<C, B>> extends SuperClass.Builder<C, B> {\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderWithCustomBuilderClassName.SubClass.Builder(super=\" + super.toString() + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class BuilderImpl extends SuperBuilderWithCustomBuilderClassName.SubClass.Builder<SuperBuilderWithCustomBuilderClassName.SubClass, SuperBuilderWithCustomBuilderClassName.SubClass.BuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate BuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderWithCustomBuilderClassName.SubClass.BuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderWithCustomBuilderClassName.SubClass build() {\n\t\t\t\treturn new SuperBuilderWithCustomBuilderClassName.SubClass(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected SubClass(final SuperBuilderWithCustomBuilderClassName.SubClass.Builder<?, ?> b) {\n\t\t\tsuper(b);\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static SuperBuilderWithCustomBuilderClassName.SubClass.Builder<?, ?> builder() {\n\t\t\treturn new SuperBuilderWithCustomBuilderClassName.SubClass.BuilderImpl();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderWithCustomBuilderMethod.java",
    "content": "//version 8: Javac 6 will error out due to `ChildBuilder` not existing before properly running lombok. Giving j6 support status, not worth fixing.\nimport java.util.List;\npublic class SuperBuilderWithCustomBuilderMethod {\n\tpublic static class Parent<A> {\n\t\tA field1;\n\t\tList<String> items;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ParentBuilder<A, C extends SuperBuilderWithCustomBuilderMethod.Parent<A>, B extends SuperBuilderWithCustomBuilderMethod.Parent.ParentBuilder<A, C, B>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate A field1;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate java.util.ArrayList<String> items;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B field1(final A field1) {\n\t\t\t\tthis.field1 = field1;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B item(final String item) {\n\t\t\t\tif (this.items == null) this.items = new java.util.ArrayList<String>();\n\t\t\t\tthis.items.add(item);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B items(final java.util.Collection<? extends String> items) {\n\t\t\t\tif (items == null) {\n\t\t\t\t\tthrow new java.lang.NullPointerException(\"items cannot be null\");\n\t\t\t\t}\n\t\t\t\tif (this.items == null) this.items = new java.util.ArrayList<String>();\n\t\t\t\tthis.items.addAll(items);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B clearItems() {\n\t\t\t\tif (this.items != null) this.items.clear();\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderWithCustomBuilderMethod.Parent.ParentBuilder(field1=\" + this.field1 + \", items=\" + this.items + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ParentBuilderImpl<A> extends SuperBuilderWithCustomBuilderMethod.Parent.ParentBuilder<A, SuperBuilderWithCustomBuilderMethod.Parent<A>, SuperBuilderWithCustomBuilderMethod.Parent.ParentBuilderImpl<A>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ParentBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderWithCustomBuilderMethod.Parent.ParentBuilderImpl<A> self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderWithCustomBuilderMethod.Parent<A> build() {\n\t\t\t\treturn new SuperBuilderWithCustomBuilderMethod.Parent<A>(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Parent(final SuperBuilderWithCustomBuilderMethod.Parent.ParentBuilder<A, ?, ?> b) {\n\t\t\tthis.field1 = b.field1;\n\t\t\tjava.util.List<String> items;\n\t\t\tswitch (b.items == null ? 0 : b.items.size()) {\n\t\t\tcase 0: \n\t\t\t\titems = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\titems = java.util.Collections.singletonList(b.items.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\titems = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(b.items));\n\t\t\t}\n\t\t\tthis.items = items;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static <A> SuperBuilderWithCustomBuilderMethod.Parent.ParentBuilder<A, ?, ?> builder() {\n\t\t\treturn new SuperBuilderWithCustomBuilderMethod.Parent.ParentBuilderImpl<A>();\n\t\t}\n\t}\n\tpublic static class Child<A> extends Parent<A> {\n\t\tdouble field3;\n\t\tpublic static <A> ChildBuilder<A, ?, ?> builder() {\n\t\t\treturn new ChildBuilderImpl<A>().item(\"default item\");\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ChildBuilder<A, C extends SuperBuilderWithCustomBuilderMethod.Child<A>, B extends SuperBuilderWithCustomBuilderMethod.Child.ChildBuilder<A, C, B>> extends Parent.ParentBuilder<A, C, B> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate double field3;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B field3(final double field3) {\n\t\t\t\tthis.field3 = field3;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderWithCustomBuilderMethod.Child.ChildBuilder(super=\" + super.toString() + \", field3=\" + this.field3 + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ChildBuilderImpl<A> extends SuperBuilderWithCustomBuilderMethod.Child.ChildBuilder<A, SuperBuilderWithCustomBuilderMethod.Child<A>, SuperBuilderWithCustomBuilderMethod.Child.ChildBuilderImpl<A>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ChildBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderWithCustomBuilderMethod.Child.ChildBuilderImpl<A> self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderWithCustomBuilderMethod.Child<A> build() {\n\t\t\t\treturn new SuperBuilderWithCustomBuilderMethod.Child<A>(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Child(final SuperBuilderWithCustomBuilderMethod.Child.ChildBuilder<A, ?, ?> b) {\n\t\t\tsuper(b);\n\t\t\tthis.field3 = b.field3;\n\t\t}\n\t}\n\tpublic static void test() {\n\t\tChild<Integer> x = Child.<Integer>builder().field3(0.0).field1(5).item(\"\").build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderWithDefaults.java",
    "content": "import java.util.List;\npublic class SuperBuilderWithDefaults {\n\tpublic static class Parent<N extends Number> {\n\t\tprivate long millis;\n\t\tprivate N numberField;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static <N extends Number> long $default$millis() {\n\t\t\treturn System.currentTimeMillis();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static <N extends Number> N $default$numberField() {\n\t\t\treturn null;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ParentBuilder<N extends Number, C extends SuperBuilderWithDefaults.Parent<N>, B extends SuperBuilderWithDefaults.Parent.ParentBuilder<N, C, B>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate boolean millis$set;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate long millis$value;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate boolean numberField$set;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate N numberField$value;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B millis(final long millis) {\n\t\t\t\tthis.millis$value = millis;\n\t\t\t\tmillis$set = true;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B numberField(final N numberField) {\n\t\t\t\tthis.numberField$value = numberField;\n\t\t\t\tnumberField$set = true;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderWithDefaults.Parent.ParentBuilder(millis$value=\" + this.millis$value + \", numberField$value=\" + this.numberField$value + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ParentBuilderImpl<N extends Number> extends SuperBuilderWithDefaults.Parent.ParentBuilder<N, SuperBuilderWithDefaults.Parent<N>, SuperBuilderWithDefaults.Parent.ParentBuilderImpl<N>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ParentBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderWithDefaults.Parent.ParentBuilderImpl<N> self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderWithDefaults.Parent<N> build() {\n\t\t\t\treturn new SuperBuilderWithDefaults.Parent<N>(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Parent(final SuperBuilderWithDefaults.Parent.ParentBuilder<N, ?, ?> b) {\n\t\t\tif (b.millis$set) this.millis = b.millis$value;\n\t\t\t else this.millis = SuperBuilderWithDefaults.Parent.<N>$default$millis();\n\t\t\tif (b.numberField$set) this.numberField = b.numberField$value;\n\t\t\t else this.numberField = SuperBuilderWithDefaults.Parent.<N>$default$numberField();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static <N extends Number> SuperBuilderWithDefaults.Parent.ParentBuilder<N, ?, ?> builder() {\n\t\t\treturn new SuperBuilderWithDefaults.Parent.ParentBuilderImpl<N>();\n\t\t}\n\t}\n\tpublic static class Child extends Parent<Integer> {\n\t\tprivate double doubleField;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static double $default$doubleField() {\n\t\t\treturn Math.PI;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ChildBuilder<C extends SuperBuilderWithDefaults.Child, B extends SuperBuilderWithDefaults.Child.ChildBuilder<C, B>> extends Parent.ParentBuilder<Integer, C, B> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate boolean doubleField$set;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate double doubleField$value;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B doubleField(final double doubleField) {\n\t\t\t\tthis.doubleField$value = doubleField;\n\t\t\t\tdoubleField$set = true;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderWithDefaults.Child.ChildBuilder(super=\" + super.toString() + \", doubleField$value=\" + this.doubleField$value + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ChildBuilderImpl extends SuperBuilderWithDefaults.Child.ChildBuilder<SuperBuilderWithDefaults.Child, SuperBuilderWithDefaults.Child.ChildBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ChildBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderWithDefaults.Child.ChildBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderWithDefaults.Child build() {\n\t\t\t\treturn new SuperBuilderWithDefaults.Child(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Child(final SuperBuilderWithDefaults.Child.ChildBuilder<?, ?> b) {\n\t\t\tsuper(b);\n\t\t\tif (b.doubleField$set) this.doubleField = b.doubleField$value;\n\t\t\t else this.doubleField = SuperBuilderWithDefaults.Child.$default$doubleField();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static SuperBuilderWithDefaults.Child.ChildBuilder<?, ?> builder() {\n\t\t\treturn new SuperBuilderWithDefaults.Child.ChildBuilderImpl();\n\t\t}\n\t}\n\tpublic static void test() {\n\t\tChild x = Child.builder().doubleField(0.1).numberField(5).millis(1234567890L).build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderWithDefaultsAndTargetTyping.java",
    "content": "import java.util.Arrays;\npublic class SuperBuilderWithDefaultsAndTargetTyping {\n\tpublic static class Parent {\n\t\tprivate String foo;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static String $default$foo() {\n\t\t\treturn doSth(Arrays.asList(1), Arrays.asList('a'));\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ParentBuilder<C extends SuperBuilderWithDefaultsAndTargetTyping.Parent, B extends SuperBuilderWithDefaultsAndTargetTyping.Parent.ParentBuilder<C, B>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate boolean foo$set;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate String foo$value;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B foo(final String foo) {\n\t\t\t\tthis.foo$value = foo;\n\t\t\t\tfoo$set = true;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderWithDefaultsAndTargetTyping.Parent.ParentBuilder(foo$value=\" + this.foo$value + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ParentBuilderImpl extends SuperBuilderWithDefaultsAndTargetTyping.Parent.ParentBuilder<SuperBuilderWithDefaultsAndTargetTyping.Parent, SuperBuilderWithDefaultsAndTargetTyping.Parent.ParentBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ParentBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderWithDefaultsAndTargetTyping.Parent.ParentBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderWithDefaultsAndTargetTyping.Parent build() {\n\t\t\t\treturn new SuperBuilderWithDefaultsAndTargetTyping.Parent(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Parent(final SuperBuilderWithDefaultsAndTargetTyping.Parent.ParentBuilder<?, ?> b) {\n\t\t\tif (b.foo$set) this.foo = b.foo$value;\n\t\t\t else this.foo = SuperBuilderWithDefaultsAndTargetTyping.Parent.$default$foo();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static SuperBuilderWithDefaultsAndTargetTyping.Parent.ParentBuilder<?, ?> builder() {\n\t\t\treturn new SuperBuilderWithDefaultsAndTargetTyping.Parent.ParentBuilderImpl();\n\t\t}\n\t}\n\tpublic static class Child extends Parent {\n\t\tprivate String foo;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static String $default$foo() {\n\t\t\treturn doSth(Arrays.asList(1), Arrays.asList('a'));\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ChildBuilder<C extends SuperBuilderWithDefaultsAndTargetTyping.Child, B extends SuperBuilderWithDefaultsAndTargetTyping.Child.ChildBuilder<C, B>> extends Parent.ParentBuilder<C, B> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate boolean foo$set;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate String foo$value;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B foo(final String foo) {\n\t\t\t\tthis.foo$value = foo;\n\t\t\t\tfoo$set = true;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderWithDefaultsAndTargetTyping.Child.ChildBuilder(super=\" + super.toString() + \", foo$value=\" + this.foo$value + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ChildBuilderImpl extends SuperBuilderWithDefaultsAndTargetTyping.Child.ChildBuilder<SuperBuilderWithDefaultsAndTargetTyping.Child, SuperBuilderWithDefaultsAndTargetTyping.Child.ChildBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ChildBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderWithDefaultsAndTargetTyping.Child.ChildBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderWithDefaultsAndTargetTyping.Child build() {\n\t\t\t\treturn new SuperBuilderWithDefaultsAndTargetTyping.Child(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Child(final SuperBuilderWithDefaultsAndTargetTyping.Child.ChildBuilder<?, ?> b) {\n\t\t\tsuper(b);\n\t\t\tif (b.foo$set) this.foo = b.foo$value;\n\t\t\t else this.foo = SuperBuilderWithDefaultsAndTargetTyping.Child.$default$foo();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static SuperBuilderWithDefaultsAndTargetTyping.Child.ChildBuilder<?, ?> builder() {\n\t\t\treturn new SuperBuilderWithDefaultsAndTargetTyping.Child.ChildBuilderImpl();\n\t\t}\n\t}\n\tstatic String doSth(java.util.List<Integer> i, java.util.List<Character> c) {\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderWithExistingConstructor.java",
    "content": "public class SuperBuilderWithExistingConstructor {\n\tpublic SuperBuilderWithExistingConstructor() {\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static abstract class SuperBuilderWithExistingConstructorBuilder<C extends SuperBuilderWithExistingConstructor, B extends SuperBuilderWithExistingConstructor.SuperBuilderWithExistingConstructorBuilder<C, B>> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected abstract B self();\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic abstract C build();\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"SuperBuilderWithExistingConstructor.SuperBuilderWithExistingConstructorBuilder()\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final class SuperBuilderWithExistingConstructorBuilderImpl extends SuperBuilderWithExistingConstructor.SuperBuilderWithExistingConstructorBuilder<SuperBuilderWithExistingConstructor, SuperBuilderWithExistingConstructor.SuperBuilderWithExistingConstructorBuilderImpl> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate SuperBuilderWithExistingConstructorBuilderImpl() {\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected SuperBuilderWithExistingConstructor.SuperBuilderWithExistingConstructorBuilderImpl self() {\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic SuperBuilderWithExistingConstructor build() {\n\t\t\treturn new SuperBuilderWithExistingConstructor(this);\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected SuperBuilderWithExistingConstructor(final SuperBuilderWithExistingConstructor.SuperBuilderWithExistingConstructorBuilder<?, ?> b) {\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static SuperBuilderWithExistingConstructor.SuperBuilderWithExistingConstructorBuilder<?, ?> builder() {\n\t\treturn new SuperBuilderWithExistingConstructor.SuperBuilderWithExistingConstructorBuilderImpl();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderWithGenerics.java",
    "content": "import java.util.List;\npublic class SuperBuilderWithGenerics {\n\tpublic static class Parent<A> {\n\t\tA field1;\n\t\tList<String> items;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ParentBuilder<A, C extends SuperBuilderWithGenerics.Parent<A>, B extends SuperBuilderWithGenerics.Parent.ParentBuilder<A, C, B>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate A field1;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate java.util.ArrayList<String> items;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B field1(final A field1) {\n\t\t\t\tthis.field1 = field1;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B item(final String item) {\n\t\t\t\tif (this.items == null) this.items = new java.util.ArrayList<String>();\n\t\t\t\tthis.items.add(item);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B items(final java.util.Collection<? extends String> items) {\n\t\t\t\tif (items == null) {\n\t\t\t\t\tthrow new java.lang.NullPointerException(\"items cannot be null\");\n\t\t\t\t}\n\t\t\t\tif (this.items == null) this.items = new java.util.ArrayList<String>();\n\t\t\t\tthis.items.addAll(items);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B clearItems() {\n\t\t\t\tif (this.items != null) this.items.clear();\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderWithGenerics.Parent.ParentBuilder(field1=\" + this.field1 + \", items=\" + this.items + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ParentBuilderImpl<A> extends SuperBuilderWithGenerics.Parent.ParentBuilder<A, SuperBuilderWithGenerics.Parent<A>, SuperBuilderWithGenerics.Parent.ParentBuilderImpl<A>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ParentBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderWithGenerics.Parent.ParentBuilderImpl<A> self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderWithGenerics.Parent<A> build() {\n\t\t\t\treturn new SuperBuilderWithGenerics.Parent<A>(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Parent(final SuperBuilderWithGenerics.Parent.ParentBuilder<A, ?, ?> b) {\n\t\t\tthis.field1 = b.field1;\n\t\t\tjava.util.List<String> items;\n\t\t\tswitch (b.items == null ? 0 : b.items.size()) {\n\t\t\tcase 0: \n\t\t\t\titems = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\titems = java.util.Collections.singletonList(b.items.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\titems = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(b.items));\n\t\t\t}\n\t\t\tthis.items = items;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static <A> SuperBuilderWithGenerics.Parent.ParentBuilder<A, ?, ?> builder() {\n\t\t\treturn new SuperBuilderWithGenerics.Parent.ParentBuilderImpl<A>();\n\t\t}\n\t}\n\tpublic static class Child<A> extends Parent<A> {\n\t\tdouble field3;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ChildBuilder<A, C extends SuperBuilderWithGenerics.Child<A>, B extends SuperBuilderWithGenerics.Child.ChildBuilder<A, C, B>> extends Parent.ParentBuilder<A, C, B> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate double field3;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B field3(final double field3) {\n\t\t\t\tthis.field3 = field3;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderWithGenerics.Child.ChildBuilder(super=\" + super.toString() + \", field3=\" + this.field3 + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ChildBuilderImpl<A> extends SuperBuilderWithGenerics.Child.ChildBuilder<A, SuperBuilderWithGenerics.Child<A>, SuperBuilderWithGenerics.Child.ChildBuilderImpl<A>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ChildBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderWithGenerics.Child.ChildBuilderImpl<A> self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderWithGenerics.Child<A> build() {\n\t\t\t\treturn new SuperBuilderWithGenerics.Child<A>(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Child(final SuperBuilderWithGenerics.Child.ChildBuilder<A, ?, ?> b) {\n\t\t\tsuper(b);\n\t\t\tthis.field3 = b.field3;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static <A> SuperBuilderWithGenerics.Child.ChildBuilder<A, ?, ?> builder() {\n\t\t\treturn new SuperBuilderWithGenerics.Child.ChildBuilderImpl<A>();\n\t\t}\n\t}\n\tpublic static void test() {\n\t\tChild<Integer> x = Child.<Integer>builder().field3(0.0).field1(5).item(\"\").build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderWithGenerics2.java",
    "content": "import java.util.List;\npublic class SuperBuilderWithGenerics2 {\n\tpublic static class Parent<A> {\n\t\tA field1;\n\t\tList<String> items;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ParentBuilder<A, C extends SuperBuilderWithGenerics2.Parent<A>, B extends SuperBuilderWithGenerics2.Parent.ParentBuilder<A, C, B>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate A field1;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate java.util.ArrayList<String> items;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B field1(final A field1) {\n\t\t\t\tthis.field1 = field1;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B item(final String item) {\n\t\t\t\tif (this.items == null) this.items = new java.util.ArrayList<String>();\n\t\t\t\tthis.items.add(item);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B items(final java.util.Collection<? extends String> items) {\n\t\t\t\tif (items == null) {\n\t\t\t\t\tthrow new java.lang.NullPointerException(\"items cannot be null\");\n\t\t\t\t}\n\t\t\t\tif (this.items == null) this.items = new java.util.ArrayList<String>();\n\t\t\t\tthis.items.addAll(items);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B clearItems() {\n\t\t\t\tif (this.items != null) this.items.clear();\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderWithGenerics2.Parent.ParentBuilder(field1=\" + this.field1 + \", items=\" + this.items + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ParentBuilderImpl<A> extends SuperBuilderWithGenerics2.Parent.ParentBuilder<A, SuperBuilderWithGenerics2.Parent<A>, SuperBuilderWithGenerics2.Parent.ParentBuilderImpl<A>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ParentBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderWithGenerics2.Parent.ParentBuilderImpl<A> self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderWithGenerics2.Parent<A> build() {\n\t\t\t\treturn new SuperBuilderWithGenerics2.Parent<A>(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Parent(final SuperBuilderWithGenerics2.Parent.ParentBuilder<A, ?, ?> b) {\n\t\t\tthis.field1 = b.field1;\n\t\t\tjava.util.List<String> items;\n\t\t\tswitch (b.items == null ? 0 : b.items.size()) {\n\t\t\tcase 0: \n\t\t\t\titems = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\titems = java.util.Collections.singletonList(b.items.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\titems = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(b.items));\n\t\t\t}\n\t\t\tthis.items = items;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static <A> SuperBuilderWithGenerics2.Parent.ParentBuilder<A, ?, ?> builder() {\n\t\t\treturn new SuperBuilderWithGenerics2.Parent.ParentBuilderImpl<A>();\n\t\t}\n\t}\n\tpublic static class Child<A> extends Parent<String> {\n\t\tA field3;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ChildBuilder<A, C extends SuperBuilderWithGenerics2.Child<A>, B extends SuperBuilderWithGenerics2.Child.ChildBuilder<A, C, B>> extends Parent.ParentBuilder<String, C, B> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate A field3;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B field3(final A field3) {\n\t\t\t\tthis.field3 = field3;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderWithGenerics2.Child.ChildBuilder(super=\" + super.toString() + \", field3=\" + this.field3 + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ChildBuilderImpl<A> extends SuperBuilderWithGenerics2.Child.ChildBuilder<A, SuperBuilderWithGenerics2.Child<A>, SuperBuilderWithGenerics2.Child.ChildBuilderImpl<A>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ChildBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderWithGenerics2.Child.ChildBuilderImpl<A> self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderWithGenerics2.Child<A> build() {\n\t\t\t\treturn new SuperBuilderWithGenerics2.Child<A>(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Child(final SuperBuilderWithGenerics2.Child.ChildBuilder<A, ?, ?> b) {\n\t\t\tsuper(b);\n\t\t\tthis.field3 = b.field3;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static <A> SuperBuilderWithGenerics2.Child.ChildBuilder<A, ?, ?> builder2() {\n\t\t\treturn new SuperBuilderWithGenerics2.Child.ChildBuilderImpl<A>();\n\t\t}\n\t}\n\tpublic static void test() {\n\t\tChild<Integer> x = Child.<Integer>builder2().field3(1).field1(\"value\").item(\"\").build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderWithGenerics3.java",
    "content": "import java.util.List;\npublic class SuperBuilderWithGenerics3 {\n\tpublic static class Parent<A> {\n\t\tprivate final String str;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ParentBuilder<A, C extends SuperBuilderWithGenerics3.Parent<A>, B extends SuperBuilderWithGenerics3.Parent.ParentBuilder<A, C, B>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate String str;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B str(final String str) {\n\t\t\t\tthis.str = str;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderWithGenerics3.Parent.ParentBuilder(str=\" + this.str + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ParentBuilderImpl<A> extends SuperBuilderWithGenerics3.Parent.ParentBuilder<A, SuperBuilderWithGenerics3.Parent<A>, SuperBuilderWithGenerics3.Parent.ParentBuilderImpl<A>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ParentBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderWithGenerics3.Parent.ParentBuilderImpl<A> self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderWithGenerics3.Parent<A> build() {\n\t\t\t\treturn new SuperBuilderWithGenerics3.Parent<A>(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Parent(final SuperBuilderWithGenerics3.Parent.ParentBuilder<A, ?, ?> b) {\n\t\t\tthis.str = b.str;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static <A> SuperBuilderWithGenerics3.Parent.ParentBuilder<A, ?, ?> builder() {\n\t\t\treturn new SuperBuilderWithGenerics3.Parent.ParentBuilderImpl<A>();\n\t\t}\n\t}\n\tpublic static class Child extends Parent<Child.SomeInnerStaticClass> {\n\t\tpublic static class SomeInnerStaticClass {\n\t\t}\n\t\tdouble field3;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ChildBuilder<C extends SuperBuilderWithGenerics3.Child, B extends SuperBuilderWithGenerics3.Child.ChildBuilder<C, B>> extends Parent.ParentBuilder<Child.SomeInnerStaticClass, C, B> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate double field3;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B field3(final double field3) {\n\t\t\t\tthis.field3 = field3;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderWithGenerics3.Child.ChildBuilder(super=\" + super.toString() + \", field3=\" + this.field3 + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ChildBuilderImpl extends SuperBuilderWithGenerics3.Child.ChildBuilder<SuperBuilderWithGenerics3.Child, SuperBuilderWithGenerics3.Child.ChildBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ChildBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderWithGenerics3.Child.ChildBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderWithGenerics3.Child build() {\n\t\t\t\treturn new SuperBuilderWithGenerics3.Child(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Child(final SuperBuilderWithGenerics3.Child.ChildBuilder<?, ?> b) {\n\t\t\tsuper(b);\n\t\t\tthis.field3 = b.field3;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static SuperBuilderWithGenerics3.Child.ChildBuilder<?, ?> builder() {\n\t\t\treturn new SuperBuilderWithGenerics3.Child.ChildBuilderImpl();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderWithGenericsAndToBuilder.java",
    "content": "import java.util.Map;\npublic class SuperBuilderWithGenericsAndToBuilder {\n\tpublic static class Parent<A> {\n\t\tA field1;\n\t\tMap<Integer, String> items;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ParentBuilder<A, C extends SuperBuilderWithGenericsAndToBuilder.Parent<A>, B extends SuperBuilderWithGenericsAndToBuilder.Parent.ParentBuilder<A, C, B>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate A field1;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate java.util.ArrayList<Integer> items$key;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate java.util.ArrayList<String> items$value;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected B $fillValuesFrom(final C instance) {\n\t\t\t\tSuperBuilderWithGenericsAndToBuilder.Parent.ParentBuilder.$fillValuesFromInstanceIntoBuilder(instance, this);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate static <A> void $fillValuesFromInstanceIntoBuilder(final SuperBuilderWithGenericsAndToBuilder.Parent<A> instance, final SuperBuilderWithGenericsAndToBuilder.Parent.ParentBuilder<A, ?, ?> b) {\n\t\t\t\tb.field1(instance.field1);\n\t\t\t\tb.items(instance.items == null ? java.util.Collections.<Integer, String>emptyMap() : instance.items);\n\t\t\t}\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B field1(final A field1) {\n\t\t\t\tthis.field1 = field1;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B item(final Integer itemKey, final String itemValue) {\n\t\t\t\tif (this.items$key == null) {\n\t\t\t\t\tthis.items$key = new java.util.ArrayList<Integer>();\n\t\t\t\t\tthis.items$value = new java.util.ArrayList<String>();\n\t\t\t\t}\n\t\t\t\tthis.items$key.add(itemKey);\n\t\t\t\tthis.items$value.add(itemValue);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B items(final java.util.Map<? extends Integer, ? extends String> items) {\n\t\t\t\tif (items == null) {\n\t\t\t\t\tthrow new java.lang.NullPointerException(\"items cannot be null\");\n\t\t\t\t}\n\t\t\t\tif (this.items$key == null) {\n\t\t\t\t\tthis.items$key = new java.util.ArrayList<Integer>();\n\t\t\t\t\tthis.items$value = new java.util.ArrayList<String>();\n\t\t\t\t}\n\t\t\t\tfor (final java.util.Map.Entry<? extends Integer, ? extends String> $lombokEntry : items.entrySet()) {\n\t\t\t\t\tthis.items$key.add($lombokEntry.getKey());\n\t\t\t\t\tthis.items$value.add($lombokEntry.getValue());\n\t\t\t\t}\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B clearItems() {\n\t\t\t\tif (this.items$key != null) {\n\t\t\t\t\tthis.items$key.clear();\n\t\t\t\t\tthis.items$value.clear();\n\t\t\t\t}\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderWithGenericsAndToBuilder.Parent.ParentBuilder(field1=\" + this.field1 + \", items$key=\" + this.items$key + \", items$value=\" + this.items$value + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ParentBuilderImpl<A> extends SuperBuilderWithGenericsAndToBuilder.Parent.ParentBuilder<A, SuperBuilderWithGenericsAndToBuilder.Parent<A>, SuperBuilderWithGenericsAndToBuilder.Parent.ParentBuilderImpl<A>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ParentBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderWithGenericsAndToBuilder.Parent.ParentBuilderImpl<A> self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderWithGenericsAndToBuilder.Parent<A> build() {\n\t\t\t\treturn new SuperBuilderWithGenericsAndToBuilder.Parent<A>(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Parent(final SuperBuilderWithGenericsAndToBuilder.Parent.ParentBuilder<A, ?, ?> b) {\n\t\t\tthis.field1 = b.field1;\n\t\t\tjava.util.Map<Integer, String> items;\n\t\t\tswitch (b.items$key == null ? 0 : b.items$key.size()) {\n\t\t\tcase 0: \n\t\t\t\titems = java.util.Collections.emptyMap();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\titems = java.util.Collections.singletonMap(b.items$key.get(0), b.items$value.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\titems = new java.util.LinkedHashMap<Integer, String>(b.items$key.size() < 1073741824 ? 1 + b.items$key.size() + (b.items$key.size() - 3) / 3 : java.lang.Integer.MAX_VALUE);\n\t\t\t\tfor (int $i = 0; $i < b.items$key.size(); $i++) items.put(b.items$key.get($i), (String) b.items$value.get($i));\n\t\t\t\titems = java.util.Collections.unmodifiableMap(items);\n\t\t\t}\n\t\t\tthis.items = items;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static <A> SuperBuilderWithGenericsAndToBuilder.Parent.ParentBuilder<A, ?, ?> builder() {\n\t\t\treturn new SuperBuilderWithGenericsAndToBuilder.Parent.ParentBuilderImpl<A>();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic SuperBuilderWithGenericsAndToBuilder.Parent.ParentBuilder<A, ?, ?> toBuilder() {\n\t\t\treturn new SuperBuilderWithGenericsAndToBuilder.Parent.ParentBuilderImpl<A>().$fillValuesFrom(this);\n\t\t}\n\t}\n\tpublic static class Child<A> extends Parent<A> {\n\t\tdouble field3;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ChildBuilder<A, C extends SuperBuilderWithGenericsAndToBuilder.Child<A>, B extends SuperBuilderWithGenericsAndToBuilder.Child.ChildBuilder<A, C, B>> extends Parent.ParentBuilder<A, C, B> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate double field3;\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected B $fillValuesFrom(final C instance) {\n\t\t\t\tsuper.$fillValuesFrom(instance);\n\t\t\t\tSuperBuilderWithGenericsAndToBuilder.Child.ChildBuilder.$fillValuesFromInstanceIntoBuilder(instance, this);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate static <A> void $fillValuesFromInstanceIntoBuilder(final SuperBuilderWithGenericsAndToBuilder.Child<A> instance, final SuperBuilderWithGenericsAndToBuilder.Child.ChildBuilder<A, ?, ?> b) {\n\t\t\t\tb.field3(instance.field3);\n\t\t\t}\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B field3(final double field3) {\n\t\t\t\tthis.field3 = field3;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderWithGenericsAndToBuilder.Child.ChildBuilder(super=\" + super.toString() + \", field3=\" + this.field3 + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ChildBuilderImpl<A> extends SuperBuilderWithGenericsAndToBuilder.Child.ChildBuilder<A, SuperBuilderWithGenericsAndToBuilder.Child<A>, SuperBuilderWithGenericsAndToBuilder.Child.ChildBuilderImpl<A>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ChildBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderWithGenericsAndToBuilder.Child.ChildBuilderImpl<A> self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderWithGenericsAndToBuilder.Child<A> build() {\n\t\t\t\treturn new SuperBuilderWithGenericsAndToBuilder.Child<A>(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Child(final SuperBuilderWithGenericsAndToBuilder.Child.ChildBuilder<A, ?, ?> b) {\n\t\t\tsuper(b);\n\t\t\tthis.field3 = b.field3;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static <A> SuperBuilderWithGenericsAndToBuilder.Child.ChildBuilder<A, ?, ?> builder() {\n\t\t\treturn new SuperBuilderWithGenericsAndToBuilder.Child.ChildBuilderImpl<A>();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic SuperBuilderWithGenericsAndToBuilder.Child.ChildBuilder<A, ?, ?> toBuilder() {\n\t\t\treturn new SuperBuilderWithGenericsAndToBuilder.Child.ChildBuilderImpl<A>().$fillValuesFrom(this);\n\t\t}\n\t}\n\tpublic static void test() {\n\t\tChild<Integer> x = Child.<Integer>builder().field3(0.0).field1(5).item(5, \"\").build().toBuilder().build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderWithNonNull.java",
    "content": "//version 8:\nimport java.util.List;\npublic class SuperBuilderWithNonNull {\n\tpublic static class Parent {\n\t\t@lombok.NonNull\n\t\tfinal String nonNullParentField;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static String $default$nonNullParentField() {\n\t\t\treturn \"default\";\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ParentBuilder<C extends SuperBuilderWithNonNull.Parent, B extends SuperBuilderWithNonNull.Parent.ParentBuilder<C, B>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate boolean nonNullParentField$set;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate String nonNullParentField$value;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B nonNullParentField(@lombok.NonNull final String nonNullParentField) {\n\t\t\t\tif (nonNullParentField == null) {\n\t\t\t\t\tthrow new java.lang.NullPointerException(\"nonNullParentField is marked non-null but is null\");\n\t\t\t\t}\n\t\t\t\tthis.nonNullParentField$value = nonNullParentField;\n\t\t\t\tnonNullParentField$set = true;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderWithNonNull.Parent.ParentBuilder(nonNullParentField$value=\" + this.nonNullParentField$value + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ParentBuilderImpl extends SuperBuilderWithNonNull.Parent.ParentBuilder<SuperBuilderWithNonNull.Parent, SuperBuilderWithNonNull.Parent.ParentBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ParentBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderWithNonNull.Parent.ParentBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderWithNonNull.Parent build() {\n\t\t\t\treturn new SuperBuilderWithNonNull.Parent(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Parent(final SuperBuilderWithNonNull.Parent.ParentBuilder<?, ?> b) {\n\t\t\tif (b.nonNullParentField$set) this.nonNullParentField = b.nonNullParentField$value;\n\t\t\t else this.nonNullParentField = SuperBuilderWithNonNull.Parent.$default$nonNullParentField();\n\t\t\tif (nonNullParentField == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"nonNullParentField is marked non-null but is null\");\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static SuperBuilderWithNonNull.Parent.ParentBuilder<?, ?> builder() {\n\t\t\treturn new SuperBuilderWithNonNull.Parent.ParentBuilderImpl();\n\t\t}\n\t}\n\tpublic static class Child extends Parent {\n\t\t@lombok.NonNull\n\t\tString nonNullChildField;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ChildBuilder<C extends SuperBuilderWithNonNull.Child, B extends SuperBuilderWithNonNull.Child.ChildBuilder<C, B>> extends Parent.ParentBuilder<C, B> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate String nonNullChildField;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B nonNullChildField(@lombok.NonNull final String nonNullChildField) {\n\t\t\t\tif (nonNullChildField == null) {\n\t\t\t\t\tthrow new java.lang.NullPointerException(\"nonNullChildField is marked non-null but is null\");\n\t\t\t\t}\n\t\t\t\tthis.nonNullChildField = nonNullChildField;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderWithNonNull.Child.ChildBuilder(super=\" + super.toString() + \", nonNullChildField=\" + this.nonNullChildField + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ChildBuilderImpl extends SuperBuilderWithNonNull.Child.ChildBuilder<SuperBuilderWithNonNull.Child, SuperBuilderWithNonNull.Child.ChildBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ChildBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderWithNonNull.Child.ChildBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderWithNonNull.Child build() {\n\t\t\t\treturn new SuperBuilderWithNonNull.Child(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Child(final SuperBuilderWithNonNull.Child.ChildBuilder<?, ?> b) {\n\t\t\tsuper(b);\n\t\t\tthis.nonNullChildField = b.nonNullChildField;\n\t\t\tif (nonNullChildField == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"nonNullChildField is marked non-null but is null\");\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static SuperBuilderWithNonNull.Child.ChildBuilder<?, ?> builder() {\n\t\t\treturn new SuperBuilderWithNonNull.Child.ChildBuilderImpl();\n\t\t}\n\t}\n\tpublic static void test() {\n\t\tChild x = Child.builder().nonNullChildField(\"child\").nonNullParentField(\"parent\").build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderWithOverloadedGeneratedMethods.java",
    "content": "public class SuperBuilderWithOverloadedGeneratedMethods {\n\tpublic static class Parent {\n\t\tint self;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ParentBuilder<C extends SuperBuilderWithOverloadedGeneratedMethods.Parent, B extends SuperBuilderWithOverloadedGeneratedMethods.Parent.ParentBuilder<C, B>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate int self;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B self(final int self) {\n\t\t\t\tthis.self = self;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderWithOverloadedGeneratedMethods.Parent.ParentBuilder(self=\" + this.self + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ParentBuilderImpl extends SuperBuilderWithOverloadedGeneratedMethods.Parent.ParentBuilder<SuperBuilderWithOverloadedGeneratedMethods.Parent, SuperBuilderWithOverloadedGeneratedMethods.Parent.ParentBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ParentBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderWithOverloadedGeneratedMethods.Parent.ParentBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderWithOverloadedGeneratedMethods.Parent build() {\n\t\t\t\treturn new SuperBuilderWithOverloadedGeneratedMethods.Parent(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Parent(final SuperBuilderWithOverloadedGeneratedMethods.Parent.ParentBuilder<?, ?> b) {\n\t\t\tthis.self = b.self;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static SuperBuilderWithOverloadedGeneratedMethods.Parent.ParentBuilder<?, ?> builder() {\n\t\t\treturn new SuperBuilderWithOverloadedGeneratedMethods.Parent.ParentBuilderImpl();\n\t\t}\n\t}\n\tpublic static class Child extends Parent {\n\t\tdouble build;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ChildBuilder<C extends SuperBuilderWithOverloadedGeneratedMethods.Child, B extends SuperBuilderWithOverloadedGeneratedMethods.Child.ChildBuilder<C, B>> extends Parent.ParentBuilder<C, B> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate double build;\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B build(final double build) {\n\t\t\t\tthis.build = build;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderWithOverloadedGeneratedMethods.Child.ChildBuilder(super=\" + super.toString() + \", build=\" + this.build + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ChildBuilderImpl extends SuperBuilderWithOverloadedGeneratedMethods.Child.ChildBuilder<SuperBuilderWithOverloadedGeneratedMethods.Child, SuperBuilderWithOverloadedGeneratedMethods.Child.ChildBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ChildBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderWithOverloadedGeneratedMethods.Child.ChildBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderWithOverloadedGeneratedMethods.Child build() {\n\t\t\t\treturn new SuperBuilderWithOverloadedGeneratedMethods.Child(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Child(final SuperBuilderWithOverloadedGeneratedMethods.Child.ChildBuilder<?, ?> b) {\n\t\t\tsuper(b);\n\t\t\tthis.build = b.build;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static SuperBuilderWithOverloadedGeneratedMethods.Child.ChildBuilder<?, ?> builder() {\n\t\t\treturn new SuperBuilderWithOverloadedGeneratedMethods.Child.ChildBuilderImpl();\n\t\t}\n\t}\n\tpublic static void test() {\n\t\tChild x = Child.builder().build(0.0).self(5).build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderWithPrefixes.java",
    "content": "class SuperBuilderWithPrefixes {\n\tint mField;\n\tint xOtherField;\n\tjava.util.List<String> mItems;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static abstract class SuperBuilderWithPrefixesBuilder<C extends SuperBuilderWithPrefixes, B extends SuperBuilderWithPrefixes.SuperBuilderWithPrefixesBuilder<C, B>> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int field;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate int otherField;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate java.util.ArrayList<String> items;\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic B field(final int field) {\n\t\t\tthis.field = field;\n\t\t\treturn self();\n\t\t}\n\t\t/**\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic B otherField(final int otherField) {\n\t\t\tthis.otherField = otherField;\n\t\t\treturn self();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic B item(final String item) {\n\t\t\tif (this.items == null) this.items = new java.util.ArrayList<String>();\n\t\t\tthis.items.add(item);\n\t\t\treturn self();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic B items(final java.util.Collection<? extends String> items) {\n\t\t\tif (items == null) {\n\t\t\t\tthrow new java.lang.NullPointerException(\"items cannot be null\");\n\t\t\t}\n\t\t\tif (this.items == null) this.items = new java.util.ArrayList<String>();\n\t\t\tthis.items.addAll(items);\n\t\t\treturn self();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic B clearItems() {\n\t\t\tif (this.items != null) this.items.clear();\n\t\t\treturn self();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected abstract B self();\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic abstract C build();\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"SuperBuilderWithPrefixes.SuperBuilderWithPrefixesBuilder(field=\" + this.field + \", otherField=\" + this.otherField + \", items=\" + this.items + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final class SuperBuilderWithPrefixesBuilderImpl extends SuperBuilderWithPrefixes.SuperBuilderWithPrefixesBuilder<SuperBuilderWithPrefixes, SuperBuilderWithPrefixes.SuperBuilderWithPrefixesBuilderImpl> {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate SuperBuilderWithPrefixesBuilderImpl() {\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected SuperBuilderWithPrefixes.SuperBuilderWithPrefixesBuilderImpl self() {\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic SuperBuilderWithPrefixes build() {\n\t\t\treturn new SuperBuilderWithPrefixes(this);\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected SuperBuilderWithPrefixes(final SuperBuilderWithPrefixes.SuperBuilderWithPrefixesBuilder<?, ?> b) {\n\t\tthis.mField = b.field;\n\t\tthis.xOtherField = b.otherField;\n\t\tjava.util.List<String> items;\n\t\tswitch (b.items == null ? 0 : b.items.size()) {\n\t\tcase 0: \n\t\t\titems = java.util.Collections.emptyList();\n\t\t\tbreak;\n\t\tcase 1: \n\t\t\titems = java.util.Collections.singletonList(b.items.get(0));\n\t\t\tbreak;\n\t\tdefault: \n\t\t\titems = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(b.items));\n\t\t}\n\t\tthis.mItems = items;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static SuperBuilderWithPrefixes.SuperBuilderWithPrefixesBuilder<?, ?> builder() {\n\t\treturn new SuperBuilderWithPrefixes.SuperBuilderWithPrefixesBuilderImpl();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SuperBuilderWithSetterPrefix.java",
    "content": "import java.util.List;\npublic class SuperBuilderWithSetterPrefix {\n\tpublic static class Parent {\n\t\tprivate int field1;\n\t\tint obtainViaField;\n\t\tint obtainViaMethod;\n\t\tString obtainViaStaticMethod;\n\t\tList<String> items;\n\t\tprivate int method() {\n\t\t\treturn 2;\n\t\t}\n\t\tprivate static String staticMethod(Parent instance) {\n\t\t\treturn \"staticMethod\";\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ParentBuilder<C extends SuperBuilderWithSetterPrefix.Parent, B extends SuperBuilderWithSetterPrefix.Parent.ParentBuilder<C, B>> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate int field1;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate int obtainViaField;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate int obtainViaMethod;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate String obtainViaStaticMethod;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate java.util.ArrayList<String> items;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected B $fillValuesFrom(final C instance) {\n\t\t\t\tSuperBuilderWithSetterPrefix.Parent.ParentBuilder.$fillValuesFromInstanceIntoBuilder(instance, this);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate static void $fillValuesFromInstanceIntoBuilder(final SuperBuilderWithSetterPrefix.Parent instance, final SuperBuilderWithSetterPrefix.Parent.ParentBuilder<?, ?> b) {\n\t\t\t\tb.withField1(instance.field1);\n\t\t\t\tb.withObtainViaField(instance.field1);\n\t\t\t\tb.withObtainViaMethod(instance.method());\n\t\t\t\tb.withObtainViaStaticMethod(SuperBuilderWithSetterPrefix.Parent.staticMethod(instance));\n\t\t\t\tb.withItems(instance.items == null ? java.util.Collections.<String>emptyList() : instance.items);\n\t\t\t}\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B withField1(final int field1) {\n\t\t\t\tthis.field1 = field1;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B withObtainViaField(final int obtainViaField) {\n\t\t\t\tthis.obtainViaField = obtainViaField;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B withObtainViaMethod(final int obtainViaMethod) {\n\t\t\t\tthis.obtainViaMethod = obtainViaMethod;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B withObtainViaStaticMethod(final String obtainViaStaticMethod) {\n\t\t\t\tthis.obtainViaStaticMethod = obtainViaStaticMethod;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B withItem(final String item) {\n\t\t\t\tif (this.items == null) this.items = new java.util.ArrayList<String>();\n\t\t\t\tthis.items.add(item);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B withItems(final java.util.Collection<? extends String> items) {\n\t\t\t\tif (items == null) {\n\t\t\t\t\tthrow new java.lang.NullPointerException(\"items cannot be null\");\n\t\t\t\t}\n\t\t\t\tif (this.items == null) this.items = new java.util.ArrayList<String>();\n\t\t\t\tthis.items.addAll(items);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B clearItems() {\n\t\t\t\tif (this.items != null) this.items.clear();\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderWithSetterPrefix.Parent.ParentBuilder(field1=\" + this.field1 + \", obtainViaField=\" + this.obtainViaField + \", obtainViaMethod=\" + this.obtainViaMethod + \", obtainViaStaticMethod=\" + this.obtainViaStaticMethod + \", items=\" + this.items + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ParentBuilderImpl extends SuperBuilderWithSetterPrefix.Parent.ParentBuilder<SuperBuilderWithSetterPrefix.Parent, SuperBuilderWithSetterPrefix.Parent.ParentBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ParentBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderWithSetterPrefix.Parent.ParentBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderWithSetterPrefix.Parent build() {\n\t\t\t\treturn new SuperBuilderWithSetterPrefix.Parent(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Parent(final SuperBuilderWithSetterPrefix.Parent.ParentBuilder<?, ?> b) {\n\t\t\tthis.field1 = b.field1;\n\t\t\tthis.obtainViaField = b.obtainViaField;\n\t\t\tthis.obtainViaMethod = b.obtainViaMethod;\n\t\t\tthis.obtainViaStaticMethod = b.obtainViaStaticMethod;\n\t\t\tjava.util.List<String> items;\n\t\t\tswitch (b.items == null ? 0 : b.items.size()) {\n\t\t\tcase 0: \n\t\t\t\titems = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\titems = java.util.Collections.singletonList(b.items.get(0));\n\t\t\t\tbreak;\n\t\t\tdefault: \n\t\t\t\titems = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(b.items));\n\t\t\t}\n\t\t\tthis.items = items;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static SuperBuilderWithSetterPrefix.Parent.ParentBuilder<?, ?> builder() {\n\t\t\treturn new SuperBuilderWithSetterPrefix.Parent.ParentBuilderImpl();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic SuperBuilderWithSetterPrefix.Parent.ParentBuilder<?, ?> toBuilder() {\n\t\t\treturn new SuperBuilderWithSetterPrefix.Parent.ParentBuilderImpl().$fillValuesFrom(this);\n\t\t}\n\t}\n\tpublic static class Child extends Parent {\n\t\tprivate double field3;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static abstract class ChildBuilder<C extends SuperBuilderWithSetterPrefix.Child, B extends SuperBuilderWithSetterPrefix.Child.ChildBuilder<C, B>> extends Parent.ParentBuilder<C, B> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate double field3;\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected B $fillValuesFrom(final C instance) {\n\t\t\t\tsuper.$fillValuesFrom(instance);\n\t\t\t\tSuperBuilderWithSetterPrefix.Child.ChildBuilder.$fillValuesFromInstanceIntoBuilder(instance, this);\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate static void $fillValuesFromInstanceIntoBuilder(final SuperBuilderWithSetterPrefix.Child instance, final SuperBuilderWithSetterPrefix.Child.ChildBuilder<?, ?> b) {\n\t\t\t\tb.setField3(instance.field3);\n\t\t\t}\n\t\t\t/**\n\t\t\t * @return {@code this}.\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic B setField3(final double field3) {\n\t\t\t\tthis.field3 = field3;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected abstract B self();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic abstract C build();\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"SuperBuilderWithSetterPrefix.Child.ChildBuilder(super=\" + super.toString() + \", field3=\" + this.field3 + \")\";\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate static final class ChildBuilderImpl extends SuperBuilderWithSetterPrefix.Child.ChildBuilder<SuperBuilderWithSetterPrefix.Child, SuperBuilderWithSetterPrefix.Child.ChildBuilderImpl> {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate ChildBuilderImpl() {\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprotected SuperBuilderWithSetterPrefix.Child.ChildBuilderImpl self() {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic SuperBuilderWithSetterPrefix.Child build() {\n\t\t\t\treturn new SuperBuilderWithSetterPrefix.Child(this);\n\t\t\t}\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprotected Child(final SuperBuilderWithSetterPrefix.Child.ChildBuilder<?, ?> b) {\n\t\t\tsuper(b);\n\t\t\tthis.field3 = b.field3;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic static SuperBuilderWithSetterPrefix.Child.ChildBuilder<?, ?> builder() {\n\t\t\treturn new SuperBuilderWithSetterPrefix.Child.ChildBuilderImpl();\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic SuperBuilderWithSetterPrefix.Child.ChildBuilder<?, ?> toBuilder() {\n\t\t\treturn new SuperBuilderWithSetterPrefix.Child.ChildBuilderImpl().$fillValuesFrom(this);\n\t\t}\n\t}\n\tpublic static void test() {\n\t\tChild x = Child.builder().setField3(0.0).withField1(5).withItem(\"\").build().toBuilder().build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SynchronizedInAnonymousClass.java",
    "content": "public class SynchronizedInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\tclass Inner {\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate final java.lang.Object $lock = new java.lang.Object[0];\n\t\t\tpublic void foo() {\n\t\t\t\tsynchronized (this.$lock) {\n\t\t\t\t\tString foo = \"bar\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SynchronizedInInitializer.java",
    "content": "public class SynchronizedInInitializer {\n\tpublic static final Runnable SYNCHRONIZED = new Runnable() {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate final java.lang.Object $lock = new java.lang.Object[0];\n\t\t@Override\n\t\tpublic void run() {\n\t\t\tsynchronized (this.$lock) {\n\t\t\t\tSystem.out.println(\"test\");\n\t\t\t}\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SynchronizedInRecord.java",
    "content": "// version 14:\npublic record SynchronizedInRecord(String a, String b) {\n\tpublic void foo() {\n\t\tString foo = \"bar\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SynchronizedName.java",
    "content": "class SynchronizedName {\n\tprivate Object read = new Object();\n\tprivate static Object READ = new Object();\n\t\n\tvoid test1() {\n\t\tsynchronized (this.read) {\n\t\t\tSystem.out.println(\"one\");\n\t\t}\n\t}\n\tvoid test4() {\n\t\tsynchronized (SynchronizedName.READ) {\n\t\t\tSystem.out.println(\"four\");\n\t\t}\n\t}\n\tvoid test5() {\n\t\tsynchronized (this.read) {\n\t\t\tSystem.out.println(\"five\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SynchronizedNameNoSuchField.java",
    "content": "class SynchronizedNameNoSuchField {\n\tprivate Object read = new Object();\n\tprivate static Object READ = new Object();\n\tvoid test2() {\n\t\tSystem.out.println(\"two\");\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SynchronizedNameStaticToInstanceRef.java",
    "content": "class SynchronizedNameStaticToInstanceRef {\n\tprivate Object read = new Object();\n\tprivate static Object READ = new Object();\n\tstatic void test3() {\n\t\tSystem.out.println(\"three\");\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/SynchronizedOnStatic.java",
    "content": "class SynchronizedOnStatic<Z> {\n\tstatic class Inner {\n\t\tprivate static Object LCK = new Object[0];\n\t\tpublic void foo() {\n\t\t\tsynchronized (SynchronizedOnStatic.Inner.LCK) {\n\t\t\t\tSystem.out.println();\n\t\t\t}\n\t\t}\n\t}\n\tclass Inner2 {\n\t\tprivate Object LCK = new Object[0];\n\t\tpublic void foo() {\n\t\t\tsynchronized (this.LCK) {\n\t\t\t\tSystem.out.println();\n\t\t\t}\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/transform/resource/after-delombok/SynchronizedPlain.java",
    "content": "class SynchronizedPlain1 {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate final java.lang.Object $lock = new java.lang.Object[0];\n\tvoid test() {\n\t\tsynchronized (this.$lock) {\n\t\t\tSystem.out.println(\"one\");\n\t\t}\n\t}\n\tvoid test2() {\n\t\tsynchronized (this.$lock) {\n\t\t\tSystem.out.println(\"two\");\n\t\t}\n\t}\n}\nclass SynchronizedPlain2 {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate static final java.lang.Object $LOCK = new java.lang.Object[0];\n\tstatic void test() {\n\t\tsynchronized (SynchronizedPlain2.$LOCK) {\n\t\t\tSystem.out.println(\"three\");\n\t\t}\n\t}\n\tstatic void test2() {\n\t\tsynchronized (SynchronizedPlain2.$LOCK) {\n\t\t\tSystem.out.println(\"four\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/TestOperators.java",
    "content": "class TestOperators {\n\tint x = 10;\n\tpublic void test() {\n\t\tx = 12;\n\t\tint a = +x;\n\t\tboolean d = true;\n\t\tboolean e = false;\n\t\tboolean b;\n\t\ta = -x;\n\t\tb = !d;\n\t\ta = ~x;\n\t\ta = ++x;\n\t\ta = --x;\n\t\ta = x++;\n\t\ta = x--;\n\t\tb = d || e;\n\t\tb = d && e;\n\t\ta = x | a;\n\t\ta = x ^ a;\n\t\ta = x & a;\n\t\tb = a == x;\n\t\tb = a != x;\n\t\tb = a < x;\n\t\tb = a > x;\n\t\tb = a <= x;\n\t\tb = a >= x;\n\t\ta = a << x;\n\t\ta = a >> x;\n\t\ta = a >>> x;\n\t\ta = a + x;\n\t\ta = a - x;\n\t\ta = a * x;\n\t\ta = a / x;\n\t\ta = a % x;\n\t\ta |= x;\n\t\ta ^= x;\n\t\ta &= x;\n\t\ta <<= x;\n\t\ta >>= x;\n\t\ta >>>= x;\n\t\ta += x;\n\t\ta -= x;\n\t\ta *= x;\n\t\ta /= x;\n\t\ta %= x;\n\t\ta = a > x ? 1 : 0;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ToStringArray.java",
    "content": "import java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\npublic class ToStringArray {\n\tint[] primitiveArray;\n\tObject[] objectArray;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"ToStringArray(primitiveArray=\" + java.util.Arrays.toString(this.primitiveArray) + \", objectArray=\" + java.util.Arrays.deepToString(this.objectArray) + \")\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ToStringArrayTypeAnnotations.java",
    "content": "//version 8:\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\npublic class ToStringArrayTypeAnnotations {\n\t@TA\n\tint[] primitiveArray1;\n\tint @TA [] primitiveArray2;\n\t@TA\n\tObject[] objectArray1;\n\tObject @TA [] objectArray2;\n\t@Target({ElementType.TYPE_USE})\n\t@interface TA {\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"ToStringArrayTypeAnnotations(primitiveArray1=\" + java.util.Arrays.toString(this.primitiveArray1) + \", primitiveArray2=\" + java.util.Arrays.toString(this.primitiveArray2) + \", objectArray1=\" + java.util.Arrays.deepToString(this.objectArray1) + \", objectArray2=\" + java.util.Arrays.deepToString(this.objectArray2) + \")\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ToStringAutoExclude.java",
    "content": "class ToStringAutoExclude {\n\tint x;\n\tString $a;\n\ttransient String b;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"ToStringAutoExclude(x=\" + this.x + \", b=\" + this.b + \")\";\n\t}\n}\nclass ToStringAutoExclude2 {\n\tint x;\n\tString $a;\n\ttransient String b;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"ToStringAutoExclude2(x=\" + this.x + \", $a=\" + this.$a + \", b=\" + this.b + \")\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ToStringAutoSuper.java",
    "content": "class ToStringAutoSuperWithNoParent {\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"ToStringAutoSuperWithNoParent()\";\n\t}\n}\nclass ToStringAutoSuperWithParent extends ToStringAutoSuperWithNoParent {\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"ToStringAutoSuperWithParent(super=\" + super.toString() + \")\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ToStringConfiguration.java",
    "content": "class ToStringConfiguration {\n\tint x;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"ToStringConfiguration(\" + this.x + \")\";\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getX() {\n\t\treturn this.x;\n\t}\n}\nclass ToStringConfiguration2 {\n\tint x;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"ToStringConfiguration2(x=\" + this.x + \")\";\n\t}\n}\nclass ToStringConfiguration3 {\n\tint x;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"ToStringConfiguration3(\" + this.getX() + \")\";\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getX() {\n\t\treturn this.x;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ToStringEnum.java",
    "content": "enum ToStringEnum1 {\n\tCONSTANT;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"ToStringEnum1.\" + this.name();\n\t}\n}\nenum ToStringEnum2 {\n\tCONSTANT;\n\tint x;\n\tString name;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"ToStringEnum2.\" + this.name() + \"(x=\" + this.x + \", name=\" + this.name + \")\";\n\t}\n}\nclass ToStringEnum3 {\n\tenum MemberEnum {\n\t\tCONSTANT;\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"ToStringEnum3.MemberEnum.\" + this.name();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ToStringExplicitInclude.java",
    "content": "class ToStringExplicitInclude {\n\tint x;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"ToStringExplicitInclude()\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ToStringExplicitIncludeConf.java",
    "content": "class ToStringExplicitIncludeConf {\n\tint x;\n\tint y;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"ToStringExplicitIncludeConf(y=\" + this.y + \")\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ToStringInAnonymousClass.java",
    "content": "public class ToStringInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\tclass Inner {\n\t\t\tprivate String string;\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"Inner(string=\" + this.string + \")\";\n\t\t\t}\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ToStringInner.java",
    "content": "class ToStringOuter {\n\tint x;\n\tString name;\n\tclass ToStringInner {\n\t\tint y;\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"ToStringOuter.ToStringInner(y=\" + this.y + \")\";\n\t\t}\n\t}\n\tstatic class ToStringStaticInner {\n\t\tint y;\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"ToStringOuter.ToStringStaticInner(y=\" + this.y + \")\";\n\t\t}\n\t}\n\tclass ToStringMiddle {\n\t\tclass ToStringMoreInner {\n\t\t\tString name;\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"ToStringOuter.ToStringMiddle.ToStringMoreInner(name=\" + this.name + \")\";\n\t\t\t}\n\t\t}\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"ToStringOuter(x=\" + this.x + \", name=\" + this.name + \")\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ToStringNewStyle.java",
    "content": "public class ToStringNewStyle {\n\tint b;\n\tdouble c;\n\tint f;\n\tint d;\n\tint f() {\n\t\treturn 0;\n\t}\n\tint g;\n\tint h;\n\tint i;\n\tint j;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"ToStringNewStyle(a=\" + this.b + \", c=\" + this.c + \", e=\" + this.d + \", f=\" + this.f() + \", g=\" + this.g + \", i=\" + this.i + \", h=\" + this.h + \")\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ToStringOnRecord.java",
    "content": "// version 14:\npublic record ToStringOnRecord(String a, String b) {\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ToStringPlain.java",
    "content": "class ToString1 {\n\tint x;\n\tString name;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"ToString1(x=\" + this.x + \", name=\" + this.name + \")\";\n\t}\n}\nclass ToString2 {\n\tint x;\n\tString name;\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"ToString2(x=\" + this.x + \", name=\" + this.name + \")\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/Tolerate.java",
    "content": "import java.util.regex.Pattern;\nclass Tolerate {\n\tprivate Pattern pattern;\n\t@lombok.experimental.Tolerate\n\tpublic void setPattern(String pattern) {\n\t\tsetPattern(Pattern.compile(pattern));\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setPattern(final Pattern pattern) {\n\t\tthis.pattern = pattern;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic Pattern getPattern() {\n\t\treturn this.pattern;\n\t}\n}\nclass Tolerate2 {\n\tprivate final Pattern pattern;\n\t@lombok.experimental.Tolerate\n\tpublic Tolerate2 withPattern(String pattern) {\n\t\treturn withPattern(Pattern.compile(pattern));\n\t}\n\tpublic Tolerate2 withPattern(String nameGlob, String extensionGlob) {\n\t\treturn withPattern(nameGlob.replace(\"*\", \".*\") + \"\\\\.\" + extensionGlob.replace(\"*\", \".*\"));\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic Pattern getPattern() {\n\t\treturn this.pattern;\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic Tolerate2 withPattern(final Pattern pattern) {\n\t\treturn this.pattern == pattern ? this : new Tolerate2(pattern);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic Tolerate2(final Pattern pattern) {\n\t\tthis.pattern = pattern;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/TrickyTypeResolution.java",
    "content": "import lombok.*;\nclass TrickyDoNothing {\n\t@interface Getter {\n\t}\n\t@Getter\n\tint x;\n}\nclass TrickyDoNothing2 {\n\t@Getter\n\tint x;\n\t@interface Getter {\n\t}\n}\nclass TrickySuccess {\n\tint x;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getX() {\n\t\treturn this.x;\n\t}\n}\nclass TrickyDoNothing3 {\n\tvoid test() {\n\t\tclass val {\n\t\t}\n\t\tval x = null;\n\t}\n}\nclass TrickyDoSomething {\n\tvoid test() {\n\t\tfinal java.lang.Object x = null;\n\t\tclass val {\n\t\t}\n\t}\n}\nclass DoubleTrickyDoNothing {\n\tvoid test() {\n\t\tclass val {\n\t\t}\n\t\tfor (int i = 10; i < 20; i++) {\n\t\t\tval y = null;\n\t\t}\n\t}\n}\nclass DoubleTrickyDoSomething {\n\tvoid test() {\n\t\tfor (int j = 10; j < 20; j++) {\n\t\t\tclass val {\n\t\t\t}\n\t\t}\n\t\tfor (int i = 10; i < 20; i++) {\n\t\t\tfinal java.lang.Object y = null;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/TrickyTypeResolution2.java",
    "content": "import lombok.*;\nclass DoNothingDueToTopLevel {\n\tvoid test() {\n\t\tval x = null;\n\t}\n}\nclass val {\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/TypeUseAnnotations.java",
    "content": "//version 8:\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.List;\n@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})\n@interface TA {\n\tint x();\n}\nclass TypeUseAnnotations {\n\tList<@TA(x = 5) String> foo;\n\tList<TypeUseAnnotations.@TA(x = 5) Inner> bar;\n\tclass Inner {\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic List<@TA(x = 5) String> getFoo() {\n\t\treturn this.foo;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic List<TypeUseAnnotations.@TA(x = 5) Inner> getBar() {\n\t\treturn this.bar;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/UtilityClass.java",
    "content": "final class UtilityClass {\n\tprivate static long someField = System.currentTimeMillis();\n\tstatic void someMethod() {\n\t\tSystem.out.println();\n\t\tnew InnerClass();\n\t\tnew InnerStaticClass();\n\t}\n\tprotected static class InnerClass {\n\t\tprivate String innerInnerMember;\n\t}\n\tprotected static class InnerStaticClass {\n\t\tprivate String innerInnerMember;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate UtilityClass() {\n\t\tthrow new java.lang.UnsupportedOperationException(\"This is a utility class and cannot be instantiated\");\n\t}\n}\nclass UtilityInner {\n\tstatic class InnerInner {\n\t\tstatic final class InnerInnerInner {\n\t\t\tstatic int member;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate InnerInnerInner() {\n\t\t\t\tthrow new java.lang.UnsupportedOperationException(\"This is a utility class and cannot be instantiated\");\n\t\t\t}\n\t\t}\n\t}\n\tenum UtilityInsideEnum {\n\t\tFOO, BAR;\n\t\tstatic final class InsideEnum {\n\t\t\tstatic int member;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate InsideEnum() {\n\t\t\t\tthrow new java.lang.UnsupportedOperationException(\"This is a utility class and cannot be instantiated\");\n\t\t\t}\n\t\t}\n\t}\n\tinterface UtilityInsideInterface {\n\t\tfinal class InsideInterface {\n\t\t\tstatic int member;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tprivate InsideInterface() {\n\t\t\t\tthrow new java.lang.UnsupportedOperationException(\"This is a utility class and cannot be instantiated\");\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/UtilityClassErrors.java",
    "content": "final class UtilityClassErrors1 {\n\tprivate static String someField;\n\tprotected UtilityClassErrors1() {\n\t}\n\tstatic void method() {\n\t\tclass MethodLocalClass {\n\t\t}\n\t}\n}\nenum UtilityClassErrors2 {\n\t;\n}\nclass UtilityClassErrors3 {\n\tclass NonStaticInner {\n\t\tclass ThisShouldFail {\n\t\t\tprivate String member;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/UtilityClassGeneric.java",
    "content": "final class UtilityClassGeneric {\n\tstatic <T> T convertValue(Class<T> toValueType) {\n\t\treturn null;\n\t}\n\tstatic DTO convert(Object json) {\n\t\treturn convertValue(DTO.class);\n\t}\n\tstatic Object convert(DTO dto) {\n\t\treturn null;\n\t}\n\tstatic class DTO {\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate UtilityClassGeneric() {\n\t\tthrow new java.lang.UnsupportedOperationException(\"This is a utility class and cannot be instantiated\");\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/UtilityClassInAnonymousClass.java",
    "content": "public class UtilityClassInAnonymousClass {\n\tObject annonymous = new Object() {\n\n\t\tclass Inner {\n\t\t\tprivate String string;\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/UtilityClassInner.java",
    "content": "@java.lang.SuppressWarnings(\"serial\")\nclass UtilityClassInner {\n\tstatic final class UtilClass implements java.io.Serializable {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate UtilClass() {\n\t\t\tthrow new java.lang.UnsupportedOperationException(\"This is a utility class and cannot be instantiated\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/UtilityClassOnRecord.java",
    "content": "// version 14:\npublic record UtilityClassOnRecord(String a, String b) {\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ValAnonymousSubclassSelfReference.java",
    "content": "import java.util.Map;\nimport java.util.HashMap;\n\npublic class ValAnonymousSubclassSelfReference {\n\tpublic <T> void test(T arg) {\n\t\tT d = arg;\n\t\tInteger[] e = new Integer[1];\n\t\tint[] f = new int[0];\n\t\tjava.util.Map<java.lang.String, Integer> g = new HashMap<String, Integer>();\n\t\tInteger h = 0;\n\t\tint i = 0;\n\t\tfinal int j = 1;\n\t\tfinal int k = 2;\n\t\tnew ValAnonymousSubclassSelfReference() {\n\t\t};\n\t}\n}"
  },
  {
    "path": "test/transform/resource/after-delombok/ValAnonymousSubclassWithGenerics.java",
    "content": "import java.util.*;\npublic class ValAnonymousSubclassWithGenerics {\n\tObject object = new Object() {\n\t\tvoid foo() {\n\t\t\tfinal int j = 1;\n\t\t}\n\t};\n\tvoid bar() {\n\t\tfinal int k = super.hashCode();\n\t\tint x = k;\n\t}\n\tjava.util.List<String> names = new java.util.ArrayList<String>() {\n\t\tpublic String get(int i) {\n\t\t\tfinal java.lang.String result = super.get(i);\n\t\t\treturn result;\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ValComplex.java",
    "content": "public class ValComplex {\n\tprivate String field = \"\";\n\tprivate static final int CONSTANT = 20;\n\tpublic void testComplex() {\n\t\tfinal char[] shouldBeCharArray = field.toCharArray();\n\t\tfinal int shouldBeInt = CONSTANT;\n\t\tfinal java.lang.Object lock = new Object();\n\t\tsynchronized (lock) {\n\t\t\tfinal int field = 20; //Shadowing\n\t\t\tfinal int inner = 10;\n\t\t\tswitch (field) {\n\t\t\tcase 5: \n\t\t\t\tfinal char[] shouldBeCharArray2 = shouldBeCharArray;\n\t\t\t\tfinal int innerInner = inner;\n\t\t\t\n\t\t\t}\n\t\t}\n\t\tfinal java.lang.String shouldBeString = field; //Unshadowing\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ValDefault.java",
    "content": "// version 8:\ninterface ValDefault {\n\tint size();\n\tdefault void method() {\n\t\tfinal int x = 1;\n\t\tfinal int size = size();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ValDelegateMethodReference.java",
    "content": "//version 8:\nimport java.util.function.Function;\n\npublic class ValDelegateMethodReference {\n\tpublic void config() {\n\t\tfinal Column<Entity, java.lang.String> column = createColumn(Entity::getValue);\n\t}\n\n\tprivate <V> Column<Entity, V> createColumn(Function<Entity, V> func) {\n\t\treturn new Column<>(func);\n\t}\n}\n\nclass Column<T, V> {\n\tpublic Column(Function<T, V> vp) {\n\t}\n}\n\nclass Entity {\n\tprivate MyDelegate innerDelegate;\n\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String getValue() {\n\t\treturn this.innerDelegate.getValue();\n\t}\n\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.Boolean getABoolean() {\n\t\treturn this.innerDelegate.getABoolean();\n\t}\n\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setValue(final java.lang.String value) {\n\t\tthis.innerDelegate.setValue(value);\n\t}\n\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setABoolean(final java.lang.Boolean aBoolean) {\n\t\tthis.innerDelegate.setABoolean(aBoolean);\n\t}\n}\n\nclass MyDelegate {\n\tprivate String value;\n\tprivate Boolean aBoolean;\n\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getValue() {\n\t\treturn this.value;\n\t}\n\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic Boolean getABoolean() {\n\t\treturn this.aBoolean;\n\t}\n\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setValue(final String value) {\n\t\tthis.value = value;\n\t}\n\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setABoolean(final Boolean aBoolean) {\n\t\tthis.aBoolean = aBoolean;\n\t}\n}"
  },
  {
    "path": "test/transform/resource/after-delombok/ValErrors.java",
    "content": "public class ValErrors {\n\tpublic void unresolvableExpression() {\n\t\tfinal java.lang.Object c = d;\n\t}\n\tpublic void arrayInitializer() {\n\t\tval e = {\"foo\", \"bar\"};\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ValFinal.java",
    "content": "public class ValFinal {\n\tpublic void test() {\n\t\tfinal int x = 10;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ValInBasicFor.java",
    "content": "import lombok.val;\npublic class ValInBasicFor {\n\tpublic void basicFor() {\n\t\tjava.util.List<String> list = java.util.Arrays.asList(\"Hello, World!\");\n\t\tfor (val shouldBe = 1, marked = \"\", error = 1.0; ; ) {\n\t\t\tSystem.out.println(\"\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ValInFor.java",
    "content": "public class ValInFor {\n\tpublic void enhancedFor() {\n\t\tjava.util.List<String> list = java.util.Arrays.asList(\"Hello, World!\");\n\t\tfor (final java.lang.String shouldBeString : list) {\n\t\t\tSystem.out.println(shouldBeString.toLowerCase());\n\t\t\tfinal java.lang.String shouldBeString2 = shouldBeString;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ValInLambda.java",
    "content": "// version 8:\nimport java.util.function.Function;\nimport java.util.function.Supplier;\n\nclass ValInLambda {\n    Runnable foo = (Runnable) () -> {\n        final int i = 1;\n        final java.lang.Runnable foo = (System.currentTimeMillis() > 0) ? (Runnable) () -> {\n        } : System.out::println;\n    };\n    \n    public void easyLambda() {\n        Runnable foo = (Runnable) () -> {\n            final int i = 1;\n        };\n    }\n    \n    public void easyIntersectionLambda() {\n        Runnable foo = (Runnable) () -> {\n            final int i = 1;\n        };\n    }\n    \n    public void easyLubLambda() {\n        Runnable foo = (Runnable) () -> {\n            final java.lang.Runnable fooInner = (System.currentTimeMillis() > 0) ? (Runnable) () -> {\n            } : System.out::println;\n        };\n    }\n\n    public void inParameter() {\n        final java.util.function.Function<java.util.function.Supplier<java.lang.String>, java.lang.String> foo = (Function<Supplier<String>, String>) s -> s.get();\n        final java.lang.String foo2 = foo.apply(() -> {\n            final java.lang.String bar = \"\";\n            return bar;\n        });\n    }\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ValInMultiDeclaration.java",
    "content": "public class ValInMultiDeclaration {\n\tpublic void test() {\n\t\tfinal int x = 10;\n\t\tfinal java.lang.String y = \"\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ValInTryWithResources.java",
    "content": "//version 7:\nimport java.io.IOException;\npublic class ValInTryWithResources {\n\tpublic void whyTryInsteadOfCleanup() throws IOException {\n\t\ttry (java.io.InputStream in = getClass().getResourceAsStream(\"ValInTryWithResources.class\")) {\n\t\t\tfinal java.io.InputStream i = in;\n\t\t\tfinal int j = in.read();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ValInvalidParameter.java",
    "content": "//version 7:8\npublic class ValInvalidParameter {\n\tpublic void val() {\n\t\tfinal java.lang.Object a = a(new NonExistingClass());\n\t\tfinal java.lang.Object b = a(a(new NonExistingClass()));\n\t\tfinal java.lang.Object c = nonExisitingMethod(b(1));\n\t\tfinal java.lang.Object d = nonExistingObject.nonExistingMethod();\n\t\tfinal java.lang.Object e = b(1).nonExistingMethod();\n\t\tfinal java.lang.Object f = 1 > 2 ? a(new NonExistingClass()) : a(new NonExistingClass());\n\t\tfinal java.lang.Object g = b2(1);\n\t\tfinal java.lang.Integer h = b2(a(\"a\"), a(null));\n\t\tfinal int i = a(a(null));\n\t}\n\n\tpublic int a(String param) {\n\t\treturn 0;\n\t}\n\n\tpublic int a(Integer param) {\n\t\treturn 0;\n\t}\n\n\tpublic Integer b(int i) {\n\t\treturn i;\n\t}\n\n\tpublic Integer b2(int i, int j) {\n\t\treturn i;\n\t}\n}"
  },
  {
    "path": "test/transform/resource/after-delombok/ValLambda.java",
    "content": "// version 8:\nimport java.io.Serializable;\n\nclass ValLambda {\n\tstatic {\n\t\tfinal java.lang.Runnable foo = (System.currentTimeMillis() > 0) ? (Runnable) () -> {\n\t\t} : System.out::println;\n\t}\n\t\n\t{\n\t\tfinal java.lang.Runnable foo = (System.currentTimeMillis() > 0) ? (Runnable) () -> {\n\t\t} : System.out::println;\n\t}\n\t\n\tpublic void easyLambda() {\n\t\tfinal java.lang.Runnable foo = (Runnable) () -> {\n\t\t};\n\t}\n\t\n\tpublic void intersectionLambda() {\n\t\tfinal java.io.Serializable foo = (Runnable & Serializable) () -> {\n\t\t};\n\t\tfinal java.io.Serializable bar = (java.io.Serializable & Runnable) () -> {\n\t\t};\n\t}\n\t\n\tpublic void easyLubLambda() {\n\t\tfinal java.lang.Runnable foo = (System.currentTimeMillis() > 0) ? (Runnable) () -> {\n\t\t} : System.out::println;\n\t\tfinal java.lang.Runnable foo1 = (System.currentTimeMillis() > 0) ? (Runnable) System.out::println : System.out::println;\n\t\tfinal java.util.function.Function foo2 = (System.currentTimeMillis() < 0) ? (java.util.function.Function) r -> \"\" : r -> System.currentTimeMillis();\n\t\tjava.util.function.Function foo3 = (System.currentTimeMillis() < 0) ? (java.util.function.Function) r -> \"\" : r -> System.currentTimeMillis();\n\t\tfinal java.util.function.Function<java.lang.String, java.lang.String> foo4 = (System.currentTimeMillis() < 0) ? (java.util.function.Function<String, String>) r -> \"\" : r -> String.valueOf(System.currentTimeMillis());\n\t}\n}"
  },
  {
    "path": "test/transform/resource/after-delombok/ValLessSimple.java",
    "content": "public class ValLessSimple {\n\tprivate short field2 = 5;\n\tprivate String method() {\n\t\treturn \"method\";\n\t}\n\tprivate double method2() {\n\t\treturn 2.0;\n\t}\n\t{\n\t\tSystem.out.println(\"Hello\");\n\t\tfinal int z = 20;\n\t\tfinal int x = 10;\n\t\tfinal int a = z;\n\t\tfinal short y = field2;\n\t}\n\tprivate void testVal(String param) {\n\t\tfinal java.lang.String fieldV = field;\n\t\tfinal int a = 10;\n\t\tfinal int b = 20;\n\t\t{\n\t\t\tfinal java.lang.String methodV = method();\n\t\t\tfinal java.lang.String foo = fieldV + methodV;\n\t\t}\n\t}\n\tprivate void testValInCatchBlock() {\n\t\ttry {\n\t\t\tfinal int x = 1 / 0;\n\t\t} catch (ArithmeticException e) {\n\t\t\tfinal int y = 0;\n\t\t}\n\t}\n\tprivate String field = \"field\";\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ValLub.java",
    "content": "class ValLub {\n\tpublic void easyLub() {\n\t\tjava.util.Map<String, Number> m = java.util.Collections.emptyMap();\n\t\tfinal java.util.Map<java.lang.String, java.lang.Number> foo = (System.currentTimeMillis() > 0) ? m : java.util.Collections.<String, Number>emptyMap();\n\t}\n\tpublic void sillyLubWithUnboxingThatProducesErrorThatVarIsPrimitive() {\n\t\tInteger i = 20;\n\t\tDouble d = 20.0;\n\t\tfinal double thisShouldBePrimitiveDouble = (System.currentTimeMillis() > 0) ? i : d;\n\t}\n\tpublic void hardLub() {\n\t\tjava.util.List<String> list = new java.util.ArrayList<String>();\n\t\tjava.util.Set<String> set = new java.util.HashSet<String>();\n\t\tfinal java.util.Collection<java.lang.String> thisShouldBeCollection = (System.currentTimeMillis() > 0) ? list : set;\n\t\tthisShouldBeCollection.add(\"\");\n\t\tString foo = thisShouldBeCollection.iterator().next();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ValNullInit.java",
    "content": "class ValNullInit {\n\tvoid method() {\n\t\tfinal java.lang.Object x = null;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ValOutersWithGenerics.java",
    "content": "import java.util.*;\npublic class ValOutersWithGenerics<Z> {\n\tclass Inner {\n\t}\n\tclass InnerWithGenerics<H> {\n\t}\n\tpublic void testOutersWithGenerics() {\n\t\tfinal java.lang.String foo = \"\";\n\t\tList<Inner> list = new ArrayList<Inner>();\n\t\tfinal ValOutersWithGenerics<Z>.Inner elem = list.get(0);\n\t}\n\tpublic void testLocalClasses() {\n\t\tclass Local<A> {\n\t\t}\n\t\tfinal Local<java.lang.String> q = new Local<String>();\n\t}\n\tpublic static void test() {\n\t\tfinal ValOutersWithGenerics<java.lang.String> outer = new ValOutersWithGenerics<String>();\n\t\tfinal ValOutersWithGenerics<java.lang.String>.Inner inner1 = outer.new Inner();\n\t\tfinal ValOutersWithGenerics<java.lang.String>.InnerWithGenerics<java.lang.Integer> inner2 = outer.new InnerWithGenerics<Integer>();\n\t}\n\tstatic class SubClass extends ValOutersWithGenerics<String> {\n\t\tpublic void testSubClassOfOutersWithGenerics() {\n\t\t\tList<Inner> list = new ArrayList<Inner>();\n\t\t\tfinal ValOutersWithGenerics<java.lang.String>.Inner elem = list.get(0);\n\t\t}\n\t}\n\tpublic static void loop(Map<String, String> map) {\n\t\tfor (final java.util.Map.Entry<java.lang.String, java.lang.String> e : map.entrySet()) {\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ValRawType.java",
    "content": "import java.util.List;\n\npublic class ValRawType {\n\n\tpublic void test() {\n\t\tElement propElement = new Element();\n\t\tfor (final java.lang.Object attribute : propElement.attributes()) {\n\t\t\tfinal ValRawType.Attribute attr = (Attribute) attribute;\n\t\t}\n\t}\n\n\tstatic class Element {\n\t\tpublic List attributes() {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tstatic class Attribute {\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ValSimple.java",
    "content": "public class ValSimple {\n\tprivate String field = \"field\";\n\tprivate short field2 = 5;\n\t\n\tprivate String method() {\n\t\treturn \"method\";\n\t}\n\t\n\tprivate double method2() {\n\t\treturn 2.0;\n\t}\n\t\n\tprivate void testVal(String param) {\n\t\tfinal java.lang.String fieldV = field;\n\t\tfinal java.lang.String methodV = method();\n\t\tfinal java.lang.String paramV = param;\n\t\tfinal java.lang.String valOfVal = fieldV;\n\t\tfinal java.lang.String operatorV = fieldV + valOfVal;\n\t\tfinal short fieldW = field2;\n\t\tfinal double methodW = method2();\n\t\tbyte localVar = 3;\n\t\tfinal int operatorW = fieldW + localVar;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ValSuperDefaultMethod.java",
    "content": "// version 8:9\nclass ValSuperDefaultMethod implements Default {\n\tpublic void test() {\n\t\tfinal java.lang.String a = \"\";\n\t\tDefault.super.method();\n\t}\n}\n\ninterface Default {\n\tdefault void method() {\n\t}\n}"
  },
  {
    "path": "test/transform/resource/after-delombok/ValSwitchExpression.java",
    "content": "// version 14:\npublic class ValSwitchExpression {\n\tpublic void method(int arg) {\n\t\tfinal var x = switch (arg) {\n\t\t\tdefault -> {\n\t\t\t\tfinal var s = \"string\";\n\t\t\t\tyield arg;\n\t\t\t}\n\t\t};\n\t}\n}"
  },
  {
    "path": "test/transform/resource/after-delombok/ValToNative.java",
    "content": "// version 10:\nimport java.io.IOException;\nimport java.util.Arrays;\n\npublic class ValToNative {\n\tprivate void test() throws IOException {\n\t\tfinal var intField = 1;\n\t\tfor (final var s : Arrays.asList(\"1\")) {\n\t\t\tfinal var s2 = s;\n\t\t}\n\t\ttry (var in = getClass().getResourceAsStream(\"ValToNative.class\")) {\n\t\t\tfinal var j = in.read();\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/transform/resource/after-delombok/ValWeirdTypes.java",
    "content": "// version 8: In java6/7, lub types worked differently, so, the `arraysAsList` method has a slightly different inferred type there.\nimport java.math.BigDecimal;\nimport java.util.*;\npublic class ValWeirdTypes<Z> {\n\tprivate List<Z> fieldList;\n\tpublic void testGenerics() {\n\t\tList<String> list = new ArrayList<String>();\n\t\tlist.add(\"Hello, World!\");\n\t\tfinal java.lang.String shouldBeString = list.get(0);\n\t\tfinal java.util.List<java.lang.String> shouldBeListOfString = list;\n\t\tfinal java.util.List<java.lang.String> shouldBeListOfStringToo = Arrays.asList(\"hello\", \"world\");\n\t\tfinal java.lang.String shouldBeString2 = shouldBeListOfString.get(0);\n\t}\n\tpublic void testGenericsInference() {\n\t\tfinal java.util.List<java.lang.Object> huh = Collections.emptyList();\n\t\tfinal java.util.List<java.lang.Number> huh2 = Collections.<Number>emptyList();\n\t}\n\tpublic void testPrimitives() {\n\t\tfinal int x = 10;\n\t\tfinal long y = 5 + 3L;\n\t}\n\tpublic void testAnonymousInnerClass() {\n\t\tfinal java.lang.Runnable y = new Runnable() {\n\t\t\tpublic void run() {\n\t\t\t}\n\t\t};\n\t}\n\tpublic <T extends Number> void testTypeParams(List<T> param) {\n\t\tfinal T t = param.get(0);\n\t\tfinal Z z = fieldList.get(0);\n\t\tfinal java.util.List<T> k = param;\n\t\tfinal java.util.List<Z> y = fieldList;\n\t}\n\tpublic void testBounds(List<? extends Number> lower, List<? super Number> upper) {\n\t\tfinal java.lang.Number a = lower.get(0);\n\t\tfinal java.lang.Object b = upper.get(0);\n\t\tfinal java.util.List<? extends java.lang.Number> c = lower;\n\t\tfinal java.util.List<? super java.lang.Number> d = upper;\n\t\tList<?> unbound = lower;\n\t\tfinal java.util.List<?> e = unbound;\n\t\tfinal java.lang.Object f = unbound.get(0);\n\t}\n\tpublic void testCompound() {\n\t\tfinal java.util.ArrayList<java.lang.String> a = new ArrayList<String>();\n\t\tfinal java.util.Vector<java.lang.String> b = new Vector<String>();\n\t\tfinal boolean c = 1 < System.currentTimeMillis();\n\t\tfinal java.util.AbstractList<java.lang.String> d = c ? a : b;\n\t\tjava.util.RandomAccess confirm = c ? a : b;\n\t}\n\tpublic void nullType() {\n\t\tfinal java.lang.Object nully = null;\n\t}\n\tpublic void testArrays() {\n\t\tfinal int[] intArray = new int[] {1, 2, 3};\n\t\tfinal java.lang.Object[][] multiDimArray = new Object[][] {{}};\n\t\tfinal int[] copy = intArray;\n\t\tfinal java.lang.Object[] single = multiDimArray[0];\n\t\tfinal int singleInt = copy[0];\n\t}\n\tpublic void arraysAsList() {\n\t\tfinal java.util.List<java.lang.Class<? extends java.io.Serializable>> x = Arrays.asList(String.class, BigDecimal.class);\n\t\tfor (final java.lang.Class<? extends java.io.Serializable> y : x) {\n\t\t}\n\t}\n\t@SuppressWarnings(\"all\")\n\tpublic void arraysAsList2() {\n\t\tfinal java.util.List<java.lang.Class<? extends java.lang.Comparable>> x = Arrays.asList(String.class, BigDecimal.class, Comparable.class);\n\t\tfor (final java.lang.Class<? extends java.lang.Comparable> y : x) {\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ValWithLabel.java",
    "content": "public class ValWithLabel {\n\t{\n\t\tLABEL:\n\t\tfor (final java.lang.String x : new String[0]) {\n\t\t\tif (x.toLowerCase() == null) {\n\t\t\t\tcontinue LABEL;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ValWithLocalClasses.java",
    "content": "class ValWithLocalClasses1 {\n\t{\n\t\tfinal ValWithLocalClasses2 f2 = new ValWithLocalClasses2() {\n\t\t};\n\t}\n}\nclass ValWithLocalClasses2 {\n\t{\n\t\tfinal int f3 = 0;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ValWithSelfRefGenerics.java",
    "content": "public class ValWithSelfRefGenerics {\n\tpublic void run(Thing<? extends Comparable<?>> thing, Thing<?> thing2, java.util.List<? extends Number> z) {\n\t\tfinal java.util.List<? extends java.lang.Number> y = z;\n\t\tfinal Thing<? extends java.lang.Comparable<?>> x = thing;\n\t\tfinal Thing<?> w = thing2;\n\t\tfinal java.lang.Comparable<?> v = thing2.get();\n\t}\n}\n\nclass Thing<T extends Comparable<? super T>> {\n\tpublic T get() {\n\t\treturn null;\n\t}\n}"
  },
  {
    "path": "test/transform/resource/after-delombok/ValueCallSuper.java",
    "content": "class ValueParent {\n}\nfinal class ValueCallSuper extends ValueParent {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic ValueCallSuper() {\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof ValueCallSuper)) return false;\n\t\tfinal ValueCallSuper other = (ValueCallSuper) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (!super.equals(o)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof ValueCallSuper;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int result = super.hashCode();\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"ValueCallSuper()\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ValueInAnonymousClass.java",
    "content": "public class ValueInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\tfinal class Inner {\n\t\t\tprivate final String string;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic Inner(final String string) {\n\t\t\t\tthis.string = string;\n\t\t\t}\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic String getString() {\n\t\t\t\treturn this.string;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic boolean equals(final java.lang.Object o) {\n\t\t\t\tif (o == this) return true;\n\t\t\t\tif (!(o instanceof Inner)) return false;\n\t\t\t\tfinal Inner other = (Inner) o;\n\t\t\t\tfinal java.lang.Object this$string = this.getString();\n\t\t\t\tfinal java.lang.Object other$string = other.getString();\n\t\t\t\tif (this$string == null ? other$string != null : !this$string.equals(other$string)) return false;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic int hashCode() {\n\t\t\t\tfinal int PRIME = 59;\n\t\t\t\tint result = 1;\n\t\t\t\tfinal java.lang.Object $string = this.getString();\n\t\t\t\tresult = result * PRIME + ($string == null ? 43 : $string.hashCode());\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\t@java.lang.Override\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic java.lang.String toString() {\n\t\t\t\treturn \"Inner(string=\" + this.getString() + \")\";\n\t\t\t}\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ValueOnRecord.java",
    "content": "// version 14:\npublic record ValueOnRecord(String a, String b) {\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ValuePlain.java",
    "content": "final class Value1 {\n\tprivate final int x;\n\tprivate final String name;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic Value1(final int x, final String name) {\n\t\tthis.x = x;\n\t\tthis.name = name;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getX() {\n\t\treturn this.x;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getName() {\n\t\treturn this.name;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof Value1)) return false;\n\t\tfinal Value1 other = (Value1) o;\n\t\tif (this.getX() != other.getX()) return false;\n\t\tfinal java.lang.Object this$name = this.getName();\n\t\tfinal java.lang.Object other$name = other.getName();\n\t\tif (this$name == null ? other$name != null : !this$name.equals(other$name)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.getX();\n\t\tfinal java.lang.Object $name = this.getName();\n\t\tresult = result * PRIME + ($name == null ? 43 : $name.hashCode());\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"Value1(x=\" + this.getX() + \", name=\" + this.getName() + \")\";\n\t}\n}\nclass Value2 {\n\tpublic final int x;\n\tprivate final String name;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic Value2(final int x, final String name) {\n\t\tthis.x = x;\n\t\tthis.name = name;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getX() {\n\t\treturn this.x;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getName() {\n\t\treturn this.name;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof Value2)) return false;\n\t\tfinal Value2 other = (Value2) o;\n\t\tif (!other.canEqual((java.lang.Object) this)) return false;\n\t\tif (this.getX() != other.getX()) return false;\n\t\tfinal java.lang.Object this$name = this.getName();\n\t\tfinal java.lang.Object other$name = other.getName();\n\t\tif (this$name == null ? other$name != null : !this$name.equals(other$name)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected boolean canEqual(final java.lang.Object other) {\n\t\treturn other instanceof Value2;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.getX();\n\t\tfinal java.lang.Object $name = this.getName();\n\t\tresult = result * PRIME + ($name == null ? 43 : $name.hashCode());\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"Value2(x=\" + this.getX() + \", name=\" + this.getName() + \")\";\n\t}\n}\nfinal class Value3 {\n\tprivate int x;\n\tprivate final int y;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic Value3(final int x, final int y) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getX() {\n\t\treturn this.x;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getY() {\n\t\treturn this.y;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof Value3)) return false;\n\t\tfinal Value3 other = (Value3) o;\n\t\tif (this.getX() != other.getX()) return false;\n\t\tif (this.getY() != other.getY()) return false;\n\t\treturn true;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.getX();\n\t\tresult = result * PRIME + this.getY();\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"Value3(x=\" + this.getX() + \", y=\" + this.getY() + \")\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ValueStaticConstructorOf.java",
    "content": "public final class ValueStaticConstructorOf {\n\tprivate final String name;\n\tprivate final Double price;\n\tprivate ValueStaticConstructorOf(String name, Double price) {\n\t\tthis.name = name;\n\t\tthis.price = price;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static ValueStaticConstructorOf of(final String name, final Double price) {\n\t\treturn new ValueStaticConstructorOf(name, price);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getName() {\n\t\treturn this.name;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic Double getPrice() {\n\t\treturn this.price;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof ValueStaticConstructorOf)) return false;\n\t\tfinal ValueStaticConstructorOf other = (ValueStaticConstructorOf) o;\n\t\tfinal java.lang.Object this$price = this.getPrice();\n\t\tfinal java.lang.Object other$price = other.getPrice();\n\t\tif (this$price == null ? other$price != null : !this$price.equals(other$price)) return false;\n\t\tfinal java.lang.Object this$name = this.getName();\n\t\tfinal java.lang.Object other$name = other.getName();\n\t\tif (this$name == null ? other$name != null : !this$name.equals(other$name)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tfinal java.lang.Object $price = this.getPrice();\n\t\tresult = result * PRIME + ($price == null ? 43 : $price.hashCode());\n\t\tfinal java.lang.Object $name = this.getName();\n\t\tresult = result * PRIME + ($name == null ? 43 : $name.hashCode());\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"ValueStaticConstructorOf(name=\" + this.getName() + \", price=\" + this.getPrice() + \")\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ValueStaticField.java",
    "content": "final class ValueStaticField {\n\tstatic int x;\n\tstatic String PASSWORD = \"Ken sent me\";\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic ValueStaticField() {\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof ValueStaticField)) return false;\n\t\treturn true;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int result = 1;\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"ValueStaticField()\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/ValueWithJavaBeansSpecCapitalization.java",
    "content": "final class ValueWithJavaBeansSpecCapitalization {\n\tprivate final int aField;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic ValueWithJavaBeansSpecCapitalization(final int aField) {\n\t\tthis.aField = aField;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int getaField() {\n\t\treturn this.aField;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic boolean equals(final java.lang.Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof ValueWithJavaBeansSpecCapitalization)) return false;\n\t\tfinal ValueWithJavaBeansSpecCapitalization other = (ValueWithJavaBeansSpecCapitalization) o;\n\t\tif (this.getaField() != other.getaField()) return false;\n\t\treturn true;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tresult = result * PRIME + this.getaField();\n\t\treturn result;\n\t}\n\t@java.lang.Override\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic java.lang.String toString() {\n\t\treturn \"ValueWithJavaBeansSpecCapitalization(aField=\" + this.getaField() + \")\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/VarComplex.java",
    "content": "public class VarComplex {\n\tprivate String field = \"\";\n\tprivate static final int CONSTANT = 20;\n\tpublic void testComplex() {\n\t\tchar[] shouldBeCharArray = field.toCharArray();\n\t\tint shouldBeInt = CONSTANT;\n\t\tjava.lang.Object lock = new Object();\n\t\tsynchronized (lock) {\n\t\t\tint field = 20; //Shadowing\n\t\t\tint inner = 10;\n\t\t\tswitch (field) {\n\t\t\tcase 5: \n\t\t\t\tchar[] shouldBeCharArray2 = shouldBeCharArray;\n\t\t\t\tint innerInner = inner;\n\t\t\t\n\t\t\t}\n\t\t}\n\t\tjava.lang.String shouldBeString = field; //Unshadowing\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/VarInFor.java",
    "content": "public class VarInFor {\n\tpublic void enhancedFor() {\n\t\tint[] list = new int[] {1, 2};\n\t\tfor (int shouldBeInt : list) {\n\t\t\tSystem.out.println(shouldBeInt);\n\t\t\tint shouldBeInt2 = shouldBeInt;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/VarInForOld.java",
    "content": "public class VarInForOld {\n\tpublic void oldFor() {\n\t\tfor (int i = 0; i < 100; ++i) {\n\t\t\tSystem.out.println(i);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/VarModifier.java",
    "content": "public class VarModifier {\n\tprivate String field = \"\";\n\tpublic void testComplex() {\n\t\tfinal char[] shouldBeFinalCharArray = field.toCharArray();\n\t\tchar[] shouldBeCharArray = field.toCharArray();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/VarNullInit.java",
    "content": "\npublic class VarNullInit {\n\tvoid method() {\n\t\tjava.lang.Object x = null;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/VarWarning.java",
    "content": "public class VarWarning {\n\tpublic void isOkay() {\n\t\tjava.lang.String x = \"Warning\";\n\t\tx.toLowerCase();\n\t}\n}"
  },
  {
    "path": "test/transform/resource/after-delombok/WeirdJavadoc.java",
    "content": "public class WeirdJavadoc {\n\t// Comment\n\t/* Weird comment /** */\n\t/* Weird comment /** */\n\t/**\n\t * This is the real comment\n\t * @param test Copy this\n\t */\n\tWeirdJavadoc(String test) {\n\t}\n\t// Comment\n\t/* Weird comment /** */\n\t/* Weird comment /** */\n\t/**\n\t * This is the real comment\n\t */\n\tprivate String test;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static class WeirdJavadocBuilder {\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tprivate String test;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tWeirdJavadocBuilder() {\n\t\t}\n\t\t/**\n\t\t * @param test Copy this\n\t\t * @return {@code this}.\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic WeirdJavadoc.WeirdJavadocBuilder test(final String test) {\n\t\t\tthis.test = test;\n\t\t\treturn this;\n\t\t}\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic WeirdJavadoc build() {\n\t\t\treturn new WeirdJavadoc(this.test);\n\t\t}\n\t\t@java.lang.Override\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"WeirdJavadoc.WeirdJavadocBuilder(test=\" + this.test + \")\";\n\t\t}\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic static WeirdJavadoc.WeirdJavadocBuilder builder() {\n\t\treturn new WeirdJavadoc.WeirdJavadocBuilder();\n\t}\n\t/**\n\t * This is the real comment\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic String getTest() {\n\t\treturn this.test;\n\t}\n\t/**\n\t * This is the real comment\n\t * @param test Copy this\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic void setTest(final String test) {\n\t\tthis.test = test;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/WithAlreadyExists.java",
    "content": "class With1 {\n\tboolean foo;\n\tvoid withFoo(boolean foo) {\n\t}\n\tWith1(boolean foo) {\n\t}\n}\nclass With2 {\n\tboolean foo;\n\tvoid withFoo(String foo) {\n\t}\n\tWith2(boolean foo) {\n\t}\n}\nclass With3 {\n\tString foo;\n\tvoid withFoo(boolean foo) {\n\t}\n\tWith3(String foo) {\n\t}\n}\nclass With4 {\n\tString foo;\n\tvoid withFoo(String foo) {\n\t}\n\tWith4(String foo) {\n\t}\n}\nclass With5 {\n\tString foo;\n\tvoid withFoo() {\n\t}\n\tWith5(String foo) {\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic With5 withFoo(final String foo) {\n\t\treturn this.foo == foo ? this : new With5(foo);\n\t}\n}\nclass With6 {\n\tString foo;\n\tvoid withFoo(String foo, int x) {\n\t}\n\tWith6(String foo) {\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic With6 withFoo(final String foo) {\n\t\treturn this.foo == foo ? this : new With6(foo);\n\t}\n}\nclass With7 {\n\tString foo;\n\tvoid withFoo(String foo, Object... x) {\n\t}\n\tWith7(String foo) {\n\t}\n}\nclass With8 {\n\tboolean isFoo;\n\tvoid withIsFoo(boolean foo) {\n\t}\n\tWith8(boolean foo) {\n\t}\n}\nclass With9 {\n\tboolean isFoo;\n\tvoid withFoo(boolean foo) {\n\t}\n\tWith9(boolean foo) {\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/WithAndAllArgsConstructor.java",
    "content": "class WithAndAllArgsConstructor<T, J extends T, L extends java.lang.Number> {\n\tJ test;\n\tjava.util.List<L> test2;\n\tfinal int x = 10;\n\tint y = 20;\n\tfinal int z;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithAndAllArgsConstructor(final J test, final java.util.List<L> test2, final int y, final int z) {\n\t\tthis.test = test;\n\t\tthis.test2 = test2;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithAndAllArgsConstructor<T, J, L> withTest(final J test) {\n\t\treturn this.test == test ? this : new WithAndAllArgsConstructor<T, J, L>(test, this.test2, this.y, this.z);\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithAndAllArgsConstructor<T, J, L> withTest2(final java.util.List<L> test2) {\n\t\treturn this.test2 == test2 ? this : new WithAndAllArgsConstructor<T, J, L>(this.test, test2, this.y, this.z);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/WithByInAnonymousClass.java",
    "content": "//version 8:\npublic class WithByInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\tclass Inner {\n\t\t\tprivate Inner(String string) {\n\t\t\t}\n\t\t\tprivate String string;\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic Inner withStringBy(final java.util.function.Function<? super String, ? extends String> transformer) {\n\t\t\t\treturn new Inner(transformer.apply(this.string));\n\t\t\t}\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/WithByNullAnnos.java",
    "content": "//version 8:\nimport java.util.List;\npublic class WithByNullAnnos {\n\tfinal List<String> test;\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithByNullAnnos(final List<String> test) {\n\t\tthis.test = test;\n\t}\n\t@org.checkerframework.checker.nullness.qual.NonNull\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithByNullAnnos withTestBy(final java.util.function.@org.checkerframework.checker.nullness.qual.NonNull Function<? super List<String>, ? extends List<String>> transformer) {\n\t\treturn new WithByNullAnnos(transformer.apply(this.test));\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/WithByOnRecord.java",
    "content": "// version 14:\npublic record WithByOnRecord(String a, String b) {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithByOnRecord withABy(final java.util.function.Function<? super String, ? extends String> transformer) {\n\t\treturn new WithByOnRecord(transformer.apply(this.a), this.b);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithByOnRecord withBBy(final java.util.function.Function<? super String, ? extends String> transformer) {\n\t\treturn new WithByOnRecord(this.a, transformer.apply(this.b));\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/WithByOnRecordComponent.java",
    "content": "// version 14:\npublic record WithByOnRecordComponent(String a, String b) {\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithByOnRecordComponent withABy(final java.util.function.Function<? super String, ? extends String> transformer) {\n\t\treturn new WithByOnRecordComponent(transformer.apply(this.a), this.b);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/WithByTypes.java",
    "content": "//version 8:\npublic class WithByTypes<T> {\n\tprivate final int a;\n\tprivate final long b;\n\tprivate final short c;\n\tprivate final char d;\n\tprivate final byte e;\n\tprivate final double f;\n\tprivate final float g;\n\tprivate final boolean h;\n\tprivate final T i;\n\tpublic static void example() {\n\t\tnew WithByTypes<String>(0, 0, (short) 0, ' ', (byte) 0, 0.0, 0.0F, true, \"\").withHBy(x -> !x).withFBy(x -> x + 0.5);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithByTypes(final int a, final long b, final short c, final char d, final byte e, final double f, final float g, final boolean h, final T i) {\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\t\tthis.d = d;\n\t\tthis.e = e;\n\t\tthis.f = f;\n\t\tthis.g = g;\n\t\tthis.h = h;\n\t\tthis.i = i;\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithByTypes<T> withABy(final java.util.function.IntUnaryOperator transformer) {\n\t\treturn new WithByTypes<T>(transformer.applyAsInt(this.a), this.b, this.c, this.d, this.e, this.f, this.g, this.h, this.i);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithByTypes<T> withBBy(final java.util.function.LongUnaryOperator transformer) {\n\t\treturn new WithByTypes<T>(this.a, transformer.applyAsLong(this.b), this.c, this.d, this.e, this.f, this.g, this.h, this.i);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithByTypes<T> withCBy(final java.util.function.IntUnaryOperator transformer) {\n\t\treturn new WithByTypes<T>(this.a, this.b, (short) transformer.applyAsInt(this.c), this.d, this.e, this.f, this.g, this.h, this.i);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithByTypes<T> withDBy(final java.util.function.IntUnaryOperator transformer) {\n\t\treturn new WithByTypes<T>(this.a, this.b, this.c, (char) transformer.applyAsInt(this.d), this.e, this.f, this.g, this.h, this.i);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithByTypes<T> withEBy(final java.util.function.IntUnaryOperator transformer) {\n\t\treturn new WithByTypes<T>(this.a, this.b, this.c, this.d, (byte) transformer.applyAsInt(this.e), this.f, this.g, this.h, this.i);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithByTypes<T> withFBy(final java.util.function.DoubleUnaryOperator transformer) {\n\t\treturn new WithByTypes<T>(this.a, this.b, this.c, this.d, this.e, transformer.applyAsDouble(this.f), this.g, this.h, this.i);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithByTypes<T> withGBy(final java.util.function.DoubleUnaryOperator transformer) {\n\t\treturn new WithByTypes<T>(this.a, this.b, this.c, this.d, this.e, this.f, (float) transformer.applyAsDouble(this.g), this.h, this.i);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithByTypes<T> withHBy(final java.util.function.UnaryOperator<java.lang.Boolean> transformer) {\n\t\treturn new WithByTypes<T>(this.a, this.b, this.c, this.d, this.e, this.f, this.g, transformer.apply(this.h), this.i);\n\t}\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithByTypes<T> withIBy(final java.util.function.Function<? super T, ? extends T> transformer) {\n\t\treturn new WithByTypes<T>(this.a, this.b, this.c, this.d, this.e, this.f, this.g, this.h, transformer.apply(this.i));\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/WithInAnonymousClass.java",
    "content": "public class WithInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\tclass Inner {\n\t\t\tprivate Inner(String string) {\n\t\t\t}\n\t\t\tprivate String string;\n\t\t\t/**\n\t\t\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t\t\t */\n\t\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t\t@lombok.Generated\n\t\t\tpublic Inner withString(final String string) {\n\t\t\t\treturn this.string == string ? this : new Inner(string);\n\t\t\t}\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/WithInnerAnnotation.java",
    "content": "class WithInnerAnnotation {\n\t@interface Inner {\n\t\tint bar() default 42;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/WithMethodAbstract.java",
    "content": "abstract class WithMethodAbstract {\n\tString foo;\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic abstract WithMethodAbstract withFoo(final String foo);\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/WithMethodMarkedDeprecated.java",
    "content": "class WithMethodMarkedDeprecated {\n\t@Deprecated\n\tint annotation;\n\t/**\n\t * @deprecated\n\t */\n\tint javadoc;\n\tWithMethodMarkedDeprecated(int annotation, int javadoc) {\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.Deprecated\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithMethodMarkedDeprecated withAnnotation(final int annotation) {\n\t\treturn this.annotation == annotation ? this : new WithMethodMarkedDeprecated(annotation, this.javadoc);\n\t}\n\t/**\n\t * @deprecated\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.Deprecated\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithMethodMarkedDeprecated withJavadoc(final int javadoc) {\n\t\treturn this.javadoc == javadoc ? this : new WithMethodMarkedDeprecated(this.annotation, javadoc);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/WithMethodMarkedDeprecatedAnnOnly.java",
    "content": "class WithMethodMarkedDeprecatedAnnOnly {\n\t@Deprecated\n\tint annotation;\n\tWithMethodMarkedDeprecatedAnnOnly(int annotation) {\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.Deprecated\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithMethodMarkedDeprecatedAnnOnly withAnnotation(final int annotation) {\n\t\treturn this.annotation == annotation ? this : new WithMethodMarkedDeprecatedAnnOnly(annotation);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/WithNested.java",
    "content": "public interface WithNested<Z> {\n\tclass IAmStaticReally {\n\t\tfinal String x;\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic IAmStaticReally(final String x) {\n\t\t\tthis.x = x;\n\t\t}\n\t\t/**\n\t\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic WithNested.IAmStaticReally withX(final String x) {\n\t\t\treturn this.x == x ? this : new WithNested.IAmStaticReally(x);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/WithOnClass.java",
    "content": "//version 8:\nclass WithOnClass1 {\n\tboolean isNone;\n\tboolean isPublic;\n\tWithOnClass1(boolean isNone, boolean isPublic) {\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithOnClass1 withPublic(final boolean isPublic) {\n\t\treturn this.isPublic == isPublic ? this : new WithOnClass1(this.isNone, isPublic);\n\t}\n}\nclass WithOnClass2 {\n\tboolean isNone;\n\tboolean isProtected;\n\tboolean isPackage;\n\tWithOnClass2(boolean isNone, boolean isProtected, boolean isPackage) {\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected WithOnClass2 withProtected(final boolean isProtected) {\n\t\treturn this.isProtected == isProtected ? this : new WithOnClass2(this.isNone, isProtected, this.isPackage);\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tWithOnClass2 withPackage(final boolean isPackage) {\n\t\treturn this.isPackage == isPackage ? this : new WithOnClass2(this.isNone, this.isProtected, isPackage);\n\t}\n}\nclass WithOnClass3 {\n\tString couldBeNull;\n\t@lombok.NonNull\n\tString nonNull;\n\tWithOnClass3(String couldBeNull, String nonNull) {\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithOnClass3 withCouldBeNull(final String couldBeNull) {\n\t\treturn this.couldBeNull == couldBeNull ? this : new WithOnClass3(couldBeNull, this.nonNull);\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithOnClass3 withNonNull(@lombok.NonNull final String nonNull) {\n\t\tif (nonNull == null) {\n\t\t\tthrow new java.lang.NullPointerException(\"nonNull is marked non-null but is null\");\n\t\t}\n\t\treturn this.nonNull == nonNull ? this : new WithOnClass3(this.couldBeNull, nonNull);\n\t}\n}\nclass WithOnClass4 {\n\tfinal int fX = 10;\n\tfinal int fY;\n\tWithOnClass4(int y) {\n\t\tthis.fY = y;\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithOnClass4 withY(final int fY) {\n\t\treturn this.fY == fY ? this : new WithOnClass4(fY);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/WithOnNestedRecord.java",
    "content": "// version 14:\npublic record WithOnNestedRecord<T>() {\n\tpublic record Nested(String a, String b) {\n\t\t/**\n\t\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic WithOnNestedRecord.Nested withA(final String a) {\n\t\t\treturn this.a == a ? this : new WithOnNestedRecord.Nested(a, this.b);\n\t\t}\n\t\t/**\n\t\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t\t */\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\t@lombok.Generated\n\t\tpublic WithOnNestedRecord.Nested withB(final String b) {\n\t\t\treturn this.b == b ? this : new WithOnNestedRecord.Nested(this.a, b);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/WithOnRecord.java",
    "content": "// version 14:\npublic record WithOnRecord(String a, String b) {\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithOnRecord withA(final String a) {\n\t\treturn this.a == a ? this : new WithOnRecord(a, this.b);\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithOnRecord withB(final String b) {\n\t\treturn this.b == b ? this : new WithOnRecord(this.a, b);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/WithOnRecordComponent.java",
    "content": "// version 14:\npublic record WithOnRecordComponent(String a, String b) {\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithOnRecordComponent withA(final String a) {\n\t\treturn this.a == a ? this : new WithOnRecordComponent(a, this.b);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/WithOnStatic.java",
    "content": "class WithOnStatic {\n\tstatic boolean foo;\n\tstatic int bar;\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/WithPlain.java",
    "content": "//version 8: springframework dep is too new to run on j6\nclass WithPlain {\n\tint i;\n\tfinal int foo;\n\tWithPlain(int i, int foo) {\n\t\tthis.i = i;\n\t\tthis.foo = foo;\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@org.springframework.lang.NonNull\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithPlain withI(final int i) {\n\t\treturn this.i == i ? this : new WithPlain(i, this.foo);\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@org.springframework.lang.NonNull\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithPlain withFoo(final int foo) {\n\t\treturn this.foo == foo ? this : new WithPlain(this.i, foo);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/WithWithDollar.java",
    "content": "class WithWithDollar {\n\tint $i;\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/WithWithGenerics.java",
    "content": "class WithWithGenerics<T, J extends T, L extends java.lang.Number> {\n\tJ test;\n\tjava.util.List<L> test2;\n\tjava.util.List<? extends L> test3;\n\tint $i;\n\tpublic WithWithGenerics(J test, java.util.List<L> test2, java.util.List<? extends L> test3) {\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithWithGenerics<T, J, L> withTest(final J test) {\n\t\treturn this.test == test ? this : new WithWithGenerics<T, J, L>(test, this.test2, this.test3);\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithWithGenerics<T, J, L> withTest2(final java.util.List<L> test2) {\n\t\treturn this.test2 == test2 ? this : new WithWithGenerics<T, J, L>(this.test, test2, this.test3);\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithWithGenerics<T, J, L> withTest3(final java.util.List<? extends L> test3) {\n\t\treturn this.test3 == test3 ? this : new WithWithGenerics<T, J, L>(this.test, this.test2, test3);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/WithWithJavaBeansSpecCapitalization.java",
    "content": "class WithWithJavaBeansSpecCapitalization {\n\tint aField;\n\tWithWithJavaBeansSpecCapitalization(int aField) {\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithWithJavaBeansSpecCapitalization withaField(final int aField) {\n\t\treturn this.aField == aField ? this : new WithWithJavaBeansSpecCapitalization(aField);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/WithWithTypeAnnos.java",
    "content": "import java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.List;\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})\n@interface TA {\n}\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})\n@interface TB {\n}\nclass WithWithTypeAnnos {\n\t@TA\n\t@TB\n\tfinal List<String> foo;\n\tWithWithTypeAnnos(@TA @TB List<String> foo) {\n\t\tthis.foo = foo;\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WithWithTypeAnnos withFoo(@TA final List<String> foo) {\n\t\treturn this.foo == foo ? this : new WithWithTypeAnnos(foo);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/WitherAccessLevel.java",
    "content": "class WitherAccessLevel {\n\tboolean isNone;\n\tboolean isPrivate;\n\tboolean isPackage;\n\tboolean isProtected;\n\tboolean isPublic;\n\tboolean value;\n\tWitherAccessLevel(boolean isNone, boolean isPrivate, boolean isPackage, boolean isProtected, boolean isPublic, boolean value) {\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprivate WitherAccessLevel withPrivate(final boolean isPrivate) {\n\t\treturn this.isPrivate == isPrivate ? this : new WitherAccessLevel(this.isNone, isPrivate, this.isPackage, this.isProtected, this.isPublic, this.value);\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tWitherAccessLevel withPackage(final boolean isPackage) {\n\t\treturn this.isPackage == isPackage ? this : new WitherAccessLevel(this.isNone, this.isPrivate, isPackage, this.isProtected, this.isPublic, this.value);\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tprotected WitherAccessLevel withProtected(final boolean isProtected) {\n\t\treturn this.isProtected == isProtected ? this : new WitherAccessLevel(this.isNone, this.isPrivate, this.isPackage, isProtected, this.isPublic, this.value);\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WitherAccessLevel withPublic(final boolean isPublic) {\n\t\treturn this.isPublic == isPublic ? this : new WitherAccessLevel(this.isNone, this.isPrivate, this.isPackage, this.isProtected, isPublic, this.value);\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WitherAccessLevel withValue(final boolean value) {\n\t\treturn this.value == value ? this : new WitherAccessLevel(this.isNone, this.isPrivate, this.isPackage, this.isProtected, this.isPublic, value);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-delombok/WitherLegacyStar.java",
    "content": "class WitherLegacyStar {\n\tint i;\n\tWitherLegacyStar(int i) {\n\t\tthis.i = i;\n\t}\n\t/**\n\t * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n\t */\n\t@java.lang.SuppressWarnings(\"all\")\n\t@lombok.Generated\n\tpublic WitherLegacyStar withI(final int i) {\n\t\treturn this.i == i ? this : new WitherLegacyStar(i);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/Accessors.java",
    "content": "class AccessorsFluent {\n  private @lombok.Getter @lombok.Setter @lombok.experimental.Accessors(fluent = true) String fieldName = \"\";\n  AccessorsFluent() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String fieldName() {\n    return this.fieldName;\n  }\n  /**\n   * @return {@code this}.\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated AccessorsFluent fieldName(final String fieldName) {\n    this.fieldName = fieldName;\n    return this;\n  }\n}\n@lombok.experimental.Accessors(fluent = true) @lombok.Getter class AccessorsFluentOnClass {\n  private @lombok.Setter String fieldName = \"\";\n  private @lombok.experimental.Accessors(fluent = false) String otherFieldWithOverride = \"\";\n  AccessorsFluentOnClass() {\n    super();\n  }\n  /**\n   * @return {@code this}.\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated AccessorsFluentOnClass fieldName(final String fieldName) {\n    this.fieldName = fieldName;\n    return this;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String fieldName() {\n    return this.fieldName;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getOtherFieldWithOverride() {\n    return this.otherFieldWithOverride;\n  }\n}\nclass AccessorsChain {\n  private @lombok.Setter @lombok.experimental.Accessors(chain = true) boolean isRunning;\n  AccessorsChain() {\n    super();\n  }\n  /**\n   * @return {@code this}.\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated AccessorsChain setRunning(final boolean isRunning) {\n    this.isRunning = isRunning;\n    return this;\n  }\n}\n@lombok.experimental.Accessors(prefix = \"f\") class AccessorsPrefix {\n  private @lombok.Setter String fieldName;\n  private @lombok.Setter String fActualField;\n  AccessorsPrefix() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setActualField(final String fActualField) {\n    this.fActualField = fActualField;\n  }\n}\n@lombok.experimental.Accessors(prefix = {\"f\", \"\"}) class AccessorsPrefix2 {\n  private @lombok.Setter String fieldName;\n  private @lombok.Setter String fActualField;\n  AccessorsPrefix2() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setFieldName(final String fieldName) {\n    this.fieldName = fieldName;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setActualField(final String fActualField) {\n    this.fActualField = fActualField;\n  }\n}\n@lombok.experimental.Accessors(prefix = \"f\") @lombok.ToString @lombok.EqualsAndHashCode class AccessorsPrefix3 {\n  private String fName;\n  AccessorsPrefix3() {\n    super();\n  }\n  private String getName() {\n    return fName;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((\"AccessorsPrefix3(fName=\" + this.getName()) + \")\");\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof AccessorsPrefix3)))\n        return false;\n    final AccessorsPrefix3 other = (AccessorsPrefix3) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    final java.lang.Object this$fName = this.getName();\n    final java.lang.Object other$fName = other.getName();\n    if (((this$fName == null) ? (other$fName != null) : (! this$fName.equals(other$fName))))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof AccessorsPrefix3);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    final java.lang.Object $fName = this.getName();\n    result = ((result * PRIME) + (($fName == null) ? 43 : $fName.hashCode()));\n    return result;\n  }\n}\nclass AccessorsFluentGenerics<T extends Number> {\n  private @lombok.Setter @lombok.experimental.Accessors(fluent = true) String name;\n  AccessorsFluentGenerics() {\n    super();\n  }\n  /**\n   * @return {@code this}.\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated AccessorsFluentGenerics<T> name(final String name) {\n    this.name = name;\n    return this;\n  }\n}\nclass AccessorsFluentNoChaining {\n  private @lombok.Setter @lombok.experimental.Accessors(fluent = true,chain = false) String name;\n  AccessorsFluentNoChaining() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void name(final String name) {\n    this.name = name;\n  }\n}\nclass AccessorsFluentStatic<T extends Number> {\n  private static @lombok.Setter @lombok.experimental.Accessors(fluent = true) String name;\n  <clinit>() {\n  }\n  AccessorsFluentStatic() {\n    super();\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated void name(final String name) {\n    AccessorsFluentStatic.name = name;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/AccessorsCascade.java",
    "content": "@lombok.experimental.Accessors(chain = true) class AccessorsOuter {\n  class AccessorsInner1 {\n    private @lombok.experimental.Accessors(prefix = \"z\") @lombok.Setter String zTest3;\n    AccessorsInner1() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated AccessorsOuter.AccessorsInner1 setTest3(final String zTest3) {\n      this.zTest3 = zTest3;\n      return this;\n    }\n  }\n  @lombok.experimental.Accessors(chain = false) class AccessorsInner2 {\n    private @lombok.Setter String fTest4;\n    AccessorsInner2() {\n      super();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setTest4(final String fTest4) {\n      this.fTest4 = fTest4;\n    }\n  }\n  private @lombok.Setter String fTest;\n  private @lombok.experimental.Accessors(prefix = \"z\") @lombok.Setter String zTest2;\n  AccessorsOuter() {\n    super();\n  }\n  /**\n   * @return {@code this}.\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated AccessorsOuter setTest(final String fTest) {\n    this.fTest = fTest;\n    return this;\n  }\n  /**\n   * @return {@code this}.\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated AccessorsOuter setTest2(final String zTest2) {\n    this.zTest2 = zTest2;\n    return this;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/AccessorsConfiguration.java",
    "content": "class AccessorsConfiguration {\n  private @lombok.Getter @lombok.Setter @lombok.experimental.Accessors(fluent = true) String m_FieldName = \"\";\n  AccessorsConfiguration() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String fieldName() {\n    return this.m_FieldName;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void fieldName(final String m_FieldName) {\n    this.m_FieldName = m_FieldName;\n  }\n}\n@lombok.experimental.Accessors(prefix = {}) class AccessorsConfiguration2 {\n  private @lombok.Setter String m_FieldName = \"\";\n  AccessorsConfiguration2() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setM_FieldName(final String m_FieldName) {\n    this.m_FieldName = m_FieldName;\n  }\n}\n@lombok.experimental.Accessors(chain = true) class AccessorsConfiguration3 {\n  private @lombok.Setter String fFieldName = \"\";\n  AccessorsConfiguration3() {\n    super();\n  }\n  /**\n   * @return {@code this}.\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated AccessorsConfiguration3 setFieldName(final String fFieldName) {\n    this.fFieldName = fFieldName;\n    return this;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/AccessorsInAnonymousClass.java",
    "content": "import lombok.Getter;\nimport lombok.Setter;\nimport lombok.experimental.Accessors;\npublic class AccessorsInAnonymousClass {\n  Object annonymous = new Object() {\n    @Getter @Setter @Accessors(fluent = true) class Inner {\n      private String string;\n      Inner() {\n        super();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String string() {\n        return this.string;\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Inner string(final String string) {\n        this.string = string;\n        return this;\n      }\n    }\n    x() {\n      super();\n    }\n  };\n  public AccessorsInAnonymousClass() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/AccessorsMakeFinal.java",
    "content": "@lombok.experimental.Accessors(makeFinal = true) class AccessorsMakeFinal1 {\n  private @lombok.Setter @lombok.experimental.Accessors(fluent = true) String test;\n  AccessorsMakeFinal1() {\n    super();\n  }\n  /**\n   * @return {@code this}.\n   */\n  public final @java.lang.SuppressWarnings(\"all\") @lombok.Generated AccessorsMakeFinal1 test(final String test) {\n    this.test = test;\n    return this;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/AccessorsMakeFinalLombokConfig.java",
    "content": "class AccessorsMakeFinalLombokConfig {\n  private @lombok.Setter String test;\n  AccessorsMakeFinalLombokConfig() {\n    super();\n  }\n  public final @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setTest(final String test) {\n    this.test = test;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/AccessorsNoParamWarning.java",
    "content": "@lombok.experimental.Accessors(fluent = true) class AccessorsNoParams {\n  private @lombok.Getter @lombok.experimental.Accessors String otherFieldWithOverride = \"\";\n  AccessorsNoParams() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String otherFieldWithOverride() {\n    return this.otherFieldWithOverride;\n  }\n}\n@lombok.experimental.Accessors class AccessorsNoParams2 {\n  private @lombok.Setter boolean foo;\n  AccessorsNoParams2() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setFoo(final boolean foo) {\n    this.foo = foo;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderAccessWithGetter.java",
    "content": "import lombok.AccessLevel;\nimport lombok.Builder;\nimport lombok.Getter;\npublic final @Builder(access = AccessLevel.PRIVATE) class BuilderAccessWithGetter {\n  private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderAccessWithGetterBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String string;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderAccessWithGetterBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderAccessWithGetter.BuilderAccessWithGetterBuilder string(final String string) {\n      this.string = string;\n      return this;\n    }\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderAccessWithGetter build() {\n      return new BuilderAccessWithGetter(this.string);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"BuilderAccessWithGetter.BuilderAccessWithGetterBuilder(string=\" + this.string) + \")\");\n    }\n  }\n  private final @Getter String string;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderAccessWithGetter(final String string) {\n    super();\n    this.string = string;\n  }\n  private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderAccessWithGetter.BuilderAccessWithGetterBuilder builder() {\n    return new BuilderAccessWithGetter.BuilderAccessWithGetterBuilder();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getString() {\n    return this.string;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderComplex.java",
    "content": "import java.util.List;\nimport lombok.Builder;\nclass BuilderComplex {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class TestVoidName<T extends Number> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated T number;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int arg2;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String arg3;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderComplex selfRef;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated TestVoidName() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderComplex.TestVoidName<T> number(final T number) {\n      this.number = number;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderComplex.TestVoidName<T> arg2(final int arg2) {\n      this.arg2 = arg2;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderComplex.TestVoidName<T> arg3(final String arg3) {\n      this.arg3 = arg3;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderComplex.TestVoidName<T> selfRef(final BuilderComplex selfRef) {\n      this.selfRef = selfRef;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void execute() {\n      BuilderComplex.<T>testVoidWithGenerics(this.number, this.arg2, this.arg3, this.selfRef);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((((\"BuilderComplex.TestVoidName(number=\" + this.number) + \", arg2=\") + this.arg2) + \", arg3=\") + this.arg3) + \", selfRef=\") + this.selfRef) + \")\");\n    }\n  }\n  BuilderComplex() {\n    super();\n  }\n  private static @Builder(buildMethodName = \"execute\") <T extends Number>void testVoidWithGenerics(T number, int arg2, String arg3, BuilderComplex selfRef) {\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <T extends Number>BuilderComplex.TestVoidName<T> builder() {\n    return new BuilderComplex.TestVoidName<T>();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderConstructorJavadoc.java",
    "content": "import java.util.List;\nclass BuilderConstructorJavadoc<T> {\n  public static class BuilderConstructorJavadocBuilder<T> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int basic;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int multiline;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int predef;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int predefWithJavadoc;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int last;\n    public BuilderConstructorJavadocBuilder<T> predef(final int x) {\n      this.predef = x;\n      return this;\n    }\n    public BuilderConstructorJavadocBuilder<T> predefWithJavadoc(final int x) {\n      this.predefWithJavadoc = x;\n      return this;\n    }\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderConstructorJavadocBuilder() {\n      super();\n    }\n    /**\n     * @param basic tag is moved to the setter\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderConstructorJavadoc.BuilderConstructorJavadocBuilder<T> basic(final int basic) {\n      this.basic = basic;\n      return this;\n    }\n    /**\n     * @param multiline a param comment\n     *        can be on multiple lines and can use \n     *        {@code @code} or <code>tags</code>\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderConstructorJavadoc.BuilderConstructorJavadocBuilder<T> multiline(final int multiline) {\n      this.multiline = multiline;\n      return this;\n    }\n    /**\n     * @param last also copy last param\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderConstructorJavadoc.BuilderConstructorJavadocBuilder<T> last(final int last) {\n      this.last = last;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderConstructorJavadoc<T> build() {\n      return new BuilderConstructorJavadoc<T>(this.basic, this.multiline, this.predef, this.predefWithJavadoc, this.last);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((((((\"BuilderConstructorJavadoc.BuilderConstructorJavadocBuilder(basic=\" + this.basic) + \", multiline=\") + this.multiline) + \", predef=\") + this.predef) + \", predefWithJavadoc=\") + this.predefWithJavadoc) + \", last=\") + this.last) + \")\");\n    }\n  }\n  @lombok.Builder BuilderConstructorJavadoc(int basic, int multiline, int predef, int predefWithJavadoc, int last) {\n    super();\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <T>BuilderConstructorJavadoc.BuilderConstructorJavadocBuilder<T> builder() {\n    return new BuilderConstructorJavadoc.BuilderConstructorJavadocBuilder<T>();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderDefaults.java",
    "content": "import lombok.Builder;\nimport lombok.Value;\npublic final @Value @Builder class BuilderDefaults {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderDefaultsBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int x$value;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean x$set;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String name;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated long z$value;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean z$set;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaultsBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaults.BuilderDefaultsBuilder x(final int x) {\n      this.x$value = x;\n      x$set = true;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaults.BuilderDefaultsBuilder name(final String name) {\n      this.name = name;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaults.BuilderDefaultsBuilder z(final long z) {\n      this.z$value = z;\n      z$set = true;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaults build() {\n      int x$value = this.x$value;\n      if ((! this.x$set))\n          x$value = BuilderDefaults.$default$x();\n      long z$value = this.z$value;\n      if ((! this.z$set))\n          z$value = BuilderDefaults.$default$z();\n      return new BuilderDefaults(x$value, this.name, z$value);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((\"BuilderDefaults.BuilderDefaultsBuilder(x$value=\" + this.x$value) + \", name=\") + this.name) + \", z$value=\") + this.z$value) + \")\");\n    }\n  }\n  private final @Builder.Default int x;\n  private final String name;\n  private final @Builder.Default long z;\n  private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated int $default$x() {\n    return 10;\n  }\n  private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated long $default$z() {\n    return System.currentTimeMillis();\n  }\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaults(final int x, final String name, final long z) {\n    super();\n    this.x = x;\n    this.name = name;\n    this.z = z;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaults.BuilderDefaultsBuilder builder() {\n    return new BuilderDefaults.BuilderDefaultsBuilder();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getX() {\n    return this.x;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getName() {\n    return this.name;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated long getZ() {\n    return this.z;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof BuilderDefaults)))\n        return false;\n    final BuilderDefaults other = (BuilderDefaults) o;\n    if ((this.getX() != other.getX()))\n        return false;\n    if ((this.getZ() != other.getZ()))\n        return false;\n    final java.lang.Object this$name = this.getName();\n    final java.lang.Object other$name = other.getName();\n    if (((this$name == null) ? (other$name != null) : (! this$name.equals(other$name))))\n        return false;\n    return true;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.getX());\n    final long $z = this.getZ();\n    result = ((result * PRIME) + (int) ($z ^ ($z >>> 32)));\n    final java.lang.Object $name = this.getName();\n    result = ((result * PRIME) + (($name == null) ? 43 : $name.hashCode()));\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((((((\"BuilderDefaults(x=\" + this.getX()) + \", name=\") + this.getName()) + \", z=\") + this.getZ()) + \")\");\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderDefaultsArray.java",
    "content": "import lombok.Builder;\nimport lombok.Value;\npublic @Builder class BuilderDefaultsArray {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderDefaultsArrayBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int[] x$value;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean x$set;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String[][] y$value;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean y$set;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaultsArrayBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaultsArray.BuilderDefaultsArrayBuilder x(final int[] x) {\n      this.x$value = x;\n      x$set = true;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaultsArray.BuilderDefaultsArrayBuilder y(final java.lang.String[][] y) {\n      this.y$value = y;\n      y$set = true;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaultsArray build() {\n      int[] x$value = this.x$value;\n      if ((! this.x$set))\n          x$value = BuilderDefaultsArray.$default$x();\n      java.lang.String[][] y$value = this.y$value;\n      if ((! this.y$set))\n          y$value = BuilderDefaultsArray.$default$y();\n      return new BuilderDefaultsArray(x$value, y$value);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((\"BuilderDefaultsArray.BuilderDefaultsArrayBuilder(x$value=\" + java.util.Arrays.toString(this.x$value)) + \", y$value=\") + java.util.Arrays.deepToString(this.y$value)) + \")\");\n    }\n  }\n  @Builder.Default int[] x;\n  @Builder.Default java.lang.String[][] y;\n  private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated int[] $default$x() {\n    return new int[]{1, 2};\n  }\n  private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String[][] $default$y() {\n    return new java.lang.String[][]{};\n  }\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaultsArray(final int[] x, final java.lang.String[][] y) {\n    super();\n    this.x = x;\n    this.y = y;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaultsArray.BuilderDefaultsArrayBuilder builder() {\n    return new BuilderDefaultsArray.BuilderDefaultsArrayBuilder();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderDefaultsGenerics.java",
    "content": "import lombok.Builder;\nimport java.util.*;\npublic @Builder class BuilderDefaultsGenerics<N extends Number, T, R extends List<T>> {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderDefaultsGenericsBuilder<N extends Number, T, R extends List<T>> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.concurrent.Callable<N> callable$value;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean callable$set;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated T tee$value;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean tee$set;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated R arrr$value;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean arrr$set;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaultsGenericsBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaultsGenerics.BuilderDefaultsGenericsBuilder<N, T, R> callable(final java.util.concurrent.Callable<N> callable) {\n      this.callable$value = callable;\n      callable$set = true;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaultsGenerics.BuilderDefaultsGenericsBuilder<N, T, R> tee(final T tee) {\n      this.tee$value = tee;\n      tee$set = true;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaultsGenerics.BuilderDefaultsGenericsBuilder<N, T, R> arrr(final R arrr) {\n      this.arrr$value = arrr;\n      arrr$set = true;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaultsGenerics<N, T, R> build() {\n      java.util.concurrent.Callable<N> callable$value = this.callable$value;\n      if ((! this.callable$set))\n          callable$value = BuilderDefaultsGenerics.<N, T, R>$default$callable();\n      T tee$value = this.tee$value;\n      if ((! this.tee$set))\n          tee$value = BuilderDefaultsGenerics.<N, T, R>$default$tee();\n      R arrr$value = this.arrr$value;\n      if ((! this.arrr$set))\n          arrr$value = BuilderDefaultsGenerics.<N, T, R>$default$arrr();\n      return new BuilderDefaultsGenerics<N, T, R>(callable$value, tee$value, arrr$value);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((\"BuilderDefaultsGenerics.BuilderDefaultsGenericsBuilder(callable$value=\" + this.callable$value) + \", tee$value=\") + this.tee$value) + \", arrr$value=\") + this.arrr$value) + \")\");\n    }\n  }\n  private @Builder.Default java.util.concurrent.Callable<N> callable;\n  private @Builder.Default T tee;\n  private @Builder.Default R arrr;\n  private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <N extends Number, T, R extends List<T>>java.util.concurrent.Callable<N> $default$callable() {\n    return null;\n  }\n  private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <N extends Number, T, R extends List<T>>T $default$tee() {\n    return null;\n  }\n  private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <N extends Number, T, R extends List<T>>R $default$arrr() {\n    return null;\n  }\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaultsGenerics(final java.util.concurrent.Callable<N> callable, final T tee, final R arrr) {\n    super();\n    this.callable = callable;\n    this.tee = tee;\n    this.arrr = arrr;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <N extends Number, T, R extends List<T>>BuilderDefaultsGenerics.BuilderDefaultsGenericsBuilder<N, T, R> builder() {\n    return new BuilderDefaultsGenerics.BuilderDefaultsGenericsBuilder<N, T, R>();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderDefaultsTargetTyping.java",
    "content": "import java.util.Arrays;\nimport lombok.Builder;\npublic @Builder class BuilderDefaultsTargetTyping {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderDefaultsTargetTypingBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String foo$value;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean foo$set;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaultsTargetTypingBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaultsTargetTyping.BuilderDefaultsTargetTypingBuilder foo(final String foo) {\n      this.foo$value = foo;\n      foo$set = true;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaultsTargetTyping build() {\n      String foo$value = this.foo$value;\n      if ((! this.foo$set))\n          foo$value = BuilderDefaultsTargetTyping.$default$foo();\n      return new BuilderDefaultsTargetTyping(foo$value);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"BuilderDefaultsTargetTyping.BuilderDefaultsTargetTypingBuilder(foo$value=\" + this.foo$value) + \")\");\n    }\n  }\n  @Builder.Default String foo;\n  static String doSth(java.util.List<Integer> i, java.util.List<Character> c) {\n    return null;\n  }\n  private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated String $default$foo() {\n    return doSth(Arrays.asList(1), Arrays.asList('a'));\n  }\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaultsTargetTyping(final String foo) {\n    super();\n    this.foo = foo;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaultsTargetTyping.BuilderDefaultsTargetTypingBuilder builder() {\n    return new BuilderDefaultsTargetTyping.BuilderDefaultsTargetTypingBuilder();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderDefaultsWarnings.java",
    "content": "import lombok.Builder;\nimport lombok.Singular;\npublic @Builder class BuilderDefaultsWarnings {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderDefaultsWarningsBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated long x;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int z;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> items;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaultsWarningsBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaultsWarnings.BuilderDefaultsWarningsBuilder x(final long x) {\n      this.x = x;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaultsWarnings.BuilderDefaultsWarningsBuilder z(final int z) {\n      this.z = z;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaultsWarnings.BuilderDefaultsWarningsBuilder item(final String item) {\n      if ((this.items == null))\n          this.items = new java.util.ArrayList<String>();\n      this.items.add(item);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaultsWarnings.BuilderDefaultsWarningsBuilder items(final java.util.Collection<? extends String> items) {\n      if ((items == null))\n          {\n            throw new java.lang.NullPointerException(\"items cannot be null\");\n          }\n      if ((this.items == null))\n          this.items = new java.util.ArrayList<String>();\n      this.items.addAll(items);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaultsWarnings.BuilderDefaultsWarningsBuilder clearItems() {\n      if ((this.items != null))\n          this.items.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaultsWarnings build() {\n      java.util.List<String> items;\n      switch (((this.items == null) ? 0 : this.items.size())) {\n      case 0 :\n          items = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          items = java.util.Collections.singletonList(this.items.get(0));\n          break;\n      default :\n          items = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.items));\n      }\n      return new BuilderDefaultsWarnings(this.x, this.z, items);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((\"BuilderDefaultsWarnings.BuilderDefaultsWarningsBuilder(x=\" + this.x) + \", z=\") + this.z) + \", items=\") + this.items) + \")\");\n    }\n  }\n  long x = System.currentTimeMillis();\n  final int y = 5;\n  @Builder.Default int z;\n  @Builder.Default @Singular java.util.List<String> items;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaultsWarnings(final long x, final int z, final java.util.List<String> items) {\n    super();\n    this.x = x;\n    this.z = z;\n    this.items = items;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderDefaultsWarnings.BuilderDefaultsWarningsBuilder builder() {\n    return new BuilderDefaultsWarnings.BuilderDefaultsWarningsBuilder();\n  }\n}\nclass NoBuilderButHasDefaults {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class NoBuilderButHasDefaultsBuilder {\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated NoBuilderButHasDefaultsBuilder() {\n      super();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated NoBuilderButHasDefaults build() {\n      return new NoBuilderButHasDefaults();\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return \"NoBuilderButHasDefaults.NoBuilderButHasDefaultsBuilder()\";\n    }\n  }\n  private final @Builder.Default long z = 5;\n  public @Builder NoBuilderButHasDefaults() {\n    super();\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated NoBuilderButHasDefaults.NoBuilderButHasDefaultsBuilder builder() {\n    return new NoBuilderButHasDefaults.NoBuilderButHasDefaultsBuilder();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderGenericMethod.java",
    "content": "import java.util.List;\nimport lombok.Builder;\nimport java.util.*;\nclass BuilderGenericMethod<T> {\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated class MapBuilder<N extends Number> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int a;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated long b;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated MapBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderGenericMethod<T>.MapBuilder<N> a(final int a) {\n      this.a = a;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderGenericMethod<T>.MapBuilder<N> b(final long b) {\n      this.b = b;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Map<N, T> build() {\n      return BuilderGenericMethod.this.<N>foo(this.a, this.b);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((\"BuilderGenericMethod.MapBuilder(a=\" + this.a) + \", b=\") + this.b) + \")\");\n    }\n  }\n  BuilderGenericMethod() {\n    super();\n  }\n  public @Builder <N extends Number>Map<N, T> foo(int a, long b) {\n    return null;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated <N extends Number>BuilderGenericMethod<T>.MapBuilder<N> builder() {\n    return this.new MapBuilder<N>();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderInAnonymousClass.java",
    "content": "import lombok.Builder;\npublic class BuilderInAnonymousClass {\n  Object annonymous = new Object() {\n    @Builder class Inner {\n      private String string;\n      Inner() {\n        super();\n      }\n    }\n    x() {\n      super();\n    }\n  };\n  public BuilderInAnonymousClass() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderInstanceMethod.java",
    "content": "import java.util.List;\nclass BuilderInstanceMethod<T> {\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated class StringBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int show;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int yes;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated List<T> also;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int $andMe;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated StringBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderInstanceMethod<T>.StringBuilder show(final int show) {\n      this.show = show;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderInstanceMethod<T>.StringBuilder yes(final int yes) {\n      this.yes = yes;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderInstanceMethod<T>.StringBuilder also(final List<T> also) {\n      this.also = also;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderInstanceMethod<T>.StringBuilder $andMe(final int $andMe) {\n      this.$andMe = $andMe;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String build() {\n      return BuilderInstanceMethod.this.create(this.show, this.yes, this.also, this.$andMe);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((((\"BuilderInstanceMethod.StringBuilder(show=\" + this.show) + \", yes=\") + this.yes) + \", also=\") + this.also) + \", $andMe=\") + this.$andMe) + \")\");\n    }\n  }\n  BuilderInstanceMethod() {\n    super();\n  }\n  public @lombok.Builder String create(int show, final int yes, List<T> also, int $andMe) {\n    return ((((\"\" + show) + yes) + also) + $andMe);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderInstanceMethod<T>.StringBuilder builder() {\n    return this.new StringBuilder();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderJavadoc.java",
    "content": "import java.util.List;\n@lombok.Builder class BuilderJavadoc<T> {\n  public static class BuilderJavadocBuilder<T> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int basic;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getsetwith;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int predef;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int predefWithJavadoc;\n    public BuilderJavadocBuilder<T> predef(final int x) {\n      this.predef = (x * 10);\n      return this;\n    }\n    public BuilderJavadocBuilder<T> predefWithJavadoc(final int x) {\n      this.predefWithJavadoc = (x * 100);\n      return this;\n    }\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderJavadocBuilder() {\n      super();\n    }\n    /**\n     * basic gets only a builder setter.\n     * @see #getsetwith\n     * @param tag is moved to the setter.\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderJavadoc.BuilderJavadocBuilder<T> basic(final int basic) {\n      this.basic = basic;\n      return this;\n    }\n    /**\n     * getsetwith gets a builder setter, an instance getter and setter, and a wither.\n     * @param tag is moved to the setters and wither.\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderJavadoc.BuilderJavadocBuilder<T> getsetwith(final int getsetwith) {\n      this.getsetwith = getsetwith;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderJavadoc<T> build() {\n      return new BuilderJavadoc<T>(this.basic, this.getsetwith, this.predef, this.predefWithJavadoc);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((((\"BuilderJavadoc.BuilderJavadocBuilder(basic=\" + this.basic) + \", getsetwith=\") + this.getsetwith) + \", predef=\") + this.predef) + \", predefWithJavadoc=\") + this.predefWithJavadoc) + \")\");\n    }\n  }\n  private final int basic;\n  private @lombok.Getter @lombok.Setter @lombok.experimental.Wither int getsetwith;\n  private final int predef;\n  private final int predefWithJavadoc;\n  /**\n   * Creates a new {@code BuilderJavadoc} instance.\n   * \n   * @param basic basic gets only a builder setter.\n   * @see #getsetwith\n   * @param getsetwith getsetwith gets a builder setter, an instance getter and setter, and a wither.\n   * @param predef Predef has a predefined builder setter with no javadoc, and the builder setter does not get this one.\n   * @param predefWithJavadoc predefWithJavadoc has a predefined builder setter with javadoc, so it keeps that one untouched.\n   */\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderJavadoc(final int basic, final int getsetwith, final int predef, final int predefWithJavadoc) {\n    super();\n    this.basic = basic;\n    this.getsetwith = getsetwith;\n    this.predef = predef;\n    this.predefWithJavadoc = predefWithJavadoc;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <T>BuilderJavadoc.BuilderJavadocBuilder<T> builder() {\n    return new BuilderJavadoc.BuilderJavadocBuilder<T>();\n  }\n  /**\n   * getsetwith gets a builder setter, an instance getter and setter, and a wither.\n   * @return tag is moved to the getter.\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getGetsetwith() {\n    return this.getsetwith;\n  }\n  /**\n   * getsetwith gets a builder setter, an instance getter and setter, and a wither.\n   * @param tag is moved to the setters and wither.\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setGetsetwith(final int getsetwith) {\n    this.getsetwith = getsetwith;\n  }\n  /**\n   * getsetwith gets a builder setter, an instance getter and setter, and a wither.\n   * @param tag is moved to the setters and wither.\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderJavadoc<T> withGetsetwith(final int getsetwith) {\n    return ((this.getsetwith == getsetwith) ? this : new BuilderJavadoc<T>(this.basic, getsetwith, this.predef, this.predefWithJavadoc));\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderNestedInEnum.java",
    "content": "class BuilderNestedInEnum {\n  public enum TestEnum {\n    public static final @lombok.Builder @lombok.Value class TestBuilder {\n      public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class TestBuilderBuilder {\n        private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String field;\n        @java.lang.SuppressWarnings(\"all\") @lombok.Generated TestBuilderBuilder() {\n          super();\n        }\n        /**\n         * @return {@code this}.\n         */\n        public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderNestedInEnum.TestEnum.TestBuilder.TestBuilderBuilder field(final String field) {\n          this.field = field;\n          return this;\n        }\n        public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderNestedInEnum.TestEnum.TestBuilder build() {\n          return new BuilderNestedInEnum.TestEnum.TestBuilder(this.field);\n        }\n        public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n          return ((\"BuilderNestedInEnum.TestEnum.TestBuilder.TestBuilderBuilder(field=\" + this.field) + \")\");\n        }\n      }\n      private final String field;\n      @java.lang.SuppressWarnings(\"all\") @lombok.Generated TestBuilder(final String field) {\n        super();\n        this.field = field;\n      }\n      public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderNestedInEnum.TestEnum.TestBuilder.TestBuilderBuilder builder() {\n        return new BuilderNestedInEnum.TestEnum.TestBuilder.TestBuilderBuilder();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getField() {\n        return this.field;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n        if ((o == this))\n            return true;\n        if ((! (o instanceof BuilderNestedInEnum.TestEnum.TestBuilder)))\n            return false;\n        final BuilderNestedInEnum.TestEnum.TestBuilder other = (BuilderNestedInEnum.TestEnum.TestBuilder) o;\n        final java.lang.Object this$field = this.getField();\n        final java.lang.Object other$field = other.getField();\n        if (((this$field == null) ? (other$field != null) : (! this$field.equals(other$field))))\n            return false;\n        return true;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n        final int PRIME = 59;\n        int result = 1;\n        final java.lang.Object $field = this.getField();\n        result = ((result * PRIME) + (($field == null) ? 43 : $field.hashCode()));\n        return result;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((\"BuilderNestedInEnum.TestEnum.TestBuilder(field=\" + this.getField()) + \")\");\n      }\n    }\n    FOO(),\n    BAR(),\n    <clinit>() {\n    }\n    public TestEnum() {\n      super();\n    }\n  }\n  BuilderNestedInEnum() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderNestedJavadoc.java",
    "content": "public @lombok.Builder class BuilderNestedJavadoc {\n  public static @lombok.Builder class NestedClass {\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class NestedClassBuilder {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String name;\n      @java.lang.SuppressWarnings(\"all\") @lombok.Generated NestedClassBuilder() {\n        super();\n      }\n      /**\n       * Example javadoc\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderNestedJavadoc.NestedClass.NestedClassBuilder name(final String name) {\n        this.name = name;\n        return this;\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderNestedJavadoc.NestedClass build() {\n        return new BuilderNestedJavadoc.NestedClass(this.name);\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((\"BuilderNestedJavadoc.NestedClass.NestedClassBuilder(name=\" + this.name) + \")\");\n      }\n    }\n    String name;\n    /**\n     * Creates a new {@code NestedClass} instance.\n     *\n     * @param name Example javadoc\n     */\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated NestedClass(final String name) {\n      super();\n      this.name = name;\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderNestedJavadoc.NestedClass.NestedClassBuilder builder() {\n      return new BuilderNestedJavadoc.NestedClass.NestedClassBuilder();\n    }\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderNestedJavadocBuilder {\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderNestedJavadocBuilder() {\n      super();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderNestedJavadoc build() {\n      return new BuilderNestedJavadoc();\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return \"BuilderNestedJavadoc.BuilderNestedJavadocBuilder()\";\n    }\n  }\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderNestedJavadoc() {\n    super();\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderNestedJavadoc.BuilderNestedJavadocBuilder builder() {\n    return new BuilderNestedJavadoc.BuilderNestedJavadocBuilder();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderOnNestedClass.java",
    "content": "public class BuilderOnNestedClass<T> {\n  public static @lombok.Builder class Nested {\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class NestedBuilder {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String a;\n      @java.lang.SuppressWarnings(\"all\") @lombok.Generated NestedBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderOnNestedClass.Nested.NestedBuilder a(final String a) {\n        this.a = a;\n        return this;\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderOnNestedClass.Nested build() {\n        return new BuilderOnNestedClass.Nested(this.a);\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((\"BuilderOnNestedClass.Nested.NestedBuilder(a=\" + this.a) + \")\");\n      }\n    }\n    private String a;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated Nested(final String a) {\n      super();\n      this.a = a;\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderOnNestedClass.Nested.NestedBuilder builder() {\n      return new BuilderOnNestedClass.Nested.NestedBuilder();\n    }\n  }\n  private T t;\n  public BuilderOnNestedClass() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderOnNestedRecord.java",
    "content": "public record BuilderOnNestedRecord(T t)<T> {\n  public @lombok.Builder record Nested(String a) {\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class NestedBuilder {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String a;\n      @java.lang.SuppressWarnings(\"all\") @lombok.Generated NestedBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderOnNestedRecord.Nested.NestedBuilder a(final String a) {\n        this.a = a;\n        return this;\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderOnNestedRecord.Nested build() {\n        return new BuilderOnNestedRecord.Nested(this.a);\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((\"BuilderOnNestedRecord.Nested.NestedBuilder(a=\" + this.a) + \")\");\n      }\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderOnNestedRecord.Nested.NestedBuilder builder() {\n      return new BuilderOnNestedRecord.Nested.NestedBuilder();\n    }\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderSimple.java",
    "content": "import java.util.List;\n@lombok.Builder(access = lombok.AccessLevel.PROTECTED) class BuilderSimple<T> {\n  protected static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderSimpleBuilder<T> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int yes;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated List<T> also;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSimpleBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSimple.BuilderSimpleBuilder<T> yes(final int yes) {\n      this.yes = yes;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSimple.BuilderSimpleBuilder<T> also(final List<T> also) {\n      this.also = also;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSimple<T> build() {\n      return new BuilderSimple<T>(this.yes, this.also);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((\"BuilderSimple.BuilderSimpleBuilder(yes=\" + this.yes) + \", also=\") + this.also) + \")\");\n    }\n  }\n  private final int noshow = 0;\n  private final int yes;\n  private List<T> also;\n  private int $butNotMe;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSimple(final int yes, final List<T> also) {\n    super();\n    this.yes = yes;\n    this.also = also;\n  }\n  protected static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <T>BuilderSimple.BuilderSimpleBuilder<T> builder() {\n    return new BuilderSimple.BuilderSimpleBuilder<T>();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderSimpleOnRecord.java",
    "content": "// version 14:\nimport java.util.List;\npublic @lombok.Builder(access = lombok.AccessLevel.PROTECTED) record BuilderSimpleOnRecord(List l, String a)<T> {\n  protected static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderSimpleOnRecordBuilder<T> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated List<T> l;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String a;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSimpleOnRecordBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSimpleOnRecord.BuilderSimpleOnRecordBuilder<T> l(final List<T> l) {\n      this.l = l;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSimpleOnRecord.BuilderSimpleOnRecordBuilder<T> a(final String a) {\n      this.a = a;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSimpleOnRecord<T> build() {\n      return new BuilderSimpleOnRecord<T>(this.l, this.a);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((\"BuilderSimpleOnRecord.BuilderSimpleOnRecordBuilder(l=\" + this.l) + \", a=\") + this.a) + \")\");\n    }\n  }\n  protected static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <T>BuilderSimpleOnRecord.BuilderSimpleOnRecordBuilder<T> builder() {\n    return new BuilderSimpleOnRecord.BuilderSimpleOnRecordBuilder<T>();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderSimpleWithSetterPrefix.java",
    "content": "import java.util.List;\n@lombok.Builder(access = lombok.AccessLevel.PROTECTED,setterPrefix = \"with\") class BuilderSimpleWithSetterPrefix<T> {\n  protected static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderSimpleWithSetterPrefixBuilder<T> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int unprefixed;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSimpleWithSetterPrefixBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSimpleWithSetterPrefix.BuilderSimpleWithSetterPrefixBuilder<T> withUnprefixed(final int unprefixed) {\n      this.unprefixed = unprefixed;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSimpleWithSetterPrefix<T> build() {\n      return new BuilderSimpleWithSetterPrefix<T>(this.unprefixed);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"BuilderSimpleWithSetterPrefix.BuilderSimpleWithSetterPrefixBuilder(unprefixed=\" + this.unprefixed) + \")\");\n    }\n  }\n  private int unprefixed;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSimpleWithSetterPrefix(final int unprefixed) {\n    super();\n    this.unprefixed = unprefixed;\n  }\n  protected static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <T>BuilderSimpleWithSetterPrefix.BuilderSimpleWithSetterPrefixBuilder<T> builder() {\n    return new BuilderSimpleWithSetterPrefix.BuilderSimpleWithSetterPrefixBuilder<T>();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderSingularAnnotatedTypes.java",
    "content": "import java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.Set;\nimport java.util.Map;\nimport lombok.NonNull;\nimport lombok.Singular;\n@Target(ElementType.TYPE_USE) @interface MyAnnotation {\n}\n@lombok.Builder class BuilderSingularAnnotatedTypes {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderSingularAnnotatedTypesBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<@MyAnnotation @NonNull String> foos;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<@MyAnnotation @NonNull String> bars$key;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<@MyAnnotation @NonNull Integer> bars$value;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularAnnotatedTypesBuilder() {\n      super();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularAnnotatedTypes.BuilderSingularAnnotatedTypesBuilder foo(final @MyAnnotation @NonNull String foo) {\n      if ((foo == null))\n          {\n            throw new java.lang.NullPointerException(\"foo is marked non-null but is null\");\n          }\n      if ((this.foos == null))\n          this.foos = new java.util.ArrayList<@MyAnnotation @NonNull String>();\n      this.foos.add(foo);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularAnnotatedTypes.BuilderSingularAnnotatedTypesBuilder foos(final java.util.Collection<? extends @MyAnnotation @NonNull String> foos) {\n      if ((foos == null))\n          {\n            throw new java.lang.NullPointerException(\"foos cannot be null\");\n          }\n      if ((this.foos == null))\n          this.foos = new java.util.ArrayList<@MyAnnotation @NonNull String>();\n      this.foos.addAll(foos);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularAnnotatedTypes.BuilderSingularAnnotatedTypesBuilder clearFoos() {\n      if ((this.foos != null))\n          this.foos.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularAnnotatedTypes.BuilderSingularAnnotatedTypesBuilder bar(final @MyAnnotation @NonNull String barKey, final @MyAnnotation @NonNull Integer barValue) {\n      if ((barKey == null))\n          {\n            throw new java.lang.NullPointerException(\"barKey is marked non-null but is null\");\n          }\n      if ((barValue == null))\n          {\n            throw new java.lang.NullPointerException(\"barValue is marked non-null but is null\");\n          }\n      if ((this.bars$key == null))\n          {\n            this.bars$key = new java.util.ArrayList<@MyAnnotation @NonNull String>();\n            this.bars$value = new java.util.ArrayList<@MyAnnotation @NonNull Integer>();\n          }\n      this.bars$key.add(barKey);\n      this.bars$value.add(barValue);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularAnnotatedTypes.BuilderSingularAnnotatedTypesBuilder bars(final java.util.Map<? extends @MyAnnotation @NonNull String, ? extends @MyAnnotation @NonNull Integer> bars) {\n      if ((bars == null))\n          {\n            throw new java.lang.NullPointerException(\"bars cannot be null\");\n          }\n      if ((this.bars$key == null))\n          {\n            this.bars$key = new java.util.ArrayList<@MyAnnotation @NonNull String>();\n            this.bars$value = new java.util.ArrayList<@MyAnnotation @NonNull Integer>();\n          }\n      for (java.util.Map.Entry<? extends @MyAnnotation @NonNull String, ? extends @MyAnnotation @NonNull Integer> $lombokEntry : bars.entrySet()) \n        {\n          this.bars$key.add($lombokEntry.getKey());\n          this.bars$value.add($lombokEntry.getValue());\n        }\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularAnnotatedTypes.BuilderSingularAnnotatedTypesBuilder clearBars() {\n      if ((this.bars$key != null))\n          {\n            this.bars$key.clear();\n            this.bars$value.clear();\n          }\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularAnnotatedTypes build() {\n      java.util.Set<@MyAnnotation @NonNull String> foos;\n      switch (((this.foos == null) ? 0 : this.foos.size())) {\n      case 0 :\n          foos = java.util.Collections.emptySet();\n          break;\n      case 1 :\n          foos = java.util.Collections.singleton(this.foos.get(0));\n          break;\n      default :\n          foos = new java.util.LinkedHashSet<@MyAnnotation @NonNull String>(((this.foos.size() < 0x40000000) ? ((1 + this.foos.size()) + ((this.foos.size() - 3) / 3)) : java.lang.Integer.MAX_VALUE));\n          foos.addAll(this.foos);\n          foos = java.util.Collections.unmodifiableSet(foos);\n      }\n      java.util.Map<@MyAnnotation @NonNull String, @MyAnnotation @NonNull Integer> bars;\n      switch (((this.bars$key == null) ? 0 : this.bars$key.size())) {\n      case 0 :\n          bars = java.util.Collections.emptyMap();\n          break;\n      case 1 :\n          bars = java.util.Collections.singletonMap(this.bars$key.get(0), this.bars$value.get(0));\n          break;\n      default :\n          bars = new java.util.LinkedHashMap<@MyAnnotation @NonNull String, @MyAnnotation @NonNull Integer>(((this.bars$key.size() < 0x40000000) ? ((1 + this.bars$key.size()) + ((this.bars$key.size() - 3) / 3)) : java.lang.Integer.MAX_VALUE));\n          for (int $i = 0;; ($i < this.bars$key.size()); $i ++) \n            bars.put(this.bars$key.get($i), this.bars$value.get($i));\n          bars = java.util.Collections.unmodifiableMap(bars);\n      }\n      return new BuilderSingularAnnotatedTypes(foos, bars);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((\"BuilderSingularAnnotatedTypes.BuilderSingularAnnotatedTypesBuilder(foos=\" + this.foos) + \", bars$key=\") + this.bars$key) + \", bars$value=\") + this.bars$value) + \")\");\n    }\n  }\n  private @Singular Set<@MyAnnotation @NonNull String> foos;\n  private @Singular Map<@MyAnnotation @NonNull String, @MyAnnotation @NonNull Integer> bars;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularAnnotatedTypes(final Set<@MyAnnotation @NonNull String> foos, final Map<@MyAnnotation @NonNull String, @MyAnnotation @NonNull Integer> bars) {\n    super();\n    this.foos = foos;\n    this.bars = bars;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularAnnotatedTypes.BuilderSingularAnnotatedTypesBuilder builder() {\n    return new BuilderSingularAnnotatedTypes.BuilderSingularAnnotatedTypesBuilder();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderSingularAnnotatedTypesWithSetterPrefix.java",
    "content": "import java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.Set;\nimport java.util.Map;\nimport lombok.NonNull;\nimport lombok.Singular;\n@Target(ElementType.TYPE_USE) @interface MyAnnotation {\n}\n@lombok.Builder(setterPrefix = \"with\") class BuilderSingularAnnotatedTypesWithSetterPrefix {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderSingularAnnotatedTypesWithSetterPrefixBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<@MyAnnotation @NonNull String> foos;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<@MyAnnotation @NonNull String> bars$key;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<@MyAnnotation @NonNull Integer> bars$value;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularAnnotatedTypesWithSetterPrefixBuilder() {\n      super();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularAnnotatedTypesWithSetterPrefix.BuilderSingularAnnotatedTypesWithSetterPrefixBuilder withFoo(final @MyAnnotation @NonNull String foo) {\n      if ((foo == null))\n          {\n            throw new java.lang.NullPointerException(\"foo is marked non-null but is null\");\n          }\n      if ((this.foos == null))\n          this.foos = new java.util.ArrayList<@MyAnnotation @NonNull String>();\n      this.foos.add(foo);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularAnnotatedTypesWithSetterPrefix.BuilderSingularAnnotatedTypesWithSetterPrefixBuilder withFoos(final java.util.Collection<? extends @MyAnnotation @NonNull String> foos) {\n      if ((foos == null))\n          {\n            throw new java.lang.NullPointerException(\"foos cannot be null\");\n          }\n      if ((this.foos == null))\n          this.foos = new java.util.ArrayList<@MyAnnotation @NonNull String>();\n      this.foos.addAll(foos);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularAnnotatedTypesWithSetterPrefix.BuilderSingularAnnotatedTypesWithSetterPrefixBuilder clearFoos() {\n      if ((this.foos != null))\n          this.foos.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularAnnotatedTypesWithSetterPrefix.BuilderSingularAnnotatedTypesWithSetterPrefixBuilder withBar(final @MyAnnotation @NonNull String barKey, final @MyAnnotation @NonNull Integer barValue) {\n      if ((barKey == null))\n          {\n            throw new java.lang.NullPointerException(\"barKey is marked non-null but is null\");\n          }\n      if ((barValue == null))\n          {\n            throw new java.lang.NullPointerException(\"barValue is marked non-null but is null\");\n          }\n      if ((this.bars$key == null))\n          {\n            this.bars$key = new java.util.ArrayList<@MyAnnotation @NonNull String>();\n            this.bars$value = new java.util.ArrayList<@MyAnnotation @NonNull Integer>();\n          }\n      this.bars$key.add(barKey);\n      this.bars$value.add(barValue);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularAnnotatedTypesWithSetterPrefix.BuilderSingularAnnotatedTypesWithSetterPrefixBuilder withBars(final java.util.Map<? extends @MyAnnotation @NonNull String, ? extends @MyAnnotation @NonNull Integer> bars) {\n      if ((bars == null))\n          {\n            throw new java.lang.NullPointerException(\"bars cannot be null\");\n          }\n      if ((this.bars$key == null))\n          {\n            this.bars$key = new java.util.ArrayList<@MyAnnotation @NonNull String>();\n            this.bars$value = new java.util.ArrayList<@MyAnnotation @NonNull Integer>();\n          }\n      for (java.util.Map.Entry<? extends @MyAnnotation @NonNull String, ? extends @MyAnnotation @NonNull Integer> $lombokEntry : bars.entrySet()) \n        {\n          this.bars$key.add($lombokEntry.getKey());\n          this.bars$value.add($lombokEntry.getValue());\n        }\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularAnnotatedTypesWithSetterPrefix.BuilderSingularAnnotatedTypesWithSetterPrefixBuilder clearBars() {\n      if ((this.bars$key != null))\n          {\n            this.bars$key.clear();\n            this.bars$value.clear();\n          }\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularAnnotatedTypesWithSetterPrefix build() {\n      java.util.Set<@MyAnnotation @NonNull String> foos;\n      switch (((this.foos == null) ? 0 : this.foos.size())) {\n      case 0 :\n          foos = java.util.Collections.emptySet();\n          break;\n      case 1 :\n          foos = java.util.Collections.singleton(this.foos.get(0));\n          break;\n      default :\n          foos = new java.util.LinkedHashSet<@MyAnnotation @NonNull String>(((this.foos.size() < 0x40000000) ? ((1 + this.foos.size()) + ((this.foos.size() - 3) / 3)) : java.lang.Integer.MAX_VALUE));\n          foos.addAll(this.foos);\n          foos = java.util.Collections.unmodifiableSet(foos);\n      }\n      java.util.Map<@MyAnnotation @NonNull String, @MyAnnotation @NonNull Integer> bars;\n      switch (((this.bars$key == null) ? 0 : this.bars$key.size())) {\n      case 0 :\n          bars = java.util.Collections.emptyMap();\n          break;\n      case 1 :\n          bars = java.util.Collections.singletonMap(this.bars$key.get(0), this.bars$value.get(0));\n          break;\n      default :\n          bars = new java.util.LinkedHashMap<@MyAnnotation @NonNull String, @MyAnnotation @NonNull Integer>(((this.bars$key.size() < 0x40000000) ? ((1 + this.bars$key.size()) + ((this.bars$key.size() - 3) / 3)) : java.lang.Integer.MAX_VALUE));\n          for (int $i = 0;; ($i < this.bars$key.size()); $i ++) \n            bars.put(this.bars$key.get($i), this.bars$value.get($i));\n          bars = java.util.Collections.unmodifiableMap(bars);\n      }\n      return new BuilderSingularAnnotatedTypesWithSetterPrefix(foos, bars);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((\"BuilderSingularAnnotatedTypesWithSetterPrefix.BuilderSingularAnnotatedTypesWithSetterPrefixBuilder(foos=\" + this.foos) + \", bars$key=\") + this.bars$key) + \", bars$value=\") + this.bars$value) + \")\");\n    }\n  }\n  private @Singular Set<@MyAnnotation @NonNull String> foos;\n  private @Singular Map<@MyAnnotation @NonNull String, @MyAnnotation @NonNull Integer> bars;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularAnnotatedTypesWithSetterPrefix(final Set<@MyAnnotation @NonNull String> foos, final Map<@MyAnnotation @NonNull String, @MyAnnotation @NonNull Integer> bars) {\n    super();\n    this.foos = foos;\n    this.bars = bars;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularAnnotatedTypesWithSetterPrefix.BuilderSingularAnnotatedTypesWithSetterPrefixBuilder builder() {\n    return new BuilderSingularAnnotatedTypesWithSetterPrefix.BuilderSingularAnnotatedTypesWithSetterPrefixBuilder();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderSingularGuavaListsSets.java",
    "content": "import com.google.common.collect.ImmutableList;\nimport com.google.common.collect.ImmutableCollection;\nimport com.google.common.collect.ImmutableSet;\nimport com.google.common.collect.ImmutableSortedSet;\nimport com.google.common.collect.ImmutableTable;\nimport lombok.Singular;\n@lombok.Builder class BuilderSingularGuavaListsSets<T> {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderSingularGuavaListsSetsBuilder<T> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.collect.ImmutableList.Builder<T> cards;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.collect.ImmutableList.Builder<Number> frogs;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.collect.ImmutableSet.Builder<java.lang.Object> rawSet;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.collect.ImmutableSortedSet.Builder<String> passes;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.collect.ImmutableTable.Builder<Number, Number, String> users;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaListsSetsBuilder() {\n      super();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> card(final T card) {\n      if ((this.cards == null))\n          this.cards = com.google.common.collect.ImmutableList.builder();\n      this.cards.add(card);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> cards(final java.lang.Iterable<? extends T> cards) {\n      if ((cards == null))\n          {\n            throw new java.lang.NullPointerException(\"cards cannot be null\");\n          }\n      if ((this.cards == null))\n          this.cards = com.google.common.collect.ImmutableList.builder();\n      this.cards.addAll(cards);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> clearCards() {\n      this.cards = null;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> frog(final Number frog) {\n      if ((this.frogs == null))\n          this.frogs = com.google.common.collect.ImmutableList.builder();\n      this.frogs.add(frog);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> frogs(final java.lang.Iterable<? extends Number> frogs) {\n      if ((frogs == null))\n          {\n            throw new java.lang.NullPointerException(\"frogs cannot be null\");\n          }\n      if ((this.frogs == null))\n          this.frogs = com.google.common.collect.ImmutableList.builder();\n      this.frogs.addAll(frogs);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> clearFrogs() {\n      this.frogs = null;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> rawSet(final java.lang.Object rawSet) {\n      if ((this.rawSet == null))\n          this.rawSet = com.google.common.collect.ImmutableSet.builder();\n      this.rawSet.add(rawSet);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> rawSet(final java.lang.Iterable<?> rawSet) {\n      if ((rawSet == null))\n          {\n            throw new java.lang.NullPointerException(\"rawSet cannot be null\");\n          }\n      if ((this.rawSet == null))\n          this.rawSet = com.google.common.collect.ImmutableSet.builder();\n      this.rawSet.addAll(rawSet);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> clearRawSet() {\n      this.rawSet = null;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> pass(final String pass) {\n      if ((this.passes == null))\n          this.passes = com.google.common.collect.ImmutableSortedSet.naturalOrder();\n      this.passes.add(pass);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> passes(final java.lang.Iterable<? extends String> passes) {\n      if ((passes == null))\n          {\n            throw new java.lang.NullPointerException(\"passes cannot be null\");\n          }\n      if ((this.passes == null))\n          this.passes = com.google.common.collect.ImmutableSortedSet.naturalOrder();\n      this.passes.addAll(passes);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> clearPasses() {\n      this.passes = null;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> user(final Number rowKey, final Number columnKey, final String value) {\n      if ((this.users == null))\n          this.users = com.google.common.collect.ImmutableTable.builder();\n      this.users.put(rowKey, columnKey, value);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> users(final com.google.common.collect.Table<? extends Number, ? extends Number, ? extends String> users) {\n      if ((users == null))\n          {\n            throw new java.lang.NullPointerException(\"users cannot be null\");\n          }\n      if ((this.users == null))\n          this.users = com.google.common.collect.ImmutableTable.builder();\n      this.users.putAll(users);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> clearUsers() {\n      this.users = null;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaListsSets<T> build() {\n      com.google.common.collect.ImmutableList<T> cards = ((this.cards == null) ? com.google.common.collect.ImmutableList.<T>of() : this.cards.build());\n      com.google.common.collect.ImmutableCollection<Number> frogs = ((this.frogs == null) ? com.google.common.collect.ImmutableList.<Number>of() : this.frogs.build());\n      com.google.common.collect.ImmutableSet<java.lang.Object> rawSet = ((this.rawSet == null) ? com.google.common.collect.ImmutableSet.<java.lang.Object>of() : this.rawSet.build());\n      com.google.common.collect.ImmutableSortedSet<String> passes = ((this.passes == null) ? com.google.common.collect.ImmutableSortedSet.<String>of() : this.passes.build());\n      com.google.common.collect.ImmutableTable<Number, Number, String> users = ((this.users == null) ? com.google.common.collect.ImmutableTable.<Number, Number, String>of() : this.users.build());\n      return new BuilderSingularGuavaListsSets<T>(cards, frogs, rawSet, passes, users);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((((((\"BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder(cards=\" + this.cards) + \", frogs=\") + this.frogs) + \", rawSet=\") + this.rawSet) + \", passes=\") + this.passes) + \", users=\") + this.users) + \")\");\n    }\n  }\n  private @Singular ImmutableList<T> cards;\n  private @Singular ImmutableCollection<? extends Number> frogs;\n  private @SuppressWarnings(\"all\") @Singular(\"rawSet\") ImmutableSet rawSet;\n  private @Singular ImmutableSortedSet<String> passes;\n  private @Singular ImmutableTable<? extends Number, ? extends Number, String> users;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaListsSets(final ImmutableList<T> cards, final ImmutableCollection<? extends Number> frogs, final ImmutableSet rawSet, final ImmutableSortedSet<String> passes, final ImmutableTable<? extends Number, ? extends Number, String> users) {\n    super();\n    this.cards = cards;\n    this.frogs = frogs;\n    this.rawSet = rawSet;\n    this.passes = passes;\n    this.users = users;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <T>BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T> builder() {\n    return new BuilderSingularGuavaListsSets.BuilderSingularGuavaListsSetsBuilder<T>();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderSingularGuavaMaps.java",
    "content": "import com.google.common.collect.ImmutableMap;\nimport com.google.common.collect.ImmutableBiMap;\nimport com.google.common.collect.ImmutableSortedMap;\nimport lombok.Singular;\n@lombok.Builder class BuilderSingularGuavaMaps<K, V> {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderSingularGuavaMapsBuilder<K, V> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.collect.ImmutableMap.Builder<K, V> battleaxes;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.collect.ImmutableSortedMap.Builder<Integer, V> vertices;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.collect.ImmutableBiMap.Builder<java.lang.Object, java.lang.Object> rawMap;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaMapsBuilder() {\n      super();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaMaps.BuilderSingularGuavaMapsBuilder<K, V> battleaxe(final K key, final V value) {\n      if ((this.battleaxes == null))\n          this.battleaxes = com.google.common.collect.ImmutableMap.builder();\n      this.battleaxes.put(key, value);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaMaps.BuilderSingularGuavaMapsBuilder<K, V> battleaxes(final java.util.Map<? extends K, ? extends V> battleaxes) {\n      if ((battleaxes == null))\n          {\n            throw new java.lang.NullPointerException(\"battleaxes cannot be null\");\n          }\n      if ((this.battleaxes == null))\n          this.battleaxes = com.google.common.collect.ImmutableMap.builder();\n      this.battleaxes.putAll(battleaxes);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaMaps.BuilderSingularGuavaMapsBuilder<K, V> clearBattleaxes() {\n      this.battleaxes = null;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaMaps.BuilderSingularGuavaMapsBuilder<K, V> vertex(final Integer key, final V value) {\n      if ((this.vertices == null))\n          this.vertices = com.google.common.collect.ImmutableSortedMap.naturalOrder();\n      this.vertices.put(key, value);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaMaps.BuilderSingularGuavaMapsBuilder<K, V> vertices(final java.util.Map<? extends Integer, ? extends V> vertices) {\n      if ((vertices == null))\n          {\n            throw new java.lang.NullPointerException(\"vertices cannot be null\");\n          }\n      if ((this.vertices == null))\n          this.vertices = com.google.common.collect.ImmutableSortedMap.naturalOrder();\n      this.vertices.putAll(vertices);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaMaps.BuilderSingularGuavaMapsBuilder<K, V> clearVertices() {\n      this.vertices = null;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaMaps.BuilderSingularGuavaMapsBuilder<K, V> rawMap(final java.lang.Object key, final java.lang.Object value) {\n      if ((this.rawMap == null))\n          this.rawMap = com.google.common.collect.ImmutableBiMap.builder();\n      this.rawMap.put(key, value);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaMaps.BuilderSingularGuavaMapsBuilder<K, V> rawMap(final java.util.Map<?, ?> rawMap) {\n      if ((rawMap == null))\n          {\n            throw new java.lang.NullPointerException(\"rawMap cannot be null\");\n          }\n      if ((this.rawMap == null))\n          this.rawMap = com.google.common.collect.ImmutableBiMap.builder();\n      this.rawMap.putAll(rawMap);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaMaps.BuilderSingularGuavaMapsBuilder<K, V> clearRawMap() {\n      this.rawMap = null;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaMaps<K, V> build() {\n      com.google.common.collect.ImmutableMap<K, V> battleaxes = ((this.battleaxes == null) ? com.google.common.collect.ImmutableMap.<K, V>of() : this.battleaxes.build());\n      com.google.common.collect.ImmutableSortedMap<Integer, V> vertices = ((this.vertices == null) ? com.google.common.collect.ImmutableSortedMap.<Integer, V>of() : this.vertices.build());\n      com.google.common.collect.ImmutableBiMap<java.lang.Object, java.lang.Object> rawMap = ((this.rawMap == null) ? com.google.common.collect.ImmutableBiMap.<java.lang.Object, java.lang.Object>of() : this.rawMap.build());\n      return new BuilderSingularGuavaMaps<K, V>(battleaxes, vertices, rawMap);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((\"BuilderSingularGuavaMaps.BuilderSingularGuavaMapsBuilder(battleaxes=\" + this.battleaxes) + \", vertices=\") + this.vertices) + \", rawMap=\") + this.rawMap) + \")\");\n    }\n  }\n  private @Singular ImmutableMap<K, V> battleaxes;\n  private @Singular ImmutableSortedMap<Integer, ? extends V> vertices;\n  private @SuppressWarnings(\"all\") @Singular(\"rawMap\") ImmutableBiMap rawMap;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularGuavaMaps(final ImmutableMap<K, V> battleaxes, final ImmutableSortedMap<Integer, ? extends V> vertices, final ImmutableBiMap rawMap) {\n    super();\n    this.battleaxes = battleaxes;\n    this.vertices = vertices;\n    this.rawMap = rawMap;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <K, V>BuilderSingularGuavaMaps.BuilderSingularGuavaMapsBuilder<K, V> builder() {\n    return new BuilderSingularGuavaMaps.BuilderSingularGuavaMapsBuilder<K, V>();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderSingularLists.java",
    "content": "import java.util.List;\nimport java.util.Collection;\nimport lombok.Singular;\n@lombok.Builder class BuilderSingularLists<T> {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderSingularListsBuilder<T> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<T> children;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<Number> scarves;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<java.lang.Object> rawList;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularListsBuilder() {\n      super();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularLists.BuilderSingularListsBuilder<T> child(final T child) {\n      if ((this.children == null))\n          this.children = new java.util.ArrayList<T>();\n      this.children.add(child);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularLists.BuilderSingularListsBuilder<T> children(final java.util.Collection<? extends T> children) {\n      if ((children == null))\n          {\n            throw new java.lang.NullPointerException(\"children cannot be null\");\n          }\n      if ((this.children == null))\n          this.children = new java.util.ArrayList<T>();\n      this.children.addAll(children);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularLists.BuilderSingularListsBuilder<T> clearChildren() {\n      if ((this.children != null))\n          this.children.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularLists.BuilderSingularListsBuilder<T> scarf(final Number scarf) {\n      if ((this.scarves == null))\n          this.scarves = new java.util.ArrayList<Number>();\n      this.scarves.add(scarf);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularLists.BuilderSingularListsBuilder<T> scarves(final java.util.Collection<? extends Number> scarves) {\n      if ((scarves == null))\n          {\n            throw new java.lang.NullPointerException(\"scarves cannot be null\");\n          }\n      if ((this.scarves == null))\n          this.scarves = new java.util.ArrayList<Number>();\n      this.scarves.addAll(scarves);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularLists.BuilderSingularListsBuilder<T> clearScarves() {\n      if ((this.scarves != null))\n          this.scarves.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularLists.BuilderSingularListsBuilder<T> rawList(final java.lang.Object rawList) {\n      if ((this.rawList == null))\n          this.rawList = new java.util.ArrayList<java.lang.Object>();\n      this.rawList.add(rawList);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularLists.BuilderSingularListsBuilder<T> rawList(final java.util.Collection<?> rawList) {\n      if ((rawList == null))\n          {\n            throw new java.lang.NullPointerException(\"rawList cannot be null\");\n          }\n      if ((this.rawList == null))\n          this.rawList = new java.util.ArrayList<java.lang.Object>();\n      this.rawList.addAll(rawList);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularLists.BuilderSingularListsBuilder<T> clearRawList() {\n      if ((this.rawList != null))\n          this.rawList.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularLists<T> build() {\n      java.util.List<T> children;\n      switch (((this.children == null) ? 0 : this.children.size())) {\n      case 0 :\n          children = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          children = java.util.Collections.singletonList(this.children.get(0));\n          break;\n      default :\n          children = java.util.Collections.unmodifiableList(new java.util.ArrayList<T>(this.children));\n      }\n      java.util.Collection<Number> scarves;\n      switch (((this.scarves == null) ? 0 : this.scarves.size())) {\n      case 0 :\n          scarves = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          scarves = java.util.Collections.singletonList(this.scarves.get(0));\n          break;\n      default :\n          scarves = java.util.Collections.unmodifiableList(new java.util.ArrayList<Number>(this.scarves));\n      }\n      java.util.List<java.lang.Object> rawList;\n      switch (((this.rawList == null) ? 0 : this.rawList.size())) {\n      case 0 :\n          rawList = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          rawList = java.util.Collections.singletonList(this.rawList.get(0));\n          break;\n      default :\n          rawList = java.util.Collections.unmodifiableList(new java.util.ArrayList<java.lang.Object>(this.rawList));\n      }\n      return new BuilderSingularLists<T>(children, scarves, rawList);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((\"BuilderSingularLists.BuilderSingularListsBuilder(children=\" + this.children) + \", scarves=\") + this.scarves) + \", rawList=\") + this.rawList) + \")\");\n    }\n  }\n  private @Singular List<T> children;\n  private @Singular Collection<? extends Number> scarves;\n  private @SuppressWarnings(\"all\") @Singular(\"rawList\") List rawList;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularLists(final List<T> children, final Collection<? extends Number> scarves, final List rawList) {\n    super();\n    this.children = children;\n    this.scarves = scarves;\n    this.rawList = rawList;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <T>BuilderSingularLists.BuilderSingularListsBuilder<T> builder() {\n    return new BuilderSingularLists.BuilderSingularListsBuilder<T>();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderSingularMaps.java",
    "content": "import java.util.Map;\nimport java.util.SortedMap;\nimport lombok.Singular;\n@lombok.Builder class BuilderSingularMaps<K, V> {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderSingularMapsBuilder<K, V> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<K> women$key;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<V> women$value;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<K> men$key;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<Number> men$value;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<java.lang.Object> rawMap$key;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<java.lang.Object> rawMap$value;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> stringMap$key;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<V> stringMap$value;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMapsBuilder() {\n      super();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> woman(final K womanKey, final V womanValue) {\n      if ((this.women$key == null))\n          {\n            this.women$key = new java.util.ArrayList<K>();\n            this.women$value = new java.util.ArrayList<V>();\n          }\n      this.women$key.add(womanKey);\n      this.women$value.add(womanValue);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> women(final java.util.Map<? extends K, ? extends V> women) {\n      if ((women == null))\n          {\n            throw new java.lang.NullPointerException(\"women cannot be null\");\n          }\n      if ((this.women$key == null))\n          {\n            this.women$key = new java.util.ArrayList<K>();\n            this.women$value = new java.util.ArrayList<V>();\n          }\n      for (java.util.Map.Entry<? extends K, ? extends V> $lombokEntry : women.entrySet()) \n        {\n          this.women$key.add($lombokEntry.getKey());\n          this.women$value.add($lombokEntry.getValue());\n        }\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> clearWomen() {\n      if ((this.women$key != null))\n          {\n            this.women$key.clear();\n            this.women$value.clear();\n          }\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> man(final K manKey, final Number manValue) {\n      if ((this.men$key == null))\n          {\n            this.men$key = new java.util.ArrayList<K>();\n            this.men$value = new java.util.ArrayList<Number>();\n          }\n      this.men$key.add(manKey);\n      this.men$value.add(manValue);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> men(final java.util.Map<? extends K, ? extends Number> men) {\n      if ((men == null))\n          {\n            throw new java.lang.NullPointerException(\"men cannot be null\");\n          }\n      if ((this.men$key == null))\n          {\n            this.men$key = new java.util.ArrayList<K>();\n            this.men$value = new java.util.ArrayList<Number>();\n          }\n      for (java.util.Map.Entry<? extends K, ? extends Number> $lombokEntry : men.entrySet()) \n        {\n          this.men$key.add($lombokEntry.getKey());\n          this.men$value.add($lombokEntry.getValue());\n        }\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> clearMen() {\n      if ((this.men$key != null))\n          {\n            this.men$key.clear();\n            this.men$value.clear();\n          }\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> rawMap(final java.lang.Object rawMapKey, final java.lang.Object rawMapValue) {\n      if ((this.rawMap$key == null))\n          {\n            this.rawMap$key = new java.util.ArrayList<java.lang.Object>();\n            this.rawMap$value = new java.util.ArrayList<java.lang.Object>();\n          }\n      this.rawMap$key.add(rawMapKey);\n      this.rawMap$value.add(rawMapValue);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> rawMap(final java.util.Map<?, ?> rawMap) {\n      if ((rawMap == null))\n          {\n            throw new java.lang.NullPointerException(\"rawMap cannot be null\");\n          }\n      if ((this.rawMap$key == null))\n          {\n            this.rawMap$key = new java.util.ArrayList<java.lang.Object>();\n            this.rawMap$value = new java.util.ArrayList<java.lang.Object>();\n          }\n      for (java.util.Map.Entry<?, ?> $lombokEntry : rawMap.entrySet()) \n        {\n          this.rawMap$key.add($lombokEntry.getKey());\n          this.rawMap$value.add($lombokEntry.getValue());\n        }\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> clearRawMap() {\n      if ((this.rawMap$key != null))\n          {\n            this.rawMap$key.clear();\n            this.rawMap$value.clear();\n          }\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> stringMap(final String stringMapKey, final V stringMapValue) {\n      if ((this.stringMap$key == null))\n          {\n            this.stringMap$key = new java.util.ArrayList<String>();\n            this.stringMap$value = new java.util.ArrayList<V>();\n          }\n      this.stringMap$key.add(stringMapKey);\n      this.stringMap$value.add(stringMapValue);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> stringMap(final java.util.Map<? extends String, ? extends V> stringMap) {\n      if ((stringMap == null))\n          {\n            throw new java.lang.NullPointerException(\"stringMap cannot be null\");\n          }\n      if ((this.stringMap$key == null))\n          {\n            this.stringMap$key = new java.util.ArrayList<String>();\n            this.stringMap$value = new java.util.ArrayList<V>();\n          }\n      for (java.util.Map.Entry<? extends String, ? extends V> $lombokEntry : stringMap.entrySet()) \n        {\n          this.stringMap$key.add($lombokEntry.getKey());\n          this.stringMap$value.add($lombokEntry.getValue());\n        }\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> clearStringMap() {\n      if ((this.stringMap$key != null))\n          {\n            this.stringMap$key.clear();\n            this.stringMap$value.clear();\n          }\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMaps<K, V> build() {\n      java.util.Map<K, V> women;\n      switch (((this.women$key == null) ? 0 : this.women$key.size())) {\n      case 0 :\n          women = java.util.Collections.emptyMap();\n          break;\n      case 1 :\n          women = java.util.Collections.singletonMap(this.women$key.get(0), this.women$value.get(0));\n          break;\n      default :\n          women = new java.util.LinkedHashMap<K, V>(((this.women$key.size() < 0x40000000) ? ((1 + this.women$key.size()) + ((this.women$key.size() - 3) / 3)) : java.lang.Integer.MAX_VALUE));\n          for (int $i = 0;; ($i < this.women$key.size()); $i ++) \n            women.put(this.women$key.get($i), this.women$value.get($i));\n          women = java.util.Collections.unmodifiableMap(women);\n      }\n      java.util.SortedMap<K, Number> men = new java.util.TreeMap<K, Number>();\n      if ((this.men$key != null))\n          for (int $i = 0;; ($i < ((this.men$key == null) ? 0 : this.men$key.size())); $i ++) \n            men.put(this.men$key.get($i), this.men$value.get($i));\n      men = java.util.Collections.unmodifiableSortedMap(men);\n      java.util.Map<java.lang.Object, java.lang.Object> rawMap;\n      switch (((this.rawMap$key == null) ? 0 : this.rawMap$key.size())) {\n      case 0 :\n          rawMap = java.util.Collections.emptyMap();\n          break;\n      case 1 :\n          rawMap = java.util.Collections.singletonMap(this.rawMap$key.get(0), this.rawMap$value.get(0));\n          break;\n      default :\n          rawMap = new java.util.LinkedHashMap<java.lang.Object, java.lang.Object>(((this.rawMap$key.size() < 0x40000000) ? ((1 + this.rawMap$key.size()) + ((this.rawMap$key.size() - 3) / 3)) : java.lang.Integer.MAX_VALUE));\n          for (int $i = 0;; ($i < this.rawMap$key.size()); $i ++) \n            rawMap.put(this.rawMap$key.get($i), this.rawMap$value.get($i));\n          rawMap = java.util.Collections.unmodifiableMap(rawMap);\n      }\n      java.util.Map<String, V> stringMap;\n      switch (((this.stringMap$key == null) ? 0 : this.stringMap$key.size())) {\n      case 0 :\n          stringMap = java.util.Collections.emptyMap();\n          break;\n      case 1 :\n          stringMap = java.util.Collections.singletonMap(this.stringMap$key.get(0), this.stringMap$value.get(0));\n          break;\n      default :\n          stringMap = new java.util.LinkedHashMap<String, V>(((this.stringMap$key.size() < 0x40000000) ? ((1 + this.stringMap$key.size()) + ((this.stringMap$key.size() - 3) / 3)) : java.lang.Integer.MAX_VALUE));\n          for (int $i = 0;; ($i < this.stringMap$key.size()); $i ++) \n            stringMap.put(this.stringMap$key.get($i), this.stringMap$value.get($i));\n          stringMap = java.util.Collections.unmodifiableMap(stringMap);\n      }\n      return new BuilderSingularMaps<K, V>(women, men, rawMap, stringMap);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((((((((((((\"BuilderSingularMaps.BuilderSingularMapsBuilder(women$key=\" + this.women$key) + \", women$value=\") + this.women$value) + \", men$key=\") + this.men$key) + \", men$value=\") + this.men$value) + \", rawMap$key=\") + this.rawMap$key) + \", rawMap$value=\") + this.rawMap$value) + \", stringMap$key=\") + this.stringMap$key) + \", stringMap$value=\") + this.stringMap$value) + \")\");\n    }\n  }\n  private @Singular Map<K, V> women;\n  private @Singular SortedMap<K, ? extends Number> men;\n  private @SuppressWarnings(\"all\") @Singular(\"rawMap\") Map rawMap;\n  private @Singular(\"stringMap\") Map<String, V> stringMap;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMaps(final Map<K, V> women, final SortedMap<K, ? extends Number> men, final Map rawMap, final Map<String, V> stringMap) {\n    super();\n    this.women = women;\n    this.men = men;\n    this.rawMap = rawMap;\n    this.stringMap = stringMap;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <K, V>BuilderSingularMaps.BuilderSingularMapsBuilder<K, V> builder() {\n    return new BuilderSingularMaps.BuilderSingularMapsBuilder<K, V>();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderSingularMapsWithSetterPrefix.java",
    "content": "import java.util.Map;\nimport java.util.SortedMap;\nimport lombok.Singular;\n@lombok.Builder(setterPrefix = \"with\") class BuilderSingularMapsWithSetterPrefix<K, V> {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderSingularMapsWithSetterPrefixBuilder<K, V> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<K> women$key;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<V> women$value;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<K> men$key;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<Number> men$value;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<java.lang.Object> rawMap$key;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<java.lang.Object> rawMap$value;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> stringMap$key;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<V> stringMap$value;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMapsWithSetterPrefixBuilder() {\n      super();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder<K, V> withWoman(final K womanKey, final V womanValue) {\n      if ((this.women$key == null))\n          {\n            this.women$key = new java.util.ArrayList<K>();\n            this.women$value = new java.util.ArrayList<V>();\n          }\n      this.women$key.add(womanKey);\n      this.women$value.add(womanValue);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder<K, V> withWomen(final java.util.Map<? extends K, ? extends V> women) {\n      if ((women == null))\n          {\n            throw new java.lang.NullPointerException(\"women cannot be null\");\n          }\n      if ((this.women$key == null))\n          {\n            this.women$key = new java.util.ArrayList<K>();\n            this.women$value = new java.util.ArrayList<V>();\n          }\n      for (java.util.Map.Entry<? extends K, ? extends V> $lombokEntry : women.entrySet()) \n        {\n          this.women$key.add($lombokEntry.getKey());\n          this.women$value.add($lombokEntry.getValue());\n        }\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder<K, V> clearWomen() {\n      if ((this.women$key != null))\n          {\n            this.women$key.clear();\n            this.women$value.clear();\n          }\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder<K, V> withMan(final K manKey, final Number manValue) {\n      if ((this.men$key == null))\n          {\n            this.men$key = new java.util.ArrayList<K>();\n            this.men$value = new java.util.ArrayList<Number>();\n          }\n      this.men$key.add(manKey);\n      this.men$value.add(manValue);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder<K, V> withMen(final java.util.Map<? extends K, ? extends Number> men) {\n      if ((men == null))\n          {\n            throw new java.lang.NullPointerException(\"men cannot be null\");\n          }\n      if ((this.men$key == null))\n          {\n            this.men$key = new java.util.ArrayList<K>();\n            this.men$value = new java.util.ArrayList<Number>();\n          }\n      for (java.util.Map.Entry<? extends K, ? extends Number> $lombokEntry : men.entrySet()) \n        {\n          this.men$key.add($lombokEntry.getKey());\n          this.men$value.add($lombokEntry.getValue());\n        }\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder<K, V> clearMen() {\n      if ((this.men$key != null))\n          {\n            this.men$key.clear();\n            this.men$value.clear();\n          }\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder<K, V> withRawMap(final java.lang.Object rawMapKey, final java.lang.Object rawMapValue) {\n      if ((this.rawMap$key == null))\n          {\n            this.rawMap$key = new java.util.ArrayList<java.lang.Object>();\n            this.rawMap$value = new java.util.ArrayList<java.lang.Object>();\n          }\n      this.rawMap$key.add(rawMapKey);\n      this.rawMap$value.add(rawMapValue);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder<K, V> withRawMap(final java.util.Map<?, ?> rawMap) {\n      if ((rawMap != null))\n          {\n            if ((this.rawMap$key == null))\n                {\n                  this.rawMap$key = new java.util.ArrayList<java.lang.Object>();\n                  this.rawMap$value = new java.util.ArrayList<java.lang.Object>();\n                }\n            for (java.util.Map.Entry<?, ?> $lombokEntry : rawMap.entrySet()) \n              {\n                this.rawMap$key.add($lombokEntry.getKey());\n                this.rawMap$value.add($lombokEntry.getValue());\n              }\n          }\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder<K, V> clearRawMap() {\n      if ((this.rawMap$key != null))\n          {\n            this.rawMap$key.clear();\n            this.rawMap$value.clear();\n          }\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder<K, V> withStringMap(final String stringMapKey, final V stringMapValue) {\n      if ((this.stringMap$key == null))\n          {\n            this.stringMap$key = new java.util.ArrayList<String>();\n            this.stringMap$value = new java.util.ArrayList<V>();\n          }\n      this.stringMap$key.add(stringMapKey);\n      this.stringMap$value.add(stringMapValue);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder<K, V> withStringMap(final java.util.Map<? extends String, ? extends V> stringMap) {\n      if ((stringMap == null))\n          {\n            throw new java.lang.NullPointerException(\"stringMap cannot be null\");\n          }\n      if ((this.stringMap$key == null))\n          {\n            this.stringMap$key = new java.util.ArrayList<String>();\n            this.stringMap$value = new java.util.ArrayList<V>();\n          }\n      for (java.util.Map.Entry<? extends String, ? extends V> $lombokEntry : stringMap.entrySet()) \n        {\n          this.stringMap$key.add($lombokEntry.getKey());\n          this.stringMap$value.add($lombokEntry.getValue());\n        }\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder<K, V> clearStringMap() {\n      if ((this.stringMap$key != null))\n          {\n            this.stringMap$key.clear();\n            this.stringMap$value.clear();\n          }\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMapsWithSetterPrefix<K, V> build() {\n      java.util.Map<K, V> women;\n      switch (((this.women$key == null) ? 0 : this.women$key.size())) {\n      case 0 :\n          women = java.util.Collections.emptyMap();\n          break;\n      case 1 :\n          women = java.util.Collections.singletonMap(this.women$key.get(0), this.women$value.get(0));\n          break;\n      default :\n          women = new java.util.LinkedHashMap<K, V>(((this.women$key.size() < 0x40000000) ? ((1 + this.women$key.size()) + ((this.women$key.size() - 3) / 3)) : java.lang.Integer.MAX_VALUE));\n          for (int $i = 0;; ($i < this.women$key.size()); $i ++) \n            women.put(this.women$key.get($i), this.women$value.get($i));\n          women = java.util.Collections.unmodifiableMap(women);\n      }\n      java.util.SortedMap<K, Number> men = new java.util.TreeMap<K, Number>();\n      if ((this.men$key != null))\n          for (int $i = 0;; ($i < ((this.men$key == null) ? 0 : this.men$key.size())); $i ++) \n            men.put(this.men$key.get($i), this.men$value.get($i));\n      men = java.util.Collections.unmodifiableSortedMap(men);\n      java.util.Map<java.lang.Object, java.lang.Object> rawMap;\n      switch (((this.rawMap$key == null) ? 0 : this.rawMap$key.size())) {\n      case 0 :\n          rawMap = java.util.Collections.emptyMap();\n          break;\n      case 1 :\n          rawMap = java.util.Collections.singletonMap(this.rawMap$key.get(0), this.rawMap$value.get(0));\n          break;\n      default :\n          rawMap = new java.util.LinkedHashMap<java.lang.Object, java.lang.Object>(((this.rawMap$key.size() < 0x40000000) ? ((1 + this.rawMap$key.size()) + ((this.rawMap$key.size() - 3) / 3)) : java.lang.Integer.MAX_VALUE));\n          for (int $i = 0;; ($i < this.rawMap$key.size()); $i ++) \n            rawMap.put(this.rawMap$key.get($i), this.rawMap$value.get($i));\n          rawMap = java.util.Collections.unmodifiableMap(rawMap);\n      }\n      java.util.Map<String, V> stringMap;\n      switch (((this.stringMap$key == null) ? 0 : this.stringMap$key.size())) {\n      case 0 :\n          stringMap = java.util.Collections.emptyMap();\n          break;\n      case 1 :\n          stringMap = java.util.Collections.singletonMap(this.stringMap$key.get(0), this.stringMap$value.get(0));\n          break;\n      default :\n          stringMap = new java.util.LinkedHashMap<String, V>(((this.stringMap$key.size() < 0x40000000) ? ((1 + this.stringMap$key.size()) + ((this.stringMap$key.size() - 3) / 3)) : java.lang.Integer.MAX_VALUE));\n          for (int $i = 0;; ($i < this.stringMap$key.size()); $i ++) \n            stringMap.put(this.stringMap$key.get($i), this.stringMap$value.get($i));\n          stringMap = java.util.Collections.unmodifiableMap(stringMap);\n      }\n      return new BuilderSingularMapsWithSetterPrefix<K, V>(women, men, rawMap, stringMap);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((((((((((((\"BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder(women$key=\" + this.women$key) + \", women$value=\") + this.women$value) + \", men$key=\") + this.men$key) + \", men$value=\") + this.men$value) + \", rawMap$key=\") + this.rawMap$key) + \", rawMap$value=\") + this.rawMap$value) + \", stringMap$key=\") + this.stringMap$key) + \", stringMap$value=\") + this.stringMap$value) + \")\");\n    }\n  }\n  private @Singular Map<K, V> women;\n  private @Singular SortedMap<K, ? extends Number> men;\n  private @SuppressWarnings(\"all\") @Singular(value = \"rawMap\",ignoreNullCollections = true) Map rawMap;\n  private @Singular(\"stringMap\") Map<String, V> stringMap;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularMapsWithSetterPrefix(final Map<K, V> women, final SortedMap<K, ? extends Number> men, final Map rawMap, final Map<String, V> stringMap) {\n    super();\n    this.women = women;\n    this.men = men;\n    this.rawMap = rawMap;\n    this.stringMap = stringMap;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <K, V>BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder<K, V> builder() {\n    return new BuilderSingularMapsWithSetterPrefix.BuilderSingularMapsWithSetterPrefixBuilder<K, V>();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderSingularNoAuto.java",
    "content": "import java.util.List;\nimport lombok.Singular;\n@lombok.Builder class BuilderSingularNoAuto {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderSingularNoAutoBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> things;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> widgets;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> items;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNoAutoBuilder() {\n      super();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNoAuto.BuilderSingularNoAutoBuilder things(final String things) {\n      if ((this.things == null))\n          this.things = new java.util.ArrayList<String>();\n      this.things.add(things);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNoAuto.BuilderSingularNoAutoBuilder things(final java.util.Collection<? extends String> things) {\n      if ((things == null))\n          {\n            throw new java.lang.NullPointerException(\"things cannot be null\");\n          }\n      if ((this.things == null))\n          this.things = new java.util.ArrayList<String>();\n      this.things.addAll(things);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNoAuto.BuilderSingularNoAutoBuilder clearThings() {\n      if ((this.things != null))\n          this.things.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNoAuto.BuilderSingularNoAutoBuilder widget(final String widget) {\n      if ((this.widgets == null))\n          this.widgets = new java.util.ArrayList<String>();\n      this.widgets.add(widget);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNoAuto.BuilderSingularNoAutoBuilder widgets(final java.util.Collection<? extends String> widgets) {\n      if ((widgets == null))\n          {\n            throw new java.lang.NullPointerException(\"widgets cannot be null\");\n          }\n      if ((this.widgets == null))\n          this.widgets = new java.util.ArrayList<String>();\n      this.widgets.addAll(widgets);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNoAuto.BuilderSingularNoAutoBuilder clearWidgets() {\n      if ((this.widgets != null))\n          this.widgets.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNoAuto.BuilderSingularNoAutoBuilder items(final String items) {\n      if ((this.items == null))\n          this.items = new java.util.ArrayList<String>();\n      this.items.add(items);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNoAuto.BuilderSingularNoAutoBuilder items(final java.util.Collection<? extends String> items) {\n      if ((items == null))\n          {\n            throw new java.lang.NullPointerException(\"items cannot be null\");\n          }\n      if ((this.items == null))\n          this.items = new java.util.ArrayList<String>();\n      this.items.addAll(items);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNoAuto.BuilderSingularNoAutoBuilder clearItems() {\n      if ((this.items != null))\n          this.items.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNoAuto build() {\n      java.util.List<String> things;\n      switch (((this.things == null) ? 0 : this.things.size())) {\n      case 0 :\n          things = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          things = java.util.Collections.singletonList(this.things.get(0));\n          break;\n      default :\n          things = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.things));\n      }\n      java.util.List<String> widgets;\n      switch (((this.widgets == null) ? 0 : this.widgets.size())) {\n      case 0 :\n          widgets = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          widgets = java.util.Collections.singletonList(this.widgets.get(0));\n          break;\n      default :\n          widgets = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.widgets));\n      }\n      java.util.List<String> items;\n      switch (((this.items == null) ? 0 : this.items.size())) {\n      case 0 :\n          items = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          items = java.util.Collections.singletonList(this.items.get(0));\n          break;\n      default :\n          items = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.items));\n      }\n      return new BuilderSingularNoAuto(things, widgets, items);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((\"BuilderSingularNoAuto.BuilderSingularNoAutoBuilder(things=\" + this.things) + \", widgets=\") + this.widgets) + \", items=\") + this.items) + \")\");\n    }\n  }\n  private @Singular List<String> things;\n  private @Singular(\"widget\") List<String> widgets;\n  private @Singular List<String> items;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNoAuto(final List<String> things, final List<String> widgets, final List<String> items) {\n    super();\n    this.things = things;\n    this.widgets = widgets;\n    this.items = items;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNoAuto.BuilderSingularNoAutoBuilder builder() {\n    return new BuilderSingularNoAuto.BuilderSingularNoAutoBuilder();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderSingularNoAutoWithSetterPrefix.java",
    "content": "import java.util.List;\nimport lombok.Singular;\n@lombok.Builder(setterPrefix = \"with\") class BuilderSingularNoAutoWithSetterPrefix {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderSingularNoAutoWithSetterPrefixBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> things;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> widgets;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> items;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNoAutoWithSetterPrefixBuilder() {\n      super();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNoAutoWithSetterPrefix.BuilderSingularNoAutoWithSetterPrefixBuilder withThings(final String things) {\n      if ((this.things == null))\n          this.things = new java.util.ArrayList<String>();\n      this.things.add(things);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNoAutoWithSetterPrefix.BuilderSingularNoAutoWithSetterPrefixBuilder withThings(final java.util.Collection<? extends String> things) {\n      if ((things == null))\n          {\n            throw new java.lang.NullPointerException(\"things cannot be null\");\n          }\n      if ((this.things == null))\n          this.things = new java.util.ArrayList<String>();\n      this.things.addAll(things);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNoAutoWithSetterPrefix.BuilderSingularNoAutoWithSetterPrefixBuilder clearThings() {\n      if ((this.things != null))\n          this.things.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNoAutoWithSetterPrefix.BuilderSingularNoAutoWithSetterPrefixBuilder withWidget(final String widget) {\n      if ((this.widgets == null))\n          this.widgets = new java.util.ArrayList<String>();\n      this.widgets.add(widget);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNoAutoWithSetterPrefix.BuilderSingularNoAutoWithSetterPrefixBuilder withWidgets(final java.util.Collection<? extends String> widgets) {\n      if ((widgets == null))\n          {\n            throw new java.lang.NullPointerException(\"widgets cannot be null\");\n          }\n      if ((this.widgets == null))\n          this.widgets = new java.util.ArrayList<String>();\n      this.widgets.addAll(widgets);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNoAutoWithSetterPrefix.BuilderSingularNoAutoWithSetterPrefixBuilder clearWidgets() {\n      if ((this.widgets != null))\n          this.widgets.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNoAutoWithSetterPrefix.BuilderSingularNoAutoWithSetterPrefixBuilder withItems(final String items) {\n      if ((this.items == null))\n          this.items = new java.util.ArrayList<String>();\n      this.items.add(items);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNoAutoWithSetterPrefix.BuilderSingularNoAutoWithSetterPrefixBuilder withItems(final java.util.Collection<? extends String> items) {\n      if ((items == null))\n          {\n            throw new java.lang.NullPointerException(\"items cannot be null\");\n          }\n      if ((this.items == null))\n          this.items = new java.util.ArrayList<String>();\n      this.items.addAll(items);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNoAutoWithSetterPrefix.BuilderSingularNoAutoWithSetterPrefixBuilder clearItems() {\n      if ((this.items != null))\n          this.items.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNoAutoWithSetterPrefix build() {\n      java.util.List<String> things;\n      switch (((this.things == null) ? 0 : this.things.size())) {\n      case 0 :\n          things = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          things = java.util.Collections.singletonList(this.things.get(0));\n          break;\n      default :\n          things = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.things));\n      }\n      java.util.List<String> widgets;\n      switch (((this.widgets == null) ? 0 : this.widgets.size())) {\n      case 0 :\n          widgets = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          widgets = java.util.Collections.singletonList(this.widgets.get(0));\n          break;\n      default :\n          widgets = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.widgets));\n      }\n      java.util.List<String> items;\n      switch (((this.items == null) ? 0 : this.items.size())) {\n      case 0 :\n          items = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          items = java.util.Collections.singletonList(this.items.get(0));\n          break;\n      default :\n          items = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.items));\n      }\n      return new BuilderSingularNoAutoWithSetterPrefix(things, widgets, items);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((\"BuilderSingularNoAutoWithSetterPrefix.BuilderSingularNoAutoWithSetterPrefixBuilder(things=\" + this.things) + \", widgets=\") + this.widgets) + \", items=\") + this.items) + \")\");\n    }\n  }\n  private @Singular List<String> things;\n  private @Singular(\"widget\") List<String> widgets;\n  private @Singular List<String> items;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNoAutoWithSetterPrefix(final List<String> things, final List<String> widgets, final List<String> items) {\n    super();\n    this.things = things;\n    this.widgets = widgets;\n    this.items = items;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNoAutoWithSetterPrefix.BuilderSingularNoAutoWithSetterPrefixBuilder builder() {\n    return new BuilderSingularNoAutoWithSetterPrefix.BuilderSingularNoAutoWithSetterPrefixBuilder();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderSingularNullBehavior1.java",
    "content": "import java.util.List;\nimport java.util.Collection;\nimport lombok.Singular;\n@lombok.Builder class BuilderSingularNullBehavior1 {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderSingularNullBehavior1Builder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> names;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> locations;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNullBehavior1Builder() {\n      super();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNullBehavior1.@org.checkerframework.checker.nullness.qual.NonNull BuilderSingularNullBehavior1Builder name(final String name) {\n      if ((this.names == null))\n          this.names = new java.util.ArrayList<String>();\n      this.names.add(name);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNullBehavior1.@org.checkerframework.checker.nullness.qual.NonNull BuilderSingularNullBehavior1Builder names(final java.util. @org.checkerframework.checker.nullness.qual.NonNull Collection<? extends String> names) {\n      assert (names != null): \"names cannot be null\";\n      if ((this.names == null))\n          this.names = new java.util.ArrayList<String>();\n      this.names.addAll(names);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNullBehavior1.@org.checkerframework.checker.nullness.qual.NonNull BuilderSingularNullBehavior1Builder clearNames() {\n      if ((this.names != null))\n          this.names.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNullBehavior1.@org.checkerframework.checker.nullness.qual.NonNull BuilderSingularNullBehavior1Builder location(final String location) {\n      if ((this.locations == null))\n          this.locations = new java.util.ArrayList<String>();\n      this.locations.add(location);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNullBehavior1.@org.checkerframework.checker.nullness.qual.NonNull BuilderSingularNullBehavior1Builder locations(final java.util. @org.checkerframework.checker.nullness.qual.Nullable Collection<? extends String> locations) {\n      if ((locations != null))\n          {\n            if ((this.locations == null))\n                this.locations = new java.util.ArrayList<String>();\n            this.locations.addAll(locations);\n          }\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNullBehavior1.@org.checkerframework.checker.nullness.qual.NonNull BuilderSingularNullBehavior1Builder clearLocations() {\n      if ((this.locations != null))\n          this.locations.clear();\n      return this;\n    }\n    public @org.checkerframework.checker.nullness.qual.NonNull @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNullBehavior1 build() {\n      java.util.List<String> names;\n      switch (((this.names == null) ? 0 : this.names.size())) {\n      case 0 :\n          names = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          names = java.util.Collections.singletonList(this.names.get(0));\n          break;\n      default :\n          names = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.names));\n      }\n      java.util.List<String> locations;\n      switch (((this.locations == null) ? 0 : this.locations.size())) {\n      case 0 :\n          locations = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          locations = java.util.Collections.singletonList(this.locations.get(0));\n          break;\n      default :\n          locations = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.locations));\n      }\n      return new BuilderSingularNullBehavior1(names, locations);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.@org.checkerframework.checker.nullness.qual.NonNull String toString() {\n      return ((((\"BuilderSingularNullBehavior1.BuilderSingularNullBehavior1Builder(names=\" + this.names) + \", locations=\") + this.locations) + \")\");\n    }\n  }\n  private @Singular List<String> names;\n  private @Singular(ignoreNullCollections = true) List<String> locations;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNullBehavior1(final List<String> names, final List<String> locations) {\n    super();\n    this.names = names;\n    this.locations = locations;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNullBehavior1.@org.checkerframework.checker.nullness.qual.NonNull BuilderSingularNullBehavior1Builder builder() {\n    return new BuilderSingularNullBehavior1.BuilderSingularNullBehavior1Builder();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderSingularNullBehavior2.java",
    "content": "//version 8: springframework dep is too new to run on j6\nimport java.util.List;\nimport lombok.Singular;\n@lombok.Builder class BuilderSingularNullBehavior2 {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderSingularNullBehavior2Builder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> locations;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNullBehavior2Builder() {\n      super();\n    }\n    public @org.springframework.lang.NonNull @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNullBehavior2.BuilderSingularNullBehavior2Builder location(final String location) {\n      if ((this.locations == null))\n          this.locations = new java.util.ArrayList<String>();\n      this.locations.add(location);\n      return this;\n    }\n    public @org.springframework.lang.NonNull @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNullBehavior2.BuilderSingularNullBehavior2Builder locations(final @org.springframework.lang.NonNull java.util.Collection<? extends String> locations) {\n      java.util.Objects.requireNonNull(locations, \"locations cannot be null\");\n      if ((this.locations == null))\n          this.locations = new java.util.ArrayList<String>();\n      this.locations.addAll(locations);\n      return this;\n    }\n    public @org.springframework.lang.NonNull @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNullBehavior2.BuilderSingularNullBehavior2Builder clearLocations() {\n      if ((this.locations != null))\n          this.locations.clear();\n      return this;\n    }\n    public @org.springframework.lang.NonNull @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNullBehavior2 build() {\n      java.util.List<String> locations;\n      switch (((this.locations == null) ? 0 : this.locations.size())) {\n      case 0 :\n          locations = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          locations = java.util.Collections.singletonList(this.locations.get(0));\n          break;\n      default :\n          locations = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.locations));\n      }\n      return new BuilderSingularNullBehavior2(locations);\n    }\n    public @java.lang.Override @org.springframework.lang.NonNull @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"BuilderSingularNullBehavior2.BuilderSingularNullBehavior2Builder(locations=\" + this.locations) + \")\");\n    }\n  }\n  private @Singular List<String> locations;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNullBehavior2(final List<String> locations) {\n    super();\n    this.locations = locations;\n  }\n  public static @org.springframework.lang.NonNull @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularNullBehavior2.BuilderSingularNullBehavior2Builder builder() {\n    return new BuilderSingularNullBehavior2.BuilderSingularNullBehavior2Builder();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderSingularOnRecord.java",
    "content": "// version 14:\nimport java.util.Collection;\nimport java.util.List;\nimport lombok.Builder;\nimport lombok.Singular;\npublic @Builder record BuilderSingularOnRecord(List children, Collection scarves, List rawList)<T> {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderSingularOnRecordBuilder<T> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<T> children;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<Number> scarves;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<java.lang.Object> rawList;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularOnRecordBuilder() {\n      super();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularOnRecord.BuilderSingularOnRecordBuilder<T> child(final T child) {\n      if ((this.children == null))\n          this.children = new java.util.ArrayList<T>();\n      this.children.add(child);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularOnRecord.BuilderSingularOnRecordBuilder<T> children(final java.util.Collection<? extends T> children) {\n      if ((children == null))\n          {\n            throw new java.lang.NullPointerException(\"children cannot be null\");\n          }\n      if ((this.children == null))\n          this.children = new java.util.ArrayList<T>();\n      this.children.addAll(children);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularOnRecord.BuilderSingularOnRecordBuilder<T> clearChildren() {\n      if ((this.children != null))\n          this.children.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularOnRecord.BuilderSingularOnRecordBuilder<T> scarf(final Number scarf) {\n      if ((this.scarves == null))\n          this.scarves = new java.util.ArrayList<Number>();\n      this.scarves.add(scarf);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularOnRecord.BuilderSingularOnRecordBuilder<T> scarves(final java.util.Collection<? extends Number> scarves) {\n      if ((scarves == null))\n          {\n            throw new java.lang.NullPointerException(\"scarves cannot be null\");\n          }\n      if ((this.scarves == null))\n          this.scarves = new java.util.ArrayList<Number>();\n      this.scarves.addAll(scarves);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularOnRecord.BuilderSingularOnRecordBuilder<T> clearScarves() {\n      if ((this.scarves != null))\n          this.scarves.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularOnRecord.BuilderSingularOnRecordBuilder<T> rawList(final java.lang.Object rawList) {\n      if ((this.rawList == null))\n          this.rawList = new java.util.ArrayList<java.lang.Object>();\n      this.rawList.add(rawList);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularOnRecord.BuilderSingularOnRecordBuilder<T> rawList(final java.util.Collection<?> rawList) {\n      if ((rawList == null))\n          {\n            throw new java.lang.NullPointerException(\"rawList cannot be null\");\n          }\n      if ((this.rawList == null))\n          this.rawList = new java.util.ArrayList<java.lang.Object>();\n      this.rawList.addAll(rawList);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularOnRecord.BuilderSingularOnRecordBuilder<T> clearRawList() {\n      if ((this.rawList != null))\n          this.rawList.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularOnRecord<T> build() {\n      java.util.List<T> children;\n      switch (((this.children == null) ? 0 : this.children.size())) {\n      case 0 :\n          children = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          children = java.util.Collections.singletonList(this.children.get(0));\n          break;\n      default :\n          children = java.util.Collections.unmodifiableList(new java.util.ArrayList<T>(this.children));\n      }\n      java.util.Collection<Number> scarves;\n      switch (((this.scarves == null) ? 0 : this.scarves.size())) {\n      case 0 :\n          scarves = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          scarves = java.util.Collections.singletonList(this.scarves.get(0));\n          break;\n      default :\n          scarves = java.util.Collections.unmodifiableList(new java.util.ArrayList<Number>(this.scarves));\n      }\n      java.util.List<java.lang.Object> rawList;\n      switch (((this.rawList == null) ? 0 : this.rawList.size())) {\n      case 0 :\n          rawList = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          rawList = java.util.Collections.singletonList(this.rawList.get(0));\n          break;\n      default :\n          rawList = java.util.Collections.unmodifiableList(new java.util.ArrayList<java.lang.Object>(this.rawList));\n      }\n      return new BuilderSingularOnRecord<T>(children, scarves, rawList);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((\"BuilderSingularOnRecord.BuilderSingularOnRecordBuilder(children=\" + this.children) + \", scarves=\") + this.scarves) + \", rawList=\") + this.rawList) + \")\");\n    }\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <T>BuilderSingularOnRecord.BuilderSingularOnRecordBuilder<T> builder() {\n    return new BuilderSingularOnRecord.BuilderSingularOnRecordBuilder<T>();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderSingularRedirectToGuava.java",
    "content": "import java.util.Set;\nimport java.util.NavigableMap;\nimport java.util.Collection;\nimport lombok.Singular;\n@lombok.Builder class BuilderSingularRedirectToGuava {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderSingularRedirectToGuavaBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.collect.ImmutableSet.Builder<String> dangerMice;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.collect.ImmutableSortedMap.Builder<Integer, Number> things;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.collect.ImmutableList.Builder<Class<?>> doohickeys;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularRedirectToGuavaBuilder() {\n      super();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularRedirectToGuava.BuilderSingularRedirectToGuavaBuilder dangerMouse(final String dangerMouse) {\n      if ((this.dangerMice == null))\n          this.dangerMice = com.google.common.collect.ImmutableSet.builder();\n      this.dangerMice.add(dangerMouse);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularRedirectToGuava.BuilderSingularRedirectToGuavaBuilder dangerMice(final java.lang.Iterable<? extends String> dangerMice) {\n      if ((dangerMice == null))\n          {\n            throw new java.lang.NullPointerException(\"dangerMice cannot be null\");\n          }\n      if ((this.dangerMice == null))\n          this.dangerMice = com.google.common.collect.ImmutableSet.builder();\n      this.dangerMice.addAll(dangerMice);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularRedirectToGuava.BuilderSingularRedirectToGuavaBuilder clearDangerMice() {\n      this.dangerMice = null;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularRedirectToGuava.BuilderSingularRedirectToGuavaBuilder thing(final Integer key, final Number value) {\n      if ((this.things == null))\n          this.things = com.google.common.collect.ImmutableSortedMap.naturalOrder();\n      this.things.put(key, value);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularRedirectToGuava.BuilderSingularRedirectToGuavaBuilder things(final java.util.Map<? extends Integer, ? extends Number> things) {\n      if ((things == null))\n          {\n            throw new java.lang.NullPointerException(\"things cannot be null\");\n          }\n      if ((this.things == null))\n          this.things = com.google.common.collect.ImmutableSortedMap.naturalOrder();\n      this.things.putAll(things);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularRedirectToGuava.BuilderSingularRedirectToGuavaBuilder clearThings() {\n      this.things = null;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularRedirectToGuava.BuilderSingularRedirectToGuavaBuilder doohickey(final Class<?> doohickey) {\n      if ((this.doohickeys == null))\n          this.doohickeys = com.google.common.collect.ImmutableList.builder();\n      this.doohickeys.add(doohickey);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularRedirectToGuava.BuilderSingularRedirectToGuavaBuilder doohickeys(final java.lang.Iterable<? extends Class<?>> doohickeys) {\n      if ((doohickeys == null))\n          {\n            throw new java.lang.NullPointerException(\"doohickeys cannot be null\");\n          }\n      if ((this.doohickeys == null))\n          this.doohickeys = com.google.common.collect.ImmutableList.builder();\n      this.doohickeys.addAll(doohickeys);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularRedirectToGuava.BuilderSingularRedirectToGuavaBuilder clearDoohickeys() {\n      this.doohickeys = null;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularRedirectToGuava build() {\n      java.util.Set<String> dangerMice = ((this.dangerMice == null) ? com.google.common.collect.ImmutableSet.<String>of() : this.dangerMice.build());\n      java.util.NavigableMap<Integer, Number> things = ((this.things == null) ? com.google.common.collect.ImmutableSortedMap.<Integer, Number>of() : this.things.build());\n      java.util.Collection<Class<?>> doohickeys = ((this.doohickeys == null) ? com.google.common.collect.ImmutableList.<Class<?>>of() : this.doohickeys.build());\n      return new BuilderSingularRedirectToGuava(dangerMice, things, doohickeys);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((\"BuilderSingularRedirectToGuava.BuilderSingularRedirectToGuavaBuilder(dangerMice=\" + this.dangerMice) + \", things=\") + this.things) + \", doohickeys=\") + this.doohickeys) + \")\");\n    }\n  }\n  private @Singular Set<String> dangerMice;\n  private @Singular NavigableMap<Integer, Number> things;\n  private @Singular Collection<Class<?>> doohickeys;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularRedirectToGuava(final Set<String> dangerMice, final NavigableMap<Integer, Number> things, final Collection<Class<?>> doohickeys) {\n    super();\n    this.dangerMice = dangerMice;\n    this.things = things;\n    this.doohickeys = doohickeys;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularRedirectToGuava.BuilderSingularRedirectToGuavaBuilder builder() {\n    return new BuilderSingularRedirectToGuava.BuilderSingularRedirectToGuavaBuilder();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderSingularSets.java",
    "content": "import java.util.Set;\nimport java.util.SortedSet;\nimport lombok.Singular;\n@lombok.Builder class BuilderSingularSets<T> {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderSingularSetsBuilder<T> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<T> dangerMice;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<Number> octopodes;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<java.lang.Object> rawSet;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> stringSet;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSetsBuilder() {\n      super();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSets.BuilderSingularSetsBuilder<T> dangerMouse(final T dangerMouse) {\n      if ((this.dangerMice == null))\n          this.dangerMice = new java.util.ArrayList<T>();\n      this.dangerMice.add(dangerMouse);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSets.BuilderSingularSetsBuilder<T> dangerMice(final java.util.Collection<? extends T> dangerMice) {\n      if ((dangerMice == null))\n          {\n            throw new java.lang.NullPointerException(\"dangerMice cannot be null\");\n          }\n      if ((this.dangerMice == null))\n          this.dangerMice = new java.util.ArrayList<T>();\n      this.dangerMice.addAll(dangerMice);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSets.BuilderSingularSetsBuilder<T> clearDangerMice() {\n      if ((this.dangerMice != null))\n          this.dangerMice.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSets.BuilderSingularSetsBuilder<T> octopus(final Number octopus) {\n      if ((this.octopodes == null))\n          this.octopodes = new java.util.ArrayList<Number>();\n      this.octopodes.add(octopus);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSets.BuilderSingularSetsBuilder<T> octopodes(final java.util.Collection<? extends Number> octopodes) {\n      if ((octopodes == null))\n          {\n            throw new java.lang.NullPointerException(\"octopodes cannot be null\");\n          }\n      if ((this.octopodes == null))\n          this.octopodes = new java.util.ArrayList<Number>();\n      this.octopodes.addAll(octopodes);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSets.BuilderSingularSetsBuilder<T> clearOctopodes() {\n      if ((this.octopodes != null))\n          this.octopodes.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSets.BuilderSingularSetsBuilder<T> rawSet(final java.lang.Object rawSet) {\n      if ((this.rawSet == null))\n          this.rawSet = new java.util.ArrayList<java.lang.Object>();\n      this.rawSet.add(rawSet);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSets.BuilderSingularSetsBuilder<T> rawSet(final java.util.Collection<?> rawSet) {\n      if ((rawSet == null))\n          {\n            throw new java.lang.NullPointerException(\"rawSet cannot be null\");\n          }\n      if ((this.rawSet == null))\n          this.rawSet = new java.util.ArrayList<java.lang.Object>();\n      this.rawSet.addAll(rawSet);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSets.BuilderSingularSetsBuilder<T> clearRawSet() {\n      if ((this.rawSet != null))\n          this.rawSet.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSets.BuilderSingularSetsBuilder<T> stringSet(final String stringSet) {\n      if ((this.stringSet == null))\n          this.stringSet = new java.util.ArrayList<String>();\n      this.stringSet.add(stringSet);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSets.BuilderSingularSetsBuilder<T> stringSet(final java.util.Collection<? extends String> stringSet) {\n      if ((stringSet == null))\n          {\n            throw new java.lang.NullPointerException(\"stringSet cannot be null\");\n          }\n      if ((this.stringSet == null))\n          this.stringSet = new java.util.ArrayList<String>();\n      this.stringSet.addAll(stringSet);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSets.BuilderSingularSetsBuilder<T> clearStringSet() {\n      if ((this.stringSet != null))\n          this.stringSet.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSets<T> build() {\n      java.util.Set<T> dangerMice;\n      switch (((this.dangerMice == null) ? 0 : this.dangerMice.size())) {\n      case 0 :\n          dangerMice = java.util.Collections.emptySet();\n          break;\n      case 1 :\n          dangerMice = java.util.Collections.singleton(this.dangerMice.get(0));\n          break;\n      default :\n          dangerMice = new java.util.LinkedHashSet<T>(((this.dangerMice.size() < 0x40000000) ? ((1 + this.dangerMice.size()) + ((this.dangerMice.size() - 3) / 3)) : java.lang.Integer.MAX_VALUE));\n          dangerMice.addAll(this.dangerMice);\n          dangerMice = java.util.Collections.unmodifiableSet(dangerMice);\n      }\n      java.util.SortedSet<Number> octopodes = new java.util.TreeSet<Number>();\n      if ((this.octopodes != null))\n          octopodes.addAll(this.octopodes);\n      octopodes = java.util.Collections.unmodifiableSortedSet(octopodes);\n      java.util.Set<java.lang.Object> rawSet;\n      switch (((this.rawSet == null) ? 0 : this.rawSet.size())) {\n      case 0 :\n          rawSet = java.util.Collections.emptySet();\n          break;\n      case 1 :\n          rawSet = java.util.Collections.singleton(this.rawSet.get(0));\n          break;\n      default :\n          rawSet = new java.util.LinkedHashSet<java.lang.Object>(((this.rawSet.size() < 0x40000000) ? ((1 + this.rawSet.size()) + ((this.rawSet.size() - 3) / 3)) : java.lang.Integer.MAX_VALUE));\n          rawSet.addAll(this.rawSet);\n          rawSet = java.util.Collections.unmodifiableSet(rawSet);\n      }\n      java.util.Set<String> stringSet;\n      switch (((this.stringSet == null) ? 0 : this.stringSet.size())) {\n      case 0 :\n          stringSet = java.util.Collections.emptySet();\n          break;\n      case 1 :\n          stringSet = java.util.Collections.singleton(this.stringSet.get(0));\n          break;\n      default :\n          stringSet = new java.util.LinkedHashSet<String>(((this.stringSet.size() < 0x40000000) ? ((1 + this.stringSet.size()) + ((this.stringSet.size() - 3) / 3)) : java.lang.Integer.MAX_VALUE));\n          stringSet.addAll(this.stringSet);\n          stringSet = java.util.Collections.unmodifiableSet(stringSet);\n      }\n      return new BuilderSingularSets<T>(dangerMice, octopodes, rawSet, stringSet);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((((\"BuilderSingularSets.BuilderSingularSetsBuilder(dangerMice=\" + this.dangerMice) + \", octopodes=\") + this.octopodes) + \", rawSet=\") + this.rawSet) + \", stringSet=\") + this.stringSet) + \")\");\n    }\n  }\n  private @Singular Set<T> dangerMice;\n  private @Singular SortedSet<? extends Number> octopodes;\n  private @SuppressWarnings(\"all\") @Singular(\"rawSet\") Set rawSet;\n  private @Singular(\"stringSet\") Set<String> stringSet;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSets(final Set<T> dangerMice, final SortedSet<? extends Number> octopodes, final Set rawSet, final Set<String> stringSet) {\n    super();\n    this.dangerMice = dangerMice;\n    this.octopodes = octopodes;\n    this.rawSet = rawSet;\n    this.stringSet = stringSet;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <T>BuilderSingularSets.BuilderSingularSetsBuilder<T> builder() {\n    return new BuilderSingularSets.BuilderSingularSetsBuilder<T>();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderSingularSetsWithSetterPrefix.java",
    "content": "import java.util.Set;\nimport java.util.SortedSet;\nimport lombok.Singular;\n@lombok.Builder(setterPrefix = \"with\") class BuilderSingularSetsWithSetterPrefix<T> {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderSingularSetsWithSetterPrefixBuilder<T> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<T> dangerMice;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<Number> octopodes;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<java.lang.Object> rawSet;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> stringSet;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSetsWithSetterPrefixBuilder() {\n      super();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder<T> withDangerMouse(final T dangerMouse) {\n      if ((this.dangerMice == null))\n          this.dangerMice = new java.util.ArrayList<T>();\n      this.dangerMice.add(dangerMouse);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder<T> withDangerMice(final java.util.Collection<? extends T> dangerMice) {\n      if ((dangerMice == null))\n          {\n            throw new java.lang.NullPointerException(\"dangerMice cannot be null\");\n          }\n      if ((this.dangerMice == null))\n          this.dangerMice = new java.util.ArrayList<T>();\n      this.dangerMice.addAll(dangerMice);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder<T> clearDangerMice() {\n      if ((this.dangerMice != null))\n          this.dangerMice.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder<T> withOctopus(final Number octopus) {\n      if ((this.octopodes == null))\n          this.octopodes = new java.util.ArrayList<Number>();\n      this.octopodes.add(octopus);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder<T> withOctopodes(final java.util.Collection<? extends Number> octopodes) {\n      if ((octopodes == null))\n          {\n            throw new java.lang.NullPointerException(\"octopodes cannot be null\");\n          }\n      if ((this.octopodes == null))\n          this.octopodes = new java.util.ArrayList<Number>();\n      this.octopodes.addAll(octopodes);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder<T> clearOctopodes() {\n      if ((this.octopodes != null))\n          this.octopodes.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder<T> withRawSet(final java.lang.Object rawSet) {\n      if ((this.rawSet == null))\n          this.rawSet = new java.util.ArrayList<java.lang.Object>();\n      this.rawSet.add(rawSet);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder<T> withRawSet(final java.util.Collection<?> rawSet) {\n      if ((rawSet == null))\n          {\n            throw new java.lang.NullPointerException(\"rawSet cannot be null\");\n          }\n      if ((this.rawSet == null))\n          this.rawSet = new java.util.ArrayList<java.lang.Object>();\n      this.rawSet.addAll(rawSet);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder<T> clearRawSet() {\n      if ((this.rawSet != null))\n          this.rawSet.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder<T> withStringSet(final String stringSet) {\n      if ((this.stringSet == null))\n          this.stringSet = new java.util.ArrayList<String>();\n      this.stringSet.add(stringSet);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder<T> withStringSet(final java.util.Collection<? extends String> stringSet) {\n      if ((stringSet == null))\n          {\n            throw new java.lang.NullPointerException(\"stringSet cannot be null\");\n          }\n      if ((this.stringSet == null))\n          this.stringSet = new java.util.ArrayList<String>();\n      this.stringSet.addAll(stringSet);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder<T> clearStringSet() {\n      if ((this.stringSet != null))\n          this.stringSet.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSetsWithSetterPrefix<T> build() {\n      java.util.Set<T> dangerMice;\n      switch (((this.dangerMice == null) ? 0 : this.dangerMice.size())) {\n      case 0 :\n          dangerMice = java.util.Collections.emptySet();\n          break;\n      case 1 :\n          dangerMice = java.util.Collections.singleton(this.dangerMice.get(0));\n          break;\n      default :\n          dangerMice = new java.util.LinkedHashSet<T>(((this.dangerMice.size() < 0x40000000) ? ((1 + this.dangerMice.size()) + ((this.dangerMice.size() - 3) / 3)) : java.lang.Integer.MAX_VALUE));\n          dangerMice.addAll(this.dangerMice);\n          dangerMice = java.util.Collections.unmodifiableSet(dangerMice);\n      }\n      java.util.SortedSet<Number> octopodes = new java.util.TreeSet<Number>();\n      if ((this.octopodes != null))\n          octopodes.addAll(this.octopodes);\n      octopodes = java.util.Collections.unmodifiableSortedSet(octopodes);\n      java.util.Set<java.lang.Object> rawSet;\n      switch (((this.rawSet == null) ? 0 : this.rawSet.size())) {\n      case 0 :\n          rawSet = java.util.Collections.emptySet();\n          break;\n      case 1 :\n          rawSet = java.util.Collections.singleton(this.rawSet.get(0));\n          break;\n      default :\n          rawSet = new java.util.LinkedHashSet<java.lang.Object>(((this.rawSet.size() < 0x40000000) ? ((1 + this.rawSet.size()) + ((this.rawSet.size() - 3) / 3)) : java.lang.Integer.MAX_VALUE));\n          rawSet.addAll(this.rawSet);\n          rawSet = java.util.Collections.unmodifiableSet(rawSet);\n      }\n      java.util.Set<String> stringSet;\n      switch (((this.stringSet == null) ? 0 : this.stringSet.size())) {\n      case 0 :\n          stringSet = java.util.Collections.emptySet();\n          break;\n      case 1 :\n          stringSet = java.util.Collections.singleton(this.stringSet.get(0));\n          break;\n      default :\n          stringSet = new java.util.LinkedHashSet<String>(((this.stringSet.size() < 0x40000000) ? ((1 + this.stringSet.size()) + ((this.stringSet.size() - 3) / 3)) : java.lang.Integer.MAX_VALUE));\n          stringSet.addAll(this.stringSet);\n          stringSet = java.util.Collections.unmodifiableSet(stringSet);\n      }\n      return new BuilderSingularSetsWithSetterPrefix<T>(dangerMice, octopodes, rawSet, stringSet);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((((\"BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder(dangerMice=\" + this.dangerMice) + \", octopodes=\") + this.octopodes) + \", rawSet=\") + this.rawSet) + \", stringSet=\") + this.stringSet) + \")\");\n    }\n  }\n  private @Singular Set<T> dangerMice;\n  private @Singular SortedSet<? extends Number> octopodes;\n  private @SuppressWarnings(\"all\") @Singular(\"rawSet\") Set rawSet;\n  private @Singular(\"stringSet\") Set<String> stringSet;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularSetsWithSetterPrefix(final Set<T> dangerMice, final SortedSet<? extends Number> octopodes, final Set rawSet, final Set<String> stringSet) {\n    super();\n    this.dangerMice = dangerMice;\n    this.octopodes = octopodes;\n    this.rawSet = rawSet;\n    this.stringSet = stringSet;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <T>BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder<T> builder() {\n    return new BuilderSingularSetsWithSetterPrefix.BuilderSingularSetsWithSetterPrefixBuilder<T>();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderSingularToBuilderWithNull.java",
    "content": "import lombok.Singular;\n@lombok.Builder(toBuilder = true) class BuilderSingularToBuilderWithNull {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderSingularToBuilderWithNullBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> elems;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularToBuilderWithNullBuilder() {\n      super();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularToBuilderWithNull.BuilderSingularToBuilderWithNullBuilder elem(final String elem) {\n      if ((this.elems == null))\n          this.elems = new java.util.ArrayList<String>();\n      this.elems.add(elem);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularToBuilderWithNull.BuilderSingularToBuilderWithNullBuilder elems(final java.util.Collection<? extends String> elems) {\n      if ((elems == null))\n          {\n            throw new java.lang.NullPointerException(\"elems cannot be null\");\n          }\n      if ((this.elems == null))\n          this.elems = new java.util.ArrayList<String>();\n      this.elems.addAll(elems);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularToBuilderWithNull.BuilderSingularToBuilderWithNullBuilder clearElems() {\n      if ((this.elems != null))\n          this.elems.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularToBuilderWithNull build() {\n      java.util.List<String> elems;\n      switch (((this.elems == null) ? 0 : this.elems.size())) {\n      case 0 :\n          elems = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          elems = java.util.Collections.singletonList(this.elems.get(0));\n          break;\n      default :\n          elems = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.elems));\n      }\n      return new BuilderSingularToBuilderWithNull(elems);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"BuilderSingularToBuilderWithNull.BuilderSingularToBuilderWithNullBuilder(elems=\" + this.elems) + \")\");\n    }\n  }\n  private @Singular java.util.List<String> elems;\n  public static void test() {\n    new BuilderSingularToBuilderWithNull(null).toBuilder();\n  }\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularToBuilderWithNull(final java.util.List<String> elems) {\n    super();\n    this.elems = elems;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularToBuilderWithNull.BuilderSingularToBuilderWithNullBuilder builder() {\n    return new BuilderSingularToBuilderWithNull.BuilderSingularToBuilderWithNullBuilder();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularToBuilderWithNull.BuilderSingularToBuilderWithNullBuilder toBuilder() {\n    final BuilderSingularToBuilderWithNull.BuilderSingularToBuilderWithNullBuilder builder = new BuilderSingularToBuilderWithNull.BuilderSingularToBuilderWithNullBuilder();\n    if ((this.elems != null))\n        builder.elems(this.elems);\n    return builder;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderSingularToBuilderWithNullWithSetterPrefix.java",
    "content": "import lombok.Singular;\n@lombok.Builder(toBuilder = true,setterPrefix = \"with\") class BuilderSingularToBuilderWithNullWithSetterPrefix {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderSingularToBuilderWithNullWithSetterPrefixBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> elems;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularToBuilderWithNullWithSetterPrefixBuilder() {\n      super();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularToBuilderWithNullWithSetterPrefix.BuilderSingularToBuilderWithNullWithSetterPrefixBuilder withElem(final String elem) {\n      if ((this.elems == null))\n          this.elems = new java.util.ArrayList<String>();\n      this.elems.add(elem);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularToBuilderWithNullWithSetterPrefix.BuilderSingularToBuilderWithNullWithSetterPrefixBuilder withElems(final java.util.Collection<? extends String> elems) {\n      if ((elems == null))\n          {\n            throw new java.lang.NullPointerException(\"elems cannot be null\");\n          }\n      if ((this.elems == null))\n          this.elems = new java.util.ArrayList<String>();\n      this.elems.addAll(elems);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularToBuilderWithNullWithSetterPrefix.BuilderSingularToBuilderWithNullWithSetterPrefixBuilder clearElems() {\n      if ((this.elems != null))\n          this.elems.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularToBuilderWithNullWithSetterPrefix build() {\n      java.util.List<String> elems;\n      switch (((this.elems == null) ? 0 : this.elems.size())) {\n      case 0 :\n          elems = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          elems = java.util.Collections.singletonList(this.elems.get(0));\n          break;\n      default :\n          elems = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.elems));\n      }\n      return new BuilderSingularToBuilderWithNullWithSetterPrefix(elems);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"BuilderSingularToBuilderWithNullWithSetterPrefix.BuilderSingularToBuilderWithNullWithSetterPrefixBuilder(elems=\" + this.elems) + \")\");\n    }\n  }\n  private @Singular java.util.List<String> elems;\n  public static void test() {\n    new BuilderSingularToBuilderWithNullWithSetterPrefix(null).toBuilder();\n  }\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularToBuilderWithNullWithSetterPrefix(final java.util.List<String> elems) {\n    super();\n    this.elems = elems;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularToBuilderWithNullWithSetterPrefix.BuilderSingularToBuilderWithNullWithSetterPrefixBuilder builder() {\n    return new BuilderSingularToBuilderWithNullWithSetterPrefix.BuilderSingularToBuilderWithNullWithSetterPrefixBuilder();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularToBuilderWithNullWithSetterPrefix.BuilderSingularToBuilderWithNullWithSetterPrefixBuilder toBuilder() {\n    final BuilderSingularToBuilderWithNullWithSetterPrefix.BuilderSingularToBuilderWithNullWithSetterPrefixBuilder builder = new BuilderSingularToBuilderWithNullWithSetterPrefix.BuilderSingularToBuilderWithNullWithSetterPrefixBuilder();\n    if ((this.elems != null))\n        builder.withElems(this.elems);\n    return builder;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderSingularWildcardListsWithToBuilder.java",
    "content": "import java.util.List;\nimport java.util.Collection;\nimport lombok.Singular;\n@lombok.Builder(toBuilder = true) class BuilderSingularWildcardListsWithToBuilder {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderSingularWildcardListsWithToBuilderBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<java.lang.Object> objects;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<Number> numbers;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularWildcardListsWithToBuilderBuilder() {\n      super();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularWildcardListsWithToBuilder.BuilderSingularWildcardListsWithToBuilderBuilder object(final java.lang.Object object) {\n      if ((this.objects == null))\n          this.objects = new java.util.ArrayList<java.lang.Object>();\n      this.objects.add(object);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularWildcardListsWithToBuilder.BuilderSingularWildcardListsWithToBuilderBuilder objects(final java.util.Collection<?> objects) {\n      if ((objects == null))\n          {\n            throw new java.lang.NullPointerException(\"objects cannot be null\");\n          }\n      if ((this.objects == null))\n          this.objects = new java.util.ArrayList<java.lang.Object>();\n      this.objects.addAll(objects);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularWildcardListsWithToBuilder.BuilderSingularWildcardListsWithToBuilderBuilder clearObjects() {\n      if ((this.objects != null))\n          this.objects.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularWildcardListsWithToBuilder.BuilderSingularWildcardListsWithToBuilderBuilder number(final Number number) {\n      if ((this.numbers == null))\n          this.numbers = new java.util.ArrayList<Number>();\n      this.numbers.add(number);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularWildcardListsWithToBuilder.BuilderSingularWildcardListsWithToBuilderBuilder numbers(final java.util.Collection<? extends Number> numbers) {\n      if ((numbers == null))\n          {\n            throw new java.lang.NullPointerException(\"numbers cannot be null\");\n          }\n      if ((this.numbers == null))\n          this.numbers = new java.util.ArrayList<Number>();\n      this.numbers.addAll(numbers);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularWildcardListsWithToBuilder.BuilderSingularWildcardListsWithToBuilderBuilder clearNumbers() {\n      if ((this.numbers != null))\n          this.numbers.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularWildcardListsWithToBuilder build() {\n      java.util.List<java.lang.Object> objects;\n      switch (((this.objects == null) ? 0 : this.objects.size())) {\n      case 0 :\n          objects = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          objects = java.util.Collections.singletonList(this.objects.get(0));\n          break;\n      default :\n          objects = java.util.Collections.unmodifiableList(new java.util.ArrayList<java.lang.Object>(this.objects));\n      }\n      java.util.Collection<Number> numbers;\n      switch (((this.numbers == null) ? 0 : this.numbers.size())) {\n      case 0 :\n          numbers = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          numbers = java.util.Collections.singletonList(this.numbers.get(0));\n          break;\n      default :\n          numbers = java.util.Collections.unmodifiableList(new java.util.ArrayList<Number>(this.numbers));\n      }\n      return new BuilderSingularWildcardListsWithToBuilder(objects, numbers);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((\"BuilderSingularWildcardListsWithToBuilder.BuilderSingularWildcardListsWithToBuilderBuilder(objects=\" + this.objects) + \", numbers=\") + this.numbers) + \")\");\n    }\n  }\n  private @Singular List<?> objects;\n  private @Singular Collection<? extends Number> numbers;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularWildcardListsWithToBuilder(final List<?> objects, final Collection<? extends Number> numbers) {\n    super();\n    this.objects = objects;\n    this.numbers = numbers;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularWildcardListsWithToBuilder.BuilderSingularWildcardListsWithToBuilderBuilder builder() {\n    return new BuilderSingularWildcardListsWithToBuilder.BuilderSingularWildcardListsWithToBuilderBuilder();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularWildcardListsWithToBuilder.BuilderSingularWildcardListsWithToBuilderBuilder toBuilder() {\n    final BuilderSingularWildcardListsWithToBuilder.BuilderSingularWildcardListsWithToBuilderBuilder builder = new BuilderSingularWildcardListsWithToBuilder.BuilderSingularWildcardListsWithToBuilderBuilder();\n    if ((this.objects != null))\n        builder.objects(this.objects);\n    if ((this.numbers != null))\n        builder.numbers(this.numbers);\n    return builder;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderSingularWithPrefixes.java",
    "content": "import lombok.Singular;\n@lombok.Builder @lombok.experimental.Accessors(prefix = \"_\") class BuilderSingularWithPrefixes {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderSingularWithPrefixesBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> elems;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularWithPrefixesBuilder() {\n      super();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularWithPrefixes.BuilderSingularWithPrefixesBuilder elem(final String elem) {\n      if ((this.elems == null))\n          this.elems = new java.util.ArrayList<String>();\n      this.elems.add(elem);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularWithPrefixes.BuilderSingularWithPrefixesBuilder elems(final java.util.Collection<? extends String> elems) {\n      if ((elems == null))\n          {\n            throw new java.lang.NullPointerException(\"elems cannot be null\");\n          }\n      if ((this.elems == null))\n          this.elems = new java.util.ArrayList<String>();\n      this.elems.addAll(elems);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularWithPrefixes.BuilderSingularWithPrefixesBuilder clearElems() {\n      if ((this.elems != null))\n          this.elems.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularWithPrefixes build() {\n      java.util.List<String> elems;\n      switch (((this.elems == null) ? 0 : this.elems.size())) {\n      case 0 :\n          elems = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          elems = java.util.Collections.singletonList(this.elems.get(0));\n          break;\n      default :\n          elems = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.elems));\n      }\n      return new BuilderSingularWithPrefixes(elems);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"BuilderSingularWithPrefixes.BuilderSingularWithPrefixesBuilder(elems=\" + this.elems) + \")\");\n    }\n  }\n  private @Singular java.util.List<String> _elems;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularWithPrefixes(final java.util.List<String> elems) {\n    super();\n    this._elems = elems;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularWithPrefixes.BuilderSingularWithPrefixesBuilder builder() {\n    return new BuilderSingularWithPrefixes.BuilderSingularWithPrefixesBuilder();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderSingularWithPrefixesWithSetterPrefix.java",
    "content": "import lombok.Singular;\n@lombok.Builder(setterPrefix = \"with\") @lombok.experimental.Accessors(prefix = \"_\") class BuilderSingularWithPrefixesWithSetterPrefix {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderSingularWithPrefixesWithSetterPrefixBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> elems;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularWithPrefixesWithSetterPrefixBuilder() {\n      super();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularWithPrefixesWithSetterPrefix.BuilderSingularWithPrefixesWithSetterPrefixBuilder withElem(final String elem) {\n      if ((this.elems == null))\n          this.elems = new java.util.ArrayList<String>();\n      this.elems.add(elem);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularWithPrefixesWithSetterPrefix.BuilderSingularWithPrefixesWithSetterPrefixBuilder withElems(final java.util.Collection<? extends String> elems) {\n      if ((elems == null))\n          {\n            throw new java.lang.NullPointerException(\"elems cannot be null\");\n          }\n      if ((this.elems == null))\n          this.elems = new java.util.ArrayList<String>();\n      this.elems.addAll(elems);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularWithPrefixesWithSetterPrefix.BuilderSingularWithPrefixesWithSetterPrefixBuilder clearElems() {\n      if ((this.elems != null))\n          this.elems.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularWithPrefixesWithSetterPrefix build() {\n      java.util.List<String> elems;\n      switch (((this.elems == null) ? 0 : this.elems.size())) {\n      case 0 :\n          elems = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          elems = java.util.Collections.singletonList(this.elems.get(0));\n          break;\n      default :\n          elems = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.elems));\n      }\n      return new BuilderSingularWithPrefixesWithSetterPrefix(elems);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"BuilderSingularWithPrefixesWithSetterPrefix.BuilderSingularWithPrefixesWithSetterPrefixBuilder(elems=\" + this.elems) + \")\");\n    }\n  }\n  private @Singular java.util.List<String> _elems;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularWithPrefixesWithSetterPrefix(final java.util.List<String> elems) {\n    super();\n    this._elems = elems;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderSingularWithPrefixesWithSetterPrefix.BuilderSingularWithPrefixesWithSetterPrefixBuilder builder() {\n    return new BuilderSingularWithPrefixesWithSetterPrefix.BuilderSingularWithPrefixesWithSetterPrefixBuilder();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderTypeAnnos.java",
    "content": "import java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.List;\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER}) @interface TA {\n}\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER}) @interface TB {\n}\n@lombok.Builder class BuilderTypeAnnos {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderTypeAnnosBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated List<String> foo;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderTypeAnnosBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderTypeAnnos.BuilderTypeAnnosBuilder foo(final @TA List<String> foo) {\n      this.foo = foo;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderTypeAnnos build() {\n      return new BuilderTypeAnnos(this.foo);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"BuilderTypeAnnos.BuilderTypeAnnosBuilder(foo=\" + this.foo) + \")\");\n    }\n  }\n  private @TA @TB List<String> foo;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderTypeAnnos(final @TA List<String> foo) {\n    super();\n    this.foo = foo;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderTypeAnnos.BuilderTypeAnnosBuilder builder() {\n    return new BuilderTypeAnnos.BuilderTypeAnnosBuilder();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderTypeAnnosWithSetterPrefix.java",
    "content": "import java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.List;\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER}) @interface TA {\n}\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER}) @interface TB {\n}\n@lombok.Builder(setterPrefix = \"with\") class BuilderTypeAnnosWithSetterPrefix {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderTypeAnnosWithSetterPrefixBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated List<String> foo;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderTypeAnnosWithSetterPrefixBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderTypeAnnosWithSetterPrefix.BuilderTypeAnnosWithSetterPrefixBuilder withFoo(final @TA List<String> foo) {\n      this.foo = foo;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderTypeAnnosWithSetterPrefix build() {\n      return new BuilderTypeAnnosWithSetterPrefix(this.foo);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"BuilderTypeAnnosWithSetterPrefix.BuilderTypeAnnosWithSetterPrefixBuilder(foo=\" + this.foo) + \")\");\n    }\n  }\n  private @TA @TB List<String> foo;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderTypeAnnosWithSetterPrefix(final @TA List<String> foo) {\n    super();\n    this.foo = foo;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderTypeAnnosWithSetterPrefix.BuilderTypeAnnosWithSetterPrefixBuilder builder() {\n    return new BuilderTypeAnnosWithSetterPrefix.BuilderTypeAnnosWithSetterPrefixBuilder();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderValueData.java",
    "content": "import java.util.List;\nfinal @lombok.Builder @lombok.Value class BuilderAndValue {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderAndValueBuilder {\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderAndValueBuilder() {\n      super();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderAndValue build() {\n      return new BuilderAndValue();\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return \"BuilderAndValue.BuilderAndValueBuilder()\";\n    }\n  }\n  private final int zero = 0;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderAndValue() {\n    super();\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderAndValue.BuilderAndValueBuilder builder() {\n    return new BuilderAndValue.BuilderAndValueBuilder();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getZero() {\n    return this.zero;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof BuilderAndValue)))\n        return false;\n    final BuilderAndValue other = (BuilderAndValue) o;\n    if ((this.getZero() != other.getZero()))\n        return false;\n    return true;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.getZero());\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((\"BuilderAndValue(zero=\" + this.getZero()) + \")\");\n  }\n}\n@lombok.Builder @lombok.Data class BuilderAndData {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderAndDataBuilder {\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderAndDataBuilder() {\n      super();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderAndData build() {\n      return new BuilderAndData();\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return \"BuilderAndData.BuilderAndDataBuilder()\";\n    }\n  }\n  private final int zero = 0;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderAndData() {\n    super();\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderAndData.BuilderAndDataBuilder builder() {\n    return new BuilderAndData.BuilderAndDataBuilder();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getZero() {\n    return this.zero;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof BuilderAndData)))\n        return false;\n    final BuilderAndData other = (BuilderAndData) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((this.getZero() != other.getZero()))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof BuilderAndData);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.getZero());\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((\"BuilderAndData(zero=\" + this.getZero()) + \")\");\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderValueDataWithSetterPrefix.java",
    "content": "import java.util.List;\nfinal @lombok.Builder(setterPrefix = \"with\") @lombok.Value class BuilderAndValueWithSetterPrefix {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderAndValueWithSetterPrefixBuilder {\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderAndValueWithSetterPrefixBuilder() {\n      super();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderAndValueWithSetterPrefix build() {\n      return new BuilderAndValueWithSetterPrefix();\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return \"BuilderAndValueWithSetterPrefix.BuilderAndValueWithSetterPrefixBuilder()\";\n    }\n  }\n  private final int zero = 0;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderAndValueWithSetterPrefix() {\n    super();\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderAndValueWithSetterPrefix.BuilderAndValueWithSetterPrefixBuilder builder() {\n    return new BuilderAndValueWithSetterPrefix.BuilderAndValueWithSetterPrefixBuilder();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getZero() {\n    return this.zero;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof BuilderAndValueWithSetterPrefix)))\n        return false;\n    final BuilderAndValueWithSetterPrefix other = (BuilderAndValueWithSetterPrefix) o;\n    if ((this.getZero() != other.getZero()))\n        return false;\n    return true;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.getZero());\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((\"BuilderAndValueWithSetterPrefix(zero=\" + this.getZero()) + \")\");\n  }\n}\n@lombok.Builder(setterPrefix = \"with\") @lombok.Data class BuilderAndDataWithSetterPrefix {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderAndDataWithSetterPrefixBuilder {\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderAndDataWithSetterPrefixBuilder() {\n      super();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderAndDataWithSetterPrefix build() {\n      return new BuilderAndDataWithSetterPrefix();\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return \"BuilderAndDataWithSetterPrefix.BuilderAndDataWithSetterPrefixBuilder()\";\n    }\n  }\n  private final int zero = 0;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderAndDataWithSetterPrefix() {\n    super();\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderAndDataWithSetterPrefix.BuilderAndDataWithSetterPrefixBuilder builder() {\n    return new BuilderAndDataWithSetterPrefix.BuilderAndDataWithSetterPrefixBuilder();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getZero() {\n    return this.zero;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof BuilderAndDataWithSetterPrefix)))\n        return false;\n    final BuilderAndDataWithSetterPrefix other = (BuilderAndDataWithSetterPrefix) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((this.getZero() != other.getZero()))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof BuilderAndDataWithSetterPrefix);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.getZero());\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((\"BuilderAndDataWithSetterPrefix(zero=\" + this.getZero()) + \")\");\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderWithAccessors.java",
    "content": "@lombok.Builder @lombok.experimental.Accessors(prefix = {\"p\", \"_\"}) class BuilderWithAccessors {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderWithAccessorsBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int plower;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int upper;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int foo;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int _bar;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithAccessorsBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithAccessors.BuilderWithAccessorsBuilder plower(final int plower) {\n      this.plower = plower;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithAccessors.BuilderWithAccessorsBuilder upper(final int upper) {\n      this.upper = upper;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithAccessors.BuilderWithAccessorsBuilder foo(final int foo) {\n      this.foo = foo;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithAccessors.BuilderWithAccessorsBuilder _bar(final int _bar) {\n      this._bar = _bar;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithAccessors build() {\n      return new BuilderWithAccessors(this.plower, this.upper, this.foo, this._bar);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((((\"BuilderWithAccessors.BuilderWithAccessorsBuilder(plower=\" + this.plower) + \", upper=\") + this.upper) + \", foo=\") + this.foo) + \", _bar=\") + this._bar) + \")\");\n    }\n  }\n  private final int plower;\n  private final int pUpper;\n  private int _foo;\n  private int __bar;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithAccessors(final int plower, final int upper, final int foo, final int _bar) {\n    super();\n    this.plower = plower;\n    this.pUpper = upper;\n    this._foo = foo;\n    this.__bar = _bar;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithAccessors.BuilderWithAccessorsBuilder builder() {\n    return new BuilderWithAccessors.BuilderWithAccessorsBuilder();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderWithBadNames.java",
    "content": "public @lombok.Builder class BuilderWithBadNames {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderWithBadNamesBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String build;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String toString;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithBadNamesBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithBadNames.BuilderWithBadNamesBuilder build(final String build) {\n      this.build = build;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithBadNames.BuilderWithBadNamesBuilder toString(final String toString) {\n      this.toString = toString;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithBadNames build() {\n      return new BuilderWithBadNames(this.build, this.toString);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((\"BuilderWithBadNames.BuilderWithBadNamesBuilder(build=\" + this.build) + \", toString=\") + this.toString) + \")\");\n    }\n  }\n  String build;\n  String toString;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithBadNames(final String build, final String toString) {\n    super();\n    this.build = build;\n    this.toString = toString;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithBadNames.BuilderWithBadNamesBuilder builder() {\n    return new BuilderWithBadNames.BuilderWithBadNamesBuilder();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderWithDeprecated.java",
    "content": "import com.google.common.collect.ImmutableList;\nimport lombok.Builder;\nimport lombok.Singular;\npublic @Builder class BuilderWithDeprecated {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderWithDeprecatedBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String dep1;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int dep2;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> strings;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.collect.ImmutableList.Builder<Integer> numbers;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithDeprecatedBuilder() {\n      super();\n    }\n    /**\n     * @deprecated since always\n     * @return {@code this}.\n     */\n    public @java.lang.Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithDeprecated.BuilderWithDeprecatedBuilder dep1(final String dep1) {\n      this.dep1 = dep1;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithDeprecated.BuilderWithDeprecatedBuilder dep2(final int dep2) {\n      this.dep2 = dep2;\n      return this;\n    }\n    public @java.lang.Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithDeprecated.BuilderWithDeprecatedBuilder string(final String string) {\n      if ((this.strings == null))\n          this.strings = new java.util.ArrayList<String>();\n      this.strings.add(string);\n      return this;\n    }\n    public @java.lang.Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithDeprecated.BuilderWithDeprecatedBuilder strings(final java.util.Collection<? extends String> strings) {\n      if ((strings == null))\n          {\n            throw new java.lang.NullPointerException(\"strings cannot be null\");\n          }\n      if ((this.strings == null))\n          this.strings = new java.util.ArrayList<String>();\n      this.strings.addAll(strings);\n      return this;\n    }\n    public @java.lang.Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithDeprecated.BuilderWithDeprecatedBuilder clearStrings() {\n      if ((this.strings != null))\n          this.strings.clear();\n      return this;\n    }\n    public @java.lang.Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithDeprecated.BuilderWithDeprecatedBuilder number(final Integer number) {\n      if ((this.numbers == null))\n          this.numbers = com.google.common.collect.ImmutableList.builder();\n      this.numbers.add(number);\n      return this;\n    }\n    public @java.lang.Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithDeprecated.BuilderWithDeprecatedBuilder numbers(final java.lang.Iterable<? extends Integer> numbers) {\n      if ((numbers == null))\n          {\n            throw new java.lang.NullPointerException(\"numbers cannot be null\");\n          }\n      if ((this.numbers == null))\n          this.numbers = com.google.common.collect.ImmutableList.builder();\n      this.numbers.addAll(numbers);\n      return this;\n    }\n    public @java.lang.Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithDeprecated.BuilderWithDeprecatedBuilder clearNumbers() {\n      this.numbers = null;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithDeprecated build() {\n      java.util.List<String> strings;\n      switch (((this.strings == null) ? 0 : this.strings.size())) {\n      case 0 :\n          strings = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          strings = java.util.Collections.singletonList(this.strings.get(0));\n          break;\n      default :\n          strings = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.strings));\n      }\n      com.google.common.collect.ImmutableList<Integer> numbers = ((this.numbers == null) ? com.google.common.collect.ImmutableList.<Integer>of() : this.numbers.build());\n      return new BuilderWithDeprecated(this.dep1, this.dep2, strings, numbers);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((((\"BuilderWithDeprecated.BuilderWithDeprecatedBuilder(dep1=\" + this.dep1) + \", dep2=\") + this.dep2) + \", strings=\") + this.strings) + \", numbers=\") + this.numbers) + \")\");\n    }\n  }\n  String dep1;\n  @Deprecated int dep2;\n  @Singular @Deprecated java.util.List<String> strings;\n  @Singular @Deprecated ImmutableList<Integer> numbers;\n  /**\n   * Creates a new {@code BuilderWithDeprecated} instance.\n   *\n   * @param dep1 @deprecated since always\n   * @param dep2 \n   * @param strings \n   * @param numbers \n   */\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithDeprecated(final String dep1, final int dep2, final java.util.List<String> strings, final ImmutableList<Integer> numbers) {\n    super();\n    this.dep1 = dep1;\n    this.dep2 = dep2;\n    this.strings = strings;\n    this.numbers = numbers;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithDeprecated.BuilderWithDeprecatedBuilder builder() {\n    return new BuilderWithDeprecated.BuilderWithDeprecatedBuilder();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderWithDeprecatedAnnOnly.java",
    "content": "import com.google.common.collect.ImmutableList;\nimport lombok.Builder;\nimport lombok.Singular;\npublic @Builder class BuilderWithDeprecatedAnnOnly {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderWithDeprecatedAnnOnlyBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int dep1;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> strings;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.collect.ImmutableList.Builder<Integer> numbers;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithDeprecatedAnnOnlyBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithDeprecatedAnnOnly.BuilderWithDeprecatedAnnOnlyBuilder dep1(final int dep1) {\n      this.dep1 = dep1;\n      return this;\n    }\n    public @java.lang.Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithDeprecatedAnnOnly.BuilderWithDeprecatedAnnOnlyBuilder string(final String string) {\n      if ((this.strings == null))\n          this.strings = new java.util.ArrayList<String>();\n      this.strings.add(string);\n      return this;\n    }\n    public @java.lang.Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithDeprecatedAnnOnly.BuilderWithDeprecatedAnnOnlyBuilder strings(final java.util.Collection<? extends String> strings) {\n      if ((strings == null))\n          {\n            throw new java.lang.NullPointerException(\"strings cannot be null\");\n          }\n      if ((this.strings == null))\n          this.strings = new java.util.ArrayList<String>();\n      this.strings.addAll(strings);\n      return this;\n    }\n    public @java.lang.Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithDeprecatedAnnOnly.BuilderWithDeprecatedAnnOnlyBuilder clearStrings() {\n      if ((this.strings != null))\n          this.strings.clear();\n      return this;\n    }\n    public @java.lang.Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithDeprecatedAnnOnly.BuilderWithDeprecatedAnnOnlyBuilder number(final Integer number) {\n      if ((this.numbers == null))\n          this.numbers = com.google.common.collect.ImmutableList.builder();\n      this.numbers.add(number);\n      return this;\n    }\n    public @java.lang.Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithDeprecatedAnnOnly.BuilderWithDeprecatedAnnOnlyBuilder numbers(final java.lang.Iterable<? extends Integer> numbers) {\n      if ((numbers == null))\n          {\n            throw new java.lang.NullPointerException(\"numbers cannot be null\");\n          }\n      if ((this.numbers == null))\n          this.numbers = com.google.common.collect.ImmutableList.builder();\n      this.numbers.addAll(numbers);\n      return this;\n    }\n    public @java.lang.Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithDeprecatedAnnOnly.BuilderWithDeprecatedAnnOnlyBuilder clearNumbers() {\n      this.numbers = null;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithDeprecatedAnnOnly build() {\n      java.util.List<String> strings;\n      switch (((this.strings == null) ? 0 : this.strings.size())) {\n      case 0 :\n          strings = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          strings = java.util.Collections.singletonList(this.strings.get(0));\n          break;\n      default :\n          strings = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.strings));\n      }\n      com.google.common.collect.ImmutableList<Integer> numbers = ((this.numbers == null) ? com.google.common.collect.ImmutableList.<Integer>of() : this.numbers.build());\n      return new BuilderWithDeprecatedAnnOnly(this.dep1, strings, numbers);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((\"BuilderWithDeprecatedAnnOnly.BuilderWithDeprecatedAnnOnlyBuilder(dep1=\" + this.dep1) + \", strings=\") + this.strings) + \", numbers=\") + this.numbers) + \")\");\n    }\n  }\n  @Deprecated int dep1;\n  @Singular @Deprecated java.util.List<String> strings;\n  @Singular @Deprecated ImmutableList<Integer> numbers;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithDeprecatedAnnOnly(final int dep1, final java.util.List<String> strings, final ImmutableList<Integer> numbers) {\n    super();\n    this.dep1 = dep1;\n    this.strings = strings;\n    this.numbers = numbers;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithDeprecatedAnnOnly.BuilderWithDeprecatedAnnOnlyBuilder builder() {\n    return new BuilderWithDeprecatedAnnOnly.BuilderWithDeprecatedAnnOnlyBuilder();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderWithExistingBuilderClass.java",
    "content": "import lombok.Builder;\nclass BuilderWithExistingBuilderClass<T, K extends Number> {\n  public static class BuilderWithExistingBuilderClassBuilder<Z extends Number> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean arg2;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String arg3;\n    private Z arg1;\n    public void arg2(boolean arg) {\n    }\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithExistingBuilderClassBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithExistingBuilderClass.BuilderWithExistingBuilderClassBuilder<Z> arg1(final Z arg1) {\n      this.arg1 = arg1;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithExistingBuilderClass.BuilderWithExistingBuilderClassBuilder<Z> arg3(final String arg3) {\n      this.arg3 = arg3;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithExistingBuilderClass<String, Z> build() {\n      return BuilderWithExistingBuilderClass.<Z>staticMethod(this.arg1, this.arg2, this.arg3);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((\"BuilderWithExistingBuilderClass.BuilderWithExistingBuilderClassBuilder(arg1=\" + this.arg1) + \", arg2=\") + this.arg2) + \", arg3=\") + this.arg3) + \")\");\n    }\n  }\n  BuilderWithExistingBuilderClass() {\n    super();\n  }\n  public static @Builder <Z extends Number>BuilderWithExistingBuilderClass<String, Z> staticMethod(Z arg1, boolean arg2, String arg3) {\n    return null;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <Z extends Number>BuilderWithExistingBuilderClass.BuilderWithExistingBuilderClassBuilder<Z> builder() {\n    return new BuilderWithExistingBuilderClass.BuilderWithExistingBuilderClassBuilder<Z>();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderWithExistingBuilderClassWithSetterPrefix.java",
    "content": "import lombok.Builder;\nclass BuilderWithExistingBuilderClassWithSetterPrefix<T, K extends Number> {\n  public static class BuilderWithExistingBuilderClassWithSetterPrefixBuilder<Z extends Number> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean arg2;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String arg3;\n    private Z arg1;\n    public void withArg2(boolean arg) {\n    }\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithExistingBuilderClassWithSetterPrefixBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithExistingBuilderClassWithSetterPrefix.BuilderWithExistingBuilderClassWithSetterPrefixBuilder<Z> withArg1(final Z arg1) {\n      this.arg1 = arg1;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithExistingBuilderClassWithSetterPrefix.BuilderWithExistingBuilderClassWithSetterPrefixBuilder<Z> withArg3(final String arg3) {\n      this.arg3 = arg3;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithExistingBuilderClassWithSetterPrefix<String, Z> build() {\n      return BuilderWithExistingBuilderClassWithSetterPrefix.<Z>staticMethod(this.arg1, this.arg2, this.arg3);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((\"BuilderWithExistingBuilderClassWithSetterPrefix.BuilderWithExistingBuilderClassWithSetterPrefixBuilder(arg1=\" + this.arg1) + \", arg2=\") + this.arg2) + \", arg3=\") + this.arg3) + \")\");\n    }\n  }\n  BuilderWithExistingBuilderClassWithSetterPrefix() {\n    super();\n  }\n  public static @Builder(setterPrefix = \"with\") <Z extends Number>BuilderWithExistingBuilderClassWithSetterPrefix<String, Z> staticMethod(Z arg1, boolean arg2, String arg3) {\n    return null;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <Z extends Number>BuilderWithExistingBuilderClassWithSetterPrefix.BuilderWithExistingBuilderClassWithSetterPrefixBuilder<Z> builder() {\n    return new BuilderWithExistingBuilderClassWithSetterPrefix.BuilderWithExistingBuilderClassWithSetterPrefixBuilder<Z>();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderWithJavaBeansSpecCapitalization.java",
    "content": "@lombok.Builder(setterPrefix = \"set\") class BuilderWithJavaBeansSpecCapitalization {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderWithJavaBeansSpecCapitalizationBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> a;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> aField;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String bField;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithJavaBeansSpecCapitalizationBuilder() {\n      super();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithJavaBeansSpecCapitalization.BuilderWithJavaBeansSpecCapitalizationBuilder setZ(final String z) {\n      if ((this.a == null))\n          this.a = new java.util.ArrayList<String>();\n      this.a.add(z);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithJavaBeansSpecCapitalization.BuilderWithJavaBeansSpecCapitalizationBuilder setA(final java.util.Collection<? extends String> a) {\n      if ((a == null))\n          {\n            throw new java.lang.NullPointerException(\"a cannot be null\");\n          }\n      if ((this.a == null))\n          this.a = new java.util.ArrayList<String>();\n      this.a.addAll(a);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithJavaBeansSpecCapitalization.BuilderWithJavaBeansSpecCapitalizationBuilder clearA() {\n      if ((this.a != null))\n          this.a.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithJavaBeansSpecCapitalization.BuilderWithJavaBeansSpecCapitalizationBuilder setyField(final String yField) {\n      if ((this.aField == null))\n          this.aField = new java.util.ArrayList<String>();\n      this.aField.add(yField);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithJavaBeansSpecCapitalization.BuilderWithJavaBeansSpecCapitalizationBuilder setaField(final java.util.Collection<? extends String> aField) {\n      if ((aField == null))\n          {\n            throw new java.lang.NullPointerException(\"aField cannot be null\");\n          }\n      if ((this.aField == null))\n          this.aField = new java.util.ArrayList<String>();\n      this.aField.addAll(aField);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithJavaBeansSpecCapitalization.BuilderWithJavaBeansSpecCapitalizationBuilder clearaField() {\n      if ((this.aField != null))\n          this.aField.clear();\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithJavaBeansSpecCapitalization.BuilderWithJavaBeansSpecCapitalizationBuilder setbField(final String bField) {\n      this.bField = bField;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithJavaBeansSpecCapitalization build() {\n      java.util.List<String> a;\n      switch (((this.a == null) ? 0 : this.a.size())) {\n      case 0 :\n          a = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          a = java.util.Collections.singletonList(this.a.get(0));\n          break;\n      default :\n          a = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.a));\n      }\n      java.util.List<String> aField;\n      switch (((this.aField == null) ? 0 : this.aField.size())) {\n      case 0 :\n          aField = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          aField = java.util.Collections.singletonList(this.aField.get(0));\n          break;\n      default :\n          aField = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.aField));\n      }\n      return new BuilderWithJavaBeansSpecCapitalization(a, aField, this.bField);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((\"BuilderWithJavaBeansSpecCapitalization.BuilderWithJavaBeansSpecCapitalizationBuilder(a=\" + this.a) + \", aField=\") + this.aField) + \", bField=\") + this.bField) + \")\");\n    }\n  }\n  @lombok.Singular(\"z\") java.util.List<String> a;\n  @lombok.Singular(\"yField\") java.util.List<String> aField;\n  String bField;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithJavaBeansSpecCapitalization(final java.util.List<String> a, final java.util.List<String> aField, final String bField) {\n    super();\n    this.a = a;\n    this.aField = aField;\n    this.bField = bField;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithJavaBeansSpecCapitalization.BuilderWithJavaBeansSpecCapitalizationBuilder builder() {\n    return new BuilderWithJavaBeansSpecCapitalization.BuilderWithJavaBeansSpecCapitalizationBuilder();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderWithNoBuilderMethod.java",
    "content": "import lombok.Builder;\n@Builder(toBuilder = true,builderMethodName = \"\") class BuilderWithNoBuilderMethod {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderWithNoBuilderMethodBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String a;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithNoBuilderMethodBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithNoBuilderMethod.BuilderWithNoBuilderMethodBuilder a(final String a) {\n      this.a = a;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithNoBuilderMethod build() {\n      return new BuilderWithNoBuilderMethod(this.a);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"BuilderWithNoBuilderMethod.BuilderWithNoBuilderMethodBuilder(a=\" + this.a) + \")\");\n    }\n  }\n  private String a = \"\";\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithNoBuilderMethod(final String a) {\n    super();\n    this.a = a;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithNoBuilderMethod.BuilderWithNoBuilderMethodBuilder toBuilder() {\n    return new BuilderWithNoBuilderMethod.BuilderWithNoBuilderMethodBuilder().a(this.a);\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderWithNonNull.java",
    "content": "@lombok.Builder class BuilderWithNonNull {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderWithNonNullBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String id;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithNonNullBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithNonNull.BuilderWithNonNullBuilder id(final @lombok.NonNull String id) {\n      if ((id == null))\n          {\n            throw new java.lang.NullPointerException(\"id is marked non-null but is null\");\n          }\n      this.id = id;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithNonNull build() {\n      return new BuilderWithNonNull(this.id);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"BuilderWithNonNull.BuilderWithNonNullBuilder(id=\" + this.id) + \")\");\n    }\n  }\n  private final @lombok.NonNull String id;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithNonNull(final @lombok.NonNull String id) {\n    super();\n    if ((id == null))\n        {\n          throw new java.lang.NullPointerException(\"id is marked non-null but is null\");\n        }\n    this.id = id;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithNonNull.BuilderWithNonNullBuilder builder() {\n    return new BuilderWithNonNull.BuilderWithNonNullBuilder();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderWithNonNullWithSetterPrefix.java",
    "content": "@lombok.Builder(setterPrefix = \"with\") class BuilderWithNonNullWithSetterPrefix {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderWithNonNullWithSetterPrefixBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String id;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithNonNullWithSetterPrefixBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithNonNullWithSetterPrefix.BuilderWithNonNullWithSetterPrefixBuilder withId(final @lombok.NonNull String id) {\n      if ((id == null))\n          {\n            throw new java.lang.NullPointerException(\"id is marked non-null but is null\");\n          }\n      this.id = id;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithNonNullWithSetterPrefix build() {\n      return new BuilderWithNonNullWithSetterPrefix(this.id);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"BuilderWithNonNullWithSetterPrefix.BuilderWithNonNullWithSetterPrefixBuilder(id=\" + this.id) + \")\");\n    }\n  }\n  private final @lombok.NonNull String id;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithNonNullWithSetterPrefix(final @lombok.NonNull String id) {\n    super();\n    if ((id == null))\n        {\n          throw new java.lang.NullPointerException(\"id is marked non-null but is null\");\n        }\n    this.id = id;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithNonNullWithSetterPrefix.BuilderWithNonNullWithSetterPrefixBuilder builder() {\n    return new BuilderWithNonNullWithSetterPrefix.BuilderWithNonNullWithSetterPrefixBuilder();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderWithRecursiveGenerics.java",
    "content": "import java.util.Set;\nimport lombok.Builder;\nimport lombok.Value;\npublic class BuilderWithRecursiveGenerics {\n  interface Inter<T, U extends Inter<T, U>> {\n  }\n  public static final @Builder @Value class Test<Foo, Bar extends Set<Foo>, Quz extends Inter<Bar, Quz>> {\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class TestBuilder<Foo, Bar extends Set<Foo>, Quz extends Inter<Bar, Quz>> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated Foo foo;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated Bar bar;\n      @java.lang.SuppressWarnings(\"all\") @lombok.Generated TestBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithRecursiveGenerics.Test.TestBuilder<Foo, Bar, Quz> foo(final Foo foo) {\n        this.foo = foo;\n        return this;\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithRecursiveGenerics.Test.TestBuilder<Foo, Bar, Quz> bar(final Bar bar) {\n        this.bar = bar;\n        return this;\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithRecursiveGenerics.Test<Foo, Bar, Quz> build() {\n        return new BuilderWithRecursiveGenerics.Test<Foo, Bar, Quz>(this.foo, this.bar);\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((\"BuilderWithRecursiveGenerics.Test.TestBuilder(foo=\" + this.foo) + \", bar=\") + this.bar) + \")\");\n      }\n    }\n    private final Foo foo;\n    private final Bar bar;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated Test(final Foo foo, final Bar bar) {\n      super();\n      this.foo = foo;\n      this.bar = bar;\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <Foo, Bar extends Set<Foo>, Quz extends Inter<Bar, Quz>>BuilderWithRecursiveGenerics.Test.TestBuilder<Foo, Bar, Quz> builder() {\n      return new BuilderWithRecursiveGenerics.Test.TestBuilder<Foo, Bar, Quz>();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Foo getFoo() {\n      return this.foo;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Bar getBar() {\n      return this.bar;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n      if ((o == this))\n          return true;\n      if ((! (o instanceof BuilderWithRecursiveGenerics.Test)))\n          return false;\n      final BuilderWithRecursiveGenerics.Test<?, ?, ?> other = (BuilderWithRecursiveGenerics.Test<?, ?, ?>) o;\n      final java.lang.Object this$foo = this.getFoo();\n      final java.lang.Object other$foo = other.getFoo();\n      if (((this$foo == null) ? (other$foo != null) : (! this$foo.equals(other$foo))))\n          return false;\n      final java.lang.Object this$bar = this.getBar();\n      final java.lang.Object other$bar = other.getBar();\n      if (((this$bar == null) ? (other$bar != null) : (! this$bar.equals(other$bar))))\n          return false;\n      return true;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n      final int PRIME = 59;\n      int result = 1;\n      final java.lang.Object $foo = this.getFoo();\n      result = ((result * PRIME) + (($foo == null) ? 43 : $foo.hashCode()));\n      final java.lang.Object $bar = this.getBar();\n      result = ((result * PRIME) + (($bar == null) ? 43 : $bar.hashCode()));\n      return result;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((\"BuilderWithRecursiveGenerics.Test(foo=\" + this.getFoo()) + \", bar=\") + this.getBar()) + \")\");\n    }\n  }\n  public BuilderWithRecursiveGenerics() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderWithToBuilder.java",
    "content": "import java.util.List;\nimport lombok.Builder;\n@Builder(toBuilder = true) @lombok.experimental.Accessors(prefix = \"m\") class BuilderWithToBuilder<T> {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderWithToBuilderBuilder<T> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String one;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String two;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated T foo;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<T> bars;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithToBuilderBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithToBuilder.BuilderWithToBuilderBuilder<T> one(final String one) {\n      this.one = one;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithToBuilder.BuilderWithToBuilderBuilder<T> two(final String two) {\n      this.two = two;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithToBuilder.BuilderWithToBuilderBuilder<T> foo(final T foo) {\n      this.foo = foo;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithToBuilder.BuilderWithToBuilderBuilder<T> bar(final T bar) {\n      if ((this.bars == null))\n          this.bars = new java.util.ArrayList<T>();\n      this.bars.add(bar);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithToBuilder.BuilderWithToBuilderBuilder<T> bars(final java.util.Collection<? extends T> bars) {\n      if ((bars == null))\n          {\n            throw new java.lang.NullPointerException(\"bars cannot be null\");\n          }\n      if ((this.bars == null))\n          this.bars = new java.util.ArrayList<T>();\n      this.bars.addAll(bars);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithToBuilder.BuilderWithToBuilderBuilder<T> clearBars() {\n      if ((this.bars != null))\n          this.bars.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithToBuilder<T> build() {\n      java.util.List<T> bars;\n      switch (((this.bars == null) ? 0 : this.bars.size())) {\n      case 0 :\n          bars = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          bars = java.util.Collections.singletonList(this.bars.get(0));\n          break;\n      default :\n          bars = java.util.Collections.unmodifiableList(new java.util.ArrayList<T>(this.bars));\n      }\n      return new BuilderWithToBuilder<T>(this.one, this.two, this.foo, bars);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((((\"BuilderWithToBuilder.BuilderWithToBuilderBuilder(one=\" + this.one) + \", two=\") + this.two) + \", foo=\") + this.foo) + \", bars=\") + this.bars) + \")\");\n    }\n  }\n  private String mOne;\n  private String mTwo;\n  private @Builder.ObtainVia(method = \"rrr\",isStatic = true) T foo;\n  private @lombok.Singular List<T> bars;\n  public static <K>K rrr(BuilderWithToBuilder<K> x) {\n    return x.foo;\n  }\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithToBuilder(final String one, final String two, final T foo, final List<T> bars) {\n    super();\n    this.mOne = one;\n    this.mTwo = two;\n    this.foo = foo;\n    this.bars = bars;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <T>BuilderWithToBuilder.BuilderWithToBuilderBuilder<T> builder() {\n    return new BuilderWithToBuilder.BuilderWithToBuilderBuilder<T>();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithToBuilder.BuilderWithToBuilderBuilder<T> toBuilder() {\n    final T foo = BuilderWithToBuilder.<T>rrr(this);\n    final BuilderWithToBuilder.BuilderWithToBuilderBuilder<T> builder = new BuilderWithToBuilder.BuilderWithToBuilderBuilder<T>().one(this.mOne).two(this.mTwo).foo(foo);\n    if ((this.bars != null))\n        builder.bars(this.bars);\n    return builder;\n  }\n}\n@lombok.experimental.Accessors(prefix = \"m\") class ConstructorWithToBuilder<T> {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ConstructorWithToBuilderBuilder<T> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String mOne;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated T baz;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.collect.ImmutableList<T> bars;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorWithToBuilderBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorWithToBuilder.ConstructorWithToBuilderBuilder<T> mOne(final String mOne) {\n      this.mOne = mOne;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorWithToBuilder.ConstructorWithToBuilderBuilder<T> baz(final T baz) {\n      this.baz = baz;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorWithToBuilder.ConstructorWithToBuilderBuilder<T> bars(final com.google.common.collect.ImmutableList<T> bars) {\n      this.bars = bars;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorWithToBuilder<T> build() {\n      return new ConstructorWithToBuilder<T>(this.mOne, this.baz, this.bars);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((\"ConstructorWithToBuilder.ConstructorWithToBuilderBuilder(mOne=\" + this.mOne) + \", baz=\") + this.baz) + \", bars=\") + this.bars) + \")\");\n    }\n  }\n  private String mOne;\n  private String mTwo;\n  private T foo;\n  private @lombok.Singular com.google.common.collect.ImmutableList<T> bars;\n  public @Builder(toBuilder = true) ConstructorWithToBuilder(String mOne, @Builder.ObtainVia(field = \"foo\") T baz, com.google.common.collect.ImmutableList<T> bars) {\n    super();\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <T>ConstructorWithToBuilder.ConstructorWithToBuilderBuilder<T> builder() {\n    return new ConstructorWithToBuilder.ConstructorWithToBuilderBuilder<T>();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorWithToBuilder.ConstructorWithToBuilderBuilder<T> toBuilder() {\n    return new ConstructorWithToBuilder.ConstructorWithToBuilderBuilder<T>().mOne(this.mOne).baz(this.foo).bars(this.bars);\n  }\n}\nclass StaticMethodWithToBuilder<T> {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class StaticMethodWithToBuilderBuilder<T> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated T foo;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated StaticMethodWithToBuilderBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated StaticMethodWithToBuilder.StaticMethodWithToBuilderBuilder<T> foo(final T foo) {\n      this.foo = foo;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated StaticMethodWithToBuilder<T> build() {\n      return StaticMethodWithToBuilder.<T>of(this.foo);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"StaticMethodWithToBuilder.StaticMethodWithToBuilderBuilder(foo=\" + this.foo) + \")\");\n    }\n  }\n  private T foo;\n  public StaticMethodWithToBuilder(T foo) {\n    super();\n    this.foo = foo;\n  }\n  public static @Builder(toBuilder = true) <T>StaticMethodWithToBuilder<T> of(T foo) {\n    return new StaticMethodWithToBuilder<T>(foo);\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <T>StaticMethodWithToBuilder.StaticMethodWithToBuilderBuilder<T> builder() {\n    return new StaticMethodWithToBuilder.StaticMethodWithToBuilderBuilder<T>();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated StaticMethodWithToBuilder.StaticMethodWithToBuilderBuilder<T> toBuilder() {\n    return new StaticMethodWithToBuilder.StaticMethodWithToBuilderBuilder<T>().foo(this.foo);\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/BuilderWithTolerate.java",
    "content": "import lombok.Builder;\nimport lombok.experimental.Tolerate;\npublic @Builder class BuilderWithTolerate {\n  public static class BuilderWithTolerateBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int value;\n    public @Tolerate BuilderWithTolerateBuilder value(String s) {\n      return this.value(Integer.parseInt(s));\n    }\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithTolerateBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithTolerate.BuilderWithTolerateBuilder value(final int value) {\n      this.value = value;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithTolerate build() {\n      return new BuilderWithTolerate(this.value);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"BuilderWithTolerate.BuilderWithTolerateBuilder(value=\" + this.value) + \")\");\n    }\n  }\n  private final int value;\n  public static void main(String[] args) {\n    BuilderWithTolerate.builder().value(\"42\").build();\n  }\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithTolerate(final int value) {\n    super();\n    this.value = value;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated BuilderWithTolerate.BuilderWithTolerateBuilder builder() {\n    return new BuilderWithTolerate.BuilderWithTolerateBuilder();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/CheckerFrameworkBasic.java",
    "content": "import lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.experimental.Accessors;\nimport lombok.With;\n@Data @AllArgsConstructor @Accessors(chain = true) class CheckerFrameworkBasic {\n  private final @With int x;\n  private final int y;\n  private int z;\n  /**\n   * @return {@code this}.\n   */\n  public @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings(\"all\") @lombok.Generated CheckerFrameworkBasic withX(final int x) {\n    return ((this.x == x) ? this : new CheckerFrameworkBasic(x, this.y, this.z));\n  }\n  public @org.checkerframework.dataflow.qual.Pure @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getX() {\n    return this.x;\n  }\n  public @org.checkerframework.dataflow.qual.Pure @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getY() {\n    return this.y;\n  }\n  public @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getZ() {\n    return this.z;\n  }\n  /**\n   * @return {@code this}.\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated @org.checkerframework.common.returnsreceiver.qual.This CheckerFrameworkBasic setZ(final int z) {\n    this.z = z;\n    return this;\n  }\n  public @java.lang.Override @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof CheckerFrameworkBasic)))\n        return false;\n    final CheckerFrameworkBasic other = (CheckerFrameworkBasic) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((this.getX() != other.getX()))\n        return false;\n    if ((this.getY() != other.getY()))\n        return false;\n    if ((this.getZ() != other.getZ()))\n        return false;\n    return true;\n  }\n  protected @org.checkerframework.dataflow.qual.Pure @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof CheckerFrameworkBasic);\n  }\n  public @java.lang.Override @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.getX());\n    result = ((result * PRIME) + this.getY());\n    result = ((result * PRIME) + this.getZ());\n    return result;\n  }\n  public @java.lang.Override @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((((((\"CheckerFrameworkBasic(x=\" + this.getX()) + \", y=\") + this.getY()) + \", z=\") + this.getZ()) + \")\");\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated CheckerFrameworkBasic(final int x, final int y, final int z) {\n    super();\n    this.x = x;\n    this.y = y;\n    this.z = z;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/CheckerFrameworkBuilder.java",
    "content": "import java.util.List;\nimport lombok.Builder;\nimport lombok.Singular;\n@Builder class CheckerFrameworkBuilder {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class CheckerFrameworkBuilderBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int x$value;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean x$set;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int y;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int z;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> names;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated CheckerFrameworkBuilderBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated CheckerFrameworkBuilder.@org.checkerframework.common.returnsreceiver.qual.This CheckerFrameworkBuilderBuilder x(final int x) {\n      this.x$value = x;\n      x$set = true;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated CheckerFrameworkBuilder.@org.checkerframework.common.returnsreceiver.qual.This CheckerFrameworkBuilderBuilder y(final int y) {\n      this.y = y;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated CheckerFrameworkBuilder.@org.checkerframework.common.returnsreceiver.qual.This CheckerFrameworkBuilderBuilder z(final int z) {\n      this.z = z;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated CheckerFrameworkBuilder.@org.checkerframework.common.returnsreceiver.qual.This CheckerFrameworkBuilderBuilder name(final String name) {\n      if ((this.names == null))\n          this.names = new java.util.ArrayList<String>();\n      this.names.add(name);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated CheckerFrameworkBuilder.@org.checkerframework.common.returnsreceiver.qual.This CheckerFrameworkBuilderBuilder names(final java.util.Collection<? extends String> names) {\n      if ((names == null))\n          {\n            throw new java.lang.NullPointerException(\"names cannot be null\");\n          }\n      if ((this.names == null))\n          this.names = new java.util.ArrayList<String>();\n      this.names.addAll(names);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated CheckerFrameworkBuilder.@org.checkerframework.common.returnsreceiver.qual.This CheckerFrameworkBuilderBuilder clearNames() {\n      if ((this.names != null))\n          this.names.clear();\n      return this;\n    }\n    public @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings(\"all\") @lombok.Generated CheckerFrameworkBuilder build(CheckerFrameworkBuilder.@org.checkerframework.checker.calledmethods.qual.CalledMethods({\"y\", \"z\"}) CheckerFrameworkBuilderBuilder this) {\n      java.util.List<String> names;\n      switch (((this.names == null) ? 0 : this.names.size())) {\n      case 0 :\n          names = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          names = java.util.Collections.singletonList(this.names.get(0));\n          break;\n      default :\n          names = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.names));\n      }\n      int x$value = this.x$value;\n      if ((! this.x$set))\n          x$value = CheckerFrameworkBuilder.$default$x();\n      return new CheckerFrameworkBuilder(x$value, this.y, this.z, names);\n    }\n    public @java.lang.Override @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((((\"CheckerFrameworkBuilder.CheckerFrameworkBuilderBuilder(x$value=\" + this.x$value) + \", y=\") + this.y) + \", z=\") + this.z) + \", names=\") + this.names) + \")\");\n    }\n  }\n  @Builder.Default int x;\n  int y;\n  int z;\n  @Singular List<String> names;\n  private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated int $default$x() {\n    return 5;\n  }\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated CheckerFrameworkBuilder(final int x, final int y, final int z, final List<String> names) {\n    super();\n    this.x = x;\n    this.y = y;\n    this.z = z;\n    this.names = names;\n  }\n  public static @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings(\"all\") @lombok.Generated CheckerFrameworkBuilder.@org.checkerframework.common.aliasing.qual.Unique CheckerFrameworkBuilderBuilder builder() {\n    return new CheckerFrameworkBuilder.CheckerFrameworkBuilderBuilder();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/CheckerFrameworkSuperBuilder.java",
    "content": "import java.util.List;\nimport lombok.Singular;\nclass CheckerFrameworkSuperBuilder {\n  public static @lombok.experimental.SuperBuilder class Parent {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilder<C extends CheckerFrameworkSuperBuilder.Parent, B extends CheckerFrameworkSuperBuilder.Parent.ParentBuilder<C, B>> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int x$value;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean x$set;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int y;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int z;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> names;\n      public ParentBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated @org.checkerframework.common.returnsreceiver.qual.This B x(final int x) {\n        this.x$value = x;\n        x$set = true;\n        return self();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated @org.checkerframework.common.returnsreceiver.qual.This B y(final int y) {\n        this.y = y;\n        return self();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated @org.checkerframework.common.returnsreceiver.qual.This B z(final int z) {\n        this.z = z;\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated @org.checkerframework.common.returnsreceiver.qual.This B name(final String name) {\n        if ((this.names == null))\n            this.names = new java.util.ArrayList<String>();\n        this.names.add(name);\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated @org.checkerframework.common.returnsreceiver.qual.This B names(final java.util.Collection<? extends String> names) {\n        if ((names == null))\n            {\n              throw new java.lang.NullPointerException(\"names cannot be null\");\n            }\n        if ((this.names == null))\n            this.names = new java.util.ArrayList<String>();\n        this.names.addAll(names);\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated @org.checkerframework.common.returnsreceiver.qual.This B clearNames() {\n        if ((this.names != null))\n            this.names.clear();\n        return self();\n      }\n      protected abstract @org.checkerframework.dataflow.qual.Pure @java.lang.SuppressWarnings(\"all\") @lombok.Generated @org.checkerframework.common.returnsreceiver.qual.This B self();\n      public abstract @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build(CheckerFrameworkSuperBuilder.Parent. @org.checkerframework.checker.calledmethods.qual.CalledMethods({\"y\", \"z\"}) ParentBuilder<C, B> this);\n      public @java.lang.Override @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((((((\"CheckerFrameworkSuperBuilder.Parent.ParentBuilder(x$value=\" + this.x$value) + \", y=\") + this.y) + \", z=\") + this.z) + \", names=\") + this.names) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilderImpl extends CheckerFrameworkSuperBuilder.Parent.ParentBuilder<CheckerFrameworkSuperBuilder.Parent, CheckerFrameworkSuperBuilder.Parent.ParentBuilderImpl> {\n      private ParentBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @org.checkerframework.dataflow.qual.Pure @java.lang.SuppressWarnings(\"all\") @lombok.Generated CheckerFrameworkSuperBuilder.Parent.@org.checkerframework.common.returnsreceiver.qual.This ParentBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings(\"all\") @lombok.Generated CheckerFrameworkSuperBuilder.Parent build(CheckerFrameworkSuperBuilder.Parent.@org.checkerframework.checker.calledmethods.qual.CalledMethods({\"y\", \"z\"}) ParentBuilderImpl this) {\n        return new CheckerFrameworkSuperBuilder.Parent(this);\n      }\n    }\n    @lombok.Builder.Default int x;\n    int y;\n    int z;\n    @Singular List<String> names;\n    private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated int $default$x() {\n      return 5;\n    }\n    protected @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings(\"all\") @lombok.Generated Parent(final CheckerFrameworkSuperBuilder.Parent.ParentBuilder<?, ?> b) {\n      super();\n      if (b.x$set)\n          this.x = b.x$value;\n      else\n          this.x = CheckerFrameworkSuperBuilder.Parent.$default$x();\n      this.y = b.y;\n      this.z = b.z;\n      java.util.List<String> names;\n      switch (((b.names == null) ? 0 : b.names.size())) {\n      case 0 :\n          names = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          names = java.util.Collections.singletonList(b.names.get(0));\n          break;\n      default :\n          names = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(b.names));\n      }\n      this.names = names;\n    }\n    public static @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings(\"all\") @lombok.Generated CheckerFrameworkSuperBuilder.Parent. @org.checkerframework.common.aliasing.qual.Unique ParentBuilder<?, ?> builder() {\n      return new CheckerFrameworkSuperBuilder.Parent.ParentBuilderImpl();\n    }\n  }\n  public static @lombok.experimental.SuperBuilder class ZChild extends Parent {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ZChildBuilder<C extends CheckerFrameworkSuperBuilder.ZChild, B extends CheckerFrameworkSuperBuilder.ZChild.ZChildBuilder<C, B>> extends Parent.ParentBuilder<C, B> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int a$value;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean a$set;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int b;\n      public ZChildBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated @org.checkerframework.common.returnsreceiver.qual.This B a(final int a) {\n        this.a$value = a;\n        a$set = true;\n        return self();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated @org.checkerframework.common.returnsreceiver.qual.This B b(final int b) {\n        this.b = b;\n        return self();\n      }\n      protected abstract @java.lang.Override @org.checkerframework.dataflow.qual.Pure @java.lang.SuppressWarnings(\"all\") @lombok.Generated @org.checkerframework.common.returnsreceiver.qual.This B self();\n      public abstract @java.lang.Override @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build(CheckerFrameworkSuperBuilder.ZChild. @org.checkerframework.checker.calledmethods.qual.CalledMethods(\"b\") ZChildBuilder<C, B> this);\n      public @java.lang.Override @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((((\"CheckerFrameworkSuperBuilder.ZChild.ZChildBuilder(super=\" + super.toString()) + \", a$value=\") + this.a$value) + \", b=\") + this.b) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ZChildBuilderImpl extends CheckerFrameworkSuperBuilder.ZChild.ZChildBuilder<CheckerFrameworkSuperBuilder.ZChild, CheckerFrameworkSuperBuilder.ZChild.ZChildBuilderImpl> {\n      private ZChildBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @org.checkerframework.dataflow.qual.Pure @java.lang.SuppressWarnings(\"all\") @lombok.Generated CheckerFrameworkSuperBuilder.ZChild.@org.checkerframework.common.returnsreceiver.qual.This ZChildBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings(\"all\") @lombok.Generated CheckerFrameworkSuperBuilder.ZChild build(CheckerFrameworkSuperBuilder.ZChild.@org.checkerframework.checker.calledmethods.qual.CalledMethods(\"b\") ZChildBuilderImpl this) {\n        return new CheckerFrameworkSuperBuilder.ZChild(this);\n      }\n    }\n    @lombok.Builder.Default int a;\n    int b;\n    private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated int $default$a() {\n      return 1;\n    }\n    protected @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings(\"all\") @lombok.Generated ZChild(final CheckerFrameworkSuperBuilder.ZChild.ZChildBuilder<?, ?> b) {\n      super(b);\n      if (b.a$set)\n          this.a = b.a$value;\n      else\n          this.a = CheckerFrameworkSuperBuilder.ZChild.$default$a();\n      this.b = b.b;\n    }\n    public static @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings(\"all\") @lombok.Generated CheckerFrameworkSuperBuilder.ZChild. @org.checkerframework.common.aliasing.qual.Unique ZChildBuilder<?, ?> builder() {\n      return new CheckerFrameworkSuperBuilder.ZChild.ZChildBuilderImpl();\n    }\n  }\n  CheckerFrameworkSuperBuilder() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ClassNamedAfterGetter.java",
    "content": "class GetFoo {\n  private @lombok.Getter int foo;\n  GetFoo() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getFoo() {\n    return this.foo;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/CleanupName.java",
    "content": "class CleanupName {\n  CleanupName() {\n    super();\n  }\n  void test() {\n    @lombok.Cleanup(\"toString\") Object o = \"Hello World!\";\n    try \n      {\n        System.out.println(o);\n      }\n    finally\n      {\n        if ((java.util.Collections.singletonList(o).get(0) != null))\n            {\n              o.toString();\n            }\n      }\n  }\n  void test2() {\n    @lombok.Cleanup(value = \"toString\") Object o = \"Hello World too!\";\n    try \n      {\n        System.out.println(o);\n      }\n    finally\n      {\n        if ((java.util.Collections.singletonList(o).get(0) != null))\n            {\n              o.toString();\n            }\n      }\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/CleanupPlain.java",
    "content": "import lombok.Cleanup;\nimport java.io.*;\nclass CleanupPlain {\n  CleanupPlain() {\n    super();\n  }\n  void test() throws Exception {\n    @lombok.Cleanup InputStream in = new FileInputStream(\"in\");\n    try \n      {\n        @Cleanup OutputStream out = new FileOutputStream(\"out\");\n        try \n          {\n            if (in.markSupported())\n                {\n                  out.flush();\n                }\n          }\n        finally\n          {\n            if ((java.util.Collections.singletonList(out).get(0) != null))\n                {\n                  out.close();\n                }\n          }\n      }\n    finally\n      {\n        if ((java.util.Collections.singletonList(in).get(0) != null))\n            {\n              in.close();\n            }\n      }\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/CommentsInterspersed.java",
    "content": "import lombok.Getter;\npublic class CommentsInterspersed {\n  private int x;\n  private @Getter String test = \"foo\";\n  public CommentsInterspersed() {\n    super();\n  }\n  public native void gwtTest();\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getTest() {\n    return this.test;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ConflictingStaticConstructorNames.java",
    "content": "@lombok.Data(staticConstructor = \"of\") @lombok.NoArgsConstructor class ConflictingStaticConstructorNames {\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof ConflictingStaticConstructorNames)))\n        return false;\n    final ConflictingStaticConstructorNames other = (ConflictingStaticConstructorNames) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof ConflictingStaticConstructorNames);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int result = 1;\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return \"ConflictingStaticConstructorNames()\";\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConflictingStaticConstructorNames() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ConstructorInner.java",
    "content": "class ConstructorInner {\n  static @lombok.AllArgsConstructor(staticName = \"of\") class Inner {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated Inner() {\n      super();\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorInner.Inner of() {\n      return new ConstructorInner.Inner();\n    }\n  }\n  ConstructorInner() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ConstructorJavadoc.java",
    "content": "import lombok.AllArgsConstructor;\npublic @AllArgsConstructor class ConstructorJavadoc {\n  private int fieldName;\n  private int fieldName2;\n  /**\n   * Creates a new {@code ConstructorJavadoc} instance.\n   * \n   * @param fieldName Hello, World1\n   * @param fieldName2 Sky is blue\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorJavadoc(final int fieldName, final int fieldName2) {\n    super();\n    this.fieldName = fieldName;\n    this.fieldName2 = fieldName2;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/Constructors.java",
    "content": "@lombok.RequiredArgsConstructor class RequiredArgsConstructor1 {\n  final int x;\n  String name;\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated RequiredArgsConstructor1(final int x) {\n    super();\n    this.x = x;\n  }\n}\n@lombok.RequiredArgsConstructor(access = lombok.AccessLevel.PROTECTED) class RequiredArgsConstructorAccess {\n  final int x;\n  String name;\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated RequiredArgsConstructorAccess(final int x) {\n    super();\n    this.x = x;\n  }\n}\n@lombok.RequiredArgsConstructor(staticName = \"staticname\") class RequiredArgsConstructorStaticName {\n  final int x;\n  String name;\n  private @java.lang.SuppressWarnings(\"all\") @lombok.Generated RequiredArgsConstructorStaticName(final int x) {\n    super();\n    this.x = x;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated RequiredArgsConstructorStaticName staticname(final int x) {\n    return new RequiredArgsConstructorStaticName(x);\n  }\n}\n@lombok.RequiredArgsConstructor() class RequiredArgsConstructorWithAnnotations {\n  final int x;\n  String name;\n  public @Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated RequiredArgsConstructorWithAnnotations(final int x) {\n    super();\n    this.x = x;\n  }\n}\n@lombok.AllArgsConstructor class AllArgsConstructor1 {\n  final int x;\n  String name;\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated AllArgsConstructor1(final int x, final String name) {\n    super();\n    this.x = x;\n    this.name = name;\n  }\n}\n@lombok.NoArgsConstructor class NoArgsConstructor1 {\n  int x;\n  String name;\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated NoArgsConstructor1() {\n    super();\n  }\n}\n@lombok.RequiredArgsConstructor(staticName = \"of\") class RequiredArgsConstructorStaticNameGenerics<T extends Number> {\n  final T x;\n  String name;\n  private @java.lang.SuppressWarnings(\"all\") @lombok.Generated RequiredArgsConstructorStaticNameGenerics(final T x) {\n    super();\n    this.x = x;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <T extends Number>RequiredArgsConstructorStaticNameGenerics<T> of(final T x) {\n    return new RequiredArgsConstructorStaticNameGenerics<T>(x);\n  }\n}\n@lombok.RequiredArgsConstructor(staticName = \"of\") class RequiredArgsConstructorStaticNameGenerics2<T extends Number> {\n  final Class<T> x;\n  String name;\n  private @java.lang.SuppressWarnings(\"all\") @lombok.Generated RequiredArgsConstructorStaticNameGenerics2(final Class<T> x) {\n    super();\n    this.x = x;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <T extends Number>RequiredArgsConstructorStaticNameGenerics2<T> of(final Class<T> x) {\n    return new RequiredArgsConstructorStaticNameGenerics2<T>(x);\n  }\n}\n@lombok.AllArgsConstructor(access = lombok.AccessLevel.PACKAGE) class AllArgsConstructorPackageAccess {\n  final String x;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated AllArgsConstructorPackageAccess(final String x) {\n    super();\n    this.x = x;\n  }\n}\n@lombok.NoArgsConstructor(force = true) class NoArgsConstructor2 {\n  final int x;\n  final double y;\n  final char c;\n  final boolean b;\n  final float f;\n  final String s;\n  byte z;\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated NoArgsConstructor2() {\n    super();\n    this.x = 0;\n    this.y = 0D;\n    this.c = '\\0';\n    this.b = false;\n    this.f = 0F;\n    this.s = null;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ConstructorsConfiguration.java",
    "content": "@lombok.AllArgsConstructor class ConstructorsConfiguration {\n  int x;\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorsConfiguration(final int x) {\n    super();\n    this.x = x;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ConstructorsInAnonymousClass.java",
    "content": "import lombok.AllArgsConstructor;\nimport lombok.NoArgsConstructor;\nimport lombok.NonNull;\nimport lombok.RequiredArgsConstructor;\npublic class ConstructorsInAnonymousClass {\n  Object annonymous = new Object() {\n    @AllArgsConstructor @RequiredArgsConstructor @NoArgsConstructor class Inner {\n      private String string;\n      private @NonNull String string2;\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Inner(final String string, final @NonNull String string2) {\n        super();\n        if ((string2 == null))\n            {\n              throw new java.lang.NullPointerException(\"string2 is marked non-null but is null\");\n            }\n        this.string = string;\n        this.string2 = string2;\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Inner(final @NonNull String string2) {\n        super();\n        if ((string2 == null))\n            {\n              throw new java.lang.NullPointerException(\"string2 is marked non-null but is null\");\n            }\n        this.string2 = string2;\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Inner() {\n        super();\n      }\n    }\n    x() {\n      super();\n    }\n  };\n  public ConstructorsInAnonymousClass() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ConstructorsOnRecord.java",
    "content": "// version 14:\nimport lombok.AllArgsConstructor;\nimport lombok.NoArgsConstructor;\nimport lombok.RequiredArgsConstructor;\npublic @AllArgsConstructor @RequiredArgsConstructor @NoArgsConstructor record ConstructorsOnRecord(String a, String b) {\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ConstructorsTypeAnnos.java",
    "content": "import java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.List;\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER}) @interface TA {\n}\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER}) @interface TB {\n}\n@lombok.AllArgsConstructor class ConstructorsTypeAnnos {\n  @TA @TB List<String> foo;\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorsTypeAnnos(final @TA List<String> foo) {\n    super();\n    this.foo = foo;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ConstructorsWithAccessors.java",
    "content": "@lombok.AllArgsConstructor @lombok.experimental.Accessors(prefix = {\"p\", \"_\"}) class ConstructorsWithAccessors {\n  int plower;\n  int pUpper;\n  int _huh;\n  int __huh2;\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorsWithAccessors(final int plower, final int upper, final int huh, final int _huh2) {\n    super();\n    this.plower = plower;\n    this.pUpper = upper;\n    this._huh = huh;\n    this.__huh2 = _huh2;\n  }\n}\n@lombok.AllArgsConstructor @lombok.experimental.Accessors(prefix = {\"p\", \"_\"}) class ConstructorsWithAccessorsNonNull {\n  @lombok.NonNull Integer plower;\n  @lombok.NonNull Integer pUpper;\n  @lombok.NonNull Integer _huh;\n  final @lombok.NonNull Integer __huh2;\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorsWithAccessorsNonNull(final @lombok.NonNull Integer plower, final @lombok.NonNull Integer upper, final @lombok.NonNull Integer huh, final @lombok.NonNull Integer _huh2) {\n    super();\n    if ((plower == null))\n        {\n          throw new java.lang.NullPointerException(\"plower is marked non-null but is null\");\n        }\n    if ((upper == null))\n        {\n          throw new java.lang.NullPointerException(\"upper is marked non-null but is null\");\n        }\n    if ((huh == null))\n        {\n          throw new java.lang.NullPointerException(\"huh is marked non-null but is null\");\n        }\n    if ((_huh2 == null))\n        {\n          throw new java.lang.NullPointerException(\"_huh2 is marked non-null but is null\");\n        }\n    this.plower = plower;\n    this.pUpper = upper;\n    this._huh = huh;\n    this.__huh2 = _huh2;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ConstructorsWithBuilderDefaults.java",
    "content": "import lombok.AllArgsConstructor;\nimport lombok.NoArgsConstructor;\nimport lombok.Value;\nimport lombok.Builder;\nfinal @NoArgsConstructor(force = true) @AllArgsConstructor @Builder @Value class ConstructorsWithBuilderDefaults {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ConstructorsWithBuilderDefaultsBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int x$value;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean x$set;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int y;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorsWithBuilderDefaultsBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder x(final int x) {\n      this.x$value = x;\n      x$set = true;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder y(final int y) {\n      this.y = y;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorsWithBuilderDefaults build() {\n      int x$value = this.x$value;\n      if ((! this.x$set))\n          x$value = ConstructorsWithBuilderDefaults.$default$x();\n      return new ConstructorsWithBuilderDefaults(x$value, this.y);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((\"ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder(x$value=\" + this.x$value) + \", y=\") + this.y) + \")\");\n    }\n  }\n  private final @Builder.Default int x;\n  private final int y;\n  private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated int $default$x() {\n    return 5;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder builder() {\n    return new ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getX() {\n    return this.x;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getY() {\n    return this.y;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof ConstructorsWithBuilderDefaults)))\n        return false;\n    final ConstructorsWithBuilderDefaults other = (ConstructorsWithBuilderDefaults) o;\n    if ((this.getX() != other.getX()))\n        return false;\n    if ((this.getY() != other.getY()))\n        return false;\n    return true;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.getX());\n    result = ((result * PRIME) + this.getY());\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((((\"ConstructorsWithBuilderDefaults(x=\" + this.getX()) + \", y=\") + this.getY()) + \")\");\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorsWithBuilderDefaults() {\n    super();\n    this.y = 0;\n    this.x = ConstructorsWithBuilderDefaults.$default$x();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorsWithBuilderDefaults(final int x, final int y) {\n    super();\n    this.x = x;\n    this.y = y;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ConstructorsWithBuilderDefaults2.java",
    "content": "import lombok.NoArgsConstructor;\nimport lombok.Value;\nimport lombok.Builder;\nfinal @Builder @Value class ConstructorsWithBuilderDefaults<T> {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ConstructorsWithBuilderDefaultsBuilder<T> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.List<T> z$value;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean z$set;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated T x$value;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean x$set;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated T q;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorsWithBuilderDefaultsBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder<T> z(final java.util.List<T> z) {\n      this.z$value = z;\n      z$set = true;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder<T> x(final T x) {\n      this.x$value = x;\n      x$set = true;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder<T> q(final T q) {\n      this.q = q;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorsWithBuilderDefaults<T> build() {\n      java.util.List<T> z$value = this.z$value;\n      if ((! this.z$set))\n          z$value = ConstructorsWithBuilderDefaults.<T>$default$z();\n      T x$value = this.x$value;\n      if ((! this.x$set))\n          x$value = ConstructorsWithBuilderDefaults.<T>$default$x();\n      return new ConstructorsWithBuilderDefaults<T>(z$value, x$value, this.q);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((\"ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder(z$value=\" + this.z$value) + \", x$value=\") + this.x$value) + \", q=\") + this.q) + \")\");\n    }\n  }\n  private final @Builder.Default java.util.List<T> z;\n  private final @Builder.Default T x;\n  private final T q;\n  private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <T>java.util.List<T> $default$z() {\n    return new java.util.ArrayList<T>();\n  }\n  private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <T>T $default$x() {\n    return null;\n  }\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorsWithBuilderDefaults(final java.util.List<T> z, final T x, final T q) {\n    super();\n    this.z = z;\n    this.x = x;\n    this.q = q;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <T>ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder<T> builder() {\n    return new ConstructorsWithBuilderDefaults.ConstructorsWithBuilderDefaultsBuilder<T>();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.List<T> getZ() {\n    return this.z;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated T getX() {\n    return this.x;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated T getQ() {\n    return this.q;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof ConstructorsWithBuilderDefaults)))\n        return false;\n    final ConstructorsWithBuilderDefaults<?> other = (ConstructorsWithBuilderDefaults<?>) o;\n    final java.lang.Object this$z = this.getZ();\n    final java.lang.Object other$z = other.getZ();\n    if (((this$z == null) ? (other$z != null) : (! this$z.equals(other$z))))\n        return false;\n    final java.lang.Object this$x = this.getX();\n    final java.lang.Object other$x = other.getX();\n    if (((this$x == null) ? (other$x != null) : (! this$x.equals(other$x))))\n        return false;\n    final java.lang.Object this$q = this.getQ();\n    final java.lang.Object other$q = other.getQ();\n    if (((this$q == null) ? (other$q != null) : (! this$q.equals(other$q))))\n        return false;\n    return true;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    final java.lang.Object $z = this.getZ();\n    result = ((result * PRIME) + (($z == null) ? 43 : $z.hashCode()));\n    final java.lang.Object $x = this.getX();\n    result = ((result * PRIME) + (($x == null) ? 43 : $x.hashCode()));\n    final java.lang.Object $q = this.getQ();\n    result = ((result * PRIME) + (($q == null) ? 43 : $q.hashCode()));\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((((((\"ConstructorsWithBuilderDefaults(z=\" + this.getZ()) + \", x=\") + this.getX()) + \", q=\") + this.getQ()) + \")\");\n  }\n  private @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorsWithBuilderDefaults() {\n    super();\n    this.q = null;\n    this.z = ConstructorsWithBuilderDefaults.$default$z();\n    this.x = ConstructorsWithBuilderDefaults.$default$x();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ConstructorsWithSuperBuilderDefaults.java",
    "content": "import lombok.AllArgsConstructor;\nimport lombok.NoArgsConstructor;\nimport lombok.experimental.SuperBuilder;\nimport lombok.Builder;\n@NoArgsConstructor @AllArgsConstructor @SuperBuilder class ConstructorsWithSuperBuilderDefaults {\n  public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ConstructorsWithSuperBuilderDefaultsBuilder<C extends ConstructorsWithSuperBuilderDefaults, B extends ConstructorsWithSuperBuilderDefaults.ConstructorsWithSuperBuilderDefaultsBuilder<C, B>> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int x$value;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean x$set;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int y;\n    public ConstructorsWithSuperBuilderDefaultsBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B x(final int x) {\n      this.x$value = x;\n      x$set = true;\n      return self();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B y(final int y) {\n      this.y = y;\n      return self();\n    }\n    protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n    public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((\"ConstructorsWithSuperBuilderDefaults.ConstructorsWithSuperBuilderDefaultsBuilder(x$value=\" + this.x$value) + \", y=\") + this.y) + \")\");\n    }\n  }\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ConstructorsWithSuperBuilderDefaultsBuilderImpl extends ConstructorsWithSuperBuilderDefaults.ConstructorsWithSuperBuilderDefaultsBuilder<ConstructorsWithSuperBuilderDefaults, ConstructorsWithSuperBuilderDefaults.ConstructorsWithSuperBuilderDefaultsBuilderImpl> {\n    private ConstructorsWithSuperBuilderDefaultsBuilderImpl() {\n      super();\n    }\n    protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorsWithSuperBuilderDefaults.ConstructorsWithSuperBuilderDefaultsBuilderImpl self() {\n      return this;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorsWithSuperBuilderDefaults build() {\n      return new ConstructorsWithSuperBuilderDefaults(this);\n    }\n  }\n  @Builder.Default int x;\n  int y;\n  private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated int $default$x() {\n    return 5;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorsWithSuperBuilderDefaults(final ConstructorsWithSuperBuilderDefaults.ConstructorsWithSuperBuilderDefaultsBuilder<?, ?> b) {\n    super();\n    if (b.x$set)\n        this.x = b.x$value;\n    else\n        this.x = ConstructorsWithSuperBuilderDefaults.$default$x();\n    this.y = b.y;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorsWithSuperBuilderDefaults.ConstructorsWithSuperBuilderDefaultsBuilder<?, ?> builder() {\n    return new ConstructorsWithSuperBuilderDefaults.ConstructorsWithSuperBuilderDefaultsBuilderImpl();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorsWithSuperBuilderDefaults() {\n    super();\n    this.x = ConstructorsWithSuperBuilderDefaults.$default$x();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated ConstructorsWithSuperBuilderDefaults(final int x, final int y) {\n    super();\n    this.x = x;\n    this.y = y;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/DataConfiguration.java",
    "content": "@lombok.Data class DataConfiguration {\n  final int x;\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getX() {\n    return this.x;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof DataConfiguration)))\n        return false;\n    final DataConfiguration other = (DataConfiguration) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((this.x != other.x))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof DataConfiguration);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.x);\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((\"DataConfiguration(x=\" + this.x) + \")\");\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated DataConfiguration(final int x) {\n    super();\n    this.x = x;\n  }\n  private @java.lang.SuppressWarnings(\"all\") @lombok.Generated DataConfiguration() {\n    super();\n    this.x = 0;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/DataExtended.java",
    "content": "@lombok.Data @lombok.ToString(doNotUseGetters = true) class DataExtended {\n  int x;\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getX() {\n    return this.x;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setX(final int x) {\n    this.x = x;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof DataExtended)))\n        return false;\n    final DataExtended other = (DataExtended) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((this.getX() != other.getX()))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof DataExtended);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.getX());\n    return result;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated DataExtended() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((\"DataExtended(x=\" + this.x) + \")\");\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/DataIgnore.java",
    "content": "@lombok.Data class DataIgnore {\n  final int x;\n  String $name;\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getX() {\n    return this.x;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof DataIgnore)))\n        return false;\n    final DataIgnore other = (DataIgnore) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((this.getX() != other.getX()))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof DataIgnore);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.getX());\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((\"DataIgnore(x=\" + this.getX()) + \")\");\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated DataIgnore(final int x) {\n    super();\n    this.x = x;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/DataInAnonymousClass.java",
    "content": "import lombok.Data;\npublic class DataInAnonymousClass {\n  Object annonymous = new Object() {\n    @Data class Inner {\n      private String string;\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getString() {\n        return this.string;\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setString(final String string) {\n        this.string = string;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n        if ((o == this))\n            return true;\n        if ((! (o instanceof Inner)))\n            return false;\n        final Inner other = (Inner) o;\n        if ((! other.canEqual((java.lang.Object) this)))\n            return false;\n        final java.lang.Object this$string = this.getString();\n        final java.lang.Object other$string = other.getString();\n        if (((this$string == null) ? (other$string != null) : (! this$string.equals(other$string))))\n            return false;\n        return true;\n      }\n      protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n        return (other instanceof Inner);\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n        final int PRIME = 59;\n        int result = 1;\n        final java.lang.Object $string = this.getString();\n        result = ((result * PRIME) + (($string == null) ? 43 : $string.hashCode()));\n        return result;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((\"Inner(string=\" + this.getString()) + \")\");\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Inner() {\n        super();\n      }\n    }\n    x() {\n      super();\n    }\n  };\n  public DataInAnonymousClass() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/DataOnEnum.java",
    "content": "public @lombok.Getter @lombok.ToString @lombok.RequiredArgsConstructor enum DataOnEnum {\n  A(\"hello\"),\n  private final String someField;\n  <clinit>() {\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getSomeField() {\n    return this.someField;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((((\"DataOnEnum.\" + this.name()) + \"(someField=\") + this.getSomeField()) + \")\");\n  }\n  private @java.lang.SuppressWarnings(\"all\") @lombok.Generated DataOnEnum(final String someField) {\n    super();\n    this.someField = someField;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/DataOnLocalClass.java",
    "content": "import lombok.Data;\nclass DataOnLocalClass1 {\n  DataOnLocalClass1() {\n    super();\n  }\n  public static void main(String[] args) {\n    @Data class Local {\n      final int x;\n      String name;\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getX() {\n        return this.x;\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getName() {\n        return this.name;\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setName(final String name) {\n        this.name = name;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n        if ((o == this))\n            return true;\n        if ((! (o instanceof Local)))\n            return false;\n        final Local other = (Local) o;\n        if ((! other.canEqual((java.lang.Object) this)))\n            return false;\n        if ((this.getX() != other.getX()))\n            return false;\n        final java.lang.Object this$name = this.getName();\n        final java.lang.Object other$name = other.getName();\n        if (((this$name == null) ? (other$name != null) : (! this$name.equals(other$name))))\n            return false;\n        return true;\n      }\n      protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n        return (other instanceof Local);\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n        final int PRIME = 59;\n        int result = 1;\n        result = ((result * PRIME) + this.getX());\n        final java.lang.Object $name = this.getName();\n        result = ((result * PRIME) + (($name == null) ? 43 : $name.hashCode()));\n        return result;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((\"Local(x=\" + this.getX()) + \", name=\") + this.getName()) + \")\");\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Local(final int x) {\n        super();\n        this.x = x;\n      }\n    }\n  }\n}\nclass DataOnLocalClass2 {\n  {\n    @Data class Local {\n      @Data class InnerLocal {\n        @lombok.NonNull String name;\n        public @lombok.NonNull @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getName() {\n          return this.name;\n        }\n        public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setName(final @lombok.NonNull String name) {\n          if ((name == null))\n              {\n                throw new java.lang.NullPointerException(\"name is marked non-null but is null\");\n              }\n          this.name = name;\n        }\n        public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n          if ((o == this))\n              return true;\n          if ((! (o instanceof Local.InnerLocal)))\n              return false;\n          final Local.InnerLocal other = (Local.InnerLocal) o;\n          if ((! other.canEqual((java.lang.Object) this)))\n              return false;\n          final java.lang.Object this$name = this.getName();\n          final java.lang.Object other$name = other.getName();\n          if (((this$name == null) ? (other$name != null) : (! this$name.equals(other$name))))\n              return false;\n          return true;\n        }\n        protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n          return (other instanceof Local.InnerLocal);\n        }\n        public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n          final int PRIME = 59;\n          int result = 1;\n          final java.lang.Object $name = this.getName();\n          result = ((result * PRIME) + (($name == null) ? 43 : $name.hashCode()));\n          return result;\n        }\n        public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n          return ((\"Local.InnerLocal(name=\" + this.getName()) + \")\");\n        }\n        public @java.lang.SuppressWarnings(\"all\") @lombok.Generated InnerLocal(final @lombok.NonNull String name) {\n          super();\n          if ((name == null))\n              {\n                throw new java.lang.NullPointerException(\"name is marked non-null but is null\");\n              }\n          this.name = name;\n        }\n      }\n      final int x;\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getX() {\n        return this.x;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n        if ((o == this))\n            return true;\n        if ((! (o instanceof Local)))\n            return false;\n        final Local other = (Local) o;\n        if ((! other.canEqual((java.lang.Object) this)))\n            return false;\n        if ((this.getX() != other.getX()))\n            return false;\n        return true;\n      }\n      protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n        return (other instanceof Local);\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n        final int PRIME = 59;\n        int result = 1;\n        result = ((result * PRIME) + this.getX());\n        return result;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((\"Local(x=\" + this.getX()) + \")\");\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Local(final int x) {\n        super();\n        this.x = x;\n      }\n    }\n  }\n  DataOnLocalClass2() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/DataOnRecord.java",
    "content": "// version 14:\nimport lombok.Data;\npublic @Data record DataOnRecord(String a, String b) {\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/DataPlain.java",
    "content": "import lombok.Data;\n@lombok.Data class Data1 {\n  final int x;\n  String name;\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getX() {\n    return this.x;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getName() {\n    return this.name;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setName(final String name) {\n    this.name = name;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof Data1)))\n        return false;\n    final Data1 other = (Data1) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((this.getX() != other.getX()))\n        return false;\n    final java.lang.Object this$name = this.getName();\n    final java.lang.Object other$name = other.getName();\n    if (((this$name == null) ? (other$name != null) : (! this$name.equals(other$name))))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof Data1);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.getX());\n    final java.lang.Object $name = this.getName();\n    result = ((result * PRIME) + (($name == null) ? 43 : $name.hashCode()));\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((((\"Data1(x=\" + this.getX()) + \", name=\") + this.getName()) + \")\");\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Data1(final int x) {\n    super();\n    this.x = x;\n  }\n}\n@Data class Data2 {\n  final int x;\n  String name;\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getX() {\n    return this.x;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getName() {\n    return this.name;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setName(final String name) {\n    this.name = name;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof Data2)))\n        return false;\n    final Data2 other = (Data2) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((this.getX() != other.getX()))\n        return false;\n    final java.lang.Object this$name = this.getName();\n    final java.lang.Object other$name = other.getName();\n    if (((this$name == null) ? (other$name != null) : (! this$name.equals(other$name))))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof Data2);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.getX());\n    final java.lang.Object $name = this.getName();\n    result = ((result * PRIME) + (($name == null) ? 43 : $name.hashCode()));\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((((\"Data2(x=\" + this.getX()) + \", name=\") + this.getName()) + \")\");\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Data2(final int x) {\n    super();\n    this.x = x;\n  }\n}\nfinal @Data class Data3 {\n  final int x;\n  String name;\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getX() {\n    return this.x;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getName() {\n    return this.name;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setName(final String name) {\n    this.name = name;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof Data3)))\n        return false;\n    final Data3 other = (Data3) o;\n    if ((this.getX() != other.getX()))\n        return false;\n    final java.lang.Object this$name = this.getName();\n    final java.lang.Object other$name = other.getName();\n    if (((this$name == null) ? (other$name != null) : (! this$name.equals(other$name))))\n        return false;\n    return true;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.getX());\n    final java.lang.Object $name = this.getName();\n    result = ((result * PRIME) + (($name == null) ? 43 : $name.hashCode()));\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((((\"Data3(x=\" + this.getX()) + \", name=\") + this.getName()) + \")\");\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Data3(final int x) {\n    super();\n    this.x = x;\n  }\n}\nfinal @Data @lombok.EqualsAndHashCode(callSuper = true) class Data4 extends java.util.Timer {\n  int x;\n  Data4() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getX() {\n    return this.x;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setX(final int x) {\n    this.x = x;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((\"Data4(x=\" + this.getX()) + \")\");\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof Data4)))\n        return false;\n    final Data4 other = (Data4) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((! super.equals(o)))\n        return false;\n    if ((this.getX() != other.getX()))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof Data4);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = super.hashCode();\n    result = ((result * PRIME) + this.getX());\n    return result;\n  }\n}\n@Data class Data5 {\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof Data5)))\n        return false;\n    final Data5 other = (Data5) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof Data5);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int result = 1;\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return \"Data5()\";\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Data5() {\n    super();\n  }\n}\nfinal @Data class Data6 {\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof Data6)))\n        return false;\n    return true;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int result = 1;\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return \"Data6()\";\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Data6() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/DataWithGetter.java",
    "content": "@lombok.Data @lombok.Getter class DataWithGetter {\n  private int x;\n  private int y;\n  private final String z;\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setX(final int x) {\n    this.x = x;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setY(final int y) {\n    this.y = y;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof DataWithGetter)))\n        return false;\n    final DataWithGetter other = (DataWithGetter) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((this.getX() != other.getX()))\n        return false;\n    if ((this.getY() != other.getY()))\n        return false;\n    final java.lang.Object this$z = this.getZ();\n    final java.lang.Object other$z = other.getZ();\n    if (((this$z == null) ? (other$z != null) : (! this$z.equals(other$z))))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof DataWithGetter);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.getX());\n    result = ((result * PRIME) + this.getY());\n    final java.lang.Object $z = this.getZ();\n    result = ((result * PRIME) + (($z == null) ? 43 : $z.hashCode()));\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((((((\"DataWithGetter(x=\" + this.getX()) + \", y=\") + this.getY()) + \", z=\") + this.getZ()) + \")\");\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated DataWithGetter(final String z) {\n    super();\n    this.z = z;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getX() {\n    return this.x;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getY() {\n    return this.y;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getZ() {\n    return this.z;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/DataWithGetterNone.java",
    "content": "@lombok.Data @lombok.Getter(lombok.AccessLevel.NONE) class DataWithGetterNone {\n  private int x;\n  private int y;\n  private final String z;\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setX(final int x) {\n    this.x = x;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setY(final int y) {\n    this.y = y;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof DataWithGetterNone)))\n        return false;\n    final DataWithGetterNone other = (DataWithGetterNone) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((this.x != other.x))\n        return false;\n    if ((this.y != other.y))\n        return false;\n    final java.lang.Object this$z = this.z;\n    final java.lang.Object other$z = other.z;\n    if (((this$z == null) ? (other$z != null) : (! this$z.equals(other$z))))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof DataWithGetterNone);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.x);\n    result = ((result * PRIME) + this.y);\n    final java.lang.Object $z = this.z;\n    result = ((result * PRIME) + (($z == null) ? 43 : $z.hashCode()));\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((((((\"DataWithGetterNone(x=\" + this.x) + \", y=\") + this.y) + \", z=\") + this.z) + \")\");\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated DataWithGetterNone(final String z) {\n    super();\n    this.z = z;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/DataWithOverrideEqualsAndHashCode.java",
    "content": "import lombok.Data;\nclass DataWithOverrideEqualsAndHashCode {\n  class Data1 {\n    Data1() {\n      super();\n    }\n  }\n  @Data class Data2 extends Data1 {\n    public int hashCode() {\n      return 42;\n    }\n    public boolean equals(Object other) {\n      return false;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return \"DataWithOverrideEqualsAndHashCode.Data2()\";\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Data2() {\n      super();\n    }\n  }\n  DataWithOverrideEqualsAndHashCode() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/DelegateAlreadyImplemented.java",
    "content": "public class DelegateAlreadyImplemented<T> {\n  private @lombok.experimental.Delegate A<Integer, T> a;\n  public DelegateAlreadyImplemented() {\n    super();\n  }\n  public void a() {\n  }\n  public void b(java.util.List<String> l) {\n  }\n  public void c(java.util.List<Integer> l, String[] a, Integer... varargs) {\n  }\n  public void d(String[][][][] d) {\n  }\n  public <Y>void e(Y x) {\n  }\n  public @SuppressWarnings(\"unchecked\") void f(T s, java.util.List<T> l, T[] a, T... varargs) {\n  }\n  public void g(Number g) {\n  }\n}\ninterface A<T, T2> {\n  public void a();\n  public void b(java.util.List<T> l);\n  public @SuppressWarnings(\"unchecked\") void c(java.util.List<T> l, String[] a, T... varargs);\n  public void d(String[][][][] d);\n  public <X>X e(X x);\n  public @SuppressWarnings(\"unchecked\") void f(T2 s, java.util.List<T2> l, T2[] a, T2... varargs);\n  public <G extends Number>void g(G g);\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/DelegateGenerics.java",
    "content": "public class DelegateGenerics<T> {\n  @lombok.experimental.Delegate I1<T> target;\n  public DelegateGenerics() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated T a(final T a) {\n    return this.target.a(a);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String i(final java.lang.String a) {\n    return this.target.i(a);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.Integer t(final java.lang.Integer t) {\n    return this.target.t(t);\n  }\n}\ninterface I1<T> extends I2<T, Integer, String> {\n}\ninterface I2<A, T, I> extends I3<Integer, I, A> {\n}\ninterface I3<T, I, A> {\n  public T t(T t);\n  public I i(I a);\n  public A a(A a);\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/DelegateOnGetter.java",
    "content": "import lombok.Delegate;\nimport lombok.Getter;\nclass DelegateOnGetter {\n  private interface Bar {\n    void setList(java.util.ArrayList<java.lang.String> list);\n    int getInt();\n  }\n  private final @Delegate @Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> bar = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n  DelegateOnGetter() {\n    super();\n  }\n  public @Delegate @java.lang.SuppressWarnings({\"all\", \"unchecked\"}) @lombok.Generated Bar getBar() {\n    java.lang.Object $value = this.bar.get();\n    if (($value == null))\n        {\n          synchronized (this.bar)\n            {\n              $value = this.bar.get();\n              if (($value == null))\n                  {\n                    final Bar actualValue = new Bar() {\n                      x() {\n                        super();\n                      }\n                      public void setList(java.util.ArrayList<String> list) {\n                      }\n                      public int getInt() {\n                        return 42;\n                      }\n                    };\n                    $value = ((actualValue == null) ? this.bar : actualValue);\n                    this.bar.set($value);\n                  }\n            }\n        }\n    return (Bar) (($value == this.bar) ? null : $value);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getInt() {\n    return this.getBar().getInt();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setList(final java.util.ArrayList<java.lang.String> list) {\n    this.getBar().setList(list);\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/DelegateOnGetterNone.java",
    "content": "import lombok.AccessLevel;\nimport lombok.experimental.Delegate;\nimport lombok.Getter;\n@Getter class DelegateOnGetterNone {\n  private interface Bar {\n    void setList(java.util.ArrayList<java.lang.String> list);\n    int getInt();\n  }\n  private final @Delegate @Getter(AccessLevel.NONE) Bar bar = null;\n  DelegateOnGetterNone() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getInt() {\n    return this.bar.getInt();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setList(final java.util.ArrayList<java.lang.String> list) {\n    this.bar.setList(list);\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/DelegateOnMethods.java",
    "content": "import lombok.experimental.Delegate;\nabstract class DelegateOnMethods {\n  public static interface Bar {\n    void bar(java.util.ArrayList<java.lang.String> list);\n  }\n  DelegateOnMethods() {\n    super();\n  }\n  public abstract @Delegate Bar getBar();\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void bar(final java.util.ArrayList<java.lang.String> list) {\n    this.getBar().bar(list);\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/DelegateOnRecord.java",
    "content": "// version 14:\nimport lombok.experimental.Delegate;\nrecord DelegateOnRecord(Runnable runnable) {\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void run() {\n    this.runnable.run();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/DelegateTypesAndExcludes.java",
    "content": "import lombok.experimental.Delegate;\nclass DelegatePlain {\n  private static class FooImpl implements Foo {\n    private FooImpl() {\n      super();\n    }\n    public void foo() {\n    }\n    public void bar(java.util.ArrayList<java.lang.String> list) {\n    }\n  }\n  private static class BarImpl implements Bar {\n    private BarImpl() {\n      super();\n    }\n    public void bar(java.util.ArrayList<java.lang.String> list) {\n    }\n  }\n  private static interface Foo extends Bar {\n    void foo();\n  }\n  private static interface Bar {\n    void bar(java.util.ArrayList<java.lang.String> list);\n  }\n  private final @Delegate(types = Bar.class) BarImpl bar = new BarImpl();\n  private final @Delegate(types = Foo.class,excludes = Bar.class) FooImpl foo = new FooImpl();\n  DelegatePlain() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void bar(final java.util.ArrayList<java.lang.String> list) {\n    this.bar.bar(list);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void foo() {\n    this.foo.foo();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/DelegateWithDeprecated.java",
    "content": "import lombok.experimental.Delegate;\nclass DelegateWithDeprecated {\n  private interface Bar {\n    @Deprecated void deprecatedAnnotation();\n    void deprecatedComment();\n    void notDeprecated();\n  }\n  private @Delegate Bar bar;\n  DelegateWithDeprecated() {\n    super();\n  }\n  public @java.lang.Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated void deprecatedAnnotation() {\n    this.bar.deprecatedAnnotation();\n  }\n  public @java.lang.Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated void deprecatedComment() {\n    this.bar.deprecatedComment();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void notDeprecated() {\n    this.bar.notDeprecated();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/DelegateWithVarargs.java",
    "content": "import lombok.experimental.Delegate;\nclass DelegateWithVarargs {\n  private interface Bar {\n    void justOneParameter(int... varargs);\n    void multipleParameters(String first, int... varargs);\n    void array(int[] array);\n    void arrayVarargs(int[]... arrayVarargs);\n  }\n  private @Delegate Bar bar;\n  DelegateWithVarargs() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void array(final int[] array) {\n    this.bar.array(array);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void arrayVarargs(final int[]... arrayVarargs) {\n    this.bar.arrayVarargs(arrayVarargs);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void justOneParameter(final int... varargs) {\n    this.bar.justOneParameter(varargs);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void multipleParameters(final java.lang.String first, final int... varargs) {\n    this.bar.multipleParameters(first, varargs);\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/DelegateWithVarargs2.java",
    "content": "import lombok.experimental.Delegate;\nclass DelegateWithVarargs2 {\n  public class B {\n    public B() {\n      super();\n    }\n    public void varargs(Object[]... keys) {\n    }\n  }\n  private @Delegate DelegateWithVarargs2.B bar;\n  DelegateWithVarargs2() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void varargs(final java.lang.Object[]... keys) {\n    this.bar.varargs(keys);\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/EncodingUsAscii.java",
    "content": "//ignore: This test serves to check what happens with 'weird' characters when you use delombok. It's just not relevant for ecj.\n"
  },
  {
    "path": "test/transform/resource/after-ecj/EncodingUtf8.java",
    "content": "//ignore: This test serves to check what happens with 'weird' characters when you use delombok. It's just not relevant for ecj.\n"
  },
  {
    "path": "test/transform/resource/after-ecj/EqualsAndHashCode.java",
    "content": "@lombok.EqualsAndHashCode class EqualsAndHashCode {\n  int x;\n  boolean[] y;\n  Object[] z;\n  String a;\n  String b;\n  EqualsAndHashCode() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCode)))\n        return false;\n    final EqualsAndHashCode other = (EqualsAndHashCode) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((this.x != other.x))\n        return false;\n    if ((! java.util.Arrays.equals(this.y, other.y)))\n        return false;\n    if ((! java.util.Arrays.deepEquals(this.z, other.z)))\n        return false;\n    final java.lang.Object this$a = this.a;\n    final java.lang.Object other$a = other.a;\n    if (((this$a == null) ? (other$a != null) : (! this$a.equals(other$a))))\n        return false;\n    final java.lang.Object this$b = this.b;\n    final java.lang.Object other$b = other.b;\n    if (((this$b == null) ? (other$b != null) : (! this$b.equals(other$b))))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof EqualsAndHashCode);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.x);\n    result = ((result * PRIME) + java.util.Arrays.hashCode(this.y));\n    result = ((result * PRIME) + java.util.Arrays.deepHashCode(this.z));\n    final java.lang.Object $a = this.a;\n    result = ((result * PRIME) + (($a == null) ? 43 : $a.hashCode()));\n    final java.lang.Object $b = this.b;\n    result = ((result * PRIME) + (($b == null) ? 43 : $b.hashCode()));\n    return result;\n  }\n}\nfinal @lombok.EqualsAndHashCode class EqualsAndHashCode2 {\n  int x;\n  long y;\n  float f;\n  double d;\n  boolean b;\n  EqualsAndHashCode2() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCode2)))\n        return false;\n    final EqualsAndHashCode2 other = (EqualsAndHashCode2) o;\n    if ((this.x != other.x))\n        return false;\n    if ((this.y != other.y))\n        return false;\n    if ((java.lang.Float.compare(this.f, other.f) != 0))\n        return false;\n    if ((java.lang.Double.compare(this.d, other.d) != 0))\n        return false;\n    if ((this.b != other.b))\n        return false;\n    return true;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.x);\n    final long $y = this.y;\n    result = ((result * PRIME) + (int) ($y ^ ($y >>> 32)));\n    result = ((result * PRIME) + java.lang.Float.floatToIntBits(this.f));\n    final long $d = java.lang.Double.doubleToLongBits(this.d);\n    result = ((result * PRIME) + (int) ($d ^ ($d >>> 32)));\n    result = ((result * PRIME) + (this.b ? 79 : 97));\n    return result;\n  }\n}\nfinal @lombok.EqualsAndHashCode(callSuper = false) class EqualsAndHashCode3 extends EqualsAndHashCode {\n  EqualsAndHashCode3() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCode3)))\n        return false;\n    final EqualsAndHashCode3 other = (EqualsAndHashCode3) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof EqualsAndHashCode3);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int result = 1;\n    return result;\n  }\n}\n@lombok.EqualsAndHashCode(callSuper = true) class EqualsAndHashCode4 extends EqualsAndHashCode {\n  EqualsAndHashCode4() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCode4)))\n        return false;\n    final EqualsAndHashCode4 other = (EqualsAndHashCode4) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((! super.equals(o)))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof EqualsAndHashCode4);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int result = super.hashCode();\n    return result;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/EqualsAndHashCodeAnnotated.java",
    "content": "import java.lang.annotation.*;\n@lombok.EqualsAndHashCode class EqualsAndHashCodeAnnotated {\n  @Target(ElementType.TYPE_USE) @Retention(RetentionPolicy.SOURCE) @interface Annotated {\n  }\n  @Annotated int primitive;\n  @Annotated Object object;\n  int @Annotated [] primitiveValues;\n  int @Annotated [] @Annotated [] morePrimitiveValues;\n  Integer @Annotated [] objectValues;\n  Integer @Annotated [] @Annotated [] moreObjectValues;\n  EqualsAndHashCodeAnnotated() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCodeAnnotated)))\n        return false;\n    final EqualsAndHashCodeAnnotated other = (EqualsAndHashCodeAnnotated) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((this.primitive != other.primitive))\n        return false;\n    final java.lang.Object this$object = this.object;\n    final java.lang.Object other$object = other.object;\n    if (((this$object == null) ? (other$object != null) : (! this$object.equals(other$object))))\n        return false;\n    if ((! java.util.Arrays.equals(this.primitiveValues, other.primitiveValues)))\n        return false;\n    if ((! java.util.Arrays.deepEquals(this.morePrimitiveValues, other.morePrimitiveValues)))\n        return false;\n    if ((! java.util.Arrays.deepEquals(this.objectValues, other.objectValues)))\n        return false;\n    if ((! java.util.Arrays.deepEquals(this.moreObjectValues, other.moreObjectValues)))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof EqualsAndHashCodeAnnotated);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.primitive);\n    final java.lang.Object $object = this.object;\n    result = ((result * PRIME) + (($object == null) ? 43 : $object.hashCode()));\n    result = ((result * PRIME) + java.util.Arrays.hashCode(this.primitiveValues));\n    result = ((result * PRIME) + java.util.Arrays.deepHashCode(this.morePrimitiveValues));\n    result = ((result * PRIME) + java.util.Arrays.deepHashCode(this.objectValues));\n    result = ((result * PRIME) + java.util.Arrays.deepHashCode(this.moreObjectValues));\n    return result;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/EqualsAndHashCodeAutoExclude.java",
    "content": "@lombok.EqualsAndHashCode class EqualsAndHashCodeAutoExclude {\n  int x;\n  String $a;\n  transient String b;\n  EqualsAndHashCodeAutoExclude() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCodeAutoExclude)))\n        return false;\n    final EqualsAndHashCodeAutoExclude other = (EqualsAndHashCodeAutoExclude) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((this.x != other.x))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof EqualsAndHashCodeAutoExclude);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.x);\n    return result;\n  }\n}\n@lombok.EqualsAndHashCode class EqualsAndHashCodeAutoExclude2 {\n  int x;\n  @lombok.EqualsAndHashCode.Include String $a;\n  transient @lombok.EqualsAndHashCode.Include String b;\n  EqualsAndHashCodeAutoExclude2() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCodeAutoExclude2)))\n        return false;\n    final EqualsAndHashCodeAutoExclude2 other = (EqualsAndHashCodeAutoExclude2) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((this.x != other.x))\n        return false;\n    final java.lang.Object this$$a = this.$a;\n    final java.lang.Object other$$a = other.$a;\n    if (((this$$a == null) ? (other$$a != null) : (! this$$a.equals(other$$a))))\n        return false;\n    final java.lang.Object this$b = this.b;\n    final java.lang.Object other$b = other.b;\n    if (((this$b == null) ? (other$b != null) : (! this$b.equals(other$b))))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof EqualsAndHashCodeAutoExclude2);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.x);\n    final java.lang.Object $$a = this.$a;\n    result = ((result * PRIME) + (($$a == null) ? 43 : $$a.hashCode()));\n    final java.lang.Object $b = this.b;\n    result = ((result * PRIME) + (($b == null) ? 43 : $b.hashCode()));\n    return result;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/EqualsAndHashCodeCache.java",
    "content": "@lombok.EqualsAndHashCode(cacheStrategy = lombok.EqualsAndHashCode.CacheStrategy.LAZY) class EqualsAndHashCode {\n  private transient @java.lang.SuppressWarnings(\"all\") @lombok.Generated int $hashCodeCache;\n  int x;\n  boolean[] y;\n  Object[] z;\n  String a;\n  String b;\n  EqualsAndHashCode() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCode)))\n        return false;\n    final EqualsAndHashCode other = (EqualsAndHashCode) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((this.x != other.x))\n        return false;\n    if ((! java.util.Arrays.equals(this.y, other.y)))\n        return false;\n    if ((! java.util.Arrays.deepEquals(this.z, other.z)))\n        return false;\n    final java.lang.Object this$a = this.a;\n    final java.lang.Object other$a = other.a;\n    if (((this$a == null) ? (other$a != null) : (! this$a.equals(other$a))))\n        return false;\n    final java.lang.Object this$b = this.b;\n    final java.lang.Object other$b = other.b;\n    if (((this$b == null) ? (other$b != null) : (! this$b.equals(other$b))))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof EqualsAndHashCode);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    if ((this.$hashCodeCache != 0))\n        return this.$hashCodeCache;\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.x);\n    result = ((result * PRIME) + java.util.Arrays.hashCode(this.y));\n    result = ((result * PRIME) + java.util.Arrays.deepHashCode(this.z));\n    final java.lang.Object $a = this.a;\n    result = ((result * PRIME) + (($a == null) ? 43 : $a.hashCode()));\n    final java.lang.Object $b = this.b;\n    result = ((result * PRIME) + (($b == null) ? 43 : $b.hashCode()));\n    if ((result == 0))\n        result = java.lang.Integer.MIN_VALUE;\n    this.$hashCodeCache = result;\n    return result;\n  }\n}\nfinal @lombok.EqualsAndHashCode(cacheStrategy = lombok.EqualsAndHashCode.CacheStrategy.LAZY) class EqualsAndHashCode2 {\n  private transient @java.lang.SuppressWarnings(\"all\") @lombok.Generated int $hashCodeCache;\n  int x;\n  long y;\n  float f;\n  double d;\n  boolean b;\n  EqualsAndHashCode2() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCode2)))\n        return false;\n    final EqualsAndHashCode2 other = (EqualsAndHashCode2) o;\n    if ((this.x != other.x))\n        return false;\n    if ((this.y != other.y))\n        return false;\n    if ((java.lang.Float.compare(this.f, other.f) != 0))\n        return false;\n    if ((java.lang.Double.compare(this.d, other.d) != 0))\n        return false;\n    if ((this.b != other.b))\n        return false;\n    return true;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    if ((this.$hashCodeCache != 0))\n        return this.$hashCodeCache;\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.x);\n    final long $y = this.y;\n    result = ((result * PRIME) + (int) ($y ^ ($y >>> 32)));\n    result = ((result * PRIME) + java.lang.Float.floatToIntBits(this.f));\n    final long $d = java.lang.Double.doubleToLongBits(this.d);\n    result = ((result * PRIME) + (int) ($d ^ ($d >>> 32)));\n    result = ((result * PRIME) + (this.b ? 79 : 97));\n    if ((result == 0))\n        result = java.lang.Integer.MIN_VALUE;\n    this.$hashCodeCache = result;\n    return result;\n  }\n}\nfinal @lombok.EqualsAndHashCode(callSuper = false,cacheStrategy = lombok.EqualsAndHashCode.CacheStrategy.LAZY) class EqualsAndHashCode3 extends EqualsAndHashCode {\n  private transient @java.lang.SuppressWarnings(\"all\") @lombok.Generated int $hashCodeCache;\n  EqualsAndHashCode3() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCode3)))\n        return false;\n    final EqualsAndHashCode3 other = (EqualsAndHashCode3) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof EqualsAndHashCode3);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    if ((this.$hashCodeCache != 0))\n        return this.$hashCodeCache;\n    int result = 1;\n    if ((result == 0))\n        result = java.lang.Integer.MIN_VALUE;\n    this.$hashCodeCache = result;\n    return result;\n  }\n}\n@lombok.EqualsAndHashCode(callSuper = true,cacheStrategy = lombok.EqualsAndHashCode.CacheStrategy.LAZY) class EqualsAndHashCode4 extends EqualsAndHashCode {\n  private transient @java.lang.SuppressWarnings(\"all\") @lombok.Generated int $hashCodeCache;\n  EqualsAndHashCode4() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCode4)))\n        return false;\n    final EqualsAndHashCode4 other = (EqualsAndHashCode4) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((! super.equals(o)))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof EqualsAndHashCode4);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    if ((this.$hashCodeCache != 0))\n        return this.$hashCodeCache;\n    int result = super.hashCode();\n    if ((result == 0))\n        result = java.lang.Integer.MIN_VALUE;\n    this.$hashCodeCache = result;\n    return result;\n  }\n}\nfinal @lombok.EqualsAndHashCode(callSuper = true,cacheStrategy = lombok.EqualsAndHashCode.CacheStrategy.LAZY) class EqualsAndHashCode5 extends EqualsAndHashCode {\n  private transient @java.lang.SuppressWarnings(\"all\") @lombok.Generated int $hashCodeCache;\n  EqualsAndHashCode5() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCode5)))\n        return false;\n    final EqualsAndHashCode5 other = (EqualsAndHashCode5) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((! super.equals(o)))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof EqualsAndHashCode5);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    if ((this.$hashCodeCache != 0))\n        return this.$hashCodeCache;\n    int result = super.hashCode();\n    if ((result == 0))\n        result = java.lang.Integer.MIN_VALUE;\n    this.$hashCodeCache = result;\n    return result;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/EqualsAndHashCodeConfigKeys1.java",
    "content": "@lombok.EqualsAndHashCode class EqualsAndHashCodeConfigKeys1Parent {\n  EqualsAndHashCodeConfigKeys1Parent() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCodeConfigKeys1Parent)))\n        return false;\n    final EqualsAndHashCodeConfigKeys1Parent other = (EqualsAndHashCodeConfigKeys1Parent) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof EqualsAndHashCodeConfigKeys1Parent);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int result = 1;\n    return result;\n  }\n}\n@lombok.EqualsAndHashCode class EqualsAndHashCodeConfigKeys1 extends EqualsAndHashCodeConfigKeys1Parent {\n  int x;\n  EqualsAndHashCodeConfigKeys1() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCodeConfigKeys1)))\n        return false;\n    final EqualsAndHashCodeConfigKeys1 other = (EqualsAndHashCodeConfigKeys1) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((this.x != other.x))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof EqualsAndHashCodeConfigKeys1);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.x);\n    return result;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/EqualsAndHashCodeConfigKeys2.java",
    "content": "@lombok.EqualsAndHashCode class EqualsAndHashCodeConfigKeys2Object extends Object {\n  EqualsAndHashCodeConfigKeys2Object() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCodeConfigKeys2Object)))\n        return false;\n    final EqualsAndHashCodeConfigKeys2Object other = (EqualsAndHashCodeConfigKeys2Object) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof EqualsAndHashCodeConfigKeys2Object);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int result = 1;\n    return result;\n  }\n}\n@lombok.EqualsAndHashCode class EqualsAndHashCodeConfigKeys2Parent {\n  EqualsAndHashCodeConfigKeys2Parent() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCodeConfigKeys2Parent)))\n        return false;\n    final EqualsAndHashCodeConfigKeys2Parent other = (EqualsAndHashCodeConfigKeys2Parent) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof EqualsAndHashCodeConfigKeys2Parent);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int result = 1;\n    return result;\n  }\n}\n@lombok.EqualsAndHashCode class EqualsAndHashCodeConfigKeys2 extends EqualsAndHashCodeConfigKeys2Parent {\n  int x;\n  EqualsAndHashCodeConfigKeys2() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCodeConfigKeys2)))\n        return false;\n    final EqualsAndHashCodeConfigKeys2 other = (EqualsAndHashCodeConfigKeys2) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((! super.equals(o)))\n        return false;\n    if ((this.x != other.x))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof EqualsAndHashCodeConfigKeys2);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = super.hashCode();\n    result = ((result * PRIME) + this.x);\n    return result;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/EqualsAndHashCodeEmpty.java",
    "content": "@lombok.EqualsAndHashCode class EqualsAndHashCodeEmpty {\n  EqualsAndHashCodeEmpty() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCodeEmpty)))\n        return false;\n    final EqualsAndHashCodeEmpty other = (EqualsAndHashCodeEmpty) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof EqualsAndHashCodeEmpty);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int result = 1;\n    return result;\n  }\n}\n@lombok.EqualsAndHashCode(callSuper = true) class EqualsAndHashCodeEmptyWithSuper extends EqualsAndHashCodeEmpty {\n  EqualsAndHashCodeEmptyWithSuper() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCodeEmptyWithSuper)))\n        return false;\n    final EqualsAndHashCodeEmptyWithSuper other = (EqualsAndHashCodeEmptyWithSuper) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((! super.equals(o)))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof EqualsAndHashCodeEmptyWithSuper);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int result = super.hashCode();\n    return result;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/EqualsAndHashCodeExplicitInclude.java",
    "content": "@lombok.EqualsAndHashCode(onlyExplicitlyIncluded = true) class EqualsAndHashCodeExplicitInclude {\n  int x;\n  EqualsAndHashCodeExplicitInclude() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCodeExplicitInclude)))\n        return false;\n    final EqualsAndHashCodeExplicitInclude other = (EqualsAndHashCodeExplicitInclude) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof EqualsAndHashCodeExplicitInclude);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int result = 1;\n    return result;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/EqualsAndHashCodeInAnonymousClass.java",
    "content": "import lombok.EqualsAndHashCode;\npublic class EqualsAndHashCodeInAnonymousClass {\n  Object annonymous = new Object() {\n    @EqualsAndHashCode class Inner {\n      private String string;\n      Inner() {\n        super();\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n        if ((o == this))\n            return true;\n        if ((! (o instanceof Inner)))\n            return false;\n        final Inner other = (Inner) o;\n        if ((! other.canEqual((java.lang.Object) this)))\n            return false;\n        final java.lang.Object this$string = this.string;\n        final java.lang.Object other$string = other.string;\n        if (((this$string == null) ? (other$string != null) : (! this$string.equals(other$string))))\n            return false;\n        return true;\n      }\n      protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n        return (other instanceof Inner);\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n        final int PRIME = 59;\n        int result = 1;\n        final java.lang.Object $string = this.string;\n        result = ((result * PRIME) + (($string == null) ? 43 : $string.hashCode()));\n        return result;\n      }\n    }\n    x() {\n      super();\n    }\n  };\n  public EqualsAndHashCodeInAnonymousClass() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/EqualsAndHashCodeNestedShadow.java",
    "content": "interface EqualsAndHashCodeNestedShadow {\n  interface Foo {\n  }\n  class Bar {\n    public static @lombok.EqualsAndHashCode(callSuper = false) class Foo extends Bar implements EqualsAndHashCodeNestedShadow.Foo {\n      public Foo() {\n        super();\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n        if ((o == this))\n            return true;\n        if ((! (o instanceof EqualsAndHashCodeNestedShadow.Bar.Foo)))\n            return false;\n        final EqualsAndHashCodeNestedShadow.Bar.Foo other = (EqualsAndHashCodeNestedShadow.Bar.Foo) o;\n        if ((! other.canEqual((java.lang.Object) this)))\n            return false;\n        return true;\n      }\n      protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n        return (other instanceof EqualsAndHashCodeNestedShadow.Bar.Foo);\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n        final int result = 1;\n        return result;\n      }\n    }\n    Bar() {\n      super();\n    }\n  }\n  class Baz {\n    public static @lombok.EqualsAndHashCode(callSuper = false) class Foo<T> extends Bar implements EqualsAndHashCodeNestedShadow.Foo {\n      public Foo() {\n        super();\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n        if ((o == this))\n            return true;\n        if ((! (o instanceof EqualsAndHashCodeNestedShadow.Baz.Foo)))\n            return false;\n        final EqualsAndHashCodeNestedShadow.Baz.Foo<?> other = (EqualsAndHashCodeNestedShadow.Baz.Foo<?>) o;\n        if ((! other.canEqual((java.lang.Object) this)))\n            return false;\n        return true;\n      }\n      protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n        return (other instanceof EqualsAndHashCodeNestedShadow.Baz.Foo);\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n        final int result = 1;\n        return result;\n      }\n    }\n    Baz() {\n      super();\n    }\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/EqualsAndHashCodeNewStyle.java",
    "content": "import lombok.EqualsAndHashCode;\npublic @EqualsAndHashCode class EqualsAndHashCodeNewStyle {\n  @EqualsAndHashCode.Include int b;\n  double c;\n  int f;\n  @EqualsAndHashCode.Include int d;\n  int g;\n  @EqualsAndHashCode.Exclude int j;\n  public EqualsAndHashCodeNewStyle() {\n    super();\n  }\n  @EqualsAndHashCode.Include int f() {\n    return 0;\n  }\n  @EqualsAndHashCode.Include(replaces = \"g\") long i() {\n    return 0;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCodeNewStyle)))\n        return false;\n    final EqualsAndHashCodeNewStyle other = (EqualsAndHashCodeNewStyle) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((this.b != other.b))\n        return false;\n    if ((java.lang.Double.compare(this.c, other.c) != 0))\n        return false;\n    if ((this.d != other.d))\n        return false;\n    if ((this.f() != other.f()))\n        return false;\n    if ((this.i() != other.i()))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof EqualsAndHashCodeNewStyle);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.b);\n    final long $c = java.lang.Double.doubleToLongBits(this.c);\n    result = ((result * PRIME) + (int) ($c ^ ($c >>> 32)));\n    result = ((result * PRIME) + this.d);\n    result = ((result * PRIME) + this.f());\n    final long $$i = this.i();\n    result = ((result * PRIME) + (int) ($$i ^ ($$i >>> 32)));\n    return result;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/EqualsAndHashCodeOfAndExclude.java",
    "content": "final @lombok.EqualsAndHashCode(of = {\"x\"}) class EqualsAndHashCodeOf {\n  int x;\n  int y;\n  EqualsAndHashCodeOf() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCodeOf)))\n        return false;\n    final EqualsAndHashCodeOf other = (EqualsAndHashCodeOf) o;\n    if ((this.x != other.x))\n        return false;\n    return true;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.x);\n    return result;\n  }\n}\nfinal @lombok.EqualsAndHashCode(exclude = {\"y\"}) class EqualsAndHashCodeExclude {\n  int x;\n  int y;\n  EqualsAndHashCodeExclude() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCodeExclude)))\n        return false;\n    final EqualsAndHashCodeExclude other = (EqualsAndHashCodeExclude) o;\n    if ((this.x != other.x))\n        return false;\n    return true;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.x);\n    return result;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/EqualsAndHashCodeOnRecord.java",
    "content": "// version 14:\nimport lombok.EqualsAndHashCode;\npublic @EqualsAndHashCode record EqualsAndHashCodeOnRecord(String a, String b) {\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/EqualsAndHashCodeRank.java",
    "content": "import lombok.EqualsAndHashCode;\npublic @EqualsAndHashCode class EqualsAndHashCodeRank {\n  @EqualsAndHashCode.Include int a;\n  @EqualsAndHashCode.Include(rank = 10) int b;\n  @EqualsAndHashCode.Include int c;\n  public EqualsAndHashCodeRank() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCodeRank)))\n        return false;\n    final EqualsAndHashCodeRank other = (EqualsAndHashCodeRank) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((this.a != other.a))\n        return false;\n    if ((this.c != other.c))\n        return false;\n    if ((this.b != other.b))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof EqualsAndHashCodeRank);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.a);\n    result = ((result * PRIME) + this.c);\n    result = ((result * PRIME) + this.b);\n    return result;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/EqualsAndHashCodeWithExistingMethods.java",
    "content": "@lombok.EqualsAndHashCode class EqualsAndHashCodeWithExistingMethods {\n  int x;\n  EqualsAndHashCodeWithExistingMethods() {\n    super();\n  }\n  public int hashCode() {\n    return 42;\n  }\n}\nfinal @lombok.EqualsAndHashCode class EqualsAndHashCodeWithExistingMethods2 {\n  int x;\n  EqualsAndHashCodeWithExistingMethods2() {\n    super();\n  }\n  public boolean equals(Object other) {\n    return false;\n  }\n}\nfinal @lombok.EqualsAndHashCode(callSuper = true) class EqualsAndHashCodeWithExistingMethods3 extends EqualsAndHashCodeWithExistingMethods {\n  int x;\n  EqualsAndHashCodeWithExistingMethods3() {\n    super();\n  }\n  private boolean canEqual(Object other) {\n    return true;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCodeWithExistingMethods3)))\n        return false;\n    final EqualsAndHashCodeWithExistingMethods3 other = (EqualsAndHashCodeWithExistingMethods3) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((! super.equals(o)))\n        return false;\n    if ((this.x != other.x))\n        return false;\n    return true;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = super.hashCode();\n    result = ((result * PRIME) + this.x);\n    return result;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/EqualsAndHashCodeWithGenericsOnInners.java",
    "content": "public class EqualsAndHashCodeWithGenericsOnInners<A> {\n  @lombok.EqualsAndHashCode class Inner<B> {\n    int x;\n    Inner() {\n      super();\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n      if ((o == this))\n          return true;\n      if ((! (o instanceof EqualsAndHashCodeWithGenericsOnInners.Inner)))\n          return false;\n      final EqualsAndHashCodeWithGenericsOnInners<?>.Inner<?> other = (EqualsAndHashCodeWithGenericsOnInners<?>.Inner<?>) o;\n      if ((! other.canEqual((java.lang.Object) this)))\n          return false;\n      if ((this.x != other.x))\n          return false;\n      return true;\n    }\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n      return (other instanceof EqualsAndHashCodeWithGenericsOnInners.Inner);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n      final int PRIME = 59;\n      int result = 1;\n      result = ((result * PRIME) + this.x);\n      return result;\n    }\n  }\n  public EqualsAndHashCodeWithGenericsOnInners() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/EqualsAndHashCodeWithGenericsOnInnersInInterfaces.java",
    "content": "public interface EqualsAndHashCodeWithGenericsOnInnersInInterfaces<A> {\n  @lombok.EqualsAndHashCode class Inner<B> {\n    int x;\n    Inner() {\n      super();\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n      if ((o == this))\n          return true;\n      if ((! (o instanceof EqualsAndHashCodeWithGenericsOnInnersInInterfaces.Inner)))\n          return false;\n      final EqualsAndHashCodeWithGenericsOnInnersInInterfaces.Inner<?> other = (EqualsAndHashCodeWithGenericsOnInnersInInterfaces.Inner<?>) o;\n      if ((! other.canEqual((java.lang.Object) this)))\n          return false;\n      if ((this.x != other.x))\n          return false;\n      return true;\n    }\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n      return (other instanceof EqualsAndHashCodeWithGenericsOnInnersInInterfaces.Inner);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n      final int PRIME = 59;\n      int result = 1;\n      result = ((result * PRIME) + this.x);\n      return result;\n    }\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/EqualsAndHashCodeWithNonNullByDefault.java",
    "content": "import javax.annotation.ParametersAreNonnullByDefault;\n@lombok.EqualsAndHashCode @ParametersAreNonnullByDefault class EqualsAndHashCodeWithNonNullByDefault {\n  EqualsAndHashCodeWithNonNullByDefault() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final @javax.annotation.Nullable java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCodeWithNonNullByDefault)))\n        return false;\n    final EqualsAndHashCodeWithNonNullByDefault other = (EqualsAndHashCodeWithNonNullByDefault) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final @javax.annotation.Nullable java.lang.Object other) {\n    return (other instanceof EqualsAndHashCodeWithNonNullByDefault);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int result = 1;\n    return result;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/EqualsAndHashCodeWithOnParam.java",
    "content": "@interface Nullable {\n}\n@lombok.EqualsAndHashCode() class EqualsAndHashCodeWithOnParam {\n  int x;\n  boolean[] y;\n  Object[] z;\n  String a;\n  String b;\n  EqualsAndHashCodeWithOnParam() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final @Nullable java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCodeWithOnParam)))\n        return false;\n    final EqualsAndHashCodeWithOnParam other = (EqualsAndHashCodeWithOnParam) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((this.x != other.x))\n        return false;\n    if ((! java.util.Arrays.equals(this.y, other.y)))\n        return false;\n    if ((! java.util.Arrays.deepEquals(this.z, other.z)))\n        return false;\n    final java.lang.Object this$a = this.a;\n    final java.lang.Object other$a = other.a;\n    if (((this$a == null) ? (other$a != null) : (! this$a.equals(other$a))))\n        return false;\n    final java.lang.Object this$b = this.b;\n    final java.lang.Object other$b = other.b;\n    if (((this$b == null) ? (other$b != null) : (! this$b.equals(other$b))))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final @Nullable java.lang.Object other) {\n    return (other instanceof EqualsAndHashCodeWithOnParam);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.x);\n    result = ((result * PRIME) + java.util.Arrays.hashCode(this.y));\n    result = ((result * PRIME) + java.util.Arrays.deepHashCode(this.z));\n    final java.lang.Object $a = this.a;\n    result = ((result * PRIME) + (($a == null) ? 43 : $a.hashCode()));\n    final java.lang.Object $b = this.b;\n    result = ((result * PRIME) + (($b == null) ? 43 : $b.hashCode()));\n    return result;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/EqualsAndHashCodeWithSomeExistingMethods.java",
    "content": "import lombok.*;\nimport static lombok.AccessLevel.NONE;\n@Data @Getter(NONE) @Setter(NONE) class EqualsAndHashCodeWithSomeExistingMethods {\n  int x;\n  public int hashCode() {\n    return 42;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((\"EqualsAndHashCodeWithSomeExistingMethods(x=\" + this.x) + \")\");\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated EqualsAndHashCodeWithSomeExistingMethods() {\n    super();\n  }\n}\n@Data @Getter(NONE) @Setter(NONE) class EqualsAndHashCodeWithSomeExistingMethods2 {\n  int x;\n  protected boolean canEqual(Object other) {\n    return false;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCodeWithSomeExistingMethods2)))\n        return false;\n    final EqualsAndHashCodeWithSomeExistingMethods2 other = (EqualsAndHashCodeWithSomeExistingMethods2) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((this.x != other.x))\n        return false;\n    return true;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.x);\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((\"EqualsAndHashCodeWithSomeExistingMethods2(x=\" + this.x) + \")\");\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated EqualsAndHashCodeWithSomeExistingMethods2() {\n    super();\n  }\n}\n@Data @Getter(NONE) @Setter(NONE) class EqualsAndHashCodeWithAllExistingMethods {\n  int x;\n  public int hashCode() {\n    return 42;\n  }\n  public boolean equals(Object other) {\n    return false;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((\"EqualsAndHashCodeWithAllExistingMethods(x=\" + this.x) + \")\");\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated EqualsAndHashCodeWithAllExistingMethods() {\n    super();\n  }\n}\n@Data @Getter(AccessLevel.NONE) @Setter(lombok.AccessLevel.NONE) class EqualsAndHashCodeWithNoExistingMethods {\n  int x;\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof EqualsAndHashCodeWithNoExistingMethods)))\n        return false;\n    final EqualsAndHashCodeWithNoExistingMethods other = (EqualsAndHashCodeWithNoExistingMethods) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((this.x != other.x))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof EqualsAndHashCodeWithNoExistingMethods);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.x);\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((\"EqualsAndHashCodeWithNoExistingMethods(x=\" + this.x) + \")\");\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated EqualsAndHashCodeWithNoExistingMethods() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ExtensionMethodAmbiguousFunctional.java",
    "content": "import java.util.function.Consumer;\nimport java.util.function.Function;\nimport lombok.experimental.ExtensionMethod;\n@ExtensionMethod({ExtensionMethodAmbiguousFunctional.Extensions.class}) class ExtensionMethodAmbiguousFunctional {\n  static class Extensions {\n    Extensions() {\n      super();\n    }\n    public static <T, R>void ambiguous(T t, Function<T, R> function) {\n    }\n    public static <T>void ambiguous(T t, Consumer<T> function) {\n    }\n  }\n  ExtensionMethodAmbiguousFunctional() {\n    super();\n  }\n  public void test() {\n    \"\".ambiguous(System.out::println);\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ExtensionMethodAutoboxing.java",
    "content": "import lombok.experimental.ExtensionMethod;\n@ExtensionMethod({ExtensionMethodAutoboxing.Extensions.class}) class ExtensionMethodAutoboxing {\n  static class Extensions {\n    Extensions() {\n      super();\n    }\n    public static String boxing(String string, Long a, int b) {\n      return ((((string + \" \") + a) + \" \") + b);\n    }\n  }\n  ExtensionMethodAutoboxing() {\n    super();\n  }\n  public void test() {\n    Long l1 = 1l;\n    long l2 = 1l;\n    Integer i1 = 1;\n    int i2 = 1;\n    String string = \"test\";\n    ExtensionMethodAutoboxing.Extensions.boxing(string, l1, i1);\n    ExtensionMethodAutoboxing.Extensions.boxing(string, l1, i2);\n    ExtensionMethodAutoboxing.Extensions.boxing(string, l2, i1);\n    ExtensionMethodAutoboxing.Extensions.boxing(string, l2, i2);\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/ExtensionMethodChain.java",
    "content": "import java.util.Arrays;\nimport java.util.List;\nimport lombok.experimental.ExtensionMethod;\n@ExtensionMethod(ExtensionMethodChain.Extensions.class) class ExtensionMethodChain {\n  static class Extensions {\n    Extensions() {\n      super();\n    }\n    public static Integer intValue(String s) {\n      return Integer.valueOf(s);\n    }\n  }\n  ExtensionMethodChain() {\n    super();\n  }\n  public void test() {\n    ExtensionMethodChain.Extensions.intValue(\"1\").intValue();\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/ExtensionMethodFunctional.java",
    "content": "import java.util.function.Consumer;\nimport java.util.function.Function;\nimport java.util.List;\nimport java.util.stream.Collectors;\nimport java.util.stream.Stream;\nimport lombok.experimental.ExtensionMethod;\n@ExtensionMethod(value = ExtensionMethodFunctional.Extensions.class,suppressBaseMethods = false) class ExtensionMethodFunctional {\n  static class Extensions {\n    Extensions() {\n      super();\n    }\n    public static <T, R>R map(T value, Function<T, R> mapper) {\n      return mapper.apply(value);\n    }\n    public static String reverse(String string) {\n      return new StringBuilder(string).reverse().toString();\n    }\n    public static @SafeVarargs <T>void consume(T o, Consumer<T>... consumer) {\n      for (int i = 0;; (i < consumer.length); i ++) \n        {\n          consumer[i].accept(o);\n        }\n    }\n    public static <T>List<T> toList1(Stream<T> stream) {\n      return (List<T>) stream.collect(Collectors.toList());\n    }\n    public static <T, U>List<U> toList2(Stream<T> stream) {\n      return null;\n    }\n  }\n  ExtensionMethodFunctional() {\n    super();\n  }\n  public void test() {\n    String test = \"test\";\n    test = ExtensionMethodFunctional.Extensions.map(test, (<no type> s) -> ExtensionMethodFunctional.Extensions.reverse(s));\n    ExtensionMethodFunctional.Extensions.consume(test, (<no type> s) -> System.out.println((\"1: \" + s)), (<no type> s) -> System.out.println((\"2: \" + s)));\n    ExtensionMethodFunctional.Extensions.consume(test, System.out::println, System.out::println);\n    ExtensionMethodFunctional.Extensions.consume(test, ((test.length() > 0) ? System.out::println : null));\n    ExtensionMethodFunctional.Extensions.toList1(Stream.of(\"a\", \"b\", \"c\").map(String::toUpperCase));\n    List<Integer> i2 = ExtensionMethodFunctional.Extensions.toList2(Stream.of(\"a\", \"b\", \"c\").map(String::toUpperCase));\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ExtensionMethodGeneric.java",
    "content": "import java.util.List;\nimport java.util.Map;\nimport lombok.experimental.ExtensionMethod;\n@ExtensionMethod(ExtensionMethodGeneric.Extensions.class) class ExtensionMethodGeneric {\n  static class Extensions {\n    Extensions() {\n      super();\n    }\n    public static <T>List<T> test(List<String> obj, List<T> list) {\n      return null;\n    }\n    public static <K, V>K test(Map<String, Integer> obj, K k, V v) {\n      return k;\n    }\n    public static <T>T test(List<T> list) {\n      return null;\n    }\n    public static <T, U>U test2(List<T> list) {\n      return null;\n    }\n  }\n  ExtensionMethodGeneric() {\n    super();\n  }\n  public void test() {\n    List<String> stringList = null;\n    List<Number> numberList = null;\n    ExtensionMethodGeneric.Extensions.test(stringList);\n    ExtensionMethodGeneric.Extensions.test(stringList, numberList);\n    ExtensionMethodGeneric.Extensions.test(ExtensionMethodGeneric.Extensions.test(stringList, stringList), numberList);\n    Integer i = ExtensionMethodGeneric.Extensions.test2(stringList);\n    Map<String, Integer> map = null;\n    List<String> l = ExtensionMethodGeneric.Extensions.test(map, stringList, numberList);\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/ExtensionMethodInLambda.java",
    "content": "import java.util.function.Function;\nimport lombok.experimental.ExtensionMethod;\npublic @ExtensionMethod(value = ExtensionMethodInLambda.Extensions.class) class ExtensionMethodInLambda {\n  static class Extensions {\n    Extensions() {\n      super();\n    }\n    public static <T, R>R map(T value, Function<T, R> mapper) {\n      return mapper.apply(value);\n    }\n    public static String reverse(String string) {\n      return new StringBuilder(string).reverse().toString();\n    }\n    public static String trim(Integer integer) {\n      return \"0\";\n    }\n  }\n  private static final Function<String, String> testStatic = (<no type> s) -> ExtensionMethodInLambda.Extensions.reverse(s);\n  <clinit>() {\n  }\n  public ExtensionMethodInLambda() {\n    super();\n  }\n  public void testSimple() {\n    String test = \"test\";\n    test = ExtensionMethodInLambda.Extensions.map(test, (<no type> s) -> ExtensionMethodInLambda.Extensions.reverse(s));\n  }\n  public void testSameName() {\n    String test = \"test\";\n    test = ExtensionMethodInLambda.Extensions.map(test, (<no type> s) -> s.trim());\n  }\n  public void testArgumentOfInvalidMethod() {\n    String test = \"test\";\n    test.invalid((<no type> s) -> s.reverse());\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ExtensionMethodNames.java",
    "content": "package a;\nimport lombok.experimental.ExtensionMethod;\n@ExtensionMethod(Extensions.class) class ExtensionMethodNames {\n  ExtensionMethodNames() {\n    super();\n  }\n  public void instanceCalls() {\n    a.Extensions.ext(new Test());\n    Test t = new Test();\n    a.Extensions.ext(t);\n    Test Test = new Test();\n    a.Extensions.ext(Test);\n  }\n  public void staticCalls() {\n    Test.ext();\n    a.Test.ext();\n  }\n}\nclass Extensions {\n  Extensions() {\n    super();\n  }\n  public static void ext(Test t) {\n  }\n}\nclass Test {\n  Test() {\n    super();\n  }\n  public static void ext() {\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/ExtensionMethodNonStatic.java",
    "content": "import lombok.experimental.ExtensionMethod;\n@ExtensionMethod({ExtensionMethodNonStatic.Extensions.class}) class ExtensionMethodNonStatic {\n  static class Extensions {\n    Extensions() {\n      super();\n    }\n    public boolean startsWith(String s, String prefix) {\n      return s.startsWith(prefix);\n    }\n  }\n  ExtensionMethodNonStatic() {\n    super();\n  }\n  public void test() {\n    String s = \"test\";\n    s.startsWith(\"\");\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/ExtensionMethodNonStaticAccess.java",
    "content": "class ExtensionMethodNonStaticAccess {\n  ExtensionMethodNonStaticAccess() {\n    super();\n  }\n  public void method() {\n    Derived derived = new Derived();\n    derived.staticMethod();\n  }\n}\nclass Base {\n  Base() {\n    super();\n  }\n  static String staticMethod() {\n    return \"\";\n  }\n}\nclass Derived extends Base {\n  Derived() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ExtensionMethodOnRecord.java",
    "content": "// version 14:\nimport lombok.experimental.ExtensionMethod;\npublic @ExtensionMethod(ExtensionMethodOnRecord.Extensions.class) record ExtensionMethodOnRecord() {\n  static class Extensions {\n    Extensions() {\n      super();\n    }\n    public static Integer intValue(String s) {\n      return Integer.valueOf(s);\n    }\n  }\n  public void test() {\n    ExtensionMethodOnRecord.Extensions.intValue(\"1\");\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/ExtensionMethodPlain.java",
    "content": "import lombok.experimental.ExtensionMethod;\n@ExtensionMethod({java.util.Arrays.class, ExtensionMethodPlain.Extensions.class}) class ExtensionMethodPlain {\n  static class Extensions {\n    Extensions() {\n      super();\n    }\n    public static <T>T or(T obj, T ifNull) {\n      return ((obj != null) ? obj : ifNull);\n    }\n    public static String toTitleCase(String in) {\n      if (in.isEmpty())\n          return in;\n      return ((\"\" + Character.toTitleCase(in.charAt(0))) + in.substring(1).toLowerCase());\n    }\n  }\n  ExtensionMethodPlain() {\n    super();\n  }\n  public String test() {\n    int[] intArray = {5, 3, 8, 2};\n    java.util.Arrays.sort(intArray);\n    String iAmNull = null;\n    return ExtensionMethodPlain.Extensions.or(iAmNull, ExtensionMethodPlain.Extensions.toTitleCase(\"hELlO, WORlD!\"));\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/ExtensionMethodSuppress.java",
    "content": "import lombok.experimental.ExtensionMethod;\n@ExtensionMethod(Extensions.class) class ExtensionMethodSuppress {\n  ExtensionMethodSuppress() {\n    super();\n  }\n  public void test() {\n    Test.staticMethod();\n    Test test = new Test();\n    Extensions.instanceMethod(test);\n    Extensions.staticMethod(test);\n  }\n}\n@ExtensionMethod(value = Extensions.class,suppressBaseMethods = false) class ExtensionMethodKeep {\n  ExtensionMethodKeep() {\n    super();\n  }\n  public void test() {\n    Test.staticMethod();\n    Test test = new Test();\n    test.instanceMethod();\n    test.staticMethod();\n  }\n}\nclass Test {\n  Test() {\n    super();\n  }\n  public static void staticMethod() {\n  }\n  public void instanceMethod() {\n  }\n}\nclass Extensions {\n  Extensions() {\n    super();\n  }\n  public static void staticMethod(Test test) {\n  }\n  public static void instanceMethod(Test test) {\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/ExtensionMethodVarargs.java",
    "content": "import lombok.experimental.ExtensionMethod;\n@ExtensionMethod(ExtensionMethodVarargs.Extensions.class) class ExtensionMethodVarargs {\n  static class Extensions {\n    Extensions() {\n      super();\n    }\n    public static String format(String string, Object... params) {\n      return String.format(string, params);\n    }\n  }\n  ExtensionMethodVarargs() {\n    super();\n  }\n  public void test() {\n    Long l1 = 1l;\n    long l2 = 1l;\n    Integer i1 = 1;\n    int i2 = 1;\n    ExtensionMethodVarargs.Extensions.format(\"%d %d %d %d\", l1, l2, i1, i2);\n    ExtensionMethodVarargs.Extensions.format(\"%d\", l1);\n    ExtensionMethodVarargs.Extensions.format(\"\", new Integer[]{1, 2});\n    ExtensionMethodVarargs.Extensions.format(\"\", new Integer[]{1, 2}, new Integer[]{1, 2});\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/ExtensionMethodWidening.java",
    "content": "import lombok.experimental.ExtensionMethod;\n@ExtensionMethod({ExtensionMethodWidening.Extensions.class}) class ExtensionMethodWidening {\n  static class Extensions {\n    Extensions() {\n      super();\n    }\n    public static String widening(String string, long a) {\n      return ((string + \" \") + a);\n    }\n  }\n  ExtensionMethodWidening() {\n    super();\n  }\n  public void test() {\n    String string = \"test\";\n    ExtensionMethodWidening.Extensions.widening(string, 1);\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/FieldDefaults.java",
    "content": "@lombok.experimental.FieldDefaults(makeFinal = true) class FieldDefaults1 {\n  static int STATIC = 3;\n  final int x;\n  @lombok.experimental.NonFinal int y;\n  <clinit>() {\n  }\n  FieldDefaults1(int x) {\n    super();\n    this.x = x;\n  }\n}\n@lombok.experimental.FieldDefaults(level = lombok.AccessLevel.PRIVATE) class FieldDefaults2 {\n  static int STATIC = 3;\n  @lombok.experimental.PackagePrivate int x;\n  private int y;\n  <clinit>() {\n  }\n  FieldDefaults2() {\n    super();\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/FieldDefaultsNoop.java",
    "content": "@lombok.experimental.FieldDefaults class FieldDefaultsNoop {\n  FieldDefaultsNoop() {\n    super();\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/FieldDefaultsOnRecord.java",
    "content": "// version 14:\npublic @lombok.experimental.FieldDefaults(makeFinal = true) record FieldDefaultsOnRecord(String a, String b) {\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/FieldDefaultsViaConfig.java",
    "content": "class FieldDefaultsViaConfig1 {\n  private final int x;\n  private @lombok.experimental.NonFinal int y;\n  FieldDefaultsViaConfig1(int x) {\n    super();\n    this.x = x;\n  }\n}\n@lombok.experimental.FieldDefaults(level = lombok.AccessLevel.PROTECTED) class FieldDefaultsViaConfig2 {\n  final @lombok.experimental.PackagePrivate int x = 2;\n  protected final int y = 0;\n  FieldDefaultsViaConfig2() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/FieldDefaultsViaConfigAndRequiredArgsConstructor.java",
    "content": "@lombok.RequiredArgsConstructor class FieldDefaultsViaConfigAndRequiredArgsConstructor {\n  final int x;\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated FieldDefaultsViaConfigAndRequiredArgsConstructor(final int x) {\n    super();\n    this.x = x;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/FieldDefaultsViaConfigOnRecord.java",
    "content": "// version 14:\npublic record FieldDefaultsViaConfigOnRecord(String a, String b) {\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/FieldNameConstantsBasic.java",
    "content": "import lombok.experimental.FieldNameConstants;\nimport lombok.AccessLevel;\npublic @FieldNameConstants(level = AccessLevel.PACKAGE) class FieldNameConstantsBasic {\n  static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class Fields {\n    public static final java.lang.String iAmADvdPlayer = \"iAmADvdPlayer\";\n    public static final java.lang.String butPrintMePlease = \"butPrintMePlease\";\n    <clinit>() {\n    }\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated Fields() {\n      super();\n    }\n  }\n  String iAmADvdPlayer;\n  int $skipMe;\n  static double skipMeToo;\n  @FieldNameConstants.Exclude int andMe;\n  String butPrintMePlease;\n  <clinit>() {\n  }\n  public FieldNameConstantsBasic() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/FieldNameConstantsConfigKeys.java",
    "content": "public @lombok.experimental.FieldNameConstants class FieldNameConstantsConfigKeys {\n  public static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class Foobar {\n    public static final java.lang.String iAmADvdPlayer = \"iAmADvdPlayer\";\n    <clinit>() {\n    }\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated Foobar() {\n      super();\n    }\n  }\n  String iAmADvdPlayer;\n  public FieldNameConstantsConfigKeys() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/FieldNameConstantsEnum.java",
    "content": "import lombok.experimental.FieldNameConstants;\nimport lombok.AccessLevel;\npublic @FieldNameConstants(onlyExplicitlyIncluded = true,asEnum = true,innerTypeName = \"TypeTest\") class FieldNameConstantsEnum {\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated enum TypeTest {\n    iAmADvdPlayer(),\n    $dontSkipMe(),\n    alsoDontSkipMe(),\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated TypeTest() {\n      super();\n    }\n    <clinit>() {\n    }\n  }\n  @FieldNameConstants.Include String iAmADvdPlayer;\n  @FieldNameConstants.Include int $dontSkipMe;\n  static @FieldNameConstants.Include double alsoDontSkipMe;\n  int butSkipMe;\n  <clinit>() {\n  }\n  public FieldNameConstantsEnum() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/FieldNameConstantsHandrolled.java",
    "content": "import lombok.experimental.FieldNameConstants;\nimport lombok.AccessLevel;\n@FieldNameConstants(asEnum = true,innerTypeName = \"TypeTest\") class FieldNameConstantsHandrolled1 {\n  public enum TypeTest {\n    field1(),\n    alsoAField(),\n    thirdField(),\n    <clinit>() {\n    }\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated TypeTest() {\n      super();\n    }\n  }\n  int field1;\n  int alsoAField;\n  int thirdField;\n  FieldNameConstantsHandrolled1() {\n    super();\n  }\n}\n@FieldNameConstants(asEnum = true,innerTypeName = \"TypeTest\") class FieldNameConstantsHandrolled2 {\n  public enum TypeTest {\n    field1(),\n    alsoAField(),\n    thirdField(),\n    <clinit>() {\n    }\n    public String foo() {\n      return name();\n    }\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated TypeTest() {\n      super();\n    }\n  }\n  int field1;\n  int alsoAField;\n  int thirdField;\n  FieldNameConstantsHandrolled2() {\n    super();\n  }\n}\n@FieldNameConstants class FieldNameConstantsHandrolled3 {\n  static class Fields {\n    public static final java.lang.String field1 = \"field1\";\n    public static final java.lang.String thirdField = \"thirdField\";\n    public static final int alsoAField = 5;\n    <clinit>() {\n    }\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated Fields() {\n      super();\n    }\n  }\n  int field1;\n  int alsoAField;\n  int thirdField;\n  FieldNameConstantsHandrolled3() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/FieldNameConstantsInAnonymousClass.java",
    "content": "import lombok.experimental.FieldNameConstants;\npublic class FieldNameConstantsInAnonymousClass {\n  Object annonymous = new Object() {\n    @FieldNameConstants class Inner {\n      private String string;\n      Inner() {\n        super();\n      }\n    }\n    x() {\n      super();\n    }\n  };\n  public FieldNameConstantsInAnonymousClass() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/FieldNameConstantsOnRecord.java",
    "content": "// version 14:\nimport lombok.experimental.FieldNameConstants;\nimport lombok.AccessLevel;\npublic @FieldNameConstants(level = AccessLevel.PACKAGE) record FieldNameConstantsOnRecord(String iAmADvdPlayer, int $skipMe, int andMe, String butPrintMePlease) {\n  static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class Fields {\n    public static final java.lang.String iAmADvdPlayer = \"iAmADvdPlayer\";\n    public static final java.lang.String butPrintMePlease = \"butPrintMePlease\";\n    <clinit>() {\n    }\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated Fields() {\n      super();\n    }\n  }\n  static double skipMeToo;\n  <clinit>() {\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/FieldNameConstantsUppercased.java",
    "content": "import lombok.experimental.FieldNameConstants;\nimport lombok.AccessLevel;\npublic @FieldNameConstants(level = AccessLevel.PACKAGE) class FieldNameConstantsUppercased {\n  static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class Fields {\n    public static final java.lang.String I_AM_A_DVD_PLAYER = \"iAmADvdPlayer\";\n    public static final java.lang.String BUT_PRINT_ME_PLEASE = \"butPrintMePlease\";\n    <clinit>() {\n    }\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated Fields() {\n      super();\n    }\n  }\n  String iAmADvdPlayer;\n  int $skipMe;\n  static double skipMeToo;\n  @FieldNameConstants.Exclude int andMe;\n  String butPrintMePlease;\n  <clinit>() {\n  }\n  public FieldNameConstantsUppercased() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GenerateSuppressFBWarnings.java",
    "content": "class GenerateSuppressFBWarnings {\n  @lombok.Getter int y;\n  GenerateSuppressFBWarnings() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(justification = \"generated code\") @lombok.Generated int getY() {\n    return this.y;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GeneratedJavaxJakarta.java",
    "content": "class GeneratedJavaxJakarta {\n  @lombok.Getter int x;\n  GeneratedJavaxJakarta() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @javax.annotation.Generated(\"lombok\") @jakarta.annotation.Generated(\"lombok\") @lombok.Generated int getX() {\n    return this.x;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GeneratedJavaxOffLombokOff.java",
    "content": "class GeneratedJavaxOffLombokOff {\n  @lombok.Getter int x;\n  GeneratedJavaxOffLombokOff() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") int getX() {\n    return this.x;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GeneratedJavaxOnLombokOn.java",
    "content": "class GeneratedJavaxOnLombokOn {\n  @lombok.Getter int x;\n  GeneratedJavaxOnLombokOn() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @javax.annotation.Generated(\"lombok\") @lombok.Generated int getX() {\n    return this.x;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GeneratedOff.java",
    "content": "class GeneratedOff {\n  @lombok.Getter int x;\n  GeneratedOff() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getX() {\n    return this.x;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GeneratedOffJavaxOn.java",
    "content": "class GeneratedOffJavaxOn {\n  @lombok.Getter int x;\n  GeneratedOffJavaxOn() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @javax.annotation.Generated(\"lombok\") @lombok.Generated int getX() {\n    return this.x;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GeneratedOffLombokOn.java",
    "content": "class GeneratedOffLombokOn {\n  @lombok.Getter int x;\n  GeneratedOffLombokOn() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getX() {\n    return this.x;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GeneratedOn.java",
    "content": "class GeneratedOn {\n  @lombok.Getter int x;\n  GeneratedOn() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @javax.annotation.Generated(\"lombok\") @lombok.Generated int getX() {\n    return this.x;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GetterAccessLevel.java",
    "content": "class GetterAccessLevel {\n  @lombok.Getter(lombok.AccessLevel.NONE) boolean isNone;\n  @lombok.Getter(lombok.AccessLevel.PRIVATE) boolean isPrivate;\n  @lombok.Getter(lombok.AccessLevel.PACKAGE) boolean isPackage;\n  @lombok.Getter(lombok.AccessLevel.PROTECTED) boolean isProtected;\n  @lombok.Getter(lombok.AccessLevel.PUBLIC) boolean isPublic;\n  @lombok.Getter(lombok.AccessLevel.NONE) String noneString;\n  @lombok.Getter(lombok.AccessLevel.PRIVATE) String privateString;\n  @lombok.Getter(lombok.AccessLevel.PACKAGE) String packageString;\n  @lombok.Getter(lombok.AccessLevel.PROTECTED) String protectedString;\n  @lombok.Getter(lombok.AccessLevel.PUBLIC) String publicString;\n  @lombok.Getter(value = lombok.AccessLevel.PUBLIC) String value;\n  GetterAccessLevel() {\n    super();\n  }\n  private @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean isPrivate() {\n    return this.isPrivate;\n  }\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean isPackage() {\n    return this.isPackage;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean isProtected() {\n    return this.isProtected;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean isPublic() {\n    return this.isPublic;\n  }\n  private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getPrivateString() {\n    return this.privateString;\n  }\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getPackageString() {\n    return this.packageString;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getProtectedString() {\n    return this.protectedString;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getPublicString() {\n    return this.publicString;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getValue() {\n    return this.value;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GetterAlreadyExists.java",
    "content": "class Getter1 {\n  @lombok.Getter boolean foo;\n  Getter1() {\n    super();\n  }\n  boolean hasFoo() {\n    return true;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean isFoo() {\n    return this.foo;\n  }\n}\nclass Getter2 {\n  @lombok.Getter boolean foo;\n  Getter2() {\n    super();\n  }\n  boolean isFoo() {\n    return true;\n  }\n}\nclass Getter3 {\n  @lombok.Getter boolean foo;\n  Getter3() {\n    super();\n  }\n  boolean getFoo() {\n    return true;\n  }\n}\nclass Getter4 {\n  @lombok.Getter String foo;\n  Getter4() {\n    super();\n  }\n  String hasFoo() {\n    return null;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getFoo() {\n    return this.foo;\n  }\n}\nclass Getter5 {\n  @lombok.Getter String foo;\n  Getter5() {\n    super();\n  }\n  String isFoo() {\n    return null;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getFoo() {\n    return this.foo;\n  }\n}\nclass Getter6 {\n  @lombok.Getter String foo;\n  Getter6() {\n    super();\n  }\n  String getFoo() {\n    return null;\n  }\n}\nclass Getter7 {\n  @lombok.Getter String foo;\n  Getter7() {\n    super();\n  }\n  boolean hasFoo() {\n    return false;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getFoo() {\n    return this.foo;\n  }\n}\nclass Getter8 {\n  @lombok.Getter String foo;\n  Getter8() {\n    super();\n  }\n  boolean isFoo() {\n    return false;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getFoo() {\n    return this.foo;\n  }\n}\nclass Getter9 {\n  @lombok.Getter String foo;\n  Getter9() {\n    super();\n  }\n  boolean getFoo() {\n    return false;\n  }\n}\nclass Getter10 {\n  @lombok.Getter boolean foo;\n  Getter10() {\n    super();\n  }\n  static boolean hasFoo() {\n    return false;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean isFoo() {\n    return this.foo;\n  }\n}\nclass Getter11 {\n  @lombok.Getter boolean foo;\n  Getter11() {\n    super();\n  }\n  static boolean isFoo() {\n    return false;\n  }\n}\nclass Getter12 {\n  @lombok.Getter boolean foo;\n  Getter12() {\n    super();\n  }\n  static boolean getFoo() {\n    return false;\n  }\n}\nclass Getter13 {\n  @lombok.Getter String foo;\n  Getter13() {\n    super();\n  }\n  static boolean hasFoo() {\n    return false;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getFoo() {\n    return this.foo;\n  }\n}\nclass Getter14 {\n  @lombok.Getter String foo;\n  Getter14() {\n    super();\n  }\n  static boolean isFoo() {\n    return false;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getFoo() {\n    return this.foo;\n  }\n}\nclass Getter15 {\n  @lombok.Getter String foo;\n  Getter15() {\n    super();\n  }\n  static boolean getFoo() {\n    return false;\n  }\n}\nclass Getter16 {\n  @lombok.Getter String foo;\n  Getter16() {\n    super();\n  }\n  static String hasFoo() {\n    return \"\";\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getFoo() {\n    return this.foo;\n  }\n}\nclass Getter17 {\n  @lombok.Getter String foo;\n  Getter17() {\n    super();\n  }\n  static String isFoo() {\n    return \"\";\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getFoo() {\n    return this.foo;\n  }\n}\nclass Getter18 {\n  @lombok.Getter String foo;\n  Getter18() {\n    super();\n  }\n  static String getFoo() {\n    return \"\";\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GetterBoolean.java",
    "content": "class Getter {\n  @lombok.Getter boolean foo;\n  @lombok.Getter boolean isBar;\n  @lombok.Getter boolean hasBaz;\n  Getter() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean isFoo() {\n    return this.foo;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean isBar() {\n    return this.isBar;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean isHasBaz() {\n    return this.hasBaz;\n  }\n}\nclass MoreGetter {\n  @lombok.Getter boolean foo;\n  MoreGetter() {\n    super();\n  }\n  boolean hasFoo() {\n    return true;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean isFoo() {\n    return this.foo;\n  }\n}\nclass YetMoreGetter {\n  @lombok.Getter boolean foo;\n  YetMoreGetter() {\n    super();\n  }\n  boolean getFoo() {\n    return true;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GetterDeprecated.java",
    "content": "import lombok.Getter;\nclass GetterDeprecated {\n  @Deprecated @Getter int annotation;\n  @Getter int javadoc;\n  GetterDeprecated() {\n    super();\n  }\n  public @java.lang.Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getAnnotation() {\n    return this.annotation;\n  }\n  /**\n   * @deprecated\n   */\n  public @java.lang.Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getJavadoc() {\n    return this.javadoc;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GetterEnum.java",
    "content": "import lombok.AccessLevel;\nimport lombok.Getter;\nimport lombok.RequiredArgsConstructor;\n@RequiredArgsConstructor(access = AccessLevel.PRIVATE) enum GetterEnum {\n  ONE(1, \"One\"),\n  private final @Getter int id;\n  private final @Getter String name;\n  <clinit>() {\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getId() {\n    return this.id;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getName() {\n    return this.name;\n  }\n  private @java.lang.SuppressWarnings(\"all\") @lombok.Generated GetterEnum(final int id, final String name) {\n    super();\n    this.id = id;\n    this.name = name;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GetterEnumConstant.java",
    "content": "import lombok.Getter;\nenum GetterEnumConstant {\n  @Getter ONE(),\n  <clinit>() {\n  }\n  GetterEnumConstant() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GetterInAnonymousClass.java",
    "content": "import lombok.Getter;\npublic class GetterInAnonymousClass {\n  Object annonymous = new Object() {\n    @Getter class Inner {\n      private String string;\n      Inner() {\n        super();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getString() {\n        return this.string;\n      }\n    }\n    x() {\n      super();\n    }\n  };\n  public GetterInAnonymousClass() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GetterLazy.java",
    "content": "class GetterLazy {\n  static class ValueType {\n    ValueType() {\n      super();\n    }\n  }\n  private final @lombok.Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> fieldName = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n  GetterLazy() {\n    super();\n  }\n  public @java.lang.SuppressWarnings({\"all\", \"unchecked\"}) @lombok.Generated ValueType getFieldName() {\n    java.lang.Object $value = this.fieldName.get();\n    if (($value == null))\n        {\n          synchronized (this.fieldName)\n            {\n              $value = this.fieldName.get();\n              if (($value == null))\n                  {\n                    final ValueType actualValue = new ValueType();\n                    $value = ((actualValue == null) ? this.fieldName : actualValue);\n                    this.fieldName.set($value);\n                  }\n            }\n        }\n    return (ValueType) (($value == this.fieldName) ? null : $value);\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GetterLazyArguments.java",
    "content": "class GetterLazyArguments {\n  private final @lombok.Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> field1 = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n  private final @lombok.Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> field2 = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n  private final @lombok.Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> field3 = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n  private final @lombok.Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> field4 = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n  private final @lombok.Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> field5 = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n  private final @lombok.Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> field6 = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n  GetterLazyArguments() {\n    super();\n  }\n  static String fun() {\n    return null;\n  }\n  static String stringInt(String arg1, Integer arg2) {\n    return null;\n  }\n  static String stringRunnable(String arg1, Runnable arg2) {\n    return null;\n  }\n  public @java.lang.SuppressWarnings({\"all\", \"unchecked\"}) @lombok.Generated String getField1() {\n    java.lang.Object $value = this.field1.get();\n    if (($value == null))\n        {\n          synchronized (this.field1)\n            {\n              $value = this.field1.get();\n              if (($value == null))\n                  {\n                    final String actualValue = stringInt(\"a\", 1);\n                    $value = ((actualValue == null) ? this.field1 : actualValue);\n                    this.field1.set($value);\n                  }\n            }\n        }\n    return (String) (($value == this.field1) ? null : $value);\n  }\n  public @java.lang.SuppressWarnings({\"all\", \"unchecked\"}) @lombok.Generated String getField2() {\n    java.lang.Object $value = this.field2.get();\n    if (($value == null))\n        {\n          synchronized (this.field2)\n            {\n              $value = this.field2.get();\n              if (($value == null))\n                  {\n                    final String actualValue = stringInt((true ? \"a\" : \"b\"), (true ? 1 : 0));\n                    $value = ((actualValue == null) ? this.field2 : actualValue);\n                    this.field2.set($value);\n                  }\n            }\n        }\n    return (String) (($value == this.field2) ? null : $value);\n  }\n  public @java.lang.SuppressWarnings({\"all\", \"unchecked\"}) @lombok.Generated String getField3() {\n    java.lang.Object $value = this.field3.get();\n    if (($value == null))\n        {\n          synchronized (this.field3)\n            {\n              $value = this.field3.get();\n              if (($value == null))\n                  {\n                    final String actualValue = stringInt(\"a\", (true ? 1 : 0));\n                    $value = ((actualValue == null) ? this.field3 : actualValue);\n                    this.field3.set($value);\n                  }\n            }\n        }\n    return (String) (($value == this.field3) ? null : $value);\n  }\n  public @java.lang.SuppressWarnings({\"all\", \"unchecked\"}) @lombok.Generated String getField4() {\n    java.lang.Object $value = this.field4.get();\n    if (($value == null))\n        {\n          synchronized (this.field4)\n            {\n              $value = this.field4.get();\n              if (($value == null))\n                  {\n                    final String actualValue = stringRunnable(fun(), () -> {\n});\n                    $value = ((actualValue == null) ? this.field4 : actualValue);\n                    this.field4.set($value);\n                  }\n            }\n        }\n    return (String) (($value == this.field4) ? null : $value);\n  }\n  public @java.lang.SuppressWarnings({\"all\", \"unchecked\"}) @lombok.Generated String getField5() {\n    java.lang.Object $value = this.field5.get();\n    if (($value == null))\n        {\n          synchronized (this.field5)\n            {\n              $value = this.field5.get();\n              if (($value == null))\n                  {\n                    final String actualValue = stringRunnable(\"a\", () -> {\n});\n                    $value = ((actualValue == null) ? this.field5 : actualValue);\n                    this.field5.set($value);\n                  }\n            }\n        }\n    return (String) (($value == this.field5) ? null : $value);\n  }\n  public @java.lang.SuppressWarnings({\"all\", \"unchecked\"}) @lombok.Generated String getField6() {\n    java.lang.Object $value = this.field6.get();\n    if (($value == null))\n        {\n          synchronized (this.field6)\n            {\n              $value = this.field6.get();\n              if (($value == null))\n                  {\n                    final String actualValue = (true ? stringInt((true ? \"a\" : \"b\"), (true ? 1 : 0)) : \"\");\n                    $value = ((actualValue == null) ? this.field6 : actualValue);\n                    this.field6.set($value);\n                  }\n            }\n        }\n    return (String) (($value == this.field6) ? null : $value);\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GetterLazyBoolean.java",
    "content": "@lombok.EqualsAndHashCode(of = \"booleanValue\") @lombok.ToString(of = \"booleanValue\") class GetterLazyBoolean {\n  private final @lombok.Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> booleanValue = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n  private final @lombok.Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> otherBooleanValue = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n  GetterLazyBoolean() {\n    super();\n  }\n  private static boolean calculateBoolean() {\n    return true;\n  }\n  public @java.lang.SuppressWarnings({\"all\", \"unchecked\"}) @lombok.Generated boolean isBooleanValue() {\n    java.lang.Object $value = this.booleanValue.get();\n    if (($value == null))\n        {\n          synchronized (this.booleanValue)\n            {\n              $value = this.booleanValue.get();\n              if (($value == null))\n                  {\n                    final boolean actualValue = calculateBoolean();\n                    $value = actualValue;\n                    this.booleanValue.set($value);\n                  }\n            }\n        }\n    return (java.lang.Boolean) $value;\n  }\n  public @java.lang.SuppressWarnings({\"all\", \"unchecked\"}) @lombok.Generated boolean isOtherBooleanValue() {\n    java.lang.Object $value = this.otherBooleanValue.get();\n    if (($value == null))\n        {\n          synchronized (this.otherBooleanValue)\n            {\n              $value = this.otherBooleanValue.get();\n              if (($value == null))\n                  {\n                    final boolean actualValue = (! calculateBoolean());\n                    $value = actualValue;\n                    this.otherBooleanValue.set($value);\n                  }\n            }\n        }\n    return (java.lang.Boolean) $value;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof GetterLazyBoolean)))\n        return false;\n    final GetterLazyBoolean other = (GetterLazyBoolean) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((this.isBooleanValue() != other.isBooleanValue()))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof GetterLazyBoolean);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + (this.isBooleanValue() ? 79 : 97));\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((\"GetterLazyBoolean(booleanValue=\" + this.isBooleanValue()) + \")\");\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GetterLazyEahcToString.java",
    "content": "@lombok.EqualsAndHashCode(doNotUseGetters = true) @lombok.ToString(doNotUseGetters = true) class GetterLazyEahcToString {\n  private final @lombok.Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> value = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n  private final @lombok.Getter String value2 = \"\";\n  GetterLazyEahcToString() {\n    super();\n  }\n  public @java.lang.SuppressWarnings({\"all\", \"unchecked\"}) @lombok.Generated String getValue() {\n    java.lang.Object $value = this.value.get();\n    if (($value == null))\n        {\n          synchronized (this.value)\n            {\n              $value = this.value.get();\n              if (($value == null))\n                  {\n                    final String actualValue = \"\";\n                    $value = ((actualValue == null) ? this.value : actualValue);\n                    this.value.set($value);\n                  }\n            }\n        }\n    return (String) (($value == this.value) ? null : $value);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getValue2() {\n    return this.value2;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof GetterLazyEahcToString)))\n        return false;\n    final GetterLazyEahcToString other = (GetterLazyEahcToString) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    final java.lang.Object this$value = this.getValue();\n    final java.lang.Object other$value = other.getValue();\n    if (((this$value == null) ? (other$value != null) : (! this$value.equals(other$value))))\n        return false;\n    final java.lang.Object this$value2 = this.value2;\n    final java.lang.Object other$value2 = other.value2;\n    if (((this$value2 == null) ? (other$value2 != null) : (! this$value2.equals(other$value2))))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof GetterLazyEahcToString);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    final java.lang.Object $value = this.getValue();\n    result = ((result * PRIME) + (($value == null) ? 43 : $value.hashCode()));\n    final java.lang.Object $value2 = this.value2;\n    result = ((result * PRIME) + (($value2 == null) ? 43 : $value2.hashCode()));\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((((\"GetterLazyEahcToString(value=\" + this.getValue()) + \", value2=\") + this.value2) + \")\");\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GetterLazyGenerics.java",
    "content": "class GetterLazyGenerics<E> {\n  private final @lombok.Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> field = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n  private final @lombok.Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> field2 = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n  GetterLazyGenerics() {\n    super();\n  }\n  public static <E>E getAny() {\n    return null;\n  }\n  public @java.lang.SuppressWarnings({\"all\", \"unchecked\"}) @lombok.Generated E getField() {\n    java.lang.Object $value = this.field.get();\n    if (($value == null))\n        {\n          synchronized (this.field)\n            {\n              $value = this.field.get();\n              if (($value == null))\n                  {\n                    final E actualValue = getAny();\n                    $value = ((actualValue == null) ? this.field : actualValue);\n                    this.field.set($value);\n                  }\n            }\n        }\n    return (E) (($value == this.field) ? null : $value);\n  }\n  public @java.lang.SuppressWarnings({\"all\", \"unchecked\"}) @lombok.Generated long getField2() {\n    java.lang.Object $value = this.field2.get();\n    if (($value == null))\n        {\n          synchronized (this.field2)\n            {\n              $value = this.field2.get();\n              if (($value == null))\n                  {\n                    final long actualValue = System.currentTimeMillis();\n                    $value = actualValue;\n                    this.field2.set($value);\n                  }\n            }\n        }\n    return (java.lang.Long) $value;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GetterLazyInAnonymousClass.java",
    "content": "import lombok.Getter;\npublic class GetterLazyInAnonymousClass {\n  Object annonymous = new Object() {\n    class Inner {\n      private final @Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> string = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n      Inner() {\n        super();\n      }\n      public @java.lang.SuppressWarnings({\"all\", \"unchecked\"}) @lombok.Generated String getString() {\n        java.lang.Object $value = this.string.get();\n        if (($value == null))\n            {\n              synchronized (this.string)\n                {\n                  $value = this.string.get();\n                  if (($value == null))\n                      {\n                        final String actualValue = \"test\";\n                        $value = ((actualValue == null) ? this.string : actualValue);\n                        this.string.set($value);\n                      }\n                }\n            }\n        return (String) (($value == this.string) ? null : $value);\n      }\n    }\n    x() {\n      super();\n    }\n  };\n  public GetterLazyInAnonymousClass() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GetterLazyInvalid.java",
    "content": "class GetterLazyInvalidNotFinal {\n  private @lombok.Getter(lazy = true) String fieldName = \"\";\n  GetterLazyInvalidNotFinal() {\n    super();\n  }\n}\nclass GetterLazyInvalidNotPrivate {\n  final @lombok.Getter(lazy = true) String fieldName = \"\";\n  GetterLazyInvalidNotPrivate() {\n    super();\n  }\n}\nclass GetterLazyInvalidNotPrivateFinal {\n  @lombok.Getter(lazy = true) String fieldName = \"\";\n  GetterLazyInvalidNotPrivateFinal() {\n    super();\n  }\n}\nclass GetterLazyInvalidNone {\n  private final @lombok.Getter(lazy = true,value = lombok.AccessLevel.NONE) String fieldName = \"\";\n  GetterLazyInvalidNone() {\n    super();\n  }\n}\n@lombok.Getter(lazy = true) class GetterLazyInvalidClass {\n  private final String fieldName = \"\";\n  GetterLazyInvalidClass() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getFieldName() {\n    return this.fieldName;\n  }\n}\nclass GetterLazyInvalidNoInit {\n  private final @lombok.Getter(lazy = true) String fieldName;\n  GetterLazyInvalidNoInit() {\n    super();\n    this.fieldName = \"foo\";\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GetterLazyNative.java",
    "content": "class GetterLazyNative {\n  private final @lombok.Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> booleanField = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n  private final @lombok.Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> byteField = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n  private final @lombok.Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> shortField = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n  private final @lombok.Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> intField = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n  private final @lombok.Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> longField = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n  private final @lombok.Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> floatField = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n  private final @lombok.Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> doubleField = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n  private final @lombok.Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> charField = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n  private final @lombok.Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> intArrayField = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n  GetterLazyNative() {\n    super();\n  }\n  public @java.lang.SuppressWarnings({\"all\", \"unchecked\"}) @lombok.Generated boolean isBooleanField() {\n    java.lang.Object $value = this.booleanField.get();\n    if (($value == null))\n        {\n          synchronized (this.booleanField)\n            {\n              $value = this.booleanField.get();\n              if (($value == null))\n                  {\n                    final boolean actualValue = true;\n                    $value = actualValue;\n                    this.booleanField.set($value);\n                  }\n            }\n        }\n    return (java.lang.Boolean) $value;\n  }\n  public @java.lang.SuppressWarnings({\"all\", \"unchecked\"}) @lombok.Generated byte getByteField() {\n    java.lang.Object $value = this.byteField.get();\n    if (($value == null))\n        {\n          synchronized (this.byteField)\n            {\n              $value = this.byteField.get();\n              if (($value == null))\n                  {\n                    final byte actualValue = 1;\n                    $value = actualValue;\n                    this.byteField.set($value);\n                  }\n            }\n        }\n    return (java.lang.Byte) $value;\n  }\n  public @java.lang.SuppressWarnings({\"all\", \"unchecked\"}) @lombok.Generated short getShortField() {\n    java.lang.Object $value = this.shortField.get();\n    if (($value == null))\n        {\n          synchronized (this.shortField)\n            {\n              $value = this.shortField.get();\n              if (($value == null))\n                  {\n                    final short actualValue = 1;\n                    $value = actualValue;\n                    this.shortField.set($value);\n                  }\n            }\n        }\n    return (java.lang.Short) $value;\n  }\n  public @java.lang.SuppressWarnings({\"all\", \"unchecked\"}) @lombok.Generated int getIntField() {\n    java.lang.Object $value = this.intField.get();\n    if (($value == null))\n        {\n          synchronized (this.intField)\n            {\n              $value = this.intField.get();\n              if (($value == null))\n                  {\n                    final int actualValue = 1;\n                    $value = actualValue;\n                    this.intField.set($value);\n                  }\n            }\n        }\n    return (java.lang.Integer) $value;\n  }\n  public @java.lang.SuppressWarnings({\"all\", \"unchecked\"}) @lombok.Generated long getLongField() {\n    java.lang.Object $value = this.longField.get();\n    if (($value == null))\n        {\n          synchronized (this.longField)\n            {\n              $value = this.longField.get();\n              if (($value == null))\n                  {\n                    final long actualValue = 1;\n                    $value = actualValue;\n                    this.longField.set($value);\n                  }\n            }\n        }\n    return (java.lang.Long) $value;\n  }\n  public @java.lang.SuppressWarnings({\"all\", \"unchecked\"}) @lombok.Generated float getFloatField() {\n    java.lang.Object $value = this.floatField.get();\n    if (($value == null))\n        {\n          synchronized (this.floatField)\n            {\n              $value = this.floatField.get();\n              if (($value == null))\n                  {\n                    final float actualValue = 1.0f;\n                    $value = actualValue;\n                    this.floatField.set($value);\n                  }\n            }\n        }\n    return (java.lang.Float) $value;\n  }\n  public @java.lang.SuppressWarnings({\"all\", \"unchecked\"}) @lombok.Generated double getDoubleField() {\n    java.lang.Object $value = this.doubleField.get();\n    if (($value == null))\n        {\n          synchronized (this.doubleField)\n            {\n              $value = this.doubleField.get();\n              if (($value == null))\n                  {\n                    final double actualValue = 1.0;\n                    $value = actualValue;\n                    this.doubleField.set($value);\n                  }\n            }\n        }\n    return (java.lang.Double) $value;\n  }\n  public @java.lang.SuppressWarnings({\"all\", \"unchecked\"}) @lombok.Generated char getCharField() {\n    java.lang.Object $value = this.charField.get();\n    if (($value == null))\n        {\n          synchronized (this.charField)\n            {\n              $value = this.charField.get();\n              if (($value == null))\n                  {\n                    final char actualValue = '1';\n                    $value = actualValue;\n                    this.charField.set($value);\n                  }\n            }\n        }\n    return (java.lang.Character) $value;\n  }\n  public @java.lang.SuppressWarnings({\"all\", \"unchecked\"}) @lombok.Generated int[] getIntArrayField() {\n    java.lang.Object $value = this.intArrayField.get();\n    if (($value == null))\n        {\n          synchronized (this.intArrayField)\n            {\n              $value = this.intArrayField.get();\n              if (($value == null))\n                  {\n                    final int[] actualValue = new int[]{1};\n                    $value = ((actualValue == null) ? this.intArrayField : actualValue);\n                    this.intArrayField.set($value);\n                  }\n            }\n        }\n    return (int[]) (($value == this.intArrayField) ? null : $value);\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GetterLazyTransient.java",
    "content": "class GetterLazyTransient {\n  private final @lombok.Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> nonTransientField = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n  private final transient @lombok.Getter(lazy = true) int transientField = 2;\n  private final transient @lombok.Getter int nonLazyTransientField = 3;\n  GetterLazyTransient() {\n    super();\n  }\n  public @java.lang.SuppressWarnings({\"all\", \"unchecked\"}) @lombok.Generated int getNonTransientField() {\n    java.lang.Object $value = this.nonTransientField.get();\n    if (($value == null))\n        {\n          synchronized (this.nonTransientField)\n            {\n              $value = this.nonTransientField.get();\n              if (($value == null))\n                  {\n                    final int actualValue = 1;\n                    $value = actualValue;\n                    this.nonTransientField.set($value);\n                  }\n            }\n        }\n    return (java.lang.Integer) $value;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getNonLazyTransientField() {\n    return this.nonLazyTransientField;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GetterNone.java",
    "content": "import lombok.AccessLevel;\nimport lombok.Getter;\n@Getter class GetterNone {\n  int i;\n  @Getter(AccessLevel.NONE) int foo;\n  GetterNone() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getI() {\n    return this.i;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GetterOnClass.java",
    "content": "@lombok.Getter class GetterOnClass1 {\n  @lombok.Getter(lombok.AccessLevel.NONE) boolean isNone;\n  boolean isPublic;\n  GetterOnClass1() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean isPublic() {\n    return this.isPublic;\n  }\n}\n@lombok.Getter(lombok.AccessLevel.PROTECTED) class GetterOnClass2 {\n  @lombok.Getter(lombok.AccessLevel.NONE) boolean isNone;\n  boolean isProtected;\n  @lombok.Getter(lombok.AccessLevel.PACKAGE) boolean isPackage;\n  GetterOnClass2() {\n    super();\n  }\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean isPackage() {\n    return this.isPackage;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean isProtected() {\n    return this.isProtected;\n  }\n}\n@lombok.Getter(lombok.AccessLevel.PACKAGE) class GetterOnClass3 {\n  @lombok.Getter(lombok.AccessLevel.NONE) boolean isNone;\n  boolean isPackage;\n  GetterOnClass3() {\n    super();\n  }\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean isPackage() {\n    return this.isPackage;\n  }\n}\n@lombok.Getter(lombok.AccessLevel.PRIVATE) class GetterOnClass4 {\n  @lombok.Getter(lombok.AccessLevel.NONE) boolean isNone;\n  boolean isPrivate;\n  GetterOnClass4() {\n    super();\n  }\n  private @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean isPrivate() {\n    return this.isPrivate;\n  }\n}\n@lombok.Getter(lombok.AccessLevel.PUBLIC) class GetterOnClass5 {\n  @lombok.Getter(lombok.AccessLevel.NONE) boolean isNone;\n  boolean isPublic;\n  GetterOnClass5() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean isPublic() {\n    return this.isPublic;\n  }\n}\n@lombok.Getter class GetterOnClass6 {\n  String couldBeNull;\n  @lombok.NonNull String nonNull;\n  GetterOnClass6() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getCouldBeNull() {\n    return this.couldBeNull;\n  }\n  public @lombok.NonNull @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getNonNull() {\n    return this.nonNull;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GetterOnMethod.java",
    "content": "class GetterOnMethod {\n  public @interface Test {\n  }\n  @lombok.Getter() int i;\n  @lombok.Getter() int j;\n  @lombok.Getter() int k;\n  GetterOnMethod() {\n    super();\n  }\n  public @Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getI() {\n    return this.i;\n  }\n  public @java.lang.Deprecated @Test @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getJ() {\n    return this.j;\n  }\n  public @java.lang.Deprecated @Test @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getK() {\n    return this.k;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GetterOnMethodErrors2.java",
    "content": "class GetterOnMethodErrors2 {\n  public @interface Test {\n  }\n  private @lombok.Getter() int bad1;\n  private @lombok.Getter() int bad2;\n  private @lombok.Getter() int bad3;\n  private @lombok.Getter() int bad4;\n  private @lombok.Getter() int good1;\n  private @lombok.Getter() int good2;\n  private @lombok.Getter() int good3;\n  private @lombok.Getter() int good4;\n  GetterOnMethodErrors2() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getBad1() {\n    return this.bad1;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getBad2() {\n    return this.bad2;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getBad3() {\n    return this.bad3;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getBad4() {\n    return this.bad4;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getGood1() {\n    return this.good1;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getGood2() {\n    return this.good2;\n  }\n  public @Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getGood3() {\n    return this.good3;\n  }\n  public @Deprecated @Test @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getGood4() {\n    return this.good4;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GetterOnMethodOnType.java",
    "content": "@lombok.Getter() class GetterOnMethodOnType {\n  private int test;\n  private String name;\n  GetterOnMethodOnType() {\n    super();\n  }\n  public @Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getTest() {\n    return this.test;\n  }\n  public @Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getName() {\n    return this.name;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GetterOnRecord.java",
    "content": "// version 14:\nimport lombok.Getter;\npublic @Getter record GetterOnRecord(String a, String b) {\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GetterOnStatic.java",
    "content": "class Getter {\n  static @lombok.Getter boolean foo;\n  static @lombok.Getter int bar;\n  <clinit>() {\n  }\n  Getter() {\n    super();\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean isFoo() {\n    return Getter.foo;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getBar() {\n    return Getter.bar;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GetterPlain.java",
    "content": "import lombok.Getter;\nclass GetterPlain {\n  @lombok.Getter int i;\n  @Getter int foo;\n  GetterPlain() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getI() {\n    return this.i;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getFoo() {\n    return this.foo;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GetterSetterJavadoc.java",
    "content": "@lombok.Data class GetterSetterJavadoc1 {\n  private int fieldName;\n  /**\n   * Getter section\n   * \n   * @return Sky is blue1\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getFieldName() {\n    return this.fieldName;\n  }\n  /**\n   * Some text\n   * \n   * @param fieldName Hello, World1\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setFieldName(final int fieldName) {\n    this.fieldName = fieldName;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof GetterSetterJavadoc1)))\n        return false;\n    final GetterSetterJavadoc1 other = (GetterSetterJavadoc1) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((this.getFieldName() != other.getFieldName()))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof GetterSetterJavadoc1);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.getFieldName());\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((\"GetterSetterJavadoc1(fieldName=\" + this.getFieldName()) + \")\");\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated GetterSetterJavadoc1() {\n    super();\n  }\n}\nclass GetterSetterJavadoc2 {\n  private @lombok.Getter @lombok.Setter int fieldName;\n  GetterSetterJavadoc2() {\n    super();\n  }\n  /**\n   * Some text\n   * \n   * @return Sky is blue2\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getFieldName() {\n    return this.fieldName;\n  }\n  /**\n   * Some text\n   * \n   * @param fieldName Hello, World2\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setFieldName(final int fieldName) {\n    this.fieldName = fieldName;\n  }\n}\nclass GetterSetterJavadoc3 {\n  private @lombok.Getter @lombok.Setter int fieldName;\n  GetterSetterJavadoc3() {\n    super();\n  }\n  /**\n   * Getter section\n   * @return Sky is blue3\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getFieldName() {\n    return this.fieldName;\n  }\n  /**\n   * Setter section\n   * @param fieldName Hello, World3\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setFieldName(final int fieldName) {\n    this.fieldName = fieldName;\n  }\n}\n@lombok.experimental.Accessors(chain = true,fluent = true) class GetterSetterJavadoc4 {\n  private @lombok.Getter @lombok.Setter int fieldName;\n  GetterSetterJavadoc4() {\n    super();\n  }\n  /**\n   * Some text\n   * \n   * @return Sky is blue4\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int fieldName() {\n    return this.fieldName;\n  }\n  /**\n   * Some text\n   * \n   * @param fieldName Hello, World4\n   * @return {@code this}.\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated GetterSetterJavadoc4 fieldName(final int fieldName) {\n    this.fieldName = fieldName;\n    return this;\n  }\n}\n@lombok.experimental.Accessors(chain = true,fluent = true) class GetterSetterJavadoc5 {\n  private @lombok.Getter @lombok.Setter int fieldName;\n  GetterSetterJavadoc5() {\n    super();\n  }\n  /**\n   * Getter section\n   * @return Sky is blue5\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int fieldName() {\n    return this.fieldName;\n  }\n  /**\n   * Setter section\n   * @param fieldName Hello, World5\n   * @return Sky is blue5\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated GetterSetterJavadoc5 fieldName(final int fieldName) {\n    this.fieldName = fieldName;\n    return this;\n  }\n}\n@lombok.Data class GetterSetterJavadocLong {\n  private String userId;\n  /**\n   * This field represents the unique identifier for a user in the system. It is used \n   * throughout the application to uniquely identify and retrieve user-related data. \n   * The ID is typically generated by the database and is guaranteed to be unique \n   * within the context of the system. \n   * \n   * <p>The ID is an integral part of various operations, including but not limited to:\n   * <ul>\n   *   <li>Authenticating users during login processes.</li>\n   *   <li>Associating user-specific preferences and settings.</li>\n   *   <li>Tracking user activity and logs for auditing purposes.</li>\n   *   <li>Facilitating relationships between users and other entities such as orders,\n   *       messages, or roles within the system.</li>\n   * </ul>\n   * \n   * <p>Key characteristics of the {@code userId} field:\n   * <ul>\n   *   <li><strong>Immutability:</strong> Once assigned, the ID must not be modified to\n   *       ensure data integrity.</li>\n   *   <li><strong>Security:</strong> Access to this field should be controlled to prevent\n   *       unauthorized modifications or data leakage.</li>\n   *   <li><strong>Uniqueness:</strong> The ID must be unique within the system. For \n   *       distributed systems, consider using GUIDs or UUIDs to avoid collisions.</li>\n   * </ul>\n   * \n   * <p>Example usage:\n   * <pre>\n   *     User user = userService.getUserById(userId);\n   *     if (user != null) {\n   *         System.out.println(\"User found: \" + user.getName());\n   *     } else {\n   *         System.out.println(\"User not found.\");\n   *     }\n   * </pre>\n   * \n   * <p>Developers should ensure that the ID complies with constraints imposed by the \n   * database schema, such as length and format restrictions. Furthermore, it is \n   * recommended to validate the ID before persisting or using it in critical operations.\n   * \n   * <p>For methods or constructors that accept the {@code userId} as a parameter, the \n   * following guidelines should be followed:\n   * <ul>\n   *   <li>Validate the format of the ID to ensure it adheres to system requirements.</li>\n   *   <li>Handle null or empty values gracefully, providing appropriate error messages\n   *       or default behavior where necessary.</li>\n   * </ul>\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getUserId() {\n    return this.userId;\n  }\n  /**\n   * This field represents the unique identifier for a user in the system. It is used \n   * throughout the application to uniquely identify and retrieve user-related data. \n   * The ID is typically generated by the database and is guaranteed to be unique \n   * within the context of the system. \n   * \n   * <p>The ID is an integral part of various operations, including but not limited to:\n   * <ul>\n   *   <li>Authenticating users during login processes.</li>\n   *   <li>Associating user-specific preferences and settings.</li>\n   *   <li>Tracking user activity and logs for auditing purposes.</li>\n   *   <li>Facilitating relationships between users and other entities such as orders,\n   *       messages, or roles within the system.</li>\n   * </ul>\n   * \n   * <p>Key characteristics of the {@code userId} field:\n   * <ul>\n   *   <li><strong>Immutability:</strong> Once assigned, the ID must not be modified to\n   *       ensure data integrity.</li>\n   *   <li><strong>Security:</strong> Access to this field should be controlled to prevent\n   *       unauthorized modifications or data leakage.</li>\n   *   <li><strong>Uniqueness:</strong> The ID must be unique within the system. For \n   *       distributed systems, consider using GUIDs or UUIDs to avoid collisions.</li>\n   * </ul>\n   * \n   * <p>Example usage:\n   * <pre>\n   *     User user = userService.getUserById(userId);\n   *     if (user != null) {\n   *         System.out.println(\"User found: \" + user.getName());\n   *     } else {\n   *         System.out.println(\"User not found.\");\n   *     }\n   * </pre>\n   * \n   * <p>Developers should ensure that the ID complies with constraints imposed by the \n   * database schema, such as length and format restrictions. Furthermore, it is \n   * recommended to validate the ID before persisting or using it in critical operations.\n   * \n   * <p>For methods or constructors that accept the {@code userId} as a parameter, the \n   * following guidelines should be followed:\n   * <ul>\n   *   <li>Validate the format of the ID to ensure it adheres to system requirements.</li>\n   *   <li>Handle null or empty values gracefully, providing appropriate error messages\n   *       or default behavior where necessary.</li>\n   * </ul>\n   * \n   * @param userId the unique identifier assigned to a user. This value must be non-null \n   *               and conform to the format defined by the system. Passing a null or \n   *               invalid ID may result in an {@link IllegalArgumentException} or \n   *               similar error.\n   * @param databaseConnection the connection to the database used for retrieving or \n   *                           persisting the user ID. This parameter is required for \n   *                           database-related operations and must be properly closed \n   *                           after use to prevent resource leaks.\n   * @param userRole the role associated with the user (e.g., \"admin\", \"user\", \"guest\"). \n   *                 This parameter may influence access control and permissions \n   *                 granted to the user within the system.\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setUserId(final String userId) {\n    this.userId = userId;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof GetterSetterJavadocLong)))\n        return false;\n    final GetterSetterJavadocLong other = (GetterSetterJavadocLong) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    final java.lang.Object this$userId = this.getUserId();\n    final java.lang.Object other$userId = other.getUserId();\n    if (((this$userId == null) ? (other$userId != null) : (! this$userId.equals(other$userId))))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof GetterSetterJavadocLong);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    final java.lang.Object $userId = this.getUserId();\n    result = ((result * PRIME) + (($userId == null) ? 43 : $userId.hashCode()));\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((\"GetterSetterJavadocLong(userId=\" + this.getUserId()) + \")\");\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated GetterSetterJavadocLong() {\n    super();\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/GetterTypeAnnos.java",
    "content": "import lombok.Getter;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.List;\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER}) @interface TA {\n}\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER}) @interface TB {\n}\nclass GetterTypeAnnos {\n  @Getter @TA @TB List<String> foo;\n  GetterTypeAnnos() {\n    super();\n  }\n  public @TA @java.lang.SuppressWarnings(\"all\") @lombok.Generated List<String> getFoo() {\n    return this.foo;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GetterWithDollar.java",
    "content": "class GetterWithDollar1 {\n  @lombok.Getter int $i;\n  GetterWithDollar1() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int get$i() {\n    return this.$i;\n  }\n}\nclass GetterWithDollar2 {\n  @lombok.Getter int $i;\n  @lombok.Getter int i;\n  GetterWithDollar2() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int get$i() {\n    return this.$i;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getI() {\n    return this.i;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/GetterWithJavaBeansSpecCapitalization.java",
    "content": "class GetterWithJavaBeansSpecCapitalization {\n  @lombok.Getter int a;\n  @lombok.Getter int aField;\n  GetterWithJavaBeansSpecCapitalization() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getA() {\n    return this.a;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getaField() {\n    return this.aField;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/HelperInInitializationBlock.java",
    "content": "import lombok.experimental.Helper;\npublic class HelperInInitializationBlock {\n  {\n    final int z = 5;\n    if (Boolean.TRUE)\n        {\n          @Helper class H1 {\n            H1() {\n              super();\n            }\n            void foo(int x) {\n              System.out.println((\"Hello, \" + (x + z)));\n            }\n          }\n          final H1 $H1 = new H1();\n          $H1.foo(10);\n          @Helper class H2 {\n            H2() {\n              super();\n            }\n            void bar() {\n              $H1.foo(12);\n            }\n          }\n        }\n  }\n  public HelperInInitializationBlock() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/HelperInMethod.java",
    "content": "import lombok.experimental.Helper;\npublic class HelperInMethod {\n  public HelperInMethod() {\n    super();\n  }\n  int someMethod(int arg1) {\n    final int localVar = 5;\n    @Helper class Helpers {\n      Helpers() {\n        super();\n      }\n      int helperMethod(int arg) {\n        return (arg + localVar);\n      }\n    }\n    final Helpers $Helpers = new Helpers();\n    return $Helpers.helperMethod(10);\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/I2335_BuilderMultipleObtainVia.java",
    "content": "import lombok.Builder;\npublic @Builder class I2335_BuilderMultipleObtainVia {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class I2335_BuilderMultipleObtainViaBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String theString;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated Long theLong;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated I2335_BuilderMultipleObtainViaBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated I2335_BuilderMultipleObtainVia.I2335_BuilderMultipleObtainViaBuilder theString(final String theString) {\n      this.theString = theString;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated I2335_BuilderMultipleObtainVia.I2335_BuilderMultipleObtainViaBuilder theLong(final Long theLong) {\n      this.theLong = theLong;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated I2335_BuilderMultipleObtainVia build() {\n      return new I2335_BuilderMultipleObtainVia(this.theString, this.theLong);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((\"I2335_BuilderMultipleObtainVia.I2335_BuilderMultipleObtainViaBuilder(theString=\" + this.theString) + \", theLong=\") + this.theLong) + \")\");\n    }\n  }\n  private String theString;\n  private Long theLong;\n  public @Builder(toBuilder = true) I2335_BuilderMultipleObtainVia(@Builder.ObtainVia(method = \"getTheString\") String theString, @Builder.ObtainVia(method = \"getTheLong\") Long theLong) {\n    super();\n    setTheString(theString);\n    setTheLong(theLong);\n  }\n  public String getTheString() {\n    return theString;\n  }\n  public Long getTheLong() {\n    return theLong;\n  }\n  public void setTheString(String theString) {\n    this.theString = theString;\n  }\n  public void setTheLong(Long theLong) {\n    this.theLong = theLong;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated I2335_BuilderMultipleObtainVia.I2335_BuilderMultipleObtainViaBuilder builder() {\n    return new I2335_BuilderMultipleObtainVia.I2335_BuilderMultipleObtainViaBuilder();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated I2335_BuilderMultipleObtainVia.I2335_BuilderMultipleObtainViaBuilder toBuilder() {\n    final String theString = this.getTheString();\n    final Long theLong = this.getTheLong();\n    return new I2335_BuilderMultipleObtainVia.I2335_BuilderMultipleObtainViaBuilder().theString(theString).theLong(theLong);\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/InjectField.java",
    "content": "import java.util.logging.Level;\nimport lombok.extern.java.Log;\nimport lombok.Synchronized;\n@Log enum InjectField1 {\n  A(),\n  B(),\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.logging.Logger log = java.util.logging.Logger.getLogger(InjectField1.class.getName());\n  private final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.Object $lock = new java.lang.Object[0];\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.Object $LOCK = new java.lang.Object[0];\n  private static final String LOG_MESSAGE = \"static initializer\";\n  private String fieldA;\n  static {\n    log.log(Level.FINE, LOG_MESSAGE);\n  }\n  private String fieldB;\n  <clinit>() {\n  }\n  InjectField1() {\n    super();\n  }\n  @Synchronized void generateLockField() {\n    synchronized (this.$lock)\n      {\n        System.out.println(\"lock field\");\n      }\n  }\n  static @Synchronized void generateStaticLockField() {\n    synchronized (InjectField1.$LOCK)\n      {\n        System.out.println(\"static lock field\");\n      }\n  }\n}\n@Log class InjectField2 {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.logging.Logger log = java.util.logging.Logger.getLogger(InjectField2.class.getName());\n  private final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.Object $lock = new java.lang.Object[0];\n  private static final String LOG_MESSAGE = \"static initializer\";\n  static {\n    log.log(Level.FINE, LOG_MESSAGE);\n  }\n  <clinit>() {\n  }\n  InjectField2() {\n    super();\n  }\n  @Synchronized void generateLockField() {\n    synchronized (this.$lock)\n      {\n        System.out.println(\"lock field\");\n      }\n  }\n}\n@Log class InjectField3 {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.logging.Logger log = java.util.logging.Logger.getLogger(InjectField3.class.getName());\n  static {\n    log.log(Level.FINE, \"static initializer\");\n  }\n  <clinit>() {\n  }\n  InjectField3() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/InnerClass.java",
    "content": "class A {\n  @lombok.AllArgsConstructor class B {\n    String s;\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B(final String s) {\n      super();\n      this.s = s;\n    }\n  }\n  A() {\n    super();\n  }\n}\nclass C {\n  final @lombok.Value class D {\n    private final A a;\n    A.B test(String s) {\n      return a.new B(s) {\n  x(<no type> $anonymous0) {\n    super($anonymous0);\n  }\n};\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated A getA() {\n      return this.a;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n      if ((o == this))\n          return true;\n      if ((! (o instanceof C.D)))\n          return false;\n      final C.D other = (C.D) o;\n      final java.lang.Object this$a = this.getA();\n      final java.lang.Object other$a = other.getA();\n      if (((this$a == null) ? (other$a != null) : (! this$a.equals(other$a))))\n          return false;\n      return true;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n      final int PRIME = 59;\n      int result = 1;\n      final java.lang.Object $a = this.getA();\n      result = ((result * PRIME) + (($a == null) ? 43 : $a.hashCode()));\n      return result;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"C.D(a=\" + this.getA()) + \")\");\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated D(final A a) {\n      super();\n      this.a = a;\n    }\n  }\n  C() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/JacksonJsonProperty.java",
    "content": "import com.fasterxml.jackson.annotation.JsonProperty;\nimport com.fasterxml.jackson.annotation.JsonSetter;\nimport com.fasterxml.jackson.annotation.Nulls;\nimport lombok.Builder;\nimport lombok.Setter;\npublic @Builder class JacksonJsonProperty {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class JacksonJsonPropertyBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String kebabCaseProp;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonJsonPropertyBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @JsonProperty(\"kebab-case-prop\") @JsonSetter(nulls = Nulls.SKIP) @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonJsonProperty.JacksonJsonPropertyBuilder kebabCaseProp(final String kebabCaseProp) {\n      this.kebabCaseProp = kebabCaseProp;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonJsonProperty build() {\n      return new JacksonJsonProperty(this.kebabCaseProp);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"JacksonJsonProperty.JacksonJsonPropertyBuilder(kebabCaseProp=\" + this.kebabCaseProp) + \")\");\n    }\n  }\n  public @JsonProperty(\"kebab-case-prop\") @JsonSetter(nulls = Nulls.SKIP) @Setter String kebabCaseProp;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonJsonProperty(final String kebabCaseProp) {\n    super();\n    this.kebabCaseProp = kebabCaseProp;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonJsonProperty.JacksonJsonPropertyBuilder builder() {\n    return new JacksonJsonProperty.JacksonJsonPropertyBuilder();\n  }\n  public @JsonProperty(\"kebab-case-prop\") @JsonSetter(nulls = Nulls.SKIP) @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setKebabCaseProp(final String kebabCaseProp) {\n    this.kebabCaseProp = kebabCaseProp;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/JacksonizedAccessors.java",
    "content": "public @lombok.extern.jackson.Jacksonized @lombok.experimental.Accessors(fluent = true) @lombok.Getter @lombok.Setter class JacksonizedAccessors {\n  private @com.fasterxml.jackson.annotation.JsonProperty(\"intValue\") int intValue;\n  public JacksonizedAccessors() {\n    super();\n  }\n  public @com.fasterxml.jackson.annotation.JsonProperty(\"intValue\") @java.lang.SuppressWarnings(\"all\") @lombok.Generated int intValue() {\n    return this.intValue;\n  }\n  /**\n   * @return {@code this}.\n   */\n  public @com.fasterxml.jackson.annotation.JsonProperty(\"intValue\") @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedAccessors intValue(final int intValue) {\n    this.intValue = intValue;\n    return this;\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/JacksonizedAccessorsTransient.java",
    "content": "public @lombok.extern.jackson.Jacksonized @lombok.experimental.Accessors(fluent = true) @lombok.Getter @lombok.Setter class JacksonizedAccessorsTransient {\n  private transient @com.fasterxml.jackson.annotation.JsonIgnore int intValue;\n  private transient @com.fasterxml.jackson.annotation.JsonIgnore long longValue;\n  private @com.fasterxml.jackson.annotation.JsonIgnore double doubleValue;\n  public JacksonizedAccessorsTransient() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int intValue() {\n    return this.intValue;\n  }\n  public @com.fasterxml.jackson.annotation.JsonIgnore @java.lang.SuppressWarnings(\"all\") @lombok.Generated long longValue() {\n    return this.longValue;\n  }\n  public @com.fasterxml.jackson.annotation.JsonIgnore @java.lang.SuppressWarnings(\"all\") @lombok.Generated double doubleValue() {\n    return this.doubleValue;\n  }\n  /**\n   * @return {@code this}.\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedAccessorsTransient intValue(final int intValue) {\n    this.intValue = intValue;\n    return this;\n  }\n  /**\n   * @return {@code this}.\n   */\n  public @com.fasterxml.jackson.annotation.JsonIgnore @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedAccessorsTransient longValue(final long longValue) {\n    this.longValue = longValue;\n    return this;\n  }\n  /**\n   * @return {@code this}.\n   */\n  public @com.fasterxml.jackson.annotation.JsonIgnore @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedAccessorsTransient doubleValue(final double doubleValue) {\n    this.doubleValue = doubleValue;\n    return this;\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/JacksonizedBuilderComplex.java",
    "content": "import java.util.List;\nimport lombok.Builder;\nimport lombok.extern.jackson.Jacksonized;\n@com.fasterxml.jackson.databind.annotation.JsonDeserialize(builder = JacksonizedBuilderComplex.TestVoidName.class) @tools.jackson.databind.annotation.JsonDeserialize(builder = JacksonizedBuilderComplex.TestVoidName.class) class JacksonizedBuilderComplex {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated @com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = \"with\",buildMethodName = \"execute\") @tools.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = \"with\",buildMethodName = \"execute\") class TestVoidName<T extends Number> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated T number;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int arg2;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String arg3;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedBuilderComplex selfRef;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated TestVoidName() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedBuilderComplex.TestVoidName<T> withNumber(final T number) {\n      this.number = number;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedBuilderComplex.TestVoidName<T> withArg2(final int arg2) {\n      this.arg2 = arg2;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedBuilderComplex.TestVoidName<T> withArg3(final String arg3) {\n      this.arg3 = arg3;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedBuilderComplex.TestVoidName<T> withSelfRef(final JacksonizedBuilderComplex selfRef) {\n      this.selfRef = selfRef;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void execute() {\n      JacksonizedBuilderComplex.<T>testVoidWithGenerics(this.number, this.arg2, this.arg3, this.selfRef);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((((\"JacksonizedBuilderComplex.TestVoidName(number=\" + this.number) + \", arg2=\") + this.arg2) + \", arg3=\") + this.arg3) + \", selfRef=\") + this.selfRef) + \")\");\n    }\n  }\n  JacksonizedBuilderComplex() {\n    super();\n  }\n  private static @Jacksonized @Builder(buildMethodName = \"execute\",setterPrefix = \"with\") <T extends Number>void testVoidWithGenerics(T number, int arg2, String arg3, JacksonizedBuilderComplex selfRef) {\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <T extends Number>JacksonizedBuilderComplex.TestVoidName<T> builder() {\n    return new JacksonizedBuilderComplex.TestVoidName<T>();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/JacksonizedBuilderSimple.java",
    "content": "import java.util.List;\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\n@lombok.extern.jackson.Jacksonized @JsonIgnoreProperties(ignoreUnknown = true) @lombok.Builder(access = lombok.AccessLevel.PROTECTED) @com.fasterxml.jackson.databind.annotation.JsonDeserialize(builder = JacksonizedBuilderSimple.JacksonizedBuilderSimpleBuilder.class) @tools.jackson.databind.annotation.JsonDeserialize(builder = JacksonizedBuilderSimple.JacksonizedBuilderSimpleBuilder.class) class JacksonizedBuilderSimple<T> {\n  protected static @java.lang.SuppressWarnings(\"all\") @lombok.Generated @JsonIgnoreProperties(ignoreUnknown = true) @com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = \"\",buildMethodName = \"build\") @tools.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = \"\",buildMethodName = \"build\") class JacksonizedBuilderSimpleBuilder<T> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int yes;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated List<T> also;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedBuilderSimpleBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedBuilderSimple.JacksonizedBuilderSimpleBuilder<T> yes(final int yes) {\n      this.yes = yes;\n      return this;\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedBuilderSimple.JacksonizedBuilderSimpleBuilder<T> also(final List<T> also) {\n      this.also = also;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedBuilderSimple<T> build() {\n      return new JacksonizedBuilderSimple<T>(this.yes, this.also);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((\"JacksonizedBuilderSimple.JacksonizedBuilderSimpleBuilder(yes=\" + this.yes) + \", also=\") + this.also) + \")\");\n    }\n  }\n  private final int noshow = 0;\n  private final int yes;\n  private List<T> also;\n  private int $butNotMe;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedBuilderSimple(final int yes, final List<T> also) {\n    super();\n    this.yes = yes;\n    this.also = also;\n  }\n  protected static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <T>JacksonizedBuilderSimple.JacksonizedBuilderSimpleBuilder<T> builder() {\n    return new JacksonizedBuilderSimple.JacksonizedBuilderSimpleBuilder<T>();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/JacksonizedBuilderSingular.java",
    "content": "import java.util.List;\nimport java.util.Map;\nimport com.fasterxml.jackson.annotation.JsonAnySetter;\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport com.google.common.collect.ImmutableList;\nimport com.google.common.collect.ImmutableMap;\nimport lombok.Builder;\nimport lombok.Singular;\nimport lombok.extern.jackson.Jacksonized;\npublic @Jacksonized @Builder @com.fasterxml.jackson.databind.annotation.JsonDeserialize(builder = JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder.class) @tools.jackson.databind.annotation.JsonDeserialize(builder = JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder.class) class JacksonizedBuilderSingular {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated @com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = \"\",buildMethodName = \"build\") @tools.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = \"\",buildMethodName = \"build\") class JacksonizedBuilderSingularBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> any$key;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<Object> any$value;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> values;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.collect.ImmutableMap.Builder<String, Object> guavaAny;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.collect.ImmutableList.Builder<String> guavaValues;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedBuilderSingularBuilder() {\n      super();\n    }\n    public @JsonAnySetter @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder any(final String anyKey, final Object anyValue) {\n      if ((this.any$key == null))\n          {\n            this.any$key = new java.util.ArrayList<String>();\n            this.any$value = new java.util.ArrayList<Object>();\n          }\n      this.any$key.add(anyKey);\n      this.any$value.add(anyValue);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder any(final java.util.Map<? extends String, ? extends Object> any) {\n      if ((any == null))\n          {\n            throw new java.lang.NullPointerException(\"any cannot be null\");\n          }\n      if ((this.any$key == null))\n          {\n            this.any$key = new java.util.ArrayList<String>();\n            this.any$value = new java.util.ArrayList<Object>();\n          }\n      for (java.util.Map.Entry<? extends String, ? extends Object> $lombokEntry : any.entrySet()) \n        {\n          this.any$key.add($lombokEntry.getKey());\n          this.any$value.add($lombokEntry.getValue());\n        }\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder clearAny() {\n      if ((this.any$key != null))\n          {\n            this.any$key.clear();\n            this.any$value.clear();\n          }\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder value(final String value) {\n      if ((this.values == null))\n          this.values = new java.util.ArrayList<String>();\n      this.values.add(value);\n      return this;\n    }\n    public @JsonProperty(\"v_a_l_u_e_s\") @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder values(final java.util.Collection<? extends String> values) {\n      if ((values == null))\n          {\n            throw new java.lang.NullPointerException(\"values cannot be null\");\n          }\n      if ((this.values == null))\n          this.values = new java.util.ArrayList<String>();\n      this.values.addAll(values);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder clearValues() {\n      if ((this.values != null))\n          this.values.clear();\n      return this;\n    }\n    public @JsonAnySetter @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder guavaAny(final String key, final Object value) {\n      if ((this.guavaAny == null))\n          this.guavaAny = com.google.common.collect.ImmutableMap.builder();\n      this.guavaAny.put(key, value);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder guavaAny(final java.util.Map<? extends String, ? extends Object> guavaAny) {\n      if ((guavaAny == null))\n          {\n            throw new java.lang.NullPointerException(\"guavaAny cannot be null\");\n          }\n      if ((this.guavaAny == null))\n          this.guavaAny = com.google.common.collect.ImmutableMap.builder();\n      this.guavaAny.putAll(guavaAny);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder clearGuavaAny() {\n      this.guavaAny = null;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder guavaValue(final String guavaValue) {\n      if ((this.guavaValues == null))\n          this.guavaValues = com.google.common.collect.ImmutableList.builder();\n      this.guavaValues.add(guavaValue);\n      return this;\n    }\n    public @JsonProperty(\"guava_v_a_l_u_e_s\") @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder guavaValues(final java.lang.Iterable<? extends String> guavaValues) {\n      if ((guavaValues == null))\n          {\n            throw new java.lang.NullPointerException(\"guavaValues cannot be null\");\n          }\n      if ((this.guavaValues == null))\n          this.guavaValues = com.google.common.collect.ImmutableList.builder();\n      this.guavaValues.addAll(guavaValues);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder clearGuavaValues() {\n      this.guavaValues = null;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedBuilderSingular build() {\n      java.util.Map<String, Object> any;\n      switch (((this.any$key == null) ? 0 : this.any$key.size())) {\n      case 0 :\n          any = java.util.Collections.emptyMap();\n          break;\n      case 1 :\n          any = java.util.Collections.singletonMap(this.any$key.get(0), this.any$value.get(0));\n          break;\n      default :\n          any = new java.util.LinkedHashMap<String, Object>(((this.any$key.size() < 0x40000000) ? ((1 + this.any$key.size()) + ((this.any$key.size() - 3) / 3)) : java.lang.Integer.MAX_VALUE));\n          for (int $i = 0;; ($i < this.any$key.size()); $i ++) \n            any.put(this.any$key.get($i), this.any$value.get($i));\n          any = java.util.Collections.unmodifiableMap(any);\n      }\n      java.util.List<String> values;\n      switch (((this.values == null) ? 0 : this.values.size())) {\n      case 0 :\n          values = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          values = java.util.Collections.singletonList(this.values.get(0));\n          break;\n      default :\n          values = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.values));\n      }\n      com.google.common.collect.ImmutableMap<String, Object> guavaAny = ((this.guavaAny == null) ? com.google.common.collect.ImmutableMap.<String, Object>of() : this.guavaAny.build());\n      com.google.common.collect.ImmutableList<String> guavaValues = ((this.guavaValues == null) ? com.google.common.collect.ImmutableList.<String>of() : this.guavaValues.build());\n      return new JacksonizedBuilderSingular(any, values, guavaAny, guavaValues);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((((((\"JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder(any$key=\" + this.any$key) + \", any$value=\") + this.any$value) + \", values=\") + this.values) + \", guavaAny=\") + this.guavaAny) + \", guavaValues=\") + this.guavaValues) + \")\");\n    }\n  }\n  private @JsonAnySetter @Singular(\"any\") Map<String, Object> any;\n  private @JsonProperty(\"v_a_l_u_e_s\") @Singular List<String> values;\n  private @JsonAnySetter @Singular(\"guavaAny\") ImmutableMap<String, Object> guavaAny;\n  private @JsonProperty(\"guava_v_a_l_u_e_s\") @Singular ImmutableList<String> guavaValues;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedBuilderSingular(final Map<String, Object> any, final List<String> values, final ImmutableMap<String, Object> guavaAny, final ImmutableList<String> guavaValues) {\n    super();\n    this.any = any;\n    this.values = values;\n    this.guavaAny = guavaAny;\n    this.guavaValues = guavaValues;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder builder() {\n    return new JacksonizedBuilderSingular.JacksonizedBuilderSingularBuilder();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/JacksonizedNoConfigChoice.java",
    "content": "public @lombok.extern.jackson.Jacksonized @lombok.Builder @com.fasterxml.jackson.databind.annotation.JsonDeserialize(builder = JacksonizedNoConfigChoice.JacksonizedNoConfigChoiceBuilder.class) class JacksonizedNoConfigChoice {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated @com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = \"\",buildMethodName = \"build\") class JacksonizedNoConfigChoiceBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int field1;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedNoConfigChoiceBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedNoConfigChoice.JacksonizedNoConfigChoiceBuilder field1(final int field1) {\n      this.field1 = field1;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedNoConfigChoice build() {\n      return new JacksonizedNoConfigChoice(this.field1);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"JacksonizedNoConfigChoice.JacksonizedNoConfigChoiceBuilder(field1=\" + this.field1) + \")\");\n    }\n  }\n  int field1;\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedNoConfigChoice(final int field1) {\n    super();\n    this.field1 = field1;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedNoConfigChoice.JacksonizedNoConfigChoiceBuilder builder() {\n    return new JacksonizedNoConfigChoice.JacksonizedNoConfigChoiceBuilder();\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/JacksonizedOnRecord.java",
    "content": "import java.util.List;\nimport javax.annotation.Nullable;\nimport com.fasterxml.jackson.annotation.JsonAnySetter;\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimport com.fasterxml.jackson.annotation.JsonProperty;\npublic @lombok.extern.jackson.Jacksonized @lombok.Builder @JsonIgnoreProperties @com.fasterxml.jackson.databind.annotation.JsonDeserialize(builder = JacksonizedOnRecord.JacksonizedOnRecordBuilder.class) @tools.jackson.databind.annotation.JsonDeserialize(builder = JacksonizedOnRecord.JacksonizedOnRecordBuilder.class) record JacksonizedOnRecord(String string, List values) {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated @JsonIgnoreProperties @com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = \"\",buildMethodName = \"build\") @tools.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = \"\",buildMethodName = \"build\") class JacksonizedOnRecordBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String string;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> values;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedOnRecordBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @JsonProperty(\"test\") @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedOnRecord.JacksonizedOnRecordBuilder string(final @Nullable String string) {\n      this.string = string;\n      return this;\n    }\n    public @JsonAnySetter @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedOnRecord.JacksonizedOnRecordBuilder value(final String value) {\n      if ((this.values == null))\n          this.values = new java.util.ArrayList<String>();\n      this.values.add(value);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedOnRecord.JacksonizedOnRecordBuilder values(final java.util.Collection<? extends String> values) {\n      if ((values == null))\n          {\n            throw new java.lang.NullPointerException(\"values cannot be null\");\n          }\n      if ((this.values == null))\n          this.values = new java.util.ArrayList<String>();\n      this.values.addAll(values);\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedOnRecord.JacksonizedOnRecordBuilder clearValues() {\n      if ((this.values != null))\n          this.values.clear();\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedOnRecord build() {\n      java.util.List<String> values;\n      switch (((this.values == null) ? 0 : this.values.size())) {\n      case 0 :\n          values = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          values = java.util.Collections.singletonList(this.values.get(0));\n          break;\n      default :\n          values = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.values));\n      }\n      return new JacksonizedOnRecord(this.string, values);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((\"JacksonizedOnRecord.JacksonizedOnRecordBuilder(string=\" + this.string) + \", values=\") + this.values) + \")\");\n    }\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedOnRecord.JacksonizedOnRecordBuilder builder() {\n    return new JacksonizedOnRecord.JacksonizedOnRecordBuilder();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/JacksonizedSuperBuilderSimple.java",
    "content": "public class JacksonizedSuperBuilderSimple {\n  public static @lombok.extern.jackson.Jacksonized @lombok.experimental.SuperBuilder @com.fasterxml.jackson.annotation.JsonIgnoreProperties(ignoreUnknown = true) @com.fasterxml.jackson.databind.annotation.JsonDeserialize(builder = JacksonizedSuperBuilderSimple.Parent.ParentBuilderImpl.class) @tools.jackson.databind.annotation.JsonDeserialize(builder = JacksonizedSuperBuilderSimple.Parent.ParentBuilderImpl.class) class Parent {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilder<C extends JacksonizedSuperBuilderSimple.Parent, B extends JacksonizedSuperBuilderSimple.Parent.ParentBuilder<C, B>> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int field1;\n      public ParentBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B field1(final int field1) {\n        this.field1 = field1;\n        return self();\n      }\n      protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((\"JacksonizedSuperBuilderSimple.Parent.ParentBuilder(field1=\" + this.field1) + \")\");\n      }\n    }\n    static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated @com.fasterxml.jackson.annotation.JsonIgnoreProperties(ignoreUnknown = true) @com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = \"\",buildMethodName = \"build\") @tools.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = \"\",buildMethodName = \"build\") class ParentBuilderImpl extends JacksonizedSuperBuilderSimple.Parent.ParentBuilder<JacksonizedSuperBuilderSimple.Parent, JacksonizedSuperBuilderSimple.Parent.ParentBuilderImpl> {\n      private ParentBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedSuperBuilderSimple.Parent.ParentBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedSuperBuilderSimple.Parent build() {\n        return new JacksonizedSuperBuilderSimple.Parent(this);\n      }\n    }\n    int field1;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Parent(final JacksonizedSuperBuilderSimple.Parent.ParentBuilder<?, ?> b) {\n      super();\n      this.field1 = b.field1;\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedSuperBuilderSimple.Parent.ParentBuilder<?, ?> builder() {\n      return new JacksonizedSuperBuilderSimple.Parent.ParentBuilderImpl();\n    }\n  }\n  public JacksonizedSuperBuilderSimple() {\n    super();\n  }\n  public static void test() {\n    Parent x = Parent.builder().field1(5).build();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/JacksonizedSuperBuilderWithJsonDeserialize.java",
    "content": "public @lombok.extern.jackson.Jacksonized @lombok.experimental.SuperBuilder @com.fasterxml.jackson.databind.annotation.JsonDeserialize class JacksonizedSuperBuilderWithJsonDeserialize {\n  public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class JacksonizedSuperBuilderWithJsonDeserializeBuilder<C extends JacksonizedSuperBuilderWithJsonDeserialize, B extends JacksonizedSuperBuilderWithJsonDeserialize.JacksonizedSuperBuilderWithJsonDeserializeBuilder<C, B>> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int field1;\n    public JacksonizedSuperBuilderWithJsonDeserializeBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B field1(final int field1) {\n      this.field1 = field1;\n      return self();\n    }\n    protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n    public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"JacksonizedSuperBuilderWithJsonDeserialize.JacksonizedSuperBuilderWithJsonDeserializeBuilder(field1=\" + this.field1) + \")\");\n    }\n  }\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class JacksonizedSuperBuilderWithJsonDeserializeBuilderImpl extends JacksonizedSuperBuilderWithJsonDeserialize.JacksonizedSuperBuilderWithJsonDeserializeBuilder<JacksonizedSuperBuilderWithJsonDeserialize, JacksonizedSuperBuilderWithJsonDeserialize.JacksonizedSuperBuilderWithJsonDeserializeBuilderImpl> {\n    private JacksonizedSuperBuilderWithJsonDeserializeBuilderImpl() {\n      super();\n    }\n    protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedSuperBuilderWithJsonDeserialize.JacksonizedSuperBuilderWithJsonDeserializeBuilderImpl self() {\n      return this;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedSuperBuilderWithJsonDeserialize build() {\n      return new JacksonizedSuperBuilderWithJsonDeserialize(this);\n    }\n  }\n  int field1;\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedSuperBuilderWithJsonDeserialize(final JacksonizedSuperBuilderWithJsonDeserialize.JacksonizedSuperBuilderWithJsonDeserializeBuilder<?, ?> b) {\n    super();\n    this.field1 = b.field1;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated JacksonizedSuperBuilderWithJsonDeserialize.JacksonizedSuperBuilderWithJsonDeserializeBuilder<?, ?> builder() {\n    return new JacksonizedSuperBuilderWithJsonDeserialize.JacksonizedSuperBuilderWithJsonDeserializeBuilderImpl();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/JavadocGenerally.java",
    "content": "package testPackage;\nclass JavadocGenerally {\n  public interface TestingInner {\n  }\n  private int someField;\n  JavadocGenerally() {\n    super();\n  }\n  public void test() {\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/JavadocMultiline.java",
    "content": "@lombok.Getter @lombok.Setter class JavadocMultiline {\n  private java.util.List<Boolean> booleans;\n  private java.util.List<Boolean> booleans2;\n  JavadocMultiline() {\n    super();\n  }\n  /**\n   * This is a list of booleans.\n   * \n   * @return A list of booleans to set for this object. This is a Javadoc return that is long\n   *         enough to wrap to multiple lines.\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.List<Boolean> getBooleans() {\n    return this.booleans;\n  }\n  /**\n   * This is a list of booleans.\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.List<Boolean> getBooleans2() {\n    return this.booleans2;\n  }\n  /**\n   * This is a list of booleans.\n   * \n   * @param booleans A list of booleans to set for this object. This is a Javadoc param that is\n   *        long enough to wrap to multiple lines.\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setBooleans(final java.util.List<Boolean> booleans) {\n    this.booleans = booleans;\n  }\n  /**\n   * This is a list of booleans.\n   * \n   * @param booleans A list of booleans to set for this object. This is a Javadoc param that is\n   *        long enough to wrap to multiple lines.\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setBooleans2(final java.util.List<Boolean> booleans2) {\n    this.booleans2 = booleans2;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LockedInInitializer.java",
    "content": "import lombok.Locked;\npublic class LockedInInitializer {\n  public static final Runnable LOCKED = new Runnable() {\n    private final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.concurrent.locks.Lock $lock = new java.util.concurrent.locks.ReentrantLock();\n    public @Override @Locked void run() {\n      this.$lock.lock();\n      try\n        {\n          System.out.println(\"test\");\n        }\n      finally\n        {\n          this.$lock.unlock();\n        }\n    }\n  };\n  public static final Runnable LOCKED_READ = new Runnable() {\n    private final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.concurrent.locks.ReadWriteLock $lock = new java.util.concurrent.locks.ReentrantReadWriteLock();\n    public @Override @Locked.Read void run() {\n      this.$lock.readLock().lock();\n      try\n        {\n          System.out.println(\"test\");\n        }\n      finally\n        {\n          this.$lock.readLock().unlock();\n        }\n    }\n  };\n  public static final Runnable LOCKED_WRITE = new Runnable() {\n    private final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.concurrent.locks.ReadWriteLock $lock = new java.util.concurrent.locks.ReentrantReadWriteLock();\n    public @Override @Locked.Write void run() {\n      this.$lock.writeLock().lock();\n      try\n        {\n          System.out.println(\"test\");\n        }\n      finally\n        {\n          this.$lock.writeLock().unlock();\n        }\n    }\n  };\n  <clinit>() {\n  }\n  public LockedInInitializer() {\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LockedInRecord.java",
    "content": "import lombok.Locked;\npublic record LockedInRecord(String a, String b) {\n  public @Locked void foo() {\n    String foo = \"bar\";\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LockedName.java",
    "content": "import java.util.concurrent.locks.*;\nclass LockedName {\n  private final Lock basicLock = new ReentrantLock();\n  private final ReadWriteLock rwLock = new ReentrantReadWriteLock();\n  LockedName() {\n    super();\n  }\n  @lombok.Locked(\"basicLock\") void test() {\n    this.basicLock.lock();\n    try\n      {\n        System.out.println(\"one\");\n      }\n    finally\n      {\n        this.basicLock.unlock();\n      }\n  }\n  @lombok.Locked.Read(\"rwLock\") void test2() {\n    this.rwLock.readLock().lock();\n    try\n      {\n        System.out.println(\"two\");\n      }\n    finally\n      {\n        this.rwLock.readLock().unlock();\n      }\n  }\n  @lombok.Locked.Write(\"rwLock\") void test3() {\n    this.rwLock.writeLock().lock();\n    try\n      {\n        System.out.println(\"three\");\n      }\n    finally\n      {\n        this.rwLock.writeLock().unlock();\n      }\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LockedOnStatic.java",
    "content": "class LockedOnStatic<Z> {\n  static class Inner {\n    private static final java.util.concurrent.locks.Lock LCK = new java.util.concurrent.locks.ReentrantLock();\n    <clinit>() {\n    }\n    Inner() {\n      super();\n    }\n    public @lombok.Locked(\"LCK\") void foo() {\n      LockedOnStatic.Inner.LCK.lock();\n      try\n        {\n          System.out.println();\n        }\n      finally\n        {\n          LockedOnStatic.Inner.LCK.unlock();\n        }\n    }\n  }\n  class Inner2 {\n    private final java.util.concurrent.locks.ReentrantLock LCK = new java.util.concurrent.locks.ReentrantLock();\n    Inner2() {\n      super();\n    }\n    public @lombok.Locked(\"LCK\") void foo() {\n      this.LCK.lock();\n      try\n        {\n          System.out.println();\n        }\n      finally\n        {\n          this.LCK.unlock();\n        }\n    }\n  }\n  LockedOnStatic() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LockedPlain.java",
    "content": "import lombok.Locked;\nclass LockedPlain {\n  private final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.concurrent.locks.Lock $lock = new java.util.concurrent.locks.ReentrantLock();\n  LockedPlain() {\n    super();\n  }\n  @Locked void test() {\n    this.$lock.lock();\n    try\n      {\n        System.out.println(\"one\");\n      }\n    finally\n      {\n        this.$lock.unlock();\n      }\n  }\n  @Locked void test2() {\n    this.$lock.lock();\n    try\n      {\n        System.out.println(\"two\");\n      }\n    finally\n      {\n        this.$lock.unlock();\n      }\n  }\n}\nclass LockedPlainStatic {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.concurrent.locks.Lock $LOCK = new java.util.concurrent.locks.ReentrantLock();\n  <clinit>() {\n  }\n  LockedPlainStatic() {\n    super();\n  }\n  static @Locked void test() {\n    LockedPlainStatic.$LOCK.lock();\n    try\n      {\n        System.out.println(\"three\");\n      }\n    finally\n      {\n        LockedPlainStatic.$LOCK.unlock();\n      }\n  }\n  static @Locked void test2() {\n    LockedPlainStatic.$LOCK.lock();\n    try\n      {\n        System.out.println(\"four\");\n      }\n    finally\n      {\n        LockedPlainStatic.$LOCK.unlock();\n      }\n  }\n}\nclass LockedPlainRead {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.concurrent.locks.ReadWriteLock $LOCK = new java.util.concurrent.locks.ReentrantReadWriteLock();\n  <clinit>() {\n  }\n  LockedPlainRead() {\n    super();\n  }\n  static @Locked.Read void test() {\n    LockedPlainRead.$LOCK.readLock().lock();\n    try\n      {\n        System.out.println(\"five\");\n      }\n    finally\n      {\n        LockedPlainRead.$LOCK.readLock().unlock();\n      }\n  }\n  static @Locked.Read void test2() {\n    LockedPlainRead.$LOCK.readLock().lock();\n    try\n      {\n        System.out.println(\"six\");\n      }\n    finally\n      {\n        LockedPlainRead.$LOCK.readLock().unlock();\n      }\n  }\n}\nclass LockedPlainWrite {\n  private final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.concurrent.locks.ReadWriteLock $lock = new java.util.concurrent.locks.ReentrantReadWriteLock();\n  LockedPlainWrite() {\n    super();\n  }\n  @Locked.Write void test() {\n    this.$lock.writeLock().lock();\n    try\n      {\n        System.out.println(\"seven\");\n      }\n    finally\n      {\n        this.$lock.writeLock().unlock();\n      }\n  }\n  @Locked.Write void test2() {\n    this.$lock.writeLock().lock();\n    try\n      {\n        System.out.println(\"eight\");\n      }\n    finally\n      {\n        this.$lock.writeLock().unlock();\n      }\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LockedStaticMix.java",
    "content": "class LockedGeneratedStaticMismatch {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.concurrent.locks.Lock $LOCK = new java.util.concurrent.locks.ReentrantLock();\n  <clinit>() {\n  }\n  LockedGeneratedStaticMismatch() {\n    super();\n  }\n  static @lombok.Locked void test() {\n    LockedGeneratedStaticMismatch.$LOCK.lock();\n    try\n      {\n        System.out.println(\"one\");\n      }\n    finally\n      {\n        LockedGeneratedStaticMismatch.$LOCK.unlock();\n      }\n  }\n  @lombok.Locked(\"$LOCK\") void test2() {\n    System.out.println(\"two\");\n  }\n}\nclass LockedUserStaticMismatch {\n  private static final java.util.concurrent.locks.Lock userLock = new java.util.concurrent.locks.ReentrantLock();\n  <clinit>() {\n  }\n  LockedUserStaticMismatch() {\n    super();\n  }\n  static @lombok.Locked(\"userLock\") void test() {\n    LockedUserStaticMismatch.userLock.lock();\n    try\n      {\n        System.out.println(\"one\");\n      }\n    finally\n      {\n        LockedUserStaticMismatch.userLock.unlock();\n      }\n  }\n  @lombok.Locked(\"userLock\") void test2() {\n    LockedUserStaticMismatch.userLock.lock();\n    try\n      {\n        System.out.println(\"two\");\n      }\n    finally\n      {\n        LockedUserStaticMismatch.userLock.unlock();\n      }\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LockedTypeMismatch.java",
    "content": "class LockedGeneratedTypeMismatch {\n  private final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.concurrent.locks.Lock $lock = new java.util.concurrent.locks.ReentrantLock();\n  LockedGeneratedTypeMismatch() {\n    super();\n  }\n  @lombok.Locked void test() {\n    this.$lock.lock();\n    try\n      {\n        System.out.println(\"one\");\n      }\n    finally\n      {\n        this.$lock.unlock();\n      }\n  }\n  @lombok.Locked.Read void test2() {\n    System.out.println(\"two\");\n  }\n}\nclass LockedUserTypeMismatch {\n  private final java.util.concurrent.locks.Lock userLock = new java.util.concurrent.locks.ReentrantLock();\n  LockedUserTypeMismatch() {\n    super();\n  }\n  @lombok.Locked(\"userLock\") void test() {\n    this.userLock.lock();\n    try\n      {\n        System.out.println(\"one\");\n      }\n    finally\n      {\n        this.userLock.unlock();\n      }\n  }\n  @lombok.Locked.Read(\"userLock\") void test2() {\n    this.userLock.readLock().lock();\n    try\n      {\n        System.out.println(\"two\");\n      }\n    finally\n      {\n        this.userLock.readLock().unlock();\n      }\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LoggerCommons.java",
    "content": "import lombok.extern.apachecommons.CommonsLog;\n@lombok.extern.apachecommons.CommonsLog class LoggerCommons {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LoggerCommons.class);\n  <clinit>() {\n  }\n  LoggerCommons() {\n    super();\n  }\n}\n@CommonsLog class LoggerCommonsWithImport {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LoggerCommonsWithImport.class);\n  <clinit>() {\n  }\n  LoggerCommonsWithImport() {\n    super();\n  }\n}\n@CommonsLog(topic = \"DifferentName\") class LoggerCommonsWithDifferentName {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(\"DifferentName\");\n  <clinit>() {\n  }\n  LoggerCommonsWithDifferentName() {\n    super();\n  }\n}\n@CommonsLog(topic = LoggerCommonsWithStaticField.TOPIC) class LoggerCommonsWithStaticField {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LoggerCommonsWithStaticField.TOPIC);\n  static final String TOPIC = \"StaticField\";\n  <clinit>() {\n  }\n  LoggerCommonsWithStaticField() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LoggerCommonsAccess.java",
    "content": "import lombok.AccessLevel;\nimport lombok.extern.apachecommons.CommonsLog;\n@CommonsLog(access = AccessLevel.PUBLIC) class LoggerCommonsAccessPublic {\n  public static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LoggerCommonsAccessPublic.class);\n  <clinit>() {\n  }\n\n  LoggerCommonsAccessPublic() {\n    super();\n  }\n}\n@CommonsLog(access = AccessLevel.PROTECTED) class LoggerCommonsAccessProtected {\n  protected static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LoggerCommonsAccessProtected.class);\n  <clinit>() {\n  }\n\n  LoggerCommonsAccessProtected() {\n    super();\n  }\n}\n@CommonsLog(access = AccessLevel.PACKAGE) class LoggerCommonsAccessPackage {\n  static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LoggerCommonsAccessPackage.class);\n  <clinit>() {\n  }\n\n  LoggerCommonsAccessPackage() {\n    super();\n  }\n}\n@CommonsLog(access = AccessLevel.PRIVATE) class LoggerCommonsAccessPrivate {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LoggerCommonsAccessPrivate.class);\n  <clinit>() {\n  }\n\n  LoggerCommonsAccessPrivate() {\n    super();\n  }\n}\n@CommonsLog(access = AccessLevel.NONE) class LoggerCommonsAccessNone {\n  LoggerCommonsAccessNone() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LoggerConfig.java",
    "content": "@lombok.extern.slf4j.Slf4j class LoggerWithConfig {\n  private final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.slf4j.Logger myLogger = org.slf4j.LoggerFactory.getLogger(LoggerWithConfig.class);\n  LoggerWithConfig() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LoggerConfigOnRecord.java",
    "content": "// version 14:\nimport lombok.extern.slf4j.Slf4j;\npublic @Slf4j record LoggerConfigOnRecord(String a, String b) {\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LoggerCustom.java",
    "content": "@lombok.CustomLog class LoggerCustomLog {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated MyLogger log = MyLoggerFactory.create(LoggerCustomLog.class);\n  <clinit>() {\n  }\n  LoggerCustomLog() {\n    super();\n  }\n}\nclass MyLoggerFactory {\n  MyLoggerFactory() {\n    super();\n  }\n  static MyLogger create(Class<?> clazz) {\n    return null;\n  }\n}\nclass MyLogger {\n  MyLogger() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LoggerCustomAccess.java",
    "content": "import lombok.AccessLevel;\nimport lombok.CustomLog;\n@CustomLog(access = AccessLevel.PUBLIC) class LoggerCustomAccessPublic {\n  public static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated MyLogger log = MyLoggerFactory.create(LoggerCustomAccessPublic.class);\n  <clinit>() {\n  }\n\n  LoggerCustomAccessPublic() {\n    super();\n  }\n}\n@CustomLog(access = AccessLevel.PROTECTED) class LoggerCustomAccessProtected {\n  protected static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated MyLogger log = MyLoggerFactory.create(LoggerCustomAccessProtected.class);\n  <clinit>() {\n  }\n\n  LoggerCustomAccessProtected() {\n    super();\n  }\n}\n@CustomLog(access = AccessLevel.PACKAGE) class LoggerCustomAccessPackage {\n  static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated MyLogger log = MyLoggerFactory.create(LoggerCustomAccessPackage.class);\n  <clinit>() {\n  }\n\n  LoggerCustomAccessPackage() {\n    super();\n  }\n}\n@CustomLog(access = AccessLevel.PRIVATE) class LoggerCustomAccessPrivate {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated MyLogger log = MyLoggerFactory.create(LoggerCustomAccessPrivate.class);\n  <clinit>() {\n  }\n\n  LoggerCustomAccessPrivate() {\n    super();\n  }\n}\n@CustomLog(access = AccessLevel.NONE) class LoggerCustomAccessNone {\n  LoggerCustomAccessNone() {\n    super();\n  }\n}\nclass MyLoggerFactory {\n  MyLoggerFactory() {\n    super();\n  }\n  static MyLogger create(Class<?> clazz) {\n    return null;\n  }\n}\nclass MyLogger {\n  MyLogger() {\n    super();\n  }\n}\n\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LoggerCustomWithPackage.java",
    "content": "package before;\n@lombok.CustomLog class LoggerCustomLog {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated before.MyLogger log = before.MyLoggerFactory.create(LoggerCustomLog.class);\n  <clinit>() {\n  }\n  LoggerCustomLog() {\n    super();\n  }\n}\nclass MyLoggerFactory {\n  MyLoggerFactory() {\n    super();\n  }\n  static MyLogger create(Class<?> clazz) {\n    return null;\n  }\n}\nclass MyLogger {\n  MyLogger() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LoggerCustomWithTopicAndName.java",
    "content": "@lombok.CustomLog(topic = \"t\") class LoggerCustomLog {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated MyLoggerFactory log = MyLoggerFactory.create(LoggerCustomLog.class.getName(), \"t\", null, LoggerCustomLog.class, \"t\");\n  <clinit>() {\n  }\n  LoggerCustomLog() {\n    super();\n  }\n}\n@lombok.CustomLog(topic = LoggerCustomLogWithStaticField.TOPIC) class LoggerCustomLogWithStaticField {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated MyLoggerFactory log = MyLoggerFactory.create(LoggerCustomLogWithStaticField.class.getName(), LoggerCustomLogWithStaticField.TOPIC, null, LoggerCustomLogWithStaticField.class, LoggerCustomLogWithStaticField.TOPIC);\n  static final String TOPIC = \"StaticField\";\n  <clinit>() {\n  }\n  LoggerCustomLogWithStaticField() {\n    super();\n  }\n}\nclass MyLoggerFactory {\n  MyLoggerFactory() {\n    super();\n  }\n  static MyLoggerFactory create(String name, String t1, Object o, Class<?> clazz, String t2) {\n    return null;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LoggerFlogger.java",
    "content": "import lombok.extern.flogger.Flogger;\n@lombok.extern.flogger.Flogger class LoggerFlogger {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();\n  <clinit>() {\n  }\n  LoggerFlogger() {\n    super();\n  }\n}\n@Flogger class LoggerFloggerWithImport {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();\n  <clinit>() {\n  }\n  LoggerFloggerWithImport() {\n    super();\n  }\n}\nclass LoggerFloggerOuter {\n  static @lombok.extern.flogger.Flogger class Inner {\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();\n    <clinit>() {\n    }\n    Inner() {\n      super();\n    }\n  }\n  LoggerFloggerOuter() {\n    super();\n  }\n}\n@Flogger enum LoggerFloggerWithEnum {\n  CONSTANT(),\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();\n  <clinit>() {\n  }\n  LoggerFloggerWithEnum() {\n    super();\n  }\n}\nclass LoggerFloggerWithInnerEnum {\n  @Flogger enum Inner {\n    CONSTANT(),\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();\n    <clinit>() {\n    }\n    Inner() {\n      super();\n    }\n  }\n  LoggerFloggerWithInnerEnum() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LoggerFloggerAccess.java",
    "content": "import lombok.AccessLevel;\nimport lombok.extern.flogger.Flogger;\n@Flogger(access = AccessLevel.PUBLIC) class LoggerFloggerAccessPublic {\n  public static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();\n  <clinit>() {\n  }\n\n  LoggerFloggerAccessPublic() {\n    super();\n  }\n}\n@Flogger(access = AccessLevel.PROTECTED) class LoggerFloggerAccessProtected {\n  protected static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();\n  <clinit>() {\n  }\n\n  LoggerFloggerAccessProtected() {\n    super();\n  }\n}\n@Flogger(access = AccessLevel.PACKAGE) class LoggerFloggerAccessPackage {\n  static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();\n  <clinit>() {\n  }\n\n  LoggerFloggerAccessPackage() {\n    super();\n  }\n}\n@Flogger(access = AccessLevel.PRIVATE) class LoggerFloggerAccessPrivate {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();\n  <clinit>() {\n  }\n\n  LoggerFloggerAccessPrivate() {\n    super();\n  }\n}\n@Flogger(access = AccessLevel.NONE) class LoggerFloggerAccessNone {\n  LoggerFloggerAccessNone() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LoggerFloggerRecord.java",
    "content": "import lombok.extern.flogger.Flogger;\nclass LoggerFloggerRecord {\n  public @Flogger record Inner(String x) {\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();\n    <clinit>() {\n    }\n  }\n  LoggerFloggerRecord() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LoggerJBossLog.java",
    "content": "import lombok.extern.jbosslog.JBossLog;\n@lombok.extern.jbosslog.JBossLog class LoggerJBossLog {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LoggerJBossLog.class);\n  <clinit>() {\n  }\n  LoggerJBossLog() {\n    super();\n  }\n}\n@JBossLog class LoggerJBossLogWithImport {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LoggerJBossLogWithImport.class);\n  <clinit>() {\n  }\n  LoggerJBossLogWithImport() {\n    super();\n  }\n}\nclass LoggerJBossLogOuter {\n  static @lombok.extern.jbosslog.JBossLog class Inner {\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(Inner.class);\n    <clinit>() {\n    }\n    Inner() {\n      super();\n    }\n  }\n  LoggerJBossLogOuter() {\n    super();\n  }\n}\n@JBossLog enum LoggerJBossLogWithEnum {\n  CONSTANT(),\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LoggerJBossLogWithEnum.class);\n  <clinit>() {\n  }\n  LoggerJBossLogWithEnum() {\n    super();\n  }\n}\nclass LoggerJBossLogWithInnerEnum {\n  @JBossLog enum Inner {\n    CONSTANT(),\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(Inner.class);\n    <clinit>() {\n    }\n    Inner() {\n      super();\n    }\n  }\n  LoggerJBossLogWithInnerEnum() {\n    super();\n  }\n}\n@JBossLog(topic = \"DifferentLogger\") class LoggerJBossLogWithDifferentLoggerName {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(\"DifferentLogger\");\n  <clinit>() {\n  }\n  LoggerJBossLogWithDifferentLoggerName() {\n    super();\n  }\n}\n@JBossLog(topic = LoggerJBossLogWithStaticField.TOPIC) class LoggerJBossLogWithStaticField {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LoggerJBossLogWithStaticField.TOPIC);\n  static final String TOPIC = \"StaticField\";\n  <clinit>() {\n  }\n  LoggerJBossLogWithStaticField() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LoggerJBossLogAccess.java",
    "content": "import lombok.AccessLevel;\nimport lombok.extern.jbosslog.JBossLog;\n@JBossLog(access = AccessLevel.PUBLIC) class LoggerJBossLogAccessPublic {\n  public static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LoggerJBossLogAccessPublic.class);\n  <clinit>() {\n  }\n\n  LoggerJBossLogAccessPublic() {\n    super();\n  }\n}\n@JBossLog(access = AccessLevel.PROTECTED) class LoggerJBossLogAccessProtected {\n  protected static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LoggerJBossLogAccessProtected.class);\n  <clinit>() {\n  }\n\n  LoggerJBossLogAccessProtected() {\n    super();\n  }\n}\n@JBossLog(access = AccessLevel.PACKAGE) class LoggerJBossLogAccessPackage {\n  static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LoggerJBossLogAccessPackage.class);\n  <clinit>() {\n  }\n\n  LoggerJBossLogAccessPackage() {\n    super();\n  }\n}\n@JBossLog(access = AccessLevel.PRIVATE) class LoggerJBossLogAccessPrivate {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LoggerJBossLogAccessPrivate.class);\n  <clinit>() {\n  }\n\n  LoggerJBossLogAccessPrivate() {\n    super();\n  }\n}\n@JBossLog(access = AccessLevel.NONE) class LoggerJBossLogAccessNone {\n  LoggerJBossLogAccessNone() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LoggerJul.java",
    "content": "import lombok.extern.java.Log;\n@lombok.extern.java.Log class LoggerJul {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.logging.Logger log = java.util.logging.Logger.getLogger(LoggerJul.class.getName());\n  <clinit>() {\n  }\n  LoggerJul() {\n    super();\n  }\n}\n@Log class LoggerJulWithImport {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.logging.Logger log = java.util.logging.Logger.getLogger(LoggerJulWithImport.class.getName());\n  <clinit>() {\n  }\n  LoggerJulWithImport() {\n    super();\n  }\n}\n@Log(topic = \"DifferentName\") class LoggerJulWithDifferentName {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.logging.Logger log = java.util.logging.Logger.getLogger(\"DifferentName\");\n  <clinit>() {\n  }\n  LoggerJulWithDifferentName() {\n    super();\n  }\n}\n@Log(topic = LoggerJulWithStaticField.TOPIC) class LoggerJulWithStaticField {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.logging.Logger log = java.util.logging.Logger.getLogger(LoggerJulWithStaticField.TOPIC);\n  static final String TOPIC = \"StaticField\";\n  <clinit>() {\n  }\n  LoggerJulWithStaticField() {\n    super();\n  }\n}\n@Log enum LoggerJulWithEnum {\n  CONSTANT(),\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.logging.Logger log = java.util.logging.Logger.getLogger(LoggerJulWithEnum.class.getName());\n  <clinit>() {\n  }\n  LoggerJulWithEnum() {\n    super();\n  }\n}\nclass LoggerJulWithInnerEnum {\n  @Log enum Inner {\n    CONSTANT(),\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.logging.Logger log = java.util.logging.Logger.getLogger(Inner.class.getName());\n    <clinit>() {\n    }\n    Inner() {\n      super();\n    }\n  }\n  LoggerJulWithInnerEnum() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LoggerJulAccess.java",
    "content": "import lombok.AccessLevel;\nimport lombok.extern.java.Log;\n@Log(access = AccessLevel.PUBLIC) class LoggerJulAccessPublic {\n  public static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.logging.Logger log = java.util.logging.Logger.getLogger(LoggerJulAccessPublic.class.getName());\n  <clinit>() {\n  }\n\n  LoggerJulAccessPublic() {\n    super();\n  }\n}\n@Log(access = AccessLevel.PROTECTED) class LoggerJulAccessProtected {\n  protected static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.logging.Logger log = java.util.logging.Logger.getLogger(LoggerJulAccessProtected.class.getName());\n  <clinit>() {\n  }\n\n  LoggerJulAccessProtected() {\n    super();\n  }\n}\n@Log(access = AccessLevel.PACKAGE) class LoggerJulAccessPackage {\n  static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.logging.Logger log = java.util.logging.Logger.getLogger(LoggerJulAccessPackage.class.getName());\n  <clinit>() {\n  }\n\n  LoggerJulAccessPackage() {\n    super();\n  }\n}\n@Log(access = AccessLevel.PRIVATE) class LoggerJulAccessPrivate {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.logging.Logger log = java.util.logging.Logger.getLogger(LoggerJulAccessPrivate.class.getName());\n  <clinit>() {\n  }\n\n  LoggerJulAccessPrivate() {\n    super();\n  }\n}\n@Log(access = AccessLevel.NONE) class LoggerJulAccessNone {\n  LoggerJulAccessNone() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LoggerLog4j.java",
    "content": "import lombok.extern.log4j.Log4j;\n@lombok.extern.log4j.Log4j class LoggerLog4j {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LoggerLog4j.class);\n  <clinit>() {\n  }\n  LoggerLog4j() {\n    super();\n  }\n}\n@Log4j class LoggerLog4jWithImport {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LoggerLog4jWithImport.class);\n  <clinit>() {\n  }\n  LoggerLog4jWithImport() {\n    super();\n  }\n}\n@Log4j(topic = \"DifferentName\") class LoggerLog4jWithDifferentName {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(\"DifferentName\");\n  <clinit>() {\n  }\n  LoggerLog4jWithDifferentName() {\n    super();\n  }\n}\n@Log4j(topic = LoggerLog4jWithStaticField.TOPIC) class LoggerLog4jWithStaticField {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LoggerLog4jWithStaticField.TOPIC);\n  static final String TOPIC = \"StaticField\";\n  <clinit>() {\n  }\n  LoggerLog4jWithStaticField() {\n    super();\n  }\n}\n@Log4j enum LoggerLog4jWithEnum {\n  CONSTANT(),\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LoggerLog4jWithEnum.class);\n  <clinit>() {\n  }\n  LoggerLog4jWithEnum() {\n    super();\n  }\n}\nclass LoggerLog4jWithInnerEnum {\n  @Log4j enum Inner {\n    CONSTANT(),\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(Inner.class);\n    <clinit>() {\n    }\n    Inner() {\n      super();\n    }\n  }\n  LoggerLog4jWithInnerEnum() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LoggerLog4j2.java",
    "content": "import lombok.extern.log4j.Log4j2;\n@lombok.extern.log4j.Log4j2 class LoggerLog4j2 {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LoggerLog4j2.class);\n  <clinit>() {\n  }\n  LoggerLog4j2() {\n    super();\n  }\n}\n@Log4j2 class LoggerLog4j2WithImport {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LoggerLog4j2WithImport.class);\n  <clinit>() {\n  }\n  LoggerLog4j2WithImport() {\n    super();\n  }\n}\n@Log4j2(topic = \"DifferentName\") class LoggerLog4j2WithDifferentName {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(\"DifferentName\");\n  <clinit>() {\n  }\n  LoggerLog4j2WithDifferentName() {\n    super();\n  }\n}\n@Log4j2(topic = LoggerLog4j2WithStaticField.TOPIC) class LoggerLog4j2WithStaticField {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LoggerLog4j2WithStaticField.TOPIC);\n  static final String TOPIC = \"StaticField\";\n  <clinit>() {\n  }\n  LoggerLog4j2WithStaticField() {\n    super();\n  }\n}\n@Log4j2 enum LoggerLog4j2WithEnum {\n  CONSTANT(),\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LoggerLog4j2WithEnum.class);\n  <clinit>() {\n  }\n  LoggerLog4j2WithEnum() {\n    super();\n  }\n}\nclass LoggerLog4j2WithInnerEnum {\n  @Log4j2 enum Inner {\n    CONSTANT(),\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(Inner.class);\n    <clinit>() {\n    }\n    Inner() {\n      super();\n    }\n  }\n  LoggerLog4j2WithInnerEnum() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LoggerLog4j2Access.java",
    "content": "import lombok.AccessLevel;\nimport lombok.extern.log4j.Log4j2;\n@Log4j2(access = AccessLevel.PUBLIC) class LoggerLog4j2AccessPublic {\n  public static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LoggerLog4j2AccessPublic.class);\n  <clinit>() {\n  }\n\n  LoggerLog4j2AccessPublic() {\n    super();\n  }\n}\n@Log4j2(access = AccessLevel.PROTECTED) class LoggerLog4j2AccessProtected {\n  protected static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LoggerLog4j2AccessProtected.class);\n  <clinit>() {\n  }\n\n  LoggerLog4j2AccessProtected() {\n    super();\n  }\n}\n@Log4j2(access = AccessLevel.PACKAGE) class LoggerLog4j2AccessPackage {\n  static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LoggerLog4j2AccessPackage.class);\n  <clinit>() {\n  }\n\n  LoggerLog4j2AccessPackage() {\n    super();\n  }\n}\n@Log4j2(access = AccessLevel.PRIVATE) class LoggerLog4j2AccessPrivate {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LoggerLog4j2AccessPrivate.class);\n  <clinit>() {\n  }\n\n  LoggerLog4j2AccessPrivate() {\n    super();\n  }\n}\n@Log4j2(access = AccessLevel.NONE) class LoggerLog4j2AccessNone {\n  LoggerLog4j2AccessNone() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LoggerLog4jAccess.java",
    "content": "import lombok.AccessLevel;\nimport lombok.extern.log4j.Log4j;\n@Log4j(access = AccessLevel.PUBLIC) class LoggerLog4jAccessPublic {\n  public static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LoggerLog4jAccessPublic.class);\n  <clinit>() {\n  }\n\n  LoggerLog4jAccessPublic() {\n    super();\n  }\n}\n@Log4j(access = AccessLevel.PROTECTED) class LoggerLog4jAccessProtected {\n  protected static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LoggerLog4jAccessProtected.class);\n  <clinit>() {\n  }\n\n  LoggerLog4jAccessProtected() {\n    super();\n  }\n}\n@Log4j(access = AccessLevel.PACKAGE) class LoggerLog4jAccessPackage {\n  static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LoggerLog4jAccessPackage.class);\n  <clinit>() {\n  }\n\n  LoggerLog4jAccessPackage() {\n    super();\n  }\n}\n@Log4j(access = AccessLevel.PRIVATE) class LoggerLog4jAccessPrivate {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LoggerLog4jAccessPrivate.class);\n  <clinit>() {\n  }\n\n  LoggerLog4jAccessPrivate() {\n    super();\n  }\n}\n@Log4j(access = AccessLevel.NONE) class LoggerLog4jAccessNone {\n  LoggerLog4jAccessNone() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LoggerSlf4j.java",
    "content": "import lombok.extern.slf4j.Slf4j;\n@lombok.extern.slf4j.Slf4j class LoggerSlf4j {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoggerSlf4j.class);\n  <clinit>() {\n  }\n  LoggerSlf4j() {\n    super();\n  }\n}\n@Slf4j class LoggerSlf4jWithImport {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoggerSlf4jWithImport.class);\n  <clinit>() {\n  }\n  LoggerSlf4jWithImport() {\n    super();\n  }\n}\n@Slf4j enum LoggerSlf4jWithEnum {\n  CONSTANT(),\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoggerSlf4jWithEnum.class);\n  <clinit>() {\n  }\n  LoggerSlf4jWithEnum() {\n    super();\n  }\n}\nclass LoggerSlf4jWithInnerEnum {\n  @Slf4j enum Inner {\n    CONSTANT(),\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(Inner.class);\n    <clinit>() {\n    }\n    Inner() {\n      super();\n    }\n  }\n  LoggerSlf4jWithInnerEnum() {\n    super();\n  }\n}\nclass LoggerSlf4jOuter {\n  static @lombok.extern.slf4j.Slf4j class Inner {\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(Inner.class);\n    <clinit>() {\n    }\n    Inner() {\n      super();\n    }\n  }\n  LoggerSlf4jOuter() {\n    super();\n  }\n}\n@Slf4j(topic = \"DifferentLogger\") class LoggerSlf4jWithDifferentLoggerName {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(\"DifferentLogger\");\n  <clinit>() {\n  }\n  LoggerSlf4jWithDifferentLoggerName() {\n    super();\n  }\n}\n@Slf4j(topic = LoggerSlf4jWithStaticField.TOPIC) class LoggerSlf4jWithStaticField {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoggerSlf4jWithStaticField.TOPIC);\n  static final String TOPIC = \"StaticField\";\n  <clinit>() {\n  }\n  LoggerSlf4jWithStaticField() {\n    super();\n  }\n}\n@Slf4j(topic = (LoggerSlf4jWithTwoStaticFields.TOPIC + LoggerSlf4jWithTwoStaticFields.TOPIC)) class LoggerSlf4jWithTwoStaticFields {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger((LoggerSlf4jWithTwoStaticFields.TOPIC + LoggerSlf4jWithTwoStaticFields.TOPIC));\n  static final String TOPIC = \"StaticField\";\n  <clinit>() {\n  }\n  LoggerSlf4jWithTwoStaticFields() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LoggerSlf4jAccess.java",
    "content": "import lombok.AccessLevel;\nimport lombok.extern.slf4j.Slf4j;\n@Slf4j(access = AccessLevel.PUBLIC) class LoggerSlf4jAccessPublic {\n  public static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoggerSlf4jAccessPublic.class);\n  <clinit>() {\n  }\n\n  LoggerSlf4jAccessPublic() {\n    super();\n  }\n}\n@Slf4j(access = AccessLevel.PROTECTED) class LoggerSlf4jAccessProtected {\n  protected static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoggerSlf4jAccessProtected.class);\n  <clinit>() {\n  }\n\n  LoggerSlf4jAccessProtected() {\n    super();\n  }\n}\n@Slf4j(access = AccessLevel.PACKAGE) class LoggerSlf4jAccessPackage {\n  static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoggerSlf4jAccessPackage.class);\n  <clinit>() {\n  }\n\n  LoggerSlf4jAccessPackage() {\n    super();\n  }\n}\n@Slf4j(access = AccessLevel.PRIVATE) class LoggerSlf4jAccessPrivate {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoggerSlf4jAccessPrivate.class);\n  <clinit>() {\n  }\n\n  LoggerSlf4jAccessPrivate() {\n    super();\n  }\n}\n@Slf4j(access = AccessLevel.NONE) class LoggerSlf4jAccessNone {\n  LoggerSlf4jAccessNone() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LoggerSlf4jAlreadyExists.java",
    "content": "@lombok.extern.slf4j.Slf4j class LoggerSlf4jAlreadyExists {\n  int log;\n  LoggerSlf4jAlreadyExists() {\n    super();\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/LoggerSlf4jInAnonymousClass.java",
    "content": "import lombok.extern.slf4j.Slf4j;\npublic class LoggerSlf4jInAnonymousClass {\n  Object annonymous = new Object() {\n    @Slf4j class Inner {\n      Inner() {\n        super();\n      }\n    }\n    x() {\n      super();\n    }\n  };\n  public LoggerSlf4jInAnonymousClass() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LoggerSlf4jOnRecord.java",
    "content": "import lombok.extern.slf4j.Slf4j;\npublic @Slf4j record LoggerSlf4jOnRecord(String a, String b) {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoggerSlf4jOnRecord.class);\n  <clinit>() {\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LoggerSlf4jTypes.java",
    "content": "@lombok.extern.slf4j.Slf4j interface LoggerSlf4jTypesInterface {\n}\n@lombok.extern.slf4j.Slf4j @interface LoggerSlf4jTypesAnnotation {\n}\n@lombok.extern.slf4j.Slf4j enum LoggerSlf4jTypesEnum {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoggerSlf4jTypesEnum.class);\n  <clinit>() {\n  }\n  LoggerSlf4jTypesEnum() {\n    super();\n  }\n}\n@lombok.extern.slf4j.Slf4j enum LoggerSlf4jTypesEnumWithElement {\n  FOO(),\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoggerSlf4jTypesEnumWithElement.class);\n  <clinit>() {\n  }\n  LoggerSlf4jTypesEnumWithElement() {\n    super();\n  }\n}\ninterface LoggerSlf4jTypesInterfaceOuter {\n  @lombok.extern.slf4j.Slf4j class Inner {\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(Inner.class);\n    <clinit>() {\n    }\n    Inner() {\n      super();\n    }\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LoggerSlf4jWithPackage.java",
    "content": "package before;\n@lombok.extern.slf4j.Slf4j class LoggerSlf4jWithPackage {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LoggerSlf4jWithPackage.class);\n  <clinit>() {\n  }\n  LoggerSlf4jWithPackage() {\n    super();\n  }\n}\nclass LoggerSlf4jWithPackageOuter {\n  static @lombok.extern.slf4j.Slf4j class Inner {\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(Inner.class);\n    <clinit>() {\n    }\n    Inner() {\n      super();\n    }\n  }\n  LoggerSlf4jWithPackageOuter() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LoggerXSlf4j.java",
    "content": "import lombok.extern.slf4j.XSlf4j;\n@lombok.extern.slf4j.XSlf4j class LoggerXSlf4j {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LoggerXSlf4j.class);\n  <clinit>() {\n  }\n  LoggerXSlf4j() {\n    super();\n  }\n}\n@XSlf4j class LoggerXSlf4jWithImport {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LoggerXSlf4jWithImport.class);\n  <clinit>() {\n  }\n  LoggerXSlf4jWithImport() {\n    super();\n  }\n}\n@XSlf4j(topic = \"DifferentName\") class LoggerXSlf4jWithDifferentName {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(\"DifferentName\");\n  <clinit>() {\n  }\n  LoggerXSlf4jWithDifferentName() {\n    super();\n  }\n}\n@XSlf4j(topic = LoggerXSlf4jWithStaticField.TOPIC) class LoggerXSlf4jWithStaticField {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LoggerXSlf4jWithStaticField.TOPIC);\n  static final String TOPIC = \"StaticField\";\n  <clinit>() {\n  }\n  LoggerXSlf4jWithStaticField() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/LoggerXSlf4jAccess.java",
    "content": "import lombok.AccessLevel;\nimport lombok.extern.slf4j.XSlf4j;\n@XSlf4j(access = AccessLevel.PUBLIC) class LoggerXSlf4jAccessPublic {\n  public static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LoggerXSlf4jAccessPublic.class);\n  <clinit>() {\n  }\n\n  LoggerXSlf4jAccessPublic() {\n    super();\n  }\n}\n@XSlf4j(access = AccessLevel.PROTECTED) class LoggerXSlf4jAccessProtected {\n  protected static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LoggerXSlf4jAccessProtected.class);\n  <clinit>() {\n  }\n\n  LoggerXSlf4jAccessProtected() {\n    super();\n  }\n}\n@XSlf4j(access = AccessLevel.PACKAGE) class LoggerXSlf4jAccessPackage {\n  static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LoggerXSlf4jAccessPackage.class);\n  <clinit>() {\n  }\n\n  LoggerXSlf4jAccessPackage() {\n    super();\n  }\n}\n@XSlf4j(access = AccessLevel.PRIVATE) class LoggerXSlf4jAccessPrivate {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LoggerXSlf4jAccessPrivate.class);\n  <clinit>() {\n  }\n\n  LoggerXSlf4jAccessPrivate() {\n    super();\n  }\n}\n@XSlf4j(access = AccessLevel.NONE) class LoggerXSlf4jAccessNone {\n  LoggerXSlf4jAccessNone() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/MixGetterVal.java",
    "content": "import lombok.Getter;\nimport lombok.val;\nclass MixGetterVal {\n  private @Getter int x;\n  MixGetterVal() {\n    super();\n  }\n  public void m(int z) {\n  }\n  public void test() {\n    final @val int y = x;\n    m(y);\n    final @val int a = getX();\n    m(a);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getX() {\n    return this.x;\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/MultiFieldGetter.java",
    "content": "import lombok.Getter;\nimport lombok.AccessLevel;\nclass MultiFieldGetter {\n  @Getter(AccessLevel.PROTECTED) int x;\n  @Getter(AccessLevel.PROTECTED) int y;\n  MultiFieldGetter() {\n    super();\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getX() {\n    return this.x;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getY() {\n    return this.y;\n  }\n}\n@Getter class MultiFieldGetter2 {\n  @Getter(AccessLevel.PACKAGE) int x;\n  @Getter(AccessLevel.PACKAGE) int y;\n  MultiFieldGetter2() {\n    super();\n  }\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getX() {\n    return this.x;\n  }\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getY() {\n    return this.y;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/NoArgsConstructorForce.java",
    "content": "import lombok.NoArgsConstructor;\npublic @NoArgsConstructor(force = true) class NoArgsConstructorForce {\n  private final int[] i;\n  private final Object[] o;\n  private final java.util.List<?>[] fullQualifiedList;\n  private final String alreadyInitialized = \"yes\";\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated NoArgsConstructorForce() {\n    super();\n    this.i = null;\n    this.o = null;\n    this.fullQualifiedList = null;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/NoPrivateNoArgsConstructor.java",
    "content": "public class NoPrivateNoArgsConstructor {\n  public static @lombok.Data class NoPrivateNoArgsConstructorData {\n    private final int i;\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getI() {\n      return this.i;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n      if ((o == this))\n          return true;\n      if ((! (o instanceof NoPrivateNoArgsConstructor.NoPrivateNoArgsConstructorData)))\n          return false;\n      final NoPrivateNoArgsConstructor.NoPrivateNoArgsConstructorData other = (NoPrivateNoArgsConstructor.NoPrivateNoArgsConstructorData) o;\n      if ((! other.canEqual((java.lang.Object) this)))\n          return false;\n      if ((this.getI() != other.getI()))\n          return false;\n      return true;\n    }\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n      return (other instanceof NoPrivateNoArgsConstructor.NoPrivateNoArgsConstructorData);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n      final int PRIME = 59;\n      int result = 1;\n      result = ((result * PRIME) + this.getI());\n      return result;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"NoPrivateNoArgsConstructor.NoPrivateNoArgsConstructorData(i=\" + this.getI()) + \")\");\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated NoPrivateNoArgsConstructorData(final int i) {\n      super();\n      this.i = i;\n    }\n  }\n  public static final @lombok.Value class NoPrivateNoArgsConstructorValue {\n    private final int i;\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getI() {\n      return this.i;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n      if ((o == this))\n          return true;\n      if ((! (o instanceof NoPrivateNoArgsConstructor.NoPrivateNoArgsConstructorValue)))\n          return false;\n      final NoPrivateNoArgsConstructor.NoPrivateNoArgsConstructorValue other = (NoPrivateNoArgsConstructor.NoPrivateNoArgsConstructorValue) o;\n      if ((this.getI() != other.getI()))\n          return false;\n      return true;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n      final int PRIME = 59;\n      int result = 1;\n      result = ((result * PRIME) + this.getI());\n      return result;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"NoPrivateNoArgsConstructor.NoPrivateNoArgsConstructorValue(i=\" + this.getI()) + \")\");\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated NoPrivateNoArgsConstructorValue(final int i) {\n      super();\n      this.i = i;\n    }\n  }\n  public NoPrivateNoArgsConstructor() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/NonNullExistingConstructorOnRecord.java",
    "content": "// version 14:\nimport lombok.NonNull;\npublic record NonNullExistingConstructorOnRecord(String a, String b) {\n  public NonNullExistingConstructorOnRecord(@NonNull String b) {\n    this(\"default\", b);\n    if ((b == null))\n        {\n          throw new java.lang.NullPointerException(\"b is marked non-null but is null\");\n        }\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated NonNullExistingConstructorOnRecord(@NonNull String a, @NonNull String b) {\n    super();\n    if ((a == null))\n        {\n          throw new java.lang.NullPointerException(\"a is marked non-null but is null\");\n        }\n    if ((b == null))\n        {\n          throw new java.lang.NullPointerException(\"b is marked non-null but is null\");\n        }\n    this.a = a;\n    this.b = b;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/NonNullOnParameter.java",
    "content": "class NonNullOnParameter extends Thread {\n  <clinit>() {\n  }\n  NonNullOnParameter(@lombok.NonNull String arg) {\n    this(arg, \"\");\n    if ((arg == null))\n        {\n          throw new java.lang.NullPointerException(\"arg is marked non-null but is null\");\n        }\n  }\n  NonNullOnParameter(@lombok.NonNull String arg, @lombok.NonNull String arg2) {\n    super(arg);\n    if ((arg2 == null))\n        {\n          throw new java.lang.NullPointerException(\"arg2 is marked non-null but is null\");\n        }\n    if ((arg == null))\n        throw new NullPointerException();\n  }\n  public void test2(@lombok.NonNull String arg, @lombok.NonNull String arg2, @lombok.NonNull String arg3) {\n    if ((arg == null))\n        {\n          throw new java.lang.NullPointerException(\"arg is marked non-null but is null\");\n        }\n    if ((arg3 == null))\n        {\n          throw new java.lang.NullPointerException(\"arg3 is marked non-null but is null\");\n        }\n    if ((arg2 == null))\n        {\n          throw new NullPointerException(\"arg2\");\n        }\n    if ((arg == null))\n        System.out.println(\"Hello\");\n  }\n  public void test3(@lombok.NonNull String arg) {\n    if ((arg == null))\n        {\n          throw new java.lang.NullPointerException(\"arg is marked non-null but is null\");\n        }\n    if ((arg != null))\n        throw new IllegalStateException();\n  }\n  public void test(@lombok.NonNull String stringArg, @lombok.NonNull String arg2, @lombok.NonNull int primitiveArg) {\n    if ((stringArg == null))\n        {\n          throw new java.lang.NullPointerException(\"stringArg is marked non-null but is null\");\n        }\n    if ((arg2 == null))\n        {\n          throw new java.lang.NullPointerException(\"arg2 is marked non-null but is null\");\n        }\n  }\n  public void test(@lombok.NonNull String arg) {\n    if ((arg == null))\n        {\n          throw new java.lang.NullPointerException(\"arg is marked non-null but is null\");\n        }\n    System.out.println(\"Hey\");\n    if ((arg == null))\n        throw new NullPointerException();\n  }\n  public void testWithAssert(@lombok.NonNull String param) {\n    assert (param != null);\n  }\n  public void testWithAssertAndMessage(@lombok.NonNull String param) {\n    assert (param != null): \"Oops\";\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/NonNullOnParameterAbstract.java",
    "content": "abstract class NonNullOnParameterAbstract {\n  NonNullOnParameterAbstract() {\n    super();\n  }\n  public void test(@lombok.NonNull String arg) {\n    if ((arg == null))\n        {\n          throw new java.lang.NullPointerException(\"arg is marked non-null but is null\");\n        }\n    System.out.println(\"Hey\");\n  }\n  public abstract void test2(@lombok.NonNull String arg);\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/NonNullOnParameterOfDefaultMethod.java",
    "content": "interface NonNullOnParameterOfDefaultMethod {\n  void test(@lombok.NonNull String arg);\n  default void test2(@lombok.NonNull String arg) {\n    if ((arg == null))\n        {\n          throw new java.lang.NullPointerException(\"arg is marked non-null but is null\");\n        }\n    System.out.println(arg);\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/NonNullOnRecordExistingConstructor.java",
    "content": "// version 14:\n// skip compare content: At time of writing, the `@NonNull` annotation causes our handler to produce an explicit-params constructor (i.e. `public NNOREC(String a) {` instead of `public NNOREC {`) with `@NonNull`, and in the statements the null check. But (?) other eclipse versions might not, hence, we ignore content.\nimport lombok.NonNull;\npublic record NonNullOnRecordExistingConstructor(String a) {\n  public NonNullOnRecordExistingConstructor {\n    super();\n    if ((a == null))\n        {\n          throw new java.lang.NullPointerException(\"a is marked non-null but is null\");\n        }\n    System.out.println(\"Hello\");\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/NonNullOnRecordExistingSetter.java",
    "content": "// version 19:\nimport lombok.NonNull;\npublic record NonNullOnRecordExistingSetter(String a) {\n  public NonNullOnRecordExistingSetter(String a) {\n    super();\n    this.a = a;\n  }\n  public void method(@NonNull String param) {\n    if ((param == null))\n        {\n          throw new java.lang.NullPointerException(\"param is marked non-null but is null\");\n        }\n    String asd = \"a\";\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/NonNullOnRecordSimple.java",
    "content": "// version 14:\nimport lombok.NonNull;\npublic record NonNullOnRecordSimple(String a, String b) {\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated NonNullOnRecordSimple(@NonNull String a, @NonNull String b) {\n    super();\n    if ((a == null))\n        {\n          throw new java.lang.NullPointerException(\"a is marked non-null but is null\");\n        }\n    if ((b == null))\n        {\n          throw new java.lang.NullPointerException(\"b is marked non-null but is null\");\n        }\n    this.a = a;\n    this.b = b;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/NonNullOnRecordTypeUse.java",
    "content": "// version 14:\nimport lombok.NonNull;\npublic record NonNullOnRecordTypeUse(int a, int b, int c) {\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated NonNullOnRecordTypeUse(@NonNull int[] a, int @NonNull [] b, int[] @NonNull [] c) {\n    super();\n    if ((a == null))\n        {\n          throw new java.lang.NullPointerException(\"a is marked non-null but is null\");\n        }\n    if ((b == null))\n        {\n          throw new java.lang.NullPointerException(\"b is marked non-null but is null\");\n        }\n    this.a = a;\n    this.b = b;\n    this.c = c;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/NonNullPlain.java",
    "content": "import java.lang.annotation.*;\n@lombok.RequiredArgsConstructor @lombok.Getter @lombok.Setter class NonNullPlain {\n  public @Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE}) @Retention(RetentionPolicy.CLASS) @interface NotNull {\n  }\n  @lombok.NonNull int i;\n  @lombok.NonNull String s;\n  @NotNull Object o;\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated NonNullPlain(final @lombok.NonNull int i, final @lombok.NonNull String s) {\n    super();\n    if ((s == null))\n        {\n          throw new java.lang.NullPointerException(\"s is marked non-null but is null\");\n        }\n    this.i = i;\n    this.s = s;\n  }\n  public @lombok.NonNull @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getI() {\n    return this.i;\n  }\n  public @lombok.NonNull @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getS() {\n    return this.s;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Object getO() {\n    return this.o;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setI(final @lombok.NonNull int i) {\n    this.i = i;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setS(final @lombok.NonNull String s) {\n    if ((s == null))\n        {\n          throw new java.lang.NullPointerException(\"s is marked non-null but is null\");\n        }\n    this.s = s;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setO(final Object o) {\n    this.o = o;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/NonNullTypeUse.java",
    "content": "import lombok.NonNull;\nclass NonNullTypeUse {\n  NonNullTypeUse() {\n    super();\n  }\n  void test1(@NonNull String[][][] args) {\n    if ((args == null))\n        {\n          throw new java.lang.NullPointerException(\"args is marked non-null but is null\");\n        }\n  }\n  void test2(String @NonNull [][][] args) {\n    if ((args == null))\n        {\n          throw new java.lang.NullPointerException(\"args is marked non-null but is null\");\n        }\n  }\n  void test3(String[] @NonNull [][] args) {\n  }\n  void test4(String[][] @NonNull [] args) {\n  }\n  void test5(@NonNull String simple) {\n    if ((simple == null))\n        {\n          throw new java.lang.NullPointerException(\"simple is marked non-null but is null\");\n        }\n  }\n  void test6(java.lang.@NonNull String weird) {\n    if ((weird == null))\n        {\n          throw new java.lang.NullPointerException(\"weird is marked non-null but is null\");\n        }\n  }\n  void test7(java.lang.String @NonNull [][] weird) {\n    if ((weird == null))\n        {\n          throw new java.lang.NullPointerException(\"weird is marked non-null but is null\");\n        }\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/NonNullWithAlternateException.java",
    "content": "public class NonNullWithAlternateException {\n  private @lombok.NonNull @lombok.Setter String test;\n  public NonNullWithAlternateException() {\n    super();\n  }\n  public void testMethod(@lombok.NonNull String arg) {\n    if ((arg == null))\n        {\n          throw new java.lang.IllegalArgumentException(\"arg is marked non-null but is null\");\n        }\n    System.out.println(arg);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setTest(final @lombok.NonNull String test) {\n    if ((test == null))\n        {\n          throw new java.lang.IllegalArgumentException(\"test is marked non-null but is null\");\n        }\n    this.test = test;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/NonNullWithAssertion.java",
    "content": "public class NonNullWithAssertion {\n  private @lombok.NonNull @lombok.Setter String test;\n  public NonNullWithAssertion() {\n    super();\n  }\n  public void testMethod(@lombok.NonNull String arg) {\n    assert (arg != null): \"arg is marked non-null but is null\";\n    System.out.println(arg);\n  }\n  public void testMethodWithIf(@lombok.NonNull String arg) {\n    if ((arg == null))\n        throw new NullPointerException(\"Oops\");\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setTest(final @lombok.NonNull String test) {\n    assert (test != null): \"test is marked non-null but is null\";\n    this.test = test;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/NonNullWithGuava.java",
    "content": "import static com.google.common.base.Preconditions.*;\npublic class NonNullWithGuava {\n  private @lombok.NonNull @lombok.Setter String test;\n  public NonNullWithGuava() {\n    super();\n  }\n  public void testMethod(@lombok.NonNull String arg) {\n    com.google.common.base.Preconditions.checkNotNull(arg, \"arg is marked non-null but is null\");\n    System.out.println(arg);\n  }\n  public void testMethodWithCheck1(@lombok.NonNull String arg) {\n    checkNotNull(arg);\n  }\n  public void testMethodWithCheckAssign(@lombok.NonNull String arg) {\n    test = checkNotNull(arg);\n  }\n  public void testMethodWithCheck2(@lombok.NonNull String arg) {\n    com.google.common.base.Preconditions.checkNotNull(arg);\n  }\n  public void testMethodWithFakeCheck1(@lombok.NonNull String arg) {\n    com.google.common.base.Preconditions.checkNotNull(arg, \"arg is marked non-null but is null\");\n    checkNotNull(\"\");\n  }\n  public void testMethodWithFakeCheck2(@lombok.NonNull String arg) {\n    com.google.common.base.Preconditions.checkNotNull(arg, \"arg is marked non-null but is null\");\n    com.google.common.base.Preconditions.checkNotNull(test);\n  }\n  public void testMethodWithFakeCheckAssign(@lombok.NonNull String arg) {\n    com.google.common.base.Preconditions.checkNotNull(arg, \"arg is marked non-null but is null\");\n    test = checkNotNull(test);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setTest(final @lombok.NonNull String test) {\n    com.google.common.base.Preconditions.checkNotNull(test, \"test is marked non-null but is null\");\n    this.test = test;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/NonNullWithJdk.java",
    "content": "//version 7:\nimport static java.util.Objects.*;\npublic class NonNullWithJdk {\n  private @lombok.NonNull @lombok.Setter String test;\n  public NonNullWithJdk() {\n    super();\n  }\n  public void testMethod(@lombok.NonNull String arg) {\n    java.util.Objects.requireNonNull(arg, \"arg is marked non-null but is null\");\n    System.out.println(arg);\n  }\n  public void testMethodWithCheck1(@lombok.NonNull String arg) {\n    requireNonNull(arg);\n  }\n  public void testMethodWithCheckAssign(@lombok.NonNull String arg) {\n    test = requireNonNull(arg);\n  }\n  public void testMethodWithCheck2(@lombok.NonNull String arg) {\n    java.util.Objects.requireNonNull(arg);\n  }\n  public void testMethodWithFakeCheck1(@lombok.NonNull String arg) {\n    java.util.Objects.requireNonNull(arg, \"arg is marked non-null but is null\");\n    requireNonNull(\"\");\n  }\n  public void testMethodWithFakeCheck2(@lombok.NonNull String arg) {\n    java.util.Objects.requireNonNull(arg, \"arg is marked non-null but is null\");\n    java.util.Objects.requireNonNull(test);\n  }\n  public void testMethodWithFakeCheckAssign(@lombok.NonNull String arg) {\n    java.util.Objects.requireNonNull(arg, \"arg is marked non-null but is null\");\n    test = requireNonNull(test);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setTest(final @lombok.NonNull String test) {\n    java.util.Objects.requireNonNull(test, \"test is marked non-null but is null\");\n    this.test = test;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/NonNullWithSneakyThrows.java",
    "content": "class NonNullWithSneakyThrows {\n  NonNullWithSneakyThrows() {\n    super();\n  }\n  @lombok.SneakyThrows void test(@lombok.NonNull String in) {\n    try \n      {\n        if ((in == null))\n            {\n              throw new java.lang.NullPointerException(\"in is marked non-null but is null\");\n            }\n        System.out.println(in);\n      }\n    catch (final java.lang.Throwable $ex)\n      {\n        throw lombok.Lombok.sneakyThrow($ex);\n      }\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/NullAnnotatedCheckerFrameworkSuperBuilder.java",
    "content": "import java.util.List;\nimport lombok.Singular;\nclass NullAnnotatedCheckerFrameworkSuperBuilder {\n  public static @lombok.experimental.SuperBuilder class Parent {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilder<C extends NullAnnotatedCheckerFrameworkSuperBuilder.Parent, B extends NullAnnotatedCheckerFrameworkSuperBuilder.Parent.ParentBuilder<C, B>> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int x$value;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean x$set;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int y;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int z;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> names;\n      public ParentBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @org.checkerframework.checker.nullness.qual.NonNull @java.lang.SuppressWarnings(\"all\") @lombok.Generated B x(final int x) {\n        this.x$value = x;\n        x$set = true;\n        return self();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @org.checkerframework.checker.nullness.qual.NonNull @java.lang.SuppressWarnings(\"all\") @lombok.Generated B y(final int y) {\n        this.y = y;\n        return self();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @org.checkerframework.checker.nullness.qual.NonNull @java.lang.SuppressWarnings(\"all\") @lombok.Generated B z(final int z) {\n        this.z = z;\n        return self();\n      }\n      public @org.checkerframework.checker.nullness.qual.NonNull @java.lang.SuppressWarnings(\"all\") @lombok.Generated B name(final String name) {\n        if ((this.names == null))\n            this.names = new java.util.ArrayList<String>();\n        this.names.add(name);\n        return self();\n      }\n      public @org.checkerframework.checker.nullness.qual.NonNull @java.lang.SuppressWarnings(\"all\") @lombok.Generated B names(final java.util. @org.checkerframework.checker.nullness.qual.NonNull Collection<? extends String> names) {\n        if ((names == null))\n            {\n              throw new java.lang.NullPointerException(\"names cannot be null\");\n            }\n        if ((this.names == null))\n            this.names = new java.util.ArrayList<String>();\n        this.names.addAll(names);\n        return self();\n      }\n      public @org.checkerframework.checker.nullness.qual.NonNull @java.lang.SuppressWarnings(\"all\") @lombok.Generated B clearNames() {\n        if ((this.names != null))\n            this.names.clear();\n        return self();\n      }\n      protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.@org.checkerframework.checker.nullness.qual.NonNull String toString() {\n        return ((((((((\"NullAnnotatedCheckerFrameworkSuperBuilder.Parent.ParentBuilder(x$value=\" + this.x$value) + \", y=\") + this.y) + \", z=\") + this.z) + \", names=\") + this.names) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilderImpl extends NullAnnotatedCheckerFrameworkSuperBuilder.Parent.ParentBuilder<NullAnnotatedCheckerFrameworkSuperBuilder.Parent, NullAnnotatedCheckerFrameworkSuperBuilder.Parent.ParentBuilderImpl> {\n      private ParentBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated NullAnnotatedCheckerFrameworkSuperBuilder.Parent.ParentBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated NullAnnotatedCheckerFrameworkSuperBuilder.@org.checkerframework.checker.nullness.qual.NonNull Parent build() {\n        return new NullAnnotatedCheckerFrameworkSuperBuilder.Parent(this);\n      }\n    }\n    @lombok.Builder.Default int x;\n    int y;\n    int z;\n    @Singular List<String> names;\n    private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated int $default$x() {\n      return 5;\n    }\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Parent(final NullAnnotatedCheckerFrameworkSuperBuilder.Parent.ParentBuilder<?, ?> b) {\n      super();\n      if (b.x$set)\n          this.x = b.x$value;\n      else\n          this.x = NullAnnotatedCheckerFrameworkSuperBuilder.Parent.$default$x();\n      this.y = b.y;\n      this.z = b.z;\n      java.util.List<String> names;\n      switch (((b.names == null) ? 0 : b.names.size())) {\n      case 0 :\n          names = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          names = java.util.Collections.singletonList(b.names.get(0));\n          break;\n      default :\n          names = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(b.names));\n      }\n      this.names = names;\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated NullAnnotatedCheckerFrameworkSuperBuilder.Parent. @org.checkerframework.checker.nullness.qual.NonNull ParentBuilder<?, ?> builder() {\n      return new NullAnnotatedCheckerFrameworkSuperBuilder.Parent.ParentBuilderImpl();\n    }\n  }\n  public static @lombok.experimental.SuperBuilder class ZChild extends Parent {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ZChildBuilder<C extends NullAnnotatedCheckerFrameworkSuperBuilder.ZChild, B extends NullAnnotatedCheckerFrameworkSuperBuilder.ZChild.ZChildBuilder<C, B>> extends Parent.ParentBuilder<C, B> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int a$value;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean a$set;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int b;\n      public ZChildBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @org.checkerframework.checker.nullness.qual.NonNull @java.lang.SuppressWarnings(\"all\") @lombok.Generated B a(final int a) {\n        this.a$value = a;\n        a$set = true;\n        return self();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @org.checkerframework.checker.nullness.qual.NonNull @java.lang.SuppressWarnings(\"all\") @lombok.Generated B b(final int b) {\n        this.b = b;\n        return self();\n      }\n      protected abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.@org.checkerframework.checker.nullness.qual.NonNull String toString() {\n        return ((((((\"NullAnnotatedCheckerFrameworkSuperBuilder.ZChild.ZChildBuilder(super=\" + super.toString()) + \", a$value=\") + this.a$value) + \", b=\") + this.b) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ZChildBuilderImpl extends NullAnnotatedCheckerFrameworkSuperBuilder.ZChild.ZChildBuilder<NullAnnotatedCheckerFrameworkSuperBuilder.ZChild, NullAnnotatedCheckerFrameworkSuperBuilder.ZChild.ZChildBuilderImpl> {\n      private ZChildBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated NullAnnotatedCheckerFrameworkSuperBuilder.ZChild.ZChildBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated NullAnnotatedCheckerFrameworkSuperBuilder.@org.checkerframework.checker.nullness.qual.NonNull ZChild build() {\n        return new NullAnnotatedCheckerFrameworkSuperBuilder.ZChild(this);\n      }\n    }\n    @lombok.Builder.Default int a;\n    int b;\n    private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated int $default$a() {\n      return 1;\n    }\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated ZChild(final NullAnnotatedCheckerFrameworkSuperBuilder.ZChild.ZChildBuilder<?, ?> b) {\n      super(b);\n      if (b.a$set)\n          this.a = b.a$value;\n      else\n          this.a = NullAnnotatedCheckerFrameworkSuperBuilder.ZChild.$default$a();\n      this.b = b.b;\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated NullAnnotatedCheckerFrameworkSuperBuilder.ZChild. @org.checkerframework.checker.nullness.qual.NonNull ZChildBuilder<?, ?> builder() {\n      return new NullAnnotatedCheckerFrameworkSuperBuilder.ZChild.ZChildBuilderImpl();\n    }\n  }\n  NullAnnotatedCheckerFrameworkSuperBuilder() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/NullLibrary1.java",
    "content": "public @lombok.EqualsAndHashCode @lombok.ToString @lombok.AllArgsConstructor class NullLibrary1 {\n  @lombok.With String foo;\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @org.eclipse.jdt.annotation.NonNull @java.lang.SuppressWarnings(\"all\") @lombok.Generated NullLibrary1 withFoo(final String foo) {\n    return ((this.foo == foo) ? this : new NullLibrary1(foo));\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.@org.eclipse.jdt.annotation.Nullable Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof NullLibrary1)))\n        return false;\n    final NullLibrary1 other = (NullLibrary1) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    final java.lang.Object this$foo = this.foo;\n    final java.lang.Object other$foo = other.foo;\n    if (((this$foo == null) ? (other$foo != null) : (! this$foo.equals(other$foo))))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.@org.eclipse.jdt.annotation.Nullable Object other) {\n    return (other instanceof NullLibrary1);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    final java.lang.Object $foo = this.foo;\n    result = ((result * PRIME) + (($foo == null) ? 43 : $foo.hashCode()));\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.@org.eclipse.jdt.annotation.NonNull String toString() {\n    return ((\"NullLibrary1(foo=\" + this.foo) + \")\");\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated NullLibrary1(final String foo) {\n    super();\n    this.foo = foo;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/NullLibrary2.java",
    "content": "public @lombok.EqualsAndHashCode @lombok.ToString @lombok.AllArgsConstructor class NullLibrary2 {\n  @lombok.With String foo;\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @org.springframework.lang.NonNull @java.lang.SuppressWarnings(\"all\") @lombok.Generated NullLibrary2 withFoo(final String foo) {\n    return ((this.foo == foo) ? this : new NullLibrary2(foo));\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final @org.springframework.lang.Nullable java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof NullLibrary2)))\n        return false;\n    final NullLibrary2 other = (NullLibrary2) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    final java.lang.Object this$foo = this.foo;\n    final java.lang.Object other$foo = other.foo;\n    if (((this$foo == null) ? (other$foo != null) : (! this$foo.equals(other$foo))))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final @org.springframework.lang.Nullable java.lang.Object other) {\n    return (other instanceof NullLibrary2);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    final java.lang.Object $foo = this.foo;\n    result = ((result * PRIME) + (($foo == null) ? 43 : $foo.hashCode()));\n    return result;\n  }\n  public @java.lang.Override @org.springframework.lang.NonNull @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((\"NullLibrary2(foo=\" + this.foo) + \")\");\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated NullLibrary2(final String foo) {\n    super();\n    this.foo = foo;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/NullLibrary3.java",
    "content": "public @lombok.EqualsAndHashCode @lombok.ToString @lombok.AllArgsConstructor class NullLibrary3 {\n  @jakarta.annotation.Nonnull @lombok.With String foo;\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @jakarta.annotation.Nonnull @java.lang.SuppressWarnings(\"all\") @lombok.Generated NullLibrary3 withFoo(final @jakarta.annotation.Nonnull String foo) {\n    if ((foo == null))\n        {\n          throw new java.lang.NullPointerException(\"foo is marked non-null but is null\");\n        }\n    return ((this.foo == foo) ? this : new NullLibrary3(foo));\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final @jakarta.annotation.Nullable java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof NullLibrary3)))\n        return false;\n    final NullLibrary3 other = (NullLibrary3) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    final java.lang.Object this$foo = this.foo;\n    final java.lang.Object other$foo = other.foo;\n    if (((this$foo == null) ? (other$foo != null) : (! this$foo.equals(other$foo))))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final @jakarta.annotation.Nullable java.lang.Object other) {\n    return (other instanceof NullLibrary3);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    final java.lang.Object $foo = this.foo;\n    result = ((result * PRIME) + (($foo == null) ? 43 : $foo.hashCode()));\n    return result;\n  }\n  public @java.lang.Override @jakarta.annotation.Nonnull @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((\"NullLibrary3(foo=\" + this.foo) + \")\");\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated NullLibrary3(final @jakarta.annotation.Nonnull String foo) {\n    super();\n    if ((foo == null))\n        {\n          throw new java.lang.NullPointerException(\"foo is marked non-null but is null\");\n        }\n    this.foo = foo;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/OnXJava7Style.java",
    "content": "public class OnXJava7Style {\n  @interface Foo {\n    String value() default \"\";\n  }\n  @interface Bar {\n    String stuff() default \"\";\n  }\n  @interface Array {\n    String[] value() default {};\n  }\n  @lombok.Getter() String a;\n  @lombok.Setter() String b;\n  @lombok.Setter() String c;\n  @lombok.Setter() String d;\n  @lombok.Getter() String e;\n  @lombok.Getter() String f;\n  @lombok.Getter() String g;\n  @lombok.Getter() String h;\n  @lombok.Getter() String i;\n  public OnXJava7Style() {\n    super();\n  }\n  public @Foo @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getA() {\n    return this.a;\n  }\n  public @Foo() @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setB(final String b) {\n    this.b = b;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setC(final @Foo(\"a\") String c) {\n    this.c = c;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setD(final @Bar(stuff = \"b\") String d) {\n    this.d = d;\n  }\n  public @Foo(value = \"c\") @Bar(stuff = \"d\") @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getE() {\n    return this.e;\n  }\n  public @Array @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getF() {\n    return this.f;\n  }\n  public @Array() @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getG() {\n    return this.g;\n  }\n  public @Array({}) @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getH() {\n    return this.h;\n  }\n  public @Array({\"a\", \"b\"}) @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getI() {\n    return this.i;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/OnXJava7StyleOn8.java",
    "content": "public class OnXJava7StyleOn8 {\n  @interface Foo {\n    String value() default \"\";\n  }\n  @interface Bar {\n    String stuff() default \"\";\n  }\n  @interface Array {\n    String[] value() default {};\n  }\n  @lombok.Getter() String a;\n  @lombok.Setter() String b;\n  @lombok.Setter() String c;\n  @lombok.Setter() String d;\n  @lombok.Getter() String e;\n  @lombok.Getter() String f;\n  @lombok.Getter() String g;\n  @lombok.Getter() String h;\n  @lombok.Getter() String i;\n  public OnXJava7StyleOn8() {\n    super();\n  }\n  public @Foo @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getA() {\n    return this.a;\n  }\n  public @Foo() @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setB(final String b) {\n    this.b = b;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setC(final @Foo(\"a\") String c) {\n    this.c = c;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setD(final @Bar(stuff = \"b\") String d) {\n    this.d = d;\n  }\n  public @Foo(value = \"c\") @Bar(stuff = \"d\") @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getE() {\n    return this.e;\n  }\n  public @Array @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getF() {\n    return this.f;\n  }\n  public @Array() @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getG() {\n    return this.g;\n  }\n  public @Array({}) @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getH() {\n    return this.h;\n  }\n  public @Array({\"a\", \"b\"}) @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getI() {\n    return this.i;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/OnXJava8Style.java",
    "content": "public class OnXJava8Style {\n  @interface Foo {\n    String value() default \"\";\n  }\n  @interface Bar {\n    String stuff() default \"\";\n  }\n  @interface Array {\n    String[] value() default {};\n  }\n  @lombok.Getter() String a;\n  @lombok.Setter() String b;\n  @lombok.Setter() String c;\n  @lombok.Setter() String d;\n  @lombok.Getter() String e;\n  @lombok.Getter() String f;\n  @lombok.Getter() String g;\n  @lombok.Getter() String h;\n  @lombok.Getter() String i;\n  public OnXJava8Style() {\n    super();\n  }\n  public @Foo @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getA() {\n    return this.a;\n  }\n  public @Foo() @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setB(final String b) {\n    this.b = b;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setC(final @Foo(\"a\") String c) {\n    this.c = c;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setD(final @Bar(stuff = \"b\") String d) {\n    this.d = d;\n  }\n  public @Foo(value = \"c\") @Bar(stuff = \"d\") @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getE() {\n    return this.e;\n  }\n  public @Array @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getF() {\n    return this.f;\n  }\n  public @Array() @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getG() {\n    return this.g;\n  }\n  public @Array({}) @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getH() {\n    return this.h;\n  }\n  public @Array({\"a\", \"b\"}) @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getI() {\n    return this.i;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/OnXJava8StyleOn7.java",
    "content": "public class OnXJava8StyleOn7 {\n  @interface Foo {\n    String value() default \"\";\n  }\n  @interface Bar {\n    String stuff() default \"\";\n  }\n  @interface Array {\n    String[] value() default {};\n  }\n  @lombok.Getter() String a;\n  @lombok.Setter() String b;\n  @lombok.Setter() String c;\n  @lombok.Setter() String d;\n  @lombok.Getter() String e;\n  @lombok.Getter() String f;\n  @lombok.Getter() String g;\n  @lombok.Getter() String h;\n  @lombok.Getter() String i;\n  public OnXJava8StyleOn7() {\n    super();\n  }\n  public @Foo @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getA() {\n    return this.a;\n  }\n  public @Foo() @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setB(final String b) {\n    this.b = b;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setC(final @Foo(\"a\") String c) {\n    this.c = c;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setD(final @Bar(stuff = \"b\") String d) {\n    this.d = d;\n  }\n  public @Foo(value = \"c\") @Bar(stuff = \"d\") @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getE() {\n    return this.e;\n  }\n  public @Array @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getF() {\n    return this.f;\n  }\n  public @Array() @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getG() {\n    return this.g;\n  }\n  public @Array({}) @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getH() {\n    return this.h;\n  }\n  public @Array({\"a\", \"b\"}) @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getI() {\n    return this.i;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/PrivateNoArgsConstructor.java",
    "content": "public class PrivateNoArgsConstructor {\n  private static class Base {\n    private Base() {\n      super();\n    }\n  }\n  public static @lombok.Data class PrivateNoArgsConstructorNotOnExtends extends Base {\n    private final int a;\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getA() {\n      return this.a;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n      if ((o == this))\n          return true;\n      if ((! (o instanceof PrivateNoArgsConstructor.PrivateNoArgsConstructorNotOnExtends)))\n          return false;\n      final PrivateNoArgsConstructor.PrivateNoArgsConstructorNotOnExtends other = (PrivateNoArgsConstructor.PrivateNoArgsConstructorNotOnExtends) o;\n      if ((! other.canEqual((java.lang.Object) this)))\n          return false;\n      if ((! super.equals(o)))\n          return false;\n      if ((this.getA() != other.getA()))\n          return false;\n      return true;\n    }\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n      return (other instanceof PrivateNoArgsConstructor.PrivateNoArgsConstructorNotOnExtends);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n      final int PRIME = 59;\n      int result = super.hashCode();\n      result = ((result * PRIME) + this.getA());\n      return result;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"PrivateNoArgsConstructor.PrivateNoArgsConstructorNotOnExtends(a=\" + this.getA()) + \")\");\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated PrivateNoArgsConstructorNotOnExtends(final int a) {\n      super();\n      this.a = a;\n    }\n  }\n  public static @lombok.Data class PrivateNoArgsConstructorOnExtendsObject extends Object {\n    private final int b;\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getB() {\n      return this.b;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n      if ((o == this))\n          return true;\n      if ((! (o instanceof PrivateNoArgsConstructor.PrivateNoArgsConstructorOnExtendsObject)))\n          return false;\n      final PrivateNoArgsConstructor.PrivateNoArgsConstructorOnExtendsObject other = (PrivateNoArgsConstructor.PrivateNoArgsConstructorOnExtendsObject) o;\n      if ((! other.canEqual((java.lang.Object) this)))\n          return false;\n      if ((this.getB() != other.getB()))\n          return false;\n      return true;\n    }\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n      return (other instanceof PrivateNoArgsConstructor.PrivateNoArgsConstructorOnExtendsObject);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n      final int PRIME = 59;\n      int result = 1;\n      result = ((result * PRIME) + this.getB());\n      return result;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"PrivateNoArgsConstructor.PrivateNoArgsConstructorOnExtendsObject(b=\" + this.getB()) + \")\");\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated PrivateNoArgsConstructorOnExtendsObject(final int b) {\n      super();\n      this.b = b;\n    }\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated PrivateNoArgsConstructorOnExtendsObject() {\n      super();\n      this.b = 0;\n    }\n  }\n  public static @lombok.NoArgsConstructor(force = true) @lombok.Data @lombok.RequiredArgsConstructor class PrivateNoArgsConstructorExplicitBefore {\n    private final int c;\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated PrivateNoArgsConstructorExplicitBefore() {\n      super();\n      this.c = 0;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getC() {\n      return this.c;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n      if ((o == this))\n          return true;\n      if ((! (o instanceof PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitBefore)))\n          return false;\n      final PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitBefore other = (PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitBefore) o;\n      if ((! other.canEqual((java.lang.Object) this)))\n          return false;\n      if ((this.getC() != other.getC()))\n          return false;\n      return true;\n    }\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n      return (other instanceof PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitBefore);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n      final int PRIME = 59;\n      int result = 1;\n      result = ((result * PRIME) + this.getC());\n      return result;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitBefore(c=\" + this.getC()) + \")\");\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated PrivateNoArgsConstructorExplicitBefore(final int c) {\n      super();\n      this.c = c;\n    }\n  }\n  public static @lombok.Data @lombok.NoArgsConstructor(force = true) @lombok.RequiredArgsConstructor class PrivateNoArgsConstructorExplicitAfter {\n    private final int d;\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getD() {\n      return this.d;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n      if ((o == this))\n          return true;\n      if ((! (o instanceof PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitAfter)))\n          return false;\n      final PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitAfter other = (PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitAfter) o;\n      if ((! other.canEqual((java.lang.Object) this)))\n          return false;\n      if ((this.getD() != other.getD()))\n          return false;\n      return true;\n    }\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n      return (other instanceof PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitAfter);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n      final int PRIME = 59;\n      int result = 1;\n      result = ((result * PRIME) + this.getD());\n      return result;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitAfter(d=\" + this.getD()) + \")\");\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated PrivateNoArgsConstructorExplicitAfter() {\n      super();\n      this.d = 0;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated PrivateNoArgsConstructorExplicitAfter(final int d) {\n      super();\n      this.d = d;\n    }\n  }\n  public static @lombok.Data @lombok.NoArgsConstructor(access = lombok.AccessLevel.NONE) @lombok.RequiredArgsConstructor class PrivateNoArgsConstructorExplicitNone {\n    private final int e;\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getE() {\n      return this.e;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n      if ((o == this))\n          return true;\n      if ((! (o instanceof PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitNone)))\n          return false;\n      final PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitNone other = (PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitNone) o;\n      if ((! other.canEqual((java.lang.Object) this)))\n          return false;\n      if ((this.getE() != other.getE()))\n          return false;\n      return true;\n    }\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n      return (other instanceof PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitNone);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n      final int PRIME = 59;\n      int result = 1;\n      result = ((result * PRIME) + this.getE());\n      return result;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"PrivateNoArgsConstructor.PrivateNoArgsConstructorExplicitNone(e=\" + this.getE()) + \")\");\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated PrivateNoArgsConstructorExplicitNone(final int e) {\n      super();\n      this.e = e;\n    }\n  }\n  public static @lombok.Data class PrivateNoArgsConstructorNoFields {\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n      if ((o == this))\n          return true;\n      if ((! (o instanceof PrivateNoArgsConstructor.PrivateNoArgsConstructorNoFields)))\n          return false;\n      final PrivateNoArgsConstructor.PrivateNoArgsConstructorNoFields other = (PrivateNoArgsConstructor.PrivateNoArgsConstructorNoFields) o;\n      if ((! other.canEqual((java.lang.Object) this)))\n          return false;\n      return true;\n    }\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n      return (other instanceof PrivateNoArgsConstructor.PrivateNoArgsConstructorNoFields);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n      final int result = 1;\n      return result;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return \"PrivateNoArgsConstructor.PrivateNoArgsConstructorNoFields()\";\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated PrivateNoArgsConstructorNoFields() {\n      super();\n    }\n  }\n  public PrivateNoArgsConstructor() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SetterAccessLevel.java",
    "content": "class SetterAccessLevel {\n  @lombok.Setter(lombok.AccessLevel.NONE) boolean isNone;\n  @lombok.Setter(lombok.AccessLevel.PRIVATE) boolean isPrivate;\n  @lombok.Setter(lombok.AccessLevel.PACKAGE) boolean isPackage;\n  @lombok.Setter(lombok.AccessLevel.PROTECTED) boolean isProtected;\n  @lombok.Setter(lombok.AccessLevel.PUBLIC) boolean isPublic;\n  @lombok.Setter(value = lombok.AccessLevel.PUBLIC) boolean value;\n  SetterAccessLevel() {\n    super();\n  }\n  private @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setPrivate(final boolean isPrivate) {\n    this.isPrivate = isPrivate;\n  }\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setPackage(final boolean isPackage) {\n    this.isPackage = isPackage;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setProtected(final boolean isProtected) {\n    this.isProtected = isProtected;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setPublic(final boolean isPublic) {\n    this.isPublic = isPublic;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setValue(final boolean value) {\n    this.value = value;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SetterAlreadyExists.java",
    "content": "class Setter1 {\n  @lombok.Setter boolean foo;\n  Setter1() {\n    super();\n  }\n  void setFoo(boolean foo) {\n  }\n}\nclass Setter2 {\n  @lombok.Setter boolean foo;\n  Setter2() {\n    super();\n  }\n  void setFoo(String foo) {\n  }\n}\nclass Setter3 {\n  @lombok.Setter String foo;\n  Setter3() {\n    super();\n  }\n  void setFoo(boolean foo) {\n  }\n}\nclass Setter4 {\n  @lombok.Setter String foo;\n  Setter4() {\n    super();\n  }\n  void setFoo(String foo) {\n  }\n}\nclass Setter5 {\n  @lombok.Setter String foo;\n  Setter5() {\n    super();\n  }\n  void setFoo() {\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setFoo(final String foo) {\n    this.foo = foo;\n  }\n}\nclass Setter6 {\n  @lombok.Setter String foo;\n  Setter6() {\n    super();\n  }\n  void setFoo(String foo, int x) {\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setFoo(final String foo) {\n    this.foo = foo;\n  }\n}\nclass Setter7 {\n  @lombok.Setter String foo;\n  Setter7() {\n    super();\n  }\n  void setFoo(String foo, Object... x) {\n  }\n}\nclass Setter8 {\n  @lombok.Setter boolean isFoo;\n  Setter8() {\n    super();\n  }\n  void setIsFoo(boolean foo) {\n  }\n}\nclass Setter9 {\n  @lombok.Setter boolean isFoo;\n  Setter9() {\n    super();\n  }\n  void setFoo(boolean foo) {\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SetterAndWithMethodJavadoc.java",
    "content": "import lombok.With;\nclass SetterAndWithMethodJavadoc {\n  @lombok.Setter @lombok.With int i;\n  @lombok.Setter @lombok.With int j;\n  SetterAndWithMethodJavadoc(int i, int j) {\n    super();\n    this.i = i;\n    this.j = j;\n  }\n  /**\n   * Some value.\n   * @param the new value\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setI(final int i) {\n    this.i = i;\n  }\n  /**\n   * Some value.\n   * @param the new value\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated SetterAndWithMethodJavadoc withI(final int i) {\n    return ((this.i == i) ? this : new SetterAndWithMethodJavadoc(i, this.j));\n  }\n  /**\n   * Set some other value.\n   * @param the new other value\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setJ(final int j) {\n    this.j = j;\n  }\n  /**\n   * Reinstantiate with some other value.\n   * @param the other new other value\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated SetterAndWithMethodJavadoc withJ(final int j) {\n    return ((this.j == j) ? this : new SetterAndWithMethodJavadoc(this.i, j));\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SetterDeprecated.java",
    "content": "import lombok.Setter;\nclass SetterDeprecated {\n  @Deprecated @Setter int annotation;\n  @Setter int javadoc;\n  SetterDeprecated() {\n    super();\n  }\n  public @java.lang.Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setAnnotation(final int annotation) {\n    this.annotation = annotation;\n  }\n  /**\n   * @deprecated\n   */\n  public @java.lang.Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setJavadoc(final int javadoc) {\n    this.javadoc = javadoc;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SetterInAnonymousClass.java",
    "content": "import lombok.Setter;\npublic class SetterInAnonymousClass {\n  Object annonymous = new Object() {\n    @Setter class Inner {\n      private String string;\n      Inner() {\n        super();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setString(final String string) {\n        this.string = string;\n      }\n    }\n    x() {\n      super();\n    }\n  };\n  public SetterInAnonymousClass() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SetterOnClass.java",
    "content": "@lombok.Setter class SetterOnClass1 {\n  @lombok.Setter(lombok.AccessLevel.NONE) boolean isNone;\n  boolean isPublic;\n  SetterOnClass1() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setPublic(final boolean isPublic) {\n    this.isPublic = isPublic;\n  }\n}\n@lombok.Setter(lombok.AccessLevel.PROTECTED) class SetterOnClass2 {\n  @lombok.Setter(lombok.AccessLevel.NONE) boolean isNone;\n  boolean isProtected;\n  @lombok.Setter(lombok.AccessLevel.PACKAGE) boolean isPackage;\n  SetterOnClass2() {\n    super();\n  }\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setPackage(final boolean isPackage) {\n    this.isPackage = isPackage;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setProtected(final boolean isProtected) {\n    this.isProtected = isProtected;\n  }\n}\n@lombok.Setter(lombok.AccessLevel.PACKAGE) class SetterOnClass3 {\n  @lombok.Setter(lombok.AccessLevel.NONE) boolean isNone;\n  boolean isPackage;\n  SetterOnClass3() {\n    super();\n  }\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setPackage(final boolean isPackage) {\n    this.isPackage = isPackage;\n  }\n}\n@lombok.Setter(lombok.AccessLevel.PRIVATE) class SetterOnClass4 {\n  @lombok.Setter(lombok.AccessLevel.NONE) boolean isNone;\n  boolean isPrivate;\n  SetterOnClass4() {\n    super();\n  }\n  private @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setPrivate(final boolean isPrivate) {\n    this.isPrivate = isPrivate;\n  }\n}\n@lombok.Setter(lombok.AccessLevel.PUBLIC) class SetterOnClass5 {\n  @lombok.Setter(lombok.AccessLevel.NONE) boolean isNone;\n  boolean isPublic;\n  SetterOnClass5() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setPublic(final boolean isPublic) {\n    this.isPublic = isPublic;\n  }\n}\n@lombok.Setter class SetterOnClass6 {\n  String couldBeNull;\n  @lombok.NonNull String nonNull;\n  SetterOnClass6() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setCouldBeNull(final String couldBeNull) {\n    this.couldBeNull = couldBeNull;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setNonNull(final @lombok.NonNull String nonNull) {\n    if ((nonNull == null))\n        {\n          throw new java.lang.NullPointerException(\"nonNull is marked non-null but is null\");\n        }\n    this.nonNull = nonNull;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SetterOnMethod.java",
    "content": "import lombok.Setter;\nclass SetterOnMethod {\n  @lombok.Setter() int i;\n  @lombok.Setter() int j;\n  public @Deprecated @java.lang.SuppressWarnings(\"all\") void setI(final int i) {\n    this.i = i;\n  }\n  public @java.lang.Deprecated @java.lang.SuppressWarnings(\"all\") void setJ(final int j) {\n    this.j = j;\n  }\n  SetterOnMethod() {\n    super();\n  }\n}\n@lombok.Setter() class SetterOnClassOnMethod {\n  int i;\n  int j;\n  public @java.lang.SuppressWarnings(\"all\") void setI(final int i) {\n    this.i = i;\n  }\n  public @java.lang.SuppressWarnings(\"all\") void setJ(final int j) {\n    this.j = j;\n  }\n  SetterOnClassOnMethod() {\n    super();\n  }\n}\n@lombok.Setter() class SetterOnClassAndOnAField {\n  int i;\n  @lombok.Setter() int j;\n  public @java.lang.Deprecated @java.lang.SuppressWarnings(\"all\") void setJ(final int j) {\n    this.j = j;\n  }\n  public @java.lang.SuppressWarnings(\"all\") void setI(final int i) {\n    this.i = i;\n  }\n  SetterOnClassAndOnAField() {\n    super();\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/SetterOnMethodOnParam.java",
    "content": "class SetterOnMethodOnParam {\n  public @interface Test {\n  }\n  @lombok.Setter() int i;\n  @lombok.Setter() int j;\n  @lombok.Setter() int k;\n  SetterOnMethodOnParam() {\n    super();\n  }\n  public @Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setI(final int i) {\n    this.i = i;\n  }\n  public @java.lang.Deprecated @Test @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setJ(final @Test int j) {\n    this.j = j;\n  }\n  public @java.lang.Deprecated @Test @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setK(final @Test int k) {\n    this.k = k;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SetterOnParam.java",
    "content": "import lombok.Setter;\nclass SetterOnParam {\n  @lombok.Setter() int i;\n  @lombok.Setter() int j;\n  public @java.lang.SuppressWarnings(\"all\") void setI(final @SuppressWarnings(\"all\") int i) {\n    this.i = i;\n  }\n  public @java.lang.SuppressWarnings(\"all\") void setJ(final @java.lang.SuppressWarnings(\"all\") int j) {\n    this.j = j;\n  }\n  SetterOnParam() {\n    super();\n  }\n}\n@lombok.Setter() class SetterOnClassOnParam {\n  int i;\n  int j;\n  public @java.lang.SuppressWarnings(\"all\") void setI(final int i) {\n    this.i = i;\n  }\n  public @java.lang.SuppressWarnings(\"all\") void setJ(final int j) {\n    this.j = j;\n  }\n  SetterOnClassOnParam() {\n    super();\n  }\n}\n@lombok.Setter() class SetterOnClassAndOnAFieldParam {\n  int i;\n  @lombok.Setter() int j;\n  public @java.lang.SuppressWarnings(\"all\") void setJ(final @java.lang.SuppressWarnings(\"all\") int j) {\n    this.j = j;\n  }\n  public @java.lang.SuppressWarnings(\"all\") void setI(final int i) {\n    this.i = i;\n  }\n  SetterOnClassAndOnAFieldParam() {\n    super();\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/SetterOnParamAndOnMethod.java",
    "content": "class SetterOnParamAndOnMethod {\n  @lombok.Setter() int i;\n  public @Deprecated @java.lang.SuppressWarnings(\"all\") void setI(final @SuppressWarnings(\"all\") int i) {\n    this.i = i;\n  }\n  SetterOnParamAndOnMethod() {\n    super();\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/SetterOnRecord.java",
    "content": "// version 14:\nimport lombok.Setter;\npublic @Setter record SetterOnRecord(String a, String b) {\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SetterOnStatic.java",
    "content": "class Setter {\n  static @lombok.Setter boolean foo;\n  static @lombok.Setter int bar;\n  <clinit>() {\n  }\n  Setter() {\n    super();\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setFoo(final boolean foo) {\n    Setter.foo = foo;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setBar(final int bar) {\n    Setter.bar = bar;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SetterPlain.java",
    "content": "import lombok.Setter;\nclass SetterPlain {\n  @lombok.Setter int i;\n  @Setter int foo;\n  SetterPlain() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setI(final int i) {\n    this.i = i;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setFoo(final int foo) {\n    this.foo = foo;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SetterTypeAnnos.java",
    "content": "import lombok.Setter;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.List;\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER}) @interface TA {\n}\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER}) @interface TB {\n}\nclass SetterTypeAnnos {\n  @Setter @TA @TB List<String> foo;\n  SetterTypeAnnos() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setFoo(final @TA List<String> foo) {\n    this.foo = foo;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SetterWithDollar.java",
    "content": "class SetterWithDollar1 {\n  @lombok.Setter int $i;\n  SetterWithDollar1() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void set$i(final int $i) {\n    this.$i = $i;\n  }\n}\nclass SetterWithDollar2 {\n  @lombok.Setter int $i;\n  @lombok.Setter int i;\n  SetterWithDollar2() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void set$i(final int $i) {\n    this.$i = $i;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setI(final int i) {\n    this.i = i;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SetterWithJavaBeansSpecCapitalization.java",
    "content": "class SetterWithJavaBeansSpecCapitalization {\n  @lombok.Setter int a;\n  @lombok.Setter int aField;\n  SetterWithJavaBeansSpecCapitalization() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setA(final int a) {\n    this.a = a;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setaField(final int aField) {\n    this.aField = aField;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SimpleTypeResolution.java",
    "content": "class SimpleTypeResolutionFail {\n  private @Getter int x;\n  SimpleTypeResolutionFail() {\n    super();\n  }\n}\nclass SimpleTypeResolutionSuccess {\n  private @lombok.Getter int x;\n  SimpleTypeResolutionSuccess() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getX() {\n    return this.x;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SingularCleanupForDelombok.java",
    "content": "// ignore: This tests specifically that delombok removes something; it does not apply to ecj\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SkipSuppressWarnings.java",
    "content": "class SkipSuppressWarnings {\n  private @lombok.Getter String field = \"\";\n  private final @lombok.Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> field2 = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();\n  SkipSuppressWarnings() {\n    super();\n  }\n  public @lombok.Generated String getField() {\n    return this.field;\n  }\n  public @java.lang.SuppressWarnings({\"unchecked\"}) @lombok.Generated String getField2() {\n    java.lang.Object $value = this.field2.get();\n    if (($value == null))\n        {\n          synchronized (this.field2)\n            {\n              $value = this.field2.get();\n              if (($value == null))\n                  {\n                    final String actualValue = \"\";\n                    $value = ((actualValue == null) ? this.field2 : actualValue);\n                    this.field2.set($value);\n                  }\n            }\n        }\n    return (String) (($value == this.field2) ? null : $value);\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SneakyThrowsInInitializer.java",
    "content": "import lombok.SneakyThrows;\npublic class SneakyThrowsInInitializer {\n  public static final Runnable R = new Runnable() {\n    public @Override @SneakyThrows void run() {\n      try\n        {\n          System.out.println(\"test\");\n        }\n      catch (final java.lang.Throwable $ex)\n        {\n          throw lombok.Lombok.sneakyThrow($ex);\n        }\n    }\n  };\n  <clinit>() {\n  }\n  public SneakyThrowsInInitializer() {\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SneakyThrowsMultiple.java",
    "content": "import java.awt.AWTException;\nimport java.io.IOException;\nimport java.util.Random;\nclass SneakyThrowsMultiple {\n  SneakyThrowsMultiple() {\n    super();\n  }\n  public @lombok.SneakyThrows({IOException.class, Throwable.class}) void test() {\n    try \n      {\n        try \n          {\n            System.out.println(\"test1\");\n            throw new IOException();\n          }\n        catch (final IOException $ex)\n          {\n            throw lombok.Lombok.sneakyThrow($ex);\n          }\n      }\n    catch (final Throwable $ex)\n      {\n        throw lombok.Lombok.sneakyThrow($ex);\n      }\n  }\n  public @lombok.SneakyThrows({AWTException.class, IOException.class}) void test2() {\n    try \n      {\n        try \n          {\n            System.out.println(\"test2\");\n            if (new Random().nextBoolean())\n                {\n                  throw new IOException();\n                }\n            else\n                {\n                  throw new AWTException(\"WHAT\");\n                }\n          }\n        catch (final AWTException $ex)\n          {\n            throw lombok.Lombok.sneakyThrow($ex);\n          }\n      }\n    catch (final IOException $ex)\n      {\n        throw lombok.Lombok.sneakyThrow($ex);\n      }\n  }\n  public @lombok.SneakyThrows(value = {IOException.class, Throwable.class}) void test3() {\n    try \n      {\n        try \n          {\n            System.out.println(\"test3\");\n            throw new IOException();\n          }\n        catch (final IOException $ex)\n          {\n            throw lombok.Lombok.sneakyThrow($ex);\n          }\n      }\n    catch (final Throwable $ex)\n      {\n        throw lombok.Lombok.sneakyThrow($ex);\n      }\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/SneakyThrowsPlain.java",
    "content": "import lombok.SneakyThrows;\nclass SneakyThrowsPlain {\n  @lombok.SneakyThrows SneakyThrowsPlain() {\n    super();\n    try \n      {\n        System.out.println(\"constructor\");\n      }\n    catch (final java.lang.Throwable $ex)\n      {\n        throw lombok.Lombok.sneakyThrow($ex);\n      }\n  }\n  @lombok.SneakyThrows SneakyThrowsPlain(int x) {\n    this();\n    try \n      {\n        System.out.println(\"constructor2\");\n      }\n    catch (final java.lang.Throwable $ex)\n      {\n        throw lombok.Lombok.sneakyThrow($ex);\n      }\n  }\n  public @lombok.SneakyThrows void test() {\n    try \n      {\n        System.out.println(\"test1\");\n      }\n    catch (final java.lang.Throwable $ex)\n      {\n        throw lombok.Lombok.sneakyThrow($ex);\n      }\n  }\n  public @SneakyThrows void test2() {\n    try \n      {\n        System.out.println(\"test2\");\n      }\n    catch (final java.lang.Throwable $ex)\n      {\n        throw lombok.Lombok.sneakyThrow($ex);\n      }\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SneakyThrowsSingle.java",
    "content": "import java.io.IOException;\nclass SneakyThrowsSingle {\n  SneakyThrowsSingle() {\n    super();\n  }\n  public @lombok.SneakyThrows(Throwable.class) void test() {\n    try \n      {\n        System.out.println(\"test1\");\n      }\n    catch (final Throwable $ex)\n      {\n        throw lombok.Lombok.sneakyThrow($ex);\n      }\n  }\n  public @lombok.SneakyThrows(IOException.class) void test2() {\n    try \n      {\n        System.out.println(\"test2\");\n        throw new IOException();\n      }\n    catch (final IOException $ex)\n      {\n        throw lombok.Lombok.sneakyThrow($ex);\n      }\n  }\n  public @lombok.SneakyThrows(value = IOException.class) void test3() {\n    try \n      {\n        System.out.println(\"test3\");\n        throw new IOException();\n      }\n    catch (final IOException $ex)\n      {\n        throw lombok.Lombok.sneakyThrow($ex);\n      }\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/StandardExceptionWithConstructor.java",
    "content": "import lombok.experimental.StandardException;\npublic @StandardException class StandardExceptionWithConstructor extends Exception {\n  public StandardExceptionWithConstructor(Integer x, Integer y) {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated StandardExceptionWithConstructor() {\n    this((java.lang.String) null, (java.lang.Throwable) null);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated StandardExceptionWithConstructor(final java.lang.String message) {\n    this(message, (java.lang.Throwable) null);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated StandardExceptionWithConstructor(final java.lang.Throwable cause) {\n    this(((cause != null) ? cause.getMessage() : null), cause);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated StandardExceptionWithConstructor(final java.lang.String message, final java.lang.Throwable cause) {\n    super(message);\n    if ((cause != null))\n        super.initCause(cause);\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/StandardExceptions.java",
    "content": "import lombok.AccessLevel;\nimport lombok.experimental.StandardException;\n@StandardException class EmptyException extends Exception {\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated EmptyException() {\n    this((java.lang.String) null, (java.lang.Throwable) null);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated EmptyException(final java.lang.String message) {\n    this(message, (java.lang.Throwable) null);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated EmptyException(final java.lang.Throwable cause) {\n    this(((cause != null) ? cause.getMessage() : null), cause);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated EmptyException(final java.lang.String message, final java.lang.Throwable cause) {\n    super(message);\n    if ((cause != null))\n        super.initCause(cause);\n  }\n}\n@StandardException(access = AccessLevel.PROTECTED) class NoArgsException extends Exception {\n  public NoArgsException() {\n    super();\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated NoArgsException(final java.lang.String message) {\n    this(message, (java.lang.Throwable) null);\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated NoArgsException(final java.lang.Throwable cause) {\n    this(((cause != null) ? cause.getMessage() : null), cause);\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated NoArgsException(final java.lang.String message, final java.lang.Throwable cause) {\n    super(message);\n    if ((cause != null))\n        super.initCause(cause);\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/StaticConstructor.java",
    "content": "import lombok.AllArgsConstructor;\npublic @AllArgsConstructor(staticName = \"of\") class StaticConstructor {\n  String name;\n  private @java.lang.SuppressWarnings(\"all\") @lombok.Generated StaticConstructor(final String name) {\n    super();\n    this.name = name;\n  }\n  public static @org.checkerframework.checker.nullness.qual.NonNull @java.lang.SuppressWarnings(\"all\") @lombok.Generated StaticConstructor of(final String name) {\n    return new StaticConstructor(name);\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderAbstract.java",
    "content": "public class SuperBuilderAbstract {\n  public static @lombok.experimental.SuperBuilder class Parent {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilder<C extends SuperBuilderAbstract.Parent, B extends SuperBuilderAbstract.Parent.ParentBuilder<C, B>> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int parentField;\n      public ParentBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B parentField(final int parentField) {\n        this.parentField = parentField;\n        return self();\n      }\n      protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((\"SuperBuilderAbstract.Parent.ParentBuilder(parentField=\" + this.parentField) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilderImpl extends SuperBuilderAbstract.Parent.ParentBuilder<SuperBuilderAbstract.Parent, SuperBuilderAbstract.Parent.ParentBuilderImpl> {\n      private ParentBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderAbstract.Parent.ParentBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderAbstract.Parent build() {\n        return new SuperBuilderAbstract.Parent(this);\n      }\n    }\n    int parentField;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Parent(final SuperBuilderAbstract.Parent.ParentBuilder<?, ?> b) {\n      super();\n      this.parentField = b.parentField;\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderAbstract.Parent.ParentBuilder<?, ?> builder() {\n      return new SuperBuilderAbstract.Parent.ParentBuilderImpl();\n    }\n  }\n  public static abstract @lombok.experimental.SuperBuilder class Child extends Parent {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilder<C extends SuperBuilderAbstract.Child, B extends SuperBuilderAbstract.Child.ChildBuilder<C, B>> extends Parent.ParentBuilder<C, B> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated double childField;\n      public ChildBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B childField(final double childField) {\n        this.childField = childField;\n        return self();\n      }\n      protected abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((\"SuperBuilderAbstract.Child.ChildBuilder(super=\" + super.toString()) + \", childField=\") + this.childField) + \")\");\n      }\n    }\n    double childField;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Child(final SuperBuilderAbstract.Child.ChildBuilder<?, ?> b) {\n      super(b);\n      this.childField = b.childField;\n    }\n  }\n  public static @lombok.experimental.SuperBuilder class GrandChild extends Child {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class GrandChildBuilder<C extends SuperBuilderAbstract.GrandChild, B extends SuperBuilderAbstract.GrandChild.GrandChildBuilder<C, B>> extends Child.ChildBuilder<C, B> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String grandChildField;\n      public GrandChildBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B grandChildField(final String grandChildField) {\n        this.grandChildField = grandChildField;\n        return self();\n      }\n      protected abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((\"SuperBuilderAbstract.GrandChild.GrandChildBuilder(super=\" + super.toString()) + \", grandChildField=\") + this.grandChildField) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class GrandChildBuilderImpl extends SuperBuilderAbstract.GrandChild.GrandChildBuilder<SuperBuilderAbstract.GrandChild, SuperBuilderAbstract.GrandChild.GrandChildBuilderImpl> {\n      private GrandChildBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderAbstract.GrandChild.GrandChildBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderAbstract.GrandChild build() {\n        return new SuperBuilderAbstract.GrandChild(this);\n      }\n    }\n    String grandChildField;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated GrandChild(final SuperBuilderAbstract.GrandChild.GrandChildBuilder<?, ?> b) {\n      super(b);\n      this.grandChildField = b.grandChildField;\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderAbstract.GrandChild.GrandChildBuilder<?, ?> builder() {\n      return new SuperBuilderAbstract.GrandChild.GrandChildBuilderImpl();\n    }\n  }\n  public SuperBuilderAbstract() {\n    super();\n  }\n  public static void test() {\n    GrandChild x = GrandChild.builder().grandChildField(\"\").parentField(5).childField(2.5).build();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderAbstractToBuilder.java",
    "content": "public class SuperBuilderAbstractToBuilder {\n  public static @lombok.experimental.SuperBuilder(toBuilder = true) class Parent {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilder<C extends SuperBuilderAbstractToBuilder.Parent, B extends SuperBuilderAbstractToBuilder.Parent.ParentBuilder<C, B>> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int parentField;\n      public ParentBuilder() {\n        super();\n      }\n      protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated B $fillValuesFrom(final C instance) {\n        SuperBuilderAbstractToBuilder.Parent.ParentBuilder.$fillValuesFromInstanceIntoBuilder(instance, this);\n        return self();\n      }\n      private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated void $fillValuesFromInstanceIntoBuilder(final SuperBuilderAbstractToBuilder.Parent instance, final SuperBuilderAbstractToBuilder.Parent.ParentBuilder<?, ?> b) {\n        b.parentField(instance.parentField);\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B parentField(final int parentField) {\n        this.parentField = parentField;\n        return self();\n      }\n      protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((\"SuperBuilderAbstractToBuilder.Parent.ParentBuilder(parentField=\" + this.parentField) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilderImpl extends SuperBuilderAbstractToBuilder.Parent.ParentBuilder<SuperBuilderAbstractToBuilder.Parent, SuperBuilderAbstractToBuilder.Parent.ParentBuilderImpl> {\n      private ParentBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderAbstractToBuilder.Parent.ParentBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderAbstractToBuilder.Parent build() {\n        return new SuperBuilderAbstractToBuilder.Parent(this);\n      }\n    }\n    int parentField;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Parent(final SuperBuilderAbstractToBuilder.Parent.ParentBuilder<?, ?> b) {\n      super();\n      this.parentField = b.parentField;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderAbstractToBuilder.Parent.ParentBuilder<?, ?> toBuilder() {\n      return new SuperBuilderAbstractToBuilder.Parent.ParentBuilderImpl().$fillValuesFrom(this);\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderAbstractToBuilder.Parent.ParentBuilder<?, ?> builder() {\n      return new SuperBuilderAbstractToBuilder.Parent.ParentBuilderImpl();\n    }\n  }\n  public static abstract @lombok.experimental.SuperBuilder(toBuilder = true) class Child extends Parent {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilder<C extends SuperBuilderAbstractToBuilder.Child, B extends SuperBuilderAbstractToBuilder.Child.ChildBuilder<C, B>> extends Parent.ParentBuilder<C, B> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated double childField;\n      public ChildBuilder() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B $fillValuesFrom(final C instance) {\n        super.$fillValuesFrom(instance);\n        SuperBuilderAbstractToBuilder.Child.ChildBuilder.$fillValuesFromInstanceIntoBuilder(instance, this);\n        return self();\n      }\n      private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated void $fillValuesFromInstanceIntoBuilder(final SuperBuilderAbstractToBuilder.Child instance, final SuperBuilderAbstractToBuilder.Child.ChildBuilder<?, ?> b) {\n        b.childField(instance.childField);\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B childField(final double childField) {\n        this.childField = childField;\n        return self();\n      }\n      protected abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((\"SuperBuilderAbstractToBuilder.Child.ChildBuilder(super=\" + super.toString()) + \", childField=\") + this.childField) + \")\");\n      }\n    }\n    double childField;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Child(final SuperBuilderAbstractToBuilder.Child.ChildBuilder<?, ?> b) {\n      super(b);\n      this.childField = b.childField;\n    }\n  }\n  public static @lombok.experimental.SuperBuilder(toBuilder = true) class GrandChild extends Child {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class GrandChildBuilder<C extends SuperBuilderAbstractToBuilder.GrandChild, B extends SuperBuilderAbstractToBuilder.GrandChild.GrandChildBuilder<C, B>> extends Child.ChildBuilder<C, B> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String grandChildField;\n      public GrandChildBuilder() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B $fillValuesFrom(final C instance) {\n        super.$fillValuesFrom(instance);\n        SuperBuilderAbstractToBuilder.GrandChild.GrandChildBuilder.$fillValuesFromInstanceIntoBuilder(instance, this);\n        return self();\n      }\n      private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated void $fillValuesFromInstanceIntoBuilder(final SuperBuilderAbstractToBuilder.GrandChild instance, final SuperBuilderAbstractToBuilder.GrandChild.GrandChildBuilder<?, ?> b) {\n        b.grandChildField(instance.grandChildField);\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B grandChildField(final String grandChildField) {\n        this.grandChildField = grandChildField;\n        return self();\n      }\n      protected abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((\"SuperBuilderAbstractToBuilder.GrandChild.GrandChildBuilder(super=\" + super.toString()) + \", grandChildField=\") + this.grandChildField) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class GrandChildBuilderImpl extends SuperBuilderAbstractToBuilder.GrandChild.GrandChildBuilder<SuperBuilderAbstractToBuilder.GrandChild, SuperBuilderAbstractToBuilder.GrandChild.GrandChildBuilderImpl> {\n      private GrandChildBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderAbstractToBuilder.GrandChild.GrandChildBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderAbstractToBuilder.GrandChild build() {\n        return new SuperBuilderAbstractToBuilder.GrandChild(this);\n      }\n    }\n    String grandChildField;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated GrandChild(final SuperBuilderAbstractToBuilder.GrandChild.GrandChildBuilder<?, ?> b) {\n      super(b);\n      this.grandChildField = b.grandChildField;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderAbstractToBuilder.GrandChild.GrandChildBuilder<?, ?> toBuilder() {\n      return new SuperBuilderAbstractToBuilder.GrandChild.GrandChildBuilderImpl().$fillValuesFrom(this);\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderAbstractToBuilder.GrandChild.GrandChildBuilder<?, ?> builder() {\n      return new SuperBuilderAbstractToBuilder.GrandChild.GrandChildBuilderImpl();\n    }\n  }\n  public SuperBuilderAbstractToBuilder() {\n    super();\n  }\n  public static void test() {\n    GrandChild x = GrandChild.builder().grandChildField(\"\").parentField(5).childField(2.5).build().toBuilder().build();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderBasic.java",
    "content": "import java.util.List;\npublic class SuperBuilderBasic {\n  public static @lombok.experimental.SuperBuilder class Parent {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilder<C extends SuperBuilderBasic.Parent, B extends SuperBuilderBasic.Parent.ParentBuilder<C, B>> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int field1;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> items;\n      public ParentBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B field1(final int field1) {\n        this.field1 = field1;\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B item(final String item) {\n        if ((this.items == null))\n            this.items = new java.util.ArrayList<String>();\n        this.items.add(item);\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B items(final java.util.Collection<? extends String> items) {\n        if ((items == null))\n            {\n              throw new java.lang.NullPointerException(\"items cannot be null\");\n            }\n        if ((this.items == null))\n            this.items = new java.util.ArrayList<String>();\n        this.items.addAll(items);\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B clearItems() {\n        if ((this.items != null))\n            this.items.clear();\n        return self();\n      }\n      protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((\"SuperBuilderBasic.Parent.ParentBuilder(field1=\" + this.field1) + \", items=\") + this.items) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilderImpl extends SuperBuilderBasic.Parent.ParentBuilder<SuperBuilderBasic.Parent, SuperBuilderBasic.Parent.ParentBuilderImpl> {\n      private ParentBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderBasic.Parent.ParentBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderBasic.Parent build() {\n        return new SuperBuilderBasic.Parent(this);\n      }\n    }\n    int field1;\n    @lombok.Singular List<String> items;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Parent(final SuperBuilderBasic.Parent.ParentBuilder<?, ?> b) {\n      super();\n      this.field1 = b.field1;\n      java.util.List<String> items;\n      switch (((b.items == null) ? 0 : b.items.size())) {\n      case 0 :\n          items = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          items = java.util.Collections.singletonList(b.items.get(0));\n          break;\n      default :\n          items = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(b.items));\n      }\n      this.items = items;\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderBasic.Parent.ParentBuilder<?, ?> builder() {\n      return new SuperBuilderBasic.Parent.ParentBuilderImpl();\n    }\n  }\n  public static @lombok.experimental.SuperBuilder class Child extends SuperBuilderBasic.Parent {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilder<C extends SuperBuilderBasic.Child, B extends SuperBuilderBasic.Child.ChildBuilder<C, B>> extends SuperBuilderBasic.Parent.ParentBuilder<C, B> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated double field3;\n      public ChildBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B field3(final double field3) {\n        this.field3 = field3;\n        return self();\n      }\n      protected abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((\"SuperBuilderBasic.Child.ChildBuilder(super=\" + super.toString()) + \", field3=\") + this.field3) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilderImpl extends SuperBuilderBasic.Child.ChildBuilder<SuperBuilderBasic.Child, SuperBuilderBasic.Child.ChildBuilderImpl> {\n      private ChildBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderBasic.Child.ChildBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderBasic.Child build() {\n        return new SuperBuilderBasic.Child(this);\n      }\n    }\n    double field3;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Child(final SuperBuilderBasic.Child.ChildBuilder<?, ?> b) {\n      super(b);\n      this.field3 = b.field3;\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderBasic.Child.ChildBuilder<?, ?> builder() {\n      return new SuperBuilderBasic.Child.ChildBuilderImpl();\n    }\n  }\n  public SuperBuilderBasic() {\n    super();\n  }\n  public static void test() {\n    Child x = Child.builder().field3(0.0).field1(5).item(\"\").build();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderBasicToBuilder.java",
    "content": "import java.util.List;\npublic class SuperBuilderBasicToBuilder {\n  public static @lombok.experimental.SuperBuilder(toBuilder = true) class Parent {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilder<C extends SuperBuilderBasicToBuilder.Parent, B extends SuperBuilderBasicToBuilder.Parent.ParentBuilder<C, B>> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int field1;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int obtainViaField;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int obtainViaMethod;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String obtainViaStaticMethod;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> items;\n      public ParentBuilder() {\n        super();\n      }\n      protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated B $fillValuesFrom(final C instance) {\n        SuperBuilderBasicToBuilder.Parent.ParentBuilder.$fillValuesFromInstanceIntoBuilder(instance, this);\n        return self();\n      }\n      private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated void $fillValuesFromInstanceIntoBuilder(final SuperBuilderBasicToBuilder.Parent instance, final SuperBuilderBasicToBuilder.Parent.ParentBuilder<?, ?> b) {\n        b.field1(instance.field1);\n        b.obtainViaField(instance.field1);\n        b.obtainViaMethod(instance.method());\n        b.obtainViaStaticMethod(SuperBuilderBasicToBuilder.Parent.staticMethod(instance));\n        b.items(((instance.items == null) ? java.util.Collections.<String>emptyList() : instance.items));\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B field1(final int field1) {\n        this.field1 = field1;\n        return self();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B obtainViaField(final int obtainViaField) {\n        this.obtainViaField = obtainViaField;\n        return self();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B obtainViaMethod(final int obtainViaMethod) {\n        this.obtainViaMethod = obtainViaMethod;\n        return self();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B obtainViaStaticMethod(final String obtainViaStaticMethod) {\n        this.obtainViaStaticMethod = obtainViaStaticMethod;\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B item(final String item) {\n        if ((this.items == null))\n            this.items = new java.util.ArrayList<String>();\n        this.items.add(item);\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B items(final java.util.Collection<? extends String> items) {\n        if ((items == null))\n            {\n              throw new java.lang.NullPointerException(\"items cannot be null\");\n            }\n        if ((this.items == null))\n            this.items = new java.util.ArrayList<String>();\n        this.items.addAll(items);\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B clearItems() {\n        if ((this.items != null))\n            this.items.clear();\n        return self();\n      }\n      protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((((((((\"SuperBuilderBasicToBuilder.Parent.ParentBuilder(field1=\" + this.field1) + \", obtainViaField=\") + this.obtainViaField) + \", obtainViaMethod=\") + this.obtainViaMethod) + \", obtainViaStaticMethod=\") + this.obtainViaStaticMethod) + \", items=\") + this.items) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilderImpl extends SuperBuilderBasicToBuilder.Parent.ParentBuilder<SuperBuilderBasicToBuilder.Parent, SuperBuilderBasicToBuilder.Parent.ParentBuilderImpl> {\n      private ParentBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderBasicToBuilder.Parent.ParentBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderBasicToBuilder.Parent build() {\n        return new SuperBuilderBasicToBuilder.Parent(this);\n      }\n    }\n    private int field1;\n    @lombok.Builder.ObtainVia(field = \"field1\") int obtainViaField;\n    @lombok.Builder.ObtainVia(method = \"method\") int obtainViaMethod;\n    @lombok.Builder.ObtainVia(method = \"staticMethod\",isStatic = true) String obtainViaStaticMethod;\n    @lombok.Singular List<String> items;\n    private int method() {\n      return 2;\n    }\n    private static String staticMethod(Parent instance) {\n      return \"staticMethod\";\n    }\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Parent(final SuperBuilderBasicToBuilder.Parent.ParentBuilder<?, ?> b) {\n      super();\n      this.field1 = b.field1;\n      this.obtainViaField = b.obtainViaField;\n      this.obtainViaMethod = b.obtainViaMethod;\n      this.obtainViaStaticMethod = b.obtainViaStaticMethod;\n      java.util.List<String> items;\n      switch (((b.items == null) ? 0 : b.items.size())) {\n      case 0 :\n          items = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          items = java.util.Collections.singletonList(b.items.get(0));\n          break;\n      default :\n          items = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(b.items));\n      }\n      this.items = items;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderBasicToBuilder.Parent.ParentBuilder<?, ?> toBuilder() {\n      return new SuperBuilderBasicToBuilder.Parent.ParentBuilderImpl().$fillValuesFrom(this);\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderBasicToBuilder.Parent.ParentBuilder<?, ?> builder() {\n      return new SuperBuilderBasicToBuilder.Parent.ParentBuilderImpl();\n    }\n  }\n  public static @lombok.experimental.SuperBuilder(toBuilder = true) class Child extends Parent {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilder<C extends SuperBuilderBasicToBuilder.Child, B extends SuperBuilderBasicToBuilder.Child.ChildBuilder<C, B>> extends Parent.ParentBuilder<C, B> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated double field3;\n      public ChildBuilder() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B $fillValuesFrom(final C instance) {\n        super.$fillValuesFrom(instance);\n        SuperBuilderBasicToBuilder.Child.ChildBuilder.$fillValuesFromInstanceIntoBuilder(instance, this);\n        return self();\n      }\n      private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated void $fillValuesFromInstanceIntoBuilder(final SuperBuilderBasicToBuilder.Child instance, final SuperBuilderBasicToBuilder.Child.ChildBuilder<?, ?> b) {\n        b.field3(instance.field3);\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B field3(final double field3) {\n        this.field3 = field3;\n        return self();\n      }\n      protected abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((\"SuperBuilderBasicToBuilder.Child.ChildBuilder(super=\" + super.toString()) + \", field3=\") + this.field3) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilderImpl extends SuperBuilderBasicToBuilder.Child.ChildBuilder<SuperBuilderBasicToBuilder.Child, SuperBuilderBasicToBuilder.Child.ChildBuilderImpl> {\n      private ChildBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderBasicToBuilder.Child.ChildBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderBasicToBuilder.Child build() {\n        return new SuperBuilderBasicToBuilder.Child(this);\n      }\n    }\n    private double field3;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Child(final SuperBuilderBasicToBuilder.Child.ChildBuilder<?, ?> b) {\n      super(b);\n      this.field3 = b.field3;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderBasicToBuilder.Child.ChildBuilder<?, ?> toBuilder() {\n      return new SuperBuilderBasicToBuilder.Child.ChildBuilderImpl().$fillValuesFrom(this);\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderBasicToBuilder.Child.ChildBuilder<?, ?> builder() {\n      return new SuperBuilderBasicToBuilder.Child.ChildBuilderImpl();\n    }\n  }\n  public SuperBuilderBasicToBuilder() {\n    super();\n  }\n  public static void test() {\n    Child x = Child.builder().field3(0.0).field1(5).item(\"\").build().toBuilder().build();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderCustomName.java",
    "content": "import java.util.List;\n@lombok.experimental.SuperBuilder class SuperBuilderCustomName<T> {\n  public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class SimpleTestBuilder<T, C extends SuperBuilderCustomName<T>, B extends SuperBuilderCustomName.SimpleTestBuilder<T, C, B>> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int field;\n    public SimpleTestBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B field(final int field) {\n      this.field = field;\n      return self();\n    }\n    protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n    public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"SuperBuilderCustomName.SimpleTestBuilder(field=\" + this.field) + \")\");\n    }\n  }\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class SimpleTestBuilderImpl<T> extends SuperBuilderCustomName.SimpleTestBuilder<T, SuperBuilderCustomName<T>, SuperBuilderCustomName.SimpleTestBuilderImpl<T>> {\n    private SimpleTestBuilderImpl() {\n      super();\n    }\n    protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderCustomName.SimpleTestBuilderImpl<T> self() {\n      return this;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderCustomName<T> build() {\n      return new SuperBuilderCustomName<T>(this);\n    }\n  }\n  private final int field;\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderCustomName(final SuperBuilderCustomName.SimpleTestBuilder<T, ?, ?> b) {\n    super();\n    this.field = b.field;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <T>SuperBuilderCustomName.SimpleTestBuilder<T, ?, ?> builder() {\n    return new SuperBuilderCustomName.SimpleTestBuilderImpl<T>();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderCustomized.java",
    "content": "import java.util.List;\npublic class SuperBuilderCustomized {\n  public static @lombok.experimental.SuperBuilder class Parent {\n    public static abstract class ParentBuilder<C extends Parent, B extends ParentBuilder<C, B>> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int field1;\n      public ParentBuilder() {\n        super();\n      }\n      public B resetToDefault() {\n        field1 = 0;\n        return self();\n      }\n      public B field1(int field1) {\n        this.field1 = (field1 + 1);\n        return self();\n      }\n      protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((\"SuperBuilderCustomized.Parent.ParentBuilder(field1=\" + this.field1) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilderImpl extends SuperBuilderCustomized.Parent.ParentBuilder<SuperBuilderCustomized.Parent, SuperBuilderCustomized.Parent.ParentBuilderImpl> {\n      private ParentBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderCustomized.Parent.ParentBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderCustomized.Parent build() {\n        return new SuperBuilderCustomized.Parent(this);\n      }\n    }\n    int field1;\n    protected Parent(ParentBuilder<?, ?> b) {\n      super();\n      if ((b.field1 == 0))\n          throw new IllegalArgumentException(\"field1 must be != 0\");\n      this.field1 = b.field1;\n    }\n    public static SuperBuilderCustomized.Parent.ParentBuilder<?, ?> builder(int field1) {\n      return new SuperBuilderCustomized.Parent.ParentBuilderImpl().field1(field1);\n    }\n  }\n  public static @lombok.experimental.SuperBuilder class Child extends Parent {\n    private static final class ChildBuilderImpl extends ChildBuilder<Child, ChildBuilderImpl> {\n      private ChildBuilderImpl() {\n        super();\n      }\n      public @Override Child build() {\n        this.resetToDefault();\n        return new Child(this);\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderCustomized.Child.ChildBuilderImpl self() {\n        return this;\n      }\n    }\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilder<C extends SuperBuilderCustomized.Child, B extends SuperBuilderCustomized.Child.ChildBuilder<C, B>> extends Parent.ParentBuilder<C, B> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated double field2;\n      public ChildBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B field2(final double field2) {\n        this.field2 = field2;\n        return self();\n      }\n      protected abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((\"SuperBuilderCustomized.Child.ChildBuilder(super=\" + super.toString()) + \", field2=\") + this.field2) + \")\");\n      }\n    }\n    double field2;\n    public static ChildBuilder<?, ?> builder() {\n      return new ChildBuilderImpl().field2(10.0);\n    }\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Child(final SuperBuilderCustomized.Child.ChildBuilder<?, ?> b) {\n      super(b);\n      this.field2 = b.field2;\n    }\n  }\n  public SuperBuilderCustomized() {\n    super();\n  }\n  public static void test() {\n    Child x = Child.builder().field2(1.0).field1(5).resetToDefault().build();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderCustomizedWithSetterPrefix.java",
    "content": "import java.util.List;\npublic class SuperBuilderCustomizedWithSetterPrefix {\n  public static @lombok.experimental.SuperBuilder(setterPrefix = \"set\") class Parent {\n    public static abstract class ParentBuilder<C extends Parent, B extends ParentBuilder<C, B>> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int field1;\n      public ParentBuilder() {\n        super();\n      }\n      public B setField1(int field1) {\n        this.field1 = (field1 + 1);\n        return self();\n      }\n      protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((\"SuperBuilderCustomizedWithSetterPrefix.Parent.ParentBuilder(field1=\" + this.field1) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilderImpl extends SuperBuilderCustomizedWithSetterPrefix.Parent.ParentBuilder<SuperBuilderCustomizedWithSetterPrefix.Parent, SuperBuilderCustomizedWithSetterPrefix.Parent.ParentBuilderImpl> {\n      private ParentBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderCustomizedWithSetterPrefix.Parent.ParentBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderCustomizedWithSetterPrefix.Parent build() {\n        return new SuperBuilderCustomizedWithSetterPrefix.Parent(this);\n      }\n    }\n    int field1;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Parent(final SuperBuilderCustomizedWithSetterPrefix.Parent.ParentBuilder<?, ?> b) {\n      super();\n      this.field1 = b.field1;\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderCustomizedWithSetterPrefix.Parent.ParentBuilder<?, ?> builder() {\n      return new SuperBuilderCustomizedWithSetterPrefix.Parent.ParentBuilderImpl();\n    }\n  }\n  public SuperBuilderCustomizedWithSetterPrefix() {\n    super();\n  }\n  public static void test() {\n    Parent x = Parent.builder().setField1(5).build();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderInAnonymousClass.java",
    "content": "import lombok.experimental.SuperBuilder;\npublic class SuperBuilderInAnonymousClass {\n  Object annonymous = new Object() {\n    @SuperBuilder class InnerParent {\n      private String string;\n      InnerParent() {\n        super();\n      }\n    }\n    @SuperBuilder class InnerChild {\n      private String string;\n      InnerChild() {\n        super();\n      }\n    }\n    x() {\n      super();\n    }\n  };\n  public SuperBuilderInAnonymousClass() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderInitializer.java",
    "content": "import lombok.experimental.SuperBuilder;\nclass SuperBuilderInitializer {\n  public static @SuperBuilder class One {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class OneBuilder<C extends SuperBuilderInitializer.One, B extends SuperBuilderInitializer.One.OneBuilder<C, B>> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String world;\n      public OneBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B world(final String world) {\n        this.world = world;\n        return self();\n      }\n      protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((\"SuperBuilderInitializer.One.OneBuilder(world=\" + this.world) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class OneBuilderImpl extends SuperBuilderInitializer.One.OneBuilder<SuperBuilderInitializer.One, SuperBuilderInitializer.One.OneBuilderImpl> {\n      private OneBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderInitializer.One.OneBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderInitializer.One build() {\n        return new SuperBuilderInitializer.One(this);\n      }\n    }\n    private String world;\n    {\n      world = \"Hello\";\n    }\n    private static final String world2;\n    static {\n      world2 = \"Hello\";\n    }\n    <clinit>() {\n    }\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated One(final SuperBuilderInitializer.One.OneBuilder<?, ?> b) {\n      super();\n      this.world = b.world;\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderInitializer.One.OneBuilder<?, ?> builder() {\n      return new SuperBuilderInitializer.One.OneBuilderImpl();\n    }\n  }\n  SuperBuilderInitializer() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderJavadoc.java",
    "content": "import java.util.List;\npublic abstract @lombok.experimental.SuperBuilder class SuperBuilderJavadoc {\n  public static abstract class SuperBuilderJavadocBuilder<C extends SuperBuilderJavadoc, B extends SuperBuilderJavadocBuilder<C, B>> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int basic;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getsetwith;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int predef;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int predefWithJavadoc;\n    public SuperBuilderJavadocBuilder() {\n      super();\n    }\n    public B predef(final int x) {\n      this.predef = (x * 10);\n      return self();\n    }\n    public B predefWithJavadoc(final int x) {\n      this.predefWithJavadoc = (x * 100);\n      return self();\n    }\n    /**\n     * basic gets only a builder setter.\n     * @see #getsetwith\n     * @param tag is moved to the setter.\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B basic(final int basic) {\n      this.basic = basic;\n      return self();\n    }\n    /**\n     * getsetwith gets a builder setter, an instance getter and setter, and a wither.\n     * @param tag is moved to the setters and wither.\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B getsetwith(final int getsetwith) {\n      this.getsetwith = getsetwith;\n      return self();\n    }\n    protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n    public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((((\"SuperBuilderJavadoc.SuperBuilderJavadocBuilder(basic=\" + this.basic) + \", getsetwith=\") + this.getsetwith) + \", predef=\") + this.predef) + \", predefWithJavadoc=\") + this.predefWithJavadoc) + \")\");\n    }\n  }\n  private final int basic;\n  private @lombok.Getter @lombok.Setter @lombok.experimental.Wither int getsetwith;\n  private final int predef;\n  private final int predefWithJavadoc;\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderJavadoc(final SuperBuilderJavadoc.SuperBuilderJavadocBuilder<?, ?> b) {\n    super();\n    this.basic = b.basic;\n    this.getsetwith = b.getsetwith;\n    this.predef = b.predef;\n    this.predefWithJavadoc = b.predefWithJavadoc;\n  }\n  /**\n   * getsetwith gets a builder setter, an instance getter and setter, and a wither.\n   * @return tag is moved to the getter.\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getGetsetwith() {\n    return this.getsetwith;\n  }\n  /**\n   * getsetwith gets a builder setter, an instance getter and setter, and a wither.\n   * @param tag is moved to the setters and wither.\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setGetsetwith(final int getsetwith) {\n    this.getsetwith = getsetwith;\n  }\n  /**\n   * getsetwith gets a builder setter, an instance getter and setter, and a wither.\n   * @param tag is moved to the setters and wither.\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderJavadoc withGetsetwith(final int getsetwith);\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderNameClashes.java",
    "content": "public class SuperBuilderNameClashes {\n  public static @lombok.experimental.SuperBuilder class GenericsClash<B, C, C2> {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class GenericsClashBuilder<B, C, C2, C3 extends SuperBuilderNameClashes.GenericsClash<B, C, C2>, B2 extends SuperBuilderNameClashes.GenericsClash.GenericsClashBuilder<B, C, C2, C3, B2>> {\n      public GenericsClashBuilder() {\n        super();\n      }\n      protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B2 self();\n      public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C3 build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return \"SuperBuilderNameClashes.GenericsClash.GenericsClashBuilder()\";\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class GenericsClashBuilderImpl<B, C, C2> extends SuperBuilderNameClashes.GenericsClash.GenericsClashBuilder<B, C, C2, SuperBuilderNameClashes.GenericsClash<B, C, C2>, SuperBuilderNameClashes.GenericsClash.GenericsClashBuilderImpl<B, C, C2>> {\n      private GenericsClashBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderNameClashes.GenericsClash.GenericsClashBuilderImpl<B, C, C2> self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderNameClashes.GenericsClash<B, C, C2> build() {\n        return new SuperBuilderNameClashes.GenericsClash<B, C, C2>(this);\n      }\n    }\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated GenericsClash(final SuperBuilderNameClashes.GenericsClash.GenericsClashBuilder<B, C, C2, ?, ?> b) {\n      super();\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <B, C, C2>SuperBuilderNameClashes.GenericsClash.GenericsClashBuilder<B, C, C2, ?, ?> builder() {\n      return new SuperBuilderNameClashes.GenericsClash.GenericsClashBuilderImpl<B, C, C2>();\n    }\n  }\n  public static @lombok.experimental.SuperBuilder class B {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BBuilder<C extends SuperBuilderNameClashes.B, B2 extends SuperBuilderNameClashes.B.BBuilder<C, B2>> {\n      public BBuilder() {\n        super();\n      }\n      protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B2 self();\n      public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return \"SuperBuilderNameClashes.B.BBuilder()\";\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BBuilderImpl extends SuperBuilderNameClashes.B.BBuilder<SuperBuilderNameClashes.B, SuperBuilderNameClashes.B.BBuilderImpl> {\n      private BBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderNameClashes.B.BBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderNameClashes.B build() {\n        return new SuperBuilderNameClashes.B(this);\n      }\n    }\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated B(final SuperBuilderNameClashes.B.BBuilder<?, ?> b) {\n      super();\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderNameClashes.B.BBuilder<?, ?> builder() {\n      return new SuperBuilderNameClashes.B.BBuilderImpl();\n    }\n  }\n  public static class C2 {\n    public C2() {\n      super();\n    }\n  }\n  public static @lombok.experimental.SuperBuilder class C {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class CBuilder<C3 extends SuperBuilderNameClashes.C, B extends SuperBuilderNameClashes.C.CBuilder<C3, B>> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated C2 c2;\n      public CBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B c2(final C2 c2) {\n        this.c2 = c2;\n        return self();\n      }\n      protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C3 build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((\"SuperBuilderNameClashes.C.CBuilder(c2=\" + this.c2) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class CBuilderImpl extends SuperBuilderNameClashes.C.CBuilder<SuperBuilderNameClashes.C, SuperBuilderNameClashes.C.CBuilderImpl> {\n      private CBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderNameClashes.C.CBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderNameClashes.C build() {\n        return new SuperBuilderNameClashes.C(this);\n      }\n    }\n    C2 c2;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated C(final SuperBuilderNameClashes.C.CBuilder<?, ?> b) {\n      super();\n      this.c2 = b.c2;\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderNameClashes.C.CBuilder<?, ?> builder() {\n      return new SuperBuilderNameClashes.C.CBuilderImpl();\n    }\n  }\n  interface B2 {\n    interface B4<X> {\n    }\n  }\n  interface B3<Y> {\n  }\n  public static @lombok.experimental.SuperBuilder class ExtendsClauseCollision extends B implements B2.B4<Object>, B3<Object> {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ExtendsClauseCollisionBuilder<C extends SuperBuilderNameClashes.ExtendsClauseCollision, B4 extends SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilder<C, B4>> extends B.BBuilder<C, B4> {\n      public ExtendsClauseCollisionBuilder() {\n        super();\n      }\n      protected abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B4 self();\n      public abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((\"SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilder(super=\" + super.toString()) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ExtendsClauseCollisionBuilderImpl extends SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilder<SuperBuilderNameClashes.ExtendsClauseCollision, SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilderImpl> {\n      private ExtendsClauseCollisionBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderNameClashes.ExtendsClauseCollision build() {\n        return new SuperBuilderNameClashes.ExtendsClauseCollision(this);\n      }\n    }\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated ExtendsClauseCollision(final SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilder<?, ?> b) {\n      super(b);\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilder<?, ?> builder() {\n      return new SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilderImpl();\n    }\n  }\n  public SuperBuilderNameClashes() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderNestedGenericTypes.java",
    "content": "public class SuperBuilderNestedGenericTypes {\n  public static abstract @lombok.experimental.SuperBuilder class Generic<T extends Generic<?>> {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class GenericBuilder<T extends Generic<?>, C extends SuperBuilderNestedGenericTypes.Generic<T>, B extends SuperBuilderNestedGenericTypes.Generic.GenericBuilder<T, C, B>> {\n      public GenericBuilder() {\n        super();\n      }\n      protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return \"SuperBuilderNestedGenericTypes.Generic.GenericBuilder()\";\n      }\n    }\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Generic(final SuperBuilderNestedGenericTypes.Generic.GenericBuilder<T, ?, ?> b) {\n      super();\n    }\n  }\n  public static abstract @lombok.experimental.SuperBuilder class NestedGeneric<T extends OtherGeneric<?>> extends Generic<NestedGeneric<? extends OtherGeneric<?>>> {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class NestedGenericBuilder<T extends OtherGeneric<?>, C extends SuperBuilderNestedGenericTypes.NestedGeneric<T>, B extends SuperBuilderNestedGenericTypes.NestedGeneric.NestedGenericBuilder<T, C, B>> extends Generic.GenericBuilder<NestedGeneric<? extends OtherGeneric<?>>, C, B> {\n      public NestedGenericBuilder() {\n        super();\n      }\n      protected abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((\"SuperBuilderNestedGenericTypes.NestedGeneric.NestedGenericBuilder(super=\" + super.toString()) + \")\");\n      }\n    }\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated NestedGeneric(final SuperBuilderNestedGenericTypes.NestedGeneric.NestedGenericBuilder<T, ?, ?> b) {\n      super(b);\n    }\n  }\n  public interface OtherGeneric<T> {\n  }\n  public SuperBuilderNestedGenericTypes() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderSingularAnnotatedTypes.java",
    "content": "import java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.Set;\nimport java.util.Map;\nimport lombok.NonNull;\nimport lombok.Singular;\n@Target(ElementType.TYPE_USE) @interface MyAnnotation {\n}\n@lombok.experimental.SuperBuilder class SuperBuilderSingularAnnotatedTypes {\n  public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class SuperBuilderSingularAnnotatedTypesBuilder<C extends SuperBuilderSingularAnnotatedTypes, B extends SuperBuilderSingularAnnotatedTypes.SuperBuilderSingularAnnotatedTypesBuilder<C, B>> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<@MyAnnotation @NonNull String> foos;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<@MyAnnotation @NonNull String> bars$key;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<@MyAnnotation @NonNull Integer> bars$value;\n    public SuperBuilderSingularAnnotatedTypesBuilder() {\n      super();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B foo(final @MyAnnotation @NonNull String foo) {\n      if ((foo == null))\n          {\n            throw new java.lang.NullPointerException(\"foo is marked non-null but is null\");\n          }\n      if ((this.foos == null))\n          this.foos = new java.util.ArrayList<@MyAnnotation @NonNull String>();\n      this.foos.add(foo);\n      return self();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B foos(final java.util.Collection<? extends @MyAnnotation @NonNull String> foos) {\n      if ((foos == null))\n          {\n            throw new java.lang.NullPointerException(\"foos cannot be null\");\n          }\n      if ((this.foos == null))\n          this.foos = new java.util.ArrayList<@MyAnnotation @NonNull String>();\n      this.foos.addAll(foos);\n      return self();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B clearFoos() {\n      if ((this.foos != null))\n          this.foos.clear();\n      return self();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B bar(final @MyAnnotation @NonNull String barKey, final @MyAnnotation @NonNull Integer barValue) {\n      if ((barKey == null))\n          {\n            throw new java.lang.NullPointerException(\"barKey is marked non-null but is null\");\n          }\n      if ((barValue == null))\n          {\n            throw new java.lang.NullPointerException(\"barValue is marked non-null but is null\");\n          }\n      if ((this.bars$key == null))\n          {\n            this.bars$key = new java.util.ArrayList<@MyAnnotation @NonNull String>();\n            this.bars$value = new java.util.ArrayList<@MyAnnotation @NonNull Integer>();\n          }\n      this.bars$key.add(barKey);\n      this.bars$value.add(barValue);\n      return self();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B bars(final java.util.Map<? extends @MyAnnotation @NonNull String, ? extends @MyAnnotation @NonNull Integer> bars) {\n      if ((bars == null))\n          {\n            throw new java.lang.NullPointerException(\"bars cannot be null\");\n          }\n      if ((this.bars$key == null))\n          {\n            this.bars$key = new java.util.ArrayList<@MyAnnotation @NonNull String>();\n            this.bars$value = new java.util.ArrayList<@MyAnnotation @NonNull Integer>();\n          }\n      for (java.util.Map.Entry<? extends @MyAnnotation @NonNull String, ? extends @MyAnnotation @NonNull Integer> $lombokEntry : bars.entrySet()) \n        {\n          this.bars$key.add($lombokEntry.getKey());\n          this.bars$value.add($lombokEntry.getValue());\n        }\n      return self();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B clearBars() {\n      if ((this.bars$key != null))\n          {\n            this.bars$key.clear();\n            this.bars$value.clear();\n          }\n      return self();\n    }\n    protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n    public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((\"SuperBuilderSingularAnnotatedTypes.SuperBuilderSingularAnnotatedTypesBuilder(foos=\" + this.foos) + \", bars$key=\") + this.bars$key) + \", bars$value=\") + this.bars$value) + \")\");\n    }\n  }\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class SuperBuilderSingularAnnotatedTypesBuilderImpl extends SuperBuilderSingularAnnotatedTypes.SuperBuilderSingularAnnotatedTypesBuilder<SuperBuilderSingularAnnotatedTypes, SuperBuilderSingularAnnotatedTypes.SuperBuilderSingularAnnotatedTypesBuilderImpl> {\n    private SuperBuilderSingularAnnotatedTypesBuilderImpl() {\n      super();\n    }\n    protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderSingularAnnotatedTypes.SuperBuilderSingularAnnotatedTypesBuilderImpl self() {\n      return this;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderSingularAnnotatedTypes build() {\n      return new SuperBuilderSingularAnnotatedTypes(this);\n    }\n  }\n  private @Singular Set<@MyAnnotation @NonNull String> foos;\n  private @Singular Map<@MyAnnotation @NonNull String, @MyAnnotation @NonNull Integer> bars;\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderSingularAnnotatedTypes(final SuperBuilderSingularAnnotatedTypes.SuperBuilderSingularAnnotatedTypesBuilder<?, ?> b) {\n    super();\n    java.util.Set<@MyAnnotation @NonNull String> foos;\n    switch (((b.foos == null) ? 0 : b.foos.size())) {\n    case 0 :\n        foos = java.util.Collections.emptySet();\n        break;\n    case 1 :\n        foos = java.util.Collections.singleton(b.foos.get(0));\n        break;\n    default :\n        foos = new java.util.LinkedHashSet<@MyAnnotation @NonNull String>(((b.foos.size() < 0x40000000) ? ((1 + b.foos.size()) + ((b.foos.size() - 3) / 3)) : java.lang.Integer.MAX_VALUE));\n        foos.addAll(b.foos);\n        foos = java.util.Collections.unmodifiableSet(foos);\n    }\n    this.foos = foos;\n    java.util.Map<@MyAnnotation @NonNull String, @MyAnnotation @NonNull Integer> bars;\n    switch (((b.bars$key == null) ? 0 : b.bars$key.size())) {\n    case 0 :\n        bars = java.util.Collections.emptyMap();\n        break;\n    case 1 :\n        bars = java.util.Collections.singletonMap(b.bars$key.get(0), b.bars$value.get(0));\n        break;\n    default :\n        bars = new java.util.LinkedHashMap<@MyAnnotation @NonNull String, @MyAnnotation @NonNull Integer>(((b.bars$key.size() < 0x40000000) ? ((1 + b.bars$key.size()) + ((b.bars$key.size() - 3) / 3)) : java.lang.Integer.MAX_VALUE));\n        for (int $i = 0;; ($i < b.bars$key.size()); $i ++) \n          bars.put(b.bars$key.get($i), b.bars$value.get($i));\n        bars = java.util.Collections.unmodifiableMap(bars);\n    }\n    this.bars = bars;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderSingularAnnotatedTypes.SuperBuilderSingularAnnotatedTypesBuilder<?, ?> builder() {\n    return new SuperBuilderSingularAnnotatedTypes.SuperBuilderSingularAnnotatedTypesBuilderImpl();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderSingularCustomized.java",
    "content": "import java.util.Set;\n@lombok.experimental.SuperBuilder class SuperBuilderSingularCustomized {\n  public static abstract class SuperBuilderSingularCustomizedBuilder<C extends SuperBuilderSingularCustomized, B extends SuperBuilderSingularCustomized.SuperBuilderSingularCustomizedBuilder<C, B>> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> foos;\n    public SuperBuilderSingularCustomizedBuilder() {\n      super();\n    }\n    public B custom(final String value) {\n      return self();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B foo(final String foo) {\n      if ((this.foos == null))\n          this.foos = new java.util.ArrayList<String>();\n      this.foos.add(foo);\n      return self();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B foos(final java.util.Collection<? extends String> foos) {\n      if ((foos == null))\n          {\n            throw new java.lang.NullPointerException(\"foos cannot be null\");\n          }\n      if ((this.foos == null))\n          this.foos = new java.util.ArrayList<String>();\n      this.foos.addAll(foos);\n      return self();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B clearFoos() {\n      if ((this.foos != null))\n          this.foos.clear();\n      return self();\n    }\n    protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n    public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"SuperBuilderSingularCustomized.SuperBuilderSingularCustomizedBuilder(foos=\" + this.foos) + \")\");\n    }\n  }\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class SuperBuilderSingularCustomizedBuilderImpl extends SuperBuilderSingularCustomized.SuperBuilderSingularCustomizedBuilder<SuperBuilderSingularCustomized, SuperBuilderSingularCustomized.SuperBuilderSingularCustomizedBuilderImpl> {\n    private SuperBuilderSingularCustomizedBuilderImpl() {\n      super();\n    }\n    protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderSingularCustomized.SuperBuilderSingularCustomizedBuilderImpl self() {\n      return this;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderSingularCustomized build() {\n      return new SuperBuilderSingularCustomized(this);\n    }\n  }\n  private @lombok.Singular Set<String> foos;\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderSingularCustomized(final SuperBuilderSingularCustomized.SuperBuilderSingularCustomizedBuilder<?, ?> b) {\n    super();\n    java.util.Set<String> foos;\n    switch (((b.foos == null) ? 0 : b.foos.size())) {\n    case 0 :\n        foos = java.util.Collections.emptySet();\n        break;\n    case 1 :\n        foos = java.util.Collections.singleton(b.foos.get(0));\n        break;\n    default :\n        foos = new java.util.LinkedHashSet<String>(((b.foos.size() < 0x40000000) ? ((1 + b.foos.size()) + ((b.foos.size() - 3) / 3)) : java.lang.Integer.MAX_VALUE));\n        foos.addAll(b.foos);\n        foos = java.util.Collections.unmodifiableSet(foos);\n    }\n    this.foos = foos;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderSingularCustomized.SuperBuilderSingularCustomizedBuilder<?, ?> builder() {\n    return new SuperBuilderSingularCustomized.SuperBuilderSingularCustomizedBuilderImpl();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderSingularToBuilderGuava.java",
    "content": "public class SuperBuilderSingularToBuilderGuava {\n  public static @lombok.experimental.SuperBuilder(toBuilder = true) class Parent<T> {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilder<T, C extends SuperBuilderSingularToBuilderGuava.Parent<T>, B extends SuperBuilderSingularToBuilderGuava.Parent.ParentBuilder<T, C, B>> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.collect.ImmutableList.Builder<T> cards;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.collect.ImmutableList.Builder<Number> frogs;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.collect.ImmutableSet.Builder<java.lang.Object> rawSet;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.collect.ImmutableSortedSet.Builder<String> passes;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated com.google.common.collect.ImmutableTable.Builder<Number, Number, String> users;\n      public ParentBuilder() {\n        super();\n      }\n      protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated B $fillValuesFrom(final C instance) {\n        SuperBuilderSingularToBuilderGuava.Parent.ParentBuilder.$fillValuesFromInstanceIntoBuilder(instance, this);\n        return self();\n      }\n      private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <T>void $fillValuesFromInstanceIntoBuilder(final SuperBuilderSingularToBuilderGuava.Parent<T> instance, final SuperBuilderSingularToBuilderGuava.Parent.ParentBuilder<T, ?, ?> b) {\n        b.cards(((instance.cards == null) ? com.google.common.collect.ImmutableList.<T>of() : instance.cards));\n        b.frogs(((instance.frogs == null) ? com.google.common.collect.ImmutableList.<Number>of() : instance.frogs));\n        b.rawSet(((instance.rawSet == null) ? com.google.common.collect.ImmutableSet.<java.lang.Object>of() : instance.rawSet));\n        b.passes(((instance.passes == null) ? com.google.common.collect.ImmutableSortedSet.<String>of() : instance.passes));\n        b.users(((instance.users == null) ? com.google.common.collect.ImmutableTable.<Number, Number, String>of() : instance.users));\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B card(final T card) {\n        if ((this.cards == null))\n            this.cards = com.google.common.collect.ImmutableList.builder();\n        this.cards.add(card);\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B cards(final java.lang.Iterable<? extends T> cards) {\n        if ((cards == null))\n            {\n              throw new java.lang.NullPointerException(\"cards cannot be null\");\n            }\n        if ((this.cards == null))\n            this.cards = com.google.common.collect.ImmutableList.builder();\n        this.cards.addAll(cards);\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B clearCards() {\n        this.cards = null;\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B frog(final Number frog) {\n        if ((this.frogs == null))\n            this.frogs = com.google.common.collect.ImmutableList.builder();\n        this.frogs.add(frog);\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B frogs(final java.lang.Iterable<? extends Number> frogs) {\n        if ((frogs == null))\n            {\n              throw new java.lang.NullPointerException(\"frogs cannot be null\");\n            }\n        if ((this.frogs == null))\n            this.frogs = com.google.common.collect.ImmutableList.builder();\n        this.frogs.addAll(frogs);\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B clearFrogs() {\n        this.frogs = null;\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B rawSet(final java.lang.Object rawSet) {\n        if ((this.rawSet == null))\n            this.rawSet = com.google.common.collect.ImmutableSet.builder();\n        this.rawSet.add(rawSet);\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B rawSet(final java.lang.Iterable<?> rawSet) {\n        if ((rawSet == null))\n            {\n              throw new java.lang.NullPointerException(\"rawSet cannot be null\");\n            }\n        if ((this.rawSet == null))\n            this.rawSet = com.google.common.collect.ImmutableSet.builder();\n        this.rawSet.addAll(rawSet);\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B clearRawSet() {\n        this.rawSet = null;\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B pass(final String pass) {\n        if ((this.passes == null))\n            this.passes = com.google.common.collect.ImmutableSortedSet.naturalOrder();\n        this.passes.add(pass);\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B passes(final java.lang.Iterable<? extends String> passes) {\n        if ((passes == null))\n            {\n              throw new java.lang.NullPointerException(\"passes cannot be null\");\n            }\n        if ((this.passes == null))\n            this.passes = com.google.common.collect.ImmutableSortedSet.naturalOrder();\n        this.passes.addAll(passes);\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B clearPasses() {\n        this.passes = null;\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B user(final Number rowKey, final Number columnKey, final String value) {\n        if ((this.users == null))\n            this.users = com.google.common.collect.ImmutableTable.builder();\n        this.users.put(rowKey, columnKey, value);\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B users(final com.google.common.collect.Table<? extends Number, ? extends Number, ? extends String> users) {\n        if ((users == null))\n            {\n              throw new java.lang.NullPointerException(\"users cannot be null\");\n            }\n        if ((this.users == null))\n            this.users = com.google.common.collect.ImmutableTable.builder();\n        this.users.putAll(users);\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B clearUsers() {\n        this.users = null;\n        return self();\n      }\n      protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((((((((\"SuperBuilderSingularToBuilderGuava.Parent.ParentBuilder(cards=\" + this.cards) + \", frogs=\") + this.frogs) + \", rawSet=\") + this.rawSet) + \", passes=\") + this.passes) + \", users=\") + this.users) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilderImpl<T> extends SuperBuilderSingularToBuilderGuava.Parent.ParentBuilder<T, SuperBuilderSingularToBuilderGuava.Parent<T>, SuperBuilderSingularToBuilderGuava.Parent.ParentBuilderImpl<T>> {\n      private ParentBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderSingularToBuilderGuava.Parent.ParentBuilderImpl<T> self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderSingularToBuilderGuava.Parent<T> build() {\n        return new SuperBuilderSingularToBuilderGuava.Parent<T>(this);\n      }\n    }\n    private @lombok.Singular com.google.common.collect.ImmutableList<T> cards;\n    private @lombok.Singular com.google.common.collect.ImmutableCollection<? extends Number> frogs;\n    private @SuppressWarnings(\"all\") @lombok.Singular(\"rawSet\") com.google.common.collect.ImmutableSet rawSet;\n    private @lombok.Singular com.google.common.collect.ImmutableSortedSet<String> passes;\n    private @lombok.Singular com.google.common.collect.ImmutableTable<? extends Number, ? extends Number, String> users;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Parent(final SuperBuilderSingularToBuilderGuava.Parent.ParentBuilder<T, ?, ?> b) {\n      super();\n      com.google.common.collect.ImmutableList<T> cards = ((b.cards == null) ? com.google.common.collect.ImmutableList.<T>of() : b.cards.build());\n      this.cards = cards;\n      com.google.common.collect.ImmutableCollection<Number> frogs = ((b.frogs == null) ? com.google.common.collect.ImmutableList.<Number>of() : b.frogs.build());\n      this.frogs = frogs;\n      com.google.common.collect.ImmutableSet<java.lang.Object> rawSet = ((b.rawSet == null) ? com.google.common.collect.ImmutableSet.<java.lang.Object>of() : b.rawSet.build());\n      this.rawSet = rawSet;\n      com.google.common.collect.ImmutableSortedSet<String> passes = ((b.passes == null) ? com.google.common.collect.ImmutableSortedSet.<String>of() : b.passes.build());\n      this.passes = passes;\n      com.google.common.collect.ImmutableTable<Number, Number, String> users = ((b.users == null) ? com.google.common.collect.ImmutableTable.<Number, Number, String>of() : b.users.build());\n      this.users = users;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderSingularToBuilderGuava.Parent.ParentBuilder<T, ?, ?> toBuilder() {\n      return new SuperBuilderSingularToBuilderGuava.Parent.ParentBuilderImpl<T>().$fillValuesFrom(this);\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <T>SuperBuilderSingularToBuilderGuava.Parent.ParentBuilder<T, ?, ?> builder() {\n      return new SuperBuilderSingularToBuilderGuava.Parent.ParentBuilderImpl<T>();\n    }\n  }\n  public static @lombok.experimental.SuperBuilder(toBuilder = true) class Child<T> extends Parent<T> {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilder<T, C extends SuperBuilderSingularToBuilderGuava.Child<T>, B extends SuperBuilderSingularToBuilderGuava.Child.ChildBuilder<T, C, B>> extends Parent.ParentBuilder<T, C, B> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated double field3;\n      public ChildBuilder() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B $fillValuesFrom(final C instance) {\n        super.$fillValuesFrom(instance);\n        SuperBuilderSingularToBuilderGuava.Child.ChildBuilder.$fillValuesFromInstanceIntoBuilder(instance, this);\n        return self();\n      }\n      private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <T>void $fillValuesFromInstanceIntoBuilder(final SuperBuilderSingularToBuilderGuava.Child<T> instance, final SuperBuilderSingularToBuilderGuava.Child.ChildBuilder<T, ?, ?> b) {\n        b.field3(instance.field3);\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B field3(final double field3) {\n        this.field3 = field3;\n        return self();\n      }\n      protected abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((\"SuperBuilderSingularToBuilderGuava.Child.ChildBuilder(super=\" + super.toString()) + \", field3=\") + this.field3) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilderImpl<T> extends SuperBuilderSingularToBuilderGuava.Child.ChildBuilder<T, SuperBuilderSingularToBuilderGuava.Child<T>, SuperBuilderSingularToBuilderGuava.Child.ChildBuilderImpl<T>> {\n      private ChildBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderSingularToBuilderGuava.Child.ChildBuilderImpl<T> self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderSingularToBuilderGuava.Child<T> build() {\n        return new SuperBuilderSingularToBuilderGuava.Child<T>(this);\n      }\n    }\n    private double field3;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Child(final SuperBuilderSingularToBuilderGuava.Child.ChildBuilder<T, ?, ?> b) {\n      super(b);\n      this.field3 = b.field3;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderSingularToBuilderGuava.Child.ChildBuilder<T, ?, ?> toBuilder() {\n      return new SuperBuilderSingularToBuilderGuava.Child.ChildBuilderImpl<T>().$fillValuesFrom(this);\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <T>SuperBuilderSingularToBuilderGuava.Child.ChildBuilder<T, ?, ?> builder() {\n      return new SuperBuilderSingularToBuilderGuava.Child.ChildBuilderImpl<T>();\n    }\n  }\n  public SuperBuilderSingularToBuilderGuava() {\n    super();\n  }\n  public static void test() {\n    Child<Integer> x = Child.<Integer>builder().card(1).build().toBuilder().build();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderWithAnnotatedTypeParam.java",
    "content": "//version 8:\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\nimport java.util.List;\npublic class SuperBuilderWithAnnotatedTypeParam {\n  public @Documented @Target({ElementType.TYPE_USE, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @interface MyAnnotation {\n  }\n  public static @lombok.experimental.SuperBuilder class Parent<A> {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilder<A, C extends SuperBuilderWithAnnotatedTypeParam.Parent<A>, B extends SuperBuilderWithAnnotatedTypeParam.Parent.ParentBuilder<A, C, B>> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated A field1;\n      public ParentBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B field1(final A field1) {\n        this.field1 = field1;\n        return self();\n      }\n      protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((\"SuperBuilderWithAnnotatedTypeParam.Parent.ParentBuilder(field1=\" + this.field1) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilderImpl<A> extends SuperBuilderWithAnnotatedTypeParam.Parent.ParentBuilder<A, SuperBuilderWithAnnotatedTypeParam.Parent<A>, SuperBuilderWithAnnotatedTypeParam.Parent.ParentBuilderImpl<A>> {\n      private ParentBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithAnnotatedTypeParam.Parent.ParentBuilderImpl<A> self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithAnnotatedTypeParam.Parent<A> build() {\n        return new SuperBuilderWithAnnotatedTypeParam.Parent<A>(this);\n      }\n    }\n    A field1;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Parent(final SuperBuilderWithAnnotatedTypeParam.Parent.ParentBuilder<A, ?, ?> b) {\n      super();\n      this.field1 = b.field1;\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <A>SuperBuilderWithAnnotatedTypeParam.Parent.ParentBuilder<A, ?, ?> builder() {\n      return new SuperBuilderWithAnnotatedTypeParam.Parent.ParentBuilderImpl<A>();\n    }\n  }\n  public static @lombok.experimental.SuperBuilder class Child extends Parent<@MyAnnotation String> {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilder<C extends SuperBuilderWithAnnotatedTypeParam.Child, B extends SuperBuilderWithAnnotatedTypeParam.Child.ChildBuilder<C, B>> extends Parent.ParentBuilder<@MyAnnotation String, C, B> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated double field3;\n      public ChildBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B field3(final double field3) {\n        this.field3 = field3;\n        return self();\n      }\n      protected abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((\"SuperBuilderWithAnnotatedTypeParam.Child.ChildBuilder(super=\" + super.toString()) + \", field3=\") + this.field3) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilderImpl extends SuperBuilderWithAnnotatedTypeParam.Child.ChildBuilder<SuperBuilderWithAnnotatedTypeParam.Child, SuperBuilderWithAnnotatedTypeParam.Child.ChildBuilderImpl> {\n      private ChildBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithAnnotatedTypeParam.Child.ChildBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithAnnotatedTypeParam.Child build() {\n        return new SuperBuilderWithAnnotatedTypeParam.Child(this);\n      }\n    }\n    double field3;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Child(final SuperBuilderWithAnnotatedTypeParam.Child.ChildBuilder<?, ?> b) {\n      super(b);\n      this.field3 = b.field3;\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithAnnotatedTypeParam.Child.ChildBuilder<?, ?> builder() {\n      return new SuperBuilderWithAnnotatedTypeParam.Child.ChildBuilderImpl();\n    }\n  }\n  public SuperBuilderWithAnnotatedTypeParam() {\n    super();\n  }\n  public static void test() {\n    Child x = Child.builder().field3(0.0).field1(\"string\").build();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderWithArrayTypeParam.java",
    "content": "//version 8:\npublic class SuperBuilderWithArrayTypeParam {\n  public static @lombok.experimental.SuperBuilder class Parent<A> {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilder<A, C extends SuperBuilderWithArrayTypeParam.Parent<A>, B extends SuperBuilderWithArrayTypeParam.Parent.ParentBuilder<A, C, B>> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated A field1;\n      public ParentBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B field1(final A field1) {\n        this.field1 = field1;\n        return self();\n      }\n      protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((\"SuperBuilderWithArrayTypeParam.Parent.ParentBuilder(field1=\" + this.field1) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilderImpl<A> extends SuperBuilderWithArrayTypeParam.Parent.ParentBuilder<A, SuperBuilderWithArrayTypeParam.Parent<A>, SuperBuilderWithArrayTypeParam.Parent.ParentBuilderImpl<A>> {\n      private ParentBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithArrayTypeParam.Parent.ParentBuilderImpl<A> self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithArrayTypeParam.Parent<A> build() {\n        return new SuperBuilderWithArrayTypeParam.Parent<A>(this);\n      }\n    }\n    A field1;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Parent(final SuperBuilderWithArrayTypeParam.Parent.ParentBuilder<A, ?, ?> b) {\n      super();\n      this.field1 = b.field1;\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <A>SuperBuilderWithArrayTypeParam.Parent.ParentBuilder<A, ?, ?> builder() {\n      return new SuperBuilderWithArrayTypeParam.Parent.ParentBuilderImpl<A>();\n    }\n  }\n  public static @lombok.experimental.SuperBuilder class Child extends Parent<Integer[]> {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilder<C extends SuperBuilderWithArrayTypeParam.Child, B extends SuperBuilderWithArrayTypeParam.Child.ChildBuilder<C, B>> extends Parent.ParentBuilder<Integer[], C, B> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated double field3;\n      public ChildBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B field3(final double field3) {\n        this.field3 = field3;\n        return self();\n      }\n      protected abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((\"SuperBuilderWithArrayTypeParam.Child.ChildBuilder(super=\" + super.toString()) + \", field3=\") + this.field3) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilderImpl extends SuperBuilderWithArrayTypeParam.Child.ChildBuilder<SuperBuilderWithArrayTypeParam.Child, SuperBuilderWithArrayTypeParam.Child.ChildBuilderImpl> {\n      private ChildBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithArrayTypeParam.Child.ChildBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithArrayTypeParam.Child build() {\n        return new SuperBuilderWithArrayTypeParam.Child(this);\n      }\n    }\n    double field3;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Child(final SuperBuilderWithArrayTypeParam.Child.ChildBuilder<?, ?> b) {\n      super(b);\n      this.field3 = b.field3;\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithArrayTypeParam.Child.ChildBuilder<?, ?> builder() {\n      return new SuperBuilderWithArrayTypeParam.Child.ChildBuilderImpl();\n    }\n  }\n  public SuperBuilderWithArrayTypeParam() {\n    super();\n  }\n  public static void test() {\n    Child x = Child.builder().field3(0.0).field1(new Integer[]{2}).build();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderWithCustomBuilderClassName.java",
    "content": "class SuperBuilderWithCustomBuilderClassName {\n  static @lombok.experimental.SuperBuilder class SuperClass {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class Builder<C extends SuperBuilderWithCustomBuilderClassName.SuperClass, B extends SuperBuilderWithCustomBuilderClassName.SuperClass.Builder<C, B>> {\n      public Builder() {\n        super();\n      }\n      protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return \"SuperBuilderWithCustomBuilderClassName.SuperClass.Builder()\";\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderImpl extends SuperBuilderWithCustomBuilderClassName.SuperClass.Builder<SuperBuilderWithCustomBuilderClassName.SuperClass, SuperBuilderWithCustomBuilderClassName.SuperClass.BuilderImpl> {\n      private BuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithCustomBuilderClassName.SuperClass.BuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithCustomBuilderClassName.SuperClass build() {\n        return new SuperBuilderWithCustomBuilderClassName.SuperClass(this);\n      }\n    }\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperClass(final SuperBuilderWithCustomBuilderClassName.SuperClass.Builder<?, ?> b) {\n      super();\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithCustomBuilderClassName.SuperClass.Builder<?, ?> builder() {\n      return new SuperBuilderWithCustomBuilderClassName.SuperClass.BuilderImpl();\n    }\n  }\n  static @lombok.experimental.SuperBuilder class SubClass extends SuperClass {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class Builder<C extends SuperBuilderWithCustomBuilderClassName.SubClass, B extends SuperBuilderWithCustomBuilderClassName.SubClass.Builder<C, B>> extends SuperClass.Builder<C, B> {\n      public Builder() {\n        super();\n      }\n      protected abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((\"SuperBuilderWithCustomBuilderClassName.SubClass.Builder(super=\" + super.toString()) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class BuilderImpl extends SuperBuilderWithCustomBuilderClassName.SubClass.Builder<SuperBuilderWithCustomBuilderClassName.SubClass, SuperBuilderWithCustomBuilderClassName.SubClass.BuilderImpl> {\n      private BuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithCustomBuilderClassName.SubClass.BuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithCustomBuilderClassName.SubClass build() {\n        return new SuperBuilderWithCustomBuilderClassName.SubClass(this);\n      }\n    }\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated SubClass(final SuperBuilderWithCustomBuilderClassName.SubClass.Builder<?, ?> b) {\n      super(b);\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithCustomBuilderClassName.SubClass.Builder<?, ?> builder() {\n      return new SuperBuilderWithCustomBuilderClassName.SubClass.BuilderImpl();\n    }\n  }\n  SuperBuilderWithCustomBuilderClassName() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderWithCustomBuilderMethod.java",
    "content": "import java.util.List;\npublic class SuperBuilderWithCustomBuilderMethod {\n  public static @lombok.experimental.SuperBuilder class Parent<A> {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilder<A, C extends SuperBuilderWithCustomBuilderMethod.Parent<A>, B extends SuperBuilderWithCustomBuilderMethod.Parent.ParentBuilder<A, C, B>> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated A field1;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> items;\n      public ParentBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B field1(final A field1) {\n        this.field1 = field1;\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B item(final String item) {\n        if ((this.items == null))\n            this.items = new java.util.ArrayList<String>();\n        this.items.add(item);\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B items(final java.util.Collection<? extends String> items) {\n        if ((items == null))\n            {\n              throw new java.lang.NullPointerException(\"items cannot be null\");\n            }\n        if ((this.items == null))\n            this.items = new java.util.ArrayList<String>();\n        this.items.addAll(items);\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B clearItems() {\n        if ((this.items != null))\n            this.items.clear();\n        return self();\n      }\n      protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((\"SuperBuilderWithCustomBuilderMethod.Parent.ParentBuilder(field1=\" + this.field1) + \", items=\") + this.items) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilderImpl<A> extends SuperBuilderWithCustomBuilderMethod.Parent.ParentBuilder<A, SuperBuilderWithCustomBuilderMethod.Parent<A>, SuperBuilderWithCustomBuilderMethod.Parent.ParentBuilderImpl<A>> {\n      private ParentBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithCustomBuilderMethod.Parent.ParentBuilderImpl<A> self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithCustomBuilderMethod.Parent<A> build() {\n        return new SuperBuilderWithCustomBuilderMethod.Parent<A>(this);\n      }\n    }\n    A field1;\n    @lombok.Singular List<String> items;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Parent(final SuperBuilderWithCustomBuilderMethod.Parent.ParentBuilder<A, ?, ?> b) {\n      super();\n      this.field1 = b.field1;\n      java.util.List<String> items;\n      switch (((b.items == null) ? 0 : b.items.size())) {\n      case 0 :\n          items = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          items = java.util.Collections.singletonList(b.items.get(0));\n          break;\n      default :\n          items = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(b.items));\n      }\n      this.items = items;\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <A>SuperBuilderWithCustomBuilderMethod.Parent.ParentBuilder<A, ?, ?> builder() {\n      return new SuperBuilderWithCustomBuilderMethod.Parent.ParentBuilderImpl<A>();\n    }\n  }\n  public static @lombok.experimental.SuperBuilder class Child<A> extends Parent<A> {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilder<A, C extends SuperBuilderWithCustomBuilderMethod.Child<A>, B extends SuperBuilderWithCustomBuilderMethod.Child.ChildBuilder<A, C, B>> extends Parent.ParentBuilder<A, C, B> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated double field3;\n      public ChildBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B field3(final double field3) {\n        this.field3 = field3;\n        return self();\n      }\n      protected abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((\"SuperBuilderWithCustomBuilderMethod.Child.ChildBuilder(super=\" + super.toString()) + \", field3=\") + this.field3) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilderImpl<A> extends SuperBuilderWithCustomBuilderMethod.Child.ChildBuilder<A, SuperBuilderWithCustomBuilderMethod.Child<A>, SuperBuilderWithCustomBuilderMethod.Child.ChildBuilderImpl<A>> {\n      private ChildBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithCustomBuilderMethod.Child.ChildBuilderImpl<A> self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithCustomBuilderMethod.Child<A> build() {\n        return new SuperBuilderWithCustomBuilderMethod.Child<A>(this);\n      }\n    }\n    double field3;\n    public static <A>ChildBuilder<A, ?, ?> builder() {\n      return new ChildBuilderImpl<A>().item(\"default item\");\n    }\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Child(final SuperBuilderWithCustomBuilderMethod.Child.ChildBuilder<A, ?, ?> b) {\n      super(b);\n      this.field3 = b.field3;\n    }\n  }\n  public SuperBuilderWithCustomBuilderMethod() {\n    super();\n  }\n  public static void test() {\n    Child<Integer> x = Child.<Integer>builder().field3(0.0).field1(5).item(\"\").build();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderWithDefaults.java",
    "content": "import java.util.List;\npublic class SuperBuilderWithDefaults {\n  public static @lombok.experimental.SuperBuilder class Parent<N extends Number> {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilder<N extends Number, C extends SuperBuilderWithDefaults.Parent<N>, B extends SuperBuilderWithDefaults.Parent.ParentBuilder<N, C, B>> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated long millis$value;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean millis$set;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated N numberField$value;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean numberField$set;\n      public ParentBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B millis(final long millis) {\n        this.millis$value = millis;\n        millis$set = true;\n        return self();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B numberField(final N numberField) {\n        this.numberField$value = numberField;\n        numberField$set = true;\n        return self();\n      }\n      protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((\"SuperBuilderWithDefaults.Parent.ParentBuilder(millis$value=\" + this.millis$value) + \", numberField$value=\") + this.numberField$value) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilderImpl<N extends Number> extends SuperBuilderWithDefaults.Parent.ParentBuilder<N, SuperBuilderWithDefaults.Parent<N>, SuperBuilderWithDefaults.Parent.ParentBuilderImpl<N>> {\n      private ParentBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithDefaults.Parent.ParentBuilderImpl<N> self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithDefaults.Parent<N> build() {\n        return new SuperBuilderWithDefaults.Parent<N>(this);\n      }\n    }\n    private @lombok.Builder.Default long millis;\n    private @lombok.Builder.Default N numberField;\n    private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <N extends Number>long $default$millis() {\n      return System.currentTimeMillis();\n    }\n    private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <N extends Number>N $default$numberField() {\n      return null;\n    }\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Parent(final SuperBuilderWithDefaults.Parent.ParentBuilder<N, ?, ?> b) {\n      super();\n      if (b.millis$set)\n          this.millis = b.millis$value;\n      else\n          this.millis = SuperBuilderWithDefaults.Parent.<N>$default$millis();\n      if (b.numberField$set)\n          this.numberField = b.numberField$value;\n      else\n          this.numberField = SuperBuilderWithDefaults.Parent.<N>$default$numberField();\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <N extends Number>SuperBuilderWithDefaults.Parent.ParentBuilder<N, ?, ?> builder() {\n      return new SuperBuilderWithDefaults.Parent.ParentBuilderImpl<N>();\n    }\n  }\n  public static @lombok.experimental.SuperBuilder class Child extends Parent<Integer> {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilder<C extends SuperBuilderWithDefaults.Child, B extends SuperBuilderWithDefaults.Child.ChildBuilder<C, B>> extends Parent.ParentBuilder<Integer, C, B> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated double doubleField$value;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean doubleField$set;\n      public ChildBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B doubleField(final double doubleField) {\n        this.doubleField$value = doubleField;\n        doubleField$set = true;\n        return self();\n      }\n      protected abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((\"SuperBuilderWithDefaults.Child.ChildBuilder(super=\" + super.toString()) + \", doubleField$value=\") + this.doubleField$value) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilderImpl extends SuperBuilderWithDefaults.Child.ChildBuilder<SuperBuilderWithDefaults.Child, SuperBuilderWithDefaults.Child.ChildBuilderImpl> {\n      private ChildBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithDefaults.Child.ChildBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithDefaults.Child build() {\n        return new SuperBuilderWithDefaults.Child(this);\n      }\n    }\n    private @lombok.Builder.Default double doubleField;\n    private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated double $default$doubleField() {\n      return Math.PI;\n    }\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Child(final SuperBuilderWithDefaults.Child.ChildBuilder<?, ?> b) {\n      super(b);\n      if (b.doubleField$set)\n          this.doubleField = b.doubleField$value;\n      else\n          this.doubleField = SuperBuilderWithDefaults.Child.$default$doubleField();\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithDefaults.Child.ChildBuilder<?, ?> builder() {\n      return new SuperBuilderWithDefaults.Child.ChildBuilderImpl();\n    }\n  }\n  public SuperBuilderWithDefaults() {\n    super();\n  }\n  public static void test() {\n    Child x = Child.builder().doubleField(0.1).numberField(5).millis(1234567890L).build();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderWithDefaultsAndTargetTyping.java",
    "content": "import java.util.Arrays;\nimport lombok.Builder;\npublic class SuperBuilderWithDefaultsAndTargetTyping {\n  public static @lombok.experimental.SuperBuilder class Parent {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilder<C extends SuperBuilderWithDefaultsAndTargetTyping.Parent, B extends SuperBuilderWithDefaultsAndTargetTyping.Parent.ParentBuilder<C, B>> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String foo$value;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean foo$set;\n      public ParentBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B foo(final String foo) {\n        this.foo$value = foo;\n        foo$set = true;\n        return self();\n      }\n      protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((\"SuperBuilderWithDefaultsAndTargetTyping.Parent.ParentBuilder(foo$value=\" + this.foo$value) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilderImpl extends SuperBuilderWithDefaultsAndTargetTyping.Parent.ParentBuilder<SuperBuilderWithDefaultsAndTargetTyping.Parent, SuperBuilderWithDefaultsAndTargetTyping.Parent.ParentBuilderImpl> {\n      private ParentBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithDefaultsAndTargetTyping.Parent.ParentBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithDefaultsAndTargetTyping.Parent build() {\n        return new SuperBuilderWithDefaultsAndTargetTyping.Parent(this);\n      }\n    }\n    private @lombok.Builder.Default String foo;\n    private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated String $default$foo() {\n      return doSth(Arrays.asList(1), Arrays.asList('a'));\n    }\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Parent(final SuperBuilderWithDefaultsAndTargetTyping.Parent.ParentBuilder<?, ?> b) {\n      super();\n      if (b.foo$set)\n          this.foo = b.foo$value;\n      else\n          this.foo = SuperBuilderWithDefaultsAndTargetTyping.Parent.$default$foo();\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithDefaultsAndTargetTyping.Parent.ParentBuilder<?, ?> builder() {\n      return new SuperBuilderWithDefaultsAndTargetTyping.Parent.ParentBuilderImpl();\n    }\n  }\n  public static @lombok.experimental.SuperBuilder class Child extends Parent {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilder<C extends SuperBuilderWithDefaultsAndTargetTyping.Child, B extends SuperBuilderWithDefaultsAndTargetTyping.Child.ChildBuilder<C, B>> extends Parent.ParentBuilder<C, B> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String foo$value;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean foo$set;\n      public ChildBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B foo(final String foo) {\n        this.foo$value = foo;\n        foo$set = true;\n        return self();\n      }\n      protected abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((\"SuperBuilderWithDefaultsAndTargetTyping.Child.ChildBuilder(super=\" + super.toString()) + \", foo$value=\") + this.foo$value) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilderImpl extends SuperBuilderWithDefaultsAndTargetTyping.Child.ChildBuilder<SuperBuilderWithDefaultsAndTargetTyping.Child, SuperBuilderWithDefaultsAndTargetTyping.Child.ChildBuilderImpl> {\n      private ChildBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithDefaultsAndTargetTyping.Child.ChildBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithDefaultsAndTargetTyping.Child build() {\n        return new SuperBuilderWithDefaultsAndTargetTyping.Child(this);\n      }\n    }\n    private @lombok.Builder.Default String foo;\n    private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated String $default$foo() {\n      return doSth(Arrays.asList(1), Arrays.asList('a'));\n    }\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Child(final SuperBuilderWithDefaultsAndTargetTyping.Child.ChildBuilder<?, ?> b) {\n      super(b);\n      if (b.foo$set)\n          this.foo = b.foo$value;\n      else\n          this.foo = SuperBuilderWithDefaultsAndTargetTyping.Child.$default$foo();\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithDefaultsAndTargetTyping.Child.ChildBuilder<?, ?> builder() {\n      return new SuperBuilderWithDefaultsAndTargetTyping.Child.ChildBuilderImpl();\n    }\n  }\n  public SuperBuilderWithDefaultsAndTargetTyping() {\n    super();\n  }\n  static String doSth(java.util.List<Integer> i, java.util.List<Character> c) {\n    return null;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderWithExistingConstructor.java",
    "content": "public @lombok.experimental.SuperBuilder class SuperBuilderWithExistingConstructor {\n  public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class SuperBuilderWithExistingConstructorBuilder<C extends SuperBuilderWithExistingConstructor, B extends SuperBuilderWithExistingConstructor.SuperBuilderWithExistingConstructorBuilder<C, B>> {\n    public SuperBuilderWithExistingConstructorBuilder() {\n      super();\n    }\n    protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n    public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return \"SuperBuilderWithExistingConstructor.SuperBuilderWithExistingConstructorBuilder()\";\n    }\n  }\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class SuperBuilderWithExistingConstructorBuilderImpl extends SuperBuilderWithExistingConstructor.SuperBuilderWithExistingConstructorBuilder<SuperBuilderWithExistingConstructor, SuperBuilderWithExistingConstructor.SuperBuilderWithExistingConstructorBuilderImpl> {\n    private SuperBuilderWithExistingConstructorBuilderImpl() {\n      super();\n    }\n    protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithExistingConstructor.SuperBuilderWithExistingConstructorBuilderImpl self() {\n      return this;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithExistingConstructor build() {\n      return new SuperBuilderWithExistingConstructor(this);\n    }\n  }\n  public SuperBuilderWithExistingConstructor() {\n    super();\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithExistingConstructor(final SuperBuilderWithExistingConstructor.SuperBuilderWithExistingConstructorBuilder<?, ?> b) {\n    super();\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithExistingConstructor.SuperBuilderWithExistingConstructorBuilder<?, ?> builder() {\n    return new SuperBuilderWithExistingConstructor.SuperBuilderWithExistingConstructorBuilderImpl();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderWithGenerics.java",
    "content": "import java.util.List;\npublic class SuperBuilderWithGenerics {\n  public static @lombok.experimental.SuperBuilder class Parent<A> {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilder<A, C extends SuperBuilderWithGenerics.Parent<A>, B extends SuperBuilderWithGenerics.Parent.ParentBuilder<A, C, B>> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated A field1;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> items;\n      public ParentBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B field1(final A field1) {\n        this.field1 = field1;\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B item(final String item) {\n        if ((this.items == null))\n            this.items = new java.util.ArrayList<String>();\n        this.items.add(item);\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B items(final java.util.Collection<? extends String> items) {\n        if ((items == null))\n            {\n              throw new java.lang.NullPointerException(\"items cannot be null\");\n            }\n        if ((this.items == null))\n            this.items = new java.util.ArrayList<String>();\n        this.items.addAll(items);\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B clearItems() {\n        if ((this.items != null))\n            this.items.clear();\n        return self();\n      }\n      protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((\"SuperBuilderWithGenerics.Parent.ParentBuilder(field1=\" + this.field1) + \", items=\") + this.items) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilderImpl<A> extends SuperBuilderWithGenerics.Parent.ParentBuilder<A, SuperBuilderWithGenerics.Parent<A>, SuperBuilderWithGenerics.Parent.ParentBuilderImpl<A>> {\n      private ParentBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithGenerics.Parent.ParentBuilderImpl<A> self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithGenerics.Parent<A> build() {\n        return new SuperBuilderWithGenerics.Parent<A>(this);\n      }\n    }\n    A field1;\n    @lombok.Singular List<String> items;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Parent(final SuperBuilderWithGenerics.Parent.ParentBuilder<A, ?, ?> b) {\n      super();\n      this.field1 = b.field1;\n      java.util.List<String> items;\n      switch (((b.items == null) ? 0 : b.items.size())) {\n      case 0 :\n          items = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          items = java.util.Collections.singletonList(b.items.get(0));\n          break;\n      default :\n          items = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(b.items));\n      }\n      this.items = items;\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <A>SuperBuilderWithGenerics.Parent.ParentBuilder<A, ?, ?> builder() {\n      return new SuperBuilderWithGenerics.Parent.ParentBuilderImpl<A>();\n    }\n  }\n  public static @lombok.experimental.SuperBuilder class Child<A> extends Parent<A> {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilder<A, C extends SuperBuilderWithGenerics.Child<A>, B extends SuperBuilderWithGenerics.Child.ChildBuilder<A, C, B>> extends Parent.ParentBuilder<A, C, B> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated double field3;\n      public ChildBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B field3(final double field3) {\n        this.field3 = field3;\n        return self();\n      }\n      protected abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((\"SuperBuilderWithGenerics.Child.ChildBuilder(super=\" + super.toString()) + \", field3=\") + this.field3) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilderImpl<A> extends SuperBuilderWithGenerics.Child.ChildBuilder<A, SuperBuilderWithGenerics.Child<A>, SuperBuilderWithGenerics.Child.ChildBuilderImpl<A>> {\n      private ChildBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithGenerics.Child.ChildBuilderImpl<A> self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithGenerics.Child<A> build() {\n        return new SuperBuilderWithGenerics.Child<A>(this);\n      }\n    }\n    double field3;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Child(final SuperBuilderWithGenerics.Child.ChildBuilder<A, ?, ?> b) {\n      super(b);\n      this.field3 = b.field3;\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <A>SuperBuilderWithGenerics.Child.ChildBuilder<A, ?, ?> builder() {\n      return new SuperBuilderWithGenerics.Child.ChildBuilderImpl<A>();\n    }\n  }\n  public SuperBuilderWithGenerics() {\n    super();\n  }\n  public static void test() {\n    Child<Integer> x = Child.<Integer>builder().field3(0.0).field1(5).item(\"\").build();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderWithGenerics2.java",
    "content": "import java.util.List;\npublic class SuperBuilderWithGenerics2 {\n  public static @lombok.experimental.SuperBuilder class Parent<A> {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilder<A, C extends SuperBuilderWithGenerics2.Parent<A>, B extends SuperBuilderWithGenerics2.Parent.ParentBuilder<A, C, B>> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated A field1;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> items;\n      public ParentBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B field1(final A field1) {\n        this.field1 = field1;\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B item(final String item) {\n        if ((this.items == null))\n            this.items = new java.util.ArrayList<String>();\n        this.items.add(item);\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B items(final java.util.Collection<? extends String> items) {\n        if ((items == null))\n            {\n              throw new java.lang.NullPointerException(\"items cannot be null\");\n            }\n        if ((this.items == null))\n            this.items = new java.util.ArrayList<String>();\n        this.items.addAll(items);\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B clearItems() {\n        if ((this.items != null))\n            this.items.clear();\n        return self();\n      }\n      protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((\"SuperBuilderWithGenerics2.Parent.ParentBuilder(field1=\" + this.field1) + \", items=\") + this.items) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilderImpl<A> extends SuperBuilderWithGenerics2.Parent.ParentBuilder<A, SuperBuilderWithGenerics2.Parent<A>, SuperBuilderWithGenerics2.Parent.ParentBuilderImpl<A>> {\n      private ParentBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithGenerics2.Parent.ParentBuilderImpl<A> self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithGenerics2.Parent<A> build() {\n        return new SuperBuilderWithGenerics2.Parent<A>(this);\n      }\n    }\n    A field1;\n    @lombok.Singular List<String> items;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Parent(final SuperBuilderWithGenerics2.Parent.ParentBuilder<A, ?, ?> b) {\n      super();\n      this.field1 = b.field1;\n      java.util.List<String> items;\n      switch (((b.items == null) ? 0 : b.items.size())) {\n      case 0 :\n          items = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          items = java.util.Collections.singletonList(b.items.get(0));\n          break;\n      default :\n          items = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(b.items));\n      }\n      this.items = items;\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <A>SuperBuilderWithGenerics2.Parent.ParentBuilder<A, ?, ?> builder() {\n      return new SuperBuilderWithGenerics2.Parent.ParentBuilderImpl<A>();\n    }\n  }\n  public static @lombok.experimental.SuperBuilder(builderMethodName = \"builder2\") class Child<A> extends Parent<String> {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilder<A, C extends SuperBuilderWithGenerics2.Child<A>, B extends SuperBuilderWithGenerics2.Child.ChildBuilder<A, C, B>> extends Parent.ParentBuilder<String, C, B> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated A field3;\n      public ChildBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B field3(final A field3) {\n        this.field3 = field3;\n        return self();\n      }\n      protected abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((\"SuperBuilderWithGenerics2.Child.ChildBuilder(super=\" + super.toString()) + \", field3=\") + this.field3) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilderImpl<A> extends SuperBuilderWithGenerics2.Child.ChildBuilder<A, SuperBuilderWithGenerics2.Child<A>, SuperBuilderWithGenerics2.Child.ChildBuilderImpl<A>> {\n      private ChildBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithGenerics2.Child.ChildBuilderImpl<A> self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithGenerics2.Child<A> build() {\n        return new SuperBuilderWithGenerics2.Child<A>(this);\n      }\n    }\n    A field3;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Child(final SuperBuilderWithGenerics2.Child.ChildBuilder<A, ?, ?> b) {\n      super(b);\n      this.field3 = b.field3;\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <A>SuperBuilderWithGenerics2.Child.ChildBuilder<A, ?, ?> builder2() {\n      return new SuperBuilderWithGenerics2.Child.ChildBuilderImpl<A>();\n    }\n  }\n  public SuperBuilderWithGenerics2() {\n    super();\n  }\n  public static void test() {\n    Child<Integer> x = Child.<Integer>builder2().field3(1).field1(\"value\").item(\"\").build();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderWithGenerics3.java",
    "content": "import java.util.List;\npublic class SuperBuilderWithGenerics3 {\n  public static @lombok.experimental.SuperBuilder class Parent<A> {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilder<A, C extends SuperBuilderWithGenerics3.Parent<A>, B extends SuperBuilderWithGenerics3.Parent.ParentBuilder<A, C, B>> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String str;\n      public ParentBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B str(final String str) {\n        this.str = str;\n        return self();\n      }\n      protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((\"SuperBuilderWithGenerics3.Parent.ParentBuilder(str=\" + this.str) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilderImpl<A> extends SuperBuilderWithGenerics3.Parent.ParentBuilder<A, SuperBuilderWithGenerics3.Parent<A>, SuperBuilderWithGenerics3.Parent.ParentBuilderImpl<A>> {\n      private ParentBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithGenerics3.Parent.ParentBuilderImpl<A> self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithGenerics3.Parent<A> build() {\n        return new SuperBuilderWithGenerics3.Parent<A>(this);\n      }\n    }\n    private final String str;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Parent(final SuperBuilderWithGenerics3.Parent.ParentBuilder<A, ?, ?> b) {\n      super();\n      this.str = b.str;\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <A>SuperBuilderWithGenerics3.Parent.ParentBuilder<A, ?, ?> builder() {\n      return new SuperBuilderWithGenerics3.Parent.ParentBuilderImpl<A>();\n    }\n  }\n  public static @lombok.experimental.SuperBuilder class Child extends Parent<Child.SomeInnerStaticClass> {\n    public static class SomeInnerStaticClass {\n      public SomeInnerStaticClass() {\n        super();\n      }\n    }\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilder<C extends SuperBuilderWithGenerics3.Child, B extends SuperBuilderWithGenerics3.Child.ChildBuilder<C, B>> extends Parent.ParentBuilder<Child.SomeInnerStaticClass, C, B> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated double field3;\n      public ChildBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B field3(final double field3) {\n        this.field3 = field3;\n        return self();\n      }\n      protected abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((\"SuperBuilderWithGenerics3.Child.ChildBuilder(super=\" + super.toString()) + \", field3=\") + this.field3) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilderImpl extends SuperBuilderWithGenerics3.Child.ChildBuilder<SuperBuilderWithGenerics3.Child, SuperBuilderWithGenerics3.Child.ChildBuilderImpl> {\n      private ChildBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithGenerics3.Child.ChildBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithGenerics3.Child build() {\n        return new SuperBuilderWithGenerics3.Child(this);\n      }\n    }\n    double field3;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Child(final SuperBuilderWithGenerics3.Child.ChildBuilder<?, ?> b) {\n      super(b);\n      this.field3 = b.field3;\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithGenerics3.Child.ChildBuilder<?, ?> builder() {\n      return new SuperBuilderWithGenerics3.Child.ChildBuilderImpl();\n    }\n  }\n  public SuperBuilderWithGenerics3() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderWithGenericsAndToBuilder.java",
    "content": "import java.util.Map;\npublic class SuperBuilderWithGenericsAndToBuilder {\n  public static @lombok.experimental.SuperBuilder(toBuilder = true) class Parent<A> {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilder<A, C extends SuperBuilderWithGenericsAndToBuilder.Parent<A>, B extends SuperBuilderWithGenericsAndToBuilder.Parent.ParentBuilder<A, C, B>> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated A field1;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<Integer> items$key;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> items$value;\n      public ParentBuilder() {\n        super();\n      }\n      protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated B $fillValuesFrom(final C instance) {\n        SuperBuilderWithGenericsAndToBuilder.Parent.ParentBuilder.$fillValuesFromInstanceIntoBuilder(instance, this);\n        return self();\n      }\n      private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <A>void $fillValuesFromInstanceIntoBuilder(final SuperBuilderWithGenericsAndToBuilder.Parent<A> instance, final SuperBuilderWithGenericsAndToBuilder.Parent.ParentBuilder<A, ?, ?> b) {\n        b.field1(instance.field1);\n        b.items(((instance.items == null) ? java.util.Collections.<Integer, String>emptyMap() : instance.items));\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B field1(final A field1) {\n        this.field1 = field1;\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B item(final Integer itemKey, final String itemValue) {\n        if ((this.items$key == null))\n            {\n              this.items$key = new java.util.ArrayList<Integer>();\n              this.items$value = new java.util.ArrayList<String>();\n            }\n        this.items$key.add(itemKey);\n        this.items$value.add(itemValue);\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B items(final java.util.Map<? extends Integer, ? extends String> items) {\n        if ((items == null))\n            {\n              throw new java.lang.NullPointerException(\"items cannot be null\");\n            }\n        if ((this.items$key == null))\n            {\n              this.items$key = new java.util.ArrayList<Integer>();\n              this.items$value = new java.util.ArrayList<String>();\n            }\n        for (java.util.Map.Entry<? extends Integer, ? extends String> $lombokEntry : items.entrySet()) \n          {\n            this.items$key.add($lombokEntry.getKey());\n            this.items$value.add($lombokEntry.getValue());\n          }\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B clearItems() {\n        if ((this.items$key != null))\n            {\n              this.items$key.clear();\n              this.items$value.clear();\n            }\n        return self();\n      }\n      protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((((\"SuperBuilderWithGenericsAndToBuilder.Parent.ParentBuilder(field1=\" + this.field1) + \", items$key=\") + this.items$key) + \", items$value=\") + this.items$value) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilderImpl<A> extends SuperBuilderWithGenericsAndToBuilder.Parent.ParentBuilder<A, SuperBuilderWithGenericsAndToBuilder.Parent<A>, SuperBuilderWithGenericsAndToBuilder.Parent.ParentBuilderImpl<A>> {\n      private ParentBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithGenericsAndToBuilder.Parent.ParentBuilderImpl<A> self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithGenericsAndToBuilder.Parent<A> build() {\n        return new SuperBuilderWithGenericsAndToBuilder.Parent<A>(this);\n      }\n    }\n    A field1;\n    @lombok.Singular Map<Integer, String> items;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Parent(final SuperBuilderWithGenericsAndToBuilder.Parent.ParentBuilder<A, ?, ?> b) {\n      super();\n      this.field1 = b.field1;\n      java.util.Map<Integer, String> items;\n      switch (((b.items$key == null) ? 0 : b.items$key.size())) {\n      case 0 :\n          items = java.util.Collections.emptyMap();\n          break;\n      case 1 :\n          items = java.util.Collections.singletonMap(b.items$key.get(0), b.items$value.get(0));\n          break;\n      default :\n          items = new java.util.LinkedHashMap<Integer, String>(((b.items$key.size() < 0x40000000) ? ((1 + b.items$key.size()) + ((b.items$key.size() - 3) / 3)) : java.lang.Integer.MAX_VALUE));\n          for (int $i = 0;; ($i < b.items$key.size()); $i ++) \n            items.put(b.items$key.get($i), b.items$value.get($i));\n          items = java.util.Collections.unmodifiableMap(items);\n      }\n      this.items = items;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithGenericsAndToBuilder.Parent.ParentBuilder<A, ?, ?> toBuilder() {\n      return new SuperBuilderWithGenericsAndToBuilder.Parent.ParentBuilderImpl<A>().$fillValuesFrom(this);\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <A>SuperBuilderWithGenericsAndToBuilder.Parent.ParentBuilder<A, ?, ?> builder() {\n      return new SuperBuilderWithGenericsAndToBuilder.Parent.ParentBuilderImpl<A>();\n    }\n  }\n  public static @lombok.experimental.SuperBuilder(toBuilder = true) class Child<A> extends Parent<A> {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilder<A, C extends SuperBuilderWithGenericsAndToBuilder.Child<A>, B extends SuperBuilderWithGenericsAndToBuilder.Child.ChildBuilder<A, C, B>> extends Parent.ParentBuilder<A, C, B> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated double field3;\n      public ChildBuilder() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B $fillValuesFrom(final C instance) {\n        super.$fillValuesFrom(instance);\n        SuperBuilderWithGenericsAndToBuilder.Child.ChildBuilder.$fillValuesFromInstanceIntoBuilder(instance, this);\n        return self();\n      }\n      private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <A>void $fillValuesFromInstanceIntoBuilder(final SuperBuilderWithGenericsAndToBuilder.Child<A> instance, final SuperBuilderWithGenericsAndToBuilder.Child.ChildBuilder<A, ?, ?> b) {\n        b.field3(instance.field3);\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B field3(final double field3) {\n        this.field3 = field3;\n        return self();\n      }\n      protected abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((\"SuperBuilderWithGenericsAndToBuilder.Child.ChildBuilder(super=\" + super.toString()) + \", field3=\") + this.field3) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilderImpl<A> extends SuperBuilderWithGenericsAndToBuilder.Child.ChildBuilder<A, SuperBuilderWithGenericsAndToBuilder.Child<A>, SuperBuilderWithGenericsAndToBuilder.Child.ChildBuilderImpl<A>> {\n      private ChildBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithGenericsAndToBuilder.Child.ChildBuilderImpl<A> self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithGenericsAndToBuilder.Child<A> build() {\n        return new SuperBuilderWithGenericsAndToBuilder.Child<A>(this);\n      }\n    }\n    double field3;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Child(final SuperBuilderWithGenericsAndToBuilder.Child.ChildBuilder<A, ?, ?> b) {\n      super(b);\n      this.field3 = b.field3;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithGenericsAndToBuilder.Child.ChildBuilder<A, ?, ?> toBuilder() {\n      return new SuperBuilderWithGenericsAndToBuilder.Child.ChildBuilderImpl<A>().$fillValuesFrom(this);\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated <A>SuperBuilderWithGenericsAndToBuilder.Child.ChildBuilder<A, ?, ?> builder() {\n      return new SuperBuilderWithGenericsAndToBuilder.Child.ChildBuilderImpl<A>();\n    }\n  }\n  public SuperBuilderWithGenericsAndToBuilder() {\n    super();\n  }\n  public static void test() {\n    Child<Integer> x = Child.<Integer>builder().field3(0.0).field1(5).item(5, \"\").build().toBuilder().build();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderWithNonNull.java",
    "content": "import java.util.List;\npublic class SuperBuilderWithNonNull {\n  public static @lombok.experimental.SuperBuilder class Parent {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilder<C extends SuperBuilderWithNonNull.Parent, B extends SuperBuilderWithNonNull.Parent.ParentBuilder<C, B>> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String nonNullParentField$value;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean nonNullParentField$set;\n      public ParentBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B nonNullParentField(final @lombok.NonNull String nonNullParentField) {\n        if ((nonNullParentField == null))\n            {\n              throw new java.lang.NullPointerException(\"nonNullParentField is marked non-null but is null\");\n            }\n        this.nonNullParentField$value = nonNullParentField;\n        nonNullParentField$set = true;\n        return self();\n      }\n      protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((\"SuperBuilderWithNonNull.Parent.ParentBuilder(nonNullParentField$value=\" + this.nonNullParentField$value) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilderImpl extends SuperBuilderWithNonNull.Parent.ParentBuilder<SuperBuilderWithNonNull.Parent, SuperBuilderWithNonNull.Parent.ParentBuilderImpl> {\n      private ParentBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithNonNull.Parent.ParentBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithNonNull.Parent build() {\n        return new SuperBuilderWithNonNull.Parent(this);\n      }\n    }\n    final @lombok.NonNull @lombok.Builder.Default String nonNullParentField;\n    private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated String $default$nonNullParentField() {\n      return \"default\";\n    }\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Parent(final SuperBuilderWithNonNull.Parent.ParentBuilder<?, ?> b) {\n      super();\n      if (b.nonNullParentField$set)\n          this.nonNullParentField = b.nonNullParentField$value;\n      else\n          this.nonNullParentField = SuperBuilderWithNonNull.Parent.$default$nonNullParentField();\n      if ((nonNullParentField == null))\n          {\n            throw new java.lang.NullPointerException(\"nonNullParentField is marked non-null but is null\");\n          }\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithNonNull.Parent.ParentBuilder<?, ?> builder() {\n      return new SuperBuilderWithNonNull.Parent.ParentBuilderImpl();\n    }\n  }\n  public static @lombok.experimental.SuperBuilder class Child extends Parent {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilder<C extends SuperBuilderWithNonNull.Child, B extends SuperBuilderWithNonNull.Child.ChildBuilder<C, B>> extends Parent.ParentBuilder<C, B> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String nonNullChildField;\n      public ChildBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B nonNullChildField(final @lombok.NonNull String nonNullChildField) {\n        if ((nonNullChildField == null))\n            {\n              throw new java.lang.NullPointerException(\"nonNullChildField is marked non-null but is null\");\n            }\n        this.nonNullChildField = nonNullChildField;\n        return self();\n      }\n      protected abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((\"SuperBuilderWithNonNull.Child.ChildBuilder(super=\" + super.toString()) + \", nonNullChildField=\") + this.nonNullChildField) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilderImpl extends SuperBuilderWithNonNull.Child.ChildBuilder<SuperBuilderWithNonNull.Child, SuperBuilderWithNonNull.Child.ChildBuilderImpl> {\n      private ChildBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithNonNull.Child.ChildBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithNonNull.Child build() {\n        return new SuperBuilderWithNonNull.Child(this);\n      }\n    }\n    @lombok.NonNull String nonNullChildField;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Child(final SuperBuilderWithNonNull.Child.ChildBuilder<?, ?> b) {\n      super(b);\n      this.nonNullChildField = b.nonNullChildField;\n      if ((nonNullChildField == null))\n          {\n            throw new java.lang.NullPointerException(\"nonNullChildField is marked non-null but is null\");\n          }\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithNonNull.Child.ChildBuilder<?, ?> builder() {\n      return new SuperBuilderWithNonNull.Child.ChildBuilderImpl();\n    }\n  }\n  public SuperBuilderWithNonNull() {\n    super();\n  }\n  public static void test() {\n    Child x = Child.builder().nonNullChildField(\"child\").nonNullParentField(\"parent\").build();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderWithOverloadedGeneratedMethods.java",
    "content": "public class SuperBuilderWithOverloadedGeneratedMethods {\n  public static @lombok.experimental.SuperBuilder class Parent {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilder<C extends SuperBuilderWithOverloadedGeneratedMethods.Parent, B extends SuperBuilderWithOverloadedGeneratedMethods.Parent.ParentBuilder<C, B>> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int self;\n      public ParentBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self(final int self) {\n        this.self = self;\n        return self();\n      }\n      protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((\"SuperBuilderWithOverloadedGeneratedMethods.Parent.ParentBuilder(self=\" + this.self) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilderImpl extends SuperBuilderWithOverloadedGeneratedMethods.Parent.ParentBuilder<SuperBuilderWithOverloadedGeneratedMethods.Parent, SuperBuilderWithOverloadedGeneratedMethods.Parent.ParentBuilderImpl> {\n      private ParentBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithOverloadedGeneratedMethods.Parent.ParentBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithOverloadedGeneratedMethods.Parent build() {\n        return new SuperBuilderWithOverloadedGeneratedMethods.Parent(this);\n      }\n    }\n    int self;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Parent(final SuperBuilderWithOverloadedGeneratedMethods.Parent.ParentBuilder<?, ?> b) {\n      super();\n      this.self = b.self;\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithOverloadedGeneratedMethods.Parent.ParentBuilder<?, ?> builder() {\n      return new SuperBuilderWithOverloadedGeneratedMethods.Parent.ParentBuilderImpl();\n    }\n  }\n  public static @lombok.experimental.SuperBuilder class Child extends Parent {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilder<C extends SuperBuilderWithOverloadedGeneratedMethods.Child, B extends SuperBuilderWithOverloadedGeneratedMethods.Child.ChildBuilder<C, B>> extends Parent.ParentBuilder<C, B> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated double build;\n      public ChildBuilder() {\n        super();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B build(final double build) {\n        this.build = build;\n        return self();\n      }\n      protected abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((\"SuperBuilderWithOverloadedGeneratedMethods.Child.ChildBuilder(super=\" + super.toString()) + \", build=\") + this.build) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilderImpl extends SuperBuilderWithOverloadedGeneratedMethods.Child.ChildBuilder<SuperBuilderWithOverloadedGeneratedMethods.Child, SuperBuilderWithOverloadedGeneratedMethods.Child.ChildBuilderImpl> {\n      private ChildBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithOverloadedGeneratedMethods.Child.ChildBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithOverloadedGeneratedMethods.Child build() {\n        return new SuperBuilderWithOverloadedGeneratedMethods.Child(this);\n      }\n    }\n    double build;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Child(final SuperBuilderWithOverloadedGeneratedMethods.Child.ChildBuilder<?, ?> b) {\n      super(b);\n      this.build = b.build;\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithOverloadedGeneratedMethods.Child.ChildBuilder<?, ?> builder() {\n      return new SuperBuilderWithOverloadedGeneratedMethods.Child.ChildBuilderImpl();\n    }\n  }\n  public SuperBuilderWithOverloadedGeneratedMethods() {\n    super();\n  }\n  public static void test() {\n    Child x = Child.builder().build(0.0).self(5).build();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderWithPrefixes.java",
    "content": "@lombok.experimental.SuperBuilder class SuperBuilderWithPrefixes {\n  public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class SuperBuilderWithPrefixesBuilder<C extends SuperBuilderWithPrefixes, B extends SuperBuilderWithPrefixes.SuperBuilderWithPrefixesBuilder<C, B>> {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int field;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int otherField;\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> items;\n    public SuperBuilderWithPrefixesBuilder() {\n      super();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B field(final int field) {\n      this.field = field;\n      return self();\n    }\n    /**\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B otherField(final int otherField) {\n      this.otherField = otherField;\n      return self();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B item(final String item) {\n      if ((this.items == null))\n          this.items = new java.util.ArrayList<String>();\n      this.items.add(item);\n      return self();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B items(final java.util.Collection<? extends String> items) {\n      if ((items == null))\n          {\n            throw new java.lang.NullPointerException(\"items cannot be null\");\n          }\n      if ((this.items == null))\n          this.items = new java.util.ArrayList<String>();\n      this.items.addAll(items);\n      return self();\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B clearItems() {\n      if ((this.items != null))\n          this.items.clear();\n      return self();\n    }\n    protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n    public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((((((\"SuperBuilderWithPrefixes.SuperBuilderWithPrefixesBuilder(field=\" + this.field) + \", otherField=\") + this.otherField) + \", items=\") + this.items) + \")\");\n    }\n  }\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class SuperBuilderWithPrefixesBuilderImpl extends SuperBuilderWithPrefixes.SuperBuilderWithPrefixesBuilder<SuperBuilderWithPrefixes, SuperBuilderWithPrefixes.SuperBuilderWithPrefixesBuilderImpl> {\n    private SuperBuilderWithPrefixesBuilderImpl() {\n      super();\n    }\n    protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithPrefixes.SuperBuilderWithPrefixesBuilderImpl self() {\n      return this;\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithPrefixes build() {\n      return new SuperBuilderWithPrefixes(this);\n    }\n  }\n  int mField;\n  int xOtherField;\n  @lombok.Singular java.util.List<String> mItems;\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithPrefixes(final SuperBuilderWithPrefixes.SuperBuilderWithPrefixesBuilder<?, ?> b) {\n    super();\n    this.mField = b.field;\n    this.xOtherField = b.otherField;\n    java.util.List<String> items;\n    switch (((b.items == null) ? 0 : b.items.size())) {\n    case 0 :\n        items = java.util.Collections.emptyList();\n        break;\n    case 1 :\n        items = java.util.Collections.singletonList(b.items.get(0));\n        break;\n    default :\n        items = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(b.items));\n    }\n    this.mItems = items;\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithPrefixes.SuperBuilderWithPrefixesBuilder<?, ?> builder() {\n    return new SuperBuilderWithPrefixes.SuperBuilderWithPrefixesBuilderImpl();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SuperBuilderWithSetterPrefix.java",
    "content": "import java.util.List;\npublic class SuperBuilderWithSetterPrefix {\n  public static @lombok.experimental.SuperBuilder(toBuilder = true,setterPrefix = \"with\") class Parent {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilder<C extends SuperBuilderWithSetterPrefix.Parent, B extends SuperBuilderWithSetterPrefix.Parent.ParentBuilder<C, B>> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int field1;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int obtainViaField;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated int obtainViaMethod;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String obtainViaStaticMethod;\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.util.ArrayList<String> items;\n      public ParentBuilder() {\n        super();\n      }\n      protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated B $fillValuesFrom(final C instance) {\n        SuperBuilderWithSetterPrefix.Parent.ParentBuilder.$fillValuesFromInstanceIntoBuilder(instance, this);\n        return self();\n      }\n      private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated void $fillValuesFromInstanceIntoBuilder(final SuperBuilderWithSetterPrefix.Parent instance, final SuperBuilderWithSetterPrefix.Parent.ParentBuilder<?, ?> b) {\n        b.withField1(instance.field1);\n        b.withObtainViaField(instance.field1);\n        b.withObtainViaMethod(instance.method());\n        b.withObtainViaStaticMethod(SuperBuilderWithSetterPrefix.Parent.staticMethod(instance));\n        b.withItems(((instance.items == null) ? java.util.Collections.<String>emptyList() : instance.items));\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B withField1(final int field1) {\n        this.field1 = field1;\n        return self();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B withObtainViaField(final int obtainViaField) {\n        this.obtainViaField = obtainViaField;\n        return self();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B withObtainViaMethod(final int obtainViaMethod) {\n        this.obtainViaMethod = obtainViaMethod;\n        return self();\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B withObtainViaStaticMethod(final String obtainViaStaticMethod) {\n        this.obtainViaStaticMethod = obtainViaStaticMethod;\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B withItem(final String item) {\n        if ((this.items == null))\n            this.items = new java.util.ArrayList<String>();\n        this.items.add(item);\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B withItems(final java.util.Collection<? extends String> items) {\n        if ((items == null))\n            {\n              throw new java.lang.NullPointerException(\"items cannot be null\");\n            }\n        if ((this.items == null))\n            this.items = new java.util.ArrayList<String>();\n        this.items.addAll(items);\n        return self();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B clearItems() {\n        if ((this.items != null))\n            this.items.clear();\n        return self();\n      }\n      protected abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((((((((\"SuperBuilderWithSetterPrefix.Parent.ParentBuilder(field1=\" + this.field1) + \", obtainViaField=\") + this.obtainViaField) + \", obtainViaMethod=\") + this.obtainViaMethod) + \", obtainViaStaticMethod=\") + this.obtainViaStaticMethod) + \", items=\") + this.items) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ParentBuilderImpl extends SuperBuilderWithSetterPrefix.Parent.ParentBuilder<SuperBuilderWithSetterPrefix.Parent, SuperBuilderWithSetterPrefix.Parent.ParentBuilderImpl> {\n      private ParentBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithSetterPrefix.Parent.ParentBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithSetterPrefix.Parent build() {\n        return new SuperBuilderWithSetterPrefix.Parent(this);\n      }\n    }\n    private int field1;\n    @lombok.Builder.ObtainVia(field = \"field1\") int obtainViaField;\n    @lombok.Builder.ObtainVia(method = \"method\") int obtainViaMethod;\n    @lombok.Builder.ObtainVia(method = \"staticMethod\",isStatic = true) String obtainViaStaticMethod;\n    @lombok.Singular List<String> items;\n    private int method() {\n      return 2;\n    }\n    private static String staticMethod(Parent instance) {\n      return \"staticMethod\";\n    }\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Parent(final SuperBuilderWithSetterPrefix.Parent.ParentBuilder<?, ?> b) {\n      super();\n      this.field1 = b.field1;\n      this.obtainViaField = b.obtainViaField;\n      this.obtainViaMethod = b.obtainViaMethod;\n      this.obtainViaStaticMethod = b.obtainViaStaticMethod;\n      java.util.List<String> items;\n      switch (((b.items == null) ? 0 : b.items.size())) {\n      case 0 :\n          items = java.util.Collections.emptyList();\n          break;\n      case 1 :\n          items = java.util.Collections.singletonList(b.items.get(0));\n          break;\n      default :\n          items = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(b.items));\n      }\n      this.items = items;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithSetterPrefix.Parent.ParentBuilder<?, ?> toBuilder() {\n      return new SuperBuilderWithSetterPrefix.Parent.ParentBuilderImpl().$fillValuesFrom(this);\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithSetterPrefix.Parent.ParentBuilder<?, ?> builder() {\n      return new SuperBuilderWithSetterPrefix.Parent.ParentBuilderImpl();\n    }\n  }\n  public static @lombok.experimental.SuperBuilder(toBuilder = true,setterPrefix = \"set\") class Child extends Parent {\n    public static abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilder<C extends SuperBuilderWithSetterPrefix.Child, B extends SuperBuilderWithSetterPrefix.Child.ChildBuilder<C, B>> extends Parent.ParentBuilder<C, B> {\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated double field3;\n      public ChildBuilder() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B $fillValuesFrom(final C instance) {\n        super.$fillValuesFrom(instance);\n        SuperBuilderWithSetterPrefix.Child.ChildBuilder.$fillValuesFromInstanceIntoBuilder(instance, this);\n        return self();\n      }\n      private static @java.lang.SuppressWarnings(\"all\") @lombok.Generated void $fillValuesFromInstanceIntoBuilder(final SuperBuilderWithSetterPrefix.Child instance, final SuperBuilderWithSetterPrefix.Child.ChildBuilder<?, ?> b) {\n        b.setField3(instance.field3);\n      }\n      /**\n       * @return {@code this}.\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated B setField3(final double field3) {\n        this.field3 = field3;\n        return self();\n      }\n      protected abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated B self();\n      public abstract @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated C build();\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((((\"SuperBuilderWithSetterPrefix.Child.ChildBuilder(super=\" + super.toString()) + \", field3=\") + this.field3) + \")\");\n      }\n    }\n    private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated class ChildBuilderImpl extends SuperBuilderWithSetterPrefix.Child.ChildBuilder<SuperBuilderWithSetterPrefix.Child, SuperBuilderWithSetterPrefix.Child.ChildBuilderImpl> {\n      private ChildBuilderImpl() {\n        super();\n      }\n      protected @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithSetterPrefix.Child.ChildBuilderImpl self() {\n        return this;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithSetterPrefix.Child build() {\n        return new SuperBuilderWithSetterPrefix.Child(this);\n      }\n    }\n    private double field3;\n    protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated Child(final SuperBuilderWithSetterPrefix.Child.ChildBuilder<?, ?> b) {\n      super(b);\n      this.field3 = b.field3;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithSetterPrefix.Child.ChildBuilder<?, ?> toBuilder() {\n      return new SuperBuilderWithSetterPrefix.Child.ChildBuilderImpl().$fillValuesFrom(this);\n    }\n    public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated SuperBuilderWithSetterPrefix.Child.ChildBuilder<?, ?> builder() {\n      return new SuperBuilderWithSetterPrefix.Child.ChildBuilderImpl();\n    }\n  }\n  public SuperBuilderWithSetterPrefix() {\n    super();\n  }\n  public static void test() {\n    Child x = Child.builder().setField3(0.0).withField1(5).withItem(\"\").build().toBuilder().build();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SynchronizedInAnonymousClass.java",
    "content": "import lombok.Synchronized;\npublic class SynchronizedInAnonymousClass {\n  Object annonymous = new Object() {\n    class Inner {\n      private final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.Object $lock = new java.lang.Object[0];\n      Inner() {\n        super();\n      }\n      public @Synchronized void foo() {\n        synchronized (this.$lock)\n          {\n            String foo = \"bar\";\n          }\n      }\n    }\n    x() {\n      super();\n    }\n  };\n  public SynchronizedInAnonymousClass() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SynchronizedInInitializer.java",
    "content": "import lombok.Synchronized;\npublic class SynchronizedInInitializer {\n  public static final Runnable SYNCHRONIZED = new Runnable() {\n    private final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.Object $lock = new java.lang.Object[0];\n    public @Override @Synchronized void run() {\n      synchronized (this.$lock)\n        {\n          System.out.println(\"test\");\n        }\n    }\n  };\n  <clinit>() {\n  }\n  public SynchronizedInInitializer() {\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SynchronizedInRecord.java",
    "content": "import lombok.Synchronized;\npublic record SynchronizedInRecord(String a, String b) {\n  public @Synchronized void foo() {\n    String foo = \"bar\";\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SynchronizedName.java",
    "content": "class SynchronizedName {\n  private Object read = new Object();\n  private static Object READ = new Object();\n  <clinit>() {\n  }\n  SynchronizedName() {\n    super();\n  }\n  @lombok.Synchronized(\"read\") void test1() {\n    synchronized (this.read)\n      {\n        System.out.println(\"one\");\n      }\n  }\n  @lombok.Synchronized(\"READ\") void test4() {\n    synchronized (SynchronizedName.READ)\n      {\n        System.out.println(\"four\");\n      }\n  }\n  @lombok.Synchronized(value = \"read\") void test5() {\n    synchronized (this.read)\n      {\n        System.out.println(\"five\");\n      }\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SynchronizedNameNoSuchField.java",
    "content": "class SynchronizedNameNoSuchField {\n  private Object read = new Object();\n  private static Object READ = new Object();\n  <clinit>() {\n  }\n  SynchronizedNameNoSuchField() {\n    super();\n  }\n  @lombok.Synchronized(\"write\") void test2() {\n    System.out.println(\"two\");\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SynchronizedNameStaticToInstanceRef.java",
    "content": "class SynchronizedNameStaticToInstanceRef {\n  private Object read = new Object();\n  private static Object READ = new Object();\n  <clinit>() {\n  }\n  SynchronizedNameStaticToInstanceRef() {\n    super();\n  }\n  static @lombok.Synchronized(\"read\") void test3() {\n    System.out.println(\"three\");\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/SynchronizedOnStatic.java",
    "content": "class SynchronizedOnStatic<Z> {\n  static class Inner {\n    private static Object LCK = new Object[0];\n    <clinit>() {\n    }\n    Inner() {\n      super();\n    }\n    public @lombok.Synchronized(\"LCK\") void foo() {\n      synchronized (SynchronizedOnStatic.Inner.LCK)\n        {\n          System.out.println();\n        }\n    }\n  }\n  class Inner2 {\n    private Object LCK = new Object[0];\n    Inner2() {\n      super();\n    }\n    public @lombok.Synchronized(\"LCK\") void foo() {\n      synchronized (this.LCK)\n        {\n          System.out.println();\n        }\n    }\n  }\n  SynchronizedOnStatic() {\n    super();\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/SynchronizedPlain.java",
    "content": "import lombok.Synchronized;\nclass SynchronizedPlain1 {\n  private final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.Object $lock = new java.lang.Object[0];\n  SynchronizedPlain1() {\n    super();\n  }\n  @lombok.Synchronized void test() {\n    synchronized (this.$lock)\n      {\n        System.out.println(\"one\");\n      }\n  }\n  @Synchronized void test2() {\n    synchronized (this.$lock)\n      {\n        System.out.println(\"two\");\n      }\n  }\n}\nclass SynchronizedPlain2 {\n  private static final @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.Object $LOCK = new java.lang.Object[0];\n  <clinit>() {\n  }\n  SynchronizedPlain2() {\n    super();\n  }\n  static @lombok.Synchronized void test() {\n    synchronized (SynchronizedPlain2.$LOCK)\n      {\n        System.out.println(\"three\");\n      }\n  }\n  static @Synchronized void test2() {\n    synchronized (SynchronizedPlain2.$LOCK)\n      {\n        System.out.println(\"four\");\n      }\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/TestOperators.java",
    "content": "class TestOperators {\n  int x = 10;\n  TestOperators() {\n    super();\n  }\n  public void test() {\n    x = 12;\n    int a = (+ x);\n    boolean d = true;\n    boolean e = false;\n    boolean b;\n    a = (- x);\n    b = (! d);\n    a = (~ x);\n    a = (++ x);\n    a = (-- x);\n    a = (x ++);\n    a = (x --);\n    b = (d || e);\n    b = (d && e);\n    a = (x | a);\n    a = (x ^ a);\n    a = (x & a);\n    b = (a == x);\n    b = (a != x);\n    b = (a < x);\n    b = (a > x);\n    b = (a <= x);\n    b = (a >= x);\n    a = (a << x);\n    a = (a >> x);\n    a = (a >>> x);\n    a = (a + x);\n    a = (a - x);\n    a = (a * x);\n    a = (a / x);\n    a = (a % x);\n    a |= x;\n    a ^= x;\n    a &= x;\n    a <<= x;\n    a >>= x;\n    a >>>= x;\n    a += x;\n    a -= x;\n    a *= x;\n    a /= x;\n    a %= x;\n    a = ((a > x) ? 1 : 0);\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ToStringArray.java",
    "content": "import java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\npublic @lombok.ToString class ToStringArray {\n  int[] primitiveArray;\n  Object[] objectArray;\n  public ToStringArray() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((((\"ToStringArray(primitiveArray=\" + java.util.Arrays.toString(this.primitiveArray)) + \", objectArray=\") + java.util.Arrays.deepToString(this.objectArray)) + \")\");\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ToStringArrayTypeAnnotations.java",
    "content": "import java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\npublic @lombok.ToString class ToStringArrayTypeAnnotations {\n  @Target({ElementType.TYPE_USE}) @interface TA {\n  }\n  @TA int[] primitiveArray1;\n  int @TA [] primitiveArray2;\n  @TA Object[] objectArray1;\n  Object @TA [] objectArray2;\n  public ToStringArrayTypeAnnotations() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((((((((\"ToStringArrayTypeAnnotations(primitiveArray1=\" + java.util.Arrays.toString(this.primitiveArray1)) + \", primitiveArray2=\") + java.util.Arrays.toString(this.primitiveArray2)) + \", objectArray1=\") + java.util.Arrays.deepToString(this.objectArray1)) + \", objectArray2=\") + java.util.Arrays.deepToString(this.objectArray2)) + \")\");\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ToStringAutoExclude.java",
    "content": "@lombok.ToString class ToStringAutoExclude {\n  int x;\n  String $a;\n  transient String b;\n  ToStringAutoExclude() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((((\"ToStringAutoExclude(x=\" + this.x) + \", b=\") + this.b) + \")\");\n  }\n}\n@lombok.ToString class ToStringAutoExclude2 {\n  int x;\n  @lombok.ToString.Include String $a;\n  transient String b;\n  ToStringAutoExclude2() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((((((\"ToStringAutoExclude2(x=\" + this.x) + \", $a=\") + this.$a) + \", b=\") + this.b) + \")\");\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ToStringAutoSuper.java",
    "content": "@lombok.ToString class ToStringAutoSuperWithNoParent {\n  ToStringAutoSuperWithNoParent() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return \"ToStringAutoSuperWithNoParent()\";\n  }\n}\n@lombok.ToString class ToStringAutoSuperWithParent extends ToStringAutoSuperWithNoParent {\n  ToStringAutoSuperWithParent() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((\"ToStringAutoSuperWithParent(super=\" + super.toString()) + \")\");\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ToStringConfiguration.java",
    "content": "import lombok.ToString;\nimport lombok.Getter;\n@ToString @Getter class ToStringConfiguration {\n  int x;\n  ToStringConfiguration() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((\"ToStringConfiguration(\" + this.x) + \")\");\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getX() {\n    return this.x;\n  }\n}\n@ToString(includeFieldNames = true) class ToStringConfiguration2 {\n  int x;\n  ToStringConfiguration2() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((\"ToStringConfiguration2(x=\" + this.x) + \")\");\n  }\n}\n@ToString(doNotUseGetters = false) @Getter class ToStringConfiguration3 {\n  int x;\n  ToStringConfiguration3() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((\"ToStringConfiguration3(\" + this.getX()) + \")\");\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getX() {\n    return this.x;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ToStringEnum.java",
    "content": "import lombok.ToString;\n@ToString enum ToStringEnum1 {\n  CONSTANT(),\n  <clinit>() {\n  }\n  ToStringEnum1() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return (\"ToStringEnum1.\" + this.name());\n  }\n}\n@ToString enum ToStringEnum2 {\n  CONSTANT(),\n  int x;\n  String name;\n  <clinit>() {\n  }\n  ToStringEnum2() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((((((\"ToStringEnum2.\" + this.name()) + \"(x=\") + this.x) + \", name=\") + this.name) + \")\");\n  }\n}\nclass ToStringEnum3 {\n  @ToString enum MemberEnum {\n    CONSTANT(),\n    <clinit>() {\n    }\n    MemberEnum() {\n      super();\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return (\"ToStringEnum3.MemberEnum.\" + this.name());\n    }\n  }\n  ToStringEnum3() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ToStringExplicitInclude.java",
    "content": "@lombok.ToString(onlyExplicitlyIncluded = true) class ToStringExplicitInclude {\n  int x;\n  ToStringExplicitInclude() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return \"ToStringExplicitInclude()\";\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ToStringExplicitIncludeConf.java",
    "content": "@lombok.ToString class ToStringExplicitIncludeConf {\n  int x;\n  @lombok.ToString.Include int y;\n  ToStringExplicitIncludeConf() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((\"ToStringExplicitIncludeConf(y=\" + this.y) + \")\");\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ToStringInAnonymousClass.java",
    "content": "import lombok.ToString;\npublic class ToStringInAnonymousClass {\n  Object annonymous = new Object() {\n    @ToString class Inner {\n      private String string;\n      Inner() {\n        super();\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((\"Inner(string=\" + this.string) + \")\");\n      }\n    }\n    x() {\n      super();\n    }\n  };\n  public ToStringInAnonymousClass() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ToStringInner.java",
    "content": "import lombok.ToString;\n@ToString class ToStringOuter {\n  @ToString class ToStringInner {\n    int y;\n    ToStringInner() {\n      super();\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"ToStringOuter.ToStringInner(y=\" + this.y) + \")\");\n    }\n  }\n  static @ToString class ToStringStaticInner {\n    int y;\n    ToStringStaticInner() {\n      super();\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"ToStringOuter.ToStringStaticInner(y=\" + this.y) + \")\");\n    }\n  }\n  class ToStringMiddle {\n    @ToString class ToStringMoreInner {\n      String name;\n      ToStringMoreInner() {\n        super();\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((\"ToStringOuter.ToStringMiddle.ToStringMoreInner(name=\" + this.name) + \")\");\n      }\n    }\n    ToStringMiddle() {\n      super();\n    }\n  }\n  int x;\n  String name;\n  ToStringOuter() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((((\"ToStringOuter(x=\" + this.x) + \", name=\") + this.name) + \")\");\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ToStringNewStyle.java",
    "content": "import lombok.ToString;\npublic @ToString class ToStringNewStyle {\n  @ToString.Include(name = \"a\") int b;\n  double c;\n  int f;\n  @ToString.Include(name = \"e\") int d;\n  int g;\n  @ToString.Include(rank = (- 1)) int h;\n  int i;\n  @ToString.Exclude int j;\n  public ToStringNewStyle() {\n    super();\n  }\n  @ToString.Include int f() {\n    return 0;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((((((((((((((\"ToStringNewStyle(a=\" + this.b) + \", c=\") + this.c) + \", e=\") + this.d) + \", f=\") + this.f()) + \", g=\") + this.g) + \", i=\") + this.i) + \", h=\") + this.h) + \")\");\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ToStringOnRecord.java",
    "content": "// version 14:\nimport lombok.ToString;\npublic @ToString record ToStringOnRecord(String a, String b) {\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ToStringPlain.java",
    "content": "import lombok.ToString;\n@lombok.ToString class ToString1 {\n  int x;\n  String name;\n  ToString1() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((((\"ToString1(x=\" + this.x) + \", name=\") + this.name) + \")\");\n  }\n}\n@ToString class ToString2 {\n  int x;\n  String name;\n  ToString2() {\n    super();\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((((\"ToString2(x=\" + this.x) + \", name=\") + this.name) + \")\");\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/Tolerate.java",
    "content": "import java.util.regex.Pattern;\n@lombok.Setter @lombok.Getter class Tolerate {\n  private Pattern pattern;\n  Tolerate() {\n    super();\n  }\n  public @lombok.experimental.Tolerate void setPattern(String pattern) {\n    setPattern(Pattern.compile(pattern));\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setPattern(final Pattern pattern) {\n    this.pattern = pattern;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Pattern getPattern() {\n    return this.pattern;\n  }\n}\n@lombok.Getter @lombok.experimental.Wither @lombok.AllArgsConstructor class Tolerate2 {\n  private final Pattern pattern;\n  public @lombok.experimental.Tolerate Tolerate2 withPattern(String pattern) {\n    return withPattern(Pattern.compile(pattern));\n  }\n  public Tolerate2 withPattern(String nameGlob, String extensionGlob) {\n    return withPattern(((nameGlob.replace(\"*\", \".*\") + \"\\\\.\") + extensionGlob.replace(\"*\", \".*\")));\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Pattern getPattern() {\n    return this.pattern;\n  }\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Tolerate2 withPattern(final Pattern pattern) {\n    return ((this.pattern == pattern) ? this : new Tolerate2(pattern));\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Tolerate2(final Pattern pattern) {\n    super();\n    this.pattern = pattern;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/TrickyTypeResolution.java",
    "content": "import lombok.*;\nclass TrickyDoNothing {\n  @interface Getter {\n  }\n  @Getter int x;\n  TrickyDoNothing() {\n    super();\n  }\n}\nclass TrickyDoNothing2 {\n  @interface Getter {\n  }\n  @Getter int x;\n  TrickyDoNothing2() {\n    super();\n  }\n}\nclass TrickySuccess {\n  @Getter int x;\n  TrickySuccess() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getX() {\n    return this.x;\n  }\n}\nclass TrickyDoNothing3 {\n  TrickyDoNothing3() {\n    super();\n  }\n  void test() {\n    class val {\n      val() {\n        super();\n      }\n    }\n    val x = null;\n  }\n}\nclass TrickyDoSomething {\n  TrickyDoSomething() {\n    super();\n  }\n  void test() {\n    final @val java.lang.Object x = null;\n    class val {\n      val() {\n        super();\n      }\n    }\n  }\n}\nclass DoubleTrickyDoNothing {\n  DoubleTrickyDoNothing() {\n    super();\n  }\n  void test() {\n    class val {\n      val() {\n        super();\n      }\n    }\n    for (int i = 10;; (i < 20); i ++) \n      {\n        val y = null;\n      }\n  }\n}\nclass DoubleTrickyDoSomething {\n  DoubleTrickyDoSomething() {\n    super();\n  }\n  void test() {\n    for (int j = 10;; (j < 20); j ++) \n      {\n        class val {\n          val() {\n            super();\n          }\n        }\n      }\n    for (int i = 10;; (i < 20); i ++) \n      {\n        final @val java.lang.Object y = null;\n      }\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/TrickyTypeResolution2.java",
    "content": "import lombok.*;\nclass DoNothingDueToTopLevel {\n  DoNothingDueToTopLevel() {\n    super();\n  }\n  void test() {\n    val x = null;\n  }\n}\nclass val {\n  val() {\n    super();\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/TypeUseAnnotations.java",
    "content": "import java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.List;\n@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) @interface TA {\n  int x();\n}\nclass TypeUseAnnotations {\n  class Inner {\n    Inner() {\n      super();\n    }\n  }\n  @lombok.Getter List<@TA(x = 5) String> foo;\n  @lombok.Getter List<TypeUseAnnotations.@TA(x = 5) Inner> bar;\n  TypeUseAnnotations() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated List<@TA(x = 5) String> getFoo() {\n    return this.foo;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated List<TypeUseAnnotations.@TA(x = 5) Inner> getBar() {\n    return this.bar;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/UtilityClass.java",
    "content": "final @lombok.experimental.UtilityClass class UtilityClass {\n  protected static class InnerClass {\n    private String innerInnerMember;\n    protected InnerClass() {\n      super();\n    }\n  }\n  protected static class InnerStaticClass {\n    private String innerInnerMember;\n    protected InnerStaticClass() {\n      super();\n    }\n  }\n  private static long someField = System.currentTimeMillis();\n  <clinit>() {\n  }\n  static void someMethod() {\n    System.out.println();\n    new InnerClass();\n    new InnerStaticClass();\n  }\n  private @java.lang.SuppressWarnings(\"all\") @lombok.Generated UtilityClass() {\n    super();\n    throw new java.lang.UnsupportedOperationException(\"This is a utility class and cannot be instantiated\");\n  }\n}\nclass UtilityInner {\n  static class InnerInner {\n    static final @lombok.experimental.UtilityClass class InnerInnerInner {\n      static int member;\n      <clinit>() {\n      }\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated InnerInnerInner() {\n        super();\n        throw new java.lang.UnsupportedOperationException(\"This is a utility class and cannot be instantiated\");\n      }\n    }\n    InnerInner() {\n      super();\n    }\n  }\n  enum UtilityInsideEnum {\n    static final @lombok.experimental.UtilityClass class InsideEnum {\n      static int member;\n      <clinit>() {\n      }\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated InsideEnum() {\n        super();\n        throw new java.lang.UnsupportedOperationException(\"This is a utility class and cannot be instantiated\");\n      }\n    }\n    FOO(),\n    BAR(),\n    <clinit>() {\n    }\n    UtilityInsideEnum() {\n      super();\n    }\n  }\n  interface UtilityInsideInterface {\n    final @lombok.experimental.UtilityClass class InsideInterface {\n      static int member;\n      <clinit>() {\n      }\n      private @java.lang.SuppressWarnings(\"all\") @lombok.Generated InsideInterface() {\n        super();\n        throw new java.lang.UnsupportedOperationException(\"This is a utility class and cannot be instantiated\");\n      }\n    }\n  }\n  UtilityInner() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/UtilityClassErrors.java",
    "content": "final @lombok.experimental.UtilityClass class UtilityClassErrors1 {\n  private static String someField;\n  <clinit>() {\n  }\n  protected UtilityClassErrors1() {\n    super();\n  }\n  static void method() {\n    @lombok.experimental.UtilityClass class MethodLocalClass {\n      MethodLocalClass() {\n        super();\n      }\n    }\n  }\n}\n@lombok.experimental.UtilityClass enum UtilityClassErrors2 {\n  <clinit>() {\n  }\n  UtilityClassErrors2() {\n    super();\n  }\n}\nclass UtilityClassErrors3 {\n  class NonStaticInner {\n    @lombok.experimental.UtilityClass class ThisShouldFail {\n      private String member;\n      ThisShouldFail() {\n        super();\n      }\n    }\n    NonStaticInner() {\n      super();\n    }\n  }\n  UtilityClassErrors3() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/UtilityClassGeneric.java",
    "content": "import lombok.experimental.UtilityClass;\nfinal @UtilityClass class UtilityClassGeneric {\n  static class DTO {\n    DTO() {\n      super();\n    }\n  }\n  static <T>T convertValue(Class<T> toValueType) {\n    return null;\n  }\n  static DTO convert(Object json) {\n    return convertValue(DTO.class);\n  }\n  static Object convert(DTO dto) {\n    return null;\n  }\n  private @java.lang.SuppressWarnings(\"all\") @lombok.Generated UtilityClassGeneric() {\n    super();\n    throw new java.lang.UnsupportedOperationException(\"This is a utility class and cannot be instantiated\");\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/UtilityClassInAnonymousClass.java",
    "content": "import lombok.experimental.UtilityClass;\npublic class UtilityClassInAnonymousClass {\n  Object annonymous = new Object() {\n    @UtilityClass class Inner {\n      private String string;\n      Inner() {\n        super();\n      }\n    }\n    x() {\n      super();\n    }\n  };\n  public UtilityClassInAnonymousClass() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/UtilityClassInner.java",
    "content": "@java.lang.SuppressWarnings(\"serial\") class UtilityClassInner {\n  static final @lombok.experimental.UtilityClass class UtilClass implements java.io.Serializable {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated UtilClass() {\n      super();\n      throw new java.lang.UnsupportedOperationException(\"This is a utility class and cannot be instantiated\");\n    }\n  }\n  UtilityClassInner() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/UtilityClassOnRecord.java",
    "content": "// version 14:\nimport lombok.experimental.UtilityClass;\npublic @UtilityClass record UtilityClassOnRecord(String a, String b) {\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ValAnonymousSubclassSelfReference.java",
    "content": "import java.util.Map;\nimport java.util.HashMap;\nimport lombok.val;\npublic class ValAnonymousSubclassSelfReference {\n  public ValAnonymousSubclassSelfReference() {\n    super();\n  }\n  public <T>void test(T arg) {\n    T d = arg;\n    Integer[] e = new Integer[1];\n    int[] f = new int[0];\n    java.util.Map<java.lang.String, Integer> g = new HashMap<String, Integer>();\n    Integer h = 0;\n    int i = 0;\n    final @val int j = 1;\n    final @val int k = 2;\n    new ValAnonymousSubclassSelfReference() {\n      x() {\n        super();\n      }\n    };\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/ValAnonymousSubclassWithGenerics.java",
    "content": "import java.util.*;\nimport lombok.val;\npublic class ValAnonymousSubclassWithGenerics {\n  Object object = new Object() {\n    x() {\n      super();\n    }\n    void foo() {\n      final @val int j = 1;\n    }\n  };\n  java.util.List<String> names = new java.util.ArrayList<String>() {\n    x() {\n      super();\n    }\n    public String get(int i) {\n      final @val java.lang.String result = super.get(i);\n      return result;\n    }\n  };\n  public ValAnonymousSubclassWithGenerics() {\n    super();\n  }\n  void bar() {\n    final @val int k = super.hashCode();\n    int x = k;\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/ValComplex.java",
    "content": "import lombok.val;\npublic class ValComplex {\n  private String field = \"\";\n  private static final int CONSTANT = 20;\n  <clinit>() {\n  }\n  public ValComplex() {\n    super();\n  }\n  public void testComplex() {\n    final @val char[] shouldBeCharArray = field.toCharArray();\n    final @val int shouldBeInt = CONSTANT;\n    final @val java.lang.Object lock = new Object();\n    synchronized (lock)\n      {\n        final @val int field = 20;\n        final @val int inner = 10;\n        switch (field) {\n        case 5 :\n            final @val char[] shouldBeCharArray2 = shouldBeCharArray;\n            final @val int innerInner = inner;\n        }\n      }\n    final @val java.lang.String shouldBeString = field;\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/ValDefault.java",
    "content": "interface ValDefault {\n  int size();\n  default void method() {\n    final @lombok.val int x = 1;\n    final @lombok.val int size = size();\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/ValDelegateMethodReference.java",
    "content": "import lombok.Getter;\nimport lombok.Setter;\nimport lombok.experimental.Delegate;\nimport lombok.val;\nimport java.util.function.Function;\npublic class ValDelegateMethodReference {\n  public ValDelegateMethodReference() {\n    super();\n  }\n  public void config() {\n    final @val Column<Entity, java.lang.String> column = createColumn(Entity::getValue);\n  }\n  private <V>Column<Entity, V> createColumn(Function<Entity, V> func) {\n    return new Column<>(func);\n  }\n}\nclass Column<T, V> {\n  public Column(Function<T, V> vp) {\n    super();\n  }\n}\nclass Entity {\n  private @Delegate MyDelegate innerDelegate;\n  Entity() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.Boolean getABoolean() {\n    return this.innerDelegate.getABoolean();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String getValue() {\n    return this.innerDelegate.getValue();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setABoolean(final java.lang.Boolean aBoolean) {\n    this.innerDelegate.setABoolean(aBoolean);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setValue(final java.lang.String value) {\n    this.innerDelegate.setValue(value);\n  }\n}\n@Getter @Setter class MyDelegate {\n  private String value;\n  private Boolean aBoolean;\n  MyDelegate() {\n    super();\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getValue() {\n    return this.value;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Boolean getABoolean() {\n    return this.aBoolean;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setValue(final String value) {\n    this.value = value;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setABoolean(final Boolean aBoolean) {\n    this.aBoolean = aBoolean;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ValErrors.java",
    "content": "import lombok.val;\npublic class ValErrors {\n  public ValErrors() {\n    super();\n  }\n  public void unresolvableExpression() {\n    final @val java.lang.Object c = d;\n  }\n  public void arrayInitializer() {\n    final @val java.lang.Object e = {\"foo\", \"bar\"};\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/ValFinal.java",
    "content": "import lombok.val;\npublic class ValFinal {\n  public ValFinal() {\n    super();\n  }\n  public void test() {\n    final @val int x = 10;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ValInBasicFor.java",
    "content": "import lombok.val;\npublic class ValInBasicFor {\n  public ValInBasicFor() {\n    super();\n  }\n  public void basicFor() {\n    java.util.List<String> list = java.util.Arrays.asList(\"Hello, World!\");\n    for (val shouldBe = 1;, val marked = \"\";, val error = 1.0;; ; ) \n      {\n        System.out.println(\"\");\n      }\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/ValInFor.java",
    "content": "import lombok.val;\npublic class ValInFor {\n  public ValInFor() {\n    super();\n  }\n  public void enhancedFor() {\n    java.util.List<String> list = java.util.Arrays.asList(\"Hello, World!\");\n    for (final @val java.lang.String shouldBeString : list) \n      {\n        System.out.println(shouldBeString.toLowerCase());\n        final @val java.lang.String shouldBeString2 = shouldBeString;\n      }\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/ValInLambda.java",
    "content": "import java.util.function.Function;\nimport java.util.function.Supplier;\nimport lombok.val;\nclass ValInLambda {\n  Runnable foo = (Runnable) () -> {\n  final @val int i = 1;\n  final @lombok.val java.lang.Runnable foo = ((System.currentTimeMillis() > 0) ? (Runnable) () -> {\n} : System.out::println);\n};\n  ValInLambda() {\n    super();\n  }\n  public void easyLambda() {\n    Runnable foo = (Runnable) () -> {\n  final @val int i = 1;\n};\n  }\n  public void easyIntersectionLambda() {\n    Runnable foo = (Runnable) () -> {\n  final @val int i = 1;\n};\n  }\n  public void easyLubLambda() {\n    Runnable foo = (Runnable) () -> {\n  final @lombok.val java.lang.Runnable fooInner = ((System.currentTimeMillis() > 0) ? (Runnable) () -> {\n} : System.out::println);\n};\n  }\n  public void inParameter() {\n    final @val java.util.function.Function<java.util.function.Supplier<java.lang.String>, java.lang.String> foo = (Function<Supplier<String>, String>) (<no type> s) -> s.get();\n    final @val java.lang.String foo2 = foo.apply(() -> {\n  final @val java.lang.String bar = \"\";\n  return bar;\n});\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ValInMultiDeclaration.java",
    "content": "import lombok.val;\npublic class ValInMultiDeclaration {\n  public ValInMultiDeclaration() {\n    super();\n  }\n  public void test() {\n    final @val int x = 10;\n    final @val java.lang.String y = \"\";\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ValInTryWithResources.java",
    "content": "import lombok.val;\nimport java.io.IOException;\npublic class ValInTryWithResources {\n  public ValInTryWithResources() {\n    super();\n  }\n  public void whyTryInsteadOfCleanup() throws IOException {\n    try (final @val java.io.InputStream in = getClass().getResourceAsStream(\"ValInTryWithResources.class\"))\n      {\n        final @val java.io.InputStream i = in;\n        final @val int j = in.read();\n      }\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ValInvalidParameter.java",
    "content": "import lombok.val;\npublic class ValInvalidParameter {\n  public ValInvalidParameter() {\n    super();\n  }\n  public void val() {\n    final @val java.lang.Object a = a(new NonExistingClass());\n    final @val java.lang.Object b = a(a(new NonExistingClass()));\n    final @val java.lang.Object c = nonExisitingMethod(b(1));\n    final @val java.lang.Object d = nonExistingObject.nonExistingMethod();\n    final @val java.lang.Object e = b(1).nonExistingMethod();\n    final @val java.lang.Object f = ((1 > 2) ? a(new NonExistingClass()) : a(new NonExistingClass()));\n    final @val java.lang.Object g = b2(1);\n    final @val java.lang.Object h = b2(a(\"a\"), a(null));\n    final @val java.lang.Object i = a(a(null));\n  }\n  public int a(String param) {\n    return 0;\n  }\n  public int a(Integer param) {\n    return 0;\n  }\n  public Integer b(int i) {\n    return i;\n  }\n  public Integer b2(int i, int j) {\n    return i;\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/ValLambda.java",
    "content": "import java.io.Serializable;\n\nclass ValLambda {\n  static {\n    final @lombok.val java.lang.Runnable foo = ((System.currentTimeMillis() > 0) ? (Runnable) () -> {\n} : System.out::println);\n  }\n  {\n    final @lombok.val java.lang.Runnable foo = ((System.currentTimeMillis() > 0) ? (Runnable) () -> {\n} : System.out::println);\n  }\n  <clinit>() {\n  }\n  ValLambda() {\n    super();\n  }\n  public void easyLambda() {\n    final @lombok.val java.lang.Runnable foo = (Runnable) () -> {\n};\n  }\n  public void intersectionLambda() {\n    final @lombok.val java.io.Serializable foo = (Runnable & Serializable) () -> {\n};\n    final @lombok.val java.io.Serializable bar = (java.io.Serializable & Runnable) () -> {\n};\n  }\n  public void easyLubLambda() {\n    final @lombok.val java.lang.Runnable foo = ((System.currentTimeMillis() > 0) ? (Runnable) () -> {\n} : System.out::println);\n    final @lombok.val java.lang.Runnable foo1 = ((System.currentTimeMillis() > 0) ? (Runnable) System.out::println : System.out::println);\n    final @lombok.val java.util.function.Function foo2 = ((System.currentTimeMillis() < 0) ? (java.util.function.Function) (<no type> r) -> \"\" : (<no type> r) -> System.currentTimeMillis());\n    java.util.function.Function foo3 = ((System.currentTimeMillis() < 0) ? (java.util.function.Function) (<no type> r) -> \"\" : (<no type> r) -> System.currentTimeMillis());\n    final @lombok.val java.util.function.Function<java.lang.String, java.lang.String> foo4 = ((System.currentTimeMillis() < 0) ? (java.util.function.Function<String, String>) (<no type> r) -> \"\" : (<no type> r) -> String.valueOf(System.currentTimeMillis()));\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/ValLessSimple.java",
    "content": "import lombok.val;\npublic class ValLessSimple {\n  private short field2 = 5;\n  {\n    System.out.println(\"Hello\");\n    final @val int z = 20;\n    final @val int x = 10;\n    final @val int a = z;\n    final @val short y = field2;\n  }\n  private String field = \"field\";\n  public ValLessSimple() {\n    super();\n  }\n  private String method() {\n    return \"method\";\n  }\n  private double method2() {\n    return 2.0;\n  }\n  private void testVal(String param) {\n    final @val java.lang.String fieldV = field;\n    final @val int a = 10;\n    final @val int b = 20;\n    {\n      final @val java.lang.String methodV = method();\n      final @val java.lang.String foo = (fieldV + methodV);\n    }\n  }\n  private void testValInCatchBlock() {\n    try \n      {\n        final @val int x = (1 / 0);\n      }\n    catch (ArithmeticException e)\n      {\n        final @val int y = 0;\n      }\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ValLub.java",
    "content": "class ValLub {\n  ValLub() {\n    super();\n  }\n  public void easyLub() {\n    java.util.Map<String, Number> m = java.util.Collections.emptyMap();\n    final @lombok.val java.util.Map<java.lang.String, java.lang.Number> foo = ((System.currentTimeMillis() > 0) ? m : java.util.Collections.<String, Number>emptyMap());\n  }\n  public void sillyLubWithUnboxingThatProducesErrorThatVarIsPrimitive() {\n    Integer i = 20;\n    Double d = 20.0;\n    final @lombok.val double thisShouldBePrimitiveDouble = ((System.currentTimeMillis() > 0) ? i : d);\n  }\n  public void hardLub() {\n    java.util.List<String> list = new java.util.ArrayList<String>();\n    java.util.Set<String> set = new java.util.HashSet<String>();\n    final @lombok.val java.util.Collection<java.lang.String> thisShouldBeCollection = ((System.currentTimeMillis() > 0) ? list : set);\n    thisShouldBeCollection.add(\"\");\n    String foo = thisShouldBeCollection.iterator().next();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ValNullInit.java",
    "content": "import lombok.val;\n\nclass ValNullInit {\n  ValNullInit() {\n    super();\n  }\n  void method() {\n    final @val java.lang.Object x = null;\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/ValOutersWithGenerics.java",
    "content": "import java.util.*;\nimport lombok.val;\npublic class ValOutersWithGenerics<Z> {\n  class Inner {\n    Inner() {\n      super();\n    }\n  }\n  class InnerWithGenerics<H> {\n    InnerWithGenerics() {\n      super();\n    }\n  }\n  static class SubClass extends ValOutersWithGenerics<String> {\n    SubClass() {\n      super();\n    }\n    public void testSubClassOfOutersWithGenerics() {\n      List<Inner> list = new ArrayList<Inner>();\n      final @val ValOutersWithGenerics<java.lang.String>.Inner elem = list.get(0);\n    }\n  }\n  public ValOutersWithGenerics() {\n    super();\n  }\n  public void testOutersWithGenerics() {\n    final @val java.lang.String foo = \"\";\n    List<Inner> list = new ArrayList<Inner>();\n    final @val ValOutersWithGenerics<Z>.Inner elem = list.get(0);\n  }\n  public void testLocalClasses() {\n    class Local<A> {\n      Local() {\n        super();\n      }\n    }\n    final @val Local<java.lang.String> q = new Local<String>();\n  }\n  public static void test() {\n    final @val ValOutersWithGenerics<java.lang.String> outer = new ValOutersWithGenerics<String>();\n    final @val ValOutersWithGenerics<java.lang.String>.Inner inner1 = outer.new Inner();\n    final @val ValOutersWithGenerics<java.lang.String>.InnerWithGenerics<java.lang.Integer> inner2 = outer.new InnerWithGenerics<Integer>();\n  }\n  public static void loop(Map<String, String> map) {\n    for (final @val java.util.Map.Entry<java.lang.String, java.lang.String> e : map.entrySet()) \n      {\n      }\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ValRawType.java",
    "content": "import java.util.List;\nimport lombok.val;\npublic class ValRawType {\n  static class Element {\n    Element() {\n      super();\n    }\n    public List attributes() {\n      return null;\n    }\n  }\n  static class Attribute {\n    Attribute() {\n      super();\n    }\n  }\n  public ValRawType() {\n    super();\n  }\n  public void test() {\n    Element propElement = new Element();\n    for (final @val java.lang.Object attribute : propElement.attributes()) \n      {\n        final @val ValRawType.Attribute attr = (Attribute) attribute;\n      }\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/ValSimple.java",
    "content": "import lombok.val;\npublic class ValSimple {\n  private String field = \"field\";\n  private short field2 = 5;\n  public ValSimple() {\n    super();\n  }\n  private String method() {\n    return \"method\";\n  }\n  private double method2() {\n    return 2.0;\n  }\n  private void testVal(String param) {\n    final @val java.lang.String fieldV = field;\n    final @val java.lang.String methodV = method();\n    final @val java.lang.String paramV = param;\n    final @val java.lang.String valOfVal = fieldV;\n    final @val java.lang.String operatorV = (fieldV + valOfVal);\n    final @val short fieldW = field2;\n    final @val double methodW = method2();\n    byte localVar = 3;\n    final @val int operatorW = (fieldW + localVar);\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/ValSuperDefaultMethod.java",
    "content": "import lombok.val;\nclass ValSuperDefaultMethod implements Default {\n  ValSuperDefaultMethod() {\n    super();\n  }\n  public void test() {\n    final @val java.lang.String a = \"\";\n    Default.super.method();\n  }\n}\ninterface Default {\n  default void method() {\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/ValSwitchExpression.java",
    "content": "// version 14:\nimport lombok.val;\npublic class ValSwitchExpression {\n  public ValSwitchExpression() {\n    super();\n  }\n  public void method(int arg) {\n    final @val var x =     switch (arg) {\n    default ->\n        {\n          final @val var s = \"string\";\n          yield arg;\n        }\n    };\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/ValToNative.java",
    "content": "import java.io.IOException;\nimport java.util.Arrays;\nimport lombok.val;\npublic class ValToNative {\n  public ValToNative() {\n    super();\n  }\n  private void test() throws IOException {\n    final @val var intField = 1;\n    for (final @val var s : Arrays.asList(\"1\")) \n      {\n        final @val var s2 = s;\n      }\n    try (final @val var in = getClass().getResourceAsStream(\"ValToNative.class\"))\n      {\n        final @val var j = in.read();\n      }\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/ValWeirdTypes.java",
    "content": "import java.math.BigDecimal;\nimport java.util.*;\nimport lombok.val;\npublic class ValWeirdTypes<Z> {\n  private List<Z> fieldList;\n  public ValWeirdTypes() {\n    super();\n  }\n  public void testGenerics() {\n    List<String> list = new ArrayList<String>();\n    list.add(\"Hello, World!\");\n    final @val java.lang.String shouldBeString = list.get(0);\n    final @val java.util.List<java.lang.String> shouldBeListOfString = list;\n    final @val java.util.List<java.lang.String> shouldBeListOfStringToo = Arrays.asList(\"hello\", \"world\");\n    final @val java.lang.String shouldBeString2 = shouldBeListOfString.get(0);\n  }\n  public void testGenericsInference() {\n    final @val java.util.List<java.lang.Object> huh = Collections.emptyList();\n    final @val java.util.List<java.lang.Number> huh2 = Collections.<Number>emptyList();\n  }\n  public void testPrimitives() {\n    final @val int x = 10;\n    final @val long y = (5 + 3L);\n  }\n  public void testAnonymousInnerClass() {\n    final @val java.lang.Runnable y = new Runnable() {\n      x() {\n        super();\n      }\n      public void run() {\n      }\n    };\n  }\n  public <T extends Number>void testTypeParams(List<T> param) {\n    final @val T t = param.get(0);\n    final @val Z z = fieldList.get(0);\n    final @val java.util.List<T> k = param;\n    final @val java.util.List<Z> y = fieldList;\n  }\n  public void testBounds(List<? extends Number> lower, List<? super Number> upper) {\n    final @val java.lang.Number a = lower.get(0);\n    final @val java.lang.Object b = upper.get(0);\n    final @val java.util.List<? extends java.lang.Number> c = lower;\n    final @val java.util.List<? super java.lang.Number> d = upper;\n    List<?> unbound = lower;\n    final @val java.util.List<?> e = unbound;\n    final @val java.lang.Object f = unbound.get(0);\n  }\n  public void testCompound() {\n    final @val java.util.ArrayList<java.lang.String> a = new ArrayList<String>();\n    final @val java.util.Vector<java.lang.String> b = new Vector<String>();\n    final @val boolean c = (1 < System.currentTimeMillis());\n    final @val java.util.AbstractList<java.lang.String> d = (c ? a : b);\n    java.util.RandomAccess confirm = (c ? a : b);\n  }\n  public void nullType() {\n    final @val java.lang.Object nully = null;\n  }\n  public void testArrays() {\n    final @val int[] intArray = new int[]{1, 2, 3};\n    final @val java.lang.Object[][] multiDimArray = new Object[][]{{}};\n    final @val int[] copy = intArray;\n    final @val java.lang.Object[] single = multiDimArray[0];\n    final @val int singleInt = copy[0];\n  }\n  public void arraysAsList() {\n    final @val java.util.List<java.lang.Class<? extends java.io.Serializable>> x = Arrays.asList(String.class, BigDecimal.class);\n    for (final @val java.lang.Class<? extends java.io.Serializable> y : x)\n      {\n      }\n  }\n  public @SuppressWarnings(\"all\") void arraysAsList2() {\n    final @val java.util.List<java.lang.Class<? extends java.lang.Comparable>> x = Arrays.asList(String.class, BigDecimal.class, Comparable.class);\n    for (final @val java.lang.Class<? extends java.lang.Comparable> y : x)\n      {\n      }\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/ValWithLabel.java",
    "content": "import lombok.val;\npublic class ValWithLabel {\n  {\n    LABEL: for (final @val java.lang.String x : new String[0]) \n  {\n    if ((x.toLowerCase() == null))\n        {\n          continue LABEL;\n        }\n  }\n  }\n  public ValWithLabel() {\n    super();\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/ValWithLocalClasses.java",
    "content": "class ValWithLocalClasses1 {\n  {\n    final @lombok.val ValWithLocalClasses2 f2 = new ValWithLocalClasses2() {\n      x() {\n        super();\n      }\n    };\n  }\n  ValWithLocalClasses1() {\n    super();\n  }\n}\nclass ValWithLocalClasses2 {\n  {\n    final @lombok.val int f3 = 0;\n  }\n  ValWithLocalClasses2() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ValWithSelfRefGenerics.java",
    "content": "import lombok.val;\npublic class ValWithSelfRefGenerics {\n  public ValWithSelfRefGenerics() {\n    super();\n  }\n  public void run(Thing<? extends Comparable<?>> thing, Thing<?> thing2, java.util.List<? extends Number> z) {\n    final @val java.util.List<? extends java.lang.Number> y = z;\n    final @val Thing<? extends java.lang.Comparable<?>> x = thing;\n    final @val Thing<?> w = thing2;\n    final @val java.lang.Object v = thing2.get();\n  }\n}\nclass Thing<T extends Comparable<? super T>> {\n  Thing() {\n    super();\n  }\n  public T get() {\n    return null;\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/ValueCallSuper.java",
    "content": "class ValueParent {\n  ValueParent() {\n    super();\n  }\n}\nfinal @lombok.Value class ValueCallSuper extends ValueParent {\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof ValueCallSuper)))\n        return false;\n    final ValueCallSuper other = (ValueCallSuper) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((! super.equals(o)))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof ValueCallSuper);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int result = super.hashCode();\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return \"ValueCallSuper()\";\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated ValueCallSuper() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ValueInAnonymousClass.java",
    "content": "import lombok.Value;\npublic class ValueInAnonymousClass {\n  Object annonymous = new Object() {\n    final @Value class Inner {\n      private final String string;\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getString() {\n        return this.string;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n        if ((o == this))\n            return true;\n        if ((! (o instanceof Inner)))\n            return false;\n        final Inner other = (Inner) o;\n        final java.lang.Object this$string = this.getString();\n        final java.lang.Object other$string = other.getString();\n        if (((this$string == null) ? (other$string != null) : (! this$string.equals(other$string))))\n            return false;\n        return true;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n        final int PRIME = 59;\n        int result = 1;\n        final java.lang.Object $string = this.getString();\n        result = ((result * PRIME) + (($string == null) ? 43 : $string.hashCode()));\n        return result;\n      }\n      public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n        return ((\"Inner(string=\" + this.getString()) + \")\");\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Inner(final String string) {\n        super();\n        this.string = string;\n      }\n    }\n    x() {\n      super();\n    }\n  };\n  public ValueInAnonymousClass() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ValueOnRecord.java",
    "content": "// version 14:\nimport lombok.Value;\npublic @Value record ValueOnRecord(String a, String b) {\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ValuePlain.java",
    "content": "import lombok.Value;\nfinal @lombok.Value class Value1 {\n  private final int x;\n  private final String name;\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getX() {\n    return this.x;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getName() {\n    return this.name;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof Value1)))\n        return false;\n    final Value1 other = (Value1) o;\n    if ((this.getX() != other.getX()))\n        return false;\n    final java.lang.Object this$name = this.getName();\n    final java.lang.Object other$name = other.getName();\n    if (((this$name == null) ? (other$name != null) : (! this$name.equals(other$name))))\n        return false;\n    return true;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.getX());\n    final java.lang.Object $name = this.getName();\n    result = ((result * PRIME) + (($name == null) ? 43 : $name.hashCode()));\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((((\"Value1(x=\" + this.getX()) + \", name=\") + this.getName()) + \")\");\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Value1(final int x, final String name) {\n    super();\n    this.x = x;\n    this.name = name;\n  }\n}\n@Value @lombok.experimental.NonFinal class Value2 {\n  public final int x;\n  private final String name;\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getX() {\n    return this.x;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getName() {\n    return this.name;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof Value2)))\n        return false;\n    final Value2 other = (Value2) o;\n    if ((! other.canEqual((java.lang.Object) this)))\n        return false;\n    if ((this.getX() != other.getX()))\n        return false;\n    final java.lang.Object this$name = this.getName();\n    final java.lang.Object other$name = other.getName();\n    if (((this$name == null) ? (other$name != null) : (! this$name.equals(other$name))))\n        return false;\n    return true;\n  }\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean canEqual(final java.lang.Object other) {\n    return (other instanceof Value2);\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.getX());\n    final java.lang.Object $name = this.getName();\n    result = ((result * PRIME) + (($name == null) ? 43 : $name.hashCode()));\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((((\"Value2(x=\" + this.getX()) + \", name=\") + this.getName()) + \")\");\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Value2(final int x, final String name) {\n    super();\n    this.x = x;\n    this.name = name;\n  }\n}\nfinal @Value class Value3 {\n  private @lombok.experimental.NonFinal int x;\n  private final int y;\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getX() {\n    return this.x;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getY() {\n    return this.y;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof Value3)))\n        return false;\n    final Value3 other = (Value3) o;\n    if ((this.getX() != other.getX()))\n        return false;\n    if ((this.getY() != other.getY()))\n        return false;\n    return true;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.getX());\n    result = ((result * PRIME) + this.getY());\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((((\"Value3(x=\" + this.getX()) + \", y=\") + this.getY()) + \")\");\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Value3(final int x, final int y) {\n    super();\n    this.x = x;\n    this.y = y;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ValueStaticConstructorOf.java",
    "content": "import lombok.Value;\npublic final @Value(staticConstructor = \"of\") class ValueStaticConstructorOf {\n  private final String name;\n  private final Double price;\n  private ValueStaticConstructorOf(String name, Double price) {\n    super();\n    this.name = name;\n    this.price = price;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getName() {\n    return this.name;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Double getPrice() {\n    return this.price;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof ValueStaticConstructorOf)))\n        return false;\n    final ValueStaticConstructorOf other = (ValueStaticConstructorOf) o;\n    final java.lang.Object this$price = this.getPrice();\n    final java.lang.Object other$price = other.getPrice();\n    if (((this$price == null) ? (other$price != null) : (! this$price.equals(other$price))))\n        return false;\n    final java.lang.Object this$name = this.getName();\n    final java.lang.Object other$name = other.getName();\n    if (((this$name == null) ? (other$name != null) : (! this$name.equals(other$name))))\n        return false;\n    return true;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    final java.lang.Object $price = this.getPrice();\n    result = ((result * PRIME) + (($price == null) ? 43 : $price.hashCode()));\n    final java.lang.Object $name = this.getName();\n    result = ((result * PRIME) + (($name == null) ? 43 : $name.hashCode()));\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((((\"ValueStaticConstructorOf(name=\" + this.getName()) + \", price=\") + this.getPrice()) + \")\");\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated ValueStaticConstructorOf of(final String name, final Double price) {\n    return new ValueStaticConstructorOf(name, price);\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ValueStaticField.java",
    "content": "import lombok.Value;\nfinal @Value class ValueStaticField {\n  static int x;\n  static String PASSWORD = \"Ken sent me\";\n  <clinit>() {\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof ValueStaticField)))\n        return false;\n    return true;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int result = 1;\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return \"ValueStaticField()\";\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated ValueStaticField() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/ValueWithJavaBeansSpecCapitalization.java",
    "content": "final @lombok.Value class ValueWithJavaBeansSpecCapitalization {\n  private final int aField;\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated int getaField() {\n    return this.aField;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated boolean equals(final java.lang.Object o) {\n    if ((o == this))\n        return true;\n    if ((! (o instanceof ValueWithJavaBeansSpecCapitalization)))\n        return false;\n    final ValueWithJavaBeansSpecCapitalization other = (ValueWithJavaBeansSpecCapitalization) o;\n    if ((this.getaField() != other.getaField()))\n        return false;\n    return true;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated int hashCode() {\n    final int PRIME = 59;\n    int result = 1;\n    result = ((result * PRIME) + this.getaField());\n    return result;\n  }\n  public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n    return ((\"ValueWithJavaBeansSpecCapitalization(aField=\" + this.getaField()) + \")\");\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated ValueWithJavaBeansSpecCapitalization(final int aField) {\n    super();\n    this.aField = aField;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/VarComplex.java",
    "content": "import lombok.var;\npublic class VarComplex {\n  private String field = \"\";\n  private static final int CONSTANT = 20;\n  <clinit>() {\n  }\n  public VarComplex() {\n    super();\n  }\n  public void testComplex() {\n    @var char[] shouldBeCharArray = field.toCharArray();\n    @var int shouldBeInt = CONSTANT;\n    @var java.lang.Object lock = new Object();\n    synchronized (lock)\n      {\n        @var int field = 20;\n        @var int inner = 10;\n        switch (field) {\n        case 5 :\n            @var char[] shouldBeCharArray2 = shouldBeCharArray;\n            @var int innerInner = inner;\n        }\n      }\n    @var java.lang.String shouldBeString = field;\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/VarInFor.java",
    "content": "import lombok.var;\npublic class VarInFor {\n  public VarInFor() {\n    super();\n  }\n  public void enhancedFor() {\n    int[] list = new int[]{1, 2};\n    for (@var int shouldBeInt : list)\n      {\n        System.out.println(shouldBeInt);\n        @var int shouldBeInt2 = shouldBeInt;\n      }\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/VarInForOld.java",
    "content": "import lombok.var;\npublic class VarInForOld {\n  public VarInForOld() {\n    super();\n  }\n  public void oldFor() {\n    for (@var int i = 0;; (i < 100); ++ i)\n      {\n        System.out.println(i);\n      }\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/VarModifier.java",
    "content": "import lombok.experimental.var;\npublic class VarModifier {\n  private String field = \"\";\n  public VarModifier() {\n    super();\n  }\n  public void testComplex() {\n    final @var char[] shouldBeFinalCharArray = field.toCharArray();\n    @var char[] shouldBeCharArray = field.toCharArray();\n\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/VarNullInit.java",
    "content": "import lombok.var;\npublic class VarNullInit {\n  public VarNullInit() {\n    super();\n  }\n  void method() {\n    @var java.lang.Object x = null;\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/VarWarning.java",
    "content": "import lombok.var;\npublic class VarWarning {\n  public VarWarning() {\n    super();\n  }\n  public void isOkay() {\n    @var java.lang.String x = \"Warning\";\n    x.toLowerCase();\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/WeirdJavadoc.java",
    "content": "import lombok.Builder;\nimport lombok.Getter;\nimport lombok.Setter;\npublic class WeirdJavadoc {\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated class WeirdJavadocBuilder {\n    private @java.lang.SuppressWarnings(\"all\") @lombok.Generated String test;\n    @java.lang.SuppressWarnings(\"all\") @lombok.Generated WeirdJavadocBuilder() {\n      super();\n    }\n    /**\n     * @param test Copy this\n     * @return {@code this}.\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WeirdJavadoc.WeirdJavadocBuilder test(final String test) {\n      this.test = test;\n      return this;\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WeirdJavadoc build() {\n      return new WeirdJavadoc(this.test);\n    }\n    public @java.lang.Override @java.lang.SuppressWarnings(\"all\") @lombok.Generated java.lang.String toString() {\n      return ((\"WeirdJavadoc.WeirdJavadocBuilder(test=\" + this.test) + \")\");\n    }\n  }\n  private @Getter @Setter String test;\n  @Builder WeirdJavadoc(String test) {\n    super();\n  }\n  public static @java.lang.SuppressWarnings(\"all\") @lombok.Generated WeirdJavadoc.WeirdJavadocBuilder builder() {\n    return new WeirdJavadoc.WeirdJavadocBuilder();\n  }\n  /**\n   * This is the real comment\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated String getTest() {\n    return this.test;\n  }\n  /**\n   * This is the real comment\n   * @param test Copy this\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated void setTest(final String test) {\n    this.test = test;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/WithAlreadyExists.java",
    "content": "class With1 {\n  @lombok.With boolean foo;\n  void withFoo(boolean foo) {\n  }\n  With1(boolean foo) {\n    super();\n  }\n}\nclass With2 {\n  @lombok.With boolean foo;\n  void withFoo(String foo) {\n  }\n  With2(boolean foo) {\n    super();\n  }\n}\nclass With3 {\n  @lombok.With String foo;\n  void withFoo(boolean foo) {\n  }\n  With3(String foo) {\n    super();\n  }\n}\nclass With4 {\n  @lombok.With String foo;\n  void withFoo(String foo) {\n  }\n  With4(String foo) {\n    super();\n  }\n}\nclass With5 {\n  @lombok.With String foo;\n  void withFoo() {\n  }\n  With5(String foo) {\n    super();\n  }\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated With5 withFoo(final String foo) {\n    return ((this.foo == foo) ? this : new With5(foo));\n  }\n}\nclass With6 {\n  @lombok.With String foo;\n  void withFoo(String foo, int x) {\n  }\n  With6(String foo) {\n    super();\n  }\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated With6 withFoo(final String foo) {\n    return ((this.foo == foo) ? this : new With6(foo));\n  }\n}\nclass With7 {\n  @lombok.With String foo;\n  void withFoo(String foo, Object... x) {\n  }\n  With7(String foo) {\n    super();\n  }\n}\nclass With8 {\n  @lombok.With boolean isFoo;\n  void withIsFoo(boolean foo) {\n  }\n  With8(boolean foo) {\n    super();\n  }\n}\nclass With9 {\n  @lombok.With boolean isFoo;\n  void withFoo(boolean foo) {\n  }\n  With9(boolean foo) {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/WithAndAllArgsConstructor.java",
    "content": "@lombok.AllArgsConstructor class WithAndAllArgsConstructor<T, J extends T, L extends java.lang.Number> {\n  @lombok.With J test;\n  @lombok.With java.util.List<L> test2;\n  final int x = 10;\n  int y = 20;\n  final int z;\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithAndAllArgsConstructor<T, J, L> withTest(final J test) {\n    return ((this.test == test) ? this : new WithAndAllArgsConstructor<T, J, L>(test, this.test2, this.y, this.z));\n  }\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithAndAllArgsConstructor<T, J, L> withTest2(final java.util.List<L> test2) {\n    return ((this.test2 == test2) ? this : new WithAndAllArgsConstructor<T, J, L>(this.test, test2, this.y, this.z));\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithAndAllArgsConstructor(final J test, final java.util.List<L> test2, final int y, final int z) {\n    super();\n    this.test = test;\n    this.test2 = test2;\n    this.y = y;\n    this.z = z;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/WithByInAnonymousClass.java",
    "content": "import lombok.experimental.WithBy;\npublic class WithByInAnonymousClass {\n  Object annonymous = new Object() {\n    @WithBy class Inner {\n      private String string;\n      private Inner(String string) {\n        super();\n      }\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Inner withStringBy(final java.util.function.Function<? super String, ? extends String> transformer) {\n        return new Inner(transformer.apply(this.string));\n      }\n    }\n    x() {\n      super();\n    }\n  };\n  public WithByInAnonymousClass() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/WithByNullAnnos.java",
    "content": "import java.util.List;\npublic @lombok.RequiredArgsConstructor class WithByNullAnnos {\n  final @lombok.experimental.WithBy List<String> test;\n  public @org.checkerframework.checker.nullness.qual.NonNull @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithByNullAnnos withTestBy(final java.util.function. @org.checkerframework.checker.nullness.qual.NonNull Function<? super List<String>, ? extends List<String>> transformer) {\n    return new WithByNullAnnos(transformer.apply(this.test));\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithByNullAnnos(final List<String> test) {\n    super();\n    this.test = test;\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/WithByOnRecord.java",
    "content": "// version 14:\nimport lombok.experimental.WithBy;\npublic @WithBy record WithByOnRecord(String a, String b) {\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithByOnRecord withABy(final java.util.function.Function<? super String, ? extends String> transformer) {\n    return new WithByOnRecord(transformer.apply(this.a), this.b);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithByOnRecord withBBy(final java.util.function.Function<? super String, ? extends String> transformer) {\n    return new WithByOnRecord(this.a, transformer.apply(this.b));\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/WithByOnRecordComponent.java",
    "content": "// version 14:\nimport lombok.experimental.WithBy;\npublic record WithByOnRecordComponent(String a, String b) {\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithByOnRecordComponent withABy(final java.util.function.Function<? super String, ? extends String> transformer) {\n    return new WithByOnRecordComponent(transformer.apply(this.a), this.b);\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/WithByTypes.java",
    "content": "public @lombok.RequiredArgsConstructor @lombok.experimental.FieldDefaults(level = lombok.AccessLevel.PRIVATE,makeFinal = true) @lombok.experimental.WithBy class WithByTypes<T> {\n  private final int a;\n  private final long b;\n  private final short c;\n  private final char d;\n  private final byte e;\n  private final double f;\n  private final float g;\n  private final boolean h;\n  private final T i;\n  public static void example() {\n    new WithByTypes<String>(0, 0, (short) 0, ' ', (byte) 0, 0.0, 0.0F, true, \"\").withHBy((<no type> x) -> (! x)).withFBy((<no type> x) -> (x + 0.5));\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithByTypes(final int a, final long b, final short c, final char d, final byte e, final double f, final float g, final boolean h, final T i) {\n    super();\n    this.a = a;\n    this.b = b;\n    this.c = c;\n    this.d = d;\n    this.e = e;\n    this.f = f;\n    this.g = g;\n    this.h = h;\n    this.i = i;\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithByTypes<T> withABy(final java.util.function.IntUnaryOperator transformer) {\n    return new WithByTypes<T>(transformer.applyAsInt(this.a), this.b, this.c, this.d, this.e, this.f, this.g, this.h, this.i);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithByTypes<T> withBBy(final java.util.function.LongUnaryOperator transformer) {\n    return new WithByTypes<T>(this.a, transformer.applyAsLong(this.b), this.c, this.d, this.e, this.f, this.g, this.h, this.i);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithByTypes<T> withCBy(final java.util.function.IntUnaryOperator transformer) {\n    return new WithByTypes<T>(this.a, this.b, (short) transformer.applyAsInt(this.c), this.d, this.e, this.f, this.g, this.h, this.i);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithByTypes<T> withDBy(final java.util.function.IntUnaryOperator transformer) {\n    return new WithByTypes<T>(this.a, this.b, this.c, (char) transformer.applyAsInt(this.d), this.e, this.f, this.g, this.h, this.i);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithByTypes<T> withEBy(final java.util.function.IntUnaryOperator transformer) {\n    return new WithByTypes<T>(this.a, this.b, this.c, this.d, (byte) transformer.applyAsInt(this.e), this.f, this.g, this.h, this.i);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithByTypes<T> withFBy(final java.util.function.DoubleUnaryOperator transformer) {\n    return new WithByTypes<T>(this.a, this.b, this.c, this.d, this.e, transformer.applyAsDouble(this.f), this.g, this.h, this.i);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithByTypes<T> withGBy(final java.util.function.DoubleUnaryOperator transformer) {\n    return new WithByTypes<T>(this.a, this.b, this.c, this.d, this.e, this.f, (float) transformer.applyAsDouble(this.g), this.h, this.i);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithByTypes<T> withHBy(final java.util.function.UnaryOperator<java.lang.Boolean> transformer) {\n    return new WithByTypes<T>(this.a, this.b, this.c, this.d, this.e, this.f, this.g, transformer.apply(this.h), this.i);\n  }\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithByTypes<T> withIBy(final java.util.function.Function<? super T, ? extends T> transformer) {\n    return new WithByTypes<T>(this.a, this.b, this.c, this.d, this.e, this.f, this.g, this.h, transformer.apply(this.i));\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/WithInAnonymousClass.java",
    "content": "import lombok.With;\npublic class WithInAnonymousClass {\n  Object annonymous = new Object() {\n    @With class Inner {\n      private String string;\n      private Inner(String string) {\n        super();\n      }\n      /**\n       * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n       */\n      public @java.lang.SuppressWarnings(\"all\") @lombok.Generated Inner withString(final String string) {\n        return ((this.string == string) ? this : new Inner(string));\n      }\n    }\n    x() {\n      super();\n    }\n  };\n  public WithInAnonymousClass() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/WithInnerAnnotation.java",
    "content": "class WithInnerAnnotation {\n  @interface Inner {\n    int bar() default 42;\n  }\n  WithInnerAnnotation() {\n    super();\n  }\n}"
  },
  {
    "path": "test/transform/resource/after-ecj/WithMethodAbstract.java",
    "content": "abstract class WithMethodAbstract {\n  @lombok.With String foo;\n  WithMethodAbstract() {\n    super();\n  }\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public abstract @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithMethodAbstract withFoo(final String foo);\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/WithMethodMarkedDeprecated.java",
    "content": "import lombok.With;\nclass WithMethodMarkedDeprecated {\n  @Deprecated @With int annotation;\n  @With int javadoc;\n  WithMethodMarkedDeprecated(int annotation, int javadoc) {\n    super();\n  }\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @java.lang.Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithMethodMarkedDeprecated withAnnotation(final int annotation) {\n    return ((this.annotation == annotation) ? this : new WithMethodMarkedDeprecated(annotation, this.javadoc));\n  }\n  /**\n   * @deprecated\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @java.lang.Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithMethodMarkedDeprecated withJavadoc(final int javadoc) {\n    return ((this.javadoc == javadoc) ? this : new WithMethodMarkedDeprecated(this.annotation, javadoc));\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/WithMethodMarkedDeprecatedAnnOnly.java",
    "content": "import lombok.With;\nclass WithMethodMarkedDeprecatedAnnOnly {\n  @Deprecated @With int annotation;\n  WithMethodMarkedDeprecatedAnnOnly(int annotation) {\n    super();\n  }\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @java.lang.Deprecated @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithMethodMarkedDeprecatedAnnOnly withAnnotation(final int annotation) {\n    return ((this.annotation == annotation) ? this : new WithMethodMarkedDeprecatedAnnOnly(annotation));\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/WithNested.java",
    "content": "public interface WithNested<Z> {\n  @lombok.RequiredArgsConstructor class IAmStaticReally {\n    final @lombok.With String x;\n    /**\n     * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithNested.IAmStaticReally withX(final String x) {\n      return ((this.x == x) ? this : new WithNested.IAmStaticReally(x));\n    }\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated IAmStaticReally(final String x) {\n      super();\n      this.x = x;\n    }\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/WithOnClass.java",
    "content": "@lombok.With class WithOnClass1 {\n  @lombok.With(lombok.AccessLevel.NONE) boolean isNone;\n  boolean isPublic;\n  WithOnClass1(boolean isNone, boolean isPublic) {\n    super();\n  }\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithOnClass1 withPublic(final boolean isPublic) {\n    return ((this.isPublic == isPublic) ? this : new WithOnClass1(this.isNone, isPublic));\n  }\n}\n@lombok.With(lombok.AccessLevel.PROTECTED) class WithOnClass2 {\n  @lombok.With(lombok.AccessLevel.NONE) boolean isNone;\n  boolean isProtected;\n  @lombok.With(lombok.AccessLevel.PACKAGE) boolean isPackage;\n  WithOnClass2(boolean isNone, boolean isProtected, boolean isPackage) {\n    super();\n  }\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithOnClass2 withPackage(final boolean isPackage) {\n    return ((this.isPackage == isPackage) ? this : new WithOnClass2(this.isNone, this.isProtected, isPackage));\n  }\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithOnClass2 withProtected(final boolean isProtected) {\n    return ((this.isProtected == isProtected) ? this : new WithOnClass2(this.isNone, isProtected, this.isPackage));\n  }\n}\n@lombok.With class WithOnClass3 {\n  String couldBeNull;\n  @lombok.NonNull String nonNull;\n  WithOnClass3(String couldBeNull, String nonNull) {\n    super();\n  }\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithOnClass3 withCouldBeNull(final String couldBeNull) {\n    return ((this.couldBeNull == couldBeNull) ? this : new WithOnClass3(couldBeNull, this.nonNull));\n  }\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithOnClass3 withNonNull(final @lombok.NonNull String nonNull) {\n    if ((nonNull == null))\n        {\n          throw new java.lang.NullPointerException(\"nonNull is marked non-null but is null\");\n        }\n    return ((this.nonNull == nonNull) ? this : new WithOnClass3(this.couldBeNull, nonNull));\n  }\n}\n@lombok.With @lombok.experimental.Accessors(prefix = \"f\") class WithOnClass4 {\n  final int fX = 10;\n  final int fY;\n  WithOnClass4(int y) {\n    super();\n    this.fY = y;\n  }\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithOnClass4 withY(final int fY) {\n    return ((this.fY == fY) ? this : new WithOnClass4(fY));\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/WithOnNestedRecord.java",
    "content": "import lombok.With;\npublic record WithOnNestedRecord()<T> {\n  public @With record Nested(String a, String b) {\n    /**\n     * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithOnNestedRecord.Nested withA(final String a) {\n      return ((this.a == a) ? this : new WithOnNestedRecord.Nested(a, this.b));\n    }\n    /**\n     * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n     */\n    public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithOnNestedRecord.Nested withB(final String b) {\n      return ((this.b == b) ? this : new WithOnNestedRecord.Nested(this.a, b));\n    }\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/WithOnRecord.java",
    "content": "// version 14:\nimport lombok.With;\npublic @With record WithOnRecord(String a, String b) {\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithOnRecord withA(final String a) {\n    return ((this.a == a) ? this : new WithOnRecord(a, this.b));\n  }\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithOnRecord withB(final String b) {\n    return ((this.b == b) ? this : new WithOnRecord(this.a, b));\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/WithOnRecordComponent.java",
    "content": "// version 14:\nimport lombok.With;\npublic record WithOnRecordComponent(String a, String b) {\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithOnRecordComponent withA(final String a) {\n    return ((this.a == a) ? this : new WithOnRecordComponent(a, this.b));\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/WithOnStatic.java",
    "content": "class WithOnStatic {\n  static @lombok.With boolean foo;\n  static @lombok.With int bar;\n  <clinit>() {\n  }\n  WithOnStatic() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/WithPlain.java",
    "content": "import lombok.With;\nclass WithPlain {\n  @lombok.With int i;\n  final @With int foo;\n  WithPlain(int i, int foo) {\n    super();\n    this.i = i;\n    this.foo = foo;\n  }\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @org.springframework.lang.NonNull @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithPlain withI(final int i) {\n    return ((this.i == i) ? this : new WithPlain(i, this.foo));\n  }\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @org.springframework.lang.NonNull @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithPlain withFoo(final int foo) {\n    return ((this.foo == foo) ? this : new WithPlain(this.i, foo));\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/WithWithDollar.java",
    "content": "class WithWithDollar {\n  @lombok.With int $i;\n  WithWithDollar() {\n    super();\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/WithWithGenerics.java",
    "content": "class WithWithGenerics<T, J extends T, L extends java.lang.Number> {\n  @lombok.With J test;\n  @lombok.With java.util.List<L> test2;\n  @lombok.With java.util.List<? extends L> test3;\n  int $i;\n  public WithWithGenerics(J test, java.util.List<L> test2, java.util.List<? extends L> test3) {\n    super();\n  }\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithWithGenerics<T, J, L> withTest(final J test) {\n    return ((this.test == test) ? this : new WithWithGenerics<T, J, L>(test, this.test2, this.test3));\n  }\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithWithGenerics<T, J, L> withTest2(final java.util.List<L> test2) {\n    return ((this.test2 == test2) ? this : new WithWithGenerics<T, J, L>(this.test, test2, this.test3));\n  }\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithWithGenerics<T, J, L> withTest3(final java.util.List<? extends L> test3) {\n    return ((this.test3 == test3) ? this : new WithWithGenerics<T, J, L>(this.test, this.test2, test3));\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/WithWithJavaBeansSpecCapitalization.java",
    "content": "@lombok.With class WithWithJavaBeansSpecCapitalization {\n  int aField;\n  WithWithJavaBeansSpecCapitalization(int aField) {\n    super();\n  }\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithWithJavaBeansSpecCapitalization withaField(final int aField) {\n    return ((this.aField == aField) ? this : new WithWithJavaBeansSpecCapitalization(aField));\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/WithWithTypeAnnos.java",
    "content": "import lombok.With;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.List;\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER}) @interface TA {\n}\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER}) @interface TB {\n}\nclass WithWithTypeAnnos {\n  final @With @TA @TB List<String> foo;\n  WithWithTypeAnnos(@TA @TB List<String> foo) {\n    super();\n    this.foo = foo;\n  }\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WithWithTypeAnnos withFoo(final @TA List<String> foo) {\n    return ((this.foo == foo) ? this : new WithWithTypeAnnos(foo));\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/WitherAccessLevel.java",
    "content": "import lombok.AccessLevel;\nclass WitherAccessLevel {\n  @lombok.experimental.Wither(lombok.AccessLevel.NONE) boolean isNone;\n  @lombok.experimental.Wither(AccessLevel.PRIVATE) boolean isPrivate;\n  @lombok.experimental.Wither(lombok.AccessLevel.PACKAGE) boolean isPackage;\n  @lombok.experimental.Wither(AccessLevel.PROTECTED) boolean isProtected;\n  @lombok.experimental.Wither(lombok.AccessLevel.PUBLIC) boolean isPublic;\n  @lombok.experimental.Wither(value = lombok.AccessLevel.PUBLIC) boolean value;\n  WitherAccessLevel(boolean isNone, boolean isPrivate, boolean isPackage, boolean isProtected, boolean isPublic, boolean value) {\n    super();\n  }\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  private @java.lang.SuppressWarnings(\"all\") @lombok.Generated WitherAccessLevel withPrivate(final boolean isPrivate) {\n    return ((this.isPrivate == isPrivate) ? this : new WitherAccessLevel(this.isNone, isPrivate, this.isPackage, this.isProtected, this.isPublic, this.value));\n  }\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  @java.lang.SuppressWarnings(\"all\") @lombok.Generated WitherAccessLevel withPackage(final boolean isPackage) {\n    return ((this.isPackage == isPackage) ? this : new WitherAccessLevel(this.isNone, this.isPrivate, isPackage, this.isProtected, this.isPublic, this.value));\n  }\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  protected @java.lang.SuppressWarnings(\"all\") @lombok.Generated WitherAccessLevel withProtected(final boolean isProtected) {\n    return ((this.isProtected == isProtected) ? this : new WitherAccessLevel(this.isNone, this.isPrivate, this.isPackage, isProtected, this.isPublic, this.value));\n  }\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WitherAccessLevel withPublic(final boolean isPublic) {\n    return ((this.isPublic == isPublic) ? this : new WitherAccessLevel(this.isNone, this.isPrivate, this.isPackage, this.isProtected, isPublic, this.value));\n  }\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WitherAccessLevel withValue(final boolean value) {\n    return ((this.value == value) ? this : new WitherAccessLevel(this.isNone, this.isPrivate, this.isPackage, this.isProtected, this.isPublic, value));\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/after-ecj/WitherLegacyStar.java",
    "content": "import lombok.experimental.*;\nclass WitherLegacyStar {\n  @Wither int i;\n  WitherLegacyStar(int i) {\n    super();\n    this.i = i;\n  }\n  /**\n   * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).\n   */\n  public @java.lang.SuppressWarnings(\"all\") @lombok.Generated WitherLegacyStar withI(final int i) {\n    return ((this.i == i) ? this : new WitherLegacyStar(i));\n  }\n}\n"
  },
  {
    "path": "test/transform/resource/before/Accessors.java",
    "content": "class AccessorsFluent {\n\t@lombok.Getter @lombok.Setter @lombok.experimental.Accessors(fluent=true)\n\tprivate String fieldName = \"\";\n}\n\n@lombok.experimental.Accessors(fluent=true)\n@lombok.Getter\nclass AccessorsFluentOnClass {\n\t@lombok.Setter private String fieldName = \"\";\n\t@lombok.experimental.Accessors(fluent=false) private String otherFieldWithOverride = \"\";\n}\n\nclass AccessorsChain {\n\t@lombok.Setter @lombok.experimental.Accessors(chain=true) private boolean isRunning;\n}\n\n@lombok.experimental.Accessors(prefix=\"f\")\nclass AccessorsPrefix {\n\t@lombok.Setter private String fieldName;\n\t@lombok.Setter private String fActualField;\n}\n\n@lombok.experimental.Accessors(prefix={\"f\", \"\"})\nclass AccessorsPrefix2 {\n\t@lombok.Setter private String fieldName;\n\t@lombok.Setter private String fActualField;\n}\n\n@lombok.experimental.Accessors(prefix=\"f\")\n@lombok.ToString\n@lombok.EqualsAndHashCode\nclass AccessorsPrefix3 {\n\tprivate String fName;\n\t\n\tprivate String getName() {\n\t\treturn fName;\n\t}\n}\n\nclass AccessorsFluentGenerics<T extends Number> {\n\t@lombok.Setter @lombok.experimental.Accessors(fluent=true) private String name;\n}\n\nclass AccessorsFluentNoChaining {\n\t@lombok.Setter @lombok.experimental.Accessors(fluent=true,chain=false) private String name;\n}\n\nclass AccessorsFluentStatic<T extends Number> {\n\t@lombok.Setter @lombok.experimental.Accessors(fluent=true) private static String name;\n}"
  },
  {
    "path": "test/transform/resource/before/AccessorsCascade.java",
    "content": "//CONF: lombok.Accessors.prefix += f\n\n@lombok.experimental.Accessors(chain=true)\nclass AccessorsOuter {\n\t@lombok.Setter\n\tprivate String fTest;\n\t\n\t@lombok.experimental.Accessors(prefix=\"z\")\n\t@lombok.Setter\n\tprivate String zTest2;\n\t\n\tclass AccessorsInner1 {\n\t\t@lombok.experimental.Accessors(prefix=\"z\")\n\t\t@lombok.Setter\n\t\tprivate String zTest3;\n\t}\n\t\n\t@lombok.experimental.Accessors(chain=false)\n\tclass AccessorsInner2 {\n\t\t@lombok.Setter\n\t\tprivate String fTest4;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/AccessorsConfiguration.java",
    "content": "//CONF: lombok.Accessors.prefix += m_\n//CONF: lombok.Accessors.prefix += f\n//CONF: lombok.Accessors.chain = false\n\nclass AccessorsConfiguration {\n\t@lombok.Getter @lombok.Setter @lombok.experimental.Accessors(fluent=true)\n\tprivate String m_FieldName = \"\";\n}\n\n@lombok.experimental.Accessors(prefix = {})\nclass AccessorsConfiguration2 {\n\t@lombok.Setter\n\tprivate String m_FieldName = \"\";\n}\n\n@lombok.experimental.Accessors(chain = true)\nclass AccessorsConfiguration3 {\n\t@lombok.Setter\n\tprivate String fFieldName = \"\";\n}\n"
  },
  {
    "path": "test/transform/resource/before/AccessorsInAnonymousClass.java",
    "content": "import lombok.Getter;\nimport lombok.Setter;\nimport lombok.experimental.Accessors;\n\npublic class AccessorsInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\t@Getter\n\t\t@Setter\n\t\t@Accessors(fluent = true)\n\t\tclass Inner {\n\t\t\tprivate String string;\n\t\t}\n\t};\n}"
  },
  {
    "path": "test/transform/resource/before/AccessorsMakeFinal.java",
    "content": "@lombok.experimental.Accessors(makeFinal = true)\nclass AccessorsMakeFinal1 {\n\t@lombok.Setter @lombok.experimental.Accessors(fluent = true)\n\tprivate String test;\n}\n"
  },
  {
    "path": "test/transform/resource/before/AccessorsMakeFinalLombokConfig.java",
    "content": "//CONF: lombok.Accessors.makeFinal = true\n\nclass AccessorsMakeFinalLombokConfig {\n\t@lombok.Setter\n\tprivate String test;\n}\n"
  },
  {
    "path": "test/transform/resource/before/AccessorsNoParamWarning.java",
    "content": "@lombok.experimental.Accessors(fluent=true)\nclass AccessorsNoParams {\n\t@lombok.Getter @lombok.experimental.Accessors private String otherFieldWithOverride = \"\";\n}\n\n@lombok.experimental.Accessors\nclass AccessorsNoParams2 {\n\t@lombok.Setter private boolean foo;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderAccessWithGetter.java",
    "content": "import lombok.AccessLevel;\nimport lombok.Builder;\nimport lombok.Getter;\n\n@Builder(access = AccessLevel.PRIVATE)\npublic final class BuilderAccessWithGetter {\n\n    @Getter\n    private final String string;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderComplex.java",
    "content": "//CONF: lombok.builder.className = Test*Name\nimport java.util.List;\nimport lombok.Builder;\n\nclass BuilderComplex {\n\t@Builder(buildMethodName = \"execute\")\n\tprivate static <T extends Number> void testVoidWithGenerics(T number, int arg2, String arg3, BuilderComplex selfRef) {}\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderConstructorJavadoc.java",
    "content": "import java.util.List;\n\nclass BuilderConstructorJavadoc<T> {\n\t/**\n\t * This is a comment\n\t * \n\t * @param basic tag is moved to the setter\n\t * @param multiline a param comment\n\t *        can be on multiple lines and can use \n\t *        {@code @code} or <code>tags</code>\n\t * @param predef don't copy this one\n\t * @param predefWithJavadoc don't copy this one\n\t * @param last also copy last param\n\t */\n\t@lombok.Builder\n\tBuilderConstructorJavadoc(int basic, int multiline, int predef, int predefWithJavadoc, int last) {\n\t\t\n\t}\n\t\n\tpublic static class BuilderConstructorJavadocBuilder<T> {\n\t\tpublic BuilderConstructorJavadocBuilder<T> predef(final int x) {\n\t\t\tthis.predef = x;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * This javadoc remains untouched.\n\t\t * @param x 1/100 of the thing\n\t\t * @return the updated builder\n\t\t */\n\t\tpublic BuilderConstructorJavadocBuilder<T> predefWithJavadoc(final int x) {\n\t\t\tthis.predefWithJavadoc = x;\n\t\t\treturn this;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderDefaults.java",
    "content": "import lombok.Builder;\nimport lombok.Value;\n\n@Value @Builder\npublic class BuilderDefaults {\n\t@Builder.Default int x = 10;\n\tString name;\n\t@Builder.Default long z = System.currentTimeMillis();\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderDefaultsArray.java",
    "content": "import lombok.Builder;\nimport lombok.Value;\n\n@Builder\npublic class BuilderDefaultsArray {\n\t@Builder.Default\n\tint[] x = {1,2};\n\t\n\t@Builder.Default\n\tjava.lang.String[][] y = {};\n}"
  },
  {
    "path": "test/transform/resource/before/BuilderDefaultsGenerics.java",
    "content": "import lombok.Builder;\nimport java.util.*;\n\n@Builder\npublic class BuilderDefaultsGenerics<N extends Number, T, R extends List<T>> {\n\t@Builder.Default private java.util.concurrent.Callable<N> callable = null;\n\t@Builder.Default private T tee = null;\n\t@Builder.Default private R arrr = null;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderDefaultsTargetTyping.java",
    "content": "import java.util.Arrays;\nimport lombok.Builder;\n\n@Builder\npublic class BuilderDefaultsTargetTyping {\n\t@Builder.Default \n\tString foo = doSth(Arrays.asList(1), Arrays.asList('a'));\n\t\n\tstatic String doSth(java.util.List<Integer> i, java.util.List<Character> c) {\n\t\treturn null;\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/BuilderDefaultsWarnings.java",
    "content": "import lombok.Builder;\nimport lombok.Singular;\n\n@Builder\npublic class BuilderDefaultsWarnings {\n\tlong x = System.currentTimeMillis();\n\tfinal int y = 5;\n\t@Builder.Default int z;\n\t@Builder.Default @Singular java.util.List<String> items;\n}\n\nclass NoBuilderButHasDefaults {\n\t@Builder.Default private final long z = 5;\n\t\n\t@Builder\n\tpublic NoBuilderButHasDefaults() {\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderGenericMethod.java",
    "content": "import java.util.List;\n\nimport lombok.Builder;\nimport java.util.*;\n\nclass BuilderGenericMethod<T> {\n\t@Builder\n\tpublic <N extends Number> Map<N,T> foo(int a, long b) {\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderInAnonymousClass.java",
    "content": "import lombok.Builder;\n\npublic class BuilderInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\t@Builder\n\t\tclass Inner {\n\t\t\tprivate String string;\n\t\t}\n\t};\n}"
  },
  {
    "path": "test/transform/resource/before/BuilderInstanceMethod.java",
    "content": "import java.util.List;\n\nclass BuilderInstanceMethod<T> {\n\t@lombok.Builder\n\tpublic String create(int show, final int yes, List<T> also, int $andMe) {\n\t\treturn \"\" + show + yes + also + $andMe;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderInvalidUse.java",
    "content": "//skip compare content\n@lombok.Builder\nclass BuilderInvalidUse {\n\tprivate int something;\n\n\t@lombok.Getter @lombok.Setter @lombok.experimental.FieldDefaults(makeFinal = true) @lombok.With @lombok.Data @lombok.ToString @lombok.EqualsAndHashCode\n\t@lombok.AllArgsConstructor\n\tpublic static class BuilderInvalidUseBuilder {\n\n\t}\n}\n\n@lombok.Builder\nclass AlsoInvalid {\n\t@lombok.Value\n\tpublic static class AlsoInvalidBuilder {\n\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/BuilderJavadoc.java",
    "content": "import java.util.List;\n\n@lombok.Builder\nclass BuilderJavadoc<T> {\n\t/**\n\t * basic gets only a builder setter.\n\t * @see #getsetwith\n\t * @param tag is moved to the setter.\n\t * @return tag is removed from the setter.\n\t */\n\tprivate final int basic;\n\n\t/**\n\t * getsetwith gets a builder setter, an instance getter and setter, and a wither.\n\t * @param tag is moved to the setters and wither.\n\t * @return tag is moved to the getter.\n\t */\n\t@lombok.Getter\n\t@lombok.Setter\n\t@lombok.experimental.Wither\n\tprivate int getsetwith;\n\n\t/**\n\t * Predef has a predefined builder setter with no javadoc, and the builder setter does not get this one.\n\t * @param tag remains on the field.\n\t * @return tag remains on the field.\n\t */\n\tprivate final int predef;\n\n\t/**\n\t * predefWithJavadoc has a predefined builder setter with javadoc, so it keeps that one untouched.\n\t * @param tag is removed from the field.\n\t * @return tag remains on the field.\n\t */\n\tprivate final int predefWithJavadoc;\n\n\tpublic static class BuilderJavadocBuilder<T> {\n\t\tpublic BuilderJavadocBuilder<T> predef(final int x) {\n\t\t\tthis.predef = x * 10;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * This javadoc remains untouched.\n\t\t * @param x 1/100 of the thing\n\t\t * @return the updated builder\n\t\t */\n\t\tpublic BuilderJavadocBuilder<T> predefWithJavadoc(final int x) {\n\t\t\tthis.predefWithJavadoc = x * 100;\n\t\t\treturn this;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderNestedInEnum.java",
    "content": "// issue #3014: Builder check if its on a non-static inner class and errors if it is. But it was erroring here even though it is on a static inner class.\nclass BuilderNestedInEnum {\n\tpublic enum TestEnum {\n\t\tFOO, BAR;\n\t\t\n\t\t@lombok.Builder\n\t\t@lombok.Value\n\t\tpublic static class TestBuilder {\n\t\t\tString field;\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/BuilderNestedJavadoc.java",
    "content": "@lombok.Builder\npublic class BuilderNestedJavadoc {\n\t@lombok.Builder\n\tpublic static class NestedClass {\n\t\t/**\n\t\t * Example javadoc\n\t\t */\n\t\tString name;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderOnNestedClass.java",
    "content": "public class BuilderOnNestedClass<T> {\n\tprivate T t;\n\t\n\t@lombok.Builder\n\tpublic static class Nested {\n\t\tprivate String a;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderOnNestedRecord.java",
    "content": "// version 14:\npublic record BuilderOnNestedRecord<T>(T t) {\n\t@lombok.Builder\n\tpublic record Nested(String a) {\n\t\t\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderSimple.java",
    "content": "import java.util.List;\n\n@lombok.Builder(access = lombok.AccessLevel.PROTECTED)\nclass BuilderSimple<T> {\n\tprivate final int noshow = 0;\n\tprivate final int yes;\n\tprivate List<T> also;\n\tprivate int $butNotMe;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderSimpleOnRecord.java",
    "content": "// version 14:\n\nimport java.util.List;\n\n@lombok.Builder(access = lombok.AccessLevel.PROTECTED)\npublic record BuilderSimpleOnRecord<T>(List<T> l, String a) {\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderSimpleWithSetterPrefix.java",
    "content": "import java.util.List;\n\n@lombok.Builder(access = lombok.AccessLevel.PROTECTED, setterPrefix = \"with\")\nclass BuilderSimpleWithSetterPrefix<T> {\n\tprivate int unprefixed;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderSingularAnnotatedTypes.java",
    "content": "//VERSION 8:\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.Set;\nimport java.util.Map;\nimport lombok.NonNull;\nimport lombok.Singular;\n@Target(ElementType.TYPE_USE)\n@interface MyAnnotation {}\n@lombok.Builder\nclass BuilderSingularAnnotatedTypes {\n\t@Singular private Set<@MyAnnotation @NonNull String> foos;\n\t@Singular private Map<@MyAnnotation @NonNull String, @MyAnnotation @NonNull Integer> bars;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderSingularAnnotatedTypesWithSetterPrefix.java",
    "content": "//VERSION 8:\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.Set;\nimport java.util.Map;\nimport lombok.NonNull;\nimport lombok.Singular;\n@Target(ElementType.TYPE_USE)\n@interface MyAnnotation {}\n@lombok.Builder(setterPrefix = \"with\")\nclass BuilderSingularAnnotatedTypesWithSetterPrefix {\n\t@Singular private Set<@MyAnnotation @NonNull String> foos;\n\t@Singular private Map<@MyAnnotation @NonNull String, @MyAnnotation @NonNull Integer> bars;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderSingularGuavaListsSets.java",
    "content": "import com.google.common.collect.ImmutableList;\nimport com.google.common.collect.ImmutableCollection;\nimport com.google.common.collect.ImmutableSet;\nimport com.google.common.collect.ImmutableSortedSet;\nimport com.google.common.collect.ImmutableTable;\n\nimport lombok.Singular;\n\n@lombok.Builder\nclass BuilderSingularGuavaListsSets<T> {\n\t@Singular private ImmutableList<T> cards;\n\t@Singular private ImmutableCollection<? extends Number> frogs;\n\t@SuppressWarnings(\"all\") @Singular(\"rawSet\") private ImmutableSet rawSet;\n\t@Singular private ImmutableSortedSet<String> passes;\n\t@Singular private ImmutableTable<? extends Number, ? extends Number, String> users;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderSingularGuavaMaps.java",
    "content": "import com.google.common.collect.ImmutableMap;\nimport com.google.common.collect.ImmutableBiMap;\nimport com.google.common.collect.ImmutableSortedMap;\n\nimport lombok.Singular;\n\n@lombok.Builder\nclass BuilderSingularGuavaMaps<K, V> {\n\t@Singular private ImmutableMap<K, V> battleaxes;\n\t@Singular private ImmutableSortedMap<Integer, ? extends V> vertices;\n\t@SuppressWarnings(\"all\") @Singular(\"rawMap\") private ImmutableBiMap rawMap;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderSingularLists.java",
    "content": "import java.util.List;\nimport java.util.Collection;\n\nimport lombok.Singular;\n\n@lombok.Builder\nclass BuilderSingularLists<T> {\n\t@Singular private List<T> children;\n\t@Singular private Collection<? extends Number> scarves;\n\t@SuppressWarnings(\"all\") @Singular(\"rawList\") private List rawList;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderSingularMaps.java",
    "content": "//FORMAT: javaLangAsFQN = skip\n//FORMAT: generated = skip\n//FORMAT: finalParams = skip\nimport java.util.Map;\nimport java.util.SortedMap;\n\nimport lombok.Singular;\n\n@lombok.Builder\nclass BuilderSingularMaps<K, V> {\n\t@Singular private Map<K, V> women;\n\t@Singular private SortedMap<K, ? extends Number> men;\n\t@SuppressWarnings(\"all\") @Singular(\"rawMap\") private Map rawMap;\n\t@Singular(\"stringMap\") private Map<String, V> stringMap;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderSingularMapsWithSetterPrefix.java",
    "content": "//FORMAT: javaLangAsFQN = skip\n//FORMAT: generated = skip\n//FORMAT: finalParams = skip\nimport java.util.Map;\nimport java.util.SortedMap;\n\nimport lombok.Singular;\n\n@lombok.Builder(setterPrefix = \"with\")\nclass BuilderSingularMapsWithSetterPrefix<K, V> {\n\t@Singular private Map<K, V> women;\n\t@Singular private SortedMap<K, ? extends Number> men;\n\t@SuppressWarnings(\"all\") @Singular(value = \"rawMap\", ignoreNullCollections = true) private Map rawMap;\n\t@Singular(\"stringMap\") private Map<String, V> stringMap;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderSingularNoAuto.java",
    "content": "//CONF: lombok.singular.auto = false\nimport java.util.List;\n\nimport lombok.Singular;\n\n@lombok.Builder\nclass BuilderSingularNoAuto {\n\t@Singular private List<String> things;\n\t@Singular(\"widget\") private List<String> widgets;\n\t@Singular private List<String> items;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderSingularNoAutoWithSetterPrefix.java",
    "content": "//CONF: lombok.singular.auto = false\nimport java.util.List;\n\nimport lombok.Singular;\n\n@lombok.Builder(setterPrefix = \"with\")\nclass BuilderSingularNoAutoWithSetterPrefix {\n\t@Singular private List<String> things;\n\t@Singular(\"widget\") private List<String> widgets;\n\t@Singular private List<String> items;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderSingularNullBehavior1.java",
    "content": "//version 8:\n//CONF: lombok.addNullAnnotations = checkerframework\n//CONF: lombok.nonNull.exceptionType = assertion\nimport java.util.List;\nimport java.util.Collection;\n\nimport lombok.Singular;\n\n@lombok.Builder\nclass BuilderSingularNullBehavior1 {\n\t@Singular private List<String> names;\n\t@Singular(ignoreNullCollections = true) private List<String> locations;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderSingularNullBehavior2.java",
    "content": "//version 8: springframework dep is too new to run on j6\n//CONF: lombok.addNullAnnotations = spring\n//CONF: lombok.nonNull.exceptionType = JDK\nimport java.util.List;\n\nimport lombok.Singular;\n\n@lombok.Builder\nclass BuilderSingularNullBehavior2 {\n\t@Singular private List<String> locations;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderSingularOnRecord.java",
    "content": "// version 14:\n\nimport java.util.Collection;\nimport java.util.List;\n\nimport lombok.Builder;\nimport lombok.Singular;\n\n@Builder\npublic record BuilderSingularOnRecord<T>(@Singular List<T> children, @Singular Collection<? extends Number> scarves, @SuppressWarnings(\"all\") @Singular(\"rawList\") List rawList) {\n}"
  },
  {
    "path": "test/transform/resource/before/BuilderSingularRedirectToGuava.java",
    "content": "//CONF: lombok.singular.useGuava = true\nimport java.util.Set;\nimport java.util.NavigableMap;\nimport java.util.Collection;\n\nimport lombok.Singular;\n\n@lombok.Builder\nclass BuilderSingularRedirectToGuava {\n\t@Singular private Set<String> dangerMice;\n\t@Singular private NavigableMap<Integer, Number> things;\n\t@Singular private Collection<Class<?>> doohickeys;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderSingularSets.java",
    "content": "import java.util.Set;\nimport java.util.SortedSet;\n\nimport lombok.Singular;\n\n@lombok.Builder\nclass BuilderSingularSets<T> {\n\t@Singular private Set<T> dangerMice;\n\t@Singular private SortedSet<? extends Number> octopodes;\n\t@SuppressWarnings(\"all\") @Singular(\"rawSet\") private Set rawSet;\n\t@Singular(\"stringSet\") private Set<String> stringSet;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderSingularSetsWithSetterPrefix.java",
    "content": "import java.util.Set;\nimport java.util.SortedSet;\n\nimport lombok.Singular;\n\n@lombok.Builder(setterPrefix = \"with\")\nclass BuilderSingularSetsWithSetterPrefix<T> {\n\t@Singular private Set<T> dangerMice;\n\t@Singular private SortedSet<? extends Number> octopodes;\n\t@SuppressWarnings(\"all\") @Singular(\"rawSet\") private Set rawSet;\n\t@Singular(\"stringSet\") private Set<String> stringSet;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderSingularToBuilderWithNull.java",
    "content": "import lombok.Singular;\n\n@lombok.Builder(toBuilder = true)\nclass BuilderSingularToBuilderWithNull {\n\t@Singular private java.util.List<String> elems;\n\t\n\tpublic static void test() {\n\t\tnew BuilderSingularToBuilderWithNull(null).toBuilder();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderSingularToBuilderWithNullWithSetterPrefix.java",
    "content": "import lombok.Singular;\n\n@lombok.Builder(toBuilder = true, setterPrefix = \"with\")\nclass BuilderSingularToBuilderWithNullWithSetterPrefix {\n\t@Singular private java.util.List<String> elems;\n\t\n\tpublic static void test() {\n\t\tnew BuilderSingularToBuilderWithNullWithSetterPrefix(null).toBuilder();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderSingularWildcardListsWithToBuilder.java",
    "content": "import java.util.List;\nimport java.util.Collection;\n\nimport lombok.Singular;\n\n@lombok.Builder(toBuilder = true)\nclass BuilderSingularWildcardListsWithToBuilder {\n\t@Singular private List<?> objects;\n\t@Singular private Collection<? extends Number> numbers;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderSingularWithPrefixes.java",
    "content": "import lombok.Singular;\n\n@lombok.Builder\n@lombok.experimental.Accessors(prefix = \"_\")\nclass BuilderSingularWithPrefixes {\n\t@Singular private java.util.List<String> _elems;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderSingularWithPrefixesWithSetterPrefix.java",
    "content": "import lombok.Singular;\n\n@lombok.Builder(setterPrefix = \"with\")\n@lombok.experimental.Accessors(prefix = \"_\")\nclass BuilderSingularWithPrefixesWithSetterPrefix {\n\t@Singular private java.util.List<String> _elems;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderTypeAnnos.java",
    "content": "//CONF: lombok.copyableAnnotations += TA\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.List;\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})\n@interface TA {\n}\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})\n@interface TB {\n}\n@lombok.Builder\nclass BuilderTypeAnnos {\n\tprivate @TA @TB List<String> foo;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderTypeAnnosWithSetterPrefix.java",
    "content": "//CONF: lombok.copyableAnnotations += TA\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.List;\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})\n@interface TA {\n}\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})\n@interface TB {\n}\n@lombok.Builder(setterPrefix = \"with\")\nclass BuilderTypeAnnosWithSetterPrefix {\n\tprivate @TA @TB List<String> foo;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderValueData.java",
    "content": "import java.util.List;\n\n@lombok.Builder @lombok.Value\nclass BuilderAndValue {\n\tprivate final int zero = 0;\n}\n\n@lombok.Builder @lombok.Data\nclass BuilderAndData {\n\tprivate final int zero = 0;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderValueDataWithSetterPrefix.java",
    "content": "import java.util.List;\n\n@lombok.Builder(setterPrefix = \"with\") @lombok.Value\nclass BuilderAndValueWithSetterPrefix {\n\tprivate final int zero = 0;\n}\n\n@lombok.Builder(setterPrefix = \"with\") @lombok.Data\nclass BuilderAndDataWithSetterPrefix {\n\tprivate final int zero = 0;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderWithAccessors.java",
    "content": "@lombok.Builder @lombok.experimental.Accessors(prefix={\"p\", \"_\"})\nclass BuilderWithAccessors {\n\tprivate final int plower;\n\tprivate final int pUpper;\n\tprivate int _foo;\n\tprivate int __bar;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderWithBadNames.java",
    "content": "@lombok.Builder\npublic class BuilderWithBadNames {\n\tString build;\n\tString toString;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderWithDeprecated.java",
    "content": "import com.google.common.collect.ImmutableList;\nimport lombok.Builder;\nimport lombok.Singular;\n\n@Builder\npublic class BuilderWithDeprecated {\n\t/** @deprecated since always */ String dep1;\n\t@Deprecated int dep2;\n\t@Singular @Deprecated java.util.List<String> strings;\n\t@Singular @Deprecated ImmutableList<Integer> numbers;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderWithDeprecatedAnnOnly.java",
    "content": "import com.google.common.collect.ImmutableList;\nimport lombok.Builder;\nimport lombok.Singular;\n\n@Builder\npublic class BuilderWithDeprecatedAnnOnly {\n\t@Deprecated int dep1;\n\t@Singular @Deprecated java.util.List<String> strings;\n\t@Singular @Deprecated ImmutableList<Integer> numbers;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderWithExistingBuilderClass.java",
    "content": "import lombok.Builder;\n\nclass BuilderWithExistingBuilderClass<T, K extends Number> {\n\t@Builder\n\tpublic static <Z extends Number> BuilderWithExistingBuilderClass<String, Z> staticMethod(Z arg1, boolean arg2, String arg3) {\n\t\treturn null;\n\t}\n\t\n\tpublic static class BuilderWithExistingBuilderClassBuilder<Z extends Number> {\n\t\tprivate Z arg1;\n\t\t\n\t\tpublic void arg2(boolean arg) {\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/BuilderWithExistingBuilderClassWithSetterPrefix.java",
    "content": "import lombok.Builder;\n\nclass BuilderWithExistingBuilderClassWithSetterPrefix<T, K extends Number> {\n\t@Builder(setterPrefix = \"with\")\n\tpublic static <Z extends Number> BuilderWithExistingBuilderClassWithSetterPrefix<String, Z> staticMethod(Z arg1, boolean arg2, String arg3) {\n\t\treturn null;\n\t}\n\t\n\tpublic static class BuilderWithExistingBuilderClassWithSetterPrefixBuilder<Z extends Number> {\n\t\tprivate Z arg1;\n\t\t\n\t\tpublic void withArg2(boolean arg) {\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderWithJavaBeansSpecCapitalization.java",
    "content": "//CONF: lombok.accessors.capitalization = beanspec\n@lombok.Builder(setterPrefix = \"set\")\nclass BuilderWithJavaBeansSpecCapitalization {\n\t@lombok.Singular(\"z\") java.util.List<String> a;\n\t@lombok.Singular(\"yField\") java.util.List<String> aField;\n\tString bField;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderWithNoBuilderMethod.java",
    "content": "import lombok.Builder;\n@Builder(toBuilder = true, builderMethodName = \"\")\nclass BuilderWithNoBuilderMethod {\n\tprivate String a = \"\";\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderWithNonNull.java",
    "content": "//version 8:\n@lombok.Builder\nclass BuilderWithNonNull {\n\t@lombok.NonNull\n\tprivate final String id;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderWithNonNullWithSetterPrefix.java",
    "content": "//version 8:\n@lombok.Builder(setterPrefix = \"with\")\nclass BuilderWithNonNullWithSetterPrefix {\n\t@lombok.NonNull\n\tprivate final String id;\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderWithRecursiveGenerics.java",
    "content": "//issue #1298\nimport java.util.Set;\nimport lombok.Builder;\nimport lombok.Value;\n\npublic class BuilderWithRecursiveGenerics {\n\tinterface Inter<T, U extends Inter<T, U>> {}\n\t\n\t@Builder @Value public static class Test<Foo, Bar extends Set<Foo>, Quz extends Inter<Bar, Quz>> {\n\t\tFoo foo;\n\t\tBar bar;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/BuilderWithToBuilder.java",
    "content": "import java.util.List;\nimport lombok.Builder;\n@Builder(toBuilder = true) @lombok.experimental.Accessors(prefix = \"m\")\nclass BuilderWithToBuilder<T> {\n\tprivate String mOne, mTwo;\n\t@Builder.ObtainVia(method = \"rrr\", isStatic = true) private T foo;\n\t@lombok.Singular private List<T> bars;\n\tpublic static <K> K rrr(BuilderWithToBuilder<K> x) {\n\t\treturn x.foo;\n\t}\n}\n@lombok.experimental.Accessors(prefix = \"m\")\nclass ConstructorWithToBuilder<T> {\n\tprivate String mOne, mTwo;\n\tprivate T foo;\n\t@lombok.Singular private com.google.common.collect.ImmutableList<T> bars;\n\t@Builder(toBuilder = true)\n\tpublic ConstructorWithToBuilder(String mOne, @Builder.ObtainVia(field = \"foo\") T baz, com.google.common.collect.ImmutableList<T> bars) {\n\t}\n}\n\nclass StaticMethodWithToBuilder<T> {\n\tprivate T foo;\n\t\n\tpublic StaticMethodWithToBuilder(T foo) {\n\t\tthis.foo = foo;\n\t}\n\n    @Builder(toBuilder = true)\n    public static <T> StaticMethodWithToBuilder<T> of(T foo) {\n        return new StaticMethodWithToBuilder<T>(foo);\n    }\n}"
  },
  {
    "path": "test/transform/resource/before/BuilderWithTolerate.java",
    "content": "import lombok.Builder;\nimport lombok.experimental.Tolerate;\n\t\t\n@Builder\npublic class BuilderWithTolerate {\n\tprivate final int value;\n\t\n\tpublic static void main(String[] args) {\n\t\tBuilderWithTolerate.builder().value(\"42\").build();\n\t}\n\t\n\tpublic static class BuilderWithTolerateBuilder {\n\t\t@Tolerate\n\t\tpublic BuilderWithTolerateBuilder value(String s) {\n\t\t\treturn this.value(Integer.parseInt(s));\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/CheckerFrameworkBasic.java",
    "content": "//version 8:\n//CONF: checkerframework = 4.0\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.experimental.Accessors;\nimport lombok.With;\n\n@Data @AllArgsConstructor @Accessors(chain = true)\nclass CheckerFrameworkBasic {\n\t@With private final int x;\n\tprivate final int y;\n\tprivate int z;\n}\n"
  },
  {
    "path": "test/transform/resource/before/CheckerFrameworkBuilder.java",
    "content": "//version 8:\n//CONF: checkerframework = 4.0\nimport java.util.List;\nimport lombok.Builder;\nimport lombok.Singular;\n\n@Builder\nclass CheckerFrameworkBuilder {\n\t@Builder.Default int x = 5;\n\tint y;\n\tint z;\n\t@Singular List<String> names;\n}\n"
  },
  {
    "path": "test/transform/resource/before/CheckerFrameworkSuperBuilder.java",
    "content": "//version 8:\n//CONF: checkerframework = 4.0\nimport java.util.List;\nimport lombok.Singular;\n\nclass CheckerFrameworkSuperBuilder {\n\t@lombok.experimental.SuperBuilder\n\tpublic static class Parent {\n\t\t@lombok.Builder.Default int x = 5;\n\t\tint y;\n\t\tint z;\n\t\t@Singular List<String> names;\n\t}\n\t\n\t@lombok.experimental.SuperBuilder\n\tpublic static class ZChild extends Parent {\n\t\t@lombok.Builder.Default int a = 1;\n\t\tint b;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/ClassNamedAfterGetter.java",
    "content": "class GetFoo {\n\t@lombok.Getter private int foo;\n}\n"
  },
  {
    "path": "test/transform/resource/before/CleanupName.java",
    "content": "class CleanupName {\n\tvoid test() {\n\t\t@lombok.Cleanup(\"toString\") Object o = \"Hello World!\";\n\t\tSystem.out.println(o);\n\t}\n\tvoid test2() {\n\t\t@lombok.Cleanup(value=\"toString\") Object o = \"Hello World too!\";\n\t\tSystem.out.println(o);\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/CleanupPlain.java",
    "content": "import lombok.Cleanup;\nimport java.io.*;\nclass CleanupPlain {\n\tvoid test() throws Exception {\n\t\t@lombok.Cleanup InputStream in = new FileInputStream(\"in\");\n\t\t@Cleanup OutputStream out = new FileOutputStream(\"out\");\n\t\tif (in.markSupported()) {\n\t\t\tout.flush();\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/CommentsInterspersed.java",
    "content": "import  /* cmt */   lombok./* cmt2 */Getter   /* cmt3 */   ;\n\npublic /*bla */ class CommentsInterspersed {\n\t/**\n\t * javadoc for field\n\t */\n\tprivate int x;\n\t\n\tprivate /* bla2 */ @Getter String test = \"foo\"; //$NON-NLS-1$\n\t\n\t/**\n\t * Javadoc on method\n\t */\n\tpublic native void gwtTest(); /*-{\n\t\tjavascript;\n\t}-*/\n} //haha!\n//hahaha!\n\n//hahahaha!\n\n"
  },
  {
    "path": "test/transform/resource/before/ConflictingStaticConstructorNames.java",
    "content": "@lombok.Data(staticConstructor=\"of\")\n@lombok.NoArgsConstructor\nclass ConflictingStaticConstructorNames {\n}"
  },
  {
    "path": "test/transform/resource/before/ConstructorInner.java",
    "content": "class ConstructorInner {\n\t@lombok.AllArgsConstructor(staticName = \"of\")\n\tstatic class Inner {\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/ConstructorJavadoc.java",
    "content": "import lombok.AllArgsConstructor;\n\n@AllArgsConstructor\npublic class ConstructorJavadoc {\n\t/**\n\t * Some text\n\t *\n\t * @param fieldName Hello, World1\n\t * --- GETTER ---\n\t * Getter section\n\t *\n\t * @return Sky is blue1\n\t */\n\tprivate int fieldName;\n\t\n\t/**\n\t * Sky is blue\n\t */\n\tprivate int fieldName2;\n}\n"
  },
  {
    "path": "test/transform/resource/before/Constructors.java",
    "content": "@lombok.RequiredArgsConstructor class RequiredArgsConstructor1 {\n\tfinal int x;\n\tString name;\n}\n@lombok.RequiredArgsConstructor(access=lombok.AccessLevel.PROTECTED) class RequiredArgsConstructorAccess {\n\tfinal int x;\n\tString name;\n}\n@lombok.RequiredArgsConstructor(staticName=\"staticname\") class RequiredArgsConstructorStaticName {\n\tfinal int x;\n\tString name;\n}\n@lombok.RequiredArgsConstructor(onConstructor=@__(@Deprecated)) class RequiredArgsConstructorWithAnnotations {\n\tfinal int x;\n\tString name;\n}\n@lombok.AllArgsConstructor class AllArgsConstructor1 {\n\tfinal int x;\n\tString name;\n}\n@lombok.NoArgsConstructor class NoArgsConstructor1 {\n\tint x;\n\tString name;\n}\n@lombok.RequiredArgsConstructor(staticName=\"of\") class RequiredArgsConstructorStaticNameGenerics<T extends Number> {\n\tfinal T x;\n\tString name;\n}\n@lombok.RequiredArgsConstructor(staticName=\"of\") class RequiredArgsConstructorStaticNameGenerics2<T extends Number> {\n\tfinal Class<T> x;\n\tString name;\n}\n@lombok.AllArgsConstructor(access=lombok.AccessLevel.PACKAGE) class AllArgsConstructorPackageAccess {\n\tfinal String x;\n}\n@lombok.NoArgsConstructor(force = true) class NoArgsConstructor2 {\n\tfinal int x;\n\tfinal double y;\n\tfinal char c;\n\tfinal boolean b;\n\tfinal float f;\n\tfinal String s;\n\tbyte z;\n}\n"
  },
  {
    "path": "test/transform/resource/before/ConstructorsConfiguration.java",
    "content": "//CONF: lombok.anyConstructor.suppressConstructorProperties = true\n@lombok.AllArgsConstructor\nclass ConstructorsConfiguration {\n\tint x;\n}\n"
  },
  {
    "path": "test/transform/resource/before/ConstructorsInAnonymousClass.java",
    "content": "//version 8:\nimport lombok.AllArgsConstructor;\nimport lombok.NoArgsConstructor;\nimport lombok.NonNull;\nimport lombok.RequiredArgsConstructor;\n\npublic class ConstructorsInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\t@AllArgsConstructor\n\t\t@RequiredArgsConstructor\n\t\t@NoArgsConstructor\n\t\tclass Inner {\n\t\t\tprivate String string;\n\t\t\t@NonNull\n\t\t\tprivate String string2;\n\t\t}\n\t};\n}"
  },
  {
    "path": "test/transform/resource/before/ConstructorsOnRecord.java",
    "content": "// version 14:\n\nimport lombok.AllArgsConstructor;\nimport lombok.NoArgsConstructor;\nimport lombok.RequiredArgsConstructor;\n\n@AllArgsConstructor\n@RequiredArgsConstructor\n@NoArgsConstructor\npublic record ConstructorsOnRecord(String a, String b) {\n}"
  },
  {
    "path": "test/transform/resource/before/ConstructorsTypeAnnos.java",
    "content": "//CONF: lombok.copyableAnnotations += TA\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.List;\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})\n@interface TA {\n}\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})\n@interface TB {\n}\n@lombok.AllArgsConstructor\nclass ConstructorsTypeAnnos {\n\t@TA @TB List<String> foo;\n}\n"
  },
  {
    "path": "test/transform/resource/before/ConstructorsWithAccessors.java",
    "content": "//version 8:\n@lombok.AllArgsConstructor @lombok.experimental.Accessors(prefix={\"p\", \"_\"}) class ConstructorsWithAccessors {\n\tint plower;\n\tint pUpper;\n\tint _huh;\n\tint __huh2;\n}\n\n@lombok.AllArgsConstructor @lombok.experimental.Accessors(prefix={\"p\", \"_\"}) class ConstructorsWithAccessorsNonNull {\n\t@lombok.NonNull Integer plower;\n\t@lombok.NonNull Integer pUpper;\n\t@lombok.NonNull Integer _huh;\n\t@lombok.NonNull final Integer __huh2;\n}\n"
  },
  {
    "path": "test/transform/resource/before/ConstructorsWithBuilderDefaults.java",
    "content": "import lombok.AllArgsConstructor;\nimport lombok.NoArgsConstructor;\nimport lombok.Value;\nimport lombok.Builder;\n\n@NoArgsConstructor(force = true) @AllArgsConstructor @Builder @Value class ConstructorsWithBuilderDefaults {\n\t@Builder.Default int x = 5;\n\tint y;\n}\n"
  },
  {
    "path": "test/transform/resource/before/ConstructorsWithBuilderDefaults2.java",
    "content": "//CONF: lombok.noArgsConstructor.extraPrivate = true\nimport lombok.NoArgsConstructor;\nimport lombok.Value;\nimport lombok.Builder;\n\n@Builder @Value class ConstructorsWithBuilderDefaults<T> {\n\t@Builder.Default java.util.List<T> z = new java.util.ArrayList<T>();\n\t@Builder.Default T x = null;\n\tT q;\n}\n"
  },
  {
    "path": "test/transform/resource/before/ConstructorsWithSuperBuilderDefaults.java",
    "content": "import lombok.AllArgsConstructor;\nimport lombok.NoArgsConstructor;\nimport lombok.experimental.SuperBuilder;\nimport lombok.Builder;\n\n@NoArgsConstructor\n@AllArgsConstructor\n@SuperBuilder\nclass ConstructorsWithSuperBuilderDefaults {\n\t@Builder.Default int x = 5;\n\tint y;\n}\n"
  },
  {
    "path": "test/transform/resource/before/DataConfiguration.java",
    "content": "//CONF: lombok.anyConstructor.suppressConstructorProperties = true\n//CONF: lombok.toString.doNotUseGetters = true\n//CONF: lombok.equalsAndHashCode.doNotUseGetters = true\n//CONF: lombok.noArgsConstructor.extraPrivate = true\n@lombok.Data\nclass DataConfiguration {\n\tfinal int x;\n}\n"
  },
  {
    "path": "test/transform/resource/before/DataExtended.java",
    "content": "@lombok.Data\n@lombok.ToString(doNotUseGetters = true)\nclass DataExtended {\n\tint x;\n}"
  },
  {
    "path": "test/transform/resource/before/DataIgnore.java",
    "content": "@lombok.Data class DataIgnore {\n\tfinal int x;\n\tString $name;\n}\n"
  },
  {
    "path": "test/transform/resource/before/DataInAnonymousClass.java",
    "content": "import lombok.Data;\n\npublic class DataInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\t@Data\n\t\tclass Inner {\n\t\t\tprivate String string;\n\t\t}\n\t};\n}"
  },
  {
    "path": "test/transform/resource/before/DataOnEnum.java",
    "content": "@lombok.Getter\n@lombok.ToString\n@lombok.RequiredArgsConstructor\npublic enum DataOnEnum {\n\tA(\"hello\");\n\tprivate final String someField;\n}"
  },
  {
    "path": "test/transform/resource/before/DataOnLocalClass.java",
    "content": "//version 8:\nimport lombok.Data;\nclass DataOnLocalClass1 {\n\tpublic static void main(String[] args) {\n\t\t@Data class Local {\n\t\t\tfinal int x;\n\t\t\tString name;\n\t\t}\n\t}\n}\nclass DataOnLocalClass2 {\n\t{\n\t\t@Data class Local {\n\t\t\tfinal int x;\n\t\t\t@Data class InnerLocal {\n\t\t\t\t@lombok.NonNull String name;\n\t\t\t}\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/DataOnRecord.java",
    "content": "// version 14:\n\nimport lombok.Data;\n\n@Data\npublic record DataOnRecord(String a, String b) {\n}"
  },
  {
    "path": "test/transform/resource/before/DataPlain.java",
    "content": "import lombok.Data;\n@lombok.Data class Data1 {\n\tfinal int x;\n\tString name;\n}\n@Data class Data2 {\n\tfinal int x;\n\tString name;\n}\nfinal @Data class Data3 {\n\tfinal int x;\n\tString name;\n}\n@Data \n@lombok.EqualsAndHashCode(callSuper=true)\nfinal class Data4 extends java.util.Timer {\n\tint x;\n\tData4() {\n\t\tsuper();\n\t}\n}\n@Data\nclass Data5 {\n}\n@Data\nfinal class Data6 {\n}\n"
  },
  {
    "path": "test/transform/resource/before/DataWithGetter.java",
    "content": "@lombok.Data @lombok.Getter\nclass DataWithGetter {\n\tprivate int x, y;\n\tprivate final String z;\n}"
  },
  {
    "path": "test/transform/resource/before/DataWithGetterNone.java",
    "content": "@lombok.Data @lombok.Getter(lombok.AccessLevel.NONE)\nclass DataWithGetterNone {\n\tprivate int x, y;\n\tprivate final String z;\n}"
  },
  {
    "path": "test/transform/resource/before/DataWithOverrideEqualsAndHashCode.java",
    "content": "import lombok.Data;\n\nclass DataWithOverrideEqualsAndHashCode {\n\tclass Data1 {\n\t\t\n\t}\n\t\n\t@Data\n\tclass Data2 extends Data1 {\n\t\tpublic int hashCode() {\n\t\t\treturn 42;\n\t\t}\n\t\t\n\t\tpublic boolean equals(Object other) {\n\t\t\treturn false;\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/DelegateAlreadyImplemented.java",
    "content": "//platform !eclipse: Requires a 'full' eclipse with intialized workspace, and we don't (yet) have that set up properly in the test run.\npublic class DelegateAlreadyImplemented<T> {\n\t\n\t@lombok.experimental.Delegate\n\tprivate A<Integer, T> a;\n\t\n\tpublic void a() {\n\t}\n\t\n\tpublic void b(java.util.List<String> l) {\n\t}\n\t\n\tpublic void c(java.util.List<Integer> l, String[] a, Integer... varargs) {\n\t}\n\t\n\tpublic void d(String[][][][] d) {\n\t}\n\t\n\tpublic <Y> void e(Y x) {\n\t}\n\t\n\t@SuppressWarnings(\"unchecked\")\n\tpublic void f(T s, java.util.List<T> l, T[] a, T... varargs) {\n\t}\n\t\n\tpublic void g(Number g) {\n\t}\n}\n\ninterface A<T, T2> {\n\tpublic void a();\n\t\n\tpublic void b(java.util.List<T> l);\n\t\n\t@SuppressWarnings(\"unchecked\")\n\tpublic void c(java.util.List<T> l, String[] a, T... varargs);\n\t\n\tpublic void d(String[][][][] d);\n\t\n\tpublic <X> X e(X x);\n\t\n\t@SuppressWarnings(\"unchecked\")\n\tpublic void f(T2 s, java.util.List<T2> l, T2[] a, T2... varargs);\n\t\n\tpublic <G extends Number> void g(G g);\n}"
  },
  {
    "path": "test/transform/resource/before/DelegateFlagUsage.java",
    "content": "//platform !eclipse: Requires a 'full' eclipse with intialized workspace, and we don't (yet) have that set up properly in the test run.\n//conf: lombok.delegate.flagUsage = warning\n//skip compare content: We're just checking if the flagUsage key works.\npublic class DelegateFlagUsage {\n\t@lombok.experimental.Delegate Runnable r = null;\n}"
  },
  {
    "path": "test/transform/resource/before/DelegateGenerics.java",
    "content": "//platform !eclipse: Requires a 'full' eclipse with intialized workspace, and we don't (yet) have that set up properly in the test run.\npublic class DelegateGenerics<T> {\n\t@lombok.experimental.Delegate\n\tI1<T> target;\n}\n\ninterface I1<T> extends I2<T, Integer, String> {\n}\ninterface I2<A, T, I> extends I3<Integer, I, A> {\n}\ninterface I3<T, I, A> {\n\tpublic T t(T t);\n\tpublic I i(I a);\n\tpublic A a(A a);\n}"
  },
  {
    "path": "test/transform/resource/before/DelegateOnGetter.java",
    "content": "//platform !eclipse: Requires a 'full' eclipse with intialized workspace, and we don't (yet) have that set up properly in the test run.\nimport lombok.Delegate;\nimport lombok.Getter;\n\nclass DelegateOnGetter {\n\n\t@Delegate @Getter(lazy=true) private final Bar bar = new Bar() { \n\t\tpublic void setList(java.util.ArrayList<String> list) {\n\t\t}\n\t\tpublic int getInt() {\n\t\t\treturn 42;\n\t\t}\n\t};\n\n\tprivate interface Bar {\n\t\tvoid setList(java.util.ArrayList<java.lang.String> list);\n\t\tint getInt();\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/DelegateOnGetterNone.java",
    "content": "//platform !eclipse: Requires a 'full' eclipse with intialized workspace, and we don't (yet) have that set up properly in the test run.\nimport lombok.AccessLevel;\nimport lombok.experimental.Delegate;\nimport lombok.Getter;\n\n@Getter\nclass DelegateOnGetterNone {\n\n\t@Delegate @Getter(AccessLevel.NONE) private final Bar bar = null;\n\n\tprivate interface Bar {\n\t\tvoid setList(java.util.ArrayList<java.lang.String> list);\n\t\tint getInt();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/DelegateOnLocalClass.java",
    "content": "//platform !eclipse: Requires a 'full' eclipse with intialized workspace, and we don't (yet) have that set up properly in the test run.\n//skip compare content\n//ignore: crashed javac with NPE, should be enabled when that bug is fixed\nimport lombok.experimental.Delegate;\nimport lombok.Getter;\n\ninterface DelegateOnLocalClass {\n\tvoid test1() {\n\t\tclass DelegateOnStatic {\n\t\t\t@Delegate private final java.lang.Runnable field = null;\n\t\t}\n\t}\n\t\n\tvoid test2() {\n\t\tRunnable r = new Runnable() {\n\t\t\t@Delegate private final java.lang.Runnable field = null;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/DelegateOnMethods.java",
    "content": "//platform !eclipse: Requires a 'full' eclipse with intialized workspace, and we don't (yet) have that set up properly in the test run.\nimport lombok.experimental.Delegate;\n\nabstract class DelegateOnMethods {\n\n\t@Delegate\n\tpublic abstract Bar getBar();\n\n\tpublic static interface Bar {\n\t\tvoid bar(java.util.ArrayList<java.lang.String> list);\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/DelegateOnRecord.java",
    "content": "//platform !eclipse: Requires a 'full' eclipse with intialized workspace, and we don't (yet) have that set up properly in the test run.\n//version 14:\nimport lombok.experimental.Delegate;\n\nrecord DelegateOnRecord(@Delegate Runnable runnable) {\n}\n"
  },
  {
    "path": "test/transform/resource/before/DelegateOnStatic.java",
    "content": "//platform !eclipse: Requires a 'full' eclipse with intialized workspace, and we don't (yet) have that set up properly in the test run.\n//skip compare content\nimport lombok.experimental.Delegate;\nimport lombok.Getter;\n\nclass DelegateOnStatic {\n\t@Delegate private static final java.lang.Runnable staticField = null;\n}\n\nclass DelegateOnStaticMethod {\n\t@Delegate private static final java.lang.Runnable staticMethod() {\n\t\treturn null;\n\t}; \n}"
  },
  {
    "path": "test/transform/resource/before/DelegateRecursion.java",
    "content": "//platform !eclipse: Requires a 'full' eclipse with intialized workspace, and we don't (yet) have that set up properly in the test run.\n//skip compare content: This test is to see if the 'delegate recursion is not supported' error pops up.\nimport lombok.experimental.Delegate;\nclass DelegateRecursionOuterMost {\n\t@Delegate\n\tprivate final DelegateRecursionCenter center = new DelegateRecursionCenter();\n}\n\nclass DelegateRecursionCenter {\n\t@Delegate\n\tprivate final DelegateRecursionInnerMost inner = new DelegateRecursionInnerMost();\n}\n\nclass DelegateRecursionInnerMost {\n\tpublic void innerMostMethod() {\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/DelegateTypesAndExcludes.java",
    "content": "//platform !eclipse: Requires a 'full' eclipse with intialized workspace, and we don't (yet) have that set up properly in the test run.\nimport lombok.experimental.Delegate;\nclass DelegatePlain {\n\t@Delegate(types = Bar.class)\n\tprivate final BarImpl bar = new BarImpl();\n\t@Delegate(types = Foo.class, excludes = Bar.class)\n\tprivate final FooImpl foo = new FooImpl();\n\n\tprivate static class FooImpl implements Foo {\n\t\tpublic void foo() {\n\t\t}\n\n\t\tpublic void bar(java.util.ArrayList<java.lang.String> list) {\n\t\t}\n\t}\n\n\tprivate static class BarImpl implements Bar {\n\t\tpublic void bar(java.util.ArrayList<java.lang.String> list) {\n\t\t}\n\t}\n\n\tprivate static interface Foo extends Bar {\n\t\tvoid foo();\n\t}\n\n\tprivate static interface Bar {\n\t\tvoid bar(java.util.ArrayList<java.lang.String> list);\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/DelegateWithDeprecated.java",
    "content": "//platform !eclipse: Requires a 'full' eclipse with intialized workspace, and we don't (yet) have that set up properly in the test run.\nimport lombok.experimental.Delegate;\n\nclass DelegateWithDeprecated {\n\t@Delegate private Bar bar;\n\n\tprivate interface Bar {\n\t\t@Deprecated\n\t\tvoid deprecatedAnnotation();\n\t\t/**\n\t\t * @deprecated\n\t\t */\n\t\tvoid deprecatedComment();\n\t\tvoid notDeprecated();\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/DelegateWithVarargs.java",
    "content": "//platform !eclipse: Requires a 'full' eclipse with intialized workspace, and we don't (yet) have that set up properly in the test run.\nimport lombok.experimental.Delegate;\n\nclass DelegateWithVarargs {\n\t@Delegate private Bar bar;\n\n\tprivate interface Bar {\n\t\tvoid justOneParameter(int... varargs);\n\t\tvoid multipleParameters(String first, int... varargs);\n\t\tvoid array(int[] array);\n\t\tvoid arrayVarargs(int[]... arrayVarargs);\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/DelegateWithVarargs2.java",
    "content": "//platform !eclipse: Requires a 'full' eclipse with intialized workspace, and we don't (yet) have that set up properly in the test run.\nimport lombok.experimental.Delegate;\n\nclass DelegateWithVarargs2 {\n\t@Delegate private DelegateWithVarargs2.B bar;\n\n\tpublic class B {\n\t\tpublic void varargs(Object[]... keys) {}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/EncodingUsAscii.java",
    "content": "//ENCODING: US-ASCII\n@lombok.ToString\nclass EncodingUsAscii {\n\tString foo\\u0e51\\u0e51 = \"\\u000e\t\\10 \";\n}"
  },
  {
    "path": "test/transform/resource/before/EncodingUtf8.java",
    "content": "//ENCODING: UTF-8\n@lombok.ToString\nclass EncodingUtf8 {\n\tString foo\\u0e51๑ = \"\\u000e\t\\10 \";\n}"
  },
  {
    "path": "test/transform/resource/before/EqualsAndHashCode.java",
    "content": "@lombok.EqualsAndHashCode\nclass EqualsAndHashCode {\n\tint x;\n\tboolean[] y;\n\tObject[] z;\n\tString a;\n\tString b;\n}\n\n@lombok.EqualsAndHashCode\nfinal class EqualsAndHashCode2 {\n\tint x;\n\tlong y;\n\tfloat f;\n\tdouble d;\n\tboolean b;\n}\n\n@lombok.EqualsAndHashCode(callSuper=false)\nfinal class EqualsAndHashCode3 extends EqualsAndHashCode {\n}\n\n@lombok.EqualsAndHashCode(callSuper=true)\nclass EqualsAndHashCode4 extends EqualsAndHashCode {\n}"
  },
  {
    "path": "test/transform/resource/before/EqualsAndHashCodeAnnotated.java",
    "content": "//version 8:\nimport java.lang.annotation.*;\n\n@lombok.EqualsAndHashCode\nclass EqualsAndHashCodeAnnotated {\n\t@Annotated int primitive;\n\t@Annotated Object object;\n\t\n\tint @Annotated [] primitiveValues;\n\tint @Annotated [] @Annotated [] morePrimitiveValues;\n\t\n\tInteger @Annotated [] objectValues;\n\tInteger @Annotated [] @Annotated [] moreObjectValues;\n\t\n\t@Target(ElementType.TYPE_USE)\n\t@Retention(RetentionPolicy.SOURCE)\n\t@interface Annotated {\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/EqualsAndHashCodeAutoExclude.java",
    "content": "@lombok.EqualsAndHashCode\nclass EqualsAndHashCodeAutoExclude {\n\tint x;\n\tString $a;\n\ttransient String b;\n}\n@lombok.EqualsAndHashCode\nclass EqualsAndHashCodeAutoExclude2 {\n\tint x;\n\t@lombok.EqualsAndHashCode.Include\n\tString $a;\n\t@lombok.EqualsAndHashCode.Include\n\ttransient String b;\n}\n"
  },
  {
    "path": "test/transform/resource/before/EqualsAndHashCodeCache.java",
    "content": "@lombok.EqualsAndHashCode(cacheStrategy = lombok.EqualsAndHashCode.CacheStrategy.LAZY)\nclass EqualsAndHashCode {\n\tint x;\n\tboolean[] y;\n\tObject[] z;\n\tString a;\n\tString b;\n}\n\n@lombok.EqualsAndHashCode(cacheStrategy = lombok.EqualsAndHashCode.CacheStrategy.LAZY)\nfinal class EqualsAndHashCode2 {\n\tint x;\n\tlong y;\n\tfloat f;\n\tdouble d;\n\tboolean b;\n}\n\n@lombok.EqualsAndHashCode(callSuper=false, cacheStrategy = lombok.EqualsAndHashCode.CacheStrategy.LAZY)\nfinal class EqualsAndHashCode3 extends EqualsAndHashCode {\n}\n\n@lombok.EqualsAndHashCode(callSuper=true, cacheStrategy = lombok.EqualsAndHashCode.CacheStrategy.LAZY)\nclass EqualsAndHashCode4 extends EqualsAndHashCode {\n}\n\n@lombok.EqualsAndHashCode(callSuper=true, cacheStrategy = lombok.EqualsAndHashCode.CacheStrategy.LAZY)\nfinal class EqualsAndHashCode5 extends EqualsAndHashCode {\n}"
  },
  {
    "path": "test/transform/resource/before/EqualsAndHashCodeConfigKeys1.java",
    "content": "//CONF: lombok.equalsAndHashCode.callSuper = skip\n\n@lombok.EqualsAndHashCode\nclass EqualsAndHashCodeConfigKeys1Parent {\n}\n@lombok.EqualsAndHashCode\nclass EqualsAndHashCodeConfigKeys1 extends EqualsAndHashCodeConfigKeys1Parent {\n\tint x;\n}\n"
  },
  {
    "path": "test/transform/resource/before/EqualsAndHashCodeConfigKeys2.java",
    "content": "//CONF: lombok.equalsAndHashCode.callSuper = call\n@lombok.EqualsAndHashCode\nclass EqualsAndHashCodeConfigKeys2Object extends Object {\n}\n@lombok.EqualsAndHashCode\nclass EqualsAndHashCodeConfigKeys2Parent {\n}\n@lombok.EqualsAndHashCode\nclass EqualsAndHashCodeConfigKeys2 extends EqualsAndHashCodeConfigKeys2Parent {\n\tint x;\n}\n"
  },
  {
    "path": "test/transform/resource/before/EqualsAndHashCodeEmpty.java",
    "content": "@lombok.EqualsAndHashCode\nclass EqualsAndHashCodeEmpty {\n}\n\n@lombok.EqualsAndHashCode(callSuper = true)\nclass EqualsAndHashCodeEmptyWithSuper extends EqualsAndHashCodeEmpty {\n}\n"
  },
  {
    "path": "test/transform/resource/before/EqualsAndHashCodeExplicitInclude.java",
    "content": "@lombok.EqualsAndHashCode(onlyExplicitlyIncluded = true)\nclass EqualsAndHashCodeExplicitInclude {\n\tint x;\n}\n"
  },
  {
    "path": "test/transform/resource/before/EqualsAndHashCodeInAnonymousClass.java",
    "content": "import lombok.EqualsAndHashCode;\n\npublic class EqualsAndHashCodeInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\t@EqualsAndHashCode\n\t\tclass Inner {\n\t\t\tprivate String string;\n\t\t}\n\t};\n}"
  },
  {
    "path": "test/transform/resource/before/EqualsAndHashCodeNestedShadow.java",
    "content": "interface EqualsAndHashCodeNestedShadow {\n\tinterface Foo {\n\t}\n\tclass Bar {\n\t\t@lombok.EqualsAndHashCode(callSuper=false)\n\t\tpublic static class Foo extends Bar implements EqualsAndHashCodeNestedShadow.Foo {\n\t\t}\n\t}\n\t\n\tclass Baz {\n\t\t@lombok.EqualsAndHashCode(callSuper=false)\n\t\tpublic static class Foo<T> extends Bar implements EqualsAndHashCodeNestedShadow.Foo {\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/EqualsAndHashCodeNewStyle.java",
    "content": "import lombok.EqualsAndHashCode;\n@EqualsAndHashCode\npublic class EqualsAndHashCodeNewStyle {\n\t@EqualsAndHashCode.Include int b;\n\tdouble c;\n\tint f;\n\t@EqualsAndHashCode.Include int d;\n\t@EqualsAndHashCode.Include int f() {\n\t\treturn 0;\n\t}\n\tint g;\n\t@EqualsAndHashCode.Include(replaces = \"g\") long i() {\n\t\treturn 0;\n\t}\n\t@EqualsAndHashCode.Exclude int j;\n}\n"
  },
  {
    "path": "test/transform/resource/before/EqualsAndHashCodeOfAndExclude.java",
    "content": "@lombok.EqualsAndHashCode(of={\"x\"})\nfinal class EqualsAndHashCodeOf {\n\tint x;\n\tint y;\n}\n\n@lombok.EqualsAndHashCode(exclude={\"y\"})\nfinal class EqualsAndHashCodeExclude {\n\tint x;\n\tint y;\n}\n"
  },
  {
    "path": "test/transform/resource/before/EqualsAndHashCodeOfAndExcludeError.java",
    "content": "// skip-compare-contents\n@lombok.EqualsAndHashCode(of={\"x\", Const.A})\nfinal class EqualsAndHashCodeErrorOf {\n\tint x;\n}\n\n@lombok.EqualsAndHashCode(exclude={\"x\", Const.A})\nfinal class EqualsAndHashCodeErrorExclude {\n\tint x;\n}\n\nclass Const {\n\tstatic final String A = \"A\";\n}"
  },
  {
    "path": "test/transform/resource/before/EqualsAndHashCodeOfAndExcludeWarn.java",
    "content": "// skip-compare-contents\n@lombok.EqualsAndHashCode(of={\"y\"})\nfinal class EqualsAndHashCodeWarnOf {\n\tint x;\n}\n\n@lombok.EqualsAndHashCode(exclude={\"y\"})\nfinal class EqualsAndHashCodeWarnExclude {\n\tint x;\n}\n"
  },
  {
    "path": "test/transform/resource/before/EqualsAndHashCodeOnRecord.java",
    "content": "// version 14:\n\nimport lombok.EqualsAndHashCode;\n\n@EqualsAndHashCode\npublic record EqualsAndHashCodeOnRecord(String a, String b) {\n}"
  },
  {
    "path": "test/transform/resource/before/EqualsAndHashCodeRank.java",
    "content": "import lombok.EqualsAndHashCode;\n@EqualsAndHashCode\npublic class EqualsAndHashCodeRank {\n\t@EqualsAndHashCode.Include int a;\n\t@EqualsAndHashCode.Include(rank = 10) int b;\n\t@EqualsAndHashCode.Include int c;\n}\n"
  },
  {
    "path": "test/transform/resource/before/EqualsAndHashCodeWithExistingMethods.java",
    "content": "@lombok.EqualsAndHashCode\nclass EqualsAndHashCodeWithExistingMethods {\n\tint x;\n\t\n\tpublic int hashCode() {\n\t\treturn 42;\n\t}\n}\n\n@lombok.EqualsAndHashCode\nfinal class EqualsAndHashCodeWithExistingMethods2 {\n\tint x;\n\t\n\tpublic boolean equals(Object other) {\n\t\treturn false;\n\t}\n}\n\n@lombok.EqualsAndHashCode(callSuper=true)\nfinal class EqualsAndHashCodeWithExistingMethods3 extends EqualsAndHashCodeWithExistingMethods {\n\tint x;\n\t\n\tprivate boolean canEqual(Object other) {\n\t\treturn true;\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/EqualsAndHashCodeWithGenericsOnInners.java",
    "content": "public class EqualsAndHashCodeWithGenericsOnInners<A> {\n\t@lombok.EqualsAndHashCode class Inner<B> {\n\t\tint x;\n\t}\n}\n\n"
  },
  {
    "path": "test/transform/resource/before/EqualsAndHashCodeWithGenericsOnInnersInInterfaces.java",
    "content": "public interface EqualsAndHashCodeWithGenericsOnInnersInInterfaces<A> {\n\t@lombok.EqualsAndHashCode class Inner<B> {\n\t\tint x;\n\t}\n}\n\n"
  },
  {
    "path": "test/transform/resource/before/EqualsAndHashCodeWithNonNullByDefault.java",
    "content": "//CONF: lombok.addNullAnnotations = javax\nimport javax.annotation.ParametersAreNonnullByDefault;\n@lombok.EqualsAndHashCode\n@ParametersAreNonnullByDefault\nclass EqualsAndHashCodeWithNonNullByDefault {\n}"
  },
  {
    "path": "test/transform/resource/before/EqualsAndHashCodeWithOnParam.java",
    "content": "@interface Nullable {\n}\n\n@lombok.EqualsAndHashCode(onParam=@__({@Nullable}))\nclass EqualsAndHashCodeWithOnParam {\n\tint x;\n\tboolean[] y;\n\tObject[] z;\n\tString a;\n\tString b;\n}"
  },
  {
    "path": "test/transform/resource/before/EqualsAndHashCodeWithSomeExistingMethods.java",
    "content": "import lombok.*;\nimport static lombok.AccessLevel.NONE;\n\n@Data\n@Getter(NONE)\n@Setter(NONE)\nclass EqualsAndHashCodeWithSomeExistingMethods {\n\tint x;\n\t\n\tpublic int hashCode() {\n\t\treturn 42;\n\t}\n}\n\n@Data\n@Getter(NONE)\n@Setter(NONE)\nclass EqualsAndHashCodeWithSomeExistingMethods2 {\n\tint x;\n\t\n\tprotected boolean canEqual(Object other) {\n\t\treturn false;\n\t}\n}\n\n@Data\n@Getter(NONE)\n@Setter(NONE)\nclass EqualsAndHashCodeWithAllExistingMethods {\n\tint x;\n\t\n\tpublic int hashCode() {\n\t\treturn 42;\n\t}\n\t\n\tpublic boolean equals(Object other) {\n\t\treturn false;\n\t}\n}\n\n@Data\n@Getter(AccessLevel.NONE)\n@Setter(lombok.AccessLevel.NONE)\nclass EqualsAndHashCodeWithNoExistingMethods {\n\tint x;\n}\n\n"
  },
  {
    "path": "test/transform/resource/before/ExtensionMethodAmbiguousFunctional.java",
    "content": "//version 8:\nimport java.util.function.Consumer;\nimport java.util.function.Function;\n\nimport lombok.experimental.ExtensionMethod;\n\n@ExtensionMethod({ExtensionMethodAmbiguousFunctional.Extensions.class})\nclass ExtensionMethodAmbiguousFunctional {\n\tpublic void test() {\n\t\t\"\".ambiguous(System.out::println);\n\t}\n\t\n\tstatic class Extensions {\n\t\tpublic static <T, R> void ambiguous(T t, Function<T, R> function) {\n\t\t}\n\t\t\n\t\tpublic static <T> void ambiguous(T t, Consumer<T> function) {\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/ExtensionMethodAutoboxing.java",
    "content": "import lombok.experimental.ExtensionMethod;\n\n@ExtensionMethod({ExtensionMethodAutoboxing.Extensions.class})\nclass ExtensionMethodAutoboxing {\n\tpublic void test() {\n\t\tLong l1 = 1l;\n\t\tlong l2 = 1l;\n\t\tInteger i1 = 1;\n\t\tint i2 = 1;\n\t\t\n\t\tString string = \"test\";\n\t\tstring.boxing(l1, i1);\n\t\tstring.boxing(l1, i2);\n\t\tstring.boxing(l2, i1);\n\t\tstring.boxing(l2, i2);\n\t}\n\t\n\tstatic class Extensions {\n\t\tpublic static String boxing(String string, Long a, int b) {\n\t\t\treturn string + \" \" + a + \" \" + b;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/ExtensionMethodChain.java",
    "content": "import java.util.Arrays;\nimport java.util.List;\nimport lombok.experimental.ExtensionMethod;\n\n@ExtensionMethod(ExtensionMethodChain.Extensions.class)\nclass ExtensionMethodChain {\n\t\n\tpublic void test() {\n\t\t\"1\".intValue().intValue();\n\t}\n\t\n\tstatic class Extensions {\n\t\tpublic static Integer intValue(String s) {\n\t\t\treturn Integer.valueOf(s);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/ExtensionMethodFunctional.java",
    "content": "// version 8:\nimport java.util.function.Consumer;\nimport java.util.function.Function;\nimport java.util.List;\nimport java.util.stream.Collectors;\nimport java.util.stream.Stream;\n\nimport lombok.experimental.ExtensionMethod;\n\n@ExtensionMethod(value = ExtensionMethodFunctional.Extensions.class, suppressBaseMethods = false)\nclass ExtensionMethodFunctional {\n\tpublic void test() {\n\t\tString test = \"test\";\n\t\ttest = test.map(s -> s.reverse());\n\t\t\n\t\ttest.consume(s -> System.out.println(\"1: \" + s), s -> System.out.println(\"2: \" + s));\n\t\ttest.consume(System.out::println, System.out::println);\n\t\t\n\t\ttest.consume(test.length() > 0 ? System.out::println : null);\n\t\t\n\t\tStream.of(\"a\", \"b\", \"c\").map(String::toUpperCase).toList1();\n\t\tList<Integer> i2 = Stream.of(\"a\", \"b\", \"c\").map(String::toUpperCase).toList2();\n\t}\n\t\n\tstatic class Extensions {\n\t\tpublic static <T, R> R map(T value, Function<T, R> mapper) {\n\t\t\treturn mapper.apply(value);\n\t\t}\n\t\t\n\t\tpublic static String reverse(String string) {\n\t\t\treturn new StringBuilder(string).reverse().toString();\n\t\t}\n\n\t\t@SafeVarargs\n\t\tpublic static <T> void consume(T o, Consumer<T>... consumer) {\n\t\t\tfor (int i = 0; i < consumer.length; i++) {\n\t\t\t\tconsumer[i].accept(o);\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic static <T> List<T> toList1(Stream<T> stream) {\n\t\t\treturn (List<T>) stream.collect(Collectors.toList());\n\t\t}\n\t\t\n\t\tpublic static <T, U> List<U> toList2(Stream<T> stream) {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/ExtensionMethodGeneric.java",
    "content": "import java.util.List;\nimport java.util.Map;\n\nimport lombok.experimental.ExtensionMethod;\n\n@ExtensionMethod(ExtensionMethodGeneric.Extensions.class)\nclass ExtensionMethodGeneric {\n\tpublic void test() {\n\t\tList<String> stringList = null;\n\t\tList<Number> numberList = null;\n\t\tstringList.test();\n\t\tstringList.test(numberList);\n\t\tstringList.test(stringList).test(numberList);\n\t\tInteger i = stringList.test2();\n\t\t\n\t\tMap<String, Integer> map = null;\n\t\tList<String> l = map.test(stringList, numberList);\n\t}\n\t\n\tstatic class Extensions {\n\t\tpublic static <T> List<T> test(List<String> obj, List<T> list) {\n\t\t\treturn null;\n\t\t}\n\t\tpublic static <K,V> K test(Map<String, Integer> obj, K k, V v) {\n\t\t\treturn k;\n\t\t}\n\t\tpublic static <T> T test(List<T> list) {\n\t\t\treturn null;\n\t\t}\n\t\tpublic static <T,U> U test2(List<T> list) {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/ExtensionMethodInLambda.java",
    "content": "// version 8:\nimport java.util.function.Function;\nimport lombok.experimental.ExtensionMethod;\n\n@ExtensionMethod(value = ExtensionMethodInLambda.Extensions.class)\npublic class ExtensionMethodInLambda {\n\tprivate static final Function<String, String> testStatic = s -> s.reverse();\n\t\n\tpublic void testSimple() {\n\t\tString test = \"test\";\n\t\ttest = test.map(s -> s.reverse());\n\t}\n\t\n\tpublic void testSameName() {\n\t\tString test = \"test\";\n\t\ttest = test.map(s -> s.trim());\n\t}\n\t\n\tpublic void testArgumentOfInvalidMethod() {\n\t\tString test = \"test\";\n\t\ttest.invalid(s -> s.reverse());\n\t}\n\t\n\tstatic class Extensions {\n\t\tpublic static <T, R> R map(T value, Function<T, R> mapper) {\n\t\t\treturn mapper.apply(value);\n\t\t}\n\t\t\n\t\tpublic static String reverse(String string) {\n\t\t\treturn new StringBuilder(string).reverse().toString();\n\t\t}\n\t\t\n\t\tpublic static String trim(Integer integer) {\n\t\t\treturn \"0\";\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/ExtensionMethodNames.java",
    "content": "package a;\n\nimport lombok.experimental.ExtensionMethod;\n\n@ExtensionMethod(Extensions.class)\nclass ExtensionMethodNames {\n\t\n\tpublic void instanceCalls() {\n\t\t(new Test()).ext();\n\t\t\n\t\tTest t = new Test();\n\t\tt.ext();\n\t\t\n\t\tTest Test = new Test();\n\t\tTest.ext();\n\t}\n\t\n\tpublic void staticCalls() {\n\t\tTest.ext();\n\t\ta.Test.ext();\n\t}\n}\n\nclass Extensions {\n\tpublic static void ext(Test t) {\n\t}\n}\n\nclass Test {\n\tpublic static void ext() {\n\t\t\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/ExtensionMethodNonStatic.java",
    "content": "import lombok.experimental.ExtensionMethod;\n\n@ExtensionMethod({ExtensionMethodNonStatic.Extensions.class})\nclass ExtensionMethodNonStatic {\n\tpublic void test() {\n\t\tString s = \"test\";\n\t\ts.startsWith(\"\");\n\t}\n\n\tstatic class Extensions {\n\t\tpublic boolean startsWith(String s, String prefix) {\n\t\t\treturn s.startsWith(prefix);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/ExtensionMethodNonStaticAccess.java",
    "content": "//issue #2752: this test triggers an indirect static access and a non static access warning for the same method call\n//platform ecj,eclipse\nclass ExtensionMethodNonStaticAccess {\n  public void method(){\n      Derived derived = new Derived();\n      derived.staticMethod();\n  }\n}\n\nclass Base {\n    static String staticMethod() {\n        return \"\";\n    }\n}\n\nclass Derived extends Base {\n    \n}"
  },
  {
    "path": "test/transform/resource/before/ExtensionMethodOnRecord.java",
    "content": "// version 14:\nimport lombok.experimental.ExtensionMethod;\n\n@ExtensionMethod(ExtensionMethodOnRecord.Extensions.class)\npublic record ExtensionMethodOnRecord() {\n\t\n\tpublic void test() {\n\t\t\"1\".intValue();\n\t}\n\t\n\tstatic class Extensions {\n\t\tpublic static Integer intValue(String s) {\n\t\t\treturn Integer.valueOf(s);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/ExtensionMethodPlain.java",
    "content": "import lombok.experimental.ExtensionMethod;\n\n@ExtensionMethod({java.util.Arrays.class, ExtensionMethodPlain.Extensions.class})\nclass ExtensionMethodPlain {\n\tpublic String test() {\n\t\tint[] intArray = {5, 3, 8, 2};\n\t\tintArray.sort();\n\t\t\n\t\tString iAmNull = null;\n\t\treturn iAmNull.or(\"hELlO, WORlD!\".toTitleCase());\n\t}\n\t\n\tstatic class Extensions {\n\t\tpublic static <T> T or(T obj, T ifNull) {\n\t\t\treturn obj != null ? obj : ifNull;\n\t\t}\n\t\t\n\t\tpublic static String toTitleCase(String in) {\n\t\t\tif (in.isEmpty()) return in;\n\t\t\treturn \"\" + Character.toTitleCase(in.charAt(0)) + in.substring(1).toLowerCase();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/ExtensionMethodSuppress.java",
    "content": "import lombok.experimental.ExtensionMethod;\n\n@ExtensionMethod(Extensions.class)\nclass ExtensionMethodSuppress {\n\tpublic void test() {\n\t\tTest.staticMethod();\n\t\t\n\t\tTest test = new Test();\n\t\ttest.instanceMethod();\n\t\ttest.staticMethod();\n\t}\n}\n\n@ExtensionMethod(value = Extensions.class, suppressBaseMethods = false)\nclass ExtensionMethodKeep {\n\tpublic void test() {\n\t\tTest.staticMethod();\n\t\t\n\t\tTest test = new Test();\n\t\ttest.instanceMethod();\n\t\ttest.staticMethod();\n\t}\n}\n\nclass Test {\n\tpublic static void staticMethod() {\n\t\t\n\t}\n\t\n\tpublic void instanceMethod() {\n\t\t\n\t}\n}\n\nclass Extensions {\n\tpublic static void staticMethod(Test test) {\n\t\t\n\t}\n\t\n\tpublic static void instanceMethod(Test test) {\n\t\t\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/ExtensionMethodVarargs.java",
    "content": "// version 8:\nimport lombok.experimental.ExtensionMethod;\n\n@ExtensionMethod(ExtensionMethodVarargs.Extensions.class)\nclass ExtensionMethodVarargs {\n\tpublic void test() {\n\t\tLong l1 = 1l;\n\t\tlong l2 = 1l;\n\t\tInteger i1 = 1;\n\t\tint i2 = 1;\n\t\t\n\t\t\"%d %d %d %d\".format(l1, l2, i1, i2);\n\t\t\"%d\".format(l1);\n\t\t\"\".format(new Integer[]{1,2});\n\t\t\"\".format(new Integer[]{1,2}, new Integer[]{1,2});\n\t}\n\n\tstatic class Extensions {\n\t\tpublic static String format(String string, Object... params) {\n\t\t\treturn String.format(string, params);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/ExtensionMethodWidening.java",
    "content": "import lombok.experimental.ExtensionMethod;\n\n@ExtensionMethod({ExtensionMethodWidening.Extensions.class})\nclass ExtensionMethodWidening {\n\tpublic void test() {\n\t\tString string = \"test\";\n\t\tstring.widening(1);\n\t}\n\t\n\tstatic class Extensions {\n\t\tpublic static String widening(String string, long a) {\n\t\t\treturn string + \" \" + a;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/FieldDefaults.java",
    "content": "@lombok.experimental.FieldDefaults(makeFinal = true)\nclass FieldDefaults1 {\n\tstatic int STATIC = 3;\n\tint x;\n\t@lombok.experimental.NonFinal int y;\n\t\n\tFieldDefaults1(int x) {\n\t\tthis.x = x;\n\t}\n}\n\n@lombok.experimental.FieldDefaults(level = lombok.AccessLevel.PRIVATE)\nclass FieldDefaults2 {\n\tstatic int STATIC = 3;\n\t@lombok.experimental.PackagePrivate int x;\n\tint y;\n}"
  },
  {
    "path": "test/transform/resource/before/FieldDefaultsNoop.java",
    "content": "@lombok.experimental.FieldDefaults\nclass FieldDefaultsNoop {\n}"
  },
  {
    "path": "test/transform/resource/before/FieldDefaultsOnRecord.java",
    "content": "// version 14:\n\n@lombok.experimental.FieldDefaults(makeFinal = true)\npublic record FieldDefaultsOnRecord(String a, String b) {\n}"
  },
  {
    "path": "test/transform/resource/before/FieldDefaultsViaConfig.java",
    "content": "//CONF: lombok.fieldDefaults.defaultFinal = true\n//CONF: lombok.fieldDefaults.defaultPrivate = true\nclass FieldDefaultsViaConfig1 {\n\tint x;\n\t@lombok.experimental.NonFinal int y;\n\t\n\tFieldDefaultsViaConfig1(int x) {\n\t\tthis.x = x;\n\t}\n}\n\n@lombok.experimental.FieldDefaults(level = lombok.AccessLevel.PROTECTED)\nclass FieldDefaultsViaConfig2 {\n\t@lombok.experimental.PackagePrivate int x = 2;\n\tint y = 0;\n}\n"
  },
  {
    "path": "test/transform/resource/before/FieldDefaultsViaConfigAndRequiredArgsConstructor.java",
    "content": "//CONF: lombok.fieldDefaults.defaultFinal = true\n@lombok.RequiredArgsConstructor\nclass FieldDefaultsViaConfigAndRequiredArgsConstructor {\n\tint x;\n}\n"
  },
  {
    "path": "test/transform/resource/before/FieldDefaultsViaConfigOnRecord.java",
    "content": "// version 14:\n//CONF: lombok.fieldDefaults.defaultFinal = true\n//CONF: lombok.fieldDefaults.defaultPrivate = true\n//unchanged\n\npublic record FieldDefaultsViaConfigOnRecord(String a, String b) {\n}"
  },
  {
    "path": "test/transform/resource/before/FieldNameConstantsBasic.java",
    "content": "import lombok.experimental.FieldNameConstants;\nimport lombok.AccessLevel;\n\n@FieldNameConstants(level = AccessLevel.PACKAGE)\npublic class FieldNameConstantsBasic {\n\tString iAmADvdPlayer;\n\tint $skipMe;\n\tstatic double skipMeToo;\n\t@FieldNameConstants.Exclude int andMe;\n\tString butPrintMePlease;\n}\n"
  },
  {
    "path": "test/transform/resource/before/FieldNameConstantsConfigKeys.java",
    "content": "//CONF: lombok.fieldNameConstants.innerTypeName = Foobar\n\n@lombok.experimental.FieldNameConstants\npublic class FieldNameConstantsConfigKeys {\n\tString iAmADvdPlayer;\n}\n"
  },
  {
    "path": "test/transform/resource/before/FieldNameConstantsEnum.java",
    "content": "import lombok.experimental.FieldNameConstants;\nimport lombok.AccessLevel;\n\n@FieldNameConstants(onlyExplicitlyIncluded = true, asEnum = true, innerTypeName = \"TypeTest\")\npublic class FieldNameConstantsEnum {\n\t@FieldNameConstants.Include\n\tString iAmADvdPlayer;\n\t@FieldNameConstants.Include\n\tint $dontSkipMe;\n\t@FieldNameConstants.Include\n\tstatic double alsoDontSkipMe;\n\tint butSkipMe;\n}\n"
  },
  {
    "path": "test/transform/resource/before/FieldNameConstantsHandrolled.java",
    "content": "import lombok.experimental.FieldNameConstants;\nimport lombok.AccessLevel;\n\n@FieldNameConstants(asEnum = true, innerTypeName = \"TypeTest\")\nclass FieldNameConstantsHandrolled1 {\n\tint field1, alsoAField, thirdField;\n\t\n\tpublic enum TypeTest {\n\t\tfield1\n\t}\n}\n\n@FieldNameConstants(asEnum = true, innerTypeName = \"TypeTest\")\nclass FieldNameConstantsHandrolled2 {\n\tint field1, alsoAField, thirdField;\n\t\n\tpublic enum TypeTest {\n\t\tfield1;\n\t\t\n\t\tpublic String foo() {\n\t\t\treturn name();\n\t\t}\n\t}\n}\n\n@FieldNameConstants\nclass FieldNameConstantsHandrolled3 {\n\tint field1, alsoAField, thirdField;\n\t\n\tstatic class Fields {\n\t\tpublic static final int alsoAField = 5;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/FieldNameConstantsInAnonymousClass.java",
    "content": "import lombok.experimental.FieldNameConstants;\n\npublic class FieldNameConstantsInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\t@FieldNameConstants\n\t\tclass Inner {\n\t\t\tprivate String string;\n\t\t}\n\t};\n}"
  },
  {
    "path": "test/transform/resource/before/FieldNameConstantsOnRecord.java",
    "content": "// version 14:\n\nimport lombok.experimental.FieldNameConstants;\nimport lombok.AccessLevel;\n\n@FieldNameConstants(level = AccessLevel.PACKAGE)\npublic record FieldNameConstantsOnRecord(String iAmADvdPlayer, int $skipMe, @FieldNameConstants.Exclude int andMe, String butPrintMePlease) {\n\tstatic double skipMeToo;\n}"
  },
  {
    "path": "test/transform/resource/before/FieldNameConstantsUppercased.java",
    "content": "//CONF: lombok.fieldNameConstants.uppercase = true\nimport lombok.experimental.FieldNameConstants;\nimport lombok.AccessLevel;\n\n@FieldNameConstants(level = AccessLevel.PACKAGE)\npublic class FieldNameConstantsUppercased {\n\tString iAmADvdPlayer;\n\tint $skipMe;\n\tstatic double skipMeToo;\n\t@FieldNameConstants.Exclude int andMe;\n\tString butPrintMePlease;\n}\n"
  },
  {
    "path": "test/transform/resource/before/FlagUsages.java",
    "content": "//skip compare content\n//CONF: lombok.Getter.flagUsage = WARNING\n//CONF: lombok.experimental.flagUsage = ERROR\n@lombok.experimental.FieldNameConstants\npublic class FlagUsages {\n\t@lombok.Getter String x;\n\n\tString z;\n\n\tpublic FlagUsages(String x, String y) {\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/GenerateSuppressFBWarnings.java",
    "content": "//VERSION 7:\n//CONF: lombok.extern.findbugs.addSuppressFBWarnings = true\nclass GenerateSuppressFBWarnings {\n\t@lombok.Getter int y;\n}\n"
  },
  {
    "path": "test/transform/resource/before/GeneratedJavaxJakarta.java",
    "content": "//CONF: lombok.addJavaxGeneratedAnnotation = true\n//CONF: lombok.addJakartaGeneratedAnnotation = true\nclass GeneratedJavaxJakarta {\n\t@lombok.Getter\n\tint x;\n}\n"
  },
  {
    "path": "test/transform/resource/before/GeneratedJavaxOffLombokOff.java",
    "content": "//CONF: lombok.addJavaxGeneratedAnnotation = false\n//CONF: lombok.addLombokGeneratedAnnotation = false\nclass GeneratedJavaxOffLombokOff {\n\t@lombok.Getter\n\tint x;\n}\n"
  },
  {
    "path": "test/transform/resource/before/GeneratedJavaxOnLombokOn.java",
    "content": "//CONF: lombok.addJavaxGeneratedAnnotation = true\nclass GeneratedJavaxOnLombokOn {\n\t@lombok.Getter\n\tint x;\n}\n"
  },
  {
    "path": "test/transform/resource/before/GeneratedOff.java",
    "content": "//CONF: lombok.addGeneratedAnnotation = false\nclass GeneratedOff {\n\t@lombok.Getter\n\tint x;\n}\n"
  },
  {
    "path": "test/transform/resource/before/GeneratedOffJavaxOn.java",
    "content": "//CONF: lombok.addGeneratedAnnotation = false\n//CONF: lombok.addJavaxGeneratedAnnotation = true\nclass GeneratedOffJavaxOn {\n\t@lombok.Getter\n\tint x;\n}\n"
  },
  {
    "path": "test/transform/resource/before/GeneratedOffLombokOn.java",
    "content": "//CONF: lombok.addGeneratedAnnotation = false\nclass GeneratedOffLombokOn {\n\t@lombok.Getter\n\tint x;\n}\n"
  },
  {
    "path": "test/transform/resource/before/GeneratedOn.java",
    "content": "//CONF: lombok.addGeneratedAnnotation = true\nclass GeneratedOn {\n\t@lombok.Getter\n\tint x;\n}\n"
  },
  {
    "path": "test/transform/resource/before/GetterAccessLevel.java",
    "content": "class GetterAccessLevel {\n\t@lombok.Getter(lombok.AccessLevel.NONE)\n\tboolean isNone;\n\t@lombok.Getter(lombok.AccessLevel.PRIVATE)\n\tboolean isPrivate;\n\t@lombok.Getter(lombok.AccessLevel.PACKAGE)\n\tboolean isPackage;\n\t@lombok.Getter(lombok.AccessLevel.PROTECTED)\n\tboolean isProtected;\n\t@lombok.Getter(lombok.AccessLevel.PUBLIC)\n\tboolean isPublic;\n\t@lombok.Getter(lombok.AccessLevel.NONE)\n\tString noneString;\n\t@lombok.Getter(lombok.AccessLevel.PRIVATE)\n\tString privateString;\n\t@lombok.Getter(lombok.AccessLevel.PACKAGE)\n\tString packageString;\n\t@lombok.Getter(lombok.AccessLevel.PROTECTED)\n\tString protectedString;\n\t@lombok.Getter(lombok.AccessLevel.PUBLIC)\n\tString publicString;\n\t@lombok.Getter(value=lombok.AccessLevel.PUBLIC)\n\tString value;\n}\n"
  },
  {
    "path": "test/transform/resource/before/GetterAlreadyExists.java",
    "content": "class Getter1 {\n\t@lombok.Getter boolean foo;\n\tboolean hasFoo() {\n\t\treturn true;\n\t}\n}\nclass Getter2 {\n\t@lombok.Getter boolean foo;\n\tboolean isFoo() {\n\t\treturn true;\n\t}\n}\nclass Getter3 {\n\t@lombok.Getter boolean foo;\n\tboolean getFoo() {\n\t\treturn true;\n\t}\n}\nclass Getter4 {\n\t@lombok.Getter String foo;\n\tString hasFoo() {\n\t\treturn null;\n\t}\n}\nclass Getter5 {\n\t@lombok.Getter String foo;\n\tString isFoo() {\n\t\treturn null;\n\t}\n}\nclass Getter6 {\n\t@lombok.Getter String foo;\n\tString getFoo() {\n\t\treturn null;\n\t}\n}\nclass Getter7 {\n\t@lombok.Getter String foo;\n\tboolean hasFoo() {\n\t\treturn false;\n\t}\n}\nclass Getter8 {\n\t@lombok.Getter String foo;\n\tboolean isFoo() {\n\t\treturn false;\n\t}\n}\nclass Getter9 {\n\t@lombok.Getter String foo;\n\tboolean getFoo() {\n\t\treturn false;\n\t}\n}\nclass Getter10 {\n\t@lombok.Getter boolean foo;\n\tstatic boolean hasFoo() {\n\t\treturn false;\n\t}\n}\nclass Getter11 {\n\t@lombok.Getter boolean foo;\n\tstatic boolean isFoo() {\n\t\treturn false;\n\t}\n}\nclass Getter12 {\n\t@lombok.Getter boolean foo;\n\tstatic boolean getFoo() {\n\t\treturn false;\n\t}\n}\nclass Getter13 {\n\t@lombok.Getter String foo;\n\tstatic boolean hasFoo() {\n\t\treturn false;\n\t}\n}\nclass Getter14 {\n\t@lombok.Getter String foo;\n\tstatic boolean isFoo() {\n\t\treturn false;\n\t}\n}\nclass Getter15 {\n\t@lombok.Getter String foo;\n\tstatic boolean getFoo() {\n\t\treturn false;\n\t}\n}\nclass Getter16 {\n\t@lombok.Getter String foo;\n\tstatic String hasFoo() {\n\t\treturn \"\";\n\t}\n}\nclass Getter17 {\n\t@lombok.Getter String foo;\n\tstatic String isFoo() {\n\t\treturn \"\";\n\t}\n}\nclass Getter18 {\n\t@lombok.Getter String foo;\n\tstatic String getFoo() {\n\t\treturn \"\";\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/GetterBoolean.java",
    "content": "class Getter {\n\t@lombok.Getter boolean foo;\n\t@lombok.Getter boolean isBar;\n\t@lombok.Getter boolean hasBaz;\n}\nclass MoreGetter {\n\t@lombok.Getter boolean foo;\n\tboolean hasFoo() {\n\t\treturn true;\n\t}\n}\nclass YetMoreGetter {\n\t@lombok.Getter boolean foo;\n\tboolean getFoo() {\n\t\treturn true;\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/GetterDeprecated.java",
    "content": "import lombok.Getter;\nclass GetterDeprecated {\n\t\n\t@Deprecated\n\t@Getter int annotation;\n\t\n\t/**\n\t * @deprecated\n\t */\n\t@Getter int javadoc;\n}\n"
  },
  {
    "path": "test/transform/resource/before/GetterEnum.java",
    "content": "import lombok.AccessLevel;\nimport lombok.Getter;\nimport lombok.RequiredArgsConstructor;\n\n@RequiredArgsConstructor(access=AccessLevel.PRIVATE)\nenum GetterEnum {\n\tONE(1, \"One\")\n\t;\n\t@Getter private final int id;\n\t@Getter private final String name;\n}\n"
  },
  {
    "path": "test/transform/resource/before/GetterEnumConstant.java",
    "content": "import lombok.Getter;\n\nenum GetterEnumConstant {\n\t@Getter\n\tONE;\n}"
  },
  {
    "path": "test/transform/resource/before/GetterInAnonymousClass.java",
    "content": "import lombok.Getter;\n\npublic class GetterInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\t@Getter\n\t\tclass Inner {\n\t\t\tprivate String string;\n\t\t}\n\t};\n}"
  },
  {
    "path": "test/transform/resource/before/GetterLazy.java",
    "content": "class GetterLazy {\n\tstatic class ValueType {\n\t}\n\t\n\t@lombok.Getter(lazy=true)\n\tprivate final ValueType fieldName = new ValueType();\n}\n"
  },
  {
    "path": "test/transform/resource/before/GetterLazyArguments.java",
    "content": "// version 8:\nclass GetterLazyArguments {\n\tstatic String fun() { return null; }\n\tstatic String stringInt(String arg1, Integer arg2) { return null; }\n\tstatic String stringRunnable(String arg1, Runnable arg2) { return null; }\n\t\n\t@lombok.Getter(lazy=true)\n\tprivate final String field1 = stringInt((\"a\"), (1));\n\t\n\t@lombok.Getter(lazy=true)\n\tprivate final String field2 = stringInt(true ? \"a\" : \"b\", true ? 1 : 0);\n\t\n\t@lombok.Getter(lazy=true)\n\tprivate final String field3 = stringInt((\"a\"), true ? 1 : 0);\n\t\n\t@lombok.Getter(lazy=true)\n\tprivate final String field4 = stringRunnable(fun(), () -> { });\n\t\n\t@lombok.Getter(lazy=true)\n\tprivate final String field5 = stringRunnable((\"a\"), () -> { });\n\t\n\t@lombok.Getter(lazy=true)\n\tprivate final String field6 = true ? stringInt(true ? \"a\" : \"b\", true ? 1 : 0) : \"\";\n}\n"
  },
  {
    "path": "test/transform/resource/before/GetterLazyBoolean.java",
    "content": "@lombok.EqualsAndHashCode(of=\"booleanValue\")\n@lombok.ToString(of=\"booleanValue\")\nclass GetterLazyBoolean {\n\t@lombok.Getter(lazy=true)\n\tprivate final boolean booleanValue = calculateBoolean();\n\n\t@lombok.Getter(lazy=true)\n\tprivate final boolean otherBooleanValue = !calculateBoolean();\n\t\n\tprivate static boolean calculateBoolean() {\n\t\treturn true;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/GetterLazyEahcToString.java",
    "content": "@lombok.EqualsAndHashCode(doNotUseGetters = true)\n@lombok.ToString(doNotUseGetters = true)\nclass GetterLazyEahcToString {\n\t@lombok.Getter(lazy=true)\n\tprivate final String value = \"\";\n\t@lombok.Getter\n\tprivate final String value2 = \"\";\n}\n"
  },
  {
    "path": "test/transform/resource/before/GetterLazyErrorPosition.java",
    "content": "//platform javac: positions in eclipse are hard...\nclass GetterLazyErrorPosition {\n\t@lombok.Getter(lazy=true)\n\tprivate final String field = \n\t\ttrue ? \n\t\t\"\" : \n\t\tnew ErrorPosition();\n}\n"
  },
  {
    "path": "test/transform/resource/before/GetterLazyGenerics.java",
    "content": "class GetterLazyGenerics<E> {\n\t@lombok.Getter(lazy=true)\n\tprivate final E field = getAny();\n\t\n\t@lombok.Getter(lazy=true)\n\tprivate final long field2 = System.currentTimeMillis();\n\t\n\tpublic static <E> E getAny() {\n\t\treturn null;\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/GetterLazyInAnonymousClass.java",
    "content": "import lombok.Getter;\n\npublic class GetterLazyInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\tclass Inner {\n\t\t\t@Getter(lazy = true)\n\t\t\tprivate final String string = \"test\";\n\t\t}\n\t};\n}"
  },
  {
    "path": "test/transform/resource/before/GetterLazyInvalid.java",
    "content": "class GetterLazyInvalidNotFinal {\n\t@lombok.Getter(lazy=true)\n\tprivate String fieldName = \"\";\n}\nclass GetterLazyInvalidNotPrivate {\n\t@lombok.Getter(lazy=true)\n\tfinal String fieldName = \"\";\n}\nclass GetterLazyInvalidNotPrivateFinal {\n\t@lombok.Getter(lazy=true)\n\tString fieldName = \"\";\n}\nclass GetterLazyInvalidNone {\n\t@lombok.Getter(lazy=true, value=lombok.AccessLevel.NONE)\n\tprivate final String fieldName = \"\";\n}\n@lombok.Getter(lazy = true)\nclass GetterLazyInvalidClass {\n\tprivate final String fieldName = \"\";\n}\nclass GetterLazyInvalidNoInit {\n\t@lombok.Getter(lazy = true)\n\tprivate final String fieldName;\n\tGetterLazyInvalidNoInit() {\n\t\tthis.fieldName = \"foo\";\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/GetterLazyNative.java",
    "content": "class GetterLazyNative {\n\t@lombok.Getter(lazy=true)\n\tprivate final boolean booleanField = true;\n\t\n\t@lombok.Getter(lazy=true)\n\tprivate final byte byteField = 1;\n\t\n\t@lombok.Getter(lazy=true)\n\tprivate final short shortField = 1;\n\t\n\t@lombok.Getter(lazy=true)\n\tprivate final int intField = 1;\n\t\n\t@lombok.Getter(lazy=true)\n\tprivate final long longField = 1;\n\t\n\t@lombok.Getter(lazy=true)\n\tprivate final float floatField = 1.0f;\n\t\n\t@lombok.Getter(lazy=true)\n\tprivate final double doubleField = 1.0;\n\t\n\t@lombok.Getter(lazy=true)\n\tprivate final char charField = '1';\n\t\n\t@lombok.Getter(lazy=true)\n\tprivate final int[] intArrayField = new int[] {1};\n}\n"
  },
  {
    "path": "test/transform/resource/before/GetterLazyTransient.java",
    "content": "class GetterLazyTransient {\n\t@lombok.Getter(lazy=true)\n\tprivate final int nonTransientField = 1;\n\t\n\t@lombok.Getter(lazy=true)\n\tprivate final transient int transientField = 2;\n\t\n\t@lombok.Getter\n\tprivate final transient int nonLazyTransientField = 3;\n}\n"
  },
  {
    "path": "test/transform/resource/before/GetterNone.java",
    "content": "import lombok.AccessLevel;\nimport lombok.Getter;\n\n@Getter\nclass GetterNone {\n\tint i;\n\t@Getter(AccessLevel.NONE) int foo;\n}"
  },
  {
    "path": "test/transform/resource/before/GetterOnClass.java",
    "content": "//version 8:\n@lombok.Getter\nclass GetterOnClass1 {\n\t@lombok.Getter(lombok.AccessLevel.NONE)\n\tboolean isNone;\n\tboolean isPublic;\n}\n@lombok.Getter(lombok.AccessLevel.PROTECTED)\nclass GetterOnClass2 {\n\t@lombok.Getter(lombok.AccessLevel.NONE)\n\tboolean isNone;\n\tboolean isProtected;\n\t@lombok.Getter(lombok.AccessLevel.PACKAGE)\n\tboolean isPackage;\n}\n@lombok.Getter(lombok.AccessLevel.PACKAGE)\nclass GetterOnClass3 {\n\t@lombok.Getter(lombok.AccessLevel.NONE)\n\tboolean isNone;\n\tboolean isPackage;\n}\n@lombok.Getter(lombok.AccessLevel.PRIVATE)\nclass GetterOnClass4 {\n\t@lombok.Getter(lombok.AccessLevel.NONE)\n\tboolean isNone;\n\tboolean isPrivate;\n}\n@lombok.Getter(lombok.AccessLevel.PUBLIC)\nclass GetterOnClass5 {\n\t@lombok.Getter(lombok.AccessLevel.NONE)\n\tboolean isNone;\n\tboolean isPublic;\n}\n@lombok.Getter\nclass GetterOnClass6 {\n\tString couldBeNull;\n\t@lombok.NonNull String nonNull;\n}"
  },
  {
    "path": "test/transform/resource/before/GetterOnMethod.java",
    "content": "class GetterOnMethod {\n\t@lombok.Getter(onMethod=@__(@Deprecated)) int i;\n\t@lombok.Getter(onMethod=@__({@java.lang.Deprecated, @Test})) int j, k;\n\n\tpublic @interface Test {\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/GetterOnMethodErrors2.java",
    "content": "//version 8:\nclass GetterOnMethodErrors2 {\n\t@lombok.Getter(onMethod=@_A_(@Deprecated)) private int bad1;\n\t@lombok.Getter(onMethod=@__(5)) private int bad2;\n\t@lombok.Getter(onMethod=@__({@Deprecated, 5})) private int bad3;\n\t@lombok.Getter(onMethod=@$(bar=@Deprecated)) private int bad4;\n\t@lombok.Getter(onMethod=@__) private int good1;\n\t@lombok.Getter(onMethod=@X()) private int good2;\n\t@lombok.Getter(onMethod=@__(value=@Deprecated)) private int good3;\n\t@lombok.Getter(onMethod=@xXx$$(value={@Deprecated, @Test})) private int good4;\n\tpublic @interface Test {\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/GetterOnMethodOnType.java",
    "content": "@lombok.Getter(onMethod=@__(@Deprecated))\nclass GetterOnMethodOnType {\n\tprivate int test;\n\tprivate String name;\n}\n"
  },
  {
    "path": "test/transform/resource/before/GetterOnRecord.java",
    "content": "// version 14:\n\nimport lombok.Getter;\n\n@Getter\npublic record GetterOnRecord(String a, String b) {\n}"
  },
  {
    "path": "test/transform/resource/before/GetterOnStatic.java",
    "content": "class Getter {\n\t@lombok.Getter static boolean foo;\n\t@lombok.Getter static int bar;\n}\n"
  },
  {
    "path": "test/transform/resource/before/GetterPlain.java",
    "content": "import lombok.Getter;\nclass GetterPlain {\n\t@lombok.Getter int i;\n\t@Getter int foo;\n}"
  },
  {
    "path": "test/transform/resource/before/GetterSetterJavadoc.java",
    "content": "@lombok.Data\nclass GetterSetterJavadoc1 {\n\t/**\n\t * Some text\n\t *\n\t * @param fieldName Hello, World1\n\t * --- GETTER ---\n\t * Getter section\n\t *\n\t * @return Sky is blue1\n\t */\n\tprivate int fieldName;\n}\n\nclass GetterSetterJavadoc2 {\n\t/**\n\t * Some text\n\t *\n\t * @param fieldName Hello, World2\n\t * @return Sky is blue2\n\t */\n\t@lombok.Getter @lombok.Setter private int fieldName;\n}\n\nclass GetterSetterJavadoc3 {\n\t/**\n\t * Some text\n\t *\n\t * **SETTER**\n\t * Setter section\n\t * @param fieldName Hello, World3\n\t * **GETTER**\n\t * Getter section\n\t * @return Sky is blue3\n\t */\n\t@lombok.Getter @lombok.Setter private int fieldName;\n}\n\n@lombok.experimental.Accessors(chain = true, fluent = true)\nclass GetterSetterJavadoc4 {\n\t/**\n\t * Some text\n\t *\n\t * @param fieldName Hello, World4\n\t * @return Sky is blue4\n\t */\n\t@lombok.Getter @lombok.Setter private int fieldName;\n}\n\n@lombok.experimental.Accessors(chain = true, fluent = true)\nclass GetterSetterJavadoc5 {\n\t/**\n\t * Some text\n\t *\n\t * **SETTER**\n\t * Setter section\n\t * @param fieldName Hello, World5\n\t * @return Sky is blue5\n\t * **GETTER**\n\t * Getter section\n\t * @return Sky is blue5\n\t */\n\t@lombok.Getter @lombok.Setter private int fieldName;\n}\n\n@lombok.Data\nclass GetterSetterJavadocLong {\n\t/**\n\t * This field represents the unique identifier for a user in the system. It is used \n\t * throughout the application to uniquely identify and retrieve user-related data. \n\t * The ID is typically generated by the database and is guaranteed to be unique \n\t * within the context of the system. \n\t * \n\t * <p>The ID is an integral part of various operations, including but not limited to:\n\t * <ul>\n\t *   <li>Authenticating users during login processes.</li>\n\t *   <li>Associating user-specific preferences and settings.</li>\n\t *   <li>Tracking user activity and logs for auditing purposes.</li>\n\t *   <li>Facilitating relationships between users and other entities such as orders,\n\t *       messages, or roles within the system.</li>\n\t * </ul>\n\t * \n\t * <p>Key characteristics of the {@code userId} field:\n\t * <ul>\n\t *   <li><strong>Immutability:</strong> Once assigned, the ID must not be modified to\n\t *       ensure data integrity.</li>\n\t *   <li><strong>Security:</strong> Access to this field should be controlled to prevent\n\t *       unauthorized modifications or data leakage.</li>\n\t *   <li><strong>Uniqueness:</strong> The ID must be unique within the system. For \n\t *       distributed systems, consider using GUIDs or UUIDs to avoid collisions.</li>\n\t * </ul>\n\t * \n\t * <p>Example usage:\n\t * <pre>\n\t *     User user = userService.getUserById(userId);\n\t *     if (user != null) {\n\t *         System.out.println(\"User found: \" + user.getName());\n\t *     } else {\n\t *         System.out.println(\"User not found.\");\n\t *     }\n\t * </pre>\n\t * \n\t * <p>Developers should ensure that the ID complies with constraints imposed by the \n\t * database schema, such as length and format restrictions. Furthermore, it is \n\t * recommended to validate the ID before persisting or using it in critical operations.\n\t * \n\t * <p>For methods or constructors that accept the {@code userId} as a parameter, the \n\t * following guidelines should be followed:\n\t * <ul>\n\t *   <li>Validate the format of the ID to ensure it adheres to system requirements.</li>\n\t *   <li>Handle null or empty values gracefully, providing appropriate error messages\n\t *       or default behavior where necessary.</li>\n\t * </ul>\n\t * \n\t * @param userId the unique identifier assigned to a user. This value must be non-null \n\t *               and conform to the format defined by the system. Passing a null or \n\t *               invalid ID may result in an {@link IllegalArgumentException} or \n\t *               similar error.\n\t * @param databaseConnection the connection to the database used for retrieving or \n\t *                           persisting the user ID. This parameter is required for \n\t *                           database-related operations and must be properly closed \n\t *                           after use to prevent resource leaks.\n\t * @param userRole the role associated with the user (e.g., \"admin\", \"user\", \"guest\"). \n\t *                 This parameter may influence access control and permissions \n\t *                 granted to the user within the system.\n\t */\n\tprivate String userId;\n}\n"
  },
  {
    "path": "test/transform/resource/before/GetterTypeAnnos.java",
    "content": "//CONF: lombok.copyableAnnotations += TA\nimport lombok.Getter;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.List;\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})\n@interface TA {\n}\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})\n@interface TB {\n}\nclass GetterTypeAnnos {\n\t@Getter\n\t@TA @TB List<String> foo;\n}\n"
  },
  {
    "path": "test/transform/resource/before/GetterWithDollar.java",
    "content": "class GetterWithDollar1 {\n\t@lombok.Getter int $i;\n}\n\nclass GetterWithDollar2 {\n\t@lombok.Getter int $i;\n\t@lombok.Getter int i;\n}\n"
  },
  {
    "path": "test/transform/resource/before/GetterWithJavaBeansSpecCapitalization.java",
    "content": "//CONF: lombok.accessors.capitalization = beanspec\nclass GetterWithJavaBeansSpecCapitalization {\n\t@lombok.Getter int a;\n\t@lombok.Getter int aField;\n}\n"
  },
  {
    "path": "test/transform/resource/before/HelperInInitializationBlock.java",
    "content": "import lombok.experimental.Helper;\n\npublic class HelperInInitializationBlock {\n\t{\n\t\tfinal int z = 5;\n\t\tif (Boolean.TRUE) {\n\t\t\t@Helper class H1 {\n\t\t\t\tvoid foo(int x) {\n\t\t\t\t\tSystem.out.println(\"Hello, \" + (x + z));\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tfoo(10);\n\t\t\t\n\t\t\t@Helper class H2 {\n\t\t\t\tvoid bar() {\n\t\t\t\t\tfoo(12);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/HelperInMethod.java",
    "content": "import lombok.experimental.Helper;\n\npublic class HelperInMethod {\n\tint someMethod(int arg1) {\n\t\tfinal int localVar = 5;\n\t\t\n\t\t@Helper\n\t\tclass Helpers {\n\t\t\tint helperMethod(int arg) {\n\t\t\t\treturn arg + localVar;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn helperMethod(10);\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/I2335_BuilderMultipleObtainVia.java",
    "content": "import lombok.Builder;\n\n@Builder\npublic class I2335_BuilderMultipleObtainVia {\n\tprivate String theString;\n\tprivate Long theLong;\n\n\t@Builder(toBuilder = true)\n\tpublic I2335_BuilderMultipleObtainVia(\n\t\t@Builder.ObtainVia(method = \"getTheString\") String theString,\n\t\t@Builder.ObtainVia(method = \"getTheLong\") Long theLong\n\t) {\n\t\tsetTheString(theString);\n\t\tsetTheLong(theLong);\n\t}\n\t\n\tpublic String getTheString() {\n\t\treturn theString;\n\t}\n\t\n\tpublic Long getTheLong() {\n\t\treturn theLong;\n\t}\n\t\n\tpublic void setTheString(String theString) {\n\t\tthis.theString = theString;\n\t}\n\t\n\tpublic void setTheLong(Long theLong) {\n\t\tthis.theLong = theLong;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/InjectField.java",
    "content": "import java.util.logging.Level;\nimport lombok.extern.java.Log;\nimport lombok.Synchronized;\n\n@Log\nenum InjectField1 {\n\tA,\n\tB;\n\n\tprivate static final String LOG_MESSAGE = \"static initializer\";\n\n\tprivate String fieldA;\n\n\tstatic {\n\t\tlog.log(Level.FINE, LOG_MESSAGE);\n\t}\n\n\tprivate String fieldB;\n\n\t@Synchronized\n\tvoid generateLockField() {\n\t\tSystem.out.println(\"lock field\");\n\t}\n\n\t@Synchronized\n\tstatic void generateStaticLockField() {\n\t\tSystem.out.println(\"static lock field\");\n\t}\n}\n\n@Log\nclass InjectField2 {\n\tprivate static final String LOG_MESSAGE = \"static initializer\";\n\n\tstatic {\n\t\tlog.log(Level.FINE, LOG_MESSAGE);\n\t}\n\n\t@Synchronized\n\tvoid generateLockField() {\n\t\tSystem.out.println(\"lock field\");\n\t}\n}\n\n@Log\nclass InjectField3 {\n\tstatic {\n\t\tlog.log(Level.FINE, \"static initializer\");\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/InnerClass.java",
    "content": "class A {\n\t@lombok.AllArgsConstructor\n\tclass B {\n\t\tString s;\n\t}\n}\n\nclass C {\n\t@lombok.Value \n\tclass D {\n\t\tA a;\n\t\t\n\t\tA.B test(String s) {\n\t\t\treturn a.new B(s) {};\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/JacksonJsonProperty.java",
    "content": "//CONF: lombok.copyJacksonAnnotationsToAccessors = true\n//version 8: Jackson deps are at least Java7+.\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport com.fasterxml.jackson.annotation.JsonSetter;\nimport com.fasterxml.jackson.annotation.Nulls;\nimport lombok.Builder;\nimport lombok.Setter;\n\n@Builder\npublic class JacksonJsonProperty {\n\t@JsonProperty(\"kebab-case-prop\")\n\t@JsonSetter(nulls = Nulls.SKIP)\n\t@Setter\n\tpublic String kebabCaseProp;\n}\n"
  },
  {
    "path": "test/transform/resource/before/JacksonizedAccessors.java",
    "content": "@lombok.extern.jackson.Jacksonized\n@lombok.experimental.Accessors(fluent = true)\n@lombok.Getter\n@lombok.Setter\npublic class JacksonizedAccessors {\n\tprivate int intValue;\n}"
  },
  {
    "path": "test/transform/resource/before/JacksonizedAccessorsTransient.java",
    "content": "@lombok.extern.jackson.Jacksonized\n@lombok.experimental.Accessors(fluent = true)\n@lombok.Getter\n@lombok.Setter\npublic class JacksonizedAccessorsTransient {\n\tprivate transient int intValue;\n\t@com.fasterxml.jackson.annotation.JsonIgnore private transient long longValue;\n\t@com.fasterxml.jackson.annotation.JsonIgnore private double doubleValue;\n}"
  },
  {
    "path": "test/transform/resource/before/JacksonizedBuilderComplex.java",
    "content": "//version 8: Jackson deps are at least Java7+.\n//CONF: lombok.builder.className = Test*Name\n//CONF: lombok.jacksonized.jacksonVersion += 2\n//CONF: lombok.jacksonized.jacksonVersion += 3\nimport java.util.List;\nimport lombok.Builder;\nimport lombok.extern.jackson.Jacksonized;\n\nclass JacksonizedBuilderComplex {\n\t@Jacksonized\n\t@Builder(buildMethodName = \"execute\", setterPrefix = \"with\")\n\tprivate static <T extends Number> void testVoidWithGenerics(T number, int arg2, String arg3, JacksonizedBuilderComplex selfRef) {}\n}\n"
  },
  {
    "path": "test/transform/resource/before/JacksonizedBuilderSimple.java",
    "content": "//version 8: Jackson deps are at least Java7+.\n//CONF: lombok.jacksonized.jacksonVersion += 2\n//CONF: lombok.jacksonized.jacksonVersion += 3\nimport java.util.List;\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\n\n@lombok.extern.jackson.Jacksonized\n@JsonIgnoreProperties(ignoreUnknown = true)\n@lombok.Builder(access = lombok.AccessLevel.PROTECTED)\nclass JacksonizedBuilderSimple<T> {\n\tprivate final int noshow = 0;\n\tprivate final int yes;\n\tprivate List<T> also;\n\tprivate int $butNotMe;\n}\n"
  },
  {
    "path": "test/transform/resource/before/JacksonizedBuilderSingular.java",
    "content": "//version 8: Jackson deps are at least Java7+.\n//CONF: lombok.jacksonized.jacksonVersion += 2\n//CONF: lombok.jacksonized.jacksonVersion += 3\nimport java.util.List;\nimport java.util.Map;\n\nimport com.fasterxml.jackson.annotation.JsonAnySetter;\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport com.google.common.collect.ImmutableList;\nimport com.google.common.collect.ImmutableMap;\n\nimport lombok.Builder;\nimport lombok.Singular;\nimport lombok.extern.jackson.Jacksonized;\n\n@Jacksonized\n@Builder\npublic class JacksonizedBuilderSingular {\n\t@JsonAnySetter\n\t@Singular(\"any\")\n\tprivate Map<String, Object> any;\n\n\t@JsonProperty(\"v_a_l_u_e_s\")\n\t@Singular\n\tprivate List<String> values;\n\n\t@JsonAnySetter\n\t@Singular(\"guavaAny\")\n\tprivate ImmutableMap<String, Object> guavaAny;\n\n\t@JsonProperty(\"guava_v_a_l_u_e_s\")\n\t@Singular\n\tprivate ImmutableList<String> guavaValues;\n}\n"
  },
  {
    "path": "test/transform/resource/before/JacksonizedNoConfigChoice.java",
    "content": "//version 8: Jackson deps are at least Java7+.\n@lombok.extern.jackson.Jacksonized @lombok.Builder\npublic class JacksonizedNoConfigChoice {\n\tint field1;\n}\n"
  },
  {
    "path": "test/transform/resource/before/JacksonizedOnRecord.java",
    "content": "//version 14:\n//CONF: lombok.jacksonized.jacksonVersion += 2\n//CONF: lombok.jacksonized.jacksonVersion += 3\n\nimport java.util.List;\nimport javax.annotation.Nullable;\nimport com.fasterxml.jackson.annotation.JsonAnySetter;\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;\nimport com.fasterxml.jackson.annotation.JsonProperty;\n\n@lombok.extern.jackson.Jacksonized\n@lombok.Builder\n@JsonIgnoreProperties\npublic record JacksonizedOnRecord(@JsonProperty(\"test\") @Nullable String string, @JsonAnySetter @lombok.Singular List<String> values) {\n}\n"
  },
  {
    "path": "test/transform/resource/before/JacksonizedSuperBuilderSimple.java",
    "content": "//CONF: lombok.jacksonized.jacksonVersion += 2\n//CONF: lombok.jacksonized.jacksonVersion += 3\n//version 8: Jackson deps are at least Java7+.\npublic class JacksonizedSuperBuilderSimple {\n\t@lombok.extern.jackson.Jacksonized\n\t@lombok.experimental.SuperBuilder\n\t@com.fasterxml.jackson.annotation.JsonIgnoreProperties(ignoreUnknown = true)\n\tpublic static class Parent {\n\t\tint field1;\n\t}\n\t\n\tpublic static void test() {\n\t\tParent x = Parent.builder().field1(5).build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/JacksonizedSuperBuilderWithJsonDeserialize.java",
    "content": "//version 8: Jackson deps are at least Java7+.\n@lombok.extern.jackson.Jacksonized\n@lombok.experimental.SuperBuilder\n@com.fasterxml.jackson.databind.annotation.JsonDeserialize\npublic class JacksonizedSuperBuilderWithJsonDeserialize {\n\tint field1;\n}\n"
  },
  {
    "path": "test/transform/resource/before/JavadocGenerally.java",
    "content": "// unchanged\n/**\n * Doc on package\n */\npackage testPackage;\n\n/** Weird doc */\n/**\n * Doc on class\n */\nclass JavadocGenerally {\n\t/**\n\t * Doc on field\n\t * <pre>\n\t * \t// code\n\t * </pre>\n\t */\n\tprivate int someField;\n\n\t/**\n\t * Doc on method\n\t */\n\tpublic void test() {\n\t}\n\n\t/**\n\t * Doc on inner\n\t */\n\tpublic interface TestingInner {\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/JavadocMultiline.java",
    "content": "@lombok.Getter\n@lombok.Setter\nclass JavadocMultiline {\n    /**\n     * This is a list of booleans.\n     *\n     * @param booleans A list of booleans to set for this object. This is a Javadoc param that is\n     *        long enough to wrap to multiple lines.\n     * @return A list of booleans to set for this object. This is a Javadoc return that is long\n     *         enough to wrap to multiple lines.\n     */\n    private java.util.List<Boolean> booleans;\n    \n    \n    /**\n     * This is a list of booleans.\n     *\n     * @param booleans A list of booleans to set for this object. This is a Javadoc param that is\n     *        long enough to wrap to multiple lines.\n     */\n    private java.util.List<Boolean> booleans2;\n}\n"
  },
  {
    "path": "test/transform/resource/before/LockedInInitializer.java",
    "content": "//eclipse: verify diet\nimport lombok.Locked;\n\npublic class LockedInInitializer {\n\tpublic static final Runnable LOCKED = new Runnable() {\n\t\t@Override\n\t\t@Locked\n\t\tpublic void run() {\n\t\t\tSystem.out.println(\"test\");\n\t\t}\n\t};\n\tpublic static final Runnable LOCKED_READ = new Runnable() {\n\t\t@Override\n\t\t@Locked.Read\n\t\tpublic void run() {\n\t\t\tSystem.out.println(\"test\");\n\t\t}\n\t};\n\tpublic static final Runnable LOCKED_WRITE = new Runnable() {\n\t\t@Override\n\t\t@Locked.Write\n\t\tpublic void run() {\n\t\t\tSystem.out.println(\"test\");\n\t\t}\n\t};\n}"
  },
  {
    "path": "test/transform/resource/before/LockedInRecord.java",
    "content": "// version 14:\n\nimport lombok.Locked;\n\npublic record LockedInRecord(String a, String b) {\n\t@Locked\n\tpublic void foo() {\n\t\tString foo = \"bar\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/LockedName.java",
    "content": "import java.util.concurrent.locks.*;\nclass LockedName {\n\tprivate final Lock basicLock = new ReentrantLock();\n\tprivate final ReadWriteLock rwLock = new ReentrantReadWriteLock();\n\t@lombok.Locked(\"basicLock\") void test() {\n\t\tSystem.out.println(\"one\");\n\t}\n\t@lombok.Locked.Read(\"rwLock\") void test2() {\n\t\tSystem.out.println(\"two\");\n\t}\n\t@lombok.Locked.Write(\"rwLock\") void test3() {\n\t\tSystem.out.println(\"three\");\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/LockedOnStatic.java",
    "content": "class LockedOnStatic<Z> {\n\tstatic class Inner {\n\t\tprivate static final java.util.concurrent.locks.Lock LCK = new java.util.concurrent.locks.ReentrantLock();\n\t\t@lombok.Locked(\"LCK\")\n\t\tpublic void foo() {\n\t\t\tSystem.out.println();\n\t\t}\n\t}\n\tclass Inner2 {\n\t\tprivate final java.util.concurrent.locks.ReentrantLock LCK = new java.util.concurrent.locks.ReentrantLock();\n\t\t@lombok.Locked(\"LCK\")\n\t\tpublic void foo() {\n\t\t\tSystem.out.println();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/LockedPlain.java",
    "content": "import lombok.Locked;\nclass LockedPlain {\n\t@Locked void test() {\n\t\tSystem.out.println(\"one\");\n\t}\n\t@Locked void test2() {\n\t\tSystem.out.println(\"two\");\n\t}\n}\nclass LockedPlainStatic {\n\t@Locked static void test() {\n\t\tSystem.out.println(\"three\");\n\t}\n\t@Locked static void test2() {\n\t\tSystem.out.println(\"four\");\n\t}\n}\nclass LockedPlainRead {\n\t@Locked.Read static void test() {\n\t\tSystem.out.println(\"five\");\n\t}\n\t@Locked.Read static void test2() {\n\t\tSystem.out.println(\"six\");\n\t}\n}\nclass LockedPlainWrite {\n\t@Locked.Write void test() {\n\t\tSystem.out.println(\"seven\");\n\t}\n\t@Locked.Write void test2() {\n\t\tSystem.out.println(\"eight\");\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/LockedStaticMix.java",
    "content": "class LockedGeneratedStaticMismatch {\n\t@lombok.Locked static void test() {\n\t\tSystem.out.println(\"one\");\n\t}\n\t@lombok.Locked(\"$LOCK\") void test2() {\n\t\tSystem.out.println(\"two\");\n\t}\n}\nclass LockedUserStaticMismatch {\n\tprivate static final java.util.concurrent.locks.Lock userLock = new java.util.concurrent.locks.ReentrantLock();\n\t@lombok.Locked(\"userLock\") static void test() {\n\t\tSystem.out.println(\"one\");\n\t}\n\t@lombok.Locked(\"userLock\") void test2() {\n\t\tSystem.out.println(\"two\");\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/LockedTypeMismatch.java",
    "content": "class LockedGeneratedTypeMismatch {\n\t@lombok.Locked void test() {\n\t\tSystem.out.println(\"one\");\n\t}\n\t@lombok.Locked.Read void test2() {\n\t\tSystem.out.println(\"two\");\n\t}\n}\nclass LockedUserTypeMismatch {\n\tprivate final java.util.concurrent.locks.Lock userLock = new java.util.concurrent.locks.ReentrantLock();\n\t@lombok.Locked(\"userLock\") void test() {\n\t\tSystem.out.println(\"one\");\n\t}\n\t@lombok.Locked.Read(\"userLock\") void test2() {\n\t\tSystem.out.println(\"two\");\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/LoggerCommons.java",
    "content": "import lombok.extern.apachecommons.CommonsLog;\n\n@lombok.extern.apachecommons.CommonsLog\nclass LoggerCommons {\n}\n\n@CommonsLog\nclass LoggerCommonsWithImport {\n}\n\n@CommonsLog(topic=\"DifferentName\")\nclass LoggerCommonsWithDifferentName {\n}\n\n@CommonsLog(topic=LoggerCommonsWithStaticField.TOPIC)\nclass LoggerCommonsWithStaticField {\n\tstatic final String TOPIC = \"StaticField\";\n}"
  },
  {
    "path": "test/transform/resource/before/LoggerCommonsAccess.java",
    "content": "import lombok.AccessLevel;\nimport lombok.extern.apachecommons.CommonsLog;\n\n@CommonsLog(access = AccessLevel.PUBLIC)\nclass LoggerCommonsAccessPublic {\n}\n\n@CommonsLog(access = AccessLevel.PROTECTED)\nclass LoggerCommonsAccessProtected {\n}\n\n@CommonsLog(access = AccessLevel.PACKAGE)\nclass LoggerCommonsAccessPackage {\n}\n\n@CommonsLog(access = AccessLevel.PRIVATE)\nclass LoggerCommonsAccessPrivate {\n}\n\n@CommonsLog(access = AccessLevel.NONE)\nclass LoggerCommonsAccessNone {\n}\n"
  },
  {
    "path": "test/transform/resource/before/LoggerConfig.java",
    "content": "//CONF: lombok.log.fieldName = myLogger\n//CONF: lombok.log.fieldIsStatic = false\n@lombok.extern.slf4j.Slf4j\nclass LoggerWithConfig {\n}\n"
  },
  {
    "path": "test/transform/resource/before/LoggerConfigOnRecord.java",
    "content": "// CONF: lombok.log.fieldIsStatic = false\n// version 14:\n\nimport lombok.extern.slf4j.Slf4j;\n\n@Slf4j\npublic record LoggerConfigOnRecord(String a, String b) {\n}"
  },
  {
    "path": "test/transform/resource/before/LoggerCustom.java",
    "content": "//CONF: lombok.log.custom.declaration = MyLogger MyLoggerFactory.create(TYPE)\n@lombok.CustomLog\nclass LoggerCustomLog {\n}\n\nclass MyLoggerFactory {\n\tstatic MyLogger create(Class<?> clazz) {\n\t\treturn null;\n\t}\n}\n\nclass MyLogger {\n}"
  },
  {
    "path": "test/transform/resource/before/LoggerCustomAccess.java",
    "content": "//CONF: lombok.log.custom.declaration = MyLogger MyLoggerFactory.create(TYPE)\nimport lombok.AccessLevel;\nimport lombok.CustomLog;\n\n@CustomLog(access = AccessLevel.PUBLIC)\nclass LoggerCustomAccessPublic {\n}\n\n@CustomLog(access = AccessLevel.PROTECTED)\nclass LoggerCustomAccessProtected {\n}\n\n@CustomLog(access = AccessLevel.PACKAGE)\nclass LoggerCustomAccessPackage {\n}\n\n@CustomLog(access = AccessLevel.PRIVATE)\nclass LoggerCustomAccessPrivate {\n}\n\n@CustomLog(access = AccessLevel.NONE)\nclass LoggerCustomAccessNone {\n}\nclass MyLoggerFactory {\n\tstatic MyLogger create(Class<?> clazz) {\n\t\treturn null;\n\t}\n}\nclass MyLogger {\n}\n\n"
  },
  {
    "path": "test/transform/resource/before/LoggerCustomWithPackage.java",
    "content": "//CONF: lombok.log.custom.declaration = before.MyLogger before.MyLoggerFactory.create(TYPE)\npackage before;\n@lombok.CustomLog\nclass LoggerCustomLog {\n}\n\nclass MyLoggerFactory {\n\tstatic MyLogger create(Class<?> clazz) {\n\t\treturn null;\n\t}\n}\n\nclass MyLogger {\n}"
  },
  {
    "path": "test/transform/resource/before/LoggerCustomWithTopicAndName.java",
    "content": "//CONF: lombok.log.custom.declaration = MyLoggerFactory.create(NAME,TOPIC,NULL,TYPE,TOPIC)\n@lombok.CustomLog(topic=\"t\")\nclass LoggerCustomLog {\n}\n\n@lombok.CustomLog(topic=LoggerCustomLogWithStaticField.TOPIC)\nclass LoggerCustomLogWithStaticField {\n\tstatic final String TOPIC = \"StaticField\";\n}\n\nclass MyLoggerFactory {\n\tstatic MyLoggerFactory create(String name, String t1, Object o, Class<?> clazz, String t2) {\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/LoggerFlogger.java",
    "content": "import lombok.extern.flogger.Flogger;\n\n@lombok.extern.flogger.Flogger\nclass LoggerFlogger {\n}\n\n@Flogger\nclass LoggerFloggerWithImport {\n}\n\nclass LoggerFloggerOuter {\n\t@lombok.extern.flogger.Flogger\n\tstatic class Inner {\n\t\t\n\t}\n}\n\n@Flogger\nenum LoggerFloggerWithEnum {\n\tCONSTANT;\n}\n\nclass LoggerFloggerWithInnerEnum {\n\t@Flogger\n\tenum Inner {\n\t\tCONSTANT;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/LoggerFloggerAccess.java",
    "content": "import lombok.AccessLevel;\nimport lombok.extern.flogger.Flogger;\n\n@Flogger(access = AccessLevel.PUBLIC)\nclass LoggerFloggerAccessPublic {\n}\n\n@Flogger(access = AccessLevel.PROTECTED)\nclass LoggerFloggerAccessProtected {\n}\n\n@Flogger(access = AccessLevel.PACKAGE)\nclass LoggerFloggerAccessPackage {\n}\n\n@Flogger(access = AccessLevel.PRIVATE)\nclass LoggerFloggerAccessPrivate {\n}\n\n@Flogger(access = AccessLevel.NONE)\nclass LoggerFloggerAccessNone {\n}\n"
  },
  {
    "path": "test/transform/resource/before/LoggerFloggerRecord.java",
    "content": "// version 16:\n\nimport lombok.extern.flogger.Flogger;\n\nclass LoggerFloggerRecord {\n\t@Flogger\n\tpublic record Inner(String x) {}\n}\n"
  },
  {
    "path": "test/transform/resource/before/LoggerJBossLog.java",
    "content": "import lombok.extern.jbosslog.JBossLog;\n\n@lombok.extern.jbosslog.JBossLog\nclass LoggerJBossLog {\n}\n\n@JBossLog\nclass LoggerJBossLogWithImport {\n}\n\nclass LoggerJBossLogOuter {\n\t@lombok.extern.jbosslog.JBossLog\n\tstatic class Inner {\n\t\t\n\t}\n}\n\n@JBossLog\nenum LoggerJBossLogWithEnum {\n\tCONSTANT;\n}\n\nclass LoggerJBossLogWithInnerEnum {\n\t@JBossLog\n\tenum Inner {\n\t\tCONSTANT;\n\t}\n}\n\n@JBossLog(topic=\"DifferentLogger\")\nclass LoggerJBossLogWithDifferentLoggerName {\n}\n\n@JBossLog(topic=LoggerJBossLogWithStaticField.TOPIC)\nclass LoggerJBossLogWithStaticField {\n\tstatic final String TOPIC = \"StaticField\";\n}"
  },
  {
    "path": "test/transform/resource/before/LoggerJBossLogAccess.java",
    "content": "import lombok.AccessLevel;\nimport lombok.extern.jbosslog.JBossLog;\n\n@JBossLog(access = AccessLevel.PUBLIC)\nclass LoggerJBossLogAccessPublic {\n}\n\n@JBossLog(access = AccessLevel.PROTECTED)\nclass LoggerJBossLogAccessProtected {\n}\n\n@JBossLog(access = AccessLevel.PACKAGE)\nclass LoggerJBossLogAccessPackage {\n}\n\n@JBossLog(access = AccessLevel.PRIVATE)\nclass LoggerJBossLogAccessPrivate {\n}\n\n@JBossLog(access = AccessLevel.NONE)\nclass LoggerJBossLogAccessNone {\n}\n"
  },
  {
    "path": "test/transform/resource/before/LoggerJul.java",
    "content": "import lombok.extern.java.Log;\n\n@lombok.extern.java.Log\nclass LoggerJul {\n}\n\n@Log\nclass LoggerJulWithImport {\n}\n\n@Log(topic=\"DifferentName\")\nclass LoggerJulWithDifferentName {\n}\n\n@Log(topic=LoggerJulWithStaticField.TOPIC)\nclass LoggerJulWithStaticField {\n\tstatic final String TOPIC = \"StaticField\";\n}\n\n@Log\nenum LoggerJulWithEnum {\n\tCONSTANT;\n}\n\nclass LoggerJulWithInnerEnum {\n\t@Log\n\tenum Inner {\n\t\tCONSTANT;\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/LoggerJulAccess.java",
    "content": "import lombok.AccessLevel;\nimport lombok.extern.java.Log;\n\n@Log(access = AccessLevel.PUBLIC)\nclass LoggerJulAccessPublic {\n}\n\n@Log(access = AccessLevel.PROTECTED)\nclass LoggerJulAccessProtected {\n}\n\n@Log(access = AccessLevel.PACKAGE)\nclass LoggerJulAccessPackage {\n}\n\n@Log(access = AccessLevel.PRIVATE)\nclass LoggerJulAccessPrivate {\n}\n\n@Log(access = AccessLevel.NONE)\nclass LoggerJulAccessNone {\n}\n"
  },
  {
    "path": "test/transform/resource/before/LoggerLog4j.java",
    "content": "import lombok.extern.log4j.Log4j;\n\n@lombok.extern.log4j.Log4j\nclass LoggerLog4j {\n}\n\n@Log4j\nclass LoggerLog4jWithImport {\n}\n\n@Log4j(topic=\"DifferentName\")\nclass LoggerLog4jWithDifferentName {\n}\n\n@Log4j(topic=LoggerLog4jWithStaticField.TOPIC)\nclass LoggerLog4jWithStaticField {\n\tstatic final String TOPIC = \"StaticField\";\n}\n\n@Log4j\nenum LoggerLog4jWithEnum {\n\tCONSTANT;\n}\n\nclass LoggerLog4jWithInnerEnum {\n\t@Log4j\n\tenum Inner {\n\t\tCONSTANT;\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/LoggerLog4j2.java",
    "content": "//version 8: Our Log4j2 version doesn't support Java 6\nimport lombok.extern.log4j.Log4j2;\n\n@lombok.extern.log4j.Log4j2\nclass LoggerLog4j2 {\n}\n\n@Log4j2\nclass LoggerLog4j2WithImport {\n}\n\n@Log4j2(topic=\"DifferentName\")\nclass LoggerLog4j2WithDifferentName {\n}\n\n@Log4j2(topic=LoggerLog4j2WithStaticField.TOPIC)\nclass LoggerLog4j2WithStaticField {\n\tstatic final String TOPIC = \"StaticField\";\n}\n\n@Log4j2\nenum LoggerLog4j2WithEnum {\n\tCONSTANT;\n}\n\nclass LoggerLog4j2WithInnerEnum {\n\t@Log4j2\n\tenum Inner {\n\t\tCONSTANT;\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/LoggerLog4j2Access.java",
    "content": "// version 8: Our Log4j2 version doesn't support Java 6\nimport lombok.AccessLevel;\nimport lombok.extern.log4j.Log4j2;\n\n@Log4j2(access = AccessLevel.PUBLIC)\nclass LoggerLog4j2AccessPublic {\n}\n\n@Log4j2(access = AccessLevel.PROTECTED)\nclass LoggerLog4j2AccessProtected {\n}\n\n@Log4j2(access = AccessLevel.PACKAGE)\nclass LoggerLog4j2AccessPackage {\n}\n\n@Log4j2(access = AccessLevel.PRIVATE)\nclass LoggerLog4j2AccessPrivate {\n}\n\n@Log4j2(access = AccessLevel.NONE)\nclass LoggerLog4j2AccessNone {\n}\n"
  },
  {
    "path": "test/transform/resource/before/LoggerLog4jAccess.java",
    "content": "import lombok.AccessLevel;\nimport lombok.extern.log4j.Log4j;\n\n@Log4j(access = AccessLevel.PUBLIC)\nclass LoggerLog4jAccessPublic {\n}\n\n@Log4j(access = AccessLevel.PROTECTED)\nclass LoggerLog4jAccessProtected {\n}\n\n@Log4j(access = AccessLevel.PACKAGE)\nclass LoggerLog4jAccessPackage {\n}\n\n@Log4j(access = AccessLevel.PRIVATE)\nclass LoggerLog4jAccessPrivate {\n}\n\n@Log4j(access = AccessLevel.NONE)\nclass LoggerLog4jAccessNone {\n}\n"
  },
  {
    "path": "test/transform/resource/before/LoggerSlf4j.java",
    "content": "import lombok.extern.slf4j.Slf4j;\n\n@lombok.extern.slf4j.Slf4j\nclass LoggerSlf4j {\n}\n\n@Slf4j\nclass LoggerSlf4jWithImport {\n}\n\n@Slf4j\nenum LoggerSlf4jWithEnum {\n\tCONSTANT;\n}\n\nclass LoggerSlf4jWithInnerEnum {\n\t@Slf4j\n\tenum Inner {\n\t\tCONSTANT;\n\t}\n}\n\nclass LoggerSlf4jOuter {\n\t@lombok.extern.slf4j.Slf4j\n\tstatic class Inner {\n\t\t\n\t}\n}\n\n@Slf4j(topic=\"DifferentLogger\")\nclass LoggerSlf4jWithDifferentLoggerName {\n}\n\n@Slf4j(topic=LoggerSlf4jWithStaticField.TOPIC)\nclass LoggerSlf4jWithStaticField {\n\tstatic final String TOPIC = \"StaticField\";\n}\n\n@Slf4j(topic=LoggerSlf4jWithTwoStaticFields.TOPIC + LoggerSlf4jWithTwoStaticFields.TOPIC)\nclass LoggerSlf4jWithTwoStaticFields {\n\tstatic final String TOPIC = \"StaticField\";\n}\n"
  },
  {
    "path": "test/transform/resource/before/LoggerSlf4jAccess.java",
    "content": "import lombok.AccessLevel;\nimport lombok.extern.slf4j.Slf4j;\n\n@Slf4j(access = AccessLevel.PUBLIC)\nclass LoggerSlf4jAccessPublic {\n}\n\n@Slf4j(access = AccessLevel.PROTECTED)\nclass LoggerSlf4jAccessProtected {\n}\n\n@Slf4j(access = AccessLevel.PACKAGE)\nclass LoggerSlf4jAccessPackage {\n}\n\n@Slf4j(access = AccessLevel.PRIVATE)\nclass LoggerSlf4jAccessPrivate {\n}\n\n@Slf4j(access = AccessLevel.NONE)\nclass LoggerSlf4jAccessNone {\n}\n"
  },
  {
    "path": "test/transform/resource/before/LoggerSlf4jAlreadyExists.java",
    "content": "@lombok.extern.slf4j.Slf4j\nclass LoggerSlf4jAlreadyExists {\n\tint log;\n}"
  },
  {
    "path": "test/transform/resource/before/LoggerSlf4jInAnonymousClass.java",
    "content": "import lombok.extern.slf4j.Slf4j;\n\npublic class LoggerSlf4jInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\t@Slf4j\n\t\tclass Inner {\n\t\t}\n\t};\n}"
  },
  {
    "path": "test/transform/resource/before/LoggerSlf4jOnNonType.java",
    "content": "// skip-compare-content\nclass LoggerSlf4jOnNonType {\n\t@lombok.extern.slf4j.Slf4j\n\tvoid foo() {\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/LoggerSlf4jOnRecord.java",
    "content": "// version 14:\n\nimport lombok.extern.slf4j.Slf4j;\n\n@Slf4j\npublic record LoggerSlf4jOnRecord(String a, String b) {\n}"
  },
  {
    "path": "test/transform/resource/before/LoggerSlf4jTypes.java",
    "content": "@lombok.extern.slf4j.Slf4j\ninterface LoggerSlf4jTypesInterface {\n}\n@lombok.extern.slf4j.Slf4j\n@interface LoggerSlf4jTypesAnnotation {\n}\n@lombok.extern.slf4j.Slf4j\nenum LoggerSlf4jTypesEnum {\n}\n@lombok.extern.slf4j.Slf4j\nenum LoggerSlf4jTypesEnumWithElement {\n\tFOO;\n}\ninterface LoggerSlf4jTypesInterfaceOuter {\n\t@lombok.extern.slf4j.Slf4j\n\tclass Inner {\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/LoggerSlf4jWithPackage.java",
    "content": "package before;\n@lombok.extern.slf4j.Slf4j\nclass LoggerSlf4jWithPackage {\n}\nclass LoggerSlf4jWithPackageOuter {\n\t@lombok.extern.slf4j.Slf4j\n\tstatic class Inner {\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/LoggerXSlf4j.java",
    "content": "import lombok.extern.slf4j.XSlf4j;\n\n@lombok.extern.slf4j.XSlf4j\nclass LoggerXSlf4j {\n}\n\n@XSlf4j\nclass LoggerXSlf4jWithImport {\n}\n\n@XSlf4j(topic=\"DifferentName\")\nclass LoggerXSlf4jWithDifferentName {\n}\n\n@XSlf4j(topic=LoggerXSlf4jWithStaticField.TOPIC)\nclass LoggerXSlf4jWithStaticField {\n\tstatic final String TOPIC = \"StaticField\";\n}"
  },
  {
    "path": "test/transform/resource/before/LoggerXSlf4jAccess.java",
    "content": "import lombok.AccessLevel;\nimport lombok.extern.slf4j.XSlf4j;\n\n@XSlf4j(access = AccessLevel.PUBLIC)\nclass LoggerXSlf4jAccessPublic {\n}\n\n@XSlf4j(access = AccessLevel.PROTECTED)\nclass LoggerXSlf4jAccessProtected {\n}\n\n@XSlf4j(access = AccessLevel.PACKAGE)\nclass LoggerXSlf4jAccessPackage {\n}\n\n@XSlf4j(access = AccessLevel.PRIVATE)\nclass LoggerXSlf4jAccessPrivate {\n}\n\n@XSlf4j(access = AccessLevel.NONE)\nclass LoggerXSlf4jAccessNone {\n}\n"
  },
  {
    "path": "test/transform/resource/before/MixGetterVal.java",
    "content": "// version :9\nimport lombok.Getter;\nimport lombok.val;\n\nclass MixGetterVal {\n\t@Getter private int x;\n\t\n\tpublic void m(int z) {}\n\tpublic void test() {\n\t\tval y = x;\n\t\tm(y);\n\t\tval a = getX();\n\t\tm(a);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/MultiFieldGetter.java",
    "content": "import lombok.Getter;\nimport lombok.AccessLevel;\n\nclass MultiFieldGetter {\n\t@Getter(AccessLevel.PROTECTED) int x, y;\n}\n\n@Getter\nclass MultiFieldGetter2 {\n\t@Getter(AccessLevel.PACKAGE) int x, y;\n}"
  },
  {
    "path": "test/transform/resource/before/NoArgsConstructorForce.java",
    "content": "import lombok.NoArgsConstructor;\n\n@NoArgsConstructor(force = true)\npublic class NoArgsConstructorForce {\n\tprivate final int[] i;\n\tprivate final Object[] o;\n\tprivate final java.util.List<?>[] fullQualifiedList;\n\tprivate final String alreadyInitialized = \"yes\";\n}"
  },
  {
    "path": "test/transform/resource/before/NoPrivateNoArgsConstructor.java",
    "content": "//CONF: lombok.noArgsConstructor.extraPrivate = false\npublic class NoPrivateNoArgsConstructor {\n\t@lombok.Data\n\tpublic static class NoPrivateNoArgsConstructorData {\n\t\tprivate final int i;\n\t}\n\n\t@lombok.Value\n\tpublic static class NoPrivateNoArgsConstructorValue {\n\t\tint i;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/NonNullExistingConstructorOnRecord.java",
    "content": "// version 14:\n\nimport lombok.NonNull;\n\npublic record NonNullExistingConstructorOnRecord(@NonNull String a, @NonNull String b) {\n\tpublic NonNullExistingConstructorOnRecord(@NonNull String b) {\n\t\tthis(\"default\", b);\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/NonNullOnParameter.java",
    "content": "//version 8:\nclass NonNullOnParameter extends Thread {\n\tNonNullOnParameter(@lombok.NonNull String arg) {\n\t\tthis(arg, \"\");\n\t}\n\t\n\tNonNullOnParameter(@lombok.NonNull String arg, @lombok.NonNull String arg2) {\n\t\tsuper(arg);\n\t\tif (arg == null) throw new NullPointerException();\n\t}\n\t\n\tpublic void test2(@lombok.NonNull String arg, @lombok.NonNull String arg2, @lombok.NonNull String arg3) {\n\t\tif (arg2 == null) {\n\t\t\tthrow new NullPointerException(\"arg2\");\n\t\t}\n\t\tif (arg == null) System.out.println(\"Hello\");\n\t}\n\t\n\tpublic void test3(@lombok.NonNull String arg) {\n\t\tif (arg != null) throw new IllegalStateException();\n\t}\n\t\n\tpublic void test(@lombok.NonNull String stringArg, @lombok.NonNull String arg2, @lombok.NonNull int primitiveArg) {\n\t\t\n\t}\n\t\n\tpublic void test(@lombok.NonNull String arg) {\n\t\tSystem.out.println(\"Hey\");\n\t\tif (arg == null) throw new NullPointerException();\n\t}\n\t\n\tpublic void testWithAssert(@lombok.NonNull String param) {\n\t\tassert param != null;\n\t}\n\t\n\tpublic void testWithAssertAndMessage(@lombok.NonNull String param) {\n\t\tassert param != null : \"Oops\";\n\t}\n\n}"
  },
  {
    "path": "test/transform/resource/before/NonNullOnParameterAbstract.java",
    "content": "//version 8:\nabstract class NonNullOnParameterAbstract {\n\tpublic void test(@lombok.NonNull String arg) {\n\t\tSystem.out.println(\"Hey\");\n\t}\n\t\n\tpublic abstract void test2(@lombok.NonNull String arg);\n}"
  },
  {
    "path": "test/transform/resource/before/NonNullOnParameterOfDefaultMethod.java",
    "content": "// version 8:\ninterface NonNullOnParameterOfDefaultMethod {\n\tvoid test(@lombok.NonNull String arg);\n\tdefault void test2(@lombok.NonNull String arg) {\n\t\tSystem.out.println(arg);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/NonNullOnRecordExistingConstructor.java",
    "content": "// version 14:\n\nimport lombok.NonNull;\n\npublic record NonNullOnRecordExistingConstructor(@NonNull String a) {\n\tpublic NonNullOnRecordExistingConstructor {\n\t\tSystem.out.println(\"Hello\");\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/NonNullOnRecordExistingSetter.java",
    "content": "// version 14:\n\nimport lombok.NonNull;\n\npublic record NonNullOnRecordExistingSetter(@NonNull String a) {\n\tpublic NonNullOnRecordExistingSetter(String a) {\n\t\tthis.a = a;\n\t}\n\t\n\tpublic void method(@NonNull String param) {\n\t\tString asd = \"a\";\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/NonNullOnRecordSimple.java",
    "content": "// version 14:\n\nimport lombok.NonNull;\n\npublic record NonNullOnRecordSimple(@NonNull String a, @NonNull String b) {\n}"
  },
  {
    "path": "test/transform/resource/before/NonNullOnRecordTypeUse.java",
    "content": "// version 14:\n\nimport lombok.NonNull;\n\npublic record NonNullOnRecordTypeUse(@NonNull int [] a, int @NonNull [] b, int [] @NonNull [] c) {\n}"
  },
  {
    "path": "test/transform/resource/before/NonNullPlain.java",
    "content": "//version 8:\nimport java.lang.annotation.*;\n\n@lombok.RequiredArgsConstructor\n@lombok.Getter\n@lombok.Setter\nclass NonNullPlain {\n\t@lombok.NonNull\n\tint i;\n\t@lombok.NonNull\n\tString s;\n\t@NotNull\n\tObject o;\n\t\n\t@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE})\n\t@Retention(RetentionPolicy.CLASS)\n\tpublic @interface NotNull {}\n}"
  },
  {
    "path": "test/transform/resource/before/NonNullTypeUse.java",
    "content": "//version 8:\nimport lombok.NonNull;\n\nclass NonNullTypeUse {\n\tvoid test1(@NonNull String[][][] args) {\n\t}\n\tvoid test2(String @NonNull [][][] args) {\n\t}\n\tvoid test3(String [] @NonNull [][] args) {\n\t}\n\tvoid test4(String [][] @NonNull [] args) {\n\t}\n\tvoid test5(@NonNull String simple) {\n\t}\n\tvoid test6(java.lang.@NonNull String weird) {\n\t}\n\tvoid test7(java.lang.String @NonNull [][] weird) {\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/NonNullWithAlternateException.java",
    "content": "//version 8:\n//CONF: lombok.nonNull.exceptionType = IllegalArgumentException\n\npublic class NonNullWithAlternateException {\n\t@lombok.NonNull @lombok.Setter private String test;\n\n\tpublic void testMethod(@lombok.NonNull String arg) {\n\t\tSystem.out.println(arg);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/NonNullWithAssertion.java",
    "content": "//version 8:\n//CONF: lombok.nonNull.exceptionType = Assertion\n\npublic class NonNullWithAssertion {\n\t@lombok.NonNull @lombok.Setter private String test;\n\n\tpublic void testMethod(@lombok.NonNull String arg) {\n\t\tSystem.out.println(arg);\n\t}\n\n\tpublic void testMethodWithIf(@lombok.NonNull String arg) {\n\t\tif (arg == null) throw new NullPointerException(\"Oops\");\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/NonNullWithGuava.java",
    "content": "//version 8:\n//CONF: lombok.nonNull.exceptionType = Guava\nimport static com.google.common.base.Preconditions.*;\npublic class NonNullWithGuava {\n\t@lombok.NonNull @lombok.Setter private String test;\n\n\tpublic void testMethod(@lombok.NonNull String arg) {\n\t\tSystem.out.println(arg);\n\t}\n\n\tpublic void testMethodWithCheck1(@lombok.NonNull String arg) {\n\t\tcheckNotNull(arg);\n\t}\n\n\tpublic void testMethodWithCheckAssign(@lombok.NonNull String arg) {\n\t\ttest = checkNotNull(arg);\n\t}\n\n\tpublic void testMethodWithCheck2(@lombok.NonNull String arg) {\n\t\tcom.google.common.base.Preconditions.checkNotNull(arg);\n\t}\n\n\tpublic void testMethodWithFakeCheck1(@lombok.NonNull String arg) {\n\t\tcheckNotNull(\"\");\n\t}\n\n\tpublic void testMethodWithFakeCheck2(@lombok.NonNull String arg) {\n\t\tcom.google.common.base.Preconditions.checkNotNull(test);\n\t}\n\t\n\tpublic void testMethodWithFakeCheckAssign(@lombok.NonNull String arg) {\n\t\ttest = checkNotNull(test);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/NonNullWithJdk.java",
    "content": "//version 8:\n//CONF: lombok.nonNull.exceptionType = Jdk\nimport static java.util.Objects.*;\npublic class NonNullWithJdk {\n\t@lombok.NonNull @lombok.Setter private String test;\n\n\tpublic void testMethod(@lombok.NonNull String arg) {\n\t\tSystem.out.println(arg);\n\t}\n\n\tpublic void testMethodWithCheck1(@lombok.NonNull String arg) {\n\t\trequireNonNull(arg);\n\t}\n\n\tpublic void testMethodWithCheckAssign(@lombok.NonNull String arg) {\n\t\ttest = requireNonNull(arg);\n\t}\n\n\tpublic void testMethodWithCheck2(@lombok.NonNull String arg) {\n\t\tjava.util.Objects.requireNonNull(arg);\n\t}\n\n\tpublic void testMethodWithFakeCheck1(@lombok.NonNull String arg) {\n\t\trequireNonNull(\"\");\n\t}\n\n\tpublic void testMethodWithFakeCheck2(@lombok.NonNull String arg) {\n\t\tjava.util.Objects.requireNonNull(test);\n\t}\n\t\n\tpublic void testMethodWithFakeCheckAssign(@lombok.NonNull String arg) {\n\t\ttest = requireNonNull(test);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/NonNullWithSneakyThrows.java",
    "content": "//version 8:\nclass NonNullWithSneakyThrows {\n\t@lombok.SneakyThrows void test(@lombok.NonNull String in) {\n\t\tSystem.out.println(in);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/NullAnnotatedCheckerFrameworkSuperBuilder.java",
    "content": "//version 8:\n//CONF: lombok.addNullAnnotations = checkerframework\nimport java.util.List;\nimport lombok.Singular;\n\nclass NullAnnotatedCheckerFrameworkSuperBuilder {\n\t@lombok.experimental.SuperBuilder\n\tpublic static class Parent {\n\t\t@lombok.Builder.Default int x = 5;\n\t\tint y;\n\t\tint z;\n\t\t@Singular List<String> names;\n\t}\n\t\n\t@lombok.experimental.SuperBuilder\n\tpublic static class ZChild extends Parent {\n\t\t@lombok.Builder.Default int a = 1;\n\t\tint b;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/NullLibrary1.java",
    "content": "//version 8:\n//CONF: lombok.addNullAnnotations = eclipse\n@lombok.EqualsAndHashCode\n@lombok.ToString\n@lombok.AllArgsConstructor\npublic class NullLibrary1 {\n\t@lombok.With String foo;\n}\n"
  },
  {
    "path": "test/transform/resource/before/NullLibrary2.java",
    "content": "//version 8: springframework dep is too new to run on j6\n//CONF: lombok.addNullAnnotations = spring\n@lombok.EqualsAndHashCode\n@lombok.ToString\n@lombok.AllArgsConstructor\npublic class NullLibrary2 {\n\t@lombok.With String foo;\n}\n"
  },
  {
    "path": "test/transform/resource/before/NullLibrary3.java",
    "content": "//CONF: lombok.addNullAnnotations = jakarta\n@lombok.EqualsAndHashCode\n@lombok.ToString\n@lombok.AllArgsConstructor\npublic class NullLibrary3 {\n\t@jakarta.annotation.Nonnull\n\t@lombok.With String foo;\n}\n"
  },
  {
    "path": "test/transform/resource/before/OnXFlagUsage.java",
    "content": "//version 8:\n//conf: lombok.onX.flagUsage = warning\n//skip compare content: We're just checking if the flagUsage key works.\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\nimport lombok.NoArgsConstructor;\nimport lombok.RequiredArgsConstructor;\nimport lombok.Setter;\n\n@Getter(onMethod_ = @Deprecated)\n@Setter(onMethod_ = @Deprecated, onParam_ = @Deprecated)\n@NoArgsConstructor(onConstructor_ = @Deprecated)\n@AllArgsConstructor(onConstructor_ = @Deprecated)\npublic class OnXFlagUsage {\n\tprivate final String a = \"\";\n\tprivate String b;\n}\n\n@RequiredArgsConstructor(onConstructor_ = @Deprecated)\nclass OnXFlagUsage2 {\n\tprivate final String a = \"\";\n}"
  },
  {
    "path": "test/transform/resource/before/OnXJava7Style.java",
    "content": "//version :7\npublic class OnXJava7Style {\n\t@interface Foo {\n\t\tString value() default \"\";\n\t}\n\n\t@interface Bar {\n\t\tString stuff() default \"\";\n\t}\n\n\t@interface Array {\n\t\tString[] value() default {};\n\t}\n\n\t@lombok.Getter(onMethod=@__(@Foo)) String a;\n\t@lombok.Setter(onMethod=@__(@Foo())) String b;\n\t@lombok.Setter(onParam=@__(@Foo(\"a\"))) String c;\n\t@lombok.Setter(onParam=@__(@Bar(stuff=\"b\"))) String d;\n\t@lombok.Getter(onMethod=@__({@Foo(value=\"c\"), @Bar(stuff=\"d\")})) String e;\n\t@lombok.Getter(onMethod=@__(@Array)) String f;\n\t@lombok.Getter(onMethod=@__(@Array())) String g;\n\t@lombok.Getter(onMethod=@__(@Array({}))) String h;\n\t@lombok.Getter(onMethod=@__(@Array({\"a\", \"b\"}))) String i;\n}\n"
  },
  {
    "path": "test/transform/resource/before/OnXJava7StyleOn8.java",
    "content": "//platform ecj,eclipse\n//version 8:\n\npublic class OnXJava7StyleOn8 {\n\t@interface Foo {\n\t\tString value() default \"\";\n\t}\n\n\t@interface Bar {\n\t\tString stuff() default \"\";\n\t}\n\n\t@interface Array {\n\t\tString[] value() default {};\n\t}\n\n\t@lombok.Getter(onMethod=@__(@Foo)) String a;\n\t@lombok.Setter(onMethod=@__(@Foo())) String b;\n\t@lombok.Setter(onParam=@__(@Foo(\"a\"))) String c;\n\t@lombok.Setter(onParam=@__(@Bar(stuff=\"b\"))) String d;\n\t@lombok.Getter(onMethod=@__({@Foo(value=\"c\"), @Bar(stuff=\"d\")})) String e;\n\t@lombok.Getter(onMethod=@__(@Array)) String f;\n\t@lombok.Getter(onMethod=@__(@Array())) String g;\n\t@lombok.Getter(onMethod=@__(@Array({}))) String h;\n\t@lombok.Getter(onMethod=@__(@Array({\"a\", \"b\"}))) String i;\n}\n"
  },
  {
    "path": "test/transform/resource/before/OnXJava8Style.java",
    "content": "//version 8:\npublic class OnXJava8Style {\n\t@interface Foo {\n\t\tString value() default \"\";\n\t}\n\n\t@interface Bar {\n\t\tString stuff() default \"\";\n\t}\n\n\t@interface Array {\n\t\tString[] value() default {};\n\t}\n\n\t@lombok.Getter(onMethod_=@Foo) String a;\n\t@lombok.Setter(onMethod_=@Foo()) String b;\n\t@lombok.Setter(onParam_=@Foo(\"a\")) String c;\n\t@lombok.Setter(onParam_=@Bar(stuff=\"b\")) String d;\n\t@lombok.Getter(onMethod_={@Foo(value=\"c\"), @Bar(stuff=\"d\")}) String e;\n\t@lombok.Getter(onMethod_=@Array) String f;\n\t@lombok.Getter(onMethod_=@Array()) String g;\n\t@lombok.Getter(onMethod_=@Array({})) String h;\n\t@lombok.Getter(onMethod_=@Array({\"a\", \"b\"})) String i;\n}\n"
  },
  {
    "path": "test/transform/resource/before/OnXJava8StyleOn7.java",
    "content": "//platform ecj,eclipse\n//version :7\n\npublic class OnXJava8StyleOn7 {\n\t@interface Foo {\n\t\tString value() default \"\";\n\t}\n\n\t@interface Bar {\n\t\tString stuff() default \"\";\n\t}\n\n\t@interface Array {\n\t\tString[] value() default {};\n\t}\n\n\t@lombok.Getter(onMethod_=@Foo) String a;\n\t@lombok.Setter(onMethod_=@Foo()) String b;\n\t@lombok.Setter(onParam_=@Foo(\"a\")) String c;\n\t@lombok.Setter(onParam_=@Bar(stuff=\"b\")) String d;\n\t@lombok.Getter(onMethod_={@Foo(value=\"c\"), @Bar(stuff=\"d\")}) String e;\n\t@lombok.Getter(onMethod_=@Array) String f;\n\t@lombok.Getter(onMethod_=@Array()) String g;\n\t@lombok.Getter(onMethod_=@Array({})) String h;\n\t@lombok.Getter(onMethod_=@Array({\"a\", \"b\"})) String i;\n}\n"
  },
  {
    "path": "test/transform/resource/before/PrivateNoArgsConstructor.java",
    "content": "// CONF: lombok.noArgsConstructor.extraPrivate = true\n// CONF: lombok.equalsAndHashCode.callSuper = call\npublic class PrivateNoArgsConstructor {\n\tprivate static class Base {\n\t}\n\t\n\t@lombok.Data\n\tpublic static class PrivateNoArgsConstructorNotOnExtends extends Base {\n\t\tprivate final int a;\n\t}\n\t\n\t@lombok.Data\n\tpublic static class PrivateNoArgsConstructorOnExtendsObject extends Object {\n\t\tprivate final int b;\n\t}\n\t\n\t@lombok.NoArgsConstructor(force=true)\n\t@lombok.Data\n\t@lombok.RequiredArgsConstructor\n\tpublic static class PrivateNoArgsConstructorExplicitBefore {\n\t\tprivate final int c;\n\t}\n\t\n\t@lombok.Data\n\t@lombok.NoArgsConstructor(force=true)\n\t@lombok.RequiredArgsConstructor\n\tpublic static class PrivateNoArgsConstructorExplicitAfter {\n\t\tprivate final int d;\n\t}\n\t\n\t@lombok.Data\n\t@lombok.NoArgsConstructor(access=lombok.AccessLevel.NONE)\n\t@lombok.RequiredArgsConstructor\n\tpublic static class PrivateNoArgsConstructorExplicitNone {\n\t\tprivate final int e;\n\t}\n\t\n\t@lombok.Data\n\tpublic static class PrivateNoArgsConstructorNoFields {\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SetterAccessLevel.java",
    "content": "class SetterAccessLevel {\n\t@lombok.Setter(lombok.AccessLevel.NONE)\n\tboolean isNone;\n\t\n\t@lombok.Setter(lombok.AccessLevel.PRIVATE)\n\tboolean isPrivate;\n\t\n\t@lombok.Setter(lombok.AccessLevel.PACKAGE)\n\tboolean isPackage;\n\t\n\t@lombok.Setter(lombok.AccessLevel.PROTECTED)\n\tboolean isProtected;\n\t\n\t@lombok.Setter(lombok.AccessLevel.PUBLIC)\n\tboolean isPublic;\n\t\n\t@lombok.Setter(value=lombok.AccessLevel.PUBLIC)\n\tboolean value;\n}\n"
  },
  {
    "path": "test/transform/resource/before/SetterAlreadyExists.java",
    "content": "class Setter1 {\n\t@lombok.Setter boolean foo;\n\tvoid setFoo(boolean foo) {\n\t}\n}\n\nclass Setter2 {\n\t@lombok.Setter boolean foo;\n\tvoid setFoo(String foo) {\n\t}\n}\n\nclass Setter3 {\n\t@lombok.Setter String foo;\n\tvoid setFoo(boolean foo) {\n\t}\n}\n\nclass Setter4 {\n\t@lombok.Setter String foo;\n\tvoid setFoo(String foo) {\n\t}\n}\n\nclass Setter5 {\n\t@lombok.Setter String foo;\n\tvoid setFoo() {\n\t}\n}\n\nclass Setter6 {\n\t@lombok.Setter String foo;\n\tvoid setFoo(String foo, int x) {\n\t}\n}\n\nclass Setter7 {\n\t@lombok.Setter String foo;\n\tvoid setFoo(String foo, Object... x) {\n\t}\n}\n\nclass Setter8 {\n\t@lombok.Setter boolean isFoo;\n\tvoid setIsFoo(boolean foo) {\n\t}\n}\n\nclass Setter9 {\n\t@lombok.Setter boolean isFoo;\n\tvoid setFoo(boolean foo) {\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SetterAndWithMethodJavadoc.java",
    "content": "import lombok.With;\nclass SetterAndWithMethodJavadoc {\n\t/**\n\t * Some value.\n\t * @param the new value\n\t */\n\t@lombok.Setter @lombok.With int i;\n\n\t/**\n\t * Some other value.\n\t *\n\t * --- SETTER ---\n\t * Set some other value.\n\t * @param the new other value\n\t *\n\t * --- WITH ---\n\t * Reinstantiate with some other value.\n\t * @param the other new other value\n\t */\n\t@lombok.Setter @lombok.With int j;\n\n\tSetterAndWithMethodJavadoc(int i, int j) {\n\t\tthis.i = i;\n\t\tthis.j = j;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SetterDeprecated.java",
    "content": "import lombok.Setter;\nclass SetterDeprecated {\n\t\n\t@Deprecated\n\t@Setter int annotation;\n\t\n\t/**\n\t * @deprecated\n\t */\n\t@Setter int javadoc;\n}\n"
  },
  {
    "path": "test/transform/resource/before/SetterInAnonymousClass.java",
    "content": "import lombok.Setter;\n\npublic class SetterInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\t@Setter\n\t\tclass Inner {\n\t\t\tprivate String string;\n\t\t}\n\t};\n}"
  },
  {
    "path": "test/transform/resource/before/SetterOnClass.java",
    "content": "//version 8:\n@lombok.Setter\nclass SetterOnClass1 {\n\t@lombok.Setter(lombok.AccessLevel.NONE)\n\tboolean isNone;\n\tboolean isPublic;\n}\n\n@lombok.Setter(lombok.AccessLevel.PROTECTED)\nclass SetterOnClass2 {\n\t@lombok.Setter(lombok.AccessLevel.NONE)\n\tboolean isNone;\n\tboolean isProtected;\n\t@lombok.Setter(lombok.AccessLevel.PACKAGE)\n\tboolean isPackage;\n}\n\n@lombok.Setter(lombok.AccessLevel.PACKAGE)\nclass SetterOnClass3 {\n\t@lombok.Setter(lombok.AccessLevel.NONE)\n\tboolean isNone;\n\tboolean isPackage;\n}\n\n@lombok.Setter(lombok.AccessLevel.PRIVATE)\nclass SetterOnClass4 {\n\t@lombok.Setter(lombok.AccessLevel.NONE)\n\tboolean isNone;\n\tboolean isPrivate;\n}\n\n@lombok.Setter(lombok.AccessLevel.PUBLIC)\nclass SetterOnClass5 {\n\t@lombok.Setter(lombok.AccessLevel.NONE)\n\tboolean isNone;\n\tboolean isPublic;\n}\n\n@lombok.Setter\nclass SetterOnClass6 {\n\tString couldBeNull;\n\t@lombok.NonNull String nonNull;\n}"
  },
  {
    "path": "test/transform/resource/before/SetterOnMethodOnParam.java",
    "content": "class SetterOnMethodOnParam {\n\t@lombok.Setter(onMethod=@__(@Deprecated)) int i;\n\t@lombok.Setter(onMethod=@__({@java.lang.Deprecated, @Test}), onParam=@__(@Test)) int j, k;\n\n\tpublic @interface Test {\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SetterOnRecord.java",
    "content": "// version 14:\n\nimport lombok.Setter;\n\n@Setter\npublic record SetterOnRecord(String a, String b) {\n}"
  },
  {
    "path": "test/transform/resource/before/SetterOnStatic.java",
    "content": "class Setter {\n\t@lombok.Setter static boolean foo;\n\t@lombok.Setter static int bar;\n}\n"
  },
  {
    "path": "test/transform/resource/before/SetterPlain.java",
    "content": "import lombok.Setter;\nclass SetterPlain {\n\t@lombok.Setter int i;\n\t@Setter int foo;\n}"
  },
  {
    "path": "test/transform/resource/before/SetterTypeAnnos.java",
    "content": "//CONF: lombok.copyableAnnotations += TA\nimport lombok.Setter;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.List;\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})\n@interface TA {\n}\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})\n@interface TB {\n}\nclass SetterTypeAnnos {\n\t@Setter\n\t@TA @TB List<String> foo;\n}\n"
  },
  {
    "path": "test/transform/resource/before/SetterWithDollar.java",
    "content": "class SetterWithDollar1 {\n\t@lombok.Setter int $i;\n}\n\nclass SetterWithDollar2 {\n\t@lombok.Setter int $i;\n\t@lombok.Setter int i;\n}\n"
  },
  {
    "path": "test/transform/resource/before/SetterWithJavaBeansSpecCapitalization.java",
    "content": "//CONF: lombok.accessors.capitalization = beanspec\nclass SetterWithJavaBeansSpecCapitalization {\n\t@lombok.Setter int a;\n\t@lombok.Setter int aField;\n}\n"
  },
  {
    "path": "test/transform/resource/before/SimpleTypeResolution.java",
    "content": "class SimpleTypeResolutionFail {\n\t@Getter private int x;\n}\n\nclass SimpleTypeResolutionSuccess {\n\t@lombok.Getter private int x;\n}\n"
  },
  {
    "path": "test/transform/resource/before/SingularCleanupForDelombok.java",
    "content": "// version 8:\n// issue #1377: @Singular is not removed by delombok.\n\nimport java.util.Set;\n\nimport lombok.AccessLevel;\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Getter;\nimport lombok.NonNull;\nimport lombok.Singular;\n\nimport lombok.experimental.Accessors;\nimport lombok.experimental.FieldDefaults;\n\n@Accessors(fluent = true) @AllArgsConstructor(access = AccessLevel.PACKAGE) @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) class Book {\n\t@Getter @NonNull String name;\n\t@Getter @Singular @NonNull Set<String> authors;\n\tint numberOfAuthors;\n\t\n\t@Builder public Book(String name, @Singular Set<String> authors) {\n\t\tthis(name, authors, authors.size());\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/SkipSuppressWarnings.java",
    "content": "//CONF: lombok.addSuppressWarnings = false\n\nclass SkipSuppressWarnings {\n\t@lombok.Getter\n\tprivate String field = \"\";\n\t\n\t@lombok.Getter(lazy=true)\n\tprivate final String field2 = \"\";\n}"
  },
  {
    "path": "test/transform/resource/before/SneakyThrowsInInitializer.java",
    "content": "//eclipse: verify diet\nimport lombok.SneakyThrows;\n\npublic class SneakyThrowsInInitializer {\n\n\tpublic static final Runnable R = new Runnable() {\n\t\t\n\t\t@Override\n\t\t@SneakyThrows\n\t\tpublic void run() {\n\t\t\tSystem.out.println(\"test\");\n\t\t\t\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "test/transform/resource/before/SneakyThrowsMultiple.java",
    "content": "import java.awt.AWTException;\nimport java.io.IOException;\nimport java.util.Random;\n\nclass SneakyThrowsMultiple {\n\t@lombok.SneakyThrows({IOException.class,Throwable.class})\n\tpublic void test() {\n\t\tSystem.out.println(\"test1\");\n\t\tthrow new IOException();\n\t}\n\t\n\t@lombok.SneakyThrows({AWTException.class,IOException.class})\n\tpublic void test2() {\n\t\tSystem.out.println(\"test2\");\n\t\tif (new Random().nextBoolean()) {\n\t\t\tthrow new IOException();\n\t\t}\n\t\telse {\n\t\t\tthrow new AWTException(\"WHAT\");\n\t\t}\n\t}\n\t\n\t@lombok.SneakyThrows(value={IOException.class,Throwable.class})\n\tpublic void test3() {\n\t\tSystem.out.println(\"test3\");\n\t\tthrow new IOException();\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/SneakyThrowsPlain.java",
    "content": "import lombok.SneakyThrows;\nclass SneakyThrowsPlain {\n\t@lombok.SneakyThrows SneakyThrowsPlain() {\n\t\tsuper();\n\t\tSystem.out.println(\"constructor\");\n\t}\n\t\n\t@lombok.SneakyThrows SneakyThrowsPlain(int x) {\n\t\tthis();\n\t\tSystem.out.println(\"constructor2\");\n\t}\n\t\n\t@lombok.SneakyThrows public void test() {\n\t\tSystem.out.println(\"test1\");\n\t}\n\t\n\t@SneakyThrows public void test2() {\n\t\tSystem.out.println(\"test2\");\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/SneakyThrowsSingle.java",
    "content": "import java.io.IOException;\n\nclass SneakyThrowsSingle {\n\t@lombok.SneakyThrows(Throwable.class) \n\tpublic void test() {\n\t\tSystem.out.println(\"test1\");\n\t}\n\t\n\t@lombok.SneakyThrows(IOException.class)\n\tpublic void test2() {\n\t\tSystem.out.println(\"test2\");\n\t\tthrow new IOException();\n\t}\n\t\n\t@lombok.SneakyThrows(value=IOException.class)\n\tpublic void test3() {\n\t\tSystem.out.println(\"test3\");\n\t\tthrow new IOException();\n\t}\n\n}"
  },
  {
    "path": "test/transform/resource/before/StandardExceptionWithConstructor.java",
    "content": "import lombok.experimental.StandardException;\n\n@StandardException\npublic class StandardExceptionWithConstructor extends Exception {\n\tpublic StandardExceptionWithConstructor(Integer x, Integer y) {\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/StandardExceptions.java",
    "content": "import lombok.AccessLevel;\nimport lombok.experimental.StandardException;\n\n@StandardException class EmptyException extends Exception {\n}\n@StandardException(access = AccessLevel.PROTECTED) class NoArgsException extends Exception {\n\tpublic NoArgsException() {\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/StaticConstructor.java",
    "content": "//version 8:\n//CONF: lombok.addNullAnnotations = checkerframework\nimport lombok.AllArgsConstructor;\n@AllArgsConstructor(staticName = \"of\")\npublic class StaticConstructor {\n\tString name;\n}\n"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderAbstract.java",
    "content": "public class SuperBuilderAbstract {\n\t@lombok.experimental.SuperBuilder\n\tpublic static class Parent {\n\t\tint parentField;\n\t}\n\t\n\t@lombok.experimental.SuperBuilder\n\tpublic abstract static class Child extends Parent {\n\t\tdouble childField;\n\t}\n\t\n\t@lombok.experimental.SuperBuilder\n\tpublic static class GrandChild extends Child {\n\t\tString grandChildField;\n\t}\n\t\n\tpublic static void test() {\n\t\tGrandChild x = GrandChild.builder().grandChildField(\"\").parentField(5).childField(2.5).build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderAbstractToBuilder.java",
    "content": "public class SuperBuilderAbstractToBuilder {\n\t@lombok.experimental.SuperBuilder(toBuilder = true)\n\tpublic static class Parent {\n\t\tint parentField;\n\t}\n\t\n\t@lombok.experimental.SuperBuilder(toBuilder = true)\n\tpublic abstract static class Child extends Parent {\n\t\tdouble childField;\n\t}\n\t\n\t@lombok.experimental.SuperBuilder(toBuilder = true)\n\tpublic static class GrandChild extends Child {\n\t\tString grandChildField;\n\t}\n\t\n\tpublic static void test() {\n\t\tGrandChild x = GrandChild.builder().grandChildField(\"\").parentField(5).childField(2.5).build().toBuilder().build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderBasic.java",
    "content": "import java.util.List;\n\npublic class SuperBuilderBasic {\n\t@lombok.experimental.SuperBuilder\n\tpublic static class Parent {\n\t\tint field1;\n\t\t@lombok.Singular List<String> items;\n\t}\n\t\n\t@lombok.experimental.SuperBuilder\n\tpublic static class Child extends SuperBuilderBasic.Parent {\n\t\tdouble field3;\n\t}\n\t\n\tpublic static void test() {\n\t\tChild x = Child.builder().field3(0.0).field1(5).item(\"\").build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderBasicToBuilder.java",
    "content": "import java.util.List;\n\npublic class SuperBuilderBasicToBuilder {\n\t@lombok.experimental.SuperBuilder(toBuilder=true)\n\tpublic static class Parent {\n\t\tprivate int field1;\n\t\t@lombok.Builder.ObtainVia(field=\"field1\")\n\t\tint obtainViaField;\n\t\t@lombok.Builder.ObtainVia(method=\"method\")\n\t\tint obtainViaMethod;\n\t\t@lombok.Builder.ObtainVia(method = \"staticMethod\", isStatic = true)\n\t\tString obtainViaStaticMethod;\n\t\t@lombok.Singular List<String> items;\n\t\t\n\t\tprivate int method() {\n\t\t\treturn 2;\n\t\t}\n\t\t\n\t\tprivate static String staticMethod(Parent instance) {\n\t\t\treturn \"staticMethod\";\n\t\t}\n\t}\n\t\n\t@lombok.experimental.SuperBuilder(toBuilder=true)\n\tpublic static class Child extends Parent {\n\t\tprivate double field3;\n\t}\n\t\n\tpublic static void test() {\n\t\tChild x = Child.builder().field3(0.0).field1(5).item(\"\").build().toBuilder().build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderCustomName.java",
    "content": "//CONF: lombok.builder.className = SimpleTestBuilder\nimport java.util.List;\n\n@lombok.experimental.SuperBuilder\nclass SuperBuilderCustomName<T> {\n\tprivate final int field;\n}\n"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderCustomized.java",
    "content": "//version 8: Javac 6 will error out due to `ChildBuilder` not existing before properly running lombok. Giving j6 support status, not worth fixing.\nimport java.util.List;\n\npublic class SuperBuilderCustomized {\n\t@lombok.experimental.SuperBuilder\n\tpublic static class Parent {\n\t\tpublic static abstract class ParentBuilder<C extends Parent, B extends ParentBuilder<C, B>> {\n\t\t\tpublic B resetToDefault() {\n\t\t\t\tfield1 = 0;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t\tpublic B field1(int field1) {\n\t\t\t\tthis.field1 = field1 + 1;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t}\n\t\tint field1;\n\t\t\n\t\tprotected Parent(ParentBuilder<?, ?> b) {\n\t\t\tif (b.field1 == 0)\n\t\t\t\tthrow new IllegalArgumentException(\"field1 must be != 0\");\n\t\t\tthis.field1 = b.field1;\n\t\t}\n\t\t\n\t\tpublic static SuperBuilderCustomized.Parent.ParentBuilder<?, ?> builder(int field1) {\n\t\t\treturn new SuperBuilderCustomized.Parent.ParentBuilderImpl().field1(field1);\n\t\t}\n\t}\n\t\n\t@lombok.experimental.SuperBuilder\n\tpublic static class Child extends Parent {\n\t\tprivate static final class ChildBuilderImpl extends ChildBuilder<Child, ChildBuilderImpl> {\n\t\t\t@Override\n\t\t\tpublic Child build() {\n\t\t\t\tthis.resetToDefault();\n\t\t\t\treturn new Child(this);\n\t\t\t}\n\t\t}\n\t\tdouble field2;\n\t\tpublic static ChildBuilder<?, ?> builder() {\n\t\t\treturn new ChildBuilderImpl().field2(10.0);\n\t\t}\n\t}\n\t\n\tpublic static void test() {\n\t\tChild x = Child.builder().field2(1.0).field1(5).resetToDefault().build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderCustomizedWithSetterPrefix.java",
    "content": "import java.util.List;\n\npublic class SuperBuilderCustomizedWithSetterPrefix {\n\t@lombok.experimental.SuperBuilder(setterPrefix = \"set\")\n\tpublic static class Parent {\n\t\tpublic static abstract class ParentBuilder<C extends Parent, B extends ParentBuilder<C, B>> {\n\t\t\tpublic B setField1(int field1) {\n\t\t\t\tthis.field1 = field1 + 1;\n\t\t\t\treturn self();\n\t\t\t}\n\t\t}\n\t\tint field1;\n\t}\n\t\n\tpublic static void test() {\n\t\tParent x = Parent.builder().setField1(5).build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderInAnonymousClass.java",
    "content": "import lombok.experimental.SuperBuilder;\n\npublic class SuperBuilderInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\t@SuperBuilder\n\t\tclass InnerParent {\n\t\t\tprivate String string;\n\t\t}\n\n\t\t@SuperBuilder\n\t\tclass InnerChild {\n\t\t\tprivate String string;\n\t\t}\n\t};\n}"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderInitializer.java",
    "content": "import lombok.experimental.SuperBuilder;\n\nclass SuperBuilderInitializer {\n\t@SuperBuilder\n\tpublic static class One {\n\t\tprivate String world;\n\t\t{\n\t\t\tworld = \"Hello\";\n\t\t}\n\t\t\n\t\tprivate static final String world2;\n\t\tstatic {\n\t\t\tworld2 = \"Hello\";\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderJavadoc.java",
    "content": "import java.util.List;\n\n@lombok.experimental.SuperBuilder\npublic abstract class SuperBuilderJavadoc {\n\t/**\n\t * basic gets only a builder setter.\n\t * @see #getsetwith\n\t * @param tag is moved to the setter.\n\t * @return tag is removed from the setter.\n\t */\n\tprivate final int basic;\n\n\t/**\n\t * getsetwith gets a builder setter, an instance getter and setter, and a wither.\n\t * @param tag is moved to the setters and wither.\n\t * @return tag is moved to the getter.\n\t */\n\t@lombok.Getter\n\t@lombok.Setter\n\t@lombok.experimental.Wither\n\tprivate int getsetwith;\n\n\t/**\n\t * Predef has a predefined builder setter with no javadoc, and the builder setter does not get this one.\n\t * @param tag remains on the field.\n\t * @return tag remains on the field.\n\t */\n\tprivate final int predef;\n\n\t/**\n\t * predefWithJavadoc has a predefined builder setter with javadoc, so it keeps that one untouched.\n\t * @param tag is removed from the field.\n\t * @return tag remains on the field.\n\t */\n\tprivate final int predefWithJavadoc;\n\n\tpublic static abstract class SuperBuilderJavadocBuilder<C extends SuperBuilderJavadoc, B extends SuperBuilderJavadocBuilder<C, B>> {\n\t\tpublic B predef(final int x) {\n\t\t\tthis.predef = x * 10;\n\t\t\treturn self();\n\t\t}\n\n\t\t/**\n\t\t * This javadoc remains untouched.\n\t\t * @param x 1/100 of the thing\n\t\t * @return the updated builder\n\t\t */\n\t\tpublic B predefWithJavadoc(final int x) {\n\t\t\tthis.predefWithJavadoc = x * 100;\n\t\t\treturn self();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderNameClashes.java",
    "content": "public class SuperBuilderNameClashes {\n\t@lombok.experimental.SuperBuilder\n\tpublic static class GenericsClash<B, C, C2> {\n\t}\n\t\n\t@lombok.experimental.SuperBuilder\n\tpublic static class B {\n\t}\n\t\n\tpublic static class C2 {\n\t}\n\t\n\t@lombok.experimental.SuperBuilder\n\tpublic static class C {\n\t\tC2 c2;\n\t}\n\t\n\tinterface B2 {\n\t\tinterface B4<X> {\n\t\t}\n\t}\n\t\n\tinterface B3<Y> {\n\t}\n\t\n\t@lombok.experimental.SuperBuilder\n\tpublic static class ExtendsClauseCollision extends B implements B2.B4<Object>, B3<Object> {\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderNestedGenericTypes.java",
    "content": "public class SuperBuilderNestedGenericTypes {\n\t@lombok.experimental.SuperBuilder\n\tpublic static abstract class Generic<T extends Generic<?>> {\n\t}\n\t\n\t@lombok.experimental.SuperBuilder\n\tpublic static abstract class NestedGeneric<T extends OtherGeneric<?>> extends Generic<NestedGeneric<? extends OtherGeneric<?>>> {\n\t}\n\t\n\tpublic interface OtherGeneric<T> {\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderOnRecord.java",
    "content": "// skip compare content\n// version 14:\n\nimport lombok.experimental.SuperBuilder;\n\n@SuperBuilder\nrecord SuperBuilderOnRecord(String a, String b) {\n}"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderSingularAnnotatedTypes.java",
    "content": "//version 8:\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.Set;\nimport java.util.Map;\nimport lombok.NonNull;\nimport lombok.Singular;\n@Target(ElementType.TYPE_USE)\n@interface MyAnnotation {}\n@lombok.experimental.SuperBuilder\nclass SuperBuilderSingularAnnotatedTypes {\n\t@Singular private Set<@MyAnnotation @NonNull String> foos;\n\t@Singular private Map<@MyAnnotation @NonNull String, @MyAnnotation @NonNull Integer> bars;\n}\n"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderSingularCustomized.java",
    "content": "import java.util.Set;\n@lombok.experimental.SuperBuilder\nclass SuperBuilderSingularCustomized {\n\t@lombok.Singular private Set<String> foos;\n    public static abstract class SuperBuilderSingularCustomizedBuilder<C extends SuperBuilderSingularCustomized, B extends SuperBuilderSingularCustomized.SuperBuilderSingularCustomizedBuilder<C, B>> {\n        public B custom(final String value) {\n            return self(); \n        }\n    }}\n"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderSingularToBuilderGuava.java",
    "content": "public class SuperBuilderSingularToBuilderGuava {\n\t@lombok.experimental.SuperBuilder(toBuilder=true)\n\tpublic static class Parent<T> {\n\t\t@lombok.Singular private com.google.common.collect.ImmutableList<T> cards;\n\t\t@lombok.Singular private com.google.common.collect.ImmutableCollection<? extends Number> frogs;\n\t\t@SuppressWarnings(\"all\") @lombok.Singular(\"rawSet\") private com.google.common.collect.ImmutableSet rawSet;\n\t\t@lombok.Singular private com.google.common.collect.ImmutableSortedSet<String> passes;\n\t\t@lombok.Singular private com.google.common.collect.ImmutableTable<? extends Number, ? extends Number, String> users;\n\t}\n\t\n\t@lombok.experimental.SuperBuilder(toBuilder=true)\n\tpublic static class Child<T> extends Parent<T> {\n\t\tprivate double field3;\n\t}\n\t\n\tpublic static void test() {\n\t\tChild<Integer> x = Child.<Integer>builder().card(1).build().toBuilder().build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderWithAnnotatedTypeParam.java",
    "content": "//version 8:\nimport java.lang.annotation.Documented;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\nimport java.util.List;\n\npublic class SuperBuilderWithAnnotatedTypeParam {\n\t@Documented\n\t@Target( { ElementType.TYPE_USE, ElementType.ANNOTATION_TYPE })\n\t@Retention(RetentionPolicy.RUNTIME)\n\tpublic @interface MyAnnotation {\n\t}\n\t\n\t@lombok.experimental.SuperBuilder\n\tpublic static class Parent<A> {\n\t\tA field1;\n\t}\n\t\n\t@lombok.experimental.SuperBuilder\n\tpublic static class Child extends Parent<@MyAnnotation String> {\n\t\tdouble field3;\n\t}\n\t\n\tpublic static void test() {\n\t\tChild x = Child.builder().field3(0.0).field1(\"string\").build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderWithArrayTypeParam.java",
    "content": "//version 8:\npublic class SuperBuilderWithArrayTypeParam {\n\t@lombok.experimental.SuperBuilder\n\tpublic static class Parent<A> {\n\t\tA field1;\n\t}\n\t\n\t@lombok.experimental.SuperBuilder\n\tpublic static class Child extends Parent<Integer[]> {\n\t\tdouble field3;\n\t}\n\t\n\tpublic static void test() {\n\t\tChild x = Child.builder().field3(0.0).field1(new Integer[] {2}).build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderWithCustomBuilderClassName.java",
    "content": "//CONF: lombok.builder.className=Builder\nclass SuperBuilderWithCustomBuilderClassName {\n\t@lombok.experimental.SuperBuilder\n\tstatic class SuperClass {\n\t}\n\t@lombok.experimental.SuperBuilder\n\tstatic class SubClass extends SuperClass {\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderWithCustomBuilderMethod.java",
    "content": "//version 8: Javac 6 will error out due to `ChildBuilder` not existing before properly running lombok. Giving j6 support status, not worth fixing.\nimport java.util.List;\n\npublic class SuperBuilderWithCustomBuilderMethod {\n\t@lombok.experimental.SuperBuilder\n\tpublic static class Parent<A> {\n\t\tA field1;\n\t\t@lombok.Singular List<String> items;\n\t}\n\t\n\t@lombok.experimental.SuperBuilder\n\tpublic static class Child<A> extends Parent<A> {\n\t\tdouble field3;\n\t\tpublic static <A> ChildBuilder<A, ?, ?> builder() {\n\t\t\treturn new ChildBuilderImpl<A>().item(\"default item\");\n\t\t}\n\t}\n\t\n\tpublic static void test() {\n\t\tChild<Integer> x = Child.<Integer>builder().field3(0.0).field1(5).item(\"\").build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderWithDefaults.java",
    "content": "import java.util.List;\n\npublic class SuperBuilderWithDefaults {\n\t@lombok.experimental.SuperBuilder\n\tpublic static class Parent<N extends Number> {\n\t\t@lombok.Builder.Default private long millis = System.currentTimeMillis();\n\t\t@lombok.Builder.Default private N numberField = null;\n\t}\n\t\n\t@lombok.experimental.SuperBuilder\n\tpublic static class Child extends Parent<Integer> {\n\t\t@lombok.Builder.Default private double doubleField = Math.PI;\n\t}\n\t\n\tpublic static void test() {\n\t\tChild x = Child.builder().doubleField(0.1).numberField(5).millis(1234567890L).build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderWithDefaultsAndTargetTyping.java",
    "content": "import java.util.Arrays;\nimport lombok.Builder;\n\npublic class SuperBuilderWithDefaultsAndTargetTyping {\n\t@lombok.experimental.SuperBuilder\n\tpublic static class Parent {\n\t\t@lombok.Builder.Default private String foo = doSth(Arrays.asList(1), Arrays.asList('a'));\n\t}\n\t\n\t@lombok.experimental.SuperBuilder\n\tpublic static class Child extends Parent {\n\t\t@lombok.Builder.Default private String foo = doSth(Arrays.asList(1), Arrays.asList('a'));\n\t}\n\t\n\tstatic String doSth(java.util.List<Integer> i, java.util.List<Character> c) {\n\t\treturn null;\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderWithExistingConstructor.java",
    "content": "@lombok.experimental.SuperBuilder\npublic class SuperBuilderWithExistingConstructor {\n\tpublic SuperBuilderWithExistingConstructor() {\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderWithGenerics.java",
    "content": "import java.util.List;\n\npublic class SuperBuilderWithGenerics {\n\t@lombok.experimental.SuperBuilder\n\tpublic static class Parent<A> {\n\t\tA field1;\n\t\t@lombok.Singular List<String> items;\n\t}\n\t\n\t@lombok.experimental.SuperBuilder\n\tpublic static class Child<A> extends Parent<A> {\n\t\tdouble field3;\n\t}\n\t\n\tpublic static void test() {\n\t\tChild<Integer> x = Child.<Integer>builder().field3(0.0).field1(5).item(\"\").build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderWithGenerics2.java",
    "content": "import java.util.List;\n\npublic class SuperBuilderWithGenerics2 {\n\t@lombok.experimental.SuperBuilder\n\tpublic static class Parent<A> {\n\t\tA field1;\n\t\t@lombok.Singular List<String> items;\n\t}\n\t\n\t@lombok.experimental.SuperBuilder(builderMethodName=\"builder2\")\n\tpublic static class Child<A> extends Parent<String> {\n\t\tA field3;\n\t}\n\t\n\tpublic static void test() {\n\t\tChild<Integer> x = Child.<Integer>builder2().field3(1).field1(\"value\").item(\"\").build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderWithGenerics3.java",
    "content": "import java.util.List;\n\npublic class SuperBuilderWithGenerics3 {\n\t@lombok.experimental.SuperBuilder\n\tpublic static class Parent<A> {\n\t\tprivate final String str;\n\t}\n\t\n\t@lombok.experimental.SuperBuilder\n\tpublic static class Child extends Parent<Child.SomeInnerStaticClass> {\n\t\tpublic static class SomeInnerStaticClass { }\n\t\tdouble field3;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderWithGenericsAndToBuilder.java",
    "content": "import java.util.Map;\n\npublic class SuperBuilderWithGenericsAndToBuilder {\n\t@lombok.experimental.SuperBuilder(toBuilder = true)\n\tpublic static class Parent<A> {\n\t\tA field1;\n\t\t@lombok.Singular Map<Integer, String> items;\n\t}\n\t\n\t@lombok.experimental.SuperBuilder(toBuilder = true)\n\tpublic static class Child<A> extends Parent<A> {\n\t\tdouble field3;\n\t}\n\t\n\tpublic static void test() {\n\t\tChild<Integer> x = Child.<Integer>builder().field3(0.0).field1(5).item(5, \"\").build().toBuilder().build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderWithNonNull.java",
    "content": "//version 8:\nimport java.util.List;\n\npublic class SuperBuilderWithNonNull {\n\t@lombok.experimental.SuperBuilder\n\tpublic static class Parent {\n\t\t@lombok.NonNull\n\t\t@lombok.Builder.Default\n\t\tfinal String nonNullParentField = \"default\";\n\t}\n\t\n\t@lombok.experimental.SuperBuilder\n\tpublic static class Child extends Parent {\n\t\t@lombok.NonNull\n\t\tString nonNullChildField;\n\t}\n\t\n\tpublic static void test() {\n\t\tChild x = Child.builder().nonNullChildField(\"child\").nonNullParentField(\"parent\").build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderWithOverloadedGeneratedMethods.java",
    "content": "public class SuperBuilderWithOverloadedGeneratedMethods {\n\t@lombok.experimental.SuperBuilder\n\tpublic static class Parent {\n\t\tint self;\n\t}\n\t\n\t@lombok.experimental.SuperBuilder\n\tpublic static class Child extends Parent {\n\t\tdouble build;\n\t}\n\t\n\tpublic static void test() {\n\t\tChild x = Child.builder().build(0.0).self(5).build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderWithPrefixes.java",
    "content": "//CONF: lombok.accessors.prefix += m\n//CONF: lombok.accessors.prefix += x\n@lombok.experimental.SuperBuilder\nclass SuperBuilderWithPrefixes {\n\tint mField;\n\tint xOtherField;\n\t@lombok.Singular java.util.List<String> mItems;\n}\n"
  },
  {
    "path": "test/transform/resource/before/SuperBuilderWithSetterPrefix.java",
    "content": "import java.util.List;\n\npublic class SuperBuilderWithSetterPrefix {\n\t@lombok.experimental.SuperBuilder(toBuilder=true, setterPrefix = \"with\")\n\tpublic static class Parent {\n\t\tprivate int field1;\n\t\t@lombok.Builder.ObtainVia(field=\"field1\")\n\t\tint obtainViaField;\n\t\t@lombok.Builder.ObtainVia(method=\"method\")\n\t\tint obtainViaMethod;\n\t\t@lombok.Builder.ObtainVia(method = \"staticMethod\", isStatic = true)\n\t\tString obtainViaStaticMethod;\n\t\t@lombok.Singular List<String> items;\n\t\t\n\t\tprivate int method() {\n\t\t\treturn 2;\n\t\t}\n\n\t\tprivate static String staticMethod(Parent instance) {\n\t\t\treturn \"staticMethod\";\n\t\t}\n\t}\n\t\n\t@lombok.experimental.SuperBuilder(toBuilder=true, setterPrefix = \"set\")\n\tpublic static class Child extends Parent {\n\t\tprivate double field3;\n\t}\n\t\n\tpublic static void test() {\n\t\tChild x = Child.builder().setField3(0.0).withField1(5).withItem(\"\").build().toBuilder().build();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SynchronizedInAnonymousClass.java",
    "content": "import lombok.Synchronized;\n\npublic class SynchronizedInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\tclass Inner {\n\t\t\t@Synchronized\n\t\t\tpublic void foo() {\n\t\t\t\tString foo = \"bar\";\n\t\t\t}\n\t\t}\n\t};\n}"
  },
  {
    "path": "test/transform/resource/before/SynchronizedInInitializer.java",
    "content": "//eclipse: verify diet\nimport lombok.Synchronized;\n\npublic class SynchronizedInInitializer {\n\tpublic static final Runnable SYNCHRONIZED = new Runnable() {\n\t\t@Override\n\t\t@Synchronized\n\t\tpublic void run() {\n\t\t\tSystem.out.println(\"test\");\n\t\t}\n\t};\n}"
  },
  {
    "path": "test/transform/resource/before/SynchronizedInRecord.java",
    "content": "// version 14:\n\nimport lombok.Synchronized;\n\npublic record SynchronizedInRecord(String a, String b) {\n\t@Synchronized\n\tpublic void foo() {\n\t\tString foo = \"bar\";\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/SynchronizedName.java",
    "content": "class SynchronizedName {\n\tprivate Object read = new Object();\n\tprivate static Object READ = new Object();\n\t\n\t@lombok.Synchronized(\"read\") void test1() {\n\t\tSystem.out.println(\"one\");\n\t}\n\t@lombok.Synchronized(\"READ\") void test4() {\n\t\tSystem.out.println(\"four\");\n\t}\t\n\t@lombok.Synchronized(value=\"read\") void test5() {\n\t\tSystem.out.println(\"five\");\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SynchronizedNameNoSuchField.java",
    "content": "class SynchronizedNameNoSuchField {\n\tprivate Object read = new Object();\n\tprivate static Object READ = new Object();\n\t\n\t@lombok.Synchronized(\"write\") void test2() {\n\t\tSystem.out.println(\"two\");\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SynchronizedNameStaticToInstanceRef.java",
    "content": "class SynchronizedNameStaticToInstanceRef {\n\tprivate Object read = new Object();\n\tprivate static Object READ = new Object();\n\t\n\t@lombok.Synchronized(\"read\") static void test3() {\n\t\tSystem.out.println(\"three\");\n\t}\t\n}\n"
  },
  {
    "path": "test/transform/resource/before/SynchronizedOnStatic.java",
    "content": "class SynchronizedOnStatic<Z> {\n\tstatic class Inner {\n\t\tprivate static Object LCK = new Object[0];\n\t\t@lombok.Synchronized(\"LCK\")\n\t\tpublic void foo() {\n\t\t\tSystem.out.println();\n\t\t}\n\t}\n\tclass Inner2 {\n\t\tprivate Object LCK = new Object[0];\n\t\t@lombok.Synchronized(\"LCK\")\n\t\tpublic void foo() {\n\t\t\tSystem.out.println();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/SynchronizedPlain.java",
    "content": "import lombok.Synchronized;\nclass SynchronizedPlain1 {\n\t@lombok.Synchronized void test() {\n\t\tSystem.out.println(\"one\");\n\t}\n\t@Synchronized void test2() {\n\t\tSystem.out.println(\"two\");\n\t}\n}\nclass SynchronizedPlain2 {\n\t@lombok.Synchronized static void test() {\n\t\tSystem.out.println(\"three\");\n\t}\n\t@Synchronized static void test2() {\n\t\tSystem.out.println(\"four\");\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/TestOperators.java",
    "content": "// unchanged\nclass TestOperators {\n\tint x = 10;\n\tpublic void test() {\n\t\tx = 12;\n\t\tint a = +x;\n\t\tboolean d = true;\n\t\tboolean e = false;\n\t\tboolean b;\n\t\ta = -x;\n\t\tb = !d;\n\t\ta = ~x;\n\t\ta = ++x;\n\t\ta = --x;\n\t\ta = x++;\n\t\ta = x--;\n\t\tb = d || e;\n\t\tb = d && e;\n\t\ta = x | a;\n\t\ta = x ^ a;\n\t\ta = x & a;\n\t\tb = a == x;\n\t\tb = a != x;\n\t\tb = a < x;\n\t\tb = a > x;\n\t\tb = a <= x;\n\t\tb = a >= x;\n\t\ta = a << x;\n\t\ta = a >> x;\n\t\ta = a >>> x;\n\t\ta = a + x;\n\t\ta = a - x;\n\t\ta = a * x;\n\t\ta = a / x;\n\t\ta = a % x;\n\t\ta |= x;\n\t\ta ^= x;\n\t\ta &= x;\n\t\ta <<= x;\n\t\ta >>= x;\n\t\ta >>>= x;\n\t\ta += x;\n\t\ta -= x;\n\t\ta *= x;\n\t\ta /= x;\n\t\ta %= x;\n\t\ta = a > x ? 1 : 0;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/ToStringArray.java",
    "content": "import java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\n\n@lombok.ToString\npublic class ToStringArray {\n\tint[] primitiveArray;\n\t\n\tObject[] objectArray;\n}"
  },
  {
    "path": "test/transform/resource/before/ToStringArrayTypeAnnotations.java",
    "content": "//version 8:\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\n\n@lombok.ToString\npublic class ToStringArrayTypeAnnotations {\n\t@TA int[] primitiveArray1;\n\tint @TA [] primitiveArray2;\n\t\n\t@TA Object[] objectArray1;\n\tObject @TA [] objectArray2;\n\t\n\t@Target({ElementType.TYPE_USE})\n\t@interface TA {\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/ToStringAutoExclude.java",
    "content": "@lombok.ToString\nclass ToStringAutoExclude {\n\tint x;\n\tString $a;\n\ttransient String b;\n}\n@lombok.ToString\nclass ToStringAutoExclude2 {\n\tint x;\n\t@lombok.ToString.Include\n\tString $a;\n\ttransient String b;\n}\n"
  },
  {
    "path": "test/transform/resource/before/ToStringAutoSuper.java",
    "content": "//CONF: lombok.toString.callSuper = CALL\n@lombok.ToString\nclass ToStringAutoSuperWithNoParent {\n}\n\n@lombok.ToString\nclass ToStringAutoSuperWithParent extends ToStringAutoSuperWithNoParent {\n}\n"
  },
  {
    "path": "test/transform/resource/before/ToStringConfiguration.java",
    "content": "//CONF: lombok.ToString.includeFieldNames = false\n//CONF: lombok.ToString.doNotUseGetters = true\nimport lombok.ToString;\nimport lombok.Getter;\n@ToString @Getter class ToStringConfiguration {\n\tint x;\n}\n@ToString(includeFieldNames=true) class ToStringConfiguration2 {\n\tint x;\n}\n@ToString(doNotUseGetters=false) @Getter class ToStringConfiguration3 {\n\tint x;\n}\n"
  },
  {
    "path": "test/transform/resource/before/ToStringEnum.java",
    "content": "import lombok.ToString;\n@ToString\nenum ToStringEnum1 {\n\tCONSTANT;\n}\n@ToString\nenum ToStringEnum2 {\n\tCONSTANT();\n\tint x;\n\tString name;\n}\nclass ToStringEnum3 {\n\t@ToString \n\tenum MemberEnum {\n\t\tCONSTANT;\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/ToStringExplicitInclude.java",
    "content": "@lombok.ToString(onlyExplicitlyIncluded = true)\nclass ToStringExplicitInclude {\n\tint x;\n}\n"
  },
  {
    "path": "test/transform/resource/before/ToStringExplicitIncludeConf.java",
    "content": "//CONF: lombok.toString.onlyExplicitlyIncluded = true\n\n@lombok.ToString\nclass ToStringExplicitIncludeConf {\n\tint x;\n\t@lombok.ToString.Include int y;\n}\n"
  },
  {
    "path": "test/transform/resource/before/ToStringInAnonymousClass.java",
    "content": "import lombok.ToString;\n\npublic class ToStringInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\t@ToString\n\t\tclass Inner {\n\t\t\tprivate String string;\n\t\t}\n\t};\n}"
  },
  {
    "path": "test/transform/resource/before/ToStringInner.java",
    "content": "import lombok.ToString;\n@ToString class ToStringOuter {\n\tint x;\n\tString name;\n\t@ToString class ToStringInner {\n\t\t int y;\n\t}\n\t@ToString static class ToStringStaticInner {\n\t\tint y;\n\t}\n\tclass ToStringMiddle {\n\t\t@ToString class ToStringMoreInner {\n\t\t\tString name;\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/ToStringNewStyle.java",
    "content": "import lombok.ToString;\n@ToString\npublic class ToStringNewStyle {\n\t@ToString.Include(name = \"a\") int b;\n\tdouble c;\n\tint f;\n\t@ToString.Include(name = \"e\") int d;\n\t@ToString.Include int f() {\n\t\treturn 0;\n\t}\n\tint g;\n\t@ToString.Include(rank = -1) int h;\n\tint i;\n\t@ToString.Exclude int j;\n}\n"
  },
  {
    "path": "test/transform/resource/before/ToStringOnRecord.java",
    "content": "// version 14:\n\nimport lombok.ToString;\n\n@ToString\npublic record ToStringOnRecord(String a, String b) {\n}"
  },
  {
    "path": "test/transform/resource/before/ToStringPlain.java",
    "content": "import lombok.ToString;\n@lombok.ToString class ToString1 {\n\tint x;\n\tString name;\n}\n@ToString class ToString2 {\n\tint x;\n\tString name;\n}"
  },
  {
    "path": "test/transform/resource/before/ToStringWithConstantRefInOf.java",
    "content": "//skip compare contents\nimport lombok.ToString;\n\n@ToString(of = ToStringWithConstantRefInOf.FIELD_NAME)\npublic class ToStringWithConstantRefInOf {\n\tstatic final String FIELD_NAME = \"id\";\n\tprivate String id;\n\tprivate int whatever;\n}\n\n"
  },
  {
    "path": "test/transform/resource/before/Tolerate.java",
    "content": "import java.util.regex.Pattern;\n\n@lombok.Setter @lombok.Getter\nclass Tolerate {\n\tprivate Pattern pattern;\n\t\n\t@lombok.experimental.Tolerate public void setPattern(String pattern) {\n\t\tsetPattern(Pattern.compile(pattern));\n\t}\n}\n\n@lombok.Getter @lombok.experimental.Wither @lombok.AllArgsConstructor\nclass Tolerate2 {\n\tprivate final Pattern pattern;\n\t\n\t@lombok.experimental.Tolerate public Tolerate2 withPattern(String pattern) {\n\t\treturn withPattern(Pattern.compile(pattern));\n\t}\n\n\tpublic Tolerate2 withPattern(String nameGlob, String extensionGlob) {\n\t\treturn withPattern(nameGlob.replace(\"*\", \".*\") + \"\\\\.\" + extensionGlob.replace(\"*\", \".*\"));\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/TrickyTypeResolution.java",
    "content": "// version :9\nimport lombok.*;\nclass TrickyDoNothing {\n\t@interface Getter {}\n\t@Getter int x;\n}\n\nclass TrickyDoNothing2 {\n\t@Getter int x;\n\t@interface Getter {}\n}\n\nclass TrickySuccess {\n\t@Getter int x;\n}\n\nclass TrickyDoNothing3 {\n\tvoid test() {\n\t\tclass val {}\n\t\tval x = null;\n\t}\n}\n\nclass TrickyDoSomething {\n\tvoid test() {\n\t\tval x = null;\n\t\tclass val {}\n\t}\n}\n\nclass DoubleTrickyDoNothing {\n\tvoid test() {\n\t\tclass val {}\n\t\tfor (int i = 10; i < 20; i++) {\n\t\t\tval y = null;\n\t\t}\n\t}\n}\n\nclass DoubleTrickyDoSomething {\n\tvoid test() {\n\t\tfor (int j = 10; j < 20; j++) {\n\t\t\tclass val {}\n\t\t}\n\t\t\n\t\tfor (int i = 10; i < 20; i++) {\n\t\t\tval y = null;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/TrickyTypeResolution2.java",
    "content": "// unchanged\nimport lombok.*;\nclass DoNothingDueToTopLevel {\n\tvoid test() {\n\t\tval x = null;\n\t}\n}\n\nclass val {}\n"
  },
  {
    "path": "test/transform/resource/before/TypeUseAnnotations.java",
    "content": "//version 8:\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.List;\n@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})\n@interface TA {\n\tint x();\n}\nclass TypeUseAnnotations {\n\t@lombok.Getter List<@TA(x=5) String> foo;\n\t@lombok.Getter List<TypeUseAnnotations.@TA(x=5) Inner> bar;\n\tclass Inner { }\n}\n"
  },
  {
    "path": "test/transform/resource/before/UtilityClass.java",
    "content": "@lombok.experimental.UtilityClass\nclass UtilityClass {\n\tprivate long someField = System.currentTimeMillis();\n\t\n\tvoid someMethod() {\n\t\tSystem.out.println();\n\t\tnew InnerClass();\n\t\tnew InnerStaticClass();\n\t}\n\t\n\tprotected class InnerClass {\n\t\tprivate String innerInnerMember;\n\t}\n\t\n\tprotected static class InnerStaticClass {\n\t\tprivate String innerInnerMember;\n\t}\n}\n\nclass UtilityInner {\n\tstatic class InnerInner {\n\t\t@lombok.experimental.UtilityClass\n\t\tclass InnerInnerInner {\n\t\t\tint member;\n\t\t}\n\t}\n\t\n\tenum UtilityInsideEnum {\n\t\tFOO, BAR;\n\t\t\n\t\t@lombok.experimental.UtilityClass\n\t\tclass InsideEnum {\n\t\t\tint member;\n\t\t}\n\t}\n\t\n\tinterface UtilityInsideInterface {\n\t\t@lombok.experimental.UtilityClass\n\t\tclass InsideInterface {\n\t\t\tint member;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/UtilityClassErrors.java",
    "content": "@lombok.experimental.UtilityClass\nclass UtilityClassErrors1 {\n\tprivate String someField;\n\tprotected UtilityClassErrors1() {\n\t}\n\tvoid method() {\n\t\t@lombok.experimental.UtilityClass\n\t\tclass MethodLocalClass {\n\t\t}\n\t}\n}\n@lombok.experimental.UtilityClass\nenum UtilityClassErrors2 {\n}\nclass UtilityClassErrors3 {\n\tclass NonStaticInner {\n\t\t@lombok.experimental.UtilityClass\n\t\tclass ThisShouldFail {\n\t\t\tprivate String member;\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/UtilityClassGeneric.java",
    "content": "import lombok.experimental.UtilityClass;\n@UtilityClass\nclass UtilityClassGeneric {\n\t<T> T convertValue(Class<T> toValueType) {\n\t\treturn null;\n\t}\n\t\n\tDTO convert(Object json) {\n\t\treturn convertValue(DTO.class);\n\t}\n\t\n\tObject convert(DTO dto) {\n\t\treturn null;\n\t}\n\t\n\tclass DTO {\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/UtilityClassInAnonymousClass.java",
    "content": "import lombok.experimental.UtilityClass;\n\npublic class UtilityClassInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\t@UtilityClass\n\t\tclass Inner {\n\t\t\tprivate String string;\n\t\t}\n\t};\n}"
  },
  {
    "path": "test/transform/resource/before/UtilityClassInner.java",
    "content": "@java.lang.SuppressWarnings(\"serial\")\nclass UtilityClassInner {\n\t@lombok.experimental.UtilityClass\n\tclass UtilClass implements java.io.Serializable {}\n}"
  },
  {
    "path": "test/transform/resource/before/UtilityClassOnRecord.java",
    "content": "// version 14:\n\nimport lombok.experimental.UtilityClass;\n\n@UtilityClass\npublic record UtilityClassOnRecord(String a, String b) {\n}"
  },
  {
    "path": "test/transform/resource/before/ValAnonymousSubclassSelfReference.java",
    "content": "// version :9\n// issue 2420: to trigger the problem 2 var/val, at least one normal variable and a anonymous self reference is required\nimport java.util.Map;\nimport java.util.HashMap;\n\nimport lombok.val;\n\npublic class ValAnonymousSubclassSelfReference {\n\tpublic <T> void test(T arg) {\n\t\tT d = arg;\n\t\tInteger[] e = new Integer[1];\n\t\tint[] f = new int[0];\n\t\tjava.util.Map<java.lang.String, Integer> g = new HashMap<String, Integer>();\n\t\tInteger h = 0;  \n\t\tint i = 0;\n\t\t\n\t\tval j = 1;\n\t\tval k = 2;\n\n\t\tnew ValAnonymousSubclassSelfReference() { };\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/ValAnonymousSubclassWithGenerics.java",
    "content": "// version :9\n// issue 205: val inside anonymous inner classes is a bit tricky in javac, this test ensures we don't break it.\nimport java.util.*;\nimport lombok.val;\n\npublic class ValAnonymousSubclassWithGenerics {\n\tObject object = new Object(){\n\t\tvoid foo() {\n\t\t\tval j = 1;\n\t\t}\n\t};\n\t\n\tvoid bar() {\n\t\tval k = super.hashCode();\n\t\tint x = k;\n\t}\n\t\n\tjava.util.List<String> names = new java.util.ArrayList<String>() {\n\t\tpublic String get(int i) {\n\t\t\tval result = super.get(i);\n\t\t\treturn result;\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "test/transform/resource/before/ValComplex.java",
    "content": "// version :9\nimport lombok.val;\n\npublic class ValComplex {\n\tprivate String field = \"\";\n\tprivate static final int CONSTANT = 20;\n\t\n\tpublic void testComplex() {\n\t\tval shouldBeCharArray = field.toCharArray();\n\t\tval shouldBeInt = CONSTANT;\n\t\tval lock = new Object();\n\t\tsynchronized (lock) {\n\t\t\tval field = 20; //Shadowing\n\t\t\tval inner = 10;\n\t\t\tswitch (field) {\n\t\t\t\tcase 5:\n\t\t\t\t\tval shouldBeCharArray2 = shouldBeCharArray;\n\t\t\t\t\tval innerInner = inner;\n\t\t\t}\n\t\t}\n\t\tval shouldBeString = field; //Unshadowing\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/ValDefault.java",
    "content": "// version 8:9\ninterface ValDefault {\n\tint size();\n\t\n\tdefault void method() {\n\t\tlombok.val x = 1;\n\t\tlombok.val size = size();\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/ValDelegateMethodReference.java",
    "content": "//version 8:9\n//platform !eclipse: Requires a 'full' eclipse with intialized workspace, and we don't (yet) have that set up properly in the test run.\nimport lombok.Getter;\nimport lombok.Setter;\nimport lombok.experimental.Delegate;\nimport lombok.val;\n\nimport java.util.function.Function;\n\npublic class ValDelegateMethodReference {\n\n\tpublic void config() {\n\t\tval column = createColumn(Entity::getValue);\n\t}\n\n\tprivate <V> Column<Entity, V> createColumn(Function<Entity, V> func) {\n\t\treturn new Column<>(func);\n\t}\n\n}\n\nclass Column<T, V> {\n\tpublic Column(Function<T, V> vp) {}\n}\n\nclass Entity {\n\t@Delegate\n\tprivate MyDelegate innerDelegate;\n}\n\n@Getter\n@Setter\nclass MyDelegate {\n\tprivate String value;\n\tprivate Boolean aBoolean;\n}"
  },
  {
    "path": "test/transform/resource/before/ValErrors.java",
    "content": "// version :9\n// unchanged\nimport lombok.val;\n\npublic class ValErrors {\n\tpublic void unresolvableExpression() {\n\t\tval c = d;\n\t}\n\t\n\tpublic void arrayInitializer() {\n\t\tval e = { \"foo\", \"bar\"};\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/ValFinal.java",
    "content": "// version :9\nimport lombok.val;\npublic class ValFinal {\n\tpublic void test() {\n\t\tfinal val x = 10;\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/ValInBasicFor.java",
    "content": "// version :9\n// unchanged\nimport lombok.val;\n\npublic class ValInBasicFor {\n\tpublic void basicFor() {\n\t\tjava.util.List<String> list = java.util.Arrays.asList(\"Hello, World!\");\n\t\tfor (val shouldBe = 1, marked = \"\", error = 1.0; ; ) {\n\t\t\tSystem.out.println(\"\");\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/ValInFor.java",
    "content": "// version :9\nimport lombok.val;\n\npublic class ValInFor {\n\tpublic void enhancedFor() {\n\t\tjava.util.List<String> list = java.util.Arrays.asList(\"Hello, World!\");\n\t\tfor (val shouldBeString : list) {\n\t\t\tSystem.out.println(shouldBeString.toLowerCase());\n\t\t\tval shouldBeString2 = shouldBeString;\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/ValInLambda.java",
    "content": "// version 8:9\n\nimport java.util.function.Function;\nimport java.util.function.Supplier;\n\nimport lombok.val;\n\nclass ValInLambda {\n    Runnable foo = (Runnable) () -> {\n        val i = 1;\n        lombok.val foo = (System.currentTimeMillis() > 0) ? (Runnable)()-> {} : System.out::println;\n    };\n\n    public void easyLambda() {\n        Runnable foo = (Runnable) () -> {\n            val i = 1;\n        };\n    }\n\n    public void easyIntersectionLambda() {\n        Runnable foo = (Runnable) () -> {\n            val i = 1;\n        };\n    }\n    \n    public void easyLubLambda() {\n        Runnable foo = (Runnable) () -> {\n            lombok.val fooInner = (System.currentTimeMillis() > 0) ? (Runnable)()-> {} : System.out::println;\n        };\n    }\n    \n    public void inParameter() {\n        val foo = (Function<Supplier<String>, String>) s -> s.get();\n        val foo2 = foo.apply(() -> {\n            val bar = \"\";\n            return bar;\n        });\n    }\n}\n"
  },
  {
    "path": "test/transform/resource/before/ValInMultiDeclaration.java",
    "content": "// version :9\nimport lombok.val;\npublic class ValInMultiDeclaration {\n\tpublic void test() {\n\t\tval x = 10, y = \"\";\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/ValInTryWithResources.java",
    "content": "//version 7:9\nimport lombok.val;\nimport java.io.IOException;\n\npublic class ValInTryWithResources {\n\tpublic  void whyTryInsteadOfCleanup() throws IOException {\n\t\ttry (val in = getClass().getResourceAsStream(\"ValInTryWithResources.class\")) {\n\t\t\tval i = in;\n\t\t\tval j = in.read();\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/ValInvalidParameter.java",
    "content": "//version 8:9\nimport lombok.val;\n\npublic class ValInvalidParameter {\n\tpublic void val() {\n\t\tval a = a(new NonExistingClass());\n\t\tval b = a(a(new NonExistingClass()));\n\t\tval c = nonExisitingMethod(b(1));\n\t\tval d = nonExistingObject.nonExistingMethod();\n\t\tval e = b(1).nonExistingMethod();\n\t\tval f = 1 > 2 ? a(new NonExistingClass()) : a(new NonExistingClass());\n\t\tval g = b2(1);\n\t\tval h = b2(a(\"a\"), a(null));\n\t\tval i = a(a(null));\n\t}\n\t\n\tpublic int a(String param) {\n\t\treturn 0;\n\t}\n\t\n\tpublic int a(Integer param) {\n\t\treturn 0;\n\t}\n\t\n\tpublic Integer b(int i) {\n\t\treturn i;\n\t}\n\t\n\tpublic Integer b2(int i, int j) {\n\t\treturn i;\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/ValLambda.java",
    "content": "// version 8:9\nimport java.io.Serializable;\n\nclass ValLambda {\n\t\n\tstatic {\n\t\tlombok.val foo = (System.currentTimeMillis() > 0) ? (Runnable)()-> {} : System.out::println;\n\t}\n\t{\n\t\tlombok.val foo = (System.currentTimeMillis() > 0) ? (Runnable)()-> {} : System.out::println;\n\t}\n\t\n\tpublic void easyLambda() {\n\t\tlombok.val foo = (Runnable)()-> {};\n\t}\n\t\n\tpublic void intersectionLambda() {\n\t\tlombok.val foo = (Runnable & Serializable)()-> {};\n\t\tlombok.val bar = (java.io.Serializable & Runnable)()-> {};\n\t}\n\t\n\tpublic void easyLubLambda() {\n\t\tlombok.val foo = (System.currentTimeMillis() > 0) ? (Runnable)()-> {} : System.out::println;\n\t\tlombok.val foo1 = (System.currentTimeMillis() > 0) ? (Runnable)System.out::println : System.out::println;\n\t\tlombok.val foo2 = (System.currentTimeMillis() < 0) ? (java.util.function.Function) r -> \"\" : r -> System.currentTimeMillis();\n\t\tjava.util.function.Function foo3 = (System.currentTimeMillis() < 0) ? (java.util.function.Function) r -> \"\" : r -> System.currentTimeMillis();\n\t\tlombok.val foo4 = (System.currentTimeMillis() < 0) ? (java.util.function.Function<String, String>) r -> \"\" : r -> String.valueOf(System.currentTimeMillis());\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/ValLessSimple.java",
    "content": "// version :9\nimport lombok.val;\n\npublic class ValLessSimple {\n\tprivate short field2 = 5;\n\t\n\tprivate String method() {\n\t\treturn \"method\";\n\t}\n\t\n\tprivate double method2() {\n\t\treturn 2.0;\n\t}\n\t\n\t{\n\t\tSystem.out.println(\"Hello\");\n\t\tval z = 20;\n\t\tval x = 10;\n\t\tval a = z;\n\t\tval y = field2;\n\t}\n\t\n\tprivate void testVal(String param) {\n\t\tval fieldV = field;\n\t\tval a = 10;\n\t\tval b = 20;\n\t\t{\n\t\t\tval methodV = method();\n\t\t\tval foo = fieldV + methodV;\n\t\t}\n\t}\n\t\n\tprivate void testValInCatchBlock() {\n\t\ttry {\n\t\t\tval x = 1 / 0;\n\t\t} catch (ArithmeticException e) {\n\t\t\tval y = 0;\n\t\t}\n\t}\n\t\n\tprivate String field = \"field\";\n}\n"
  },
  {
    "path": "test/transform/resource/before/ValLub.java",
    "content": "// version :9\nclass ValLub {\n\tpublic void easyLub() {\n\t\tjava.util.Map<String, Number> m = java.util.Collections.emptyMap();\n\t\t\n\t\tlombok.val foo = (System.currentTimeMillis() > 0) ? m : java.util.Collections.<String, Number>emptyMap();\n\t}\n\t\n\tpublic void sillyLubWithUnboxingThatProducesErrorThatVarIsPrimitive() {\n\t\tInteger i = 20;\n\t\tDouble d = 20.0;\n\t\t\n\t\tlombok.val thisShouldBePrimitiveDouble = (System.currentTimeMillis() > 0) ? i : d;\n\t}\n\t\n\tpublic void hardLub() {\n\t\tjava.util.List<String> list = new java.util.ArrayList<String>();\n\t\tjava.util.Set<String> set = new java.util.HashSet<String>();\n\t\t\n\t\tlombok.val thisShouldBeCollection = (System.currentTimeMillis() > 0) ? list : set;\n\t\tthisShouldBeCollection.add(\"\");\n\t\tString foo = thisShouldBeCollection.iterator().next();\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/ValNullInit.java",
    "content": "// version :9\nimport lombok.val;\n\nclass ValNullInit {\n\tvoid method() {\n\t\tval x = null;\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/ValOutersWithGenerics.java",
    "content": "// version :9\nimport java.util.*;\nimport lombok.val;\n\npublic class ValOutersWithGenerics<Z> {\n\t\n\tclass Inner {\n\t}\n\t\n\tclass InnerWithGenerics<H> {\n\t}\n\t\n\tpublic void testOutersWithGenerics() {\n\t\tval foo = \"\";\n\t\tList<Inner> list = new ArrayList<Inner>();\n\t\tval elem = list.get(0);\n\t}\n\t\n\tpublic void testLocalClasses() {\n\t\tclass Local<A> {}\n\t\t\n\t\tval q = new Local<String>();\n\t}\n\t\n\tpublic static void test() {\n\t\tval outer = new ValOutersWithGenerics<String>();\n\t\tval inner1 = outer.new Inner();\n\t\tval inner2 = outer.new InnerWithGenerics<Integer>();\n\t}\n\t\n\tstatic class SubClass extends ValOutersWithGenerics<String> {\n\t\tpublic void testSubClassOfOutersWithGenerics() {\n\t\t\tList<Inner> list = new ArrayList<Inner>();\n\t\t\tval elem = list.get(0);\n\t\t}\n\t}\n\t\n\tpublic static void loop(Map<String, String> map) {\n\t\tfor (val e : map.entrySet()) {\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/ValRawType.java",
    "content": "// version :9\nimport java.util.List;\nimport lombok.val;\n\npublic class ValRawType {\n\tpublic void test() {\n\t\tElement propElement = new Element();\n\t\tfor (val attribute : propElement.attributes()) {\n\t\t\tval attr = (Attribute) attribute;\n\t\t}\n\t}\n\t\n\tstatic class Element {\n\t\tpublic List attributes() {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tstatic class Attribute {\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/ValSimple.java",
    "content": "// version :9\nimport lombok.val;\n\npublic class ValSimple {\n\tprivate String field = \"field\";\n\tprivate short field2 = 5;\n\t\n\tprivate String method() {\n\t\treturn \"method\";\n\t}\n\t\n\tprivate double method2() {\n\t\treturn 2.0;\n\t}\n\t\n\tprivate void testVal(String param) {\n\t\tval fieldV = field;\n\t\tval methodV = method();\n\t\tval paramV = param;\n\t\t\n\t\tval valOfVal = fieldV;\n\t\tval operatorV = fieldV + valOfVal;\n\t\t\n\t\tval fieldW = field2;\n\t\tval methodW = method2();\n\t\tbyte localVar = 3;\n\t\tval operatorW = fieldW + localVar;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/ValSuperDefaultMethod.java",
    "content": "// version 8:9\nimport lombok.val;\n\nclass ValSuperDefaultMethod implements Default {\n\tpublic void test() {\n\t\tval a = \"\";\n\t\tDefault.super.method();\n\t}\n\t\n}\n\ninterface Default {\n\tdefault void method() {\n\t\t\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/ValSwitchExpression.java",
    "content": "// version 14:\nimport lombok.val;\n\npublic class ValSwitchExpression {\n\tpublic void method(int arg) {\n\t\tval x = switch (arg) {\n\t\t\tdefault -> {\n\t\t\t\tval s = \"string\";\n\t\t\t\tyield arg;\n\t\t\t}\n\t\t};\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/ValToNative.java",
    "content": "// version 10:\nimport java.io.IOException;\nimport java.util.Arrays;\n\nimport lombok.val;\n\npublic class ValToNative {\n\tprivate void test() throws IOException {\n\t\tval intField = 1;\n\t\t\n\t\tfor (val s : Arrays.asList(\"1\")) {\n\t\t\tval s2 = s;\n\t\t}\n\t\t\n\t\ttry (val in = getClass().getResourceAsStream(\"ValToNative.class\")) {\n\t\t\tval j = in.read();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/ValWeirdTypes.java",
    "content": "// version 8:9 In java6/7, lub types worked differently, so, the `arraysAsList` method has a slightly different inferred type there.\nimport java.math.BigDecimal;\nimport java.util.*;\nimport lombok.val;\n\npublic class ValWeirdTypes<Z> {\n\tprivate List<Z> fieldList;\n\t\n\tpublic void testGenerics() {\n\t\tList<String> list = new ArrayList<String>();\n\t\tlist.add(\"Hello, World!\");\n\t\tval shouldBeString = list.get(0);\n\t\tval shouldBeListOfString = list;\n\t\tval shouldBeListOfStringToo = Arrays.asList(\"hello\", \"world\");\n\t\tval shouldBeString2 = shouldBeListOfString.get(0);\n\t}\n\t\n\tpublic void testGenericsInference() {\n\t\tval huh = Collections.emptyList();\n\t\tval huh2 =  Collections.<Number>emptyList();\n\t}\n\t\n\tpublic void testPrimitives() {\n\t\tval x = 10;\n\t\tval y = 5 + 3L;\n\t}\n\t\n\tpublic void testAnonymousInnerClass() {\n\t\tval y = new Runnable() {\n\t\t\tpublic void run() {}\n\t\t};\n\t}\n\t\n\tpublic <T extends Number> void testTypeParams(List<T> param) {\n\t\tval t = param.get(0);\n\t\tval z = fieldList.get(0);\n\t\tval k = param;\n\t\tval y = fieldList;\n\t}\n\t\n\tpublic void testBounds(List<? extends Number> lower, List<? super Number> upper) {\n\t\tval a = lower.get(0);\n\t\tval b = upper.get(0);\n\t\tval c = lower;\n\t\tval d = upper;\n\t\tList<?> unbound = lower;\n\t\tval e = unbound;\n\t\tval f = unbound.get(0);\n\t}\n\t\n\tpublic void testCompound() {\n\t\tval a = new ArrayList<String>();\n\t\tval b = new Vector<String>();\n\t\tval c = 1 < System.currentTimeMillis();\n\t\tval d = c ? a : b;\n\t\tjava.util.RandomAccess confirm = c ? a : b;\n\t}\n\t\n\tpublic void nullType() {\n\t\tval nully = null;\n\t}\n\t\n\tpublic void testArrays() {\n\t\tval intArray = new int[] {1, 2, 3};\n\t\tval multiDimArray = new Object[][] {{}};\n\t\tval copy = intArray;\n\t\tval single = multiDimArray[0];\n\t\tval singleInt = copy[0];\n\t}\n\t\n\tpublic void arraysAsList() {\n\t\tval x = Arrays.asList(String.class, BigDecimal.class);\n\t\tfor (val y : x) {\n\t\t\t\n\t\t}\n\t}\n\t\n\t@SuppressWarnings(\"all\")\n\tpublic void arraysAsList2() {\n\t\tval x = Arrays.asList(String.class, BigDecimal.class, Comparable.class);\n\t\tfor (val y : x) {\n\t\t\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/ValWithLabel.java",
    "content": "// version :9\nimport lombok.val;\n\npublic class ValWithLabel {\n\t{\n\t\tLABEL: for (val x : new String[0]) {\n\t\t\tif (x.toLowerCase() == null) {\n\t\t\t\tcontinue LABEL;\n\t\t\t}\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/ValWithLocalClasses.java",
    "content": "// version :9\n//issue 694: In javac, resolving the RHS (which is what val does) can cause an entire class to be resolved, breaking all usage of val inside that class. This tests that we handle that better.\nclass ValWithLocalClasses1 {\n\t{\n\t\tlombok.val f2 = new ValWithLocalClasses2() {};\n\t}\n}\n\nclass ValWithLocalClasses2 {\n\t{\n\t\tlombok.val f3 = 0;\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/ValWithSelfRefGenerics.java",
    "content": "// version :9\nimport lombok.val;\npublic class ValWithSelfRefGenerics {\n\tpublic void run(Thing<? extends Comparable<?>> thing, Thing<?> thing2, java.util.List<? extends Number> z) {\n\t\tval y = z;\n\t\tval x = thing;\n\t\tval w = thing2;\n\t\tval v = thing2.get();\n\t}\n}\nclass Thing<T extends Comparable<? super T>> {\n\tpublic T get() {\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/ValueCallSuper.java",
    "content": "//CONF: lombok.equalsAndHashCode.callSuper = call\n\nclass ValueParent {\n}\n@lombok.Value\nclass ValueCallSuper extends ValueParent {\n}\n"
  },
  {
    "path": "test/transform/resource/before/ValueInAnonymousClass.java",
    "content": "import lombok.Value;\n\npublic class ValueInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\t@Value\n\t\tclass Inner {\n\t\t\tprivate String string;\n\t\t}\n\t};\n}"
  },
  {
    "path": "test/transform/resource/before/ValueOnRecord.java",
    "content": "// version 14:\n\nimport lombok.Value;\n\n@Value\npublic record ValueOnRecord(String a, String b) {\n}"
  },
  {
    "path": "test/transform/resource/before/ValuePlain.java",
    "content": "import lombok.Value;\n@lombok.Value class Value1 {\n\tfinal int x;\n\tString name;\n}\n@Value @lombok.experimental.NonFinal class Value2 {\n\tpublic int x;\n\tString name;\n}\n@Value class Value3 {\n\t@lombok.experimental.NonFinal int x;\n\tint y;\n}"
  },
  {
    "path": "test/transform/resource/before/ValueStaticConstructorOf.java",
    "content": "import lombok.Value;\n@Value(staticConstructor = \"of\")\npublic class ValueStaticConstructorOf {\n\tString name;\n\tDouble price;\n\t\n\tprivate ValueStaticConstructorOf(String name, Double price) {\n\t\tthis.name = name;\n\t\tthis.price = price;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/ValueStaticField.java",
    "content": "import lombok.Value;\n@Value class ValueStaticField {\n\tstatic int x;\n\tstatic String PASSWORD = \"Ken sent me\";\n}\n"
  },
  {
    "path": "test/transform/resource/before/ValueWithJavaBeansSpecCapitalization.java",
    "content": "//CONF: lombok.accessors.capitalization = beanspec\n@lombok.Value\nclass ValueWithJavaBeansSpecCapitalization {\n\tfinal int aField;\n}\n"
  },
  {
    "path": "test/transform/resource/before/VarComplex.java",
    "content": "//version :9\nimport lombok.var;\n\npublic class VarComplex {\n\tprivate String field = \"\";\n\tprivate static final int CONSTANT = 20;\n\n\tpublic void testComplex() {\n\t\tvar shouldBeCharArray = field.toCharArray();\n\t\tvar shouldBeInt = CONSTANT;\n\t\tvar lock = new Object();\n\t\tsynchronized (lock) {\n\t\t\tvar field = 20; //Shadowing\n\t\t\tvar inner = 10;\n\t\t\tswitch (field) {\n\t\t\t\tcase 5:\n\t\t\t\t\tvar shouldBeCharArray2 = shouldBeCharArray;\n\t\t\t\t\tvar innerInner = inner;\n\t\t\t}\n\t\t}\n\t\tvar shouldBeString = field; //Unshadowing\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/VarInFor.java",
    "content": "//version :9\nimport lombok.var;\n\npublic class VarInFor {\n\tpublic void enhancedFor() {\n\t\tint[] list = new int[] {1, 2};\n\t\tfor (var shouldBeInt : list) {\n\t\t\tSystem.out.println(shouldBeInt);\n\t\t\tvar shouldBeInt2 = shouldBeInt;\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/VarInForOld.java",
    "content": "//version :9\nimport lombok.var;\n\npublic class VarInForOld {\n\tpublic void oldFor() {\n\t\tfor (var i = 0; i < 100; ++i) {\n\t\t\tSystem.out.println(i);\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/VarInForOldMulti.java",
    "content": "//version :9\n//skip compare contents\nimport lombok.var;\n\npublic class VarInForOldMulti {\n\tpublic void oldForMulti() {\n\t\tfor (var i = 0, j = \"Hey\"; i < 100; ++i) {\n\t\t\tSystem.out.println(i);\n\t\t}\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/VarModifier.java",
    "content": "//version :9\nimport lombok.experimental.var;\n\npublic class VarModifier {\n\tprivate String field = \"\";\n\n\tpublic void testComplex() {\n\t\tfinal var shouldBeFinalCharArray = field.toCharArray();\n\t\tvar shouldBeCharArray = field.toCharArray();\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/VarNullInit.java",
    "content": "//version :9\nimport lombok.var;\n\npublic class VarNullInit {\n\tvoid method() {\n\t\tvar x = null;\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/VarWarning.java",
    "content": "//version :9\n//CONF: lombok.var.flagUsage = WARNING\nimport lombok.var;\n\npublic class VarWarning {\n\tpublic void isOkay() {\n\t\tvar x = \"Warning\";\n\t\tx.toLowerCase();\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/WeirdJavadoc.java",
    "content": "import lombok.Builder;\nimport lombok.Getter;\nimport lombok.Setter;\n\npublic class WeirdJavadoc {\n\t// Comment\n\t/* Weird comment /** */\n\t/**\n\t * This is the real comment\n\t * @param test Copy this\n\t */\n\t/* Weird comment /** */\n\t@Builder\n\tWeirdJavadoc(String test) {\n\t\t\n\t}\n\t\n\t// Comment\n\t/* Weird comment /** */\n\t/**\n\t * This is the real comment\n\t * @param test Copy this\n\t */\n\t/* Weird comment /** */\n\t@Getter\n\t@Setter\n\tprivate String test;\n}\n"
  },
  {
    "path": "test/transform/resource/before/WithAlreadyExists.java",
    "content": "class With1 {\n\t@lombok.With boolean foo;\n\t\n\tvoid withFoo(boolean foo) {\n\t}\n\t\n\tWith1(boolean foo) {\n\t}\n}\n\nclass With2 {\n\t@lombok.With boolean foo;\n\t\n\tvoid withFoo(String foo) {\n\t}\n\t\n\tWith2(boolean foo) {\n\t}\n}\n\nclass With3 {\n\t@lombok.With String foo;\n\t\n\tvoid withFoo(boolean foo) {\n\t}\n\t\n\tWith3(String foo) {\n\t}\n}\n\nclass With4 {\n\t@lombok.With String foo;\n\t\n\tvoid withFoo(String foo) {\n\t}\n\t\n\tWith4(String foo) {\n\t}\n}\n\nclass With5 {\n\t@lombok.With String foo;\n\t\n\tvoid withFoo() {\n\t}\n\t\n\tWith5(String foo) {\n\t}\n}\n\nclass With6 {\n\t@lombok.With String foo;\n\t\n\tvoid withFoo(String foo, int x) {\n\t}\n\t\n\tWith6(String foo) {\n\t}\n}\n\nclass With7 {\n\t@lombok.With String foo;\n\t\n\tvoid withFoo(String foo, Object... x) {\n\t}\n\t\n\tWith7(String foo) {\n\t}\n}\n\nclass With8 {\n\t@lombok.With boolean isFoo;\n\t\n\tvoid withIsFoo(boolean foo) {\n\t}\n\t\n\tWith8(boolean foo) {\n\t}\n}\n\nclass With9 {\n\t@lombok.With boolean isFoo;\n\t\n\tvoid withFoo(boolean foo) {\n\t}\n\t\n\tWith9(boolean foo) {\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/WithAndAllArgsConstructor.java",
    "content": "@lombok.AllArgsConstructor\nclass WithAndAllArgsConstructor<T, J extends T, L extends java.lang.Number> {\n\t@lombok.With J test;\n\t\n\t@lombok.With java.util.List<L> test2;\n\t\n\tfinal int x = 10;\n\t\n\tint y = 20;\n\t\n\tfinal int z;\n}"
  },
  {
    "path": "test/transform/resource/before/WithByInAnonymousClass.java",
    "content": "//version 8:\nimport lombok.experimental.WithBy;\n\npublic class WithByInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\t@WithBy\n\t\tclass Inner {\n\t\t\tprivate Inner(String string) { }\n\t\t\t\n\t\t\tprivate String string;\n\t\t}\n\t};\n}"
  },
  {
    "path": "test/transform/resource/before/WithByNullAnnos.java",
    "content": "//version 8:\n//CONF: lombok.addNullAnnotations=checkerframework\nimport java.util.List;\n@lombok.RequiredArgsConstructor\npublic class WithByNullAnnos {\n\t@lombok.experimental.WithBy final List<String> test;\n}\n"
  },
  {
    "path": "test/transform/resource/before/WithByOnRecord.java",
    "content": "// version 14:\n\nimport lombok.experimental.WithBy;\n\n@WithBy\npublic record WithByOnRecord(String a, String b) {\n}"
  },
  {
    "path": "test/transform/resource/before/WithByOnRecordComponent.java",
    "content": "// version 14:\n\nimport lombok.experimental.WithBy;\n\npublic record WithByOnRecordComponent(@WithBy String a, String b) {\n}"
  },
  {
    "path": "test/transform/resource/before/WithByTypes.java",
    "content": "//version 8:\n@lombok.RequiredArgsConstructor\n@lombok.experimental.FieldDefaults(level = lombok.AccessLevel.PRIVATE, makeFinal = true)\n@lombok.experimental.WithBy\npublic class WithByTypes<T> {\n\tint a;\n\tlong b;\n\tshort c;\n\tchar d;\n\tbyte e;\n\tdouble f;\n\tfloat g;\n\tboolean h;\n\tT i;\n\t\n\tpublic static void example() {\n\t\tnew WithByTypes<String>(0, 0, (short) 0, ' ', (byte) 0, 0.0, 0.0F, true, \"\").withHBy(x -> !x).withFBy(x -> x + 0.5);\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/WithInAnonymousClass.java",
    "content": "import lombok.With;\n\npublic class WithInAnonymousClass {\n\tObject annonymous = new Object() {\n\t\t@With\n\t\tclass Inner {\n\t\t\tprivate Inner(String string) { }\n\t\t\t\n\t\t\tprivate String string;\n\t\t}\n\t};\n}"
  },
  {
    "path": "test/transform/resource/before/WithInnerAnnotation.java",
    "content": "// unchanged\nclass WithInnerAnnotation {\n\t@interface Inner {\n\t\tint bar() default 42;\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/WithMethodAbstract.java",
    "content": "abstract class WithMethodAbstract {\n\t@lombok.With String foo;\n}"
  },
  {
    "path": "test/transform/resource/before/WithMethodMarkedDeprecated.java",
    "content": "import lombok.With;\n\nclass WithMethodMarkedDeprecated {\n\t\n\t@Deprecated\n\t@With int annotation;\n\t\n\t/**\n\t * @deprecated\n\t */\n\t@With int javadoc;\n\t\n\tWithMethodMarkedDeprecated(int annotation, int javadoc) {\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/WithMethodMarkedDeprecatedAnnOnly.java",
    "content": "import lombok.With;\n\nclass WithMethodMarkedDeprecatedAnnOnly {\n\t\n\t@Deprecated\n\t@With int annotation;\n\t\n\tWithMethodMarkedDeprecatedAnnOnly(int annotation) {\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/WithNested.java",
    "content": "public interface WithNested<Z> {\n\t@lombok.RequiredArgsConstructor\n\tclass IAmStaticReally {\n\t\t@lombok.With final String x;\n\t}\n}\n\n"
  },
  {
    "path": "test/transform/resource/before/WithOnClass.java",
    "content": "//version 8:\n\n@lombok.With\nclass WithOnClass1 {\n\t@lombok.With(lombok.AccessLevel.NONE)\n\tboolean isNone;\n\t\n\tboolean isPublic;\n\t\n\tWithOnClass1(boolean isNone, boolean isPublic) {\n\t}\n}\n\n@lombok.With(lombok.AccessLevel.PROTECTED)\nclass WithOnClass2 {\n\t@lombok.With(lombok.AccessLevel.NONE)\n\tboolean isNone;\n\t\n\tboolean isProtected;\n\t\n\t@lombok.With(lombok.AccessLevel.PACKAGE)\n\tboolean isPackage;\n\t\n\tWithOnClass2(boolean isNone, boolean isProtected, boolean isPackage) {\n\t}\n}\n\n@lombok.With\nclass WithOnClass3 {\n\tString couldBeNull;\n\t\n\t@lombok.NonNull String nonNull;\n\t\n\tWithOnClass3(String couldBeNull, String nonNull) {\n\t}\n}\n\n@lombok.With @lombok.experimental.Accessors(prefix=\"f\")\nclass WithOnClass4 {\n\tfinal int fX = 10;\n\t\n\tfinal int fY;\n\t\n\tWithOnClass4(int y) {\n\t\tthis.fY = y;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/WithOnNestedRecord.java",
    "content": "// version 14:\nimport lombok.With;\n\npublic record WithOnNestedRecord<T>() {\n\t@With\n\tpublic record Nested(String a, String b) {\n\t\t\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/WithOnRecord.java",
    "content": "// version 14:\n\nimport lombok.With;\n\n@With\npublic record WithOnRecord(String a, String b) {\n}"
  },
  {
    "path": "test/transform/resource/before/WithOnRecordComponent.java",
    "content": "// version 14:\n\nimport lombok.With;\n\npublic record WithOnRecordComponent(@With String a, String b) {\n}"
  },
  {
    "path": "test/transform/resource/before/WithOnStatic.java",
    "content": "class WithOnStatic {\n\t@lombok.With static boolean foo;\n\t@lombok.With static int bar;\n}\n"
  },
  {
    "path": "test/transform/resource/before/WithPlain.java",
    "content": "//version 8: springframework dep is too new to run on j6\n//CONF: lombok.addNullAnnotations = spring\nimport lombok.With;\nclass WithPlain {\n\t@lombok.With int i;\n\t@With final int foo;\n\t\n\tWithPlain(int i, int foo) {\n\t\tthis.i = i;\n\t\tthis.foo = foo;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/WithWithDollar.java",
    "content": "class WithWithDollar {\n\t@lombok.With int $i;\n}\n"
  },
  {
    "path": "test/transform/resource/before/WithWithGenerics.java",
    "content": "class WithWithGenerics<T, J extends T, L extends java.lang.Number> {\n\t@lombok.With J test;\n\t@lombok.With java.util.List<L> test2;\n\t@lombok.With java.util.List<? extends L> test3;\n\tint $i;\n\t\n\tpublic WithWithGenerics(J test, java.util.List<L> test2, java.util.List<? extends L> test3) {\n\t}\n}"
  },
  {
    "path": "test/transform/resource/before/WithWithJavaBeansSpecCapitalization.java",
    "content": "//CONF: lombok.accessors.capitalization = beanspec\n@lombok.With\nclass WithWithJavaBeansSpecCapitalization {\n\tint aField;\n\t\n\tWithWithJavaBeansSpecCapitalization(int aField) {\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/WithWithTypeAnnos.java",
    "content": "//CONF: lombok.copyableAnnotations += TA\nimport lombok.With;\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Target;\nimport java.util.List;\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})\n@interface TA {\n}\n@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})\n@interface TB {\n}\nclass WithWithTypeAnnos {\n\t@With final @TA @TB List<String> foo;\n\t\n\tWithWithTypeAnnos(@TA @TB List<String> foo) {\n\t\tthis.foo = foo;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/WitherAccessLevel.java",
    "content": "import lombok.AccessLevel;\n\nclass WitherAccessLevel {\n\t@lombok.experimental.Wither(lombok.AccessLevel.NONE)\n\tboolean isNone;\n\t\n\t@lombok.experimental.Wither(AccessLevel.PRIVATE)\n\tboolean isPrivate;\n\t\n\t@lombok.experimental.Wither(lombok.AccessLevel.PACKAGE)\n\tboolean isPackage;\n\t\n\t@lombok.experimental.Wither(AccessLevel.PROTECTED)\n\tboolean isProtected;\n\t\n\t@lombok.experimental.Wither(lombok.AccessLevel.PUBLIC)\n\tboolean isPublic;\n\t\n\t@lombok.experimental.Wither(value=lombok.AccessLevel.PUBLIC)\n\tboolean value;\n\t\n\tWitherAccessLevel(boolean isNone, boolean isPrivate, boolean isPackage, boolean isProtected, boolean isPublic, boolean value) {\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/before/WitherLegacyStar.java",
    "content": "import lombok.experimental.*;\nclass WitherLegacyStar {\n\t@Wither int i;\n\t\n\tWitherLegacyStar(int i) {\n\t\tthis.i = i;\n\t}\n}\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/Accessors.java.messages",
    "content": "19 Not generating setter for this field: It does not fit your @Accessors prefix list."
  },
  {
    "path": "test/transform/resource/messages-delombok/AccessorsNoParamWarning.java.messages",
    "content": "3 Accessors on its own does nothing. Set at least one parameter\n6 Accessors on its own does nothing. Set at least one parameter"
  },
  {
    "path": "test/transform/resource/messages-delombok/BuilderDefaultsWarnings.java.messages",
    "content": "13 @Builder.Default requires @Builder on the class for it to mean anything.\n8 @Builder.Default requires an initializing expression (' = something;').\n9 @Builder.Default and @Singular cannot be mixed.\n6 @Builder will ignore the initializing expression entirely. If you want the initializing expression to serve as default, add @Builder.Default. If it is not supposed to be settable during building, make the field final.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/BuilderInAnonymousClass.java.messages",
    "content": "5 @Builder is not supported on non-static nested classes.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/BuilderInvalidUse.java.messages",
    "content": "2 @Getter, @Setter, @With, @Data, @ToString, @EqualsAndHashCode, @AllArgsConstructor are not allowed on builder classes.\n13 @Value is not allowed on builder classes."
  },
  {
    "path": "test/transform/resource/messages-delombok/BuilderSingularNoAuto.java.messages",
    "content": "8 The singular must be specified explicitly (e.g. @Singular(\"task\")) because auto singularization is disabled.\n10 The singular must be specified explicitly (e.g. @Singular(\"task\")) because auto singularization is disabled.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/BuilderSingularNoAutoWithSetterPrefix.java.messages",
    "content": "8 The singular must be specified explicitly (e.g. @Singular(\"task\")) because auto singularization is disabled.\n10 The singular must be specified explicitly (e.g. @Singular(\"task\")) because auto singularization is disabled.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/ConflictingStaticConstructorNames.java.messages",
    "content": "1 Ignoring static constructor name: explicit @XxxArgsConstructor annotation present; its `staticName` parameter will be used.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/ConstructorsOnRecord.java.messages",
    "content": "7 AllArgsConstructor is only supported on a class or an enum.\n8 RequiredArgsConstructor is only supported on a class or an enum.\n9 NoArgsConstructor is only supported on a class or an enum.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/DataOnRecord.java.messages",
    "content": "5 @Data is only supported on a class.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/DelegateFlagUsage.java.messages",
    "content": "5 Use of @Delegate is flagged according to lombok configuration.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/DelegateOnStatic.java.messages",
    "content": "7 @Delegate is legal only on instance fields or no-argument instance methods.\n11 @Delegate is legal only on instance fields or no-argument instance methods.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/DelegateRecursion.java.messages",
    "content": "5 @Delegate does not support recursion (delegating to a type that itself has @Delegate members). Member \"inner\" is @Delegate in type \"DelegateRecursionCenter\"\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/EqualsAndHashCodeOfAndExcludeError.java.messages",
    "content": "2:60 You must use constant literals in lombok annotations; they cannot be references to (static) fields.\n7:160 You must use constant literals in lombok annotations; they cannot be references to (static) fields."
  },
  {
    "path": "test/transform/resource/messages-delombok/EqualsAndHashCodeOfAndExcludeWarn.java.messages",
    "content": "2 This field does not exist.\n7 This field does not exist, or would have been excluded anyway.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/EqualsAndHashCodeOnRecord.java.messages",
    "content": "5 @EqualsAndHashCode is only supported on a class.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/EqualsAndHashCodeWithExistingMethods.java.messages",
    "content": "1 Not generating equals and hashCode: A method with one of those names already exists. (Either both or none of these methods will be generated).\n10 Not generating equals and hashCode: A method with one of those names already exists. (Either both or none of these methods will be generated).\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/EqualsAndHashCodeWithSomeExistingMethods.java.messages",
    "content": "4 Not generating equals: One of equals or hashCode exists. You should either write both of these or none of these (in the latter case, lombok generates them).\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/ExtensionMethodAmbiguousFunctional.java.messages",
    "content": "10 reference to ambiguous is ambiguous both method <T,R>ambiguous(T,java.util.function.Function<T,R>) in ExtensionMethodAmbiguousFunctional.Extensions and method <T>ambiguous(T,java.util.function.Consumer<T>) in ExtensionMethodAmbiguousFunctional.Extensions match\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/ExtensionMethodInLambda.java.messages",
    "content": "21 cannot find symbol symbol: method invalid((s)->s.reverse()) location: variable test of type java.lang.String"
  },
  {
    "path": "test/transform/resource/messages-delombok/ExtensionMethodVarargs.java.messages",
    "content": "14 non-varargs call of varargs method with inexact argument type for last parameter"
  },
  {
    "path": "test/transform/resource/messages-delombok/FieldDefaultsNoop.java.messages",
    "content": "1 This does nothing; provide either level or makeFinal or both."
  },
  {
    "path": "test/transform/resource/messages-delombok/FieldDefaultsOnRecord.java.messages",
    "content": "3 @FieldDefaults is only supported on a class or an enum.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/FieldNameConstantsInAnonymousClass.java.messages",
    "content": "5 @FieldNameConstants is not supported on non-static nested classes.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/FlagUsages.java.messages",
    "content": "4 Use of any lombok.experimental feature is flagged according to lombok configuration.\n6 Use of @Getter is flagged according to lombok configuration.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/GetterAlreadyExists.java.messages",
    "content": "8 Not generating isFoo(): A method with that name already exists\n14 Not generating isFoo(): A method with that name already exists (getFoo)\n32 Not generating getFoo(): A method with that name already exists\n50 Not generating getFoo(): A method with that name already exists\n62 Not generating isFoo(): A method with that name already exists\n68 Not generating isFoo(): A method with that name already exists (getFoo)\n86 Not generating getFoo(): A method with that name already exists\n104 Not generating getFoo(): A method with that name already exists\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/GetterBoolean.java.messages",
    "content": "13 Not generating isFoo(): A method with that name already exists (getFoo)"
  },
  {
    "path": "test/transform/resource/messages-delombok/GetterEnumConstant.java.messages",
    "content": "4 @Getter is only supported on a class, an enum, or a field.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/GetterLazyErrorPosition.java.messages",
    "content": "7 cannot find symbol"
  },
  {
    "path": "test/transform/resource/messages-delombok/GetterLazyInvalid.java.messages",
    "content": "2 'lazy' requires the field to be private and final.\n6 'lazy' requires the field to be private and final.\n10 'lazy' requires the field to be private and final.\n14 'lazy' does not work with AccessLevel.NONE.\n17 'lazy' is not supported for @Getter on a type.\n22 'lazy' requires field initialization."
  },
  {
    "path": "test/transform/resource/messages-delombok/GetterLazyTransient.java.messages",
    "content": "5 'lazy' is not supported on transient fields."
  },
  {
    "path": "test/transform/resource/messages-delombok/GetterOnMethodErrors2.java.messages",
    "content": "3 The correct format is\n4 The correct format is\n5 The correct format is\n6 The correct format is\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/GetterOnRecord.java.messages",
    "content": "5 @Getter is only supported on a class, an enum, or a field.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/HelperInInitializationBlock.java.messages",
    "content": "15 No methods of this helper class are ever used."
  },
  {
    "path": "test/transform/resource/messages-delombok/JacksonizedNoConfigChoice.java.messages",
    "content": "2 Ambiguous: Jackson2 and Jackson3 exist"
  },
  {
    "path": "test/transform/resource/messages-delombok/JacksonizedSuperBuilderWithJsonDeserialize.java.messages",
    "content": "2 @JsonDeserialize already exists on class. Either delete @JsonDeserialize, or remove @Jacksonized and manually configure Jackson.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/LockedInRecord.java.messages",
    "content": "6 @Locked is legal only on methods in classes and enums.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/LockedStaticMix.java.messages",
    "content": "5 The generated field LOCK does not match the static status of this method\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/LockedTypeMismatch.java.messages",
    "content": "5 Expected field lock to be of type java.util.concurrent.locks.ReadWriteLock but got type java.util.concurrent.locks.Lock. Did you mix @Locked with @Locked.Read/Write on the same generated field?\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/LoggerConfigOnRecord.java.messages",
    "content": "6 Logger fields must be static in records.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/LoggerSlf4jAlreadyExists.java.messages",
    "content": "1 Field 'log' already exists.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/LoggerSlf4jInAnonymousClass.java.messages",
    "content": "5 @Slf4j is not supported on non-static nested classes.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/LoggerSlf4jOnNonStaticInnerClass.java.messages",
    "content": "2 @Log is not legal on non-static inner classes."
  },
  {
    "path": "test/transform/resource/messages-delombok/LoggerSlf4jOnNonType.java.messages",
    "content": "3 @Log is legal only on types. |||| 3 annotation type not applicable to this kind of declaration |||| 3 annotation interface not applicable to this kind of declaration"
  },
  {
    "path": "test/transform/resource/messages-delombok/LoggerSlf4jTypes.java.messages",
    "content": "1 @Slf4j is legal only on classes and enums.\n4 @Slf4j is legal only on classes and enums."
  },
  {
    "path": "test/transform/resource/messages-delombok/NonNullOnParameter.java.messages",
    "content": "23 @NonNull is meaningless on a primitive.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/NonNullPlain.java.messages",
    "content": "8 @NonNull is meaningless on a primitive.\n4 @NonNull is meaningless on a primitive.\n6 @NonNull is meaningless on a primitive."
  },
  {
    "path": "test/transform/resource/messages-delombok/OnXFlagUsage.java.messages",
    "content": "10 Use of @Getter(onMethod=...) is flagged according to lombok configuration.\n11 Use of @Setter(onMethod=...) is flagged according to lombok configuration.\n11 Use of @Setter(onParam=...) is flagged according to lombok configuration.\n12 Use of @NoArgsConstructor(onConstructor=...) is flagged according to lombok configuration.\n13 Use of @AllArgsConstructor(onConstructor=...) is flagged according to lombok configuration.\n19 Use of @RequiredArgsConstructor(onConstructor=...) is flagged according to lombok configuration.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/SetterAlreadyExists.java.messages",
    "content": "2 Not generating setFoo(): A method with that name already exists\n8 Not generating setFoo(): A method with that name already exists\n14 Not generating setFoo(): A method with that name already exists\n20 Not generating setFoo(): A method with that name already exists\n38 Not generating setFoo(): A method with that name already exists\n44 Not generating setFoo(): A method with that name already exists (setIsFoo)\n50 Not generating setFoo(): A method with that name already exists\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/SetterOnMethod.java.messages",
    "content": "3 incompatible types\n4 incompatible types\n6 incompatible types\n11 incompatible types\n14 incompatible types\n6 'onMethod' is not supported for @Setter on a type.\n11 'onMethod' is not supported for @Setter on a type.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/SetterOnParam.java.messages",
    "content": "3 incompatible types\n4 incompatible types\n6 incompatible types\n11 incompatible types\n14 incompatible types\n6 'onParam' is not supported for @Setter on a type.\n11 'onParam' is not supported for @Setter on a type.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/SetterOnParamAndOnMethod.java.messages",
    "content": "2 incompatible types\n2 incompatible types\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/SetterOnRecord.java.messages",
    "content": "5 @Setter is only supported on a class or a field.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/SimpleTypeResolution.java.messages",
    "content": "2 cannot find symbol\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/SuperBuilderInAnonymousClass.java.messages",
    "content": "5 @SuperBuilder is not supported on non-static nested classes.\n10 @SuperBuilder is not supported on non-static nested classes.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/SuperBuilderOnRecord.java.messages",
    "content": "6 @SuperBuilder is only supported on classes.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/SynchronizedInRecord.java.messages",
    "content": "6 @Synchronized is legal only on methods in classes and enums.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/SynchronizedNameNoSuchField.java.messages",
    "content": "5 The field write does not exist.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/SynchronizedNameStaticToInstanceRef.java.messages",
    "content": "5 The field read is non-static and this cannot be used on this static method"
  },
  {
    "path": "test/transform/resource/messages-delombok/ToStringOnRecord.java.messages",
    "content": "5 @ToString is only supported on a class or enum.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/ToStringWithConstantRefInOf.java.messages",
    "content": "4 You must use constant literals in lombok annotations; they cannot be references to (static) fields.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/UtilityClassErrors.java.messages",
    "content": "4 @UtilityClasses cannot have declared constructors.\n7 @UtilityClass cannot be placed on a method local or anonymous inner class, or any class nested in such a class.\n12 @UtilityClass is only supported on a class.\n17 @UtilityClass automatically makes the class static, however, this class cannot be made static."
  },
  {
    "path": "test/transform/resource/messages-delombok/UtilityClassInAnonymousClass.java.messages",
    "content": "5 @UtilityClass automatically makes the class static, however, this class cannot be made static.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/UtilityClassOnRecord.java.messages",
    "content": "5 @UtilityClass is only supported on a class.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/ValErrors.java.messages",
    "content": "7 Cannot use 'val' here because initializer expression does not have a representable type: Type cannot be resolved\n11 'val' is not compatible with array initializer expressions. Use the full form (new int[] { ... } instead of just { ... })\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/ValInBasicFor.java.messages",
    "content": "8 'val' is not allowed in old-style for loops\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/ValInvalidParameter.java.messages",
    "content": "6 Cannot use 'val' here because initializer expression does not have a representable type: Type cannot be resolved\n7 Cannot use 'val' here because initializer expression does not have a representable type: Type cannot be resolved\n8 Cannot use 'val' here because initializer expression does not have a representable type: Type cannot be resolved\n9 Cannot use 'val' here because initializer expression does not have a representable type: Type cannot be resolved\n10 Cannot use 'val' here because initializer expression does not have a representable type: Type cannot be resolved\n11 Cannot use 'val' here because initializer expression does not have a representable type: Type cannot be resolved\n12 Cannot use 'val' here because initializer expression does not have a representable type: Type cannot be resolved"
  },
  {
    "path": "test/transform/resource/messages-delombok/ValueOnRecord.java.messages",
    "content": "5 @Value is only supported on a class.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/VarInForOldMulti.java.messages",
    "content": "7 'var' is not allowed in old-style for loops if there is more than 1 initializer\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/VarNullInit.java.messages",
    "content": "6 variable initializer is 'null'\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/VarWarning.java.messages",
    "content": "7 Use of var is flagged according to lombok configuration.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/WithAlreadyExists.java.messages",
    "content": "2 Not generating withFoo(): A method with that name already exists\n12 Not generating withFoo(): A method with that name already exists\n22 Not generating withFoo(): A method with that name already exists\n32 Not generating withFoo(): A method with that name already exists\n62 Not generating withFoo(): A method with that name already exists\n72 Not generating withFoo(): A method with that name already exists (withIsFoo)\n82 Not generating withFoo(): A method with that name already exists\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/WithOnStatic.java.messages",
    "content": "2 Not generating withFoo for this field: With methods cannot be generated for static fields.\n3 Not generating withBar for this field: With methods cannot be generated for static fields.\n"
  },
  {
    "path": "test/transform/resource/messages-delombok/WithWithDollar.java.messages",
    "content": "2 Not generating with$i for this field: With methods cannot be generated for fields starting with $.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/Accessors.java.messages",
    "content": "19 Not generating setter for this field: It does not fit your @Accessors prefix list.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/AccessorsNoParamWarning.java.messages",
    "content": "3 Accessors on its own does nothing. Set at least one parameter\n6 Accessors on its own does nothing. Set at least one parameter"
  },
  {
    "path": "test/transform/resource/messages-ecj/BuilderDefaultsWarnings.java.messages",
    "content": "6 @Builder will ignore the initializing expression entirely. If you want the initializing expression to serve as default, add @Builder.Default. If it is not supposed to be settable during building, make the field final.\n8 @Builder.Default requires an initializing expression (' = something;').\n9 @Builder.Default and @Singular cannot be mixed.\n13 @Builder.Default requires @Builder on the class for it to mean anything.\n\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/BuilderInAnonymousClass.java.messages",
    "content": "5 @Builder is not supported on non-static nested classes.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/BuilderInvalidUse.java.messages",
    "content": "2 @Getter, @Setter, @FieldDefaults, @With, @Data, @ToString, @EqualsAndHashCode, @AllArgsConstructor are not allowed on builder classes.\n13 @Value is not allowed on builder classes."
  },
  {
    "path": "test/transform/resource/messages-ecj/BuilderSingularNoAuto.java.messages",
    "content": "8 The singular must be specified explicitly (e.g. @Singular(\"task\")) because auto singularization is disabled.\n10 The singular must be specified explicitly (e.g. @Singular(\"task\")) because auto singularization is disabled.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/BuilderSingularNoAutoWithSetterPrefix.java.messages",
    "content": "8 The singular must be specified explicitly (e.g. @Singular(\"task\")) because auto singularization is disabled.\n10 The singular must be specified explicitly (e.g. @Singular(\"task\")) because auto singularization is disabled.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/ConflictingStaticConstructorNames.java.messages",
    "content": "1 Ignoring static constructor name: explicit @XxxArgsConstructor annotation present; its `staticName` parameter will be used.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/ConstructorsOnRecord.java.messages",
    "content": "7 AllArgsConstructor is only supported on a class or an enum.\n8 RequiredArgsConstructor is only supported on a class or an enum.\n9 NoArgsConstructor is only supported on a class or an enum.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/DataOnRecord.java.messages",
    "content": "5 @Data is only supported on a class.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/DelegateFlagUsage.java.messages",
    "content": "5 Use of @Delegate is flagged according to lombok configuration.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/DelegateOnGetter.java.messages",
    "content": "2 The type Delegate is deprecated\n7 The type Delegate is deprecated\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/DelegateOnStatic.java.messages",
    "content": "7 @Delegate is legal only on instance fields or no-argument instance methods.\n11 @Delegate is legal only on instance fields or no-argument instance methods.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/DelegateRecursion.java.messages",
    "content": "5 @Delegate does not support recursion (delegating to a type that itself has @Delegate members). Member \"inner\" is @Delegate in type \"DelegateRecursionCenter\"\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/EqualsAndHashCodeOfAndExcludeError.java.messages",
    "content": "2:60 You must use constant literals in lombok annotations; they cannot be references to (static) fields.\n7:160 You must use constant literals in lombok annotations; they cannot be references to (static) fields."
  },
  {
    "path": "test/transform/resource/messages-ecj/EqualsAndHashCodeOfAndExcludeWarn.java.messages",
    "content": "2 This field does not exist.\n7 This field does not exist, or would have been excluded anyway.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/EqualsAndHashCodeOnRecord.java.messages",
    "content": "5 @EqualsAndHashCode is only supported on a class.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/EqualsAndHashCodeWithExistingMethods.java.messages",
    "content": "1 Not generating equals and hashCode: A method with one of those names already exists. (Either both or none of these methods will be generated).\n10 Not generating equals and hashCode: A method with one of those names already exists. (Either both or none of these methods will be generated).\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/EqualsAndHashCodeWithSomeExistingMethods.java.messages",
    "content": "4 Not generating equals: One of equals or hashCode exists. You should either write both of these or none of these (in the latter case, lombok generates them).\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/ExtensionMethodAmbiguousFunctional.java.messages",
    "content": "10 The method ambiguous(String, Function<String,Object>) is ambiguous for the type ExtensionMethodAmbiguousFunctional.Extensions\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/ExtensionMethodInLambda.java.messages",
    "content": "21 The method invalid((<no type> s) -> {}) is undefined for the type String\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/ExtensionMethodNonStaticAccess.java.messages",
    "content": "6 The static method staticMethod() from the type Base should be accessed directly \n6 The static method staticMethod() from the type Base should be accessed in a static way"
  },
  {
    "path": "test/transform/resource/messages-ecj/ExtensionMethodSuppress.java.messages",
    "content": "21 The static method staticMethod() from the type Test should be accessed in a static way"
  },
  {
    "path": "test/transform/resource/messages-ecj/FieldDefaultsNoop.java.messages",
    "content": "1 This does nothing; provide either level or makeFinal or both."
  },
  {
    "path": "test/transform/resource/messages-ecj/FieldDefaultsOnRecord.java.messages",
    "content": "3 @FieldDefaults is only supported on a class or an enum.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/FieldNameConstantsInAnonymousClass.java.messages",
    "content": "5 @FieldNameConstants is not supported on non-static nested classes.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/FlagUsages.java.messages",
    "content": "4 Use of any lombok.experimental feature is flagged according to lombok configuration.\n6 Use of @Getter is flagged according to lombok configuration.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/GetterAlreadyExists.java.messages",
    "content": "8 Not generating isFoo(): A method with that name already exists\n14 Not generating isFoo(): A method with that name already exists (getFoo)\n32 Not generating getFoo(): A method with that name already exists\n50 Not generating getFoo(): A method with that name already exists\n62 Not generating isFoo(): A method with that name already exists\n68 Not generating isFoo(): A method with that name already exists (getFoo)\n86 Not generating getFoo(): A method with that name already exists\n104 Not generating getFoo(): A method with that name already exists\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/GetterBoolean.java.messages",
    "content": "13 Not generating isFoo(): A method with that name already exists (getFoo)\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/GetterEnumConstant.java.messages",
    "content": "4 @Getter is only supported on a class, an enum, or a field.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/GetterLazyInvalid.java.messages",
    "content": "2 'lazy' requires the field to be private and final.\n6 'lazy' requires the field to be private and final.\n10 'lazy' requires the field to be private and final.\n14 'lazy' does not work with AccessLevel.NONE.\n17 'lazy' is not supported for @Getter on a type.\n22 'lazy' requires field initialization.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/GetterLazyTransient.java.messages",
    "content": "5 'lazy' is not supported on transient fields."
  },
  {
    "path": "test/transform/resource/messages-ecj/GetterOnMethodErrors2.java.messages",
    "content": "3 The correct format is\n4 The correct format is\n5 The correct format is\n6 The correct format is\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/GetterOnRecord.java.messages",
    "content": "5 @Getter is only supported on a class, an enum, or a field.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/HelperInInitializationBlock.java.messages",
    "content": "15 No methods of this helper class are ever used.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/JacksonizedNoConfigChoice.java.messages",
    "content": "2 Ambiguous: Jackson2 and Jackson3 exist"
  },
  {
    "path": "test/transform/resource/messages-ecj/JacksonizedSuperBuilderWithJsonDeserialize.java.messages",
    "content": "2 @JsonDeserialize already exists on class. Either delete @JsonDeserialize, or remove @Jacksonized and manually configure Jackson.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/LockedInRecord.java.messages",
    "content": "6 @Locked is legal only on methods in classes and enums.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/LockedStaticMix.java.messages",
    "content": "5 The generated field LOCK does not match the static status of this method\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/LockedTypeMismatch.java.messages",
    "content": "5 Expected field lock to be of type java.util.concurrent.locks.ReadWriteLock but got type java.util.concurrent.locks.Lock. Did you mix @Locked with @Locked.Read/Write on the same generated field?\n14 The method readLock() is undefined for the type Lock\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/LoggerConfigOnRecord.java.messages",
    "content": "6 Logger fields must be static in records.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/LoggerSlf4jAlreadyExists.java.messages",
    "content": "1 Field 'log' already exists.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/LoggerSlf4jInAnonymousClass.java.messages",
    "content": "5 @Slf4j is not supported on non-static nested classes.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/LoggerSlf4jOnNonStaticInnerClass.java.messages",
    "content": "2 @Log is not legal on non-static inner classes."
  },
  {
    "path": "test/transform/resource/messages-ecj/LoggerSlf4jOnNonType.java.messages",
    "content": "3 The annotation @Slf4j is disallowed for this location\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/LoggerSlf4jTypes.java.messages",
    "content": "1 @Slf4j is legal only on classes and enums.\n4 @Slf4j is legal only on classes and enums.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/NonNullOnParameter.java.messages",
    "content": "16 Dead code\n23 @NonNull is meaningless on a primitive.\n29 Dead code\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/NonNullPlain.java.messages",
    "content": "8 @NonNull is meaningless on a primitive.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/OnXFlagUsage.java.messages",
    "content": "10 Use of @Getter(onMethod=...) is flagged according to lombok configuration.\n11 Use of @Setter(onMethod=...) is flagged according to lombok configuration.\n11 Use of @Setter(onParam=...) is flagged according to lombok configuration.\n12 Use of @NoArgsConstructor(onConstructor=...) is flagged according to lombok configuration.\n13 Use of @AllArgsConstructor(onConstructor=...) is flagged according to lombok configuration.\n19 Use of @RequiredArgsConstructor(onConstructor=...) is flagged according to lombok configuration.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/SetterAlreadyExists.java.messages",
    "content": "2 Not generating setFoo(): A method with that name already exists\n8 Not generating setFoo(): A method with that name already exists\n14 Not generating setFoo(): A method with that name already exists\n20 Not generating setFoo(): A method with that name already exists\n38 Not generating setFoo(): A method with that name already exists\n44 Not generating setFoo(): A method with that name already exists (setIsFoo)\n50 Not generating setFoo(): A method with that name already exists\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/SetterOnMethod.java.messages",
    "content": "6 'onMethod' is not supported for @Setter on a type.\n11 'onMethod' is not supported for @Setter on a type."
  },
  {
    "path": "test/transform/resource/messages-ecj/SetterOnParam.java.messages",
    "content": "6 'onParam' is not supported for @Setter on a type.\n11 'onParam' is not supported for @Setter on a type."
  },
  {
    "path": "test/transform/resource/messages-ecj/SetterOnRecord.java.messages",
    "content": "5 @Setter is only supported on a class or a field.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/SimpleTypeResolution.java.messages",
    "content": "2 Getter cannot be resolved to a type\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/SkipSuppressWarnings.java.messages",
    "content": "7 Unnecessary @SuppressWarnings(\"unchecked\")"
  },
  {
    "path": "test/transform/resource/messages-ecj/StandardExceptionWithConstructor.java.messages",
    "content": "4 The serializable class StandardExceptionWithConstructor does not declare a static final serialVersionUID field of type long"
  },
  {
    "path": "test/transform/resource/messages-ecj/StandardExceptions.java.messages",
    "content": "4 The serializable class EmptyException does not declare a static final serialVersionUID field of type long\n6 The serializable class NoArgsException does not declare a static final serialVersionUID field of type long\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/SuperBuilderInAnonymousClass.java.messages",
    "content": "5 @SuperBuilder is not supported on non-static nested classes.\n10 @SuperBuilder is not supported on non-static nested classes.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/SuperBuilderNameClashes.java.messages",
    "content": "3 The type parameter B is hiding the type SuperBuilderNameClashes.B\n3 The type parameter C is hiding the type SuperBuilderNameClashes.C\n3 The type parameter C2 is hiding the type SuperBuilderNameClashes.C2\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/SuperBuilderOnRecord.java.messages",
    "content": "6 @SuperBuilder is only supported on classes.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/SynchronizedInRecord.java.messages",
    "content": "6 @Synchronized is legal only on methods in classes and enums.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/SynchronizedNameNoSuchField.java.messages",
    "content": "5 The field write does not exist\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/SynchronizedNameStaticToInstanceRef.java.messages",
    "content": "5 The field read is non-static and thus cannot be used on this static method\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/ToStringOnRecord.java.messages",
    "content": "5 @ToString is only supported on a class or enum.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/ToStringWithConstantRefInOf.java.messages",
    "content": "4 You must use constant literals in lombok annotations; they cannot be references to (static) fields.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/UtilityClassErrors.java.messages",
    "content": "4 @UtilityClasses cannot have declared constructors.\n7 @UtilityClass cannot be placed on a method local or anonymous inner class, or any class nested in such a class.\n12 @UtilityClass is only supported on a class.\n17 @UtilityClass automatically makes the class static, however, this class cannot be made static."
  },
  {
    "path": "test/transform/resource/messages-ecj/UtilityClassInAnonymousClass.java.messages",
    "content": "5 @UtilityClass automatically makes the class static, however, this class cannot be made static.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/UtilityClassOnRecord.java.messages",
    "content": "5 @UtilityClass is only supported on a class.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/ValAnonymousSubclassWithGenerics.java.messages",
    "content": "18 The serializable class  does not declare a static final serialVersionUID field of type long\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/ValErrors.java.messages",
    "content": "7 d cannot be resolved to a variable\n7 d cannot be resolved or is not a field\n11 'val' is not compatible with array initializer expressions. Use the full form (new int[] { ... } instead of just { ... })\n11 Type mismatch: cannot convert from String[] to Object"
  },
  {
    "path": "test/transform/resource/messages-ecj/ValInBasicFor.java.messages",
    "content": "8 'val' is not allowed in old-style for loops\n8 Type mismatch: cannot convert from int to val\n8 Type mismatch: cannot convert from String to val\n8 Type mismatch: cannot convert from double to val"
  },
  {
    "path": "test/transform/resource/messages-ecj/ValInTryWithResources.java.messages",
    "content": "OPTIONAL 8 Resource leak: 'i' is never closed\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/ValInvalidParameter.java.messages",
    "content": "6 NonExistingClass cannot be resolved to a type\n7 NonExistingClass cannot be resolved to a type\n8 The method nonExisitingMethod(Integer) is undefined for the type ValInvalidParameter\n9 nonExistingObject cannot be resolved\n10 The method nonExistingMethod() is undefined for the type Integer\n11 NonExistingClass cannot be resolved to a type\n12 The method b2(int, int) in the type ValInvalidParameter is not applicable for the arguments (int)\n13 The method a(String) is ambiguous for the type ValInvalidParameter\n14 The method a(String) is ambiguous for the type ValInvalidParameter\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/ValLambda.java.messages",
    "content": "25 Function is a raw type. References to generic type Function<T,R> should be parameterized\n26 Function is a raw type. References to generic type Function<T,R> should be parameterized\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/ValRawType.java.messages",
    "content": "14 List is a raw type. References to generic type List<E> should be parameterized\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/ValueOnRecord.java.messages",
    "content": "5 @Value is only supported on a class.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/VarInForOldMulti.java.messages",
    "content": "7 'var' is not allowed in old-style for loops if there is more than 1 initializer\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/VarModifier.java.messages",
    "content": "2 The type var is deprecated\n8 The type var is deprecated\n9 The type var is deprecated\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/VarNullInit.java.messages",
    "content": "6 variable initializer is 'null'\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/VarWarning.java.messages",
    "content": "7 Use of var is flagged according to lombok configuration.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/WithAlreadyExists.java.messages",
    "content": "2 Not generating withFoo(): A method with that name already exists\n12 Not generating withFoo(): A method with that name already exists\n22 Not generating withFoo(): A method with that name already exists\n32 Not generating withFoo(): A method with that name already exists\n62 Not generating withFoo(): A method with that name already exists\n72 Not generating withFoo(): A method with that name already exists (withIsFoo)\n82 Not generating withFoo(): A method with that name already exists\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/WithOnStatic.java.messages",
    "content": "2 Not generating withFoo for this field: With methods cannot be generated for static fields.\n3 Not generating withBar for this field: With methods cannot be generated for static fields.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/WithWithDollar.java.messages",
    "content": "2 Not generating with$i for this field: With methods cannot be generated for fields starting with $.\n"
  },
  {
    "path": "test/transform/resource/messages-ecj/WitherAccessLevel.java.messages",
    "content": "4 The type Wither is deprecated\n"
  },
  {
    "path": "test/transform/resource/messages-idempotent/ExtensionMethodInLambda.java.messages",
    "content": "19 cannot find symbol symbol: method invalid((s)->s.reverse()) location: variable test of type java.lang.String"
  },
  {
    "path": "test/transform/resource/messages-idempotent/ExtensionMethodVarargs.java.messages",
    "content": "9 non-varargs call of varargs method with inexact argument type for last parameter"
  },
  {
    "path": "test/transform/resource/messages-idempotent/GetterLazyErrorPosition.java.messages",
    "content": "11 cannot find symbol"
  },
  {
    "path": "test/transform/resource/messages-idempotent/LockedTypeMismatch.java.messages",
    "content": "28 cannot find symbol method readLock() location: java.util.concurrent.locks.Lock\n32 cannot find symbol method readLock() location: java.util.concurrent.locks.Lock\n"
  },
  {
    "path": "test/transform/resource/messages-idempotent/NonNullOnParameter.java.messages",
    "content": "34 @NonNull is meaningless on a primitive.\n"
  },
  {
    "path": "test/transform/resource/messages-idempotent/NonNullPlain.java.messages",
    "content": "4 @NonNull is meaningless on a primitive.\n16 @NonNull is meaningless on a primitive.\n42 @NonNull is meaningless on a primitive.\n"
  },
  {
    "path": "test/transform/resource/messages-idempotent/SimpleTypeResolution.java.messages",
    "content": "2 cannot find symbol\n"
  },
  {
    "path": "test/transform/resource/messages-idempotent/ValErrors.java.messages",
    "content": "3 cannot find symbol\n6 cannot find symbol\nOPTIONAL 6 illegal initializer for <none>\n"
  },
  {
    "path": "test/transform/resource/messages-idempotent/ValInBasicFor.java.messages",
    "content": "5 'val' is not allowed in old-style for loops\n"
  },
  {
    "path": "test/transform/resource/messages-idempotent/ValInvalidParameter.java.messages",
    "content": "4 cannot find symbol symbol: class NonExistingClass location: class ValInvalidParameter\n5 cannot find symbol symbol: class NonExistingClass location: class ValInvalidParameter\n6 cannot find symbol symbol: method nonExisitingMethod(java.lang.Integer) location: class ValInvalidParameter\n7 cannot find symbol symbol: variable nonExistingObject location: class ValInvalidParameter\n8 cannot find symbol symbol: method nonExistingMethod() location: class java.lang.Integer\n9 cannot find symbol symbol: class NonExistingClass location: class ValInvalidParameter\n10 method b2 in class ValInvalidParameter cannot be applied to given types; required: int,int found: int reason: actual and formal argument lists differ in length\n11 reference to a is ambiguous both method a(java.lang.String) in ValInvalidParameter and method a(java.lang.Integer) in ValInvalidParameter match\n12 reference to a is ambiguous both method a(java.lang.String) in ValInvalidParameter and method a(java.lang.Integer) in ValInvalidParameter match\n"
  },
  {
    "path": "test/transform/src/lombok/transform/TestLombokFilesIdempotent.java",
    "content": "/*\n * Copyright (C) 2009-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.transform;\n\nimport java.io.File;\n\nimport lombok.DirectoryRunner;\n\nimport org.junit.runner.RunWith;\n\n@RunWith(DirectoryRunner.class)\npublic class TestLombokFilesIdempotent extends DirectoryRunner.TestParams {\n\t@Override\n\tpublic File getBeforeDirectory() {\n\t\treturn getAfterDirectory();\n\t}\n\t\n\t@Override\n\tpublic File getAfterDirectory() {\n\t\treturn new File(\"test/transform/resource/after-delombok\");\n\t}\n\t\n\t@Override\n\tpublic File getMessagesDirectory() {\n\t\treturn new File(\"test/transform/resource/messages-idempotent\");\n\t}\n\t\n\t@Override\n\tpublic DirectoryRunner.Compiler getCompiler() {\n\t\treturn DirectoryRunner.Compiler.DELOMBOK;\n\t}\n\t\n\t@Override\n\tpublic boolean printErrors() {\n\t\treturn true;\n\t}\n\t\n\t@Override\n\tpublic boolean expectChanges() {\n\t\treturn false;\n\t}\n\t\n\t@Override public String testNamePrefix() {\n\t\treturn \"idempotent-\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/src/lombok/transform/TestSourceFiles.java",
    "content": "/*\n * Copyright (C) 2009-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.transform;\n\nimport java.io.File;\n\nimport lombok.DirectoryRunner;\n\nimport org.junit.runner.RunWith;\n\n@RunWith(DirectoryRunner.class)\npublic class TestSourceFiles extends DirectoryRunner.TestParams {\n\t@Override\n\tpublic DirectoryRunner.Compiler getCompiler() {\n\t\treturn DirectoryRunner.Compiler.DELOMBOK;\n\t}\n\t\n\t@Override\n\tpublic boolean printErrors() {\n\t\treturn true;\n\t}\n\t\n\t@Override\n\tpublic File getBeforeDirectory() {\n\t\treturn new File(\"test/pretty/resource/before\");\n\t}\n\t\n\t@Override\n\tpublic File getAfterDirectory() {\n\t\treturn new File(\"test/pretty/resource/after\");\n\t}\n\t\n\t@Override\n\tpublic File getMessagesDirectory() {\n\t\treturn new File(\"test/pretty/resource/messages\");\n\t}\n\t\n\t@Override\n\tpublic boolean expectChanges() {\n\t\treturn false;\n\t}\n\t\n\t@Override public String testNamePrefix() {\n\t\treturn \"prettyprint-\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/src/lombok/transform/TestWithDelombok.java",
    "content": "/*\n * Copyright (C) 2009-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.transform;\n\nimport java.io.File;\n\nimport lombok.DirectoryRunner;\n\nimport org.junit.runner.RunWith;\n\n@RunWith(DirectoryRunner.class)\npublic class TestWithDelombok extends DirectoryRunner.TestParams {\n\t@Override\n\tpublic DirectoryRunner.Compiler getCompiler() {\n\t\treturn DirectoryRunner.Compiler.DELOMBOK;\n\t}\n\t\n\t@Override\n\tpublic boolean printErrors() {\n\t\treturn true;\n\t}\n\t\n\t@Override\n\tpublic File getBeforeDirectory() {\n\t\treturn new File(\"test/transform/resource/before\");\n\t}\n\t\n\t@Override\n\tpublic File getAfterDirectory() {\n\t\treturn new File(\"test/transform/resource/after-delombok\");\n\t}\n\t\n\t@Override\n\tpublic File getMessagesDirectory() {\n\t\treturn new File(\"test/transform/resource/messages-delombok\");\n\t}\n\t\n\t@Override\n\tpublic boolean expectChanges() {\n\t\treturn true;\n\t}\n\t\n\t@Override public String testNamePrefix() {\n\t\treturn \"javac-\";\n\t}\n}\n"
  },
  {
    "path": "test/transform/src/lombok/transform/TestWithEcj.java",
    "content": "/*\n * Copyright (C) 2009-2021 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage lombok.transform;\n\nimport java.io.File;\n\nimport lombok.DirectoryRunner;\n\nimport org.junit.runner.RunWith;\n\n// You need to add the following vm-parameter to run the test:\n// -javaagent:${project_loc:lombok}/dist/lombok.jar\n// When running inside eclipse's junit tester, you don't actually need to run 'ant dist' after updating code, though.\n\n@RunWith(DirectoryRunner.class)\npublic class TestWithEcj extends DirectoryRunner.TestParams {\n\t@Override\n\tpublic DirectoryRunner.Compiler getCompiler() {\n\t\treturn DirectoryRunner.Compiler.ECJ;\n\t}\n\t\n\t@Override\n\tpublic boolean printErrors() {\n\t\treturn true;\n\t}\n\t\n\t@Override\n\tpublic File getBeforeDirectory() {\n\t\treturn new File(\"test/transform/resource/before\");\n\t}\n\t\n\t@Override\n\tpublic File getAfterDirectory() {\n\t\treturn new File(\"test/transform/resource/after-ecj\");\n\t}\n\t\n\t@Override\n\tpublic File getMessagesDirectory() {\n\t\treturn new File(\"test/transform/resource/messages-ecj\");\n\t}\n\t\n\t@Override\n\tpublic boolean expectChanges() {\n\t\treturn true;\n\t}\n\t\n\t@Override public String testNamePrefix() {\n\t\treturn \"ecj-\";\n\t}\n}\n"
  },
  {
    "path": "website/extra/htaccess",
    "content": "RewriteEngine On\n\nRewriteRule ^$ /index.html [L,END]\nRewriteRule ^(index|home)(\\.html)?$ / [NC,R=301]\n\nRewriteRule ^setup/overview$ /setup/index.html [L,END]\nRewriteRule ^setup/overview(\\.html)?/?$ /setup/overview [NC,R=301]\nRewriteRule ^setup/main(\\.html)?/?$ /setup/overview [NC,R=301]\nRewriteRule ^setup/index(\\.html)?/?$ /setup/overview [NC,R=301]\nRewriteRule ^setup(/(overview/?)?)?$ /setup/overview [NC,R=301]\n\nRewriteRule ^changelog$ /changelog.html [L,END]\nRewriteRule ^changelog(\\.html)?/?$ /changelog [NC,R=301]\nRewriteRule ^credits$ /credits.html [L,END]\nRewriteRule ^credits(\\.html)?/?$ /credits [NC,R=301]\nRewriteRule ^download$ /download.html [L,END]\nRewriteRule ^download(\\.html)?/?$ /download [NC,R=301]\nRewriteRule ^download-edge$ /download-edge.html [L,END]\nRewriteRule ^download-edge(\\.html)?/?$ /download-edge [NC,R=301]\nRewriteRule ^all-versions$ /all-versions.html [L,END]\nRewriteRule ^all-versions(\\.html)?/?$ /all-versions [NC,R=301]\nRewriteRule ^all-versions$ /all-versions.html [L,END]\nRewriteRule ^all-versions(\\.html)?/?$ /all-versions [NC,R=301]\nRewriteRule ^disable-checked-exceptions$ /disable-checked-exceptions.html [L,END]\nRewriteRule ^disable-checked-exceptions(\\.html)?/?$ /disable-checked-exceptions [NC,R=301]\nRewriteRule ^supporters$ /supporters.html [L,END]\nRewriteRule ^supporters(.html)?/?$ /supporters [NC,R=301]\nRewriteRule ^security$ /security.html [L,END]\nRewriteRule ^security(.html)?/?$ /security [NC,R=301]\nRewriteRule ^contact$ /contact.html [L,END]\nRewriteRule ^contact(.html)?/?$ /contact [NC,R=301]\nRewriteRule ^order-license-info$ /order-license-info.html [L,END]\nRewriteRule ^order-?license-?info(.html)?/?$ /order-license-info [NC,R=301]\nRewriteRule ^order-license$ /order-license.html [L,END]\nRewriteRule ^order-?license(.html)?/?$ /order-license [NC,R=301]\n\nRewriteRule ^contributing/index$ /contributing/index.html [L,END]\nRewriteRule ^contributing(\\.html)?/?$ /contributing/index [NC,R=301]\nRewriteRule ^contributing/index(\\.html)?/?$ /contributing/index [NC,R=301]\nRewriteRule ^contributing/contributing$ /contributing/contributing.html [L,END]\nRewriteRule ^contributing/contributing(\\.html)?/?$ /contributing/contributing [NC,R=301]\nRewriteRule ^contributing/lombok-execution-path$ /contributing/lombok-execution-path.html [L,END]\nRewriteRule ^contributing/lombok-execution-path(\\.html)?/?$ /contributing/lombok-execution-path [NC,R=301]\n\n<#list setupPages as pg>\nRewriteRule ^setup/${pg?no_esc}$ /setup/${pg?no_esc}.html [L,END]\nRewriteRule ^setup/${pg?no_esc}(\\.html)?/?$ /setup/${pg?no_esc} [NC,R=301]\n</#list>\n\nRewriteRule ^features/all$ /features/index.html [L,END]\nRewriteRule ^features(/all)?/?$ /features/all [NC,R=301]\nRewriteRule ^features/index(\\.html)?/?$ /features/all [NC,R=301]\n\n<#list featurePages as pg>\nRewriteRule ^features/${pg?no_esc}$ /features/${pg?no_esc}.html [L,END]\nRewriteRule ^features/${pg?no_esc}(\\.html)?/?$ /features/${pg?no_esc} [NC,R=301]\n</#list>\n\nRewriteRule ^features/experimental/Builder(\\.html)?/?$ /features/Builder [NC,R=301]\nRewriteRule ^features/experimental/Value(\\.html)?/?$ /features/Value [NC,R=301]\nRewriteRule ^features/experimental/var(\\.html)?/?$ /features/var [NC,R=301]\nRewriteRule ^features/experimental/Wither(\\.html)?/?$ /features/With [NC,R=301]\n\nRewriteRule ^features/experimental/all$ /features/experimental/index.html [L,END]\nRewriteRule ^features/experimental(/all)?/?$ /features/experimental/all [NC,R=301]\nRewriteRule ^features/experimental/index(\\.html)?/?$ /features/experimental/all [NC,R=301]\n\n<#list experimentalPages as pg>\nRewriteRule ^features/experimental/${pg?no_esc}$ /features/experimental/${pg?no_esc}.html [L,END]\nRewriteRule ^features/experimental/${pg?no_esc}(\\.html)?/?$ /features/experimental/${pg?no_esc} [NC,R=301]\n</#list>\n\nRewriteRule ^presentations/7lessons$ /presentations/7lessons.html [L,END]\nRewriteRule ^presentations/7lessons(\\.html)?/?$ /presentations/7lessons [NC,R=301]\nRewriteRule ^presentations/7mistakes(\\.html)?/?$ /presentations/7lessons [NC,R=301]\n\nRewriteRule ^tidelift$ /tidelift.html [L,END]\nRewriteRule ^tidelift(\\.html)?/?$ /tidelift [NC,R=301]\n"
  },
  {
    "path": "website/resources/.well-known/security.txt",
    "content": "Contact: https://tidelift.com/security\nContact: mailto:security@projectlombok.org\nPreferred-Languages: en\nCanonical: https://projectlombok.org/.well-known/security.txt\nPolicy: https://tidelift.com/security\nPolicy: https://github.com/projectlombok/lombok/blob/master/SECURITY.md\n\n# If encrypted communication is required, let us know and we'll provide a public GPG key."
  },
  {
    "path": "website/resources/css/custom.css",
    "content": ".main-section a,\n.footer a {\n\ttext-decoration: underline;\n\ttext-underline-offset: 0.15em;\n\ttext-decoration-color: #d9230f20;\n}\n\n.main-section a:hover,\n.main-section a:focus,\n.footer a:hover,\n.footer a:focus {\n\ttext-decoration-color: #91170A;\n}\n\n.importantNotification {\n\tbackground-color: #FFEBCD;\n\tborder-radius: 20px;\n\tpadding: 10px;\n\tmargin: 10px;\n}\n\n.main-section .tidelift-link-inline {\n\tborder-radius: 18px;\n\tbackground-color: #626980;\n\tbackground-color: #626980;\n\tbackground-image: url('/img/tidelift-mark.png');\n\tbackground-repeat: no-repeat;\n\tbackground-position: 6px;\n\tbackground-size: 12px;\n\tpadding: 2px 8px 2px 26px;\n\tcolor: white;\n\ttext-decoration-color: #ffffff20;\n}\n\n.main-section .tidelift-link {\n\tborder-bottom-left-radius: 18px;\n\tborder-top-left-radius: 18px;\n\tbackground-color: #626980;\n\tbox-sizing: border-box;\n\tcolor: white;\n\tdisplay: flex;\n\ttop: 46px;\n\tright: 0px;\n\tposition: absolute;\n\tbackground-image: url('/img/tidelift-mark.png');\n\tbackground-repeat: no-repeat;\n\tbackground-position: 10px;\n\tbackground-size: 12px;\n\tpadding: 6px 12px 6px 28px;\n\ttext-decoration-color: #ffffff20;\n}\n\n.main-section .tidelift-link:focus,\n.main-section .tidelift-link-inline:focus,\n.main-section .tidelift-link:hover,\n.main-section .tidelift-link-inline:hover {\n\tcolor: white;\n\ttext-decoration-color: white;\n}\n\n#tideliftlink {\n\tmargin-left: 2px;\n\tpadding: 4px 6px 4px 20px;\n\tbackground-color: #4b5168;\n\tborder-radius: 5px;\n\tcolor: white;\n}\n\n#clickForVideo {\n\tcursor: pointer;\n\tmargin-left: auto;\n\tmargin-right: auto;\n}\n\npre {\n\ttext-align: left;\n}\n\n.tideliftb {\n\tborder-radius: 4px;\n\tborder: 2px solid #D9230F;\n\tfont-size: 28px;\n\twidth: 330px;\n\tline-height: 48px;\n\tdisplay: inline-block;\n\tmargin: 16px 0;\n\ttext-align: center;\n}\n\n.main-section a.tideliftb {\n\ttext-decoration: none;\n}\n\n.tideliftb1 {\n\tbackground-color: white;\n\tfloat: left;\n\tcolor: #D9230F;\n}\n\n.tideliftb1:hover {\n\tcolor: #D9230F;\n}\n\n.tideliftb2 {\n\tbackground-color: #D9230F;\n\tcolor: #FCFCFC;\n}\n\n.tideliftb2:hover {\n\tcolor: #FCFCFC;\n}\n\n.buttonLike {\n\tcursor: pointer;\n\tbackground: -webkit-linear-gradient(top, #FFFEF7, #CFCEC7);\n\tbackground: -moz-linear-gradient(top, #FFFEF7, #CFCEC7);\n\tbackground: -o-linear-gradient(#FFFEF7, #CFCEC7);\n\tbackground: -ms-linear-gradient(#FFFEF7, #CFCEC7);\n\tbackground: linear-gradient(top, #FFFEF7, #CFCEC7);\n\tline-height: 1;\n\tpadding: 3px 10px;\n\tborder: 1px solid black;\n\tposition: relative;\n\toverflow: visible;\n\tcolor: black;\n\tmargin: 2px;\n\tborder-radius: 5px;\n\tdisplay: inline-block;\n\ttext-align: center;\n}\n\n.orderButton {\n\twidth: 280px;\n}\n\n.orderDetails {\n\tfont-style: italic;\n\tfont-size: 10px;\n\tmargin-top: 20px;\n}\n\n.tidelift {\n\tfont-size: 16px;\n}\n\n.formErr {\n\tcolor: #FF7777;\n}\n\n.order-license #deleteCompanyLogo {\n\tmargin-top: 12px;\n}\n\n.formSubmitFail {\n\tcolor: #FF6666;\n\tfont-size: 1.2em;\n\tfont-style: italic;\n}\n\n.order-license .btn-primary {\n\tfloat: left;\n\tmargin-right: 20px;\n\tbackground: -webkit-linear-gradient(#1725e0, #0923df 6%, #0b21ce);\n\tbackground: -o-linear-gradient(#1725e0, #0923df 6%, #0b21ce);\n\tbackground: -webkit-gradient(linear, left top, left bottom, from(#1725e0), color-stop(6%, #0923df), to(#0b21ce));\n\tbackground: linear-gradient(#1725e0, #0923df 6%, #0b21ce);\n\tbackground-repeat: no-repeat;\n\tfilter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff1725e0', endColorstr='#ff0b21ce', GradientType=0);\n\t-webkit-filter: none;\n\tfilter: none;\n\tborder: 1px solid #091bac;\n}\n\n#onlyYearlyWarning {\n\tfont-size: 0.8em;\n\tpadding-left: 16px;\n}\n\n.deemphasize {\n\tcolor: #AAAAAA;\n\tfont-size: 0.8em;\n\tfont-style: italic;\n}\n\n.supporterBar .introText {\n\tmargin-top: 16px;\n}\n\n.barItem {\n\tmargin: 16px;\n\tmax-width: 168px;\n}\n\n.barItem img {\n\twidth: 100%;\n}\n\n.supportItem, .barItem {\n\tdisplay: inline-block;\n}\n\n.supporters .supportItem {\n\tmargin: 6px 10px;\n}\n\n.supporterBar {\n\twidth: 100%;\n\tmargin-left: auto;\n\tmargin-right: auto;\n}\n\n.errorBox {\n\tborder: 1px dashed #F44;\n\tfont-size: 1.2em;\n\tpadding: 20px;\n\tbackground-color: #EEE;\n\ttext-align: center;\n}\n\n.noSupportersBox {\n\tfont-size: 1.2em;\n\tpadding: 20px;\n\tbackground-color: #EEE;\n\ttext-align: center;\n}\n\n.spinner {\n\tdisplay: block;\n\tmargin-left: auto;\n\tmargin-right: auto;\n\twidth: 16px;\n\theight: 16px;\n}\n\n#companyLogo {\n\tmargin-right: 8px;\n}\n\nhtml {\n\tposition: relative;\n\tmin-height: 100%;\n}\n\nbody {\n\tmargin-bottom: 60px;\n\toverflow-y: scroll;\n}\n\nul.dropdown-menu .header {\n\tpadding-left: 10px;\n}\n\ndiv.snippet code {\n\tdisplay: inline-block;\n\tword-break: break-word;\n}\n\n\nol.snippet {\n\tbackground: repeat-y url(/img/line-numbers.png);\n\tpadding-left: 3em;\n\tlist-style-type: decimal;\n}\n\nol.snippet li {\n\tfont-size: 14px;\n\tfont-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n\tcolor: #9898A8;\n}\n\nol.snippet li code {\n\tword-break: break-word;\n\tpadding: 0;\n}\n\nol.snippet.oneliner, ol.snippet.cmd {\n\tlist-style-type: none;\n}\n\nol.snippet.oneliner li, ol.snippet.cmd li {\n\ttext-indent: -1.7em;\n}\n\nol.snippet.oneliner li:before {\n\tcontent: \"#\\A0\\A0\";\n}\n\nol.snippet.cmd li:before {\n\tcontent: \">\\A0\\A0\";\n}\n\nol.snippet li.continued {\n\tpadding-left: 2em;\n}\n\n.fork-me {\n\tposition: fixed;\n\twidth: 150px;\n\theight: 150px;\n\ttop: 0;\n\tright: 0;\n\tz-index: 2000;\n}\n\n.video {\n\tpadding-top: 4%;\n}\n\n.name {\n\tfont-weight: bold;\n}\n\n.bs-callout {\n\tpadding: 10px;\n\tmargin: 20px 0;\n\tborder: 1px solid #eee;\n\tborder-left-width: 5px;\n\tborder-radius: 3px;\n}\n\n.bs-callout h4 {\n\tmargin-top: 0;\n\tmargin-bottom: 5px;\n}\n\n.bs-callout p:last-child {\n\tmargin-bottom: 0;\n}\n\n.bs-callout code {\n\tborder-radius: 3px;\n}\n\n.bs-callout + .bs-callout {\n\tmargin-top: -5px;\n}\n\n.bs-callout-danger {\n\tborder-left-color: #ce4844;\n}\n\n.bs-callout-danger h4 {\n\tcolor: #ce4844;\n}\n\n.bs-callout-warning {\n\tborder-left-color: #aa6708;\n}\n\n.bs-callout-warning h4 {\n\tcolor: #aa6708;\n}\n\n.bs-callout-info {\n\tborder-left-color: #1b809e;\n}\n\n.bs-callout-info h4 {\n\tcolor: #1b809e;\n}\n\n.color-swatches {\n\tmargin: 0 -5px;\n\toverflow: hidden;\n}\n\n.footer {\n\tposition: absolute;\n\tbottom: 0;\n\theight: 60px;\n\tborder-top: 1px solid #eee;\n\tpadding-top: 15px;\n}\n\nh1, h2, h3 {\n\tpadding: 12px 40px;\n\ttext-align: center;\n}\n\n.page-center {\n\tpadding-top: 10%;\n\tpadding-bottom: 19%;\n}\n\n.page-header {\n\tborder-bottom: 0;\n}\n\n.header-group > h1, h2, h3 {\n\tpadding: 5px;\n}\n\n.snippet {\n\toverflow: auto;\n\tpadding: 4px;\n\tborder: 1px dotted #888;\n\ttext-align: left;\n}\n\n.snippet font {\n\twhite-space: pre;\n}\n\n.snippet code {\n\tfont-size: 14px;\n\tbackground-color: transparent;\n}\n\n.snippet.example {\n\tmargin: 8px 16px 8px 16px;\n}\n\n.snippet-col {\n\tposition: relative;\n\tmin-height: 1px;\n\tpadding-left: 15px;\n\tpadding-right: 15px;\n}\n\n@media (min-width: 769px) {\n\t.snippet-col {\n\t\tmargin-left: -60px;\n\t\tmargin-right: -60px;\n\t}\n}\n\n@media (min-width: 1000px) {\n\t.snippet-col {\n\t\tmargin-left: -120px;\n\t\tmargin-right: -120px;\n\t}\n}\n\na {\n\tcursor: pointer;\n}\n\n.main-section {\n\tpadding-left: 100px;\n\tpadding-right: 100px;\n\tmax-width: 900px;\n}\n\n.changelog li {\n\ttext-align: left;\n}\n\n@media (max-width: 767px) {\n\t.fork-me {\n\t\tdisplay: none;\n\t}\n\t\n\th1 {\n\t\tfont-size: 20px;\n\t}\n\t\n\th2 {\n\t\tfont-size: 18px;\n\t}\n\t\n\th3 {\n\t\tfont-size: 16px;\n\t}\n\t\n\t.main-section {\n\t\tpadding-left: 30px;\n\t\tpadding-right: 30px;\n\t}\n\t\n\tvideo {\n\t\twidth: 100%;\n\t\theight: auto;\n\t}\n\t\n\t.smallOnly {\n\t\tdisplay: block !important;\n\t}\n\t\n\t.wideOnly {\n\t\tdisplay: none !important;\n\t}\n}\n\n@media (min-width: 768px) {\n\t.smallOnly {\n\t\tdisplay: none !important;\n\t}\n\t\n\t.wideOnly {\n\t\tdisplay: block !important;\n\t}\n}\n\nimg {\n\tmax-width: 100%;\n\theight: auto;\n}\n\nh3.listHeader {\n\ttext-align: left;\n}\n\n/* A11y */\nbody {\n\tcolor: #555555;\n}\n.navbar-default .navbar-brand {\n\tcolor: #555555;\n}\n.navbar-default .navbar-nav>li>a {\n\tcolor: #555555;\n}\n.navbar-default .navbar-nav>li>a.dropdown-toggle:focus {\n\toutline: 1px auto Highlight;\n\toutline: 1px auto -webkit-focus-ring-color;\n}\n\n.bs-callout.bs-callout-danger h2 {\n\tmargin-top: 0;\n\tmargin-bottom: 5px;\n\ttext-align: start;\n\tfont-size: 17px;\n}\n\na:not([role=button]):focus {\n\toutline-offset: 2px;\n}\n\n.sbCnt {\n\tmin-height: 120px;\n\tdisplay: flex;\n\tjustify-content: space-around;\n\talign-items: center;\n}\n\n.sbCnt img {\n\tobject-fit: contain;\n}\n\n.sponsored {\n\tmargin: 1em 0;\n}\n\n.sponsored::before {\n\tcontent: \"Sponsored Content\";\n\tcolor: #AAAAAA;\n    font-size: 0.8em;\n    font-style: italic;\n\tmargin-bottom: 0.4em;\n}\n\n.sponsored blockquote {\n\tpadding: 0 1em;\n}\n\n.main-section .sponsored a {\n\tcolor: #008800;\n\ttext-decoration-color: currentcolor;\n}\n\n.main-section .sponsored a:hover {\n\tcolor: #008800;\n\ttext-decoration-color: currentcolor;\n}\n"
  },
  {
    "path": "website/resources/files/supporters.json",
    "content": "{\n\t\"modWeight\": {\n\t\t\"professional\": 2.0,\n\t\t\"enterprise\": 4.0,\n\t\t\"patron\": 1.0\n\t},\n\t\"professional\": [\n\t],\n\t\"enterprise\": [\n\t],\n\t\"patron\": [\n\t]\n}\n"
  },
  {
    "path": "website/resources/js/main.js",
    "content": "\"use strict\";\n\n(function($) {\n\tfunction clickForVideo() {\n\t\tvar cfv = $(\"#clickForVideo\");\n\t\tvar f = function() {\n\t\t\tif (!cfv.is(\":visible\")) return;\n\t\t\tcfv.hide();\n\t\t\t$(\"#demoVideo\").show().get(0).play();\n\t\t};\n\t\t\n\t\tcfv.css(\"cursor\", \"pointer\").on(\"click\", f).on(\"touchstart\", function() {\n\t\t\t$(this).data(\"moved\", 0);\n\t\t}).on(\"touchmove\", function() {\n\t\t\t$(this).data(\"moved\", 1);\n\t\t}).on(\"touchend\", function() {\n\t\t\tif ($(this).data(\"moved\") === 0) f();\n\t\t});\n\t}\n\n\tfunction seekVideo() {\n\t\tvar t = window.location.hash;\n\t\tif (!t) return;\n\t\tvar s = /^#?(?:(\\d\\d?):)?(\\d\\d?):(\\d\\d?)$/.exec(t);\n\t\tif (!s) return;\n\t\tvar videoj = $(\"#presentationVideo\");\n\t\tif (!videoj || videoj.length == 0) return;\n\t\tvar video = videoj[0];\n\t\tvar h = parseInt(s[1]);\n\t\tif (!h) h = 0;\n\t\tvar m = parseInt(s[2]);\n\t\tvar s = parseInt(s[3]);\n\t\tvideo.currentTime = (((h * 60) + m) * 60) + s;\n\t}\n\n\tfunction aButtonsRespondToSpacebar() {\n\t\t$('a[role=\"button\"]').keyup(function(e) {\n\t\t\tif (e.which == 32) e.target.click();\n\t\t});\n\t}\n\n\t$(clickForVideo);\n\t$(seekVideo);\n\t$(aButtonsRespondToSpacebar);\n})($);\n"
  },
  {
    "path": "website/resources/js/order-license.js",
    "content": "\"use strict\";\n\n(function() {\n\tif (!String.prototype.trim) {\n\t\tString.prototype.trim = function () {\n\t\t\treturn this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\t\t};\n\t}\n\t\n\tvar imgDataUrl = null;\n\t\n\tfunction updateLocationInfo() {\n\t\tvar locationType = $(\"input:radio[name='locationType']:checked\").val();\n\t\t$(\"#locationType_usa\").toggle(locationType === \"usa\");\n\t\t$(\"#locationType_eu\").toggle(locationType === \"eu\");\n\t\t$(\"#locationType_other\").toggle(locationType === \"other\");\n\t\t$(\"#paymentMethod_iban\").toggle(locationType === \"eu\");\n\t\tif ($(\"#paymentMethod_iban input\").is(\":checked\") && locationType !== \"eu\") $(\"#paymentMethod_stripe input\").prop(\"checked\", true);\n\t\tif ($(\"#paymentMethod_intl input\").is(\":checked\") && locationType === \"eu\") $(\"#paymentMethod_iban input\").prop(\"checked\", true);\n\t\t$(\"#paymentMethod_intl\").toggle(locationType !== \"eu\");\n\t}\n\t\n\tfunction updatePriceIndication() {\n\t\t$(\"#onlyYearlyWarning\").hide();\n\t\tvar x = getPriceIndication();\n\t\tif (x === \"\") {\n\t\t\t$(\"#costIndicator\").text(\"\").hide();\n\t\t} else {\n\t\t\t$(\"#costIndicator\").text(x).show();\n\t\t}\n\t}\n\t\n\tfunction getPriceIndication() {\n\t\ttry {\n\t\t\tvar seats = parseInt($(\"#seats\").val());\n\t\t\tif (isNaN(seats) || seats < 1) return \"\";\n\t\t\tvar licenseType = $(\"input:radio[name='licenseType']:checked\").val();\n\t\t\tvar costPer;\n\t\t\tif (licenseType === \"enterprise\") costPer = 5;\n\t\t\telse if (licenseType === \"professional\") costPer = 2;\n\t\t\telse return \"\";\n\t\t\tvar periodRaw = $(\"input:radio[name='paymentType']:checked\").val();\n\t\t\tif (periodRaw === \"monthly\") {\n\t\t\t\tif (costPer*seats < 50) {\n\t\t\t\t\t$(\"#onlyYearlyWarning\").show();\n\t\t\t\t\treturn \"Your license will cost €\" + (costPer*seats*12) + \",- per year.\";\n\t\t\t\t}\n\t\t\t\treturn \"Your license will cost €\" + (costPer*seats) + \",- per month.\";\n\t\t\t}\n\t\t\treturn \"Your license will cost €\" + (costPer*seats*12) + \",- per year.\";\n\t\t} catch (e) {\n\t\t\treturn \"\";\n\t\t}\n\t}\n\t\n\tfunction showError(elemName) {\n\t\tvar elem = $(\"#\" + elemName + \"Err\");\n\t\telem.fadeIn();\n\t\t$(\"#\" + elemName).on(\"change keyup\", function() {\n\t\t\telem.hide();\n\t\t});\n\t}\n\t\n\tfunction applyLicense() {\n\t\tvar submitButton = $(\"#submit\");\n\t\tvar spinner = $(\"<img>\").attr(\"src\", \"/img/spinner.gif\").attr(\"alt\", \"submitting\").css(\"float\", \"left\").css(\"margin-right\", \"20px\");\n\t\t\n\t\tsubmitButton.on(\"click\", function(evt) {\n\t\t\tevt.preventDefault();\n\t\t\t\n\t\t\tvar onSuccess = function() {\n\t\t\t\t$(\"#orderHelp\").hide();\n\t\t\t\tvar okMsg = $(\"<div>\").addClass(\"formSubmitOk\").html(\"Thank you for ordering a Project Lombok license! We'll send your bill via email. If you have any further questions please contact us at <a href=\\\"mailto:orders@projectlombok.org\\\"><code>orders@projectlombok.org</code></a>.\");\n\t\t\t\tspinner.replaceWith(okMsg);\n\t\t\t};\n\t\t\t\n\t\t\tvar onFailure = function() {\n\t\t\t\t$(\"#orderHelp\").hide();\n\t\t\t\tvar errMsg = $(\"<div>\").addClass(\"formSubmitFail\").html(\"Our order form appears to be broken. Could you do us a favour and contact us at <a href=\\\"mailto:orders@projectlombok.org\\\"><code>orders@projectlombok.org</code></a>? Thank you!\");\n\t\t\t\tspinner.replaceWith(errMsg);\n\t\t\t};\n\t\t\t\n\t\t\tvar data = {};\n\t\t\tdata.name = $(\"#companyName\").val();\n\t\t\tdata.email = $(\"#email\").val();\n\t\t\tdata.licenseType = $(\"input:radio[name='licenseType']:checked\").val();\n\t\t\tdata.seats = parseInt($(\"#seats\").val());\n\t\t\tdata.paymentType = $(\"input:radio[name='paymentType']:checked\").val();\n\t\t\tdata.mentionMe = $(\"#mentionMe\").prop(\"checked\");\n\t\t\tdata.companyUrl = $(\"#companyUrl\").val();\n\t\t\tdata.locationType = $(\"input:radio[name='locationType']:checked\").val();\n\t\t\tdata.euVat = $(\"#euVat\").val();\n\t\t\tdata.paymentMethod = $(\"input:radio[name='paymentMethod']:checked\").val();\n\t\t\t\n\t\t\tvar formFail = false;\n\t\t\t\n\t\t\tif (!data.paymentMethod) {\n\t\t\t\tshowError(\"paymentMethod\");\n\t\t\t\tformFail = true;\n\t\t\t}\n\t\t\t\n\t\t\tif (!data.euVat && data.locationType === 'eu') {\n\t\t\t\t$(\"#euVat\").focus();\n\t\t\t\tshowError(\"euVat\");\n\t\t\t\tformFail = true;\n\t\t\t}\n\t\t\t\n\t\t\tif (!data.locationType) {\n\t\t\t\tshowError(\"locationType\");\n\t\t\t\tformFail = true;\n\t\t\t}\n\t\t\t\n\t\t\tif (!data.seats || isNaN(data.seats) || data.seats < 10) {\n\t\t\t\t$(\"#seats\").focus();\n\t\t\t\tshowError(\"seats\");\n\t\t\t\tformFail = true;\n\t\t\t}\n\t\t\t\n\t\t\tif (!data.paymentType) {\n\t\t\t\tshowError(\"paymentType\");\n\t\t\t\tformFail = true;\n\t\t\t}\n\t\t\t\n\t\t\tif (data.email.indexOf('@') === -1) {\n\t\t\t\t$(\"#email\").focus();\n\t\t\t\tshowError(\"email\");\n\t\t\t\tformFail = true;\n\t\t\t}\n\t\t\t\n\t\t\tif (data.name.trim().length < 1) {\n\t\t\t\t$(\"#companyName\").focus();\n\t\t\t\tshowError(\"companyName\");\n\t\t\t\tformFail = true;\n\t\t\t}\n\t\t\t\n\t\t\tif (formFail) return;\n\t\t\t\n\t\t\tvar rnd = generateRandom();\n\t\t\tvar err = processImageUpload();\n\t\t\tif (err) {\n\t\t\t\talert(err);\n\t\t\t\t$(\"#logo\")[0].value = null;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (imgDataUrl) data.logo = imgDataUrl;\n\t\t\t\n\t\t\tsubmitButton.replaceWith(spinner);\n\t\t\t\n\t\t\t$.ajax({\n\t\t\t\turl: \"/license-submit/\" + rnd,\n\t\t\t\tmethod: \"PUT\",\n\t\t\t\tcontentType: \"application/json\",\n\t\t\t\tdata: JSON.stringify(data),\n\t\t\t\tprocessData: false,\n\t\t\t\tsuccess: onSuccess,\n\t\t\t\terror: onFailure\n\t\t\t});\n\t\t});\n\t\t\n\t\t$(\"#companyLogo\").on(\"click\", function(evt) {\n\t\t\tevt.preventDefault();\n\t\t\t$(\"#logo\").click();\n\t\t});\n\t\t\n\t\t$(\"#deleteCompanyLogo\").on(\"click\", function(evt) {\n\t\t\tevt.preventDefault();\n\t\t\t$(\"#logo\")[0].value = null;\n\t\t\t$(\"#logoCnt\").empty().hide();\n\t\t\t$(\"#companyLogo\").show();\n\t\t\t$(\"#deleteCompanyLogo\").hide();\n\t\t});\n\t\t\n\t\t$(\"#logo\").on(\"change\", function() {\n\t\t\tvar err = showImage();\n\t\t\tif (err) {\n\t\t\t\talert(err);\n\t\t\t\t$(\"#logo\")[0].value = null;\n\t\t\t} else {\n\t\t\t\t$(\"#companyLogo\").hide();\n\t\t\t\t$(\"#deleteCompanyLogo\").show();\n\t\t\t}\n\t\t});\n\t\t\n\t\t$(\"#seats,.paymentType,.licenseType\").on(\"change keyup\", function() {\n\t\t\tupdatePriceIndication();\n\t\t});\n\t\t$(\".locationType\").on(\"change\", function() {\n\t\t\tupdateLocationInfo();\n\t\t});\n\t}\n\t\n\tfunction generateRandom() {\n\t\tvar buf = new Uint8Array(40);\n\t\twindow.crypto.getRandomValues(buf);\n\t\treturn btoa(String.fromCharCode.apply(null, buf)).replace(/\\+/g, '_').replace(/\\//gi, '-');\n\t}\n\t\n\tfunction showImage() {\n\t\t$(\"#logoCnt\").empty().hide();\n\t\ttry {\n\t\t\treturn processImageUpload(function(dataUrl) {\n\t\t\t\tvar img = $(\"<img />\");\n\t\t\t\timg.css({\n\t\t\t\t\t\"max-width\": \"500px\",\n\t\t\t\t\t\"max-height\": \"300px\"\n\t\t\t\t});\n\t\t\t\t$(\"#logoCnt\").append(img).show();\n\t\t\t\timg.attr(\"src\", dataUrl);\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tif (console && console.log) console.log(e);\n\t\t}\n\t}\n\t\n\tfunction processImageUpload(fnc) {\n\t\tvar f = $(\"#logo\")[0].files[0];\n\t\tif (!f) return;\n\t\tif (f.size > 10000000) return \"Logo too large; please give us a logo below 10MiB in size.\";\n\t\tvar imageType = /^image\\//;\n\t\tif (!imageType.test(f.type)) return \"Please upload an image, for example in PNG format.\";\n\t\tvar reader = new FileReader();\n\t\treader.onload = function(e) {\n\t\t\timgDataUrl = e.target.result;\n\t\t\tif (fnc) fnc(e.target.result);\n\t\t};\n\t\treader.readAsDataURL(f);\n\t\treturn null;\n\t}\n\t\n\t$(applyLicense);\n})();\n"
  },
  {
    "path": "website/resources/js/supporters.js",
    "content": "\"use strict\";\n\n(function($) {\n\tvar supporters = {};\n\tvar weights = {};\n\tvar types = [\"enterprise\", \"professional\", \"patron\"];\n\t\n\tfunction shuffle(array) {\n\t\tvar i = 0, j = 0, temp = null;\n\t\tfor (i = array.length - 1; i > 0; i -= 1) {\n\t\t\tj = Math.floor(Math.random() * (i + 1));\n\t\t\ttemp = array[i];\n\t\t\tarray[i] = array[j];\n\t\t\tarray[j] = temp;\n\t\t}\n\t}\n\t\n\tfunction pad(number) {\n\t\treturn number < 10 ? '0' + number : number;\n\t}\n\t\n\tfunction fromDate(d) {\n\t\treturn d.getUTCFullYear() + '-' + pad(d.getUTCMonth() + 1) + '-' + pad(d.getUTCDate());\n\t\t\n\t}\n\t\n\tfunction toDate(s) {\n\t\tvar x = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(s);\n\t\tif (x) return new Date(parseInt(x[1]), parseInt(x[2]) - 1, parseInt(x[3]));\n\t\treturn null;\n\t}\n\t\n\tfunction Supporter(type, json) {\n\t\tthis.type = type;\n\t\tthis.name = json.name;\n\t\tthis.logo = json.logo;\n\t\tthis.url = json.url;\n\t\tthis.showName = json.showName;\n\t\tthis.start = json.range ? toDate(json.range[0]) : null;\n\t\tthis.end = json.range ? toDate(json.range[1]) : null;\n\t\tthis.weight = (!json.weight && json.weight !== 0.0) ? 1.0 : json.weight;\n\t}\n\t\n\tSupporter.prototype.inRange = function(d) {\n\t\treturn (!this.start || this.start <= d) && (!this.end || this.end > d);\n\t};\n\t\n\tSupporter.prototype.render = function() {\n\t\tvar d = $(\"<div />\").addClass(\"supportItem\").addClass(this.type);\n\t\tvar a = d;\n\t\tif (this.url) {\n\t\t\ta = $(\"<a />\").attr(\"href\", this.url).attr(\"rel\", \"noopener\").attr(\"target\", \"_blank\");\n\t\t\td.append(a);\n\t\t}\n\t\tvar n = $(\"<span />\").text(this.name);\n\t\ta.append(n);\n\t\t\n\t\tif (this.logo) {\n\t\t\ta.addClass(\"logo\");\n\t\t\tvar i = new Image();\n\t\t\tvar showName = this.showName;\n\t\t\ti.onload = function() {\n\t\t\t\tvar w = i.width;\n\t\t\t\tvar h = i.height;\n\t\t\t\tvar wf = w / 162;\n\t\t\t\tvar hf = h / 80;\n\t\t\t\tvar f = hf > wf ? hf : wf;\n\t\t\t\tvar wt = Math.round(w / f);\n\t\t\t\tvar ht = Math.round(h / f);\n\t\t\t\ti.width = wt;\n\t\t\t\ti.height = ht;\n\t\t\t\tvar ji = $(i);\n\t\t\t\tif (!showName) a.empty();\n\t\t\t\tji.css(\"width\", wt + \"px\");\n\t\t\t\tji.css(\"height\", ht + \"px\");\n\t\t\t\tji.attr(\"alt\", n.text());\n\t\t\t\tji.attr(\"title\", n.text());\n\t\t\t\ta.prepend(ji);\n\t\t\t};\n\t\t\ti.src = '/files/' + this.logo;\n\t\t}\n\t\treturn d;\n\t}\n\t\n\tfunction errorHandler(xhr, statusText, err) {\n\t\tvar errMsg = \"Can't connect to projectlombok.org to fetch the list of licensees and supporters.\";\n\t\tif (console && console.log) {\n\t\t\tconsole.log(\"AJAX error for loading list of supporters:\");\n\t\t\tconsole.log(err);\n\t\t}\n\t\tvar errBox = $(\"<div />\").addClass(\"errorBox\").text(errMsg);\n\t\t$(\".supporters\").text(\"\").append(errBox);\n\t}\n\t\n\tfunction successHandler(data) {\n\t\t$.each(types, function() {\n\t\t\tvar t = this;\n\t\t\tsupporters[t] = [];\n\t\t\tif (data && data[t]) $.each(data[t], function() {\n\t\t\t\tsupporters[t].push(new Supporter(t, this));\n\t\t\t});\n\t\t});\n\t\tweights = data.modWeight;\n\t\tif (typeof weights !== 'object') weights = {};\n\t\tupdatePage();\n\t}\n\t\n\tfunction build() {\n\t\tvar spinner = $(\"<img />\").attr(\"title\", \"loading\").attr(\"src\", \"/img/spinner.gif\").addClass(\"spinner\");\n\t\t$(\".supporters\").append(spinner);\n\t\t$.ajax({\n\t\t\turl: \"/files/supporters.json\",\n\t\t\tdataType: \"json\",\n\t\t\tcache: true,\n\t\t\terror: errorHandler,\n\t\t\tsuccess: function(data) {\n\t\t\t\tspinner.remove();\n\t\t\t\tsuccessHandler(data);\n\t\t\t}\n\t\t});\n\t}\n\t\n\tfunction applySupporters() {\n\t\tbuild();\n\t}\n\t\n\tfunction updatePage() {\n\t\tupdateSupporters();\n\t\tupdateSupporterBar();\n\t}\n\t\n\tvar supPerBar = 3;\n\tfunction updateSupporterBar() {\n\t\tvar s = $(\".supporterBar\");\n\t\tif (s.length === 0) return;\n\t\ts.find(\".introText\").show();\n\t\ts.append($(\"<div />\").addClass(\"sbCnt\"));\n\t\tvar sf = s.find(\".supporterFooter\").show();\n\t\ts.append(sf);\n\t\ts = s.find(\".sbCnt\");\n\t\tvar now = new Date();\n\t\tvar list = [];\n\t\t$.each(types, function() {\n\t\t\tvar t = this;\n\t\t\t$.each(supporters[t], function() {\n\t\t\t\tif (this.inRange(now)) {\n\t\t\t\t\tvar w = weights[t] ? weights[t] : 1.0;\n\t\t\t\t\tif (this.weight) w = w * this.weight;\n\t\t\t\t\tfor (var i = 0; i < w; i++) list.push(this);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\t\n\t\tshuffle(list);\n\t\t\n\t\tvar len = list.length;\n\t\tif (!len) return;\n\t\t\n\t\tvar pos = 0;\n\t\tvar c = [], cd = [];\n\t\tfor (var i = 0; i < supPerBar; i++) {\n\t\t\tc[i] = null;\n\t\t\tcd[i] = $(\"<div />\").addClass(\"barItem\");\n\t\t}\n\t\t\n\t\tvar upd = function() {\n\t\t\tvar nw = [], a = [], fo = $(), fi = $();\n\t\t\tvar sPos = pos;\n\t\t\tfor (var i = 0; i < supPerBar; i++) {\n\t\t\t\tif (++pos === len) pos = 0;\n\t\t\t\tvar z = false;\n\t\t\t\tfor (var j = 0; j < i; j++) if (nw[j] === list[pos]) z = true;\n\t\t\t\tif (z) i--;\n\t\t\t\telse nw[i] = list[pos];\n\t\t\t\tif (pos === sPos) break;\n\t\t\t}\n\t\t\tfor (var i = 0; i < supPerBar; i++) a[i] = (nw[i] === c[i] || !nw[i]) ? null : nw[i].render(i + 1).hide();\n\t\t\tfor (var i = 0; i < supPerBar; i++) {\n\t\t\t\tif (a[i]) {\n\t\t\t\t\tfi = fi.add(a[i]);\n\t\t\t\t\tfo = fo.add(cd[i].children());\n\t\t\t\t\tif (cd[i].parent().length === 0) s.append(cd[i]);\n\t\t\t\t\tcd[i].append(a[i]);\n\t\t\t\t\tc[i] = nw[i];\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (fo.length === 0) fi.fadeIn();\n\t\t\telse {\n\t\t\t\tfo.fadeOut(\"normal\", function() {\n\t\t\t\t\tfi.fadeIn();\n\t\t\t\t\tfo.remove();\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t\t\n\t\tsetInterval(upd, 10000);\n\t\tupd();\n\t}\n\t\n\tfunction updateSupporters() {\n\t\tvar s = $(\".supporters\");\n\t\ts.empty();\n\t\tvar now = new Date();\n\t\t$.each(types, function() {\n\t\t\tvar t = this;\n\t\t\tvar d = $(\"<div />\").addClass(\"row\");\n\t\t\tvar h = $(\"<h2 />\").text(t);\n\t\t\td.append(h);\n\t\t\t$.each(supporters[t], function() {\n\t\t\t\tif (this.inRange(now)) d.append(this.render());\n\t\t\t});\n\t\t\tif (d.children().length > 1) s.append(d);\n\t\t});\n\t\tif (s.children().length < 1) {\n\t\t\tvar x = $(\"<div />\").addClass(\"noSupportersBox\").html(\n\t\t\t\t\"We don't have any supporters yet this month.<br /><a href=\\\"https://patreon.com/lombok\\\">Become a patron</a> \" +\n\t\t\t\t\"or <a href=\\\"/order-license-info\\\">order a professional or enterprise license</a> today!\");\n\t\t\ts.append(x);\n\t\t}\n\t}\n\t\n\t$(applySupporters);\n})($);"
  },
  {
    "path": "website/resources/robots.txt",
    "content": "User-Agent: *\nDisallow: /tmp/\n"
  },
  {
    "path": "website/templates/_download-edge.html",
    "content": "<#import \"/_scaffold.html\" as main>\n<@main.scaffold title=\"snapshot\">\n\t<div class=\"page-header top5\">\n\t\t<div class=\"row text-center versionInfo\">\n\t\t\t<@main.h1 title=\"Download 'Edgy Guinea Pig' - the Lombok Cutting Edge build\" />\n\t\t</div><div class=\"row versionInfo\">\n\t\t\tversion: ${version} (${timestampString})\n\t\t</div><div class=\"row\" id=\"changelog\">\n\t\t\t${changelogEdge?no_esc}\n\t\t</div><div class=\"row text-center\">\n\t\t\t<h2><a href=\"/lombok-edge.jar\" id=\"downloadLink\">Download edge release now!</a></h2>\n\t\t\t<p class=\"text-left\">\n\t\t\t\tYou can use the edge release from maven using the projectlombok.org repository.\n\t\t\t\tThis requires:\n\t\t\t</p>\n\t\t\t<ul class=\"text-left\">\n\t\t\t\t\t<li>Adding the lombok maven repository to your <code>repositories</code> section</li>\n\t\t\t\t\t<li>Adding lombok as a dependency to your project in the <code>dependencies</code> section, specifying version <code>edge-SNAPSHOT</code>.</li>\n\t\t\t\t\t<li>Adding lombok as an annotation processor in the <code>annotationProcessorPaths</code> section, specifying version <code>edge-SNAPSHOT</code>.</li>\n\t\t\t</ul>\n\t\t\t<p>\n\t\t\t\tThese sections in your pom file should look like this:\n\t\t\t</p>\n<pre>\n&lt;repositories&gt;\n\t&lt;repository&gt;\n\t\t&lt;id&gt;projectlombok.org&lt;/id&gt;\n\t\t&lt;url&gt;https://projectlombok.org/edge-releases&lt;/url&gt;\n\t&lt;/repository&gt;\n&lt;/repositories&gt;</pre>\n<pre>\n&lt;dependencies&gt;\n\t&lt;dependency&gt;\n\t\t&lt;groupId&gt;org.projectlombok&lt;/groupId&gt;\n\t\t&lt;artifactId&gt;lombok&lt;/artifactId&gt;\n\t\t&lt;version&gt;edge-SNAPSHOT&lt;/version&gt;\n\t\t&lt;scope&gt;provided&lt;/scope&gt;\n\t&lt;/dependency&gt;\n&lt;/dependencies&gt;</pre>\n<pre>\n&lt;build&gt;\n\t&lt;plugins&gt;\n\t\t&lt;plugin&gt;\n\t\t\t&lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;\n\t\t\t&lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;\n\t\t\t&lt;configuration&gt;\n\t\t\t\t&lt;annotationProcessorPaths&gt;\n\t\t\t\t\t&lt;path&gt;\n\t\t\t\t\t\t&lt;groupId&gt;org.projectlombok&lt;/groupId&gt;\n\t\t\t\t\t\t&lt;artifactId&gt;lombok&lt;/artifactId&gt;\n\t\t\t\t\t\t&lt;version&gt;edge-SNAPSHOT&lt;/version&gt;\n\t\t\t\t\t&lt;/path&gt;\n\t\t\t\t&lt;/annotationProcessorPaths&gt;\n\t\t\t&lt;/configuration&gt;\n\t\t&lt;/plugin&gt;\n\t&lt;/plugins&gt;\n&lt;/build&gt;</pre>\n\t\t\t\n\t\t\t<p>\n\t\t\t\tYou can use the edge release from gradle using the projectlombok.org repository:\n\t\t\t</p>\n<pre>\nrepositories {\n\tmavenCentral()\n\tmaven { url 'https://projectlombok.org/edge-releases' }\n}\n\nplugins {\n\tid 'net.ltgt.apt' version '0.10'\n}\n\ndependencies {\n\tcompileOnly 'org.projectlombok:lombok:edge-SNAPSHOT'\n\t\n\tapt 'org.projectlombok:lombok:edge-SNAPSHOT'\n}</pre>\n\t\t</div><div class=\"row text-center\">\n\t\t\t<p>\n\t\t\t\tCutting edge a bit too gutsy for you? You can grab the <a href=\"download.html\">stable release</a> instead.\n\t\t\t</p>\n\t\t</div>\n\t</div>\n</@main.scaffold>\n"
  },
  {
    "path": "website/templates/_scaffold.html",
    "content": "<#macro feature title href>\n\t<div class=\"bs-callout bs-callout-danger\">\n\t\t<h2><a href=\"${href}\"><code>${title}</code></a></h2>\n\t\t<p><#nested></p>\n\t</div>\n</#macro>\n\n<#assign setupTargets = {\n\t\"Compilers\": {\n\t\t\"Javac\": \"javac\",\n\t\t\"ECJ\": \"ecj\"\n\t},\n\t\"Build tools\": {\n\t\t\"maven\": \"maven\",\n\t\t\"gradle\": \"gradle\",\n\t\t\"ant\": \"ant\",\n\t\t\"kobalt\": \"kobalt\"\n\t},\n\t\"IDEs\": {\n\t\t\"Eclipse\": \"eclipse\",\n\t\t\"IntelliJ IDEA\": \"intellij\",\n\t\t\"Netbeans\": \"netbeans\",\n\t\t\"MyEclipse\": \"eclipse\",\n\t\t\"Spring Tool Suite\": \"eclipse\",\n\t\t\"JBoss Developer Studio\": \"eclipse\",\n\t\t\"Visual Studio Code\": \"vscode\"\n\t},\n\t\"Platforms\": {\n\t\t\"Android\": \"android\",\n\t\t\"GWT\": \"gwt\"\n\t}\n}>\n\n<#macro scaffold load=[] title='Project Lombok'>\n\t<!DOCTYPE html>\n\t<html lang=\"en\">\n\t<head>\n\t\t<meta charset=\"utf-8\" />\n\t\t<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\" />\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n\t\t<link href=\"/favicon.ico\" rel=\"icon\" type=\"image/x-icon\" />\n\n\t\t<title>${title}</title>\n\n\t\t<script src=\"https://cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js\" integrity=\"sha512-3n19xznO0ubPpSwYCRRBgHh63DrV+bdZfHK52b1esvId4GsfwStQNPJFjeQos2h3JwCmZl0/LgLxSKMAI55hgw==\" crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n\n\t\t<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/bootswatch/3.4.0/simplex/bootstrap.min.css\" integrity=\"sha512-0FG7nV64qlyGMQHtk7WOzPY1NZ6SKmjNee+PMX/7xbJu8Qx6LlHhCjSj9hRDJQ6QnlFsUrcKHKxli/9z4uhHrA==\" crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\" />\n\t\t<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css\" integrity=\"sha512-SfTiTlX6kk+qitfevl/7LibUOeJWlt9rbyDn92a1DqWOw9vWG2MFoays0sgObmWazO5BQPiFucnnEAjpAB+/Sw==\" crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\" />\n\t\t<link href=\"/css/custom.css\" rel=\"stylesheet\" />\n\n\t\t<#list load as ld>\n\t\t\t<#if ld?ends_with(\".css\")>\n\t\t\t\t<link href=\"${ld?url_path}\" rel=\"stylesheet\" />\n\t\t\t</#if>\n\t\t</#list>\n\t\t<script src=\"https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js\" integrity=\"sha512-894YE6QWD5I59HgZOGReFYm4dnWc1Qt5NtvYSaNcOP+u1T9qYdvdihz0PPSiiqn/+/3e7Jo4EaG7TubfWGUrMQ==\" crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n\t\t<script src=\"https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.1/js/bootstrap.min.js\" integrity=\"sha512-UR25UO94eTnCVwjbXozyeVd6ZqpaAE9naiEUBK/A+QDbfSTQFhPGj5lOR6d8tsgbBk84Ggb5A3EkjsOgPRPcKA==\" crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n\t\t<script src=\"/js/main.js\"></script>\n\t\t<#list load as ld>\n\t\t\t<#if ld?ends_with(\".js\")>\n\t\t\t\t<script src=\"${ld?url_path}\"></script>\n\t\t\t</#if>\n\t\t</#list>\n\t</head><body>\n\t\t<div class=\"navbar navbar-default navbar-fixed-top\">\n\t\t\t<div class=\"container\">\n\t\t\t\t<div class=\"navbar-header\">\n\t\t\t\t\t<a href=\"/\" class=\"navbar-brand\" role=\"button\">Project Lombok</a>\n\t\t\t\t\t<button class=\"navbar-toggle\" type=\"button\" data-toggle=\"collapse\" data-target=\"#navbar-main\" aria-label=\"Open Menu\">\n\t\t\t\t\t\t<span class=\"icon-bar\"></span>\n\t\t\t\t\t\t<span class=\"icon-bar\"></span>\n\t\t\t\t\t\t<span class=\"icon-bar\"></span>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"navbar-collapse collapse\" id=\"navbar-main\">\n\t\t\t\t\t<ul class=\"nav navbar-nav\">\n\t\t\t\t\t\t<li class=\"dropdown\">\n\t\t\t\t\t\t\t<a class=\"dropdown-toggle pointer\" data-toggle=\"dropdown\" href=\"#\" role=\"button\">Features<span class=\"caret\"></span></a>\n\t\t\t\t\t\t\t<ul class=\"dropdown-menu\" aria-labelledby=\"themes\">\n\t\t\t\t\t\t\t\t<li><a href=\"/features/all\">Stable</a></li>\n\t\t\t\t\t\t\t\t<li><a href=\"/features/experimental/all\">Experimental</a></li>\n\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li class=\"dropdown\">\n\t\t\t\t\t\t\t<a class=\"dropdown-toggle pointer\" data-toggle=\"dropdown\" href=\"#\" role=\"button\">Community<span class=\"caret\"></span></a>\n\t\t\t\t\t\t\t<ul class=\"dropdown-menu\" aria-labelledby=\"themes\">\n\t\t\t\t\t\t\t\t<li><a href=\"https://groups.google.com/group/project-lombok\">Discuss / Help</a></li>\n\t\t\t\t\t\t\t\t<li><a href=\"https://github.com/projectlombok/lombok/issues\">Issues</a></li>\n\t\t\t\t\t\t\t\t<li><a href=\"/contributing/index\">Documentation for contributors</a></li>\n\t\t\t\t\t\t\t\t<li><a href=\"/contact\">Contact the team behind Project Lombok</a></li>\n\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t<a href=\"/order-license-info\" role=\"button\">\n\t\t\t\t\t\t\t\t<span>Order / Donate</span>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li class=\"dropdown\">\n\t\t\t\t\t\t\t<a href=\"/setup/overview\" class=\"smallOnly\" role=\"button\"><span>How to use</span></a>\n\t\t\t\t\t\t\t<a class=\"dropdown-toggle pointer wideOnly\" data-toggle=\"dropdown\" href=\"#\" role=\"button\">Install<span class=\"caret\"></span></a>\n\t\t\t\t\t\t\t<ul class=\"dropdown-menu\" aria-labelledby=\"themes\">\n\t\t\t\t\t\t\t\t<#list setupTargets as cat, tgtList>\n\t\t\t\t\t\t\t\t\t<li class=\"header\">${cat}</li>\n\t\t\t\t\t\t\t\t\t<#list tgtList as name, url>\n\t\t\t\t\t\t\t\t\t\t<li class=\"target\"><a href=\"/setup/${url}\" role=\"button\">${name}</a></li>\n\t\t\t\t\t\t\t\t\t</#list>\n\t\t\t\t\t\t\t\t\t<#sep><li class=\"divider\"></li></#sep>\n\t\t\t\t\t\t\t\t</#list>\n\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li><a href=\"/download\" role=\"button\">Download</a></li>\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"container-fluid main-section\" id=\"main-section\">\n\t\t\t<#nested>\n\t\t</div>\n\t\t<footer class=\"container\">\n\t\t\t<footer class=\"footer text-center\">\n\t\t\t\t<div class=\"container\">\n\t\t\t\t\t<a href=\"/credits\">credits</a> | Copyright &copy; 2009-${year} The Project Lombok\n\t\t\t\t\tAuthors, licensed under the <a href=\"http://www.opensource.org/licenses/mit-license.php\">MIT\n\t\t\t\t\tlicense</a>.\n\t\t\t\t</div>\n\t\t\t</footer>\n\t\t</footer>\n\t</body>\n</html>\n</#macro>\n\n<#macro h1 title class=\"\" id=\"\">\n<#if id == \"\">\n\t<#assign idvalue=\"*\"?no_esc + \"${title}\"/>\n<#else>\n\t<#assign idvalue=\"${id}\"?no_esc>\n</#if>\n<h1<#if class != \"\"> class=\"${class}\"</#if> id=\"${idvalue?markup_string?replace(\"[ _]\", \"-\", \"r\")?lower_case?replace(\"[^a-zA-Z0-9-]\", \"\", \"r\")}\">${title}</h1>\n</#macro>\n\n<#macro h2 title class=\"\" id=\"\">\n<#if id == \"\">\n\t<#assign idvalue=\"*\"?no_esc + \"${title}\"/>\n<#else>\n\t<#assign idvalue=\"${id}\"?no_esc>\n</#if>\n<h2<#if class != \"\"> class=\"${class}\"</#if> id=\"${idvalue?markup_string?replace(\"[ _]\", \"-\", \"r\")?lower_case?replace(\"[^a-zA-Z0-9-]\", \"\", \"r\")}\">${title}</h2>\n</#macro>\n\n<#macro h3 title class=\"\" id=\"\">\n<#if id == \"\">\n\t<#assign idvalue=\"*\"?no_esc + \"${title}\"/>\n<#else>\n\t<#assign idvalue=\"${id}\"?no_esc>\n</#if>\n<h3<#if class != \"\"> class=\"${class}\"</#if> id=\"${idvalue?markup_string?replace(\"[ _]\", \"-\", \"r\")?lower_case?replace(\"[^a-zA-Z0-9-]\", \"\", \"r\")}\">${title}</h3>\n</#macro>\n"
  },
  {
    "path": "website/templates/all-versions.html",
    "content": "<#import \"/_scaffold.html\" as main>\n<@main.scaffold title=\"older versions\">\n\t<div class=\"page-header top5\">\n\t\t<div>\n\t\t\t<div>\n\t\t\t\t<h1 class=\"text-center\">\n\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t<icon class=\"fa fa-download\"></icon>\n\t\t\t\t\t\t<a class=\"currentVersion\" href=\"downloads/lombok.jar\">${version} [Current Version]</a>\n\t\t\t\t\t</div>\n\t\t\t\t</h1>\n\t\t\t</div>\n\t\t\t<#list linksToVersions as lnk>\n\t\t\t\t<div class=\"row\">\n\t\t\t\t\t<icon class=\"fa fa-download\"></icon>\n\t\t\t\t\t<a class=\"oldVersion\" href=\"${lnk[1]}\">${lnk[0]}</a>\n\t\t\t\t</div>\n\t\t\t</#list>\n\t\t\t<div class=\"row\">\n\t\t\t\t<div class=\"text-center\">\n\t\t\t\t\t<h3>\n\t\t\t\t\t\tFeeling adventurous? Download the latest <a href=\"/download-edge\">snapshot</a>\n\t\t\t\t\t\trelease.\n\t\t\t\t\t</h3>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</@main.scaffold>\n"
  },
  {
    "path": "website/templates/changelog.html",
    "content": "<#import \"/_scaffold.html\" as main>\n<@main.scaffold title=\"changelog\">\n\t<div class=\"page-header top5\">\n\t\t<div class=\"row text-center changelog\">\n\t\t\t${changelog?no_esc}\n\t\t</div>\n\t</div>\n</@main.scaffold>\n"
  },
  {
    "path": "website/templates/contact.html",
    "content": "<#import \"/_scaffold.html\" as main>\n<@main.scaffold title=\"Contacting the team behind Project Lombok\">\n\t<div class=\"page-header top5\">\n\t\t<div>\n\t\t\t<div class=\"row\">\n\t\t\t\t<p>\n\t\t\t\t\tProject Lombok is an open source project, maintained primarily by Roel Spilker and Reinier Zwitserloot. We have day jobs and don't get paid much for Project Lombok's maintenance. Please keep this in mind when contacting us; we're doing it out of love.\n\t\t\t\t</p><p>\n\t\t\t\t\tTo contact us, <ul>\n\t\t\t\t\t\t<li>There's a <a href=\"https://groups.google.com/group/project-lombok\">forum</a>; we read and respond here.</li>\n\t\t\t\t\t\t<li>If you have a feature request or bug report, please file it on our <a href=\"https://github.com/projectlombok/lombok/issues\">github bug tracker</a>.</li>\n\t\t\t\t\t\t<li>If you have a security vulnerability to report, please contact us via our <a href=\"/security\">security vulnerability disclosure</a> page.</li>\n\t\t\t\t\t\t<li>We love giving presentations, about lombok, or even just general java things. <a href=\"mailto:info@projectlombok.org\">Send us a mail</a> if you want to invite us to do a talk.</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</@main.scaffold>\n"
  },
  {
    "path": "website/templates/contributing/contributing.html",
    "content": "<#import \"../_scaffold.html\" as main>\n\n<@main.scaffold title=\"Contribute\">\n\t<div class=\"page-header top5\">\n\t\t<div class=\"row text-center\">\n\t\t\t<@main.h1 title=\"Contributing to Project Lombok's development\" />\n\t\t</div><div class=\"row\">\n\t\t\tYou can choose to <a href=\"/order-license-info\">become a project lombok licensee or support us on patreon</a>.\n\t\t</div>\n\t\t<div class=\"row text-center\">\n\t\t\t<@main.h1 title=\"How to work on Project Lombok yourself\" />\n\t\t</div><div class=\"row\">\n\t\t\tProject Lombok is being developed via the <a href=\"https://github.com/projectlombok/lombok\">lombok git repository on github</a>.\n\t\t</div><div class=\"row\">\n\t\t\t<p>\n\t\t\t\tIf you want to start development on lombok, clone the repository and run <code>ant eclipse</code> or <code>ant intellij</code>, then open the working directory as a project in eclipse / intellij. Because the main contributors of lombok all use eclipse, that'll probably work a little more smoothly.\n\t\t\t</p><p>\n\t\t\t\tTo produce a lombok jar, run <code>ant dist</code>; in general run <code>ant -p</code>; there's lots of stuff there, including downloading various versions of java runtimes to run the test suite against, and building this website.\n\t\t\t</p>\n\t\t</div><div class=\"row text-center\">\n\t\t\t<@main.h2 title=\"Adding your own handlers and annotations to Lombok\" />\n\t\t</div><div class=\"row\">\n\t\t\t<p>\n\t\t\t\tIf you want to extend lombok, we advise that you fork lombok and add handlers directly into the same place and package that lombok's handlers are in (<code>lombok.javac.handlers</code> and <code>lombok.eclipse.handlers</code>) – lombok does some fancy footwork to ensure various modular class loading systems don't interface with finding the lombok classes, but that system is not (currently) easily expanded to include separate jars.\n\t\t\t</p>\n\t\t</div><div class=\"row text-center\">\n\t\t\t<@main.h2 title=\"Contributing to Project Lombok\" />\n\t\t</div><div class=\"row\">\n\t\t\t<p>\n\t\t\t\tTo create new features and add them to project lombok itself, send us pull requests via github. However, before you start, discuss the feature or fix you'd like to contribute, preferably via the <a href=\"https://groups.google.com/forum/#!forum/project-lombok\">Project Lombok Forum</a>. If you're going to add a new feature, make sure to post 2 snippets (one with the annotation, the other with what that would generate), similar to how the feature pages list 'with lombok' and 'without lombok' variants.\n\t\t\t</p><p>\n\t\t\t\tWe've considered many designs and features amongst ourselves and with the community, and often there are complications or interesting design choices that have already been mentioned. We'd like to share them with you before you set out.\n\t\t\t</p><p>\n\t\t\t\tPull requests for new features that haven't been discussed are unlikely to be accepted. Of course, if you've already built a proof of concept implementation prior to bringing a new idea to the forum, we'll take it that much more seriously.\n\t\t\t</p><p>\n\t\t\t\tHappy coding!\n\t\t\t</p>\n\t\t</div>\n\t</div>\n</@main.scaffold>\n"
  },
  {
    "path": "website/templates/contributing/index.html",
    "content": "<#import \"../_scaffold.html\" as main>\n\n<@main.scaffold title=\"Documentation for being a lombok developer\">\n\t<div class=\"page-header top5\">\n\t\t<div class=\"row text-center\">\n\t\t\t<@main.h1 title=\"Documentation for lombok developers\" />\n\t\t</div>\n\t\t<div class=\"row\">\n\t\t\t<@main.feature title=\"contributing\" href=\"contributing\">\n\t\t\t\tWant to contribute to Project Lombok? Start by reading this introduction.\n\t\t\t</@main.feature>\n\t\t\t<@main.feature title=\"execution path\" href=\"lombok-execution-path\">\n\t\t\t\tDiscusses how lombok ends up being invoked, and how it gets around to transforming code being compiled / edited.\n\t\t\t</@main.feature>\n\t\t</div>\n\t\t<div class=\"row\">\n\t\t\tMore documentation can be found on the <a href=\"https://github.com/projectlombok/lombok/wiki\">project lombok github wiki</a>.\n\t\t</div>\n\t</div>\n</@main.scaffold>\n"
  },
  {
    "path": "website/templates/contributing/lombok-execution-path.html",
    "content": "<#import \"../_scaffold.html\" as main>\n\n<@main.scaffold title=\"Lombok Execution Path\">\n\t<div class=\"page-header top5\">\n\t\t<div class=\"row text-center\">\n\t\t\t<@main.h1 title=\"Lombok Execution Path\" />\n\t\t</div><div class=\"row text-center\">\n\t\t\t<@main.h1 title=\"Javac: Launching as annotation processor\" />\n\t\t</div><div class=\"row\">\n\t\t<p>\n\t\t\tWith <code>javac</code> (and netbeans, maven, gradle, and most other build systems), lombok runs as an annotation processor.\n\t\t</p><p>\n\t\t\tLombok is on the classpath, and <code>javac</code> will load every <code>META-INF/services/javax.annotation.processing.Processor</code> file on the classpath it can find, reading each line and loading that class, then executing it as an annotation processor. <code>lombok.jar</code> has this file, it lists <code>lombok.launch.AnnotationProcessorHider$AnnotationProcessor</code> as entry.\n\t\t</p><p>\n\t\t\tThis class is not actually visible (it is public, but its outer class (<code>AnnotationProcessorHider</code>) is package private, making it invisible to java-the-language), however, it is considered visible for the purposes of java-the-VM and therefore it will run. This convoluted trick is used to ensure that anybody who develops with lombok on the classpath doesn't get lombok's classes or lombok's dependencies injected into their 'namespace' (for example, if you add lombok to your project, your IDE will <em>not</em> start suggesting lombok classes for auto-complete dialogs).\n\t\t</p><p>\n\t\t\tThe <code>lombok.launch.AnnotationProcessorHider$AnnotationProcessor</code> class is loaded by <code>javac</code>, instantiated, and <code>init()</code> is called on it. This class starts lombok's <code>ShadowClassLoader</code>; it finds the jar file it is in, then will start loading classes from this jar file. It looks not for files ending in <code>.class</code> like normal loaders, it looks for files ending in <code>.SCL.lombok</code> instead (this too is for the purpose of hiding lombok's classes from IDEs and such). Via this classloader, the <em>real</em> annotation processor is launched, which is class <code>lombok.core.AnnotationProcessor</code>.\n\t\t</p><p>\n\t\t\tThe <code>lombok.core.AnnotationProcessor</code> is also a delegating processor. It can delegate to one of 2 sub-processors based on the environment lombok finds itself in: If it's javac, class <code>lombok.javac.apt.LombokProcessor</code> is used (and if the plexus compiler framework is used, which can be the case when compiling with javac, some extra code runs to patch lombok into its modular classloading architecture). If it's ecj (eclipse's compiler, which means we're either running inside eclipse itself, or being invoked as annotation processor for ecj, the standalone eclipse compiler), errors/warnings are injected into the compilation process to tell the user they should use different parameters to <a href=\"/setup/ecj\">use lombok in eclipse/ecj</a>.\n\t\t</p><p>\n\t\t\t<code>lombok.javac.apt.LombokProcessor</code> is the 'real' annotation processor that does the work of transforming your code.\n\t\t</p><p>\n\t\t\tcode transformation is fundamentally a cyclic concept: To generate some code you want to know about the code (which annotations are in it, for example), but when you generate new code, interpreting it means we start over. The same applies to lombok itself: Some of lombok's transformations add methods which then have an effect on other lombok transformations. Because of that, lombok divides up the handlers into 'levels'. All handlers at the highest level are executed, then a new annotation round is forced (which integrates generated stuff into the symbol tables and such), and then the handlers at the next level are executed. These levels are indicated via the <code>@HandlerPriority</code> annotation. You force javac to run another round by generating a file. We don't actually want to generate any files, so we generate a dummy file and patch the javac <em>filer</em> to not actually save lombok-generated dummy files anywhere. The various <code>HandleX</code> classes, which apply the actual lombok transformations, are stored in <code>HandlerLibrary</code> which uses SPI to discover the handle classes.\n\t\t</p>\n\t\t</div><div class=\"row text-center\">\n\t\t\t<@main.h1 title=\"Eclipse/ECJ: Launching as agent\" />\n\t\t</div><div class=\"row\">\n\t\t<p>\n\t\t\tWith <code>ecj</code> and <code>eclipse</code>, lombok starts as an 'agent'. That's a bit like a debugger: It lets lombok inspect raw class bytecode <em>before</em> the JVM actually loads these classes, and lombok will modify this code in order to ensure that ecj/eclipse involves lombok in the compilation process.\n\t\t</p><p>\n\t\t\tThe patching of classes is done by the code in the <code>src/eclipseAgent</code> sourcedir. Note that the patching code has to patch equinox, the eclipse module system, to ensure lombok and the java compilation module (The 'JDT' module, in eclipse parlance) can see each other.\n\t\t</p><p>\n\t\t\tA bunch of ad-hoc fixes to issues (such as the eclipse format-my-code feature needing a few tactical bytecode patches to ensure it doesn't mess up formatting source) are applied, but the main 'run lombok as part of the compilation process' hook injected into ecj/eclipse leads to the <code>lombok.eclipse.TransformEclipseAST</code> class, which can be considered the entrypoint. Unless you want to mess with how lombok is loaded into eclipse/ecj, start there.\n\t\t</p><p>\n\t\t\tEach <code>HandleX</code> class is discovered via SPI and lombok will invoke the handle classes as needed. Handle classes find lombok annotations and apply the desired transformations. The handlers are in the <code>lombok.eclipse.handlers</code> package from the <code>src/core</code> sourcedir.\n\t\t</p>\n\t\t</div><div class=\"row text-center\">\n\t\t\t<@main.h1 title=\"VSCode and IntelliJ: Launching as a plugin\" />\n\t\t</div><div class=\"row\">\n\t\t<p>\n\t\t\tLombok support in these two IDEs is taken care of by plugins for these IDEs.\n\t\t</p>\n\t\t</div>\n\t</div>\n</@main.scaffold>\n"
  },
  {
    "path": "website/templates/credits.html",
    "content": "<#import \"/_scaffold.html\" as main>\n\n<@main.scaffold title=\"Credits\">\n\t<div class=\"page-header top5\">\n\t\t<div class=\"row text-center\">\n\t\t\t<@main.h1 title=\"Project Lombok - About the authors and everyone that's helped us create Project Lombok.\" />\n\t\t</div>\n\t\t<div class=\"row\">\n\t\t\t<div class=\"credits\">\n\t\t\t\t<div class=\"committers personList\">\n\t\t\t\t\t<@main.h3 title=\"Regular contributors to Project Lombok:\" />\n\n\t\t\t\t\t<div class=\"row text-center\">\n\t\t\t\t\t\t<div class=\"person col-md-2\">\n\t\t\t\t\t\t\t<div class=\"imgCt\"><img class=\"reinierImg\" src=\"/img/reinier.jpg\" /></div>\n\t\t\t\t\t\t\t<span class=\"name\">Reinier Zwitserloot</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"person col-md-2\">\n\t\t\t\t\t\t\t<div class=\"imgCt\"><img class=\"roelImg\" src=\"/img/roel.jpg\" /></div>\n\t\t\t\t\t\t\t<span class=\"name\">Roel Spilker</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"thanks\">\n\t\t\t\t\tWe'd like to thank:\n\t\t\t\t\t<ul>\n\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t<strong>Perry Nguyen</strong> (pfn on ##java on freenode) for creating the inspiration for project lombok.\n\t\t\t\t\t\t</li><li>\n\t\t\t\t\t\t\t<strong>Tor Norbye</strong>, <strong>Jan Lahoda</strong>, and <strong>Petr Jiricka</strong> for helping out with Netbeans internals and/or javac.\n\t\t\t\t\t\t</li><li>\n\t\t\t\t\t\t\t<strong>nqzero</strong> for the <a href=\"https://github.com/nqzero/permit-reflect\">permit-reflect</a> library, whose ideas are also used in lombok.\n\t\t\t\t\t\t</li><li>\n\t\t\t\t\t\t\tAll contributors who submitted patches or helped answering questions!</li>\n\t\t\t\t\t</ul>\n\n\t\t\t\t\tas well as the authors of the following tools that we use:\n\n\t\t\t\t\t<ul>\n\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t<a href=\"https://github.com/\">Github</a> for hosting lombok's repository and issue tracker.\n\t\t\t\t\t\t</li><li>\n\t\t\t\t\t\t\tThe <a href=\"http://asm.ow2.org/index.html\">ASM team</a> at ObjectWeb for creating an excellent class file editing tool. Lombok uses ASM to interact with Eclipse.\n\t\t\t\t\t\t</li><li>\n\t\t\t\t\t\t\t<strong>Markus Gebhard</strong> for creating <a href=\"http://java2html.de/\">java2html</a> which we use for the example code snippets on the features pages.\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</@main.scaffold>\n"
  },
  {
    "path": "website/templates/disable-checked-exceptions.html",
    "content": "<#import \"/_scaffold.html\" as main>\n\n<@main.scaffold title=\"Disable Checked Exceptions\">\n\t<div class=\"page-header top5\">\n\t\t<div class=\"row text-center\">\n\t\t\t<h1 class=\"text-center\">Tired of checked exceptions?</h1>\n\t\t</div>\n\t\t<div class=\"row\">\n\t\t\t<p>\n\t\t\t\tThis lombok spinoff project consists of a hack that only works in javac - not eclipse or any other IDE.<br />\n\t\t\t\tIt will completely disable the notion of checked exceptions. You may throw any exception anywhere, and you may also catch any exception anywhere. In standard javac, you may not catch a checked exception that is not declared as thrown by at least 1 statement in your try block, unless it is <code>Exception</code> or <code>Throwable</code>.<br />\n\t\t\t\tThis restriction is lifted as well.\n\t\t\t</p>\n\t\t</div>\n\t\t<div class=\"row\">\n\t\t\t<h2 class=\"text-center\">Usage</h2>\n\t\t\t\n\t\t\t<p>\n\t\t\t\tJust make sure <code>disableCheckedExceptions-alpha.jar</code> is on the classpath as you compile. For example:<br />\n\t\t\t\t<code>javac -cp disableCheckedExceptions-alpha.jar MySource.java</code>\n\t\t\t</p><p>\n\t\t\t\tReady to try it out? download it here: <a href=\"/downloads/disableCheckedExceptions-alpha.jar\">disableCheckedExceptions-alpha.jar</a>\n\t\t\t</p><p>\n\t\t\t\tWant to know how its done? Grab the lombok repository <a href=\"https://github.com/projectlombok/lombok/tree/disableCheckedExceptions\">here on github</a>, and look in the <code>experimental</code> directory.\n\t\t\t</p>\n\t\t</div>\n\t</div>\n</@main.scaffold>\n"
  },
  {
    "path": "website/templates/download-edge.html",
    "content": "<#import \"/_scaffold.html\" as main>\n<@main.scaffold title=\"snapshot\">\n\t<div class=\"page-header top5\">\n\t\t<div class=\"row text-center versionInfo\">\n\t\t\tNo edge build has been released since the last <a href=\"/download\">stable release</a> of lombok.\n\t\t</div>\n\t</div>\n</@main.scaffold>\n"
  },
  {
    "path": "website/templates/download.html",
    "content": "<#import \"/_scaffold.html\" as main>\n<@main.scaffold title=\"Download\">\n\t<div class=\"page-header top5\">\n\t\t<div>\n\t\t\t<div class=\"row page-center\">\n\t\t\t\t<div>\n\t\t\t\t\t<h1 class=\"text-center\">\n\t\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t\t<icon class=\"fa fa-download\"></icon>\n\t\t\t\t\t\t\t<a href=\"/downloads/lombok.jar\">\n\t\t\t\t\t\t\t\tDownload <span id=\"currentVersion\">${version}</span>\n\t\t\t\t\t\t\t\t<span id=\"currentVersionFull\" style=\"display: none;\">${fullVersion}</span>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</h1>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"row\">\n\t\t\t\t\t<a href=\"/changelog\">\n\t\t\t\t\t\tchangelog\n\t\t\t\t\t</a>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"row\">\n\t\t\t\t\t<a href=\"/all-versions\">\n\t\t\t\t\t\tolder versions\n\t\t\t\t\t</a>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"row\">\n\t\t\t\t<div class=\"text-center\">\n\t\t\t\t\t<h3>\n\t\t\t\t\t\tFeeling adventurous? Download the latest <a href=\"/download-edge\">snapshot</a>\n\t\t\t\t\t\trelease.\n\t\t\t\t\t</h3>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</@main.scaffold>\n"
  },
  {
    "path": "website/templates/features/Builder.html",
    "content": "<#import \"_features.html\" as f>\n\n<@f.scaffold title=\"@Builder\" logline=\"... and Bob's your uncle: No-hassle fancy-pants APIs for object creation!\">\n\t<@f.history>\n\t\t<p>\n\t\t\t<code>@Builder</code> was introduced as experimental feature in lombok v0.12.0.\n\t\t</p><p>\n\t\t\t<code>@Builder</code> gained <code>@Singular</code> support and was promoted to the main <code>lombok</code> package since lombok v1.16.0.\n\t\t</p><p>\n\t\t\t<code>@Builder</code> with <code>@Singular</code> adds a clear method since lombok v1.16.8.\n\t\t</p><p>\n\t\t\t<code>@Builder.Default</code> functionality was added in lombok v1.16.16.\n\t\t</p><p>\n\t\t\t<code>@Builder(builderMethodName = \"\")</code> is legal (and will suppress generation of the builder method) starting with lombok v1.18.8.\n\t\t</p><p>\n\t\t\t<code>@Builder(access = AccessLevel.PACKAGE)</code> is legal (and will generate the builder class, the builder method, etc with the indicated access level) starting with lombok v1.18.8.\n\t\t</p>\n\t</@f.history>\n\t\n\t<@f.overview>\n\t\t<p>\n\t\t\tThe <code>@Builder</code> annotation produces complex builder APIs for your classes.\n\t\t</p><p>\n\t\t\t<code>@Builder</code> lets you automatically produce the code required to have your class be instantiable with code such as:\n\t\t</p>\n\t\t<ol class=\"snippet example\">\n\t\t\t<li>Person.builder()</li>\n\t\t\t<li class=\"continued\">.name(\"Adam Savage\")</li>\n\t\t\t<li class=\"continued\">.city(\"San Francisco\")</li>\n\t\t\t<li class=\"continued\">.job(\"Mythbusters\")</li>\n\t\t\t<li class=\"continued\">.job(\"Unchained Reaction\")</li>\n\t\t\t<li class=\"continued\">.build();</li>\n\t\t</ol>\n\t\t<p>\n\t\t\t<code>@Builder</code> can be placed on a class, or on a constructor, or on a method. While the \"on a class\" and \"on a constructor\" mode are the most common use-case, <code>@Builder</code> is most easily explained with the \"method\" use-case.\n\t\t</p><p>\n\t\t\tA method annotated with <code>@Builder</code> (from now on called the <em>target</em>) causes the following 7 things to be generated:\n\t\t\t<ul>\n\t\t\t\t<li>\n\t\t\t\t\tAn inner static class named <code><em>Foo</em>Builder</code>, with the same type arguments as the static method (called the <em>builder</em>).\n\t\t\t\t</li><li>\n\t\t\t\t\tIn the <em>builder</em>: One private non-static non-final field for each parameter of the <em>target</em>.\n\t\t\t\t</li><li>\n\t\t\t\t\tIn the <em>builder</em>: A package private no-args empty constructor.\n\t\t\t\t</li><li>\n\t\t\t\t\tIn the <em>builder</em>: A 'setter'-like method for each parameter of the <em>target</em>: It has the same type as that parameter and the same name. It returns the builder itself, so that the setter calls can be chained, as in the above example.\n\t\t\t\t</li><li>\n\t\t\t\t\tIn the <em>builder</em>: A <code>build()</code> method which calls the method, passing in each field. It returns the same type that the <em>target</em> returns.\n\t\t\t\t</li><li>\n\t\t\t\t\tIn the <em>builder</em>: A sensible <code>toString()</code> implementation.\n\t\t\t\t</li><li>\n\t\t\t\t\tIn the class containing the <em>target</em>: A <code>builder()</code> method, which creates a new instance of the <em>builder</em>.\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t\tEach listed generated element will be silently skipped if that element already exists (disregarding parameter counts and looking only at names). This includes the <em>builder</em> itself: If that class already exists, lombok will simply start injecting fields and methods inside this already existing class, unless of course the fields / methods to be injected already exist. You may not put any other method (or constructor) generating lombok annotation on a builder class though; for example, you can not put <code>@EqualsAndHashCode</code> on the builder class.\n\t\t</p><p>\n\t\t\t<code>@Builder</code> can generate so-called 'singular' methods for collection parameters/fields. These take 1 element instead of an entire list, and add the element to the list. For example:\n\t\t</p>\n\t\t<ol class=\"snippet example\">\n\t\t\t<li>Person.builder()</li>\n\t\t\t<li class=\"continued\">.job(\"Mythbusters\")</li>\n\t\t\t<li class=\"continued\">.job(\"Unchained Reaction\")</li>\n\t\t\t<li class=\"continued\">.build();</li>\n\t\t</ol>\n\t\t<p>would result in the <code>List&lt;String&gt; jobs</code> field to have 2 strings in it. To get this behavior, the field/parameter needs to be annotated with <code>@Singular</code>. The feature has <a href=\"#singular\">its own documentation</a>.\n\t\t</p><p>\n\t\t\tNow that the \"method\" mode is clear, putting a <code>@Builder</code> annotation on a constructor functions similarly; effectively, constructors are just static methods that have a special syntax to invoke them: Their 'return type' is the class they construct, and their type parameters are the same as the type parameters of the class itself.\n\t\t</p><p>\n\t\t\tFinally, applying <code>@Builder</code> to a class is as if you added <code>@AllArgsConstructor(access = AccessLevel.PACKAGE)</code> to the class and applied the <code>@Builder</code> annotation to this all-args-constructor. This only works if you haven't written any explicit constructors yourself or allowed lombok to create one such as with <code>@NoArgsConstructor</code>. If you do have an explicit constructor, put the <code>@Builder</code> annotation on the constructor instead of on the class. Note that if you put both <code>@Value</code> and <code>@Builder</code> on a class, the package-private constructor that <code>@Builder</code> wants to generate 'wins' and suppresses the constructor that <code>@Value</code> wants to make.\n\t\t</p><p>\n\t\t\tIf using <code>@Builder</code> to generate builders to produce instances of your own class (this is always the case unless adding <code>@Builder</code> to a method that doesn't return your own type), you can use <code>@Builder(toBuilder = true)</code> to also generate an instance method in your class called <code>toBuilder()</code>; it creates a new builder that starts out with all the values of this instance. You can put the <code>@Builder.ObtainVia</code> annotation on the parameters (in case of a constructor or method) or fields (in case of <code>@Builder</code> on a type) to indicate alternative means by which the value for that field/parameter is obtained from this instance. For example, you can specify a method to be invoked: <code>@Builder.ObtainVia(method = \"calculateFoo\")</code>.\n\t\t</p><p>\n\t\t\tThe name of the builder class is <code><em>Foobar</em>Builder</code>, where <em>Foobar</em> is the simplified, title-cased form of the return type of the <em>target</em> - that is, the name of your type for <code>@Builder</code> on constructors and types, and the name of the return type for <code>@Builder</code> on methods. For example, if <code>@Builder</code> is applied to a class named <code>com.yoyodyne.FancyList&lt;T&gt;</code>, then the builder name will be <code>FancyListBuilder&lt;T&gt;</code>. If <code>@Builder</code> is applied to a method that returns <code>void</code>, the builder will be named <code>VoidBuilder</code>.\n\t\t</p><p>\n\t\t\tThe configurable aspects of builder are:\n\t\t\t<ul>\n\t\t\t\t<li>\n\t\t\t\t\tThe <em>builder's class name</em> (default: return type + 'Builder')\n\t\t\t\t</li><li>\n\t\t\t\t\tThe <em>build()</em> method's name (default: <code>\"build\"</code>)\n\t\t\t\t</li><li>\n\t\t\t\t\tThe <em>builder()</em> method's name (default: <code>\"builder\"</code>)\n\t\t\t\t</li><li>\n\t\t\t\t\tIf you want <code>toBuilder()</code> (default: no)\n\t\t\t\t</li><li>\n\t\t\t\t\tThe access level of all generated elements (default: <code>public</code>).\n\t\t\t\t</li><li>\n\t\t\t\t\t(discouraged) If you want your builder's 'set' methods to have a prefix, i.e. <code>Person.builder().setName(\"Jane\").build()</code> instead of <code>Person.builder().name(\"Jane\").build()</code> and what it should be.\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t\tExample usage where all options are changed from their defaults:<br />\n\t\t\t<code>@Builder(builderClassName = \"HelloWorldBuilder\", buildMethodName = \"execute\", builderMethodName = \"helloWorld\", toBuilder = true, access = AccessLevel.PRIVATE, setterPrefix = \"set\")</code><br />\n\t\t</p><p>\n\t\t\tLooking to use your builder with <a href=\"https://github.com/FasterXML/jackson\">Jackson</a>, the JSON/XML tool? We have you covered: Check out the <a href=\"/features/experimental/Jacksonized\">@Jacksonized</a> feature.\n\t\t</p>\n\t</@f.overview>\n\t\n\t<@f.featureSection>\n\t\t<h3 id=\"builderdefault\"><a name=\"builderdefault\">@Builder.Default</a></h3>\n\t\t\n\t\t<p>\n\t\t\tIf a certain field/parameter is never set during a build session, then it always gets 0 / <code>null</code> / false. If you've put <code>@Builder</code> on a class (and not a method or constructor) you can instead specify the default directly on the field, and annotate the field with <code>@Builder.Default</code>:<br />\n\t\t\t<code>@Builder.Default private final long created = System.currentTimeMillis();</code><br/>\n\t\t\tCalling Lombok-generated constructors such as <code>@NoArgsConstructor</code> will also make use of the defaults specified using <code>@Builder.Default</code> however explicit constructors will no longer use the default values and will need to be set manually or call a Lombok-generated constructor such as <code>this();</code> to set the defaults.\n\t\t</p>\n\t</@f.featureSection>\n\t\n\t<@f.featureSection>\n\t\t<h3 id=\"singular\"><a name=\"singular\">@Singular</a></h3>\n\t\t\n\t\t<p>\n\t\t\tBy annotating one of the parameters (if annotating a method or constructor with <code>@Builder</code>) or fields (if annotating a class with <code>@Builder</code>) with the <code>@Singular</code> annotation, lombok will treat that builder node as a collection, and it generates 2 'adder' methods instead of a 'setter' method. One which adds a single element to the collection, and one which adds all elements of another collection to the collection. No setter to just set the collection (replacing whatever was already added) will be generated. A 'clear' method is also generated. These 'singular' builders are very complicated in order to guarantee the following properties:\n\t\t\t<ul>\n\t\t\t\t<li>\n\t\t\t\t\tWhen invoking <code>build()</code>, the produced collection will be immutable.\n\t\t\t\t</li><li>\n\t\t\t\t\tCalling one of the 'adder' methods, or the 'clear' method, after invoking <code>build()</code> does not modify any already generated objects, and, if <code>build()</code> is later called again, another collection with all the elements added since the creation of the builder is generated.\n\t\t\t\t</li><li>\n\t\t\t\t\tThe produced collection will be compacted to the smallest feasible format while remaining efficient.\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t</p><p>\n\t\t\t<code>@Singular</code> can only be applied to collection types known to lombok. Currently, the supported types are:\n\t\t\t<ul>\n\t\t\t\t<li>\n\t\t\t\t\t<a href=\"https://docs.oracle.com/javase/8/docs/api/java/util/package-summary.html\"><code>java.util</code></a>:\n\t\t\t\t\t<ul>\n\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t<code>Iterable</code>, <code>Collection</code>, and <code>List</code> (backed by a compacted unmodifiable <code>ArrayList</code> in the general case).\n\t\t\t\t\t\t</li><li>\n\t\t\t\t\t\t\t<code>Set</code>, <code>SortedSet</code>, and <code>NavigableSet</code> (backed by a smartly sized unmodifiable <code>HashSet</code> or <code>TreeSet</code> in the general case).\n\t\t\t\t\t\t</li><li>\n\t\t\t\t\t\t\t<code>Map</code>, <code>SortedMap</code>, and <code>NavigableMap</code> (backed by a smartly sized unmodifiable <code>HashMap</code> or <code>TreeMap</code> in the general case).\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</li><li>\n\t\t\t\t\t<a href=\"https://github.com/google/guava\">Guava</a>'s <code>com.google.common.collect</code>:\n\t\t\t\t\t<ul>\n\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t<code>ImmutableCollection</code> and <code>ImmutableList</code> (backed by the builder feature of <code>ImmutableList</code>).\n\t\t\t\t\t\t</li><li>\n\t\t\t\t\t\t\t<code>ImmutableSet</code> and <code>ImmutableSortedSet</code> (backed by the builder feature of those types).\n\t\t\t\t\t\t</li><li>\n\t\t\t\t\t\t\t<code>ImmutableMap</code>, <code>ImmutableBiMap</code>, and <code>ImmutableSortedMap</code> (backed by the builder feature of those types).\n\t\t\t\t\t\t</li><li>\n\t\t\t\t\t\t\t<code>ImmutableTable</code> (backed by the builder feature of <code>ImmutableTable</code>).\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t</p><p>\n\t\t\tIf your identifiers are written in common english, lombok assumes that the name of any collection with <code>@Singular</code> on it is an english plural and will attempt to automatically singularize that name. If this is possible, the add-one method will use this name. For example, if your collection is called <code>statuses</code>, then the add-one method will automatically be called <code>status</code>. You can also specify the singular form of your identifier explicitly by passing the singular form as argument to the annotation like so: <code>@Singular(\"axis\") List&lt;Line&gt; axes;</code>.<br />\n\t\t\tIf lombok cannot singularize your identifier, or it is ambiguous, lombok will generate an error and force you to explicitly specify the singular name.\n\t\t</p><p>\n\t\t\tThe snippet below does not show what lombok generates for a <code>@Singular</code> field/parameter because it is rather complicated. You can view a snippet <a href=\"builderSingular\">here</a>.\n\t\t</p><p>\n\t\t\tIf also using <code>setterPrefix = \"with\"</code>, the generated names are, for example, <code>withName</code> (add 1 name), <code>withNames</code> (add many names), and <code>clearNames</code> (reset all names).\n\t\t</p><p>\n\t\t\tOrdinarily, the generated 'plural form' method (which takes in a collection, and adds each element in this collection) will check if a <code>null</code> is passed the same way <a href=\"NonNull\"><code>@NonNull</code></a> does (by default, throws a <code>NullPointerException</code> with an appropriate message). However, you can also tell lombok to ignore such collection (so, add nothing, return immediately): <code>@Singular(ignoreNullCollections = true</code>.\n\t\t</p>\n\t</@f.featureSection>\n\n\t<@f.featureSection>\n\t\t<h3 id=\"jackson\"><a name=\"jackson\">With Jackson</a></h3>\n\t\t<p>\n\t\t\tYou can customize parts of your builder, for example adding another method to the builder class, or annotating a method in the builder class, by making the builder class yourself. Lombok will generate everything that you do not manually add, and put it into this builder class. For example, if you are trying to configure <a href=\"https://github.com/FasterXML/jackson\">jackson</a> to use a specific subtype for a collection, you can write something like:<div class=\"snippet\"><div class=\"java\" align=\"left\"><pre>\n@Value @Builder\n@JsonDeserialize(builder = JacksonExample.JacksonExampleBuilder.class)\npublic class JacksonExample {\n\t@Singular(nullBehavior = NullCollectionBehavior.IGNORE) private List&lt;Foo&gt; foos;\n\t\n\t@JsonPOJOBuilder(withPrefix = \"\")\n\tpublic static class JacksonExampleBuilder implements JacksonExampleBuilderMeta {\n\t}\n\t\n\tprivate interface JacksonExampleBuilderMeta {\n\t\t@JsonDeserialize(contentAs = FooImpl.class) JacksonExampleBuilder foos(List&lt;? extends Foo&gt; foos)\n\t}\n}\n</pre></div></div>\n\t\t</p>\n\t</@f.featureSection>\n\t\n\t<@f.snippets name=\"Builder\" />\n\n\t<@f.confKeys>\n\t\t<dt>\n\t\t\t<code>lombok.builder.className</code> = [a java identifier with an optional star to indicate where the return type name goes] (default: <code>*Builder</code>)\n\t\t</dt><dd>\n\t\t\tUnless you explicitly pick the builder's class name with the <code>builderClassName</code> parameter, this name is chosen; any star in the name is replaced with the relevant return type.\n\t\t</dd><dt>\n\t\t\t<code>lombok.builder.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@Builder</code> as a warning or error if configured.\n\t\t</dd><dt>\n\t\t\t<code>lombok.singular.useGuava</code> = [<code>true</code> | <code>false</code>] (default: false)\n\t\t</dt><dd>\n\t\t\tIf <code>true</code>, lombok will use guava's <code>ImmutableXxx</code> builders and types to implement <code>java.util</code> collection interfaces, instead of creating implementations based on <code>Collections.unmodifiableXxx</code>. You must ensure that guava is actually available on the classpath and buildpath if you use this setting. Guava is used automatically if your field/parameter has one of the guava <code>ImmutableXxx</code> types.\n\t\t</dd><dt>\n\t\t\t<code>lombok.singular.auto</code> = [<code>true</code> | <code>false</code>] (default: true)\n\t\t</dt><dd>\n\t\t\tIf <code>true</code> (which is the default), lombok automatically tries to singularize your identifier name by assuming that it is a common english plural. If <code>false</code>, you must always explicitly specify the singular name, and lombok will generate an error if you don't (useful if you write your code in a language other than english).\n\t\t</dd>\n\t</@f.confKeys>\n\n\t<@f.smallPrint>\n\t\t<p>\n\t\t\t@Singular support for <code>java.util.NavigableMap/Set</code> only works if you are compiling with JDK1.8 or higher.\n\t\t</p><p>\n\t\t\tYou cannot manually provide some or all parts of a <code>@Singular</code> node; the code lombok generates is too complex for this. If you want to manually control (part of) the builder code associated with some field or parameter, don't use <code>@Singular</code> and add everything you need manually.\n\t\t</p><p>\n\t\t\tThe sorted collections (java.util: <code>SortedSet</code>, <code>NavigableSet</code>, <code>SortedMap</code>, <code>NavigableMap</code> and guava: <code>ImmutableSortedSet</code>, <code>ImmutableSortedMap</code>) require that the type argument of the collection has natural order (implements <code>java.util.Comparable</code>). There is no way to pass an explicit <code>Comparator</code> to use in the builder.\n\t\t</p><p>\n\t\t\tAn <code>ArrayList</code> is used to store added elements as call methods of a <code>@Singular</code> marked field, if the target collection is from the <code>java.util</code> package, <em>even if the collection is a set or map</em>. Because lombok ensures that generated collections are compacted, a new backing instance of a set or map must be constructed anyway, and storing the data as an <code>ArrayList</code> during the build process is more efficient that storing it as a map or set. This behavior is not externally visible, an implementation detail of the current implementation of the <code>java.util</code> recipes for <code>@Singular @Builder</code>.\n\t\t</p><p>\n\t\t\tWith <code>toBuilder = true</code> applied to methods, any type parameter of the annotated method itself must also show up in the return type.\n\t\t</p><p>\n\t\t\tThe initializer on a <code>@Builder.Default</code> field is removed and stored in a static method, in order to guarantee that this initializer won't be executed at all if a value is specified in the build. This does mean the initializer cannot refer to <code>this</code>, <code>super</code> or any non-static member. If lombok generates a constructor for you, it'll also initialize this field with the initializer.\n\t\t</p><p>\n\t\t\tThe generated field in the builder to represent a field with a <code>@Builder.Default</code> set is called <code><em>propertyName</em>$value</code>; an additional boolean field called <code><em>propertyName</em>$set</code> is also generated to track whether it has been set or not. This is an implementation detail; do not write code that interacts with these fields. Instead, invoke the generated builder-setter method if you want to set the property inside a custom method inside the builder.\n\t\t</p><p>\n\t\t\tVarious well known annotations about nullity cause null checks to be inserted and will be copied to parameter of the builder's 'setter' method. See <a href=\"/features/GetterSetter\">Getter/Setter</a> documentation's small print for more information.\n\t\t</p><p>\n\t\t\tYou can suppress the generation of the <code>builder()</code> method, for example because you <em>just</em> want the <code>toBuilder()</code> functionality, by using:\n\t\t\t<code>@Builder(builderMethodName = \"\")</code>. Any warnings about missing <code>@Builder.Default</code> annotations will disappear when you do this, as such warnings\n\t\t\tare not relevant when only using <code>toBuilder()</code> to make builder instances.\n\t\t</p><p>\n\t\t\tYou can use <code>@Builder</code> for copy constructors: <code>foo.toBuilder().build()</code> makes a shallow clone. Consider suppressing the generating of the\n\t\t\t<code>builder</code> method if you just want this functionality, by using: <code>@Builder(toBuilder = true, builderMethodName = \"\")</code>.\n\t\t</p><p>\n\t\t\tDue to a peculiar way javac processes static imports, trying to do a non-star static import of the static <code>builder()</code> method won't work. Either use a star static import: <code>import static TypeThatHasABuilder.*;</code> or don't statically import the <code>builder</code> method.\n\t\t</p><p>\n\t\t\tIf setting the access level to <code>PROTECTED</code>, all methods generated inside the builder class are actually generated as <code>public</code>; the meaning of the\n\t\t\t<code>protected</code> keyword is different inside the inner class, and the precise behavior that <code>PROTECTED</code> would indicate (access by any source in the same package is allowed, as well as any subclasses <em>from the outer class, marked with <code>@Builder</code></em> is not possible, and marking the inner members <code>public</code> is as close as we can get.\n\t\t</p><p>\n\t\t\tIf you have configured a nullity annotation flavour via <a href=\"configuration\"><code>lombok.config</code></a> key <code>lombok.addNullAnnotations</code>, any plural-form generated builder methods for <code>@Singular</code> marked properties (these plural form methods take a collection of some sort and add all elements) get a nullity annotation on the parameter. You get a non-null one normally, but if you have configured the behavior on <code>null</code> being passed in as collection to <code>IGNORE</code>, a nullable annotation is generated instead.\n\t\t</p>\n\t</@f.smallPrint>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/BuilderSingular.html",
    "content": "<#import \"_features.html\" as f>\n\n<@f.scaffold title=\"@Builder @Singular\" logline=\"... and Bob's your uncle: No-hassle fancy-pants APIs for object creation!\">\n\t<@f.snippets name=\"Singular-snippet\" />\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/Cleanup.html",
    "content": "<#import \"_features.html\" as f>\n\n<@f.scaffold title=\"@Cleanup\" logline=\"Automatic resource management: Call your <code>close()</code> methods safely with no hassle.\">\n\t<@f.overview>\n\t\t<p>\n\t\t\tYou can use <code>@Cleanup</code> to ensure a given resource is automatically cleaned up before the code execution path exits your current scope. You do this by annotating any local variable declaration with the <code>@Cleanup</code> annotation like so:<br />\n\t\t\t<code>@Cleanup InputStream in = new FileInputStream(\"some/file\");</code><br />\n\t\t\tAs a result, at the end of the scope you're in, <code>in.close()</code> is called. This call is guaranteed to run by way of a try/finally construct. Look at the example below to see how this works.\n\t\t</p><p>\n\t\t\tIf the type of object you'd like to cleanup does not have a <code>close()</code> method, but some other no-argument method, you can specify the name of this method like so:<br />\n\t\t\t<code>@Cleanup(\"dispose\") org.eclipse.swt.widgets.CoolBar bar = new CoolBar(parent, 0);</code><br />\n\t\t\tBy default, the cleanup method is presumed to be <code>close()</code>. A cleanup method that takes 1 or more arguments cannot be called via <code>@Cleanup</code>.\n\t\t</p>\n\t</@f.overview>\n\n\t<@f.snippets name=\"Cleanup\" />\n\n\t<@f.confKeys>\n\t\t<dt>\n\t\t\t<code>lombok.cleanup.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt></dd>\n\t\t\tLombok will flag any usage of <code>@Cleanup</code> as a warning or error if configured.\n\t\t</dd>\n\t</@f.confKeys>\n\n\t<@f.smallPrint>\n\t\t<p>\n\t\t\tIn the finally block, the cleanup method is only called if the given resource is not <code>null</code>. However, if you use <code>delombok</code> on the code, a call to <code>lombok.Lombok.preventNullAnalysis(Object o)</code> is inserted to prevent warnings if static code analysis could determine that a null-check would not be needed. Compilation with <code>lombok.jar</code> on the classpath removes that method call, so there is no runtime dependency.\n\t\t</p><p>\n\t\t\tIf your code throws an exception, and the cleanup method call that is then triggered also throws an exception, then the original exception is hidden by the exception thrown by the cleanup call. You should <em>not</em> rely on this 'feature'. Preferably, lombok would like to generate code so that, if the main body has thrown an exception, any exception thrown by the close call is silently swallowed (but if the main body exited in any other way, exceptions by the close call will not be swallowed). The authors of lombok do not currently know of a feasible way to implement this scheme, but if java updates allow it, or we find a way, we'll fix it.\n\t\t</p><p>\n\t\t\tYou do still need to handle any exception that the cleanup method can generate!\n\t\t</p>\n\t</@f.smallPrint>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/Data.html",
    "content": "<#import \"_features.html\" as f>\n\n<@f.scaffold title=\"@Data\"\n\tlogline=\"All together now: A shortcut for <code>@ToString</code>, <code>@EqualsAndHashCode</code>, <code>@Getter</code> on all fields, <code>@Setter</code> on all non-final fields, and <code>@RequiredArgsConstructor</code>!\">\n\n\t<@f.overview>\n\t\t<p>\n\t\t\t<code>@Data</code> is a convenient shortcut annotation that bundles the features of <a href=\"/features/ToString\"><code>@ToString</code></a>, <a href=\"/features/EqualsAndHashCode\"><code>@EqualsAndHashCode</code></a>, <a href=\"/features/GetterSetter\"><code>@Getter</code> / <code>@Setter</code></a> and <a href=\"/features/constructor\"><code>@RequiredArgsConstructor</code></a> together: In other words, <code>@Data</code> generates <em>all</em> the boilerplate that is normally associated with simple POJOs (Plain Old Java Objects) and beans: getters for all fields, setters for all non-final fields, and appropriate <code>toString</code>, <code>equals</code> and <code>hashCode</code> implementations that involve the fields of the class, and a constructor that initializes all final fields, as well as all non-final fields with no initializer that have been marked with <code>@NonNull</code>, in order to ensure the field is never null.\n\t\t</p><p>\n\t\t\t<code>@Data</code> is like having implicit <code>@Getter</code>, <code>@Setter</code>, <code>@ToString</code>, <code>@EqualsAndHashCode</code> and <code>@RequiredArgsConstructor</code> annotations on the class (except that no constructor will be generated if any explicitly written constructors already exist). However, the parameters of these annotations (such as <code>callSuper</code>, <code>includeFieldNames</code> and <code>exclude</code>) cannot be set with <code>@Data</code>. If you need to set non-default values for any of these parameters, just add those annotations explicitly; <code>@Data</code> is smart enough to defer to those annotations.\n\t\t</p><p>\n\t\t\tAll generated getters and setters will be <code>public</code>. To override the access level, annotate the field or class with an explicit <code>@Setter</code> and/or <code>@Getter</code> annotation. You can also use this annotation (by combining it with <code>AccessLevel.NONE</code>) to suppress generating a getter and/or setter altogether.\n\t\t</p><p>\n\t\t\tAll fields marked as <code>transient</code> will not be considered for <code>hashCode</code> and <code>equals</code>. All static fields will be skipped entirely (not considered for any of the generated methods, and no setter/getter will be made for them).\n\t\t</p><p>\n\t\t\tIf the class already contains a method with the same name and parameter count as any method that would normally be generated, that method is not generated, and no warning or error is emitted. For example, if you already have a method with signature <code>equals(AnyType param)</code>, no <code>equals</code> method will be generated, even though technically it might be an entirely different method due to having different parameter types. The same rule applies to the constructor (any explicit constructor will prevent <code>@Data</code> from generating one), as well as <code>toString</code>, <code>equals</code>, and all getters and setters. You can mark any constructor or method with <code>@lombok.experimental.Tolerate</code> to hide them from lombok.\n\t\t</p><p>\n\t\t\t<code>@Data</code> can handle generics parameters for fields just fine. In order to reduce the boilerplate when constructing objects for classes with generics, you can use the <code>staticConstructor</code> parameter to generate a private constructor, as well as a static method that returns a new instance. This way, javac will infer the variable name. Thus, by declaring like so: <code>@Data(staticConstructor=\"of\") class Foo&lt;T&gt; { private T x;}</code> you can create new instances of <code>Foo</code> by writing: <code>Foo.of(5);</code> instead of having to write: <code>new Foo&lt;Integer&gt;(5);</code>.\n\t\t</p>\n\t</@f.overview>\n\n\t<@f.snippets name=\"Data\" />\n\n\t<@f.confKeys>\n\t\t<dt>\n\t\t\t<code>lombok.data.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@Data</code> as a warning or error if configured.\n\t\t</dd><dt>\n\t\t\t<code>lombok.noArgsConstructor.extraPrivate</code> = [<code>true</code> | <code>false</code>] (default: false)\n\t\t</dt><dd>\n\t\t\tIf <code>true</code>, lombok will generate a private no-args constructor for any <code>@Data</code> annotated class, which sets all fields to default values (null / 0 / false).\n\t\t</dd>\n\t</@f.confKeys>\n\n\t<@f.smallPrint>\n\t\t<p>\n\t\t\tSee the small print of <a href=\"/features/ToString\"><code>@ToString</code></a>, <a href=\"/features/EqualsAndHashCode\"><code>@EqualsAndHashCode</code></a>, <a href=\"/features/GetterSetter\"><code>@Getter / @Setter</code></a> and <a href=\"/features/constructor\">@RequiredArgsConstructor</a>.\n\t\t</p><p>\n\t\t\tVarious well known annotations about nullity cause null checks to be inserted and will be copied to the relevant places (such as the method for getters, and the parameter for the constructor and setters). See <a href=\"/features/GetterSetter\">Getter/Setter</a> documentation's small print for more information.\n\t\t</p><p>\n\t\t\tBy default, any variables that start with a $ symbol are excluded automatically. You can include them by specifying an explicit annotation (<code>@Getter</code> or <code>@ToString</code>, for example) and using the 'of' parameter.\n\t\t</p>\n\t</@f.smallPrint>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/EqualsAndHashCode.html",
    "content": "<#import \"_features.html\" as f>\n\n<@f.scaffold title=\"@EqualsAndHashCode\" logline=\"Equality made easy: Generates <code>hashCode</code> and <code>equals</code> implementations from the fields of your object.\">\n\t<@f.overview>\n\t\t<p>\n\t\t\tAny class definition may be annotated with <code>@EqualsAndHashCode</code> to let lombok generate implementations of the <code>equals(Object other)</code> and <code>hashCode()</code> methods. By default, it'll use all non-static, non-transient fields, but you can modify which fields are used (and even specify that the output of various methods is to be used) by marking type members with <code>@EqualsAndHashCode.Include</code> or <code>@EqualsAndHashCode.Exclude</code>. Alternatively, you can specify exactly which fields or methods you wish to be used by marking them with <code>@EqualsAndHashCode.Include</code> and using <code>@EqualsAndHashCode(onlyExplicitlyIncluded = true)</code>.\n\t\t</p><p>\n\t\t\tIf applying <code>@EqualsAndHashCode</code> to a class that extends another, this feature gets a bit trickier. Normally, auto-generating an <code>equals</code> and <code>hashCode</code> method for such classes is a bad idea, as the superclass also defines fields, which also need equals/hashCode code but this code will not be generated. By setting <code>callSuper</code> to <em>true</em>, you can include the <code>equals</code> and <code>hashCode</code> methods of your superclass in the generated methods. For <code>hashCode</code>, the result of <code>super.hashCode()</code> is included in the hash algorithm, and for<code>equals</code>, the generated method will return false if the super implementation thinks it is not equal to the passed in object. Be aware that not all <code>equals</code> implementations handle this situation properly. However, lombok-generated <code>equals</code> implementations <strong>do</strong> handle this situation properly, so you can safely call your superclass equals if it, too, has a lombok-generated <code>equals</code> method. If you have an explicit superclass you are forced to supply some value for <code>callSuper</code> to acknowledge that you've considered it; failure to do so results in a warning.\n\t\t</p><p>\n\t\t\tSetting <code>callSuper</code> to <em>true</em> when you don't extend anything (you extend <code>java.lang.Object</code>) is a compile-time error, because it would turn the generated <code>equals()</code> and <code>hashCode()</code> implementations into having the same behaviour as simply inheriting these methods from <code>java.lang.Object</code>: only the same object will be equal to each other and will have the same hashCode. Not setting <code>callSuper</code> to <em>true</em> when you extend another class generates a warning, because unless the superclass has no (equality-important) fields, lombok cannot generate an implementation for you that takes into account the fields declared by your superclasses. You'll need to write your own implementations, or rely on the <code>callSuper</code> chaining facility. You can also use the <code>lombok.equalsAndHashCode.callSuper</code> config key.\n\t\t</p><p>\n\t\t\tNote that lombok just defers to the <code>.equals()</code> implementation for all objects <em>except</em> primitives and arrays. Some well known types have possibly surprising equals implementations. For example, <code>java.math.BigDecimal</code> considers scale, i.e. <code>1E2</code> is not equal to <code>100</code> according to <code>BigDecimal</code>'s own <code>equals</code> implementation.\n\t\t</p><p>\n\t\t\t<em>CAUTION: </em> It is easy to override the equals behaviour for any field by writing a method that returns a mapped value and annotating it with <code>@EqualsAndHashCode.Include(replaces = \"fieldName\")</code>. For example, to address the <code>BigDecimal</code> equality issue, you could write <code>@EqualsAndHashCode.Include BigDecimal fieldName() { return fieldName.stripTrailingZeros(); }</code>.\n\t\t</p><p>\n\t\t\t<em>NEW in Lombok 0.10: </em>Unless your class is <code>final</code> and extends <code>java.lang.Object</code>, lombok generates a <code>canEqual</code> method which means JPA proxies can still be equal to their base class, but subclasses that add new state don't break the equals contract. The complicated reasons for why such a method is necessary are explained in this paper: <a href=\"https://www.artima.com/lejava/articles/equality.html\">How to Write an Equality Method in Java</a>. If all classes in a hierarchy are a mix of scala case classes and classes with lombok-generated equals methods, all equality will 'just work'. If you need to write your own equals methods, you should always override <code>canEqual</code> if you change <code>equals</code> and <code>hashCode</code>.\n\t\t</p><p>\n\t\t\t<em>NEW in Lombok 1.14.0: </em>To put annotations on the <code>other</code> parameter of the <code>equals</code> (and, if relevant, <code>canEqual</code>) method, you can use <code>onParam=@__({@AnnotationsHere})</code>. Be careful though! This is an experimental feature. For more details see the documentation on the <a ng-click=\"toFeature('on-x')\">onX</a> feature.\n\t\t</p><p>\n\t\t\t<em>NEW in Lombok 1.18.16: </em>The result of the generated <code>hashCode()</code> can be cached by setting <code>cacheStrategy</code> to a value other than <code>CacheStrategy.NEVER</code>. <em>Do not</em> use this if objects of the annotated class can be modified in any way that would lead to the result of <code>hashCode()</code> changing.\n\t\t</p>\n\t</@f.overview>\n\n\t<@f.snippets name=\"EqualsAndHashCode\" />\n\n\t<@f.confKeys>\n\t\t<dt>\n\t\t\t<code>lombok.equalsAndHashCode.doNotUseGetters</code> = [<code>true</code> | <code>false</code>] (default: false)\n\t\t</dt><dd>\n\t\t\tIf set to <code>true</code>, lombok will access fields directly instead of using getters (if available) when generating <code>equals</code> and <code>hashCode</code> methods. The annotation parameter '<code>doNotUseGetters</code>', if explicitly specified, takes precedence over this setting.\n\t\t</dd><dt>\n\t\t\t<code>lombok.equalsAndHashCode.callSuper</code> = [<code>call</code> | <code>skip</code> | <code>warn</code>] (default: warn)\n\t\t</dt><dd>\n\t\t\tIf set to <code>call</code>, lombok will generate calls to the superclass implementation of <code>hashCode</code> and <code>equals</code> if your class extends something. If set to <code>skip</code> no such calls are generated. The default behaviour is like <code>skip</code>, with an additional warning.\n\t\t</dd><dt>\n\t\t\t<code>lombok.equalsAndHashCode.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@EqualsAndHashCode</code> as a warning or error if configured.\n\t\t</dd>\n\t</@f.confKeys>\n\n\t<@f.smallPrint>\n\t\t<p>\n\t\t\tArrays are 'deep' compared/hashCoded, which means that arrays that contain themselves will result in <code>StackOverflowError</code>s. However, this behaviour is no different from e.g. <code>ArrayList</code>.\n\t\t</p><p>\n\t\t\tYou may safely presume that the hashCode implementation used will not change between versions of lombok, however this guarantee is not set in stone; if there's a significant performance improvement to be gained from using an alternate hash algorithm, that will be substituted in a future version.\n\t\t</p><p>\n\t\t\tFor the purposes of equality, 2 <code>NaN</code> (not a number) values for floats and doubles are considered equal, eventhough 'NaN == NaN' would return false. This is analogous to <code>java.lang.Double</code>'s equals method, and is in fact required to ensure that comparing an object to an exact copy of itself returns <code>true</code> for equality.\n\t\t</p><p>\n\t\t\tIf there is <em>any</em> method named either <code>hashCode</code> or <code>equals</code>, regardless of return type, no methods will be generated, and a warning is emitted instead. These 2 methods need to be in sync with each other, which lombok cannot guarantee unless it generates all the methods, hence you always get a warning if one <em>or</em> both of the methods already exist. You can mark any method with <code>@lombok.experimental.Tolerate</code> to hide them from lombok.\n\t\t</p><p>\n\t\t\tAttempting to exclude fields that don't exist or would have been excluded anyway (because they are static or transient) results in warnings on the named fields.\n\t\t</p><p>\n\t\t\tIf a method is marked for inclusion and it has the same name as a field, it replaces the field (the method is included, the field is excluded).\n\t\t</p><p>\n\t\t\tPrior to lombok 1.16.22, inclusion/exclusion could be done with the <code>of</code> and <code>exclude</code> parameters of the <code>@EqualsAndHashCode</code> annotation. This old-style inclusion mechanism is still supported but will be deprecated in the future.\n\t\t</p><p>\n\t\t\tBy default, any variables that start with a $ symbol are excluded automatically. You can only include them by marking them with <code>@EqualsAndHashCode.Include</code>.\n\t\t</p><p>\n\t\t\tIf a getter exists for a field to be included, it is called instead of using a direct field reference. This behaviour can be suppressed:<br />\n\t\t\t<code>@EqualsAndHashCode(doNotUseGetters = true)</code>\n\t\t</p><p>\n\t\t\tIf you have configured a nullity annotation flavour via <a href=\"configuration\"><code>lombok.config</code></a> key <code>lombok.addNullAnnotations</code>, the parameter of both the generated <code>equals</code> method as well as any <code>canEqual</code> method is annotated with a nullable annotation. This is required if you use a <code>@NonNullByDefault</code> style annotation in combination with strict nullity checking.\n\t\t</p>\n\t</@f.smallPrint>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/GetterLazy.html",
    "content": "<#import \"_features.html\" as f>\n\n<@f.scaffold title=\"@Getter(lazy=true)\" logline=\"Laziness is a virtue!\">\n\t<@f.history>\n\t\t<code>@Getter(lazy=true)</code> was introduced in Lombok v0.10.\n\t</@f.history>\n\t\n\t<@f.overview>\n\t\t<p>\n\t\t\tYou can let lombok generate a getter which will calculate a value once, the first time this getter is called, and cache it from then on. This can be useful if calculating the value takes a lot of CPU, or the value takes a lot of memory. To use this feature, create a <code>private final</code> variable, initialize it with the expression that's expensive to run, and annotate your field with <code>@Getter(lazy=true)</code>. The field will be hidden from the rest of your code, and the expression will be evaluated no more than once, when the getter is first called. There are no magic marker values (i.e. even if the result of your expensive calculation is <code>null</code>, the result is cached) and your expensive calculation need not be thread-safe, as lombok takes care of locking.\n\t\t</p>\n\t\t<p>\n\t\t\tIf the initialization expression is complex, or contains generics, we recommend moving the code to a private (if possible static) method, and call that instead.\n\t\t</p>\n\t</@f.overview>\n\n\t<@f.snippets name=\"GetterLazy\" />\n\n\t<@f.confKeys>\n\t\t<dt>\n\t\t\t<code>lombok.getter.lazy.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@Getter(lazy=true)</code> as a warning or error if configured.\n\t\t</dd>\n\t</@f.confKeys>\n\n\t<@f.smallPrint>\n\t\t<p>\n\t\t\tYou should never refer to the field directly, always use the getter generated by lombok, because the type of the field will be mangled into an <code>AtomicReference</code>. Do not try to directly access this <code>AtomicReference</code>; if it points to itself, the value has been calculated, and it is <code>null</code>. If the reference points to <code>null</code>, then the value has not been calculated. This behaviour may change in future versions. Therefore, <em>always</em> use the generated getter to access your field!\n\t\t</p><p>\n\t\t\tOther Lombok annotations such as <code>@ToString</code> always call the getter even if you use <code>doNotUseGetters=true</code>.\n\t\t</p>\n\t</@f.smallPrint>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/GetterSetter.html",
    "content": "<#import \"_features.html\" as f>\n\n<@f.scaffold title=\"@Getter and @Setter\" logline=\"Never write <code>public int getFoo() {return foo;}</code> again.\">\n\t<@f.overview>\n\t\t<p>\n\t\t\tYou can annotate any field with <code>@Getter</code> and/or <code>@Setter</code>, to let lombok generate the default getter/setter automatically.<br />\n\t\t\tA default getter simply returns the field, and is named <code>getFoo</code> if the field is called <code>foo</code> (or <code>isFoo</code> if the field's type is <code>boolean</code>). A default setter is named <code>setFoo</code> if the field is called <code>foo</code>, returns <code>void</code>, and takes 1 parameter of the same type as the field. It simply sets the field to this value.\n\t\t</p><p>\n\t\t\tThe generated getter/setter method will be <code>public</code> unless you explicitly specify an <code>AccessLevel</code>, as shown in the example below. Legal access levels are <code>PUBLIC</code>, <code>PROTECTED</code>, <code>PACKAGE</code>, and <code>PRIVATE</code>.\n\t\t</p><p>\n\t\t\tYou can also put a <code>@Getter</code> and/or <code>@Setter</code> annotation on a class. In that case, it's as if you annotate all the non-static fields in that class with the annotation.\n\t\t</p><p>\n\t\t\tYou can always manually disable getter/setter generation for any field by using the special <code>AccessLevel.NONE</code> access level. This lets you override the behaviour of a <code>@Getter</code>, <code>@Setter</code> or <code>@Data</code> annotation on a class.\n\t\t</p><p>\n\t\t\tTo put annotations on the generated method, you can use <code>onMethod=@__({@AnnotationsHere})</code>; to put annotations on the only parameter of a generated setter method, you can use <code>onParam=@__({@AnnotationsHere})</code>. Be careful though! This is an experimental feature. For more details see the documentation on the <a href=\"/features/experimental/onX\">onX</a> feature.\n\t\t</p><p>\n\t\t\t<em>NEW in lombok v1.12.0:</em> javadoc on the field will now be copied to generated getters and setters. Normally, all text is copied, and <code>@return</code> is <em>moved</em> to the getter, whilst <code>@param</code> lines are <em>moved</em> to the setter. Moved means: Deleted from the field's javadoc. It is also possible to define unique text for each getter/setter. To do that, you create a 'section' named <code>GETTER</code> and/or <code>SETTER</code>. A section is a line in your javadoc containing 2 or more dashes, then the text 'GETTER' or 'SETTER', followed by 2 or more dashes, and nothing else on the line. If you use sections, <code>@return</code> and <code>@param</code> stripping for that section is no longer done (move the <code>@return</code> or <code>@param</code> line into the section).\n\t\t</p>\n\t</@f.overview>\n\n\t<@f.snippets name=\"GetterSetter\" />\n\n\t<@f.confKeys>\n\t\t<dt>\n\t\t\t<code>lombok.accessors.chain</code> = [<code>true</code> | <code>false</code>] (default: false)\n\t\t</dt><dd>\n\t\t\tIf set to <code>true</code>, generated setters will return <code>this</code> (instead of <code>void</code>). An explicitly configured <code>chain</code> parameter of an <a href=\"/features/experimental/Accessors\"><code>@Accessors</code></a> annotation takes precedence over this setting.\n\t\t</dd><dt>\n\t\t\t<code>lombok.accessors.fluent</code> = [<code>true</code> | <code>false</code>] (default: false)\n\t\t</dt><dd>\n\t\t\tIf set to <code>true</code>, generated getters and setters will not be prefixed with the bean-standard '<code>get</code>, <code>is</code> or <code>set</code>; instead, the methods will use the same name as the field (minus prefixes). An explicitly configured <code>fluent</code> parameter of an <a href=\"/features/experimental/Accessors\"><code>@Accessors</code></a> annotation takes precedence over this setting.\n\t\t</dd><dt>\n\t\t\t<code>lombok.accessors.prefix</code> += <em>a field prefix</em> (default: empty list)\n\t\t</dt><dd>\n\t\t\tThis is a list property; entries can be added with the <code>+=</code> operator. Inherited prefixes from parent config files can be removed with the <code>-=</code> operator. Lombok will strip any matching field prefix from the name of a field in order to determine the name of the getter/setter to generate. For example, if <code>m</code> is one of the prefixes listed in this setting, then a field named <code>mFoobar</code> will result in a getter named <code>getFoobar()</code>, not <code>getMFoobar()</code>. An explicitly configured <code>prefix</code> parameter of an <a href=\"/features/experimental/Accessors\"><code>@Accessors</code></a> annotation takes precedence over this setting.\n\t\t</dd><dt>\n\t\t\t<code>lombok.getter.noIsPrefix</code> = [<code>true</code> | <code>false</code>] (default: false)\n\t\t</dt><dd>\n\t\t\tIf set to <code>true</code>, getters generated for <code>boolean</code> fields will use the <code>get</code> prefix instead of the default<code>is</code> prefix, and any generated code that calls getters, such as <code>@ToString</code>, will also use <code>get</code> instead of <code>is</code>\n\t\t</dd><dt>\n\t\t\t<code>lombok.accessors.capitalization</code> = [<code>basic</code> | <code>beanspec</code>] (default: basic)\n\t\t</dt><dd>\n\t\t\tControls how tricky cases like <code>uShaped</code> (one lowercase letter followed by an upper/titlecase letter) are capitalized. <code>basic</code> capitalizes that to <code>getUShaped</code>, and <code>beanspec</code> capitalizes that to <code>getuShaped</code> instead.<br />\n\t\t\tBoth strategies are commonly used in the java ecosystem, though <code>beanspec</code> is more common.\n\t\t</dd><dt>\n\t\t\t<code>lombok.setter.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@Setter</code> as a warning or error if configured.\n\t\t</dd><dt>\n\t\t\t<code>lombok.getter.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@Getter</code> as a warning or error if configured.\n\t\t</dd><dt>\n\t\t\t<code>lombok.copyableAnnotations</code> = [<em>A list of fully qualified types</em>] (default: empty list)\n\t\t</dt><dd>\n\t\t\tLombok will copy any of these annotations from the field to the setter parameter, and to the getter method. Note that lombok ships with a bunch of annotations 'out of the box' which are known to be copyable: All popular nullable/nonnull annotations.\n\t\t</dd>\n\t</@f.confKeys>\n\n\t<@f.smallPrint>\n\t\t<p>\n\t\t\tFor generating the method names, the first character of the field, if it is a lowercase character, is title-cased, otherwise, it is left unmodified. Then, get/set/is is prefixed.\n\t\t</p><p>\n\t\t\tNo method is generated if any method already exists with the same name (case insensitive) and same parameter count. For example, <code>getFoo()</code> will not be generated if there's already a method <code>getFoo(String... x)</code> even though it is technically possible to make the method. This caveat exists to prevent confusion. If the generation of a method is skipped for this reason, a warning is emitted instead. Varargs count as 0 to N parameters. You can mark any method with <code>@lombok.experimental.Tolerate</code> to hide them from lombok.\n\t\t</p><p>\n\t\t\tFor <code>boolean</code> fields that start with <code>is</code> immediately followed by a title-case letter, nothing is prefixed to generate the getter name.\n\t\t</p><p>\n\t\t\tAny variation on <code>boolean</code> will <em>not</em> result in using the <code>is</code> prefix instead of the <code>get</code> prefix; for example, returning <code>java.lang.Boolean</code> results in a <code>get</code> prefix, not an <code>is</code> prefix.\n\t\t</p><p>\n\t\t\tA number of annotations from popular libraries that indicate non-nullness, such as <code>javax.annotation.Nonnull</code>, if present on the field, result in an explicit null check in the generated setter.\n\t\t</p><p>\n\t\t\tVarious well-known annotations about nullability, such as <code>org.eclipse.jdt.annotation.NonNull</code>, are automatically copied over to the right place (method for getters, parameter for setters). You can specify additional annotations that should always be copied via lombok <a href=\"/features/configuration\">configuration key</a> <code>lombok.copyableAnnotations</code>.\n\t\t</p><p>\n\t\t\tYou can annotate a class with a <code>@Getter</code> or <code>@Setter</code> annotation. Doing so is equivalent to annotating all non-static fields in that class with that annotation. <code>@Getter</code>/<code>@Setter</code> annotations on fields take precedence over the ones on classes.\n\t\t</p><p>\n\t\t\tUsing the <code>AccessLevel.NONE</code> access level simply generates nothing. It's useful only in combination with <a href=\"/features/Data\"><code>@Data</code></a> or a class-wide <code>@Getter</code> or <code>@Setter</code>.\n\t\t</p><p>\n\t\t\t<code>@Getter</code> can also be used on enums. <code>@Setter</code> can't, not for a technical reason, but for a pragmatic one: Setters on enums are an extremely bad idea.\n\t\t</p>\n\t</@f.smallPrint>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/Locked.html",
    "content": "<#import \"_features.html\" as f>\n\n<@f.scaffold title=\"@Locked\" logline=\"Pop it and <strong>lock</strong> it! <code>ReentrantLock</code>, now with less hassle.\">\n\t<@f.history>\n\t\t<p>\n\t\t\t<code>@Locked</code> was introduced in lombok v1.18.32.\n\t\t</p>\n\t</@f.history>\n\n\t<@f.overview>\n\t\t<p>\n\t\t\t<code>@Locked</code> wraps all code in a method into a block that acquires a <code>java.util.concurrent.locks.ReentrantLock</code> first, and unlocks it when exiting the method. It is a lot like <a href=\"Synchronized\"><code>@Synchronized</code></a>.\n\t\t</p><p>\n\t\t\tYou can optionally name a field, which must be a <code>ReentrantLock</code>; in that case, lombok locks on that field. Otherwise, the annotation defaults to a field named <code>$LOCK</code> (on static methods) / <code>$lock</code> (on instance methods), which lombok will generate if the field does not exist yet.\n\t\t</p><p>\n\t\t\tAdditionally, there are the <code>@Locked.Read</code> and <code>@Locked.Write</code> annotations. These use a <code>java.util.concurrent.locks.ReadWriteLock</code> (specifically, <code>ReentrantReadWriteLock</code>). Methods annotated with <code>@Locked.Write</code> will lock on the write lock and methods annotated with <code>@Locked.Read</code> will lock on the read lock. When required, a <code>java.util.concurrent.locks.ReentrantReadWriteLock</code> is generated.\n\t\t</p><p>\n\t\t\tWhen using <a href=\"https://docs.oracle.com/en/java/javase/20/core/virtual-threads.html\">Virtual threads (introduced in Java 20)</a>, these locks are recommended compared to what <code>@Synchronized</code> does.\n\t\t</p>\n\t</@f.overview>\n\n\t<@f.snippets name=\"Locked\" />\n\n\t<@f.confKeys>\n\t\t<dt>\n\t\t\t<code>lombok.locked.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@Locked</code> as a warning or error if configured.\n\t\t</dd>\n\t</@f.confKeys>\n\n\t<@f.smallPrint>\n\t\t<p>\n\t\t\tBecause <code>@Locked.Read</code> and <code>@Locked.Write</code> use a different type of lock than <code>@Locked</code>, these annotations cannot be used on the same lock object without explicitly specifying the name of the field containing the lock object.<br />\n\t\t\tThe name of the default field of the <code>@Locked</code>, <code>@Locked.Read</code>, and <code>@Locked.Write</code> annotations is the same, so it is not possible to mix the basic <code>@Locked</code> annotation with the other two using the default name.\n\t\t</p>\n\t</@f.smallPrint>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/NonNull.html",
    "content": "<#import \"_features.html\" as f>\n\n<@f.scaffold title=\"@NonNull\" logline=\"or: How I learned to stop worrying and love the NullPointerException.\">\n\t<@f.history>\n\t\t<code>@NonNull</code> was introduced in lombok v0.11.10.\n\t</@f.history>\n\t\n\t<@f.overview>\n\t\t<p>\n\t\t\tYou can use <code>@NonNull</code> on a record component, or a parameter of a method or constructor. This will cause lombok to generate a null-check statement for you.\n\t\t</p><p>\n\t\t\tLombok has always treated various annotations generally named <code>@NonNull</code> on a field as a signal to generate a null-check if lombok generates an entire method or constructor for you, via for example <a href=\"/features/Data\"><code>@Data</code></a>. However, using lombok's own <code>@lombok.NonNull</code> on a parameter or record component results in the insertion of the null-check at the top of that method.\n\t\t</p><p>\n\t\t\tThe null-check looks like <code>if (param == null) throw new NullPointerException(\"param is marked non-null but is null\");</code> and will be inserted at the very top of your method. For constructors, the null-check will be inserted immediately following any explicit <code>this()</code> or <code>super()</code> calls. For record components, the null-check will be inserted in the 'compact constructor' (the one that has no argument list at all), which will be generated if you have no constructor. If you have written out the record constructor in long form (with parameters matching your components exactly), then nothing happens - you'd have to annotate the parameters of this long-form constructor instead.\n\t\t</p><p>\n\t\t\tIf a null-check is already present at the top, no additional null-check will be generated.\n\t\t</p>\n\t</@f.overview>\n\n\t<@f.snippets name=\"NonNull\" />\n\n\t<@f.confKeys>\n\t\t<dt>\n\t\t\t<code>lombok.nonNull.exceptionType</code> = [<code>NullPointerException</code> | <code>IllegalArgumentException</code> | <code>JDK</code> | <code>Guava</code> | <code>Assertion</code>] (default: <code>NullPointerException</code>).\n\t\t</dt><dd>\n\t\t\tWhen lombok generates a null-check <code>if</code> statement, by default, a <code>java.lang.NullPointerException</code> will be thrown with '<em>field name</em> is marked non-null but is null' as the exception message. However, you can use <code>IllegalArgumentException</code> in this configuration key to have lombok throw that exception with this message instead. By using <code>Assertion</code>, an <code>assert</code> statement with the same message will be generated. The keys <code>JDK</code> or <code>Guava</code> result in an invocation to the standard nullcheck method of these two frameworks: <code>java.util.Objects.requireNonNull([field name here], \"[field name here] is marked non-null but is null\");</code> or <code>com.google.common.base.Preconditions.checkNotNull([field name here], \"[field name here] is marked non-null but is null\");</code> respectively.\n\t\t</dd><dt>\n\t\t\t<code>lombok.nonNull.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@NonNull</code> as a warning or error if configured.\n\t\t</dd>\n\t</@f.confKeys>\n\n\t<@f.smallPrint>\n\t\t<p>\n\t\t\tLombok's detection scheme for already existing null-checks consists of scanning for if statements or assert statements that look just like lombok's own. Any 'throws' statement as the 'then' part of the if statement, whether in braces or not, counts. Any invocation to any method named <code>requireNonNull</code> or <code>checkNotNull</code> counts. The conditional of the if statement <em>must</em> look exactly like <code>PARAMNAME == null</code>; the assert statement <em>must</em> look exactly like <code>PARAMNAME != null</code>. The invocation to a <code>requireNonNull</code>-style method must be on its own (a statement which just invokes that method), or must be the expression of an assignment or variable declaration statement. The first statement in your method that is not such a null-check stops the process of inspecting for null-checks.\n\t\t</p><p>\n\t\t\tWhile <code>@Data</code> and other method-generating lombok annotations will trigger on various well-known annotations that signify the field must never be <code>@NonNull</code>, this feature only triggers on lombok's own <code>@NonNull</code> annotation from the <code>lombok</code> package.\n\t\t</p><p>\n\t\t\tA <code>@NonNull</code> on a primitive parameter results in a warning. No null-check will be generated.\n\t\t</p><p>\n\t\t\tA <code>@NonNull</code> on a parameter of an abstract method used to generate a warning; starting with version 1.16.8, this is no longer the case, to acknowledge the notion that <code>@NonNull</code> also has a documentary role. For the same reason, you can annotate a method as <code>@NonNull</code>; this is allowed, generates no warning, and does not generate any code.\n\t\t</p>\n\t</@f.smallPrint>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/SneakyThrows.html",
    "content": "<#import \"_features.html\" as f>\n\n<@f.scaffold title=\"@SneakyThrows\" logline=\"To boldly throw checked exceptions where no one has thrown them before!\">\n\t<@f.overview>\n\t\t<p>\n\t\t\t<code>@SneakyThrows</code> can be used to sneakily throw checked exceptions without actually declaring this in your method's <code>throws</code> clause. This somewhat contentious ability should be used carefully, of course. The code generated by lombok will not ignore, wrap, replace, or otherwise modify the thrown checked exception; it simply fakes out the compiler. On the JVM (class file) level, all exceptions, checked or not, can be thrown regardless of the <code>throws</code> clause of your methods, which is why this works.\n\t\t</p><p>\n\t\t\tCommon use cases for when you want to opt out of the checked exception mechanism center around 2 situations:<br />\n\t\t\t<ul>\n\t\t\t\t<li>\n\t\t\t\t\tA needlessly strict interface, such as <code>Runnable</code> - whatever exception propagates out of your <code>run()</code> method, checked or not, it will be passed to the <code>Thread</code>'s unhandled exception handler. Catching a checked exception and wrapping it in some sort of <code>RuntimeException</code> is only obscuring the real cause of the issue.\n\t\t\t\t</li><li>\n\t\t\t\t\tAn 'impossible' exception. For example, <code>new String(someByteArray, \"UTF-8\");</code> declares that it can throw an <code>UnsupportedEncodingException</code> but according to the JVM specification, UTF-8 <em>must</em> always be available. An <code>UnsupportedEncodingException</code> here is about as likely as a <code>ClassNotFoundError</code> when you use a String object, and you don't catch those either!\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t</p><p>\n\t\t\tBeing constrained by needlessly strict interfaces is particularly common when using lambda syntax (<code>arg -> action</code>); however, lambdas cannot be annotated, which means it is not so easy to use <code>@SneakyThrows</code> in combination with lambdas.\n\t\t</p><p>\n\t\t\tBe aware that it is <em>impossible</em> to catch sneakily thrown checked types directly, as javac will not let you write a catch block for an exception type that no method call in the try body declares as thrown. This problem is not relevant in either of the use cases listed above, so let this serve as a warning that you should not use the <code>@SneakyThrows</code> mechanism without some deliberation!\n\t\t</p><p>\n\t\t\tYou can pass any number of exceptions to the <code>@SneakyThrows</code> annotation. If you pass no exceptions, you may throw any exception sneakily.\n\t\t</p>\n\t</@f.overview>\n\n\t<@f.snippets name=\"SneakyThrows\" />\n\n\t<@f.confKeys>\n\t\t<dt>\n\t\t\t<code>lombok.sneakyThrows.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@SneakyThrows</code> as a warning or error if configured.\n\t\t</dd>\n\t</@f.confKeys>\n\n\t<@f.smallPrint>\n\t\t<p>\n\t\t\tBecause <code>@SneakyThrows</code> is an implementation detail and not part of your method signature, it is an error if you try to declare a checked exception as sneakily thrown when you don't call any methods that throw this exception. (Doing so is perfectly legal for <code>throws</code> statements to accommodate subclasses). Similarly, <code>@SneakyThrows</code> does not inherit.\n\t\t</p><p>\n\t\t\tFor the nay-sayers in the crowd: Out of the box, Eclipse will offer a 'quick-fix' for uncaught exceptions that wraps the offending statement in a try/catch block with just <code>e.printStackTrace()</code> in the catch block. This is so spectacularly non-productive compared to just sneakily throwing the exception onwards, that Roel and Reinier feel more than justified in claiming that the checked exception system is far from perfect, and thus an opt-out mechanism is warranted.\n\t\t</p><p>\n\t\t\tIf you put <code>@SneakyThrows</code> on a constructor, any call to a sibling or super constructor is <em>excluded</em> from the <code>@SneakyThrows</code> treatment. This is a java restriction we cannot work around: Calls to sibling/super constructors MUST be the first statement in the constructor; they cannot be placed inside try/catch blocks.\n\t\t</p><p>\n\t\t\t<code>@SneakyThrows</code> on an empty method, or a constructor that is empty or only has a call to a sibling / super constructor results in no try/catch block and a warning.\n\t\t</p>\n\t</@f.smallPrint>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/Synchronized.html",
    "content": "<#import \"_features.html\" as f>\n\n<@f.scaffold title=\"@Synchronized\" logline=\"<code>synchronized</code> done right: Don't expose your locks.\">\n\t<@f.overview>\n\t\t<p>\n\t\t\t<code>@Synchronized</code> is a safer variant of the <code>synchronized</code> method modifier. Like <code>synchronized</code>, the annotation can be used on static and instance methods only. It operates similarly to the <code>synchronized</code> keyword, but it locks on different objects. The keyword locks on <code>this</code>, but the annotation locks on a field named <code>$lock</code>, which is private.<br />\n\t\t\tIf the field does not exist, it is created for you. If you annotate a <code>static</code> method, the annotation locks on a static field named <code>$LOCK</code> instead.\n\t\t</p><p>\n\t\t\tIf you want, you can create these locks yourself. The <code>$lock</code> and <code>$LOCK</code> fields will of course not be generated if you already created them yourself. You can also choose to lock on another field, by specifying it as parameter to the <code>@Synchronized</code> annotation. In this usage variant, the fields will not be created automatically, and you must explicitly create them yourself, or an error will be emitted.\n\t\t</p><p>\n\t\t\tLocking on <code>this</code> or your own class object can have unfortunate side-effects, as other code not under your control can lock on these objects as well, which can cause race conditions and other nasty threading-related bugs.\n\t\t</p><p>\n\t\t\tIf you would prefer <code>java.util.concurrent.locks</code> style locks (recommended if you're using virtual threads), have a look at <a href=\"Locked\"><code>@Locked</code></a>.\n\t\t</p>\n\t</@f.overview>\n\n\t<@f.snippets name=\"Synchronized\" />\n\n\t<@f.confKeys>\n\t\t<dt>\n\t\t\t<code>lombok.synchronized.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@Synchronized</code> as a warning or error if configured.\n\t\t</dd>\n\t</@f.confKeys>\n\n\t<@f.smallPrint>\n\t\t<p>\n\t\t\tIf <code>$lock</code> and/or <code>$LOCK</code> are auto-generated, the fields are initialized with an empty <code>Object[]</code> array, and not just a <code>new Object()</code> as most snippets showing this pattern in action use. Lombok does this because a new object is <em>NOT</em> serializable, but 0-size array is. Therefore, using <code>@Synchronized</code> will not prevent your object from being serialized.\n\t\t</p><p>\n\t\t\tHaving at least one <code>@Synchronized</code> method in your class means there will be a lock field, but if you later remove all such methods, there will no longer be a lock field. That means your predetermined <code>serialVersionUID</code> changes. We suggest you <em>always</em> add a <code>serialVersionUID</code> to your classes if you intend to store them long-term via java's serialization mechanism. If you do so, removing all <code>@Synchronized</code> annotations from your method will not break serialization.\n\t\t</p><p>\n\t\t\tIf you'd like to know why a field is not automatically generated when you choose your own name for the lock object: Because otherwise making a typo in the field name will result in a <em>very</em> hard to find bug!\n\t\t</p>\n\t</@f.smallPrint>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/ToString.html",
    "content": "<#import \"_features.html\" as f>\n\n<@f.scaffold title=\"@ToString\" logline=\"No need to start a debugger to see your fields: Just let lombok generate a <code>toString</code> for you!\">\n\t<@f.overview>\n\t\t<p>\n\t\t\tAnnotating a class with <code>@ToString</code> will cause lombok to generate an implementation of the <code>toString()</code> method. You use configuration options to specify whether field names should be included but otherwise the format is fixed: the class name followed by parentheses containing fields separated by commas, e.g. <code>MyClass(foo=123, bar=234)</code>.\n\t\t</p><p>\n\t\t\tBy setting the <code>includeFieldNames</code> parameter to <em>true</em> you can add some clarity (but also quite some length) to the output of the <code>toString()</code> method.\n\t\t</p><p>\n\t\t\tBy default, all non-static fields will be printed. If you want to skip some fields, you can annotate these fields with <code>@ToString.Exclude</code>. Alternatively, you can specify exactly which fields you wish to be used by using <code>@ToString(onlyExplicitlyIncluded = true)</code>, then marking each field you want to include with <code>@ToString.Include</code>.\n\t\t</p><p>\n\t\t\tBy setting <code>callSuper</code> to <em>true</em>, you can include the output of the superclass implementation of <code>toString</code> to the output. Be aware that the default implementation of <code>toString()</code> in <code>java.lang.Object</code> is pretty much meaningless, so you probably don't want to do this unless you are extending another class.\n\t\t</p><p>\n\t\t\tYou can also include the output of a method call in your <code>toString</code>. Only instance (non-static) methods that take no arguments can be included. To do so, mark the method with <code>@ToString.Include</code>.\n\t\t</p><p>\n\t\t\tYou can change the name used to identify the member with <code>@ToString.Include(name = \"some other name\")</code>, and you can change the order in which the members are printed via <code>@ToString.Include(rank = -1)</code>. Members without a rank are considered to have rank 0, members of a higher rank are printed first, and members of the same rank are printed in the same order they appear in the source file.\n\t\t</p>\n\t</@f.overview>\n\n\t<@f.snippets name=\"ToString\" />\n\n\t<@f.confKeys>\n\t\t<dt>\n\t\t\t<code>lombok.toString.includeFieldNames</code> = [<code>true</code> | <code>false</code>] (default: true)\n\t\t</dt><dd>\n\t\t\tNormally lombok generates a fragment of the toString response for each field in the form of <code>fieldName = fieldValue</code>. If this setting is set to <code>false</code>, lombok will omit the name of the field and simply deploy a comma-separated list of all the field values. The annotation parameter '<code>includeFieldNames</code>', if explicitly specified, takes precedence over this setting.\n\t\t</dd><dt>\n\t\t\t<code>lombok.toString.doNotUseGetters</code> = [<code>true</code> | <code>false</code>] (default: false)\n\t\t</dt><dd>\n\t\t\tIf set to <code>true</code>, lombok will access fields directly instead of using getters (if available) when generating <code>toString</code> methods. The annotation parameter '<code>doNotUseGetters</code>', if explicitly specified, takes precedence over this setting.\n\t\t</dd><dt>\n\t\t\t<code>lombok.toString.callSuper</code> = [<code>call</code> | <code>skip</code> | <code>warn</code>] (default: skip)\n\t\t</dt><dd>\n\t\t\tIf set to <code>call</code>, lombok will generate calls to the superclass implementation of <code>toString</code> if your class extends something. If set to <code>skip</code> no such call is generated. If set to <code>warn</code> no such call is generated either, but lombok does generate a warning to tell you about it.\n\t\t</dd><dt>\n\t\t\t<code>lombok.toString.onlyExplicitlyIncluded</code> = [<code>true</code> | <code>false</code>] (default: false)\n\t\t</dt><dd>\n\t\t\tIf set to <code>false</code> (default), all fields (unless <code>static</code>, name starts with a dollar, or otherwise excluded for obvious reasons) serve as the default set of things to include in the toString, modifiable by using the <code>@ToString.Exclude</code> and <code>@ToString.Include</code> options.\n\t\t\tIf set to <code>true</code>, nothing is included unless explicitly marked with <code>@ToString.Include</code>.\n\t\t</dd><dt>\n\t\t\t<code>lombok.toString.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@ToString</code> as a warning or error if configured.\n\t\t</dd>\n\t</@f.confKeys>\n\n\t<@f.smallPrint>\n\t\t<p>\n\t\t\tIf there is <em>any</em> method named <code>toString</code> with no arguments, regardless of return type, no method will be generated, and instead a warning is emitted explaining that your <code>@ToString</code> annotation is doing nothing. You can mark any method with <code>@lombok.experimental.Tolerate</code> to hide them from lombok.\n\t\t</p><p>\n\t\t\tArrays are printed via <code>Arrays.deepToString</code>, which means that arrays that contain themselves will result in <code>StackOverflowError</code>s. However, this behaviour is no different from e.g. <code>ArrayList</code>.\n\t\t</p><p>\n\t\t\tIf a method is marked for inclusion and it has the same name as a field, it replaces the toString output for that field (the method is included, the field is excluded, and the method's output is printed in the place the field would be printed).\n\t\t</p><p>\n\t\t\tPrior to lombok 1.16.22, inclusion/exclusion could be done with the <code>of</code> and <code>exclude</code> parameters of the <code>@ToString</code> annotation. This old-style inclusion mechanism is still supported but will be deprecated in the future.\n\t\t</p><p>\n\t\t\tHaving both <code>@ToString.Exclude</code> and <code>@ToString.Include</code> on a member generates a warning; the member will be excluded in this case.\n\t\t</p><p>\n\t\t\tWe don't promise to keep the output of the generated <code>toString()</code> methods the same between lombok versions. You should never design your API so that other code is forced to parse your <code>toString()</code> output anyway!\n\t\t</p><p>\n\t\t\tBy default, any variables that start with a $ symbol are excluded automatically. You can only include them by using the <code>@ToString.Include</code> annotation.\n\t\t</p><p>\n\t\t\tIf a getter exists for a field to be included, it is called instead of using a direct field reference. This behaviour can be suppressed:<br />\n\t\t\t<code>@ToString(doNotUseGetters = true)</code>\n\t\t</p><p>\n\t\t\t<code>@ToString</code> can also be used on an enum definition.\n\t\t</p><p>\n\t\t\tIf you have configured a nullity annotation flavour via <a href=\"configuration\"><code>lombok.config</code></a> key <code>lombok.addNullAnnotations</code>, the method or return type (as appropriate for the chosen flavour) is annotated with a non-null annotation.\n\t\t</p>\n\t</@f.smallPrint>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/Value.html",
    "content": "<#import \"_features.html\" as f>\n\n<@f.scaffold title=\"@Value\" logline=\"Immutable classes made very easy.\">\n\t<@f.history>\n\t\t<p>\n\t\t\t<code>@Value</code> was introduced as experimental feature in lombok v0.11.4.\n\t\t</p><p>\n\t\t\t<code>@Value</code> no longer implies <code>@With</code> since lombok v0.11.8.\n\t\t</p><p>\n\t\t\t<code>@Value</code> promoted to the main <code>lombok</code> package since lombok v0.12.0.\n\t\t</p>\n\t</@f.history>\n\n\t<@f.overview>\n\t\t<p>\n\t\t\t<code>@Value</code> is the immutable variant of <a href=\"/features/Data\"><code>@Data</code></a>; all fields are made <code>private</code> and <code>final</code> by default, and setters are not generated. The class itself is also made <code>final</code> by default, because immutability is not something that can be forced onto a subclass. Like <code>@Data</code>, useful <code>toString()</code>, <code>equals()</code> and <code>hashCode()</code> methods are also generated, each field gets a getter method, and a constructor that covers every argument (except <code>final</code> fields that are initialized in the field declaration) is also generated.\n\t\t</p><p>\n\t\t\tIn practice, <code>@Value</code> is shorthand for: <code>final @ToString @EqualsAndHashCode @AllArgsConstructor @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) @Getter</code>, except that explicitly including an implementation of any of the relevant methods simply means that part won't be generated and no warning will be emitted. For example, if you write your own <code>toString</code>, no error occurs, and lombok will not generate a <code>toString</code>. Also, <em>any</em> explicit constructor, no matter the arguments list, implies lombok will not generate a constructor. If you do want lombok to generate the all-args constructor, add <code>@AllArgsConstructor</code> to the class. Note that if both `@Builder` and `@Value` are on a class, the package private allargs constructor that `@Builder` wants to make 'wins' over the public one that `@Value` wants to make. You can mark any constructor or method with <code>@lombok.experimental.Tolerate</code> to hide them from lombok.\n\t\t</p><p>\n\t\t\tIt is possible to override the final-by-default and private-by-default behavior using either an explicit access level on a field, or by using the <code>@NonFinal</code> or <code>@PackagePrivate</code> annotations. <code>@NonFinal</code> can also be used on a class to remove the final keyword. <br />\n\t\t\tIt is possible to override any default behavior for any of the 'parts' that make up <code>@Value</code> by explicitly using that annotation.\n\t\t</p>\n\t</@f.overview>\n\n\t<@f.snippets name=\"Value\" />\n\n\t<@f.confKeys>\n\t\t<dt>\n\t\t\t<code>lombok.value.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@Value</code> as a warning or error if configured.\n\t\t</dd><dt>\n\t\t\t<code>lombok.noArgsConstructor.extraPrivate</code> = [<code>true</code> | <code>false</code>] (default: false)\n\t\t</dt><dd>\n\t\t\tIf <code>true</code>, lombok will generate a private no-args constructor for any <code>@Value</code> annotated class, which sets all fields to default values (null / 0 / false).\n\t\t</dd>\n\t</@f.confKeys>\n\n\t<@f.smallPrint>\n\t\t<p>\n\t\t\tLook for the documentation on the 'parts' of <code>@Value</code>: <a href=\"/features/ToString\"><code>@ToString</code></a>, <a href=\"/features/EqualsAndHashCode\"><code>@EqualsAndHashCode</code></a>, <a href=\"/features/Constructor\"><code>@AllArgsConstructor</code></a>, <a href=\"/features/experimental/FieldDefaults\"><code>@FieldDefaults</code></a>, and <a href=\"/features/GetterSetter\"><code>@Getter</code></a>.\n\t\t</p><p>\n\t\t\tFor classes with generics, it's useful to have a static method which serves as a constructor, because inference of generic parameters via static methods works in java6 and avoids having to use the diamond operator. While you can force this by applying an explicit <code>@AllArgsConstructor(staticConstructor=\"of\")</code> annotation, there's also the <code>@Value(staticConstructor=\"of\")</code> feature, which will make the generated all-arguments constructor private, and generates a public static method named <code>of</code> which is a wrapper around this private constructor.\n\t\t</p><p>\n\t\t\tVarious well known annotations about nullity cause null checks to be inserted and will be copied to the relevant places (such as the method for getters, and the parameter for the constructor and setters). See <a href=\"/features/GetterSetter\">Getter/Setter</a> documentation's small print for more information.\n\t\t</p><p>\n\t\t\t<code>@Value</code> was an experimental feature from v0.11.4 to v0.11.9 (as <code>@lombok.experimental.Value</code>). It has since been moved into the core package. The old annotation is still around (and is an alias). It will eventually be removed in a future version, though.\n\t\t</p><p>\n\t\t\tIt is not possible to use <code>@FieldDefaults</code> to 'undo' the private-by-default and final-by-default aspect of fields in the annotated class. Use <code>@NonFinal</code> and <code>@PackagePrivate</code> on the fields in the class to override this behaviour.\n\t\t</p>\n\t</@f.smallPrint>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/With.html",
    "content": "<#import \"_features.html\" as f>\n\n<@f.scaffold title=\"@With\" logline=\"Immutable 'setters' - methods that create a clone but with one changed field.\">\n\t<@f.history>\n\t\t<p>\n\t\t\t<code>@Wither</code> was introduced as experimental feature in lombok v0.11.4.\n\t\t</p><p>\n\t\t\t<code>@Wither</code> was renamed to <code>@With</code>, and moved out of experimental and into the core package, in lombok v1.18.10.\n\t</@f.history>\n\n\t<@f.overview>\n\t\t<p>\n\t\t\tThe next best alternative to a setter for an immutable property is to construct a clone of the object, but with a new value for this one field. A method to generate this clone is precisely what <code>@With</code> generates: a <code>withFieldName(newValue)</code> method which produces a clone except for the new value for the associated field.\n\t\t</p><p>\n\t\t\tFor example, if you create <code>public class Point { private final int x, y; }</code>, setters make no sense because the fields are final. <code>@With</code> can generate a <code>withX(int newXValue)</code> method for you which will return a new point with the supplied value for <code>x</code> and the same value for <code>y</code>.\n\t\t</p><p>\n\t\t\tThe <code>@With</code> relies on a constructor for all fields in order to do its work. If this constructor does not exist, your <code>@With</code> annotation will result in a compile time error message. You can use Lombok's own <a href=\"/features/constructor\"><code>@AllArgsConstructor</code></a>, or as <a href=\"/features/Value\"><code>Value</code></a> will automatically produce an all args constructor as well, you can use that too. It's of course also acceptable if you manually write this constructor. It must contain all non-static fields, in the same lexical order.\n\t\t</p><p>\n\t\t\tLike <a href=\"/features/GetterSetter\"><code>@Setter</code></a>, you can specify an access level in case you want the generated with method to be something other than <code>public</code>:<br /> <code>@With(level = AccessLevel.PROTECTED)</code>. Also like <a href=\"/features/GetterSetter\"><code>@Setter</code></a>, you can also put a <code>@With</code> annotation on a type, which means a <code>with</code> method is generated for each field (even non-final fields).\n\t\t</p><p>\n\t\t\tTo put annotations on the generated method, you can use <code>onMethod=@__({@AnnotationsHere})</code>. Be careful though! This is an experimental feature. For more details see the documentation on the <a href=\"/features/experimental/onX\">onX</a> feature.\n\t\t</p><p>\n\t\t\tjavadoc on the field will be copied to generated with methods. Normally, all text is copied, and <code>@param</code> is <em>moved</em> to the with method, whilst <code>@return</code> lines are stripped from the with method's javadoc. Moved means: Deleted from the field's javadoc. It is also possible to define unique text for the with method's javadoc. To do that, you create a 'section' named <code>WITH</code>. A section is a line in your javadoc containing 2 or more dashes, then the text 'WITH', followed by 2 or more dashes, and nothing else on the line. If you use sections, <code>@return</code> and <code>@param</code> stripping / copying for that section is no longer done (move the <code>@param</code> line into the section).\n\t\t</p>\n\t</@f.overview>\n\n\t<@f.snippets name=\"With\" />\n\n\t<@f.confKeys>\n\t\t<dt>\n\t\t\t<code>lombok.accessors.prefix</code> += <em>a field prefix</em> (default: empty list)\n\t\t</dt><dd>\n\t\t\tThis is a list property; entries can be added with the <code>+=</code> operator. Inherited prefixes from parent config files can be removed with the <code>-=</code> operator. Lombok will strip any matching field prefix from the name of a field in order to determine the name of the getter/setter to generate. For example, if <code>m</code> is one of the prefixes listed in this setting, then a field named <code>mFoobar</code> will result in a getter named <code>getFoobar()</code>, not <code>getMFoobar()</code>. An explicitly configured <code>prefix</code> parameter of an <a href=\"/features/experimental/Accessors\"><code>@Accessors</code></a> annotation takes precedence over this setting.\n\t\t</dd><dt>\n\t\t\t<code>lombok.accessors.capitalization</code> = [<code>basic</code> | <code>beanspec</code>] (default: basic)\n\t\t</dt><dd>\n\t\t\tControls how tricky cases like <code>uShaped</code> (one lowercase letter followed by an upper/titlecase letter) are capitalized. <code>basic</code> capitalizes that to <code>withUShaped</code>, and <code>beanspec</code> capitalizes that to <code>withuShaped</code> instead.<br />\n\t\t\tBoth strategies are commonly used in the java ecosystem, though <code>beanspec</code> is more common.\n\t\t<dt>\n\t\t\t<code>lombok.with.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@With</code> as a warning or error if configured.\n\t\t</dd>\n\t</@f.confKeys>\n\n\t<@f.smallPrint>\n\t\t<p>\n\t\t\tWith methods cannot be generated for static fields because that makes no sense.\n\t\t</p><p>\n\t\t\tWith methods can be generated for abstract classes, but this generates an abstract method with the appropriate signature.\n\t\t</p><p>\n\t\t\tWhen applying <code>@With</code> to a type, static fields and fields whose name start with a $ are skipped.\n\t\t</p><p>\n\t\t\tFor generating the method names, the first character of the field, if it is a lowercase character, is title-cased, otherwise, it is left unmodified. Then, <code>with</code> is prefixed.\n\t\t</p><p>\n\t\t\tNo method is generated if any method already exists with the same name (case insensitive) and same parameter count. For example, <code>withX(int x)</code> will not be generated if there's already a method <code>withX(String... x)</code> even though it is technically possible to make the method. This caveat exists to prevent confusion. If the generation of a method is skipped for this reason, a warning is emitted instead. Varargs count as 0 to N parameters.\n\t\t</p><p>\n\t\t\tVarious well known annotations about nullity cause null checks to be inserted and will be copied to the parameter. See <a href=\"/features/GetterSetter\">Getter/Setter</a> documentation's small print for more information.\n\t\t</p><p>\n\t\t\tIf you have configured a nullity annotation flavour via <a href=\"configuration\"><code>lombok.config</code></a> key <code>lombok.addNullAnnotations</code>, the method or return type (as appropriate for the chosen flavour) is annotated with a non-null annotation.\n\t\t</p>\n\t</@f.smallPrint>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/_features.html",
    "content": "<#import \"/_scaffold.html\" as main>\n\n<#macro featureSection>\n\t<div class=\"row\">\n\t\t<#nested>\n\t</div>\n</#macro>\n\n<#macro history>\n\t<div class=\"row\">\n\t\t<#nested>\n\t</div>\n</#macro>\n\n<#macro overview>\n\t<div class=\"row\">\n\t\t<@main.h2 title=\"Overview\" />\n\t\t<#nested>\n\t</div>\n</#macro>\n\n<#macro experimental>\n\t<div class=\"row\">\n\t\t<@main.h2 title=\"Experimental\" />\n\n\t\tExperimental because:\n\t\t<#nested>\n\t</div>\n</#macro>\n\n<#macro snippets name>\n\t<div class=\"row container-fluid\">\n\t\t<div class=\"snippet-col first-snippet\">\n\t\t\t<@main.h2 title=\"With Lombok\" />\n\n\t\t\t<div class=\"snippet\">${usages.pre(name)?no_esc}</div>\n\t\t</div>\n\t\t<div class=\"sep\"></div>\n\t\t<div class=\"snippet-col second-snippet\">\n\t\t\t<@main.h2 title=\"Vanilla Java\" />\n\n\t\t\t<div class=\"snippet\">${usages.post(name)?no_esc}</div>\n\t\t</div>\n\t</div>\n</#macro>\n\n<#macro confKeys>\n\t<div class=\"row\">\n\t\t<@main.h2 title=\"Supported configuration keys:\" />\n\t\t<dl>\n\t\t\t<#nested>\n\t\t</dl>\n\t</div>\n</#macro>\n\n<#macro smallPrint>\n\t<div class=\"row\">\n\t\t<@main.h2 title=\"Small print\" />\n\n\t\t<div class=\"smallprint\">\n\t\t\t<#nested>\n\t\t</div>\n\t</div>\n</#macro>\n\n<#macro scaffold title logline load=[]>\n\t<@main.scaffold load title>\n\t\t<a class=\"tidelift-link\" href=\"/tidelift\">Get Lombok for Enterprise</a>\n\t\t<div class=\"page-header top5\" id=\"featureContent\">\n\t\t\t<div class=\"row text-center\">\n\t\t\t\t<div class=\"header-group\">\n\t\t\t\t\t<@main.h1 title=\"${title}\" />\n\n\t\t\t\t\t<@main.h2 title=\"${logline?no_esc}\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<#nested>\n\t\t</div>\n\t</@main.scaffold>\n</#macro>\n"
  },
  {
    "path": "website/templates/features/configuration.html",
    "content": "<#import \"_features.html\" as f>\n\n<@f.scaffold title=\"Configuration system\" logline=\"Lombok, made to order: Configure lombok features in one place for your entire project or even your workspace.\">\n\t<@f.history>\n\t\tThe configuration system was introduced in lombok 1.14.<br />\n\t\tThe <a href=\"#import\"><code>import</code> directive</a> was added in lombok 1.18.12.<br />\n\t\tThe <a href=\"#addNullAnnotations\"><code>lombok.addNullAnnotations</code> configuration key</a> was added in lombok 1.18.12.<br />\n\t</@f.history>\n\t\n\t<@f.overview>\n\t\t<p>\n\t\t\tYou can create <code>lombok.config</code> files in any directory and put configuration directives in it. These apply to all source files in this directory and all child directories.<br />\n\t\t\tThe configuration system is particularly useful for configurable aspects of lombok which tend to be the same across an entire project, such as the name of your log variable. The configuration system can also be used to tell lombok to flag any usage of some lombok feature you don't like as a warning or even an error.\n\t\t</p><p>\n\t\t\tUsually, a user of lombok puts a <code>lombok.config</code> file with their preferences in a workspace or project root directory, with the special <code>config.stopBubbling = true</code> key to tell lombok this is your root directory. You can then create <code>lombok.config</code> files in any subdirectories (generally representing projects or source packages) with different settings.\n\t\t</p><p>\n\t\t\tAn up to date list of all configuration keys supported by your version of lombok can be generated by running:\n\t\t\t<ol class=\"snippet example cmd\">\n\t\t\t\t<li><code>java -jar lombok.jar config -g --verbose</code></li>\n\t\t\t</ol>\n\t\t\tThe output of the <em>config</em> tool is itself a valid <code>lombok.config</code> file.<br />\n\t\t\tThe <em>config</em> tool can also be used to display the complete lombok configuration used for any given directory or source file by supplying these as arguments.\n\t\t</p><p>\n\t\t\tA sample of available configuration options (see the feature pages of the lombok features for their related config keys, as well as <code>java -jar lombok.jar config -g</code> for the complete list):\n\t\t\t<dl>\n\t\t\t\t<dt>\n\t\t\t\t\t<code>lombok.accessors.chain</code>\n\t\t\t\t</dt><dd>\n\t\t\t\t\tIf set to <code>true</code>, generated setters will 'chain' by default (They will return <code>this</code> instead of having a <code>void</code> return type).\n\t\t\t\t</dd><dt>\n\t\t\t\t\t<code>lombok.accessors.fluent</code>\n\t\t\t\t</dt><dd>\n\t\t\t\t\tIf set to <code>true</code>, generated setters and getters will simply be named the same as the field name, without a <code>get</code> or <code>set</code> prefix.\n\t\t\t\t</dd><dt>\n\t\t\t\t\t<code>lombok.anyConstructor.addConstructorProperties</code>\n\t\t\t\t</dt><dd>\n\t\t\t\t\tIf <code>true</code>, lombok will generate a <code>@java.beans.ConstructorProperties</code> annotation when generating constructors. Note that you'll need to depend on module 'java.desktop' if you're using jigsaw.\n\t\t\t\t</dd><dt>\n\t\t\t\t\t<code>lombok.log.fieldName</code>\n\t\t\t\t</dt><dd>\n\t\t\t\t\tThe name of the generated log field (default: <code>log</code>).\n\t\t\t\t</dd><dt>\n\t\t\t\t\t<code>lombok.<em>(featureName)</em>.flagUsage</code>\n\t\t\t\t</dt><dd>\n\t\t\t\t\tAllows you to forcibly stop or discourage use of a lombok feature. Legal values for this key are <code>warning</code> or <code>error</code>. Some examples of values for <em>(featureName)</em> are: \"<code>experimental</code>\" (flags use of any of the <a href=\"/features/experimental\">experimental</a> features)</li>, \"<a href=\"/features/Builder\"><code>builder</code></a>\", \"<a\n\t\t\t\t\t\t\thref=\"/features/SneakyThrows\"><code>sneakyThrows</code></a>\", or \"<a href=\"/features/experimental/ExtensionMethod\"><code>extensionMethod</code></a>\".\n\t\t\t\t</dd>\n\t\t\t</dl>\n\t\t</p><p>\n\t\t\tConfiguration files are hierarchical: Any configuration setting applies to all source files in that directory, and all source files in subdirectories, but configuration settings closer to the source file take precedence. For example, if you have in <code>/Users/me/projects/lombok.config</code> the following:\n\t\t\t<ol class=\"snippet example oneliner\">\n\t\t\t\t<li><code>lombok.log.fieldName = foobar</code></li>\n\t\t\t</ol>\n\t\t\tand in <code>/Users/me/projects/MyProject/lombok.config</code> you have:\n\t\t\t<ol class=\"snippet example oneliner\">\n\t\t\t\t<li><code>lombok.log.fieldName = xyzzy</code></li>\n\t\t\t</ol>\n\t\t\tThen the various <a ng-click=\"toFeature('log')\"><code>@Log</code></a> annotations will use <code>foobar</code> instead of the default <code>log</code> as a field name to generate in all your projects, except for your project in <code>/Users/me/projects/MyProject</code>, where <code>xyzzy</code> is used instead.\n\t\t</p><p>\n\t\t\tTo restore a configuration key set by a parent config file back to the default, the <code>clear</code> option can be used. For example, if a parent configuration file has configured all use of <code>val</code> to emit a warning, you can turn off the warnings for a subdirectory by including in it a <code>lombok.config</code> file with:\n\t\t\t<ol class=\"snippet example oneliner\">\n\t\t\t\t<li><code>clear lombok.val.flagUsage</code></li>\n\t\t\t</ol>\n\t\t</p><p>\n\t\t\tSome configuration keys take lists. For lists, use <code>+=</code> to add an entry. You can remove a single item from the list (useful to undo a parent configuration file's setting) with <code>-=</code>. For example:\n\t\t\t<ol class=\"snippet example oneliner\">\n\t\t\t\t<li><code>lombok.accessors.prefix += m_</code></li>\n\t\t\t</ol>\n\t\t</p><p>\n\t\t\tComments can be included in <code>lombok.config</code> files; any line that starts with <code>#</code> is considered a comment.\n\t\t</p>\n\t</@f.overview>\n\n\t<@f.featureSection>\n\t\t<@f.main.h3 title=\"Global config keys\" />\n\t\t\n\t\t<p>\n\t\t\tThese configuration keys have an effect on many or all lombok features, or on the configuration system itself.\n\t\t</p><p>\n\t\t\tTo stop lombok from looking at parent directories for more configuration files, the special key:\n\t\t\t<ol class=\"snippet example oneliner\">\n\t\t\t\t<li><code>config.stopBubbling = true</code></li>\n\t\t\t</ol>\n\t\t\tcan be included. We suggest you put this in the root of your workspace directory.\n\t\t</p><p id=\"addNullAnnotations\">\n\t\t\tLombok can add nullity annotations (usually called <code>@NonNull</code> and <code>@Nullable</code>) whenever it makes sense to do so; think of generated <a href=\"ToString\"><code>toString</code></a> and <a href=\"with\"><code>withX</code> methods (these never return null), or the parameter of a generated <a href=\"EqualsAndHashCode\"><code>equals</code></a> method, which is allowed to be null, and requires such an annotation if you've set up your IDE for strict null checks as well as 'parameters are non-null by default'. There are many such libraries; you must tell lombok which one to use. By default, no such annotations are added. Enable this feature with:\n\t\t\t<ol class=\"snippet example oneliner\">\n\t\t\t\t<li><code>lombok.addNullAnnotations = <em>&lt;flavor&gt;</em></code></li>\n\t\t\t</ol>\n\t\t\tMany <em>flavors</em> are available: <code>jspecify</code> (recommended), <code>checkerframework</code> (recommended), <code>jakarta</code>, <code>eclipse</code>, <code>jetbrains</code>, <code>netbeans</code>, <code>androidx</code>, <code>findbugs</code>, <code>spring</code>, <code>jml</code>, <code>javax</code> (=JSR305; not recommended), <code>android.support</code> (deprecated within android), or define your own via <code>CUSTOM:fully.qualified.NonNullAnnotation:fully.qualified.NullableAnnotation</code>; if your nullity annotation is solely of the type use style (it annotates types, such as eclipse's and checkerframework's offerings, versus annotating methods and parameters), the format is <code>CUSTOM:TYPE_USE:nonnullanno:nullableanno</code>.<br />\n\t\t\t<em>This feature was added in lombok v1.18.12</em>.<br />\n\t\t</p><p>\n\t\t\tLombok can be configured to add <code>@lombok.Generated</code> annotations to all generated nodes where possible; useful for JaCoCo (which has built in support),\n\t\t\tor other style checkers and code coverage tools:\n\t\t\t<ol class=\"snippet example oneliner\">\n\t\t\t\t<li><code>lombok.addLombokGeneratedAnnotation = true</code></li>\n\t\t\t</ol>\n\t\t</p><p>\n\t\t\tLombok can add the <code>@SuppressFBWarnings</code> annotation which is useful if you want to run <a href=\"http://findbugs.sourceforge.net/\">FindBugs</a> on your class files. To enable this feature, make sure findbugs is on the classpath when you compile, and add the following config key:\n\t\t\t<ol class=\"snippet example oneliner\">\n\t\t\t\t<li><code>lombok.extern.findbugs.addSuppressFBWarnings = true</code></li>\n\t\t\t</ol>\n\t\t</p><p>\n\t\t\tLombok adds the <code>@SuppressWarnings(\"all\")</code> annotation to all generated nodes by default. This can be turned off which is useful if you want to use static code analyzers like <a href=\"https://checkerframework.org/\">Checker Framework</a>.\n\t\t\t<ol class=\"snippet example oneliner\">\n\t\t\t\t<li><code>lombok.addSuppressWarnings = false</code></li>\n\t\t\t</ol>\n\t\t</p>\n\t</@f.featureSection>\n\n\t<@f.featureSection>\n\t\t<@f.main.h3 title=\"Config keys that can affect any source file\" />\n\t\t\n\t\t<p>\n\t\t\tThese config keys can make lombok affect source files even if they have 0 lombok annotations in them.<br />\n\t\t\t<ol class=\"snippet example\">\n\t\t\t\t<li><code>lombok.fieldDefaults.defaultPrivate = true</code></li>\n\t\t\t\t<li><code>lombok.fieldDefaults.defaultFinal = true</code></li>\n\t\t\t</ol>\n\t\t\tTurning either of these options on means lombok will make <em>every</em> field in <em>every</em> source file final and/or private unless it has an explicit access modifier or annotation to suppress this. <a href=\"experimental/FieldDefaults\">See the <code>@FieldDefaults</code> documentation for more</a>.\n\t\t</p>\n\t</@f.featureSection>\n\n\t<@f.featureSection>\n\t\t<@f.main.h3 id=\"import\" title=\"Importing the configuration from a different file\" />\n\t\t<p>\n\t\t\tAt the top of a configuration file it is possible to import other configuration files. Imported files don't have to be called <code>lombok.config</code> and can have any file extension (or even none).<br />\n\t\t\t<ol class=\"snippet example\">\n\t\t\t\t<li><code>import ../configuration/model.config</code></li>\n\t\t\t</ol>\n\t\t\tThe location of an imported file is resolved relative to the file that imports it.\n\t\t</p><p>\n\t\t\tFor shared projects, it makes sense to always use relative paths. For individuals, it is also possible to use absolute paths.<br />\n\t\t\t<ol class=\"snippet example\">\n\t\t\t\t<li><code># Linux</code></li>\n\t\t\t\t<li><code>import /etc/lombok/model.config</code></li>\n\t\t\t\t<li><code># Windows</code></li>\n\t\t\t\t<li><code>import d:/lombok/model.config</code></li>\n\t\t\t</ol>\n\t\t</p><p>\n\t\t\tConfiguration files can import multiple configuration files as long as they are specified before any configuration key.\n\t\t\tThe system behaves as if the contents of the imported file are at the location of the <code>import</code> declaration. \n\t\t</p><p>\n\t\t\tThe way the configuration system works is that duplicate entries are effectively ignored. It is a last-wins. Lombok will only \n\t\t\tprocess a configuration file once when resolving a specific value. This allows you to import the same files from different \n\t\t\tconfiguration files, and even create loops without any problems.\n\t\t</p><p>\n\t\t\tIt is also possible to import files from <code>.jar</code> and <code>.zip</code> files.<br />\n\t\t\t<ol class=\"snippet example\">\n\t\t\t\t<li><code># Use 'lombok.config' from the root of the archive.</code></li>\n\t\t\t\t<li><code>import ../deps/lombok-config.jar</code></li>\n\t\t\t\t<li><code># Use a given file in the archive.</code></li>\n\t\t\t\t<li><code>import ../deps/lombok-config.zip!base/model.config</code></li>\n\t\t\t</ol>\n\t\t\tConfiguration files inside archives can import other configuration files, provided that they are in the same archive.\n\t\t</p><p>\n\t\t\tWhen importing files, it is possible to use environment variables.<br />\n\t\t\t<ol class=\"snippet example\">\n\t\t\t\t<li><code># Environment variables are names surrounded by angle brackets (&lt;, &gt;).</code></li>\n\t\t\t\t<li><code># They are replaced by System.getenv(name), if present.</code></li>\n\t\t\t\t<li><code>import &lt;JAVA_PROJECTS&gt;/shared.config</code></li>\n\t\t\t\t<li><code># A tilde (~) at the start gets replaced by System.getProperty(\"user.home\", \"~\").</code></li>\n\t\t\t\t<li><code>import ~/my.config</code></li>\n\t\t\t</ol>\n\t\t\tAs with absolute paths, this is more useful for individuals than for shared projects.\n\t\t</p><p>\n\t\t\t<em>This feature was added in lombok v1.18.12.</em>\n\t\t</p>\n\t</@f.featureSection>\n\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/constructor.html",
    "content": "<#import \"_features.html\" as f>\n\n<@f.scaffold title=\"@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor\"\n\tlogline=\"Constructors made to order: Generates constructors that take no arguments, one argument per final / non-null field, or one argument for every field.\">\n\n\t<@f.overview>\n\t\t<p>\n\t\t\tThis set of 3 annotations generate a constructor that will accept 1 parameter for certain fields, and simply assigns this parameter to the field.\n\t\t</p><p>\n\t\t\t<code>@NoArgsConstructor</code> will generate a constructor with no parameters. If this is not possible (because of final fields), a compiler error will result instead, unless <code>@NoArgsConstructor(force = true)</code> is used, then all final fields are initialized with <code>0</code> / <code>false</code> / <code>null</code>. For fields with constraints, such as <code>@NonNull</code> fields, <em>no</em> check is generated,so be aware that these constraints will generally not be fulfilled until those fields are properly initialized later. Certain java constructs, such as hibernate and the Service Provider Interface require a no-args constructor. This annotation is useful primarily in combination with either <code>@Data</code> or one of the other constructor generating annotations.\n\t\t</p><p>\n\t\t\t<code>@RequiredArgsConstructor</code> generates a constructor with 1 parameter for each field that requires special handling. All non-initialized <code>final</code> fields get a parameter, as well as any fields that are marked as <code>@NonNull</code> that aren't initialized where they are declared. For those fields marked with <code>@NonNull</code>, an explicit null check is also generated. The constructor will throw a <code>NullPointerException</code> if any of the parameters intended for the fields marked with <code>@NonNull</code> contain <code>null</code>. The order of the parameters match the order in which the fields appear in your class.\n\t\t</p><p>\n\t\t\t<code>@AllArgsConstructor</code> generates a constructor with 1 parameter for each field in your class. Fields marked with <code>@NonNull</code> result in null checks on those parameters.\n\t\t</p><p>\n\t\t\tEach of these annotations allows an alternate form, where the generated constructor is always private, and an additional static factory method that wraps around the private constructor is generated. This mode is enabled by supplying the <code>staticName</code> value for the annotation, like so: <code>@RequiredArgsConstructor(staticName=\"of\")</code>. Such a static factory method will infer generics, unlike a normal constructor. This means your API users get write <code>MapEntry.of(\"foo\", 5)</code> instead of the much longer <code>new MapEntry&lt;String, Integer&gt;(\"foo\", 5)</code>.\n\t\t</p><p>\n\t\t\tTo put annotations on the generated constructor, you can use <code>onConstructor=@__({@AnnotationsHere})</code>, but be careful; this is an experimental feature. For more details see the documentation on the <a href=\"/features/experimental/onX\">onX</a> feature.\n\t\t</p><p>\n\t\t\tStatic fields are skipped by these annotations.\n\t\t</p><p>\n\t\t\tUnlike most other lombok annotations, the existence of an explicit constructor does not stop these annotations from generating their own constructor. This means you can write your own specialized constructor, and let lombok generate the boilerplate ones as well. If a conflict arises (one of your constructors ends up with the same signature as one that lombok generates), a compiler error will occur.\n\t\t</p>\n\t</@f.overview>\n\n\t<@f.snippets name=\"Constructor\" />\n\n\t<@f.confKeys>\n\t\t<dt>\n\t\t\t<code>lombok.anyConstructor.addConstructorProperties</code> = [<code>true</code> | <code>false</code>] (default: <code>false</code>)\n\t\t</dt><dd>\n\t\t\tIf set to <code>true</code>, then lombok will add a <code>@java.beans.ConstructorProperties</code> to generated constructors.\n\t\t</dd><dt>\n\t\t\t<code>lombok.</code>[<code>allArgsConstructor</code>|<code>requiredArgsConstructor</code>|<code>noArgsConstructor</code>]<code>.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of the relevant annotation (<code>@AllArgsConstructor</code>, <code>@RequiredArgsConstructor</code> or <code>@NoArgsConstructor</code>) as a warning or error if configured.\n\t\t</dd><dt>\n\t\t\t<code>lombok.anyConstructor.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of any of the 3 constructor-generating annotations as a warning or error if configured.\n\t\t</dd><dt>\n\t\t\t<code>lombok.copyableAnnotations</code> = [<em>A list of fully qualified types</em>] (default: empty list)\n\t\t</dt><dd>\n\t\t\tLombok will copy any of these annotations from the field to the constructor parameter, the setter parameter, and the getter method. Note that lombok ships with a bunch of annotations 'out of the box' which are known to be copyable: All popular nullable/nonnull annotations.\n\t\t</dd><dt>\n\t\t\t<code>lombok.noArgsConstructor.extraPrivate</code> = [<code>true</code> | <code>false</code>] (default: false)\n\t\t</dt><dd>\n\t\t\tIf <code>true</code>, lombok will generate a private no-args constructor for any <code>@Value</code> or <code>@Data</code> annotated class, which sets all fields to default values (null / 0 / false).\n\t\t</dd>\n\t</@f.confKeys>\n\n\t<@f.smallPrint>\n\t\t<p>\n\t\t\tEven if a field is explicitly initialized with <code>null</code>, lombok will consider the requirement to avoid null as fulfilled, and will <em>NOT</em> consider the field as a 'required' argument. The assumption is that if you explicitly assign <code>null</code> to a field that you've also marked as <code>@NonNull</code> signals you must know what you're doing.\n\t\t</p><p>\n\t\t\tThe <code>@java.beans.ConstructorProperties</code> annotation is never generated for a constructor with no arguments. This also explains why <code>@NoArgsConstructor</code> lacks the <code>suppressConstructorProperties</code> annotation method. The generated static factory methods also do not get <code>@ConstructorProperties</code>, as this annotation can only be added to real constructors.\n\t\t</p><p>\n\t\t\t<code>@XArgsConstructor</code> can also be used on an enum definition. The generated constructor will always be private, because non-private constructors aren't legal in enums. You don't have to specify <code>AccessLevel.PRIVATE</code>.\n\t\t</p><p>\n\t\t\tVarious well known annotations about nullity cause null checks to be inserted and will be copied to the parameter. See <a href=\"/features/GetterSetter\">Getter/Setter</a> documentation's small print for more information.\n\t\t</p><p>\n\t\t\tThe <code>flagUsage</code> configuration keys do not trigger when a constructor is generated by <code>@Data</code>, <code>@Value</code> or any other lombok annotation.\n\t\t</p>\n\t</@f.smallPrint>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/delombok.html",
    "content": "<#import \"_features.html\" as f>\n\n<@f.scaffold title=\"Delombok\" logline=\"\">\n\t<@f.overview>\n\t\t<p>\n\t\t\tNormally, lombok adds support for all the lombok features directly to your IDE and compiler by plugging into them.<br />\n\t\t\tHowever, lombok doesn't cover all tools. For example, lombok cannot plug into javadoc, nor can it plug into the Google Widget Toolkit, both of which run on java sources. Delombok still allows you to use lombok with these tools by preprocessing your java code into java code with all of lombok's transformations already applied.\n\t\t</p><p>\n\t\t\tDelombok can of course also help understand what's happening with your source by letting you look at exactly what lombok is doing 'under the hood'.\n\t\t</p><p>\n\t\t\tDelombok's standard mode of operation is that it copies an entire directory into another directory, recursively, skipping class files, and applying lombok transformations to any java source files it encounters.\n\t\t</p><p>\n\t\t\tDelombok's output format can be configured with command line options (use <code>--format-help</code> for a complete list). A few such options are automatically scanned from input if possible (such as indent). If delombok's formatting is not conforming to your preferred code style, have a look!\n\t\t</p>\n\n\t\t<@f.main.h3 title=\"Running delombok on the command line\" />\n\n\t\t<p>\n\t\t\tDelombok is included in <code>lombok.jar</code>. To use it, all you need to run on the command line is:\n\t\t\t<pre>java -jar lombok.jar delombok src -d src-delomboked</pre>\n\t\t\t<br />\n\t\t\tWhich will duplicate the contents of the <code>src</code> directory into the <code>src-delomboked</code> directory, which will be created if it doesn't already exist, but delomboked of course. Delombok on the command line has a few more options; use the <code>--help</code> parameter to see more options.\n\t\t</p><p>\n\t\t\tTo let delombok print the transformation result of a single java file directly to standard output, you can use:\n\t\t\t<pre>java -jar lombok.jar delombok -p MyJavaFile.java</pre>\n\t\t</p><p>\n\t\t\tThe <code>-classpath</code>, <code>-sourcepath</code>, and <code>--module-path</code> options of javac are replicated as <code>--classpath</code>, <code>--sourcepath</code>, and <code>--module-path</code> in delombok.\n\t\t</p>\n\n\t\t<@f.main.h3 title=\"Running delombok in ant\" />\n\n\t\t<p>\n\t\t\t<code>lombok.jar</code> includes an ant task which can apply delombok for you. For example, to create javadoc for your project, your <code>build.xml</code> file would look something like:\n\t\t\t<pre>&lt;target name=\"javadoc\"&gt;\n&lt;taskdef classname=\"lombok.delombok.ant.Tasks$Delombok\" classpath=\"lib/lombok.jar\" name=\"delombok\" /&gt;\n&lt;mkdir dir=\"build/src-delomboked\" /&gt;\n<strong>&lt;delombok verbose=\"true\" encoding=\"UTF-8\" to=\"build/src-delomboked\" from=\"src\"&gt;</strong>\n\t<strong>&lt;format value=\"suppressWarnings:skip\" /&gt;</strong>\n<strong>&lt;/delombok&gt;</strong>\n&lt;mkdir dir=\"build/api\" /&gt;\n&lt;javadoc sourcepath=\"build/src-delomboked\" defaultexcludes=\"yes\" destdir=\"build/api\" /&gt;\n&lt;/target&gt;</pre>\n\t\t\t<br />\n\t\t\tInstead of a <code>from</code> attribute, you can also nest <code>&lt;fileset&gt;</code> nodes. The <code>delombok</code> supports <code>sourcepath</code>, <code>classpath</code>, and <code>modulepath</code> as parameter or as nested element, or as nested refid element, similar to the <code>javac</code> task.\n\t\t</p>\n\n\t\t<@f.main.h3 title=\"Running delombok in maven\" />\n\n\t\t<p>\n\t\t\tAnthony Whitford has written a <a href=\"https://github.com/awhitford/lombok.maven\">maven plugin</a> for delomboking your source code.\n\t\t</p>\n\n\t\t<@f.main.h3 title=\"Running delombok in sbt\" />\n\n\t\t<p>\n\t\t\tYang Bo has written an <a href=\"https://github.com/ThoughtWorksInc/sbt-delombok\">sbt plugin</a> for delomboking your source code.\n\t\t</p>\n\t\t\n\t\t<@f.main.h3 title=\"Limitations\" />\n\n\t\t<p>\n\t\t\tDelombok tries to preserve your code as much as it can, but comments may move around a little bit, especially comments that are in the middle of a syntax node. For example, any comments appearing in the middle of a list of method modifiers, such as <code>public /*comment*/ static ...</code> will move towards the front of the list of modifiers. In practice, any java source parsing tool will not be affected.<br />\n\t\t\tTo keep any changes to your code style to a minimum, delombok just copies a source file directly without changing any of it if the source file contains no lombok transformations.\n\t\t</p>\n\t</@f.overview>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/experimental/Accessors.html",
    "content": "<#import \"../_features.html\" as f>\n\n<@f.scaffold title=\"@Accessors\" logline=\"A more fluent API for getters and setters.\">\n\t<@f.history>\n\t\t<p>\n\t\t\t<code>@Accessors</code> was introduced as experimental feature in lombok v0.11.0.\n\t\t</p><p>\n\t\t\tThe <em>lombok.config</em> option <code>lombok.accessors.capitalization</code> = [<code>basic</code> | <code>beanspec</code>] was added in lombok v1.18.24.\n\t\t</p><p>\n\t\t\tFUNCTIONAL CHANGE: <code>@Accessors</code> now 'cascades'; any options not set on a field-level <code>@Accessors</code> annotation will get inherited from an\n\t\t\t<code>@Accessors</code> annotation on the class (and any options not set on those, from the enclosing class). Finally, anything set in <code>lombok.config</code>\n\t\t\twill be used as default. (lombok v1.18.24)\n\t\t</p><p>\n\t\t\tNEW FEATURE: <code>@Accessors(makeFinal = true)</code> will create <code>final</code> getters, setters, and with-ers. There's also\n\t\t\t<code>lombok.config</code> key <code>lombok.accessors.makeFinal</code> for the same effect. (lombok v1.18.24)\n\t</@f.history>\n\t\n\t<@f.experimental>\n\t\t<ul>\n\t\t\t<li>\n\t\t\t\tWe may want to roll these features into a more complete property support concept.\n\t\t\t</li><li>\n\t\t\t\tThe <code>makeFinal</code> feature is recently released; awaiting community feedback.\n\t\t\t</li>\n\t\t</ul>\n\t\tCurrent status: <em>neutral</em> - Some changes are expected. These changes are intended to be backwards compatible, but should start in an experimental feature:\n\t\t<ul>\n\t\t\t<li>Open feature request: More control over naming accessors; for example to address creatively named boolean properties: Turn <code>boolean wasRunning</code> into <code>boolean wasRunning()</code> instead of <code>boolean isWasRunning()</code>, as well as more expansive prefix support. <code>@Accessors</code> will be involved if this feature <a href=\"https://github.com/projectlombok/lombok/issues/2464\">request</a> is addressed.</li>\n\t\t\t<li><code>@Accessors</code> currently does not 'cascade' from field <code>@Accessors</code> annotation to the class-level <code>@Accessors</code> annotation, but it does 'cascade' to <code>lombok.config</code>. Changing this is not difficult but backwards incompatible. It's not likely to break much existing code, but this needs to be decided on before the feature can move out of <em>experimental</em> status.</li>\n\t\t</ul>\n\t</@f.experimental>\n\n\t<@f.overview>\n\t\t<p>\n\t\t\tThe <code>@Accessors</code> annotation is used to configure how lombok generates and looks for getters, setters, and with-ers.\n\t\t</p><p>\n\t\t\tBy default, lombok follows the <em>bean specification</em> for getters and setters: The getter for a field named <code>pepper</code> is <code>getPepper</code> for example. However, some might like to break with the <em>bean specification</em> in order to end up with nicer looking APIs. <code>@Accessors</code> lets you do this.\n\t\t</p><p>\n\t\t\tSome programmers like to use a prefix for their fields, i.e. they write <code>fPepper</code> instead of <code>pepper</code>. We <em>strongly</em> discourage doing this, as you can't unit test the validity of your prefixes, and refactor scripts may turn fields into local variables or method names. Furthermore, your tools (such as your editor) can take care of rendering the identifier in a certain way if you want this information to be instantly visible. Nevertheless, you can list the prefixes that your project uses via <code>@Accessors</code> as well.\n\t\t</p><p>\n\t\t\t<code>@Accessors</code> has 4 options:\n\t\t\t<ul>\n\t\t\t\t<li>\n\t\t\t\t\t<code>fluent</code> – A boolean. If <em>true</em>, the getter for <code>pepper</code> is just <code>pepper()</code>, and the setter is <code>pepper(T newValue)</code>. Furthermore, unless specified, <code>chain</code> defaults to <em>true</em>. <br />\n\t\t\t\t\tDefault: <em>false</em>.\n\t\t\t\t</li><li>\n\t\t\t\t\t<code>chain</code> – A boolean. If <em>true</em>, generated setters return <code>this</code> instead of <code>void</code>.<br />\n\t\t\t\t\tDefault: <em>false</em>, unless <code>fluent=true</code>, then Default: <em>true</em>.\n\t\t\t\t</li><li>\n\t\t\t\t\t<code>makeFinal</code> – A boolean. If <em>true</em>, generated getters, setters, and with-ers are marked as <code>final</code>.<br />\n\t\t\t\t\tDefault: <em>false</em>.\n\t\t\t\t</li><li>\n\t\t\t\t\t<code>prefix</code> – A list of strings. If present, fields must be prefixed with any of these prefixes. Each field name is compared to each prefix in the list in turn, and if a match is found, the prefix is stripped out to create the base name for the field. It is legal to include an empty string in the list, which will always match. For characters which are letters, the character following the prefix must not be a lowercase letter, i.e. <code>pepper</code> is not a match even to prefix <code>p</code>, but <code>pEpper</code> would be (and would mean the base name of this field is <code>epper</code>).\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t<p><p>\n\t\t\tThe <code>@Accessors</code> annotation is legal on types and fields; getters/setters/with-ers will look at the annotation on the field first, on the type the field is in second (and you have types in types,\n\t\t\teach outer type is also checked), and finally for any properties not explicitly set, the appropriate <code>lombok.config</code> setting is used.\n\t\t</p>\n\t</@f.overview>\n\n\t<@f.snippets name=\"experimental/Accessors\" />\n\n\t<@f.confKeys>\n\t\t<dt>\n\t\t\t<code>lombok.accessors.chain</code> = [<code>true</code> | <code>false</code>] (default: false)\n\t\t</dt><dd>\n\t\t\tIf set to <code>true</code>, any field/class that either doesn't have an <code>@Accessors</code> annotation, or it does, but that annotation does not have an explicit value for the <code>chain</code> parameter, will act as if <code>@Accessors(chain = true)</code> is present.\n\t\t</dd><dt>\n\t\t\t<code>lombok.accessors.fluent</code> = [<code>true</code> | <code>false</code>] (default: false)\n\t\t</dt><dd>\n\t\t\tIf set to <code>true</code>, any field/class that either doesn't have an <code>@Accessors</code> annotation, or it does, but that annotation does not have an explicit value for the <code>fluent</code> parameter, will act as if <code>@Accessors(fluent = true)</code> is present.\n\t\t</dd><dt>\n\t\t\t<code>lombok.accessors.makeFinal</code> = [<code>true</code> | <code>false</code>] (default: false)\n\t\t</dt><dd>\n\t\t\tIf set to <code>true</code>, any field/class that either doesn't have an <code>@Accessors</code> annotation, or it does, but that annotation does not have an explicit value for the <code>makeFinal</code> parameter, will act as if <code>@Accessors(makeFinal = true)</code> is present.\n\t\t</dd><dt>\n\t\t\t<code>lombok.accessors.prefix</code> += <em>a field prefix</em> (default: empty list)\n\t\t</dt><dd>\n\t\t\tThis is a list property; entries can be added with the <code>+=</code> operator. Inherited prefixes from parent config files can be removed with the <code>-=</code> operator. Any class that either doesn't have an <code>@Accessors</code> annotation, or it does, but that annotation does not have an explicit value for the <code>prefix</code> parameter, will act as if <code>@Accessors(prefix = {<em>prefixes listed in configuration</em>})</code> is present.\n\t\t</dd><dt>\n\t\t\t<code>lombok.accessors.capitalization</code> = [<code>basic</code> | <code>beanspec</code>] (default: basic)\n\t\t</dt><dd>\n\t\t\tControls how tricky cases like <code>uShaped</code> (one lowercase letter followed by an upper/titlecase letter) are capitalized. <code>basic</code> capitalizes that to <code>getUShaped</code>, and <code>beanspec</code> capitalizes that to <code>getuShaped</code> instead.<br />\n\t\t\tBoth strategies are commonly used in the java ecosystem, though <code>beanspec</code> is more common.\n\t\t</dd><dt>\n\t\t\t<code>lombok.accessors.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@Accessors</code> as a warning or error if configured.\n\t\t</dd>\n\t</@f.confKeys>\n\n\t<@f.smallPrint>\n\t\t<p>\n\t\t\tThe nearest <code>@Accessors</code> annotation is also used for the various methods in lombok that look for getters, such as <code>@EqualsAndHashCode</code>.\n\t\t</p><p>\n\t\t\tIf a prefix list is provided and a field does not start with one of them, that field is skipped entirely by lombok, and a warning will be generated.\n\t\t</p>\n\t</@f.smallPrint>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/experimental/Delegate.html",
    "content": "<#import \"../_features.html\" as f>\n\n<@f.scaffold title=\"@Delegate\" logline=\"Don't lose your composition.\">\n\t<@f.history>\n\t\t<p>\n\t\t\t<code>@Delegate</code> was introduced as feature in lombok v0.10 (the experimental package did not exist yet).<br />\n\t\t\tIt was moved to the experimental package in lombok v1.14; the old version from the main lombok package is now deprecated.\n\t\t</p>\n\t</@f.history>\n\n\t<@f.experimental>\n\t\t<ul>\n\t\t\t<li>\n\t\t\t\tNot used that much.\n\t\t\t</li><li>\n\t\t\t\tDifficult to support for edge cases, such as recursive delegation.\n\t\t\t</li><li>\n\t\t\t\tAPI is rather unfriendly; it would be a lot nicer if you can simply implement some methods and let <code>@Delegate</code> generate delegates for whatever you didn't manually implement, but due to issues with generics erasure this also can't be made to work without caveats.\n\t\t\t</li>\n\t\t</ul>\n\t\tCurrent status: <em>negative</em> - Currently we feel this feature will not move out of experimental status anytime soon, and support for this feature may be dropped if future versions of javac or ecj make it difficult to continue to maintain the feature.\n\t</@f.experimental>\n\n\t<@f.overview>\n\t\t<p>\n\t\t\tAny field or no-argument method can be annotated with <code>@Delegate</code> to let lombok generate delegate methods that forward the call to this field (or the result of invoking this method).\n\t\t</p><p>\n\t\t\tLombok delegates all <code>public</code> methods of the field's type (or method's return type), as well as those of its supertypes except for all methods declared in <code>java.lang.Object</code>.\n\t\t</p><p>\n\t\t\tYou can pass any number of classes into the <code>@Delegate</code> annotation's <code>types</code> parameter. If you do that, then lombok will delegate all <code>public</code> methods in those types (and their supertypes, except <code>java.lang.Object</code>) instead of looking at the field/method's type.\n\t\t</p><p>\n\t\t\tAll public non-<code>Object</code> methods that are part of the calculated type(s) are copied, whether or not you also wrote implementations for those methods. That would thus result in duplicate method errors. You can avoid these by using the <code>@Delegate(excludes=SomeType.class)</code> parameter to exclude all public methods in the excluded type(s), and their supertypes.\n\t\t</p><p>\n\t\t\tTo have very precise control over what is delegated and what isn't, write private inner interfaces with method signatures, then specify these private inner interfaces as types in <code>@Delegate(types=PrivateInnerInterfaceWithIncludesList.class, excludes=SameForExcludes.class)</code>.\n\t\t</p>\n\t</@f.overview>\n\n\t<@f.snippets name=\"experimental/Delegate\" />\n\n\t<@f.confKeys>\n\t\t<dt>\n\t\t\t<code>lombok.delegate.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@Delegate</code> as a warning or error if configured.\n\t\t</dd>\n\t</@f.confKeys>\n\n\t<@f.smallPrint>\n\t\t<p>\n\t\t\tWhen passing classes to the annotation's <code>types</code> or <code>excludes</code> parameter, you cannot include generics. This is a limitation of java. Use private inner interfaces or classes that extend the intended type including the generics parameter to work around this problem.\n\t\t</p><p>\n\t\t\tWhen passing classes to the annotation, these classes do not need to be supertypes of the field. See the example.\n\t\t</p><p>\n\t\t\t<code>@Delegate</code> cannot be used on static fields or methods.\n\t\t</p><p>\n\t\t\t<code>@Delegate</code> cannot be used when the calculated type(s) to delegate / exclude themselves contain <code>@Delegate</code> annotations; in other words, <code>@Delegate</code> will error if you attempt to use it recursively.\n\t\t</p>\n\t</@f.smallPrint>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/experimental/ExtensionMethod.html",
    "content": "<#import \"../_features.html\" as f>\n\n<@f.scaffold title=\"@ExtensionMethod\" logline=\"Annoying API? Fix it yourself: Add new methods to existing types!\">\n\t<@f.history>\n\t\t<p>\n\t\t\t<code>@ExtensionMethod</code> was introduced as experimental feature in lombok v0.11.2.\n\t\t</p>\n\t</@f.history>\n\n\t<@f.experimental>\n\t\t<ul>\n\t\t\t<li>\n\t\t\t\tHigh-impact on code style.\n\t\t\t</li><li>\n\t\t\t\tReally would like to ship with utility methods to expand common classes, but so far lombok doesn't have a good distribution method for such runtime dependencies.\n\t\t\t</li><li>\n\t\t\t\tAffects quite a bit of eclipse, and auto-complete e.d. do not work yet in netbeans.\n\t\t\t</li><li>\n\t\t\t\tShould @ExtensionMethod be legal on methods? Should it be legal on packages?\n\t\t\t</li><li>\n\t\t\t\tThis feature has more bugs associated with it than we would like, and it is a large maintenance burden.\n\t\t\t</li>\n\t\t</ul>\n\t\tCurrent status: <em>hold</em> - Currently we feel this feature will not move out of experimental status anytime soon, but it will not significantly change and support for it is unlikely to be removed in future versions of lombok either.\n\t</@f.experimental>\n\n\t<@f.overview>\n\t\t<p>\n\t\t\tYou can make a class containing a bunch of <code>public</code>, <code>static</code> methods which all take at least 1 parameter. These methods will extend the type of the first parameter, as if they were instance methods, using the <code>@ExtensionMethod</code> feature.\n\t\t</p><p>\n\t\t\tFor example, if you create <code>public static String toTitleCase(String in) { ... }</code>, you can use the <code>@ExtensionMethod</code> feature to make it look like the <code>java.lang.String</code> class has a method named <code>toTitleCase</code>, which has no arguments. The first argument of the static method fills the role of <code>this</code> in instance methods.\n\t\t</p><p>\n\t\t\tAll methods that are <code>public</code>, <code>static</code>, and have at least 1 argument whose type is not primitive, are considered extension methods, and each will be injected into the namespace of the type of the first parameter as if they were instance methods. As in the above example, a call that looks like: <code>foo.toTitleCase()</code> is replaced with <code>ClassContainingYourExtensionMethod.toTitleCase(foo);</code>. Note that it is actually not an instant <code>NullPointerException</code> if <code>foo</code> is null - it is passed like any other parameter.\n\t\t</p><p>\n\t\t\tYou can pass any number of classes to the <code>@ExtensionMethod</code> annotation; they will all be searched for extension methods. These extension methods apply for any code that is in the annotated class.\n\t\t</p><p>\n\t\t\tLombok does not (currently) have any runtime dependencies which means lombok does not (currently) ship with any useful extension methods so you'll have to make your own. However, here's one that might spark your imagination: <br />\n\t\t</p>\n\t\t\t<pre>public class ObjectExtensions {\n\tpublic static &lt;T&gt; T or(T object, T ifNull) {\n\t\treturn object != null ? object : ifNull;\n\t}\n}</pre><br />\n\t\t<p>\n\t\t\tWith the above class, if you add <code>@ExtensionMethod(ObjectExtensions.class)</code> to your class definition, you can write:<br />\n\t\t</p>\n\t\t\t<pre>String x = null;\nSystem.out.println(x.or(\"Hello, World!\"));</pre><br />\n\t\t\tThe above code will not fail with a <code>NullPointerException</code>; it will actually output <code>Hello, World!</code>\n\t</@f.overview>\n\n\t<@f.snippets name=\"experimental/ExtensionMethod\" />\n\n\t<@f.confKeys>\n\t\t<dt>\n\t\t\t<code>lombok.extensionMethod.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@ExtensionMethod</code> as a warning or error if configured.\n\t\t</dd>\n\t</@f.confKeys>\n\n\t<@f.smallPrint>\n\t\t<p>\n\t\t\tCalls are rewritten to a call to the extension method; the static method itself is not inlined. Therefore, the extension method must be present both at compile and at runtime.\n\t\t</p><p>\n\t\t\tGenerics is fully applied to figure out extension methods. i.e. if the first parameter of your extension method is <code>List&lt;? extends String&gt;</code>, then any expression that is compatible with that will have your extension method, but other kinds of lists won't. So, a <code>List&lt;Object&gt;</code> won't get it, but a <code>List&lt;String&gt;</code> will.\n\t\t</p>\n\t</@f.smallPrint>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/experimental/FieldDefaults.html",
    "content": "<#import \"../_features.html\" as f>\n\n<@f.scaffold title=\"@FieldDefaults\" logline=\"New default field modifiers for the 21st century.\">\n\t<@f.history>\n\t\t<p>\n\t\t\t@FieldDefaults was introduced as experimental feature in lombok v0.11.4.\n\t\t</p>\n\t</@f.history>\n\n\t<@f.experimental>\n\t\t<ul>\n\t\t\t<li>\n\t\t\t\tWould be nice if you could stick this on the package-info.java package to set the default for all classes in that package.\n\t\t\t</li><li>\n\t\t\t\t[UPDATE 2022-02-04] Currently simply having a <code>lombok.config</code> entry of <code>lombok.fieldDefaults.defaultPrivate = true</code> (or, analogously, <code>defaultFinal</code>) is enough to modify <em>every</em> source file that is affected by that configuration, even if said source file has absolutely no trace whatsoever of lombok anything inside it. We're not quite sure if this is a good idea. Our current point of view is that this is too much magic, and there is an alternative plan: meta-annotations. Until at least the meta-annotations idea has been explored and discarded, this feature will not be leaving <em>experimental</em> in its current state. Most likely, if it ever does, the <code>lombok.FieldDefaults</code> annotation will be <em>required</em>, though, you may set it via the to be built meta-annotation.\n\t\t\t</li>\n\t\t</ul>\n\t\tCurrent status: <em>neutral</em> - Currently we feel this feature may not move out of experimental status without changes.\n\t</@f.experimental>\n\n\t<@f.overview>\n\t\t<p>\n\t\t\tThe <code>@FieldDefaults</code> annotation can add an access modifier (<code>public</code>, <code>private</code>, or <code>protected</code>) to each field in the annotated class or enum. It can also add <code>final</code> to each field in the annotated class or enum.\n\t\t</p><p>\n\t\t\tTo add <code>final</code> to each (instance) field, use <code>@FieldDefaults(makeFinal=true)</code>. Any non-final field which must remain nonfinal can be annotated with <code>@NonFinal</code> (also in the <code>lombok.experimental</code> package).\n\t\t</p><p>\n\t\t\tTo add an access modifier to each (instance) field, use <code>@FieldDefaults(level=AccessLevel.PRIVATE)</code>. Any field that does not already have an access modifier (i.e. any field that looks like package private access) is changed to have the appropriate access modifier. Any package private field which must remain package private can be annotated with <code>@PackagePrivate</code> (also in the <code>lombok.experimental</code> package).\n\t\t</p>\n\t</@f.overview>\n\n\t<@f.snippets name=\"experimental/FieldDefaults\" />\n\n\t<@f.confKeys>\n\t\t<dt>\n\t\t\t<code>lombok.fieldDefaults.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@FieldDefaults</code> as a warning or error if configured.\n\t\t</dd><dt>\n\t\t\t<code>lombok.fieldDefaults.defaultPrivate</code> = [<code>true</code> | <code>false</code>] (default: false)\n\t\t</dt><dd>\n\t\t\t(Since 1.16.8) If set to <code>true</code>, <em>every</em> field in <em>every</em> class or enum anywhere in the sources being compiled will be marked as <code>private</code> unless it has an explicit access modifier or the <code>@PackagePrivate</code> annotation, or an explicit <code>@FieldDefaults</code> annotation is present to override this config key.\n\t\t</dd><dt>\n\t\t\t<code>lombok.fieldDefaults.defaultFinal</code> = [<code>true</code> | <code>false</code>] (default: false)\n\t\t</dt><dd>\n\t\t\t(Since 1.16.8) If set to <code>true</code>, <em>every</em> field in <em>every</em> class or enum anywhere in the sources being compiled will be marked as <code>final</code> unless it has the <code>@NonFinal</code> annotation, or an explicit <code>@FieldDefaults</code> annotation is present to override this config key.\n\t\t</dd>\n\t</@f.confKeys>\n\n\t<@f.smallPrint>\n\t\t<p>\n\t\t\tLike other lombok handlers that touch fields, any field whose name starts with a dollar (<code>$</code>) symbol is skipped entirely. Such a field will not be modified at all.\n\t\t</p>\n\t</@f.smallPrint>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/experimental/FieldNameConstants.html",
    "content": "<#import \"../_features.html\" as f>\n\n<@f.scaffold title=\"@FieldNameConstants\" logline=\"Name... that... field! String constants for your field's names.\">\n\t<@f.history>\n\t\t<p>\n\t\t\t@FieldNameConstants was introduced as experimental feature in lombok v1.16.22.\n\t\t</p><p>\n\t\t\t@FieldNameConstants was redesigned in lombok v1.18.4.\n\t\t</p><p>\n\t\t\tThe <em>lombok.config</em> option <code>lombok.fieldNameConstants.uppercase = true</code> was added in lombok v1.18.8.\n\t\t</p>\n\t</@f.history>\n\n\t<@f.experimental>\n\t\t<ul>\n\t\t\t<li>\n\t\t\t\tNew feature; unsure if this busts enough boilerplate.\n\t\t\t</li>\n\t\t</ul>\n\t\tCurrent status: <em>neutral</em> - As a just-introduced feature we're still gathering feedback.\n\t</@f.experimental>\n\n\t<@f.overview>\n\t\t<p>\n\t\t\tThe <code>@FieldNameConstants</code> annotation generates an inner type which contains 1 constant for each field in your class; either string constants (fields marked <code>public static final</code>, of type <code>java.lang.String</code>) or if you prefer, an enum type with 1 value for each field - write <code>@FieldNameConstants(asEnum = true)</code> for the enum variant. <code>@FieldNameConstants</code> is useful for various marshalling and serialization frameworks. The constant field (whether enum value or string constant) always has the exact same name as the field, capitalization and all, unless you set the <code>lombok.fieldNameConstants.uppercase = true</code> option in your <code>lombok.config</code> file; in that case lombok will try to <code>UPPER_CASE</code> the name.\n\t\t</p><p>\n\t\t\tThe generated inner type is by default called <code>Fields</code> and is <code>public</code>. You can modify this via <code>@FieldNameConstants(innerTypeName = \"FieldNames\", level = AccessLevel.PACKAGE)</code> for example. The default inner type name can also be modified via configuration key <code>lombok.fieldNameConstants.innerTypeName</code>. The generated fields are always <code>public</code>.\n\t\t</p><p>\n\t\t\tMust be applied to classes (or enums, though you'd rarely want to do that). By default includes all non-transient, non-static fields. You can use <code>@FieldNameConstants.Include</code> in fields + <code>@FieldNameConstants(onlyExplicitlyIncluded = true)</code>, or <code>@FieldNameConstants.Exclude</code> for more fine-grained control.\n\t\t</p>\n\t</@f.overview>\n\n\t<@f.snippets name=\"experimental/FieldNameConstants\" />\n\n\t<@f.confKeys>\n\t\t<dt>\n\t\t\t<code>lombok.fieldNameConstants.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@FieldDefaults</code> as a warning or error if configured.\n\t\t</dd><dt>\n\t\t\t<code>lombok.fieldNameConstants.innerTypeName</code> = <em>a string</em> (default: 'Fields')\n\t\t</dt><dd>\n\t\t\tThe name of the inner type generated by lombok can be controlled with this configuration key.\n\t\t</dd><dt>\n\t\t\t<code>lombok.fieldNameConstants.uppercase</code> = [<code>true</code> | <code>false</code>] (default: false)\n\t\t</dt><dd>\n\t\t\tIf <code>true</code>, attempt to uppercase the generated fields.\n\t\t</dd>\n\t</@f.confKeys>\n\n\t<@f.smallPrint>\n\t\t<p>\n\t\t\tStarting with lombok v1.18.6, lombok will silently skip generating anything that already exists. You can define the inner <code>Fields</code> enum/class yourself,\n\t\t\tin which case lombok will add all the enum constants / public static final fields you haven't written yourself.\n\t\t</p><p>\n\t\t\tFrom lombok v1.16.22 to lombok v1.18.2, this feature generated constants inside the type directly; the name of these fields would for example turn field <code>exampleFieldName</code> into <code>public static final String FIELD_EXAMPLE_FIELD_NAME = \"exampleFieldName\";</code>. The prefix and suffix (here, <code>FIELD_</code>, and the empty string) were configurable. Starting with lombok v1.18.4 this feature has been redesigned into generating an inner type as described above.\n\t\t</p><p>\n\t\t\tAny parameters of lombok annotations that take strings need to be supplied actual string literals; you cannot have references to constants like those generated by <code>@FieldNameConstants</code>. If you'd like to use <code>@FieldNameConstants</code> to for example fill in the <code>of</code> and/or <code>exclude</code> parameters of <code>@ToString</code> and similar lombok annotations, use the <code>@ToString.Include</code> / <code>@ToString.Exclude</code> etc system instead; these are described at the feature pages for those features.\n\t\t</p><p>\n\t\t\tLike other lombok handlers that touch fields, any field whose name starts with a dollar (<code>$</code>) symbol is skipped entirely. Such a field will not be modified at all. Static fields are also skipped.\n\t\t</p><p>\n\t\t\t<em>MapStruct interop:</em> When making references to field name constants inside MapStruct's <code>@Mapping</code>, and you use that annotation more than once on a node, you must manually wrap these in the <code>@Mappings</code> 'container annotation'. Like so: <code>@Mappings({@Mapping(target = Entity.Fields.entityProperty, source = \"dtoProperty\")})</code>.\n\t\t</p>\n\t</@f.smallPrint>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/experimental/Helper.html",
    "content": "<#import \"../_features.html\" as f>\n\n<@f.scaffold title=\"@Helper\" logline=\"With a little help from my friends... Helper methods for java.\">\n\t<@f.history>\n\t\t<p>\n\t\t\t<code>@Helper</code> was introduced as an experimental feature in lombok v1.16.6.\n\t\t</p>\n\t</@f.history>\n\n\t<@f.experimental>\n\t\t<ul>\n\t\t\t<li>\n\t\t\t\tLambdas with general function types offer an alternative strategy.\n\t\t\t</li><li>\n\t\t\t\tPerhaps a way to make helper methods with less boilerplate is possible, making this feature obsolete.\n\t\t\t</li>\n\t\t</ul>\n\t\tCurrent status: <em>unknown</em> - We don't have enough experience with this feature to make predictions on its future.\n\t</@f.experimental>\n\n\t<@f.overview>\n\t\t<p>\n\t\t\tThis annotation lets you put methods in methods. You might not know this, but you can declare classes inside methods, and the methods in this class can access any (effectively) final local variable or parameter defined and set before the declaration. Unfortunately, to actually call any methods you'd have to make an instance of this method local class first, but that's where <code>@Helper</code> comes in and helps you out! Annotate a method local class with <code>@Helper</code> and it's as if all the methods in that helper class are methods that you can call directly, just as if java had allowed methods to exist inside methods.\n\t\t</p><p>\n\t\t\tNormally you'd have to declare an instance of your helper, for example: <code>HelperClass h = new HelperClass();</code> directly after declaring your helper class, and then call methods in your helper class with <code>h.helperMethod();</code>. With <code>@Helper</code>, both of these things are no longer needed: You do not need to waste a line of code declaring an instance of the helper, and you don't need to prefix all your calls to helper methods with <code>nameOfHelperInstance.</code>\n\t\t</p>\n\t</@f.overview>\n\n\t<@f.snippets name=\"experimental/Helper\" />\n\n\t<@f.confKeys>\n\t\t<dt>\n\t\t\t<code>lombok.helper.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@Helper</code> as a warning or error if configured.\n\t\t</dd>\n\t</@f.confKeys>\n\n\t<@f.smallPrint>\n\t\t<p>\n\t\t\t<code>@Helper</code> requires that the helper class has a no-args constructor. A compiler error will be generated if this is not the case.\n\t\t</p><p>\n\t\t\tCurrently, the instance of your helper that's made under the hood is called <code>$Foo</code>, where <code>Foo</code> is the name of your helper. We might change this in the future; please don't rely on this variable existing. We might even replace this later with a sibling method instead.\n\t\t</p><p>\n\t\t\tPlease don't rely on <code>this</code> making any sense in the helper method code. You can refer to the real 'this' by using the syntax <code>NameOfMyClass.this</code>.\n\t\t</p><p>\n\t\t\t<em>ANY</em> unqualified method call in code that exists <em>below</em> the declaration of the helper method with the same name as any method in the helper is assumed to be a call to the helper. If the arguments don't end up being compatible, you get a compiler error.\n\t\t</p><p>\n\t\t\tUnless you're using JDK8 or higher (which introduced the concept of 'effectively final'), you'll have to declare local variables and parameters as <code>final</code> if you wish to refer to them in your method local class. This is a java limitation, not something specific to lombok's <code>@Helper</code>.\n\t\t</p>\n\t</@f.smallPrint>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/experimental/Jacksonized.html",
    "content": "<#import \"../_features.html\" as f>\n\n<@f.scaffold title=\"@Jacksonized\" logline=\"Bob, meet Jackson. Lets make sure you become fast friends.\">\n\t<@f.history>\n\t\t<p>\n\t\t\t<code>@Jacksonized</code> was introduced as experimental feature for <code>@Builder</code> and <code>@SuperBuilder</code> in lombok v1.18.14.\n\t\t</p><p>\n\t\t\tSupport for <code>@Accessors</code> was added in lombok v1.18.40.\n\t\t</p>\n\t</@f.history>\n\t\n\t<@f.overview>\n\t\t<p>\n\t\t\tThe <code>@Jacksonized</code> annotation is an add-on annotation for <a href=\"/features/Builder\"><code>@Builder</code></a>, <a href=\"/features/experimental/SuperBuilder\"><code>@SuperBuilder</code></a>, and <a href=\"/features/experimental/Accessors\"><code>@Accessors</code></a>.\n\t\t</p><p>\n\t\t\tFor <code>@Accessors(fluent = true)</code> on a type, it automatically configures Jackson to use the generated setters and getters for (de-)serialization by inserting <code>@JsonProperty</code> annotations.\n\t\t\t(Note that <code>@Jacksonized @Accessors</code> on fields are not supported.)<div class=\"snippet\"><div class=\"java\" align=\"left\"><pre>\n@Jacksonized @Accessors(fluent = true)\n@Getter @Setter\npublic class AccessorsExample {\n\tprivate int age = 10;\n}\n\t\t</pre></div></div>\n\t\t</p><p>\n\t\t\tFor <code>@Builder</code> and <code>@SuperBuilder</code>, it automatically configures the generated builder class to be used by <a href=\"https://github.com/FasterXML/jackson\">Jackson</a>'s deserialization.\n\t\t\tIt only has an effect if present at a context where there is also a <code>@Builder</code> or a <code>@SuperBuilder</code>; a warning is emitted otherwise.\n \t\t</p><p>\n\t\t\tWithout <code>@Jacksonized</code>, you would have to customize your builder class(es).\n\t\t\tWith <code>@Jacksonized</code>, you can simply write something like this to let Jackson use the generated builder:<div class=\"snippet\"><div class=\"java\" align=\"left\"><pre>\n@Jacksonized @Builder\n@JsonIgnoreProperties(ignoreUnknown = true)\npublic class JacksonExample {\n\tprivate List&lt;Foo&gt; foos;\n}\n</pre></div></div>\n \t\t</p><p>\n\t\t\tThis annotation does <em>not</em> change the behavior of the generated builder.\n\t\t\tA <code>@Jacksonized</code> <code>@SuperBuilder</code> remains fully compatible to regular <code>@SuperBuilder</code>s.\n\t\t</p>\n\t</@f.overview>\n\t\n\t<@f.confKeys>\n\t\t<dt>\n\t\t\t<code>lombok.jacksonized.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@Jacksonized</code> as a warning or error if configured.\n\t\t</dd><dt>\n\t\t\t<code>lombok.jacksonized.jacksonVersion</code> += <code>version</code> (default: 2 + generate warning)\n\t\t</dt><dd>\n\t\t\t(Since 1.18.44) Jackson now has 2 different major versions: Jackson2, and Jackson3. Specify which version of the jackson annotations to generate.<br />\n\t\t\tIf no version is chosen, lombok will generate Jackson v2 annotations and emit a warning that you should add this config key to pick which jackson version you want.<br />\n\t\t\tIf transitioning from Jackson2 to Jackson3, you can ask lombok to emit both variants. See: <a href=\"/features/configuration\">Lombok configuration system</a>.\n\t\t</dd>\n\t</@f.confKeys>\n\t\n\t<@f.smallPrint>\n \t\t<p>\n\t\t\tIn particular, the annotation does the following for <code>@(Super)Builder</code>:\n\t\t\t<ul>\n\t\t\t\t<li>\n\t\t\t\t\tConfigure Jackson to use the builder for deserialization using <code>@JsonDeserialize(builder=<em>Foobar</em>.<em>Foobar</em>Builder[Impl].class))</code> on the class (where <em>Foobar</em> is the name of the annotated class, and <code>Impl</code> is added for <code>@SuperBuilder</code>).\n\t\t\t\t\t(An error is emitted if such an annotation already exists.)\n\t\t\t\t</li><li>\n\t\t\t\t\tCopy Jackson-related configuration annotations (like <code>@JsonIgnoreProperties</code>) from the class to the builder class.\n\t\t\t\t\tThis is necessary so that Jackson recognizes them when using the builder.\n\t\t\t\t</li><li>\n\t\t\t\t\tInsert <code>@JsonPOJOBuilder(withPrefix=\"\")</code> on the generated builder class to override Jackson's default prefix \"with\".\n\t\t\t\t\tIf you configured a different prefix in lombok using <code>setterPrefix</code>, this value is used.\n\t\t\t\t\tIf you changed the name of the <code>build()</code> method using <code>buildMethodName</code>, this is also made known to Jackson.\n\t\t\t\t</li><li>\n\t\t\t\t\tFor <code>@SuperBuilder</code>, make the builder implementation class package-private.\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t</p>\n\t</@f.smallPrint>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/experimental/StandardException.html",
    "content": "<#import \"../_features.html\" as f>\n\n<@f.scaffold title=\"@StandardException\"\n\tlogline=\"TODO\">\n\t<@f.history>\n\t\t<p>\n\t\t\t<code>@StandardException</code> was introduced as an experimental feature in lombok v1.18.21.\n\t\t</p>\n\t</@f.history>\n\n\t<@f.overview>\n\t\t<p>\n\t\t\tPut this annotation on your own exception types (new classes that <code>extends Exception</code> or anything else that inherits from <code>Throwable</code>). This annotation will then generate up to 4 constructors:\n\t\t</p><ul>\n\t\t\t<li>A no-args constructor (<code>MyException()</code>), representing no message, and no cause.</li>\n\t\t\t<li>A message-only constructor (<code>MyException(String message)</code>), representing the provided message, and no cause.</li>\n\t\t\t<li>A cause-only constructor (<code>MyException(Throwable cause)</code>), which will copy the message from the cause, if there is one, and uses the provided cause.</li>\n\t\t\t<li>A full constructor (<code>MyException(String message, Throwable cause)</code>).</li>\n\t\t</ul>\n\t\t<p>\n\t\t\tEach constructor forwards to the full constructor; you can write any or all of these constructors manually in which case lombok\n\t\t\twill not generate it. The full constructor, if it needs to be generated, will invoke <code>super(message);</code> and will then\n\t\t\tinvoke <code>super.initCause(cause);</code> if the cause is not null.\n\t\t</p><p>\n\t\t\tThere are few reasons <em>not</em> to put this annotation on all your custom exceptions.\n\t\t</p>\n\t</@f.overview>\n\n\t<@f.snippets name=\"StandardException\" />\n\n\t<@f.confKeys>\n\t\t<dt>\n\t\t\t<code>lombok.standardException.addConstructorProperties</code> = [<code>true</code> | <code>false</code>] (default: <code>false</code>)\n\t\t</dt><dt>\n\t\t\t<code>lombok.standardException.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@StandardException</code> as a warning or error if configured.\n\t\t</dd>\n\t</@f.confKeys>\n\n\t<@f.smallPrint>\n\t\t<p>\n\t\t\tLombok will not check if you extend an actual exception type.\n\t\t</p><p>\n\t\t\tLombok does not require that the class you inherit from has the <code>Throwable cause</code> variants, because not all exceptions\n\t\t\thave these. However, the `<code>Parent(String message)</code>` constructor as well as the no-args constructor <em>must</em> exist.\n\t\t</p><p>\n\t\t\tThere is a very slight functional difference: Normally, invoking <code>new SomeException(message, null)</code> will initialize\n\t\t\tthe cause to be <em>no cause</em>, and this cannot be later changed by invoking <code>initCause</code>. However, lombok's\n\t\t\tstandard exceptions <strong>do</strong> let you overwrite an explicit no-cause with <code>initCause</code> later.\n\t\t</p><p>\n\t\t\tA second slight functional difference: Normally, invoking <code>new SomeException(cause)</code>, if implemented as <code>super(cause);</code>, will set the message to be equal to the message of the cause. However, lombok does not do this - it leaves the exception as having no message at all. We think inheriting the message is fundamentally wrong - messages are not guaranteed to be sensible in the absence of the context of the exception-type. The cause ought to be listed anywhere where it is relevant; if you are using messages as direct user feedback (which is rare, in the java community), <code>@StandardException</code> can't really help you anyway; the infrastructure of e.g. <code>getLocalizedMessage()</code> is too complicated.\n\t\t</p>\n\t</@f.smallPrint>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/experimental/SuperBuilder.html",
    "content": "<#import \"../_features.html\" as f>\n\n<@f.scaffold title=\"@SuperBuilder\" logline=\"Bob now knows his ancestors: Builders with fields from superclasses, too. \">\n\t<@f.history>\n\t\t<p>\n\t\t\t<code>@SuperBuilder</code> was introduced as experimental feature in lombok v1.18.2.\n\t\t</p><p>\n\t\t\t<code>@SuperBuilder</code>'s <code>toBuilder</code> feature and limited support for customization was added with lombok v1.18.4.\n\t\t</p><p>\n\t\t\t<code>@SuperBuilder</code> customization possibilities were extended with lombok v1.18.14.\n\t\t</p>\n\t</@f.history>\n\t\n\t<@f.overview>\n\t\t<p>\n\t\t\tThe <code>@SuperBuilder</code> annotation produces complex builder APIs for your classes.\n\t\t\tIn contrast to <a href=\"/features/Builder\"><code>@Builder</code></a>, <code>@SuperBuilder</code> also works with fields from superclasses.\n\t\t\tHowever, it only works for types.\n\t\t\tMost importantly, it requires that <em>all superclasses</em> also have the <code>@SuperBuilder</code> annotation.\n\t\t</p><p>\n\t\t\t<code>@SuperBuilder</code> lets you automatically produce the code required to have your class be instantiable with code such as:<br />\n\t\t\t<code>Person.builder().name(\"Adam Savage\").city(\"San Francisco\").job(\"Mythbusters\").job(\"Unchained Reaction\").build();</code>\n\t\t</p><p>\n\t\t\t<code>@SuperBuilder</code> can generate so-called 'singular' methods for collection parameters/fields. For details, see <a href=\"/features/Builder#singular\">the <code>@Singular</code> documentation in <code>@Builder</code></a>.\n\t\t</p><p>\n\t\t\t<code>@SuperBuilder</code> generates a protected constructor on the class that takes a builder instance as a parameter. This constructor sets the fields of the new instance to the values from the builder.\n\t\t</p><p>\n\t\t\t<code>@SuperBuilder</code> is not compatible with <code>@Builder</code>.\n\t\t</p><p>\n\t\t\tYou can use <code>@SuperBuilder(toBuilder = true)</code> to also generate an instance method in your class called <code>toBuilder()</code>; it creates a new builder that starts out with all the values of this instance.\n\t\t\tUsing <code>toBuilder</code> requires that all superclasses also have <code>toBuilder = true</code>.\n\t\t\tYou can put the <code>@Builder.ObtainVia</code> annotation on the fields to indicate alternative means by which the value for that field/parameter is obtained from this instance.\n\t\t\tFor example, you can specify a method to be invoked: <code>@Builder.ObtainVia(method = \"calculateFoo\")</code>.\n\t\t</p><p>\n\t\t\tTo ensure type-safety, <code>@SuperBuilder</code> generates two inner builder classes for each annotated class, one abstract and one concrete class named <code><em>Foobar</em>Builder</code> and <code><em>Foobar</em>BuilderImpl</code> (where <em>Foobar</em> is the name of the annotated class).\n\t\t</p><p>\n\t\t\tYou can customize most of the code generated by <code>@SuperBuilder</code>, except for internal methods (e.g. <code>self()</code>).\n\t\t\tYou have to make sure that the builder class declaration headers match those that would have been generated by lombok.\n\t\t\tDue to the heavy generics usage, we strongly advice to take the uncustomized <a href=\"/features/delombok\">delomboked code</a> as a reference when customizing <code>@SuperBuilder</code>.\n\t\t</p><p>\n\t\t\tThe configurable aspects of builder are:\n\t\t\t<ul>\n\t\t\t\t<li>\n\t\t\t\t\tThe <em>build()</em> method's name (default: <code>\"build\"</code>)\n\t\t\t\t</li><li>\n\t\t\t\t\tThe <em>builder()</em> method's name (default: <code>\"builder\"</code>)\n\t\t\t\t</li><li>\n\t\t\t\t\tIf you want <code>toBuilder()</code> (default: no)\n\t\t\t\t</li><li>\n\t\t\t\t\t(discouraged) If you want your builder's 'set' methods to have a prefix, i.e. <code>Person.builder().setName(\"Jane\").build()</code> instead of <code>Person.builder().name(\"Jane\").build()</code> and what it should be.\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t\tExample usage where all options are changed from their defaults:<br />\n\t\t\t<code>@SuperBuilder(buildMethodName = \"execute\", builderMethodName = \"helloWorld\", toBuilder = true, setterPrefix = \"set\")</code><br />\n\t\t</p><p>\n\t\t\tLooking to use your superbuilder with <a href=\"https://github.com/FasterXML/jackson\">Jackson</a>, the JSON/XML tool? We have you covered: Check out the <a href=\"/features/experimental/Jacksonized\">@Jacksonized</a> feature.\n\t\t</p>\n\t</@f.overview>\n\t\n\t<@f.confKeys>\n\t\t<dt>\n\t\t\t<code>lombok.builder.className</code> = [a java identifier with an optional star to indicate where the return type name goes] (default: <code>*Builder</code>)\n\t\t</dt><dd>\n\t\t\tThis is the name of the generated builder class; any star in the name is replaced with the relevant return type. Note that the parent class must also have the same setting (the entire type hierarchy annoated with <code>@SuperBuilder</code> needs the same setting).\n\t\t</dd><dt>\n\t\t\t<code>lombok.superBuilder.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@SuperBuilder</code> as a warning or error if configured.\n\t\t</dd><dt>\n\t\t\t<code>lombok.singular.useGuava</code> = [<code>true</code> | <code>false</code>] (default: false)\n\t\t</dt><dd>\n\t\t\tIf <code>true</code>, lombok will use guava's <code>ImmutableXxx</code> builders and types to implement <code>java.util</code> collection interfaces, instead of creating implementations based on <code>Collections.unmodifiableXxx</code>. You must ensure that guava is actually available on the classpath and buildpath if you use this setting. Guava is used automatically if your field/parameter has one of the guava <code>ImmutableXxx</code> types.\n\t\t</dd><dt>\n\t\t\t<code>lombok.singular.auto</code> = [<code>true</code> | <code>false</code>] (default: true)\n\t\t</dt><dd>\n\t\t\tIf <code>true</code> (which is the default), lombok automatically tries to singularize your identifier name by assuming that it is a common english plural. If <code>false</code>, you must always explicitly specify the singular name, and lombok will generate an error if you don't (useful if you write your code in a language other than english).\n\t\t</dd>\n\t</@f.confKeys>\n\n\t<@f.smallPrint>\n\t\t<p>\n\t\t\tThe generated builder code heavily relies on generics to avoid class casting when using the builder.\n\t\t</p><p>\n\t\t\tFor remarks on <code>@Singular</code>, see <a href=\"/features/Builder#small-print\">the <code>@Builder</code> documentation's</a> small print.\n\t\t</p><p>\n\t\t\tVarious well known annotations about nullity cause null checks to be inserted and will be copied to parameter of the builder's 'setter' method. See <a href=\"/features/GetterSetter#small-print\">Getter/Setter documentation's small print</a> for more information.\n\t\t</p>\n\t</@f.smallPrint>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/experimental/Tolerate.html",
    "content": "<#import \"../_features.html\" as f>\n\n<@f.scaffold title=\"@Tolerate\" logline=\"Skip, jump, and forget! Make lombok disregard an existing method or constructor.\">\n\t<@f.history>\n\t\t<p>\n\t\t\t<code>@Tolerate</code> was introduced as feature in lombok v1.14.2<br />\n\t\t</p>\n\t</@f.history>\n\n\t<@f.experimental>\n\t\t<ul>\n\t\t\t<li>\n\t\t\t\tNot used that much.\n\t\t\t</li>\n\t\t\t<li>\n\t\t\t\tDifficult to support for edge cases, such as recursive delegation.\n\t\t\t</li>\n\t\t</ul>\n\t</@f.experimental>\n\n\t<@f.overview>\n\t\t<p>\n\t\t\tAny method or constructor can be annotated with <code>@Tolerate</code> and lombok will act as if it\n\t\t\tdoes not exist. For example, normally lombok would not generate a <code>setDate</code> method for field\n\t\t\tnamed <code>date</code> if you already have a method named <code>setDate</code> in your code already. By\n\t\t\tannotating that method with <code>@Tolerate</code>, lombok will generate it anyway. This can be useful if the\n\t\t\ttype of the parameter of your existing method is different and doesn't clash.\n\t\t</p>\n\t\t<p>\n\t\t\tPut on any method or constructor to make lombok pretend it doesn't exist, i.e., to generate a method\n\t\t\twhich would otherwise be skipped due to possible conflicts.\n\t\t</p>\n\t</@f.overview>\n\n\t<@f.snippets name=\"experimental/Tolerate\" />\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/experimental/UtilityClass.html",
    "content": "<#import \"../_features.html\" as f>\n\n<@f.scaffold title=\"@UtilityClass\" logline=\"Utility, metility, wetility! Utility classes for the masses.\">\n\t<@f.history>\n\t\t<p>\n\t\t\t<code>@UtilityClass</code> was introduced as an experimental feature in lombok v1.16.2.\n\t\t</p>\n\t</@f.history>\n\n\t<@f.experimental>\n\t\t<ul>\n\t\t\t<li>\n\t\t\t\tSome debate as to whether it's common enough to count as boilerplate.\n\t\t\t</li><li>\n\t\t\t\tDue to limitations in javac, currently non-star static imports <em>cannot</em> be used to import stuff from <code>@UtilityClass</code>es; don't static import, or use star imports.\n\t\t\t</li>\n\t\t</ul>\n\t\tCurrent status: <em>negative</em> - Currently we feel this feature cannot move out of experimental status due to fundamental issues with non-star static imports.\n\t</@f.experimental>\n\n\t<@f.overview>\n\t\t<p>\n\t\t\tA utility class is a class that is just a namespace for functions. No instances of it can exist, and all its members are static. For example, <code>java.lang.Math</code> and <code>java.util.Collections</code> are well known utility classes. This annotation automatically turns the annotated class into one.\n\t\t</p><p>\n\t\t\tA utility class cannot be instantiated. By marking your class with <code>@UtilityClass</code>, lombok will automatically generate a private constructor that throws an exception, flags as error any explicit constructors you add, and marks the class <code>final</code>. If the class is an inner class, the class is also marked <code>static</code>.\n\t\t</p><p>\n\t\t\t<em>All</em> members of a utility class are automatically marked as <code>static</code>. Even fields and inner classes.\n\t\t</p>\n\t</@f.overview>\n\n\t<@f.snippets name=\"experimental/UtilityClass\" />\n\n\t<@f.confKeys>\n\t\t<dt>\n\t\t\t<code>lombok.utilityClass.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@UtilityClass</code> as a warning or error if configured.\n\t\t</dd>\n\t</@f.confKeys>\n\n\t<@f.smallPrint>\n\t\t<p>\n\t\t\tThere isn't currently any way to create non-static members, or to define your own constructor. If you want to instantiate the utility class, even only as an internal implementation detail, <code>@UtilityClass</code> cannot be used.\n\t\t</p><p>\n\t\t\tDue to a peculiar way javac processes static imports, trying to do a non-star static import of any of the members of a `@UtilityClass` won't work. Either use a star static import: `import static TypeMarkedWithUtilityClass.*;` or don't statically import any of the members.\n\t\t</p>\n\t</@f.smallPrint>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/experimental/index.html",
    "content": "<#import \"../../_scaffold.html\" as main>\n<#import \"../_features.html\" as f>\n\n<@main.scaffold title=\"Experimental\">\n\t<a class=\"tidelift-link\" href=\"/tidelift\">Get Lombok for Enterprise</a>\n\t<div class=\"page-header top5\">\n\t\t<div class=\"row text-center\">\n\t\t\t<@main.h1 title=\"Lombok experimental features\" />\n\t\t</div>\n\t\t<div class=\"row\">\n\t\t\tThe <a href=\"/api/\">Lombok javadoc</a> is available, but we advise these pages.\n\n\t\t\t<p>\n\t\t\t\tExperimental features are available in your normal lombok installation, but are not as robustly supported as lombok's main features. In particular, experimental features:\n\t\t\t\t<ul>\n\t\t\t\t\t<li>\n\t\t\t\t\t\tAre not tested as well as the core features.\n\t\t\t\t\t</li><li>\n\t\t\t\t\t\tDo not get bugs fixed as quickly as core features.\n\t\t\t\t\t</li><li>\n\t\t\t\t\t\tMay have APIs that will change, possibly drastically if we find a different, better way to solve the same problem.\n\t\t\t\t\t</li><li>\n\t\t\t\t\t\tMay disappear entirely if the feature is too difficult to support or doesn't bust enough boilerplate.\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</p><p>\n\t\t\t\tFeatures that receive positive community feedback and which seem to produce clean, flexible code will eventually become accepted as a core feature and move out of the experimental package.\n\t\t\t</p>\n\t\t</div>\n\t\t<div class=\"row\">\n\t\t\t<@main.feature title=\"@Accessors\" href=\"Accessors\">\n\t\t\t\tA more fluent API for getters and setters.\n\t\t\t</@main.feature>\n\n\t\t\t<@main.feature title=\"@ExtensionMethod\" href=\"ExtensionMethod\">\n\t\t\t\tAnnoying API? Fix it yourself: Add new methods to existing types!\n\t\t\t</@main.feature>\n\n\t\t\t<@main.feature title=\"@FieldDefaults\" href=\"FieldDefaults\">\n\t\t\t\tNew default field modifiers for the 21st century.\n\t\t\t</@main.feature>\n\n\t\t\t<@main.feature title=\"@Delegate\" href=\"Delegate\">\n\t\t\t\tDon't lose your composition.\n\t\t\t</@main.feature>\n\n\t\t\t<@main.feature title=\"onMethod= / onConstructor= / onParam=\" href=\"onX\">\n\t\t\t\tSup dawg, we heard you like annotations, so we put annotations in your annotations so you can annotate while you're annotating.\n\t\t\t</@main.feature>\n\n\t\t\t<@main.feature title=\"@UtilityClass\" href=\"UtilityClass\">\n\t\t\t\tUtility, metility, wetility! Utility classes for the masses.\n\t\t\t</@main.feature>\n\n\t\t\t<@main.feature title=\"@Helper\" href=\"Helper\">\n\t\t\t\tWith a little help from my friends... Helper methods for java.\n\t\t\t</@main.feature>\n\n\t\t\t<@main.feature title=\"@FieldNameConstants\" href=\"FieldNameConstants\">\n\t\t\t\tName... that... field! String constants for your field's names.\n\t\t\t</@main.feature>\n\n\t\t\t<@main.feature title=\"@SuperBuilder\" href=\"SuperBuilder\">\n\t\t\t\tBob now knows his ancestors: Builders with fields from superclasses, too.\n\t\t\t</@main.feature>\n\n\t\t\t<@main.feature title=\"@Tolerate\" href=\"Tolerate\">\n\t\t\t\tSkip, jump, and forget! Make lombok disregard an existing method or constructor.\n\t\t\t</@main.feature>\n\n\t\t\t<@main.feature title=\"@Jacksonized\" href=\"Jacksonized\">\n\t\t\t\tBob, meet Jackson. Lets make sure you become fast friends.\n\t\t\t</@main.feature>\n\n\t\t\t<@main.feature title=\"@StandardException\" href=\"StandardException\">\n\t\t\t\tStandard.. Exceptional? This is not just an oxymoron, it's convenient!\n\t\t\t</@main.feature>\n\t\t</div>\n\n\t\t<@f.confKeys>\n\t\t\t<dt>\n\t\t\t\t<code>lombok.experimental.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t\t</dt><dd>\n\t\t\t\tLombok will flag any usage of any of the features listed here as a warning or error if configured.\n\t\t\t</dd>\n\t\t</@f.confKeys>\n\n\t\t<div class=\"row\">\n\t\t\t<h3 class=\"text-center\">Putting the \"Ex\" in \"Experimental\": promoted or deleted experimental features.</h3>\n\t\t\t<div class=\"row\">\n\t\t\t\t<@main.feature title=\"@Value: promoted\" href=\"/features/Value\">\n\t\t\t\t\t<code>@Value</code> has proven its value and has been moved to the main package.\n\t\t\t\t</@main.feature>\n\t\t\t\t<@main.feature title=\"@Builder: promoted\" href=\"/features/Builder\">\n\t\t\t\t\t<code>@Builder</code> is a solid base to build APIs on, and has been moved to the main package.\n\t\t\t\t</@main.feature>\n\t\t\t\t<@main.feature title=\"@Wither: renamed to @With, and promoted\" href=\"/features/With\">\n\t\t\t\t\tImmutable 'setters' - methods that create a clone but with one changed field.\n\t\t\t\t</@main.feature>\n\t\t\t\t<@main.feature title=\"var\" href=\"/features/var\">\n\t\t\t\t\tModifiable local variables with a type inferred by assigning value.\n\t\t\t\t</@main.feature>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</@main.scaffold>\n"
  },
  {
    "path": "website/templates/features/experimental/onX.html",
    "content": "<#import \"../_features.html\" as f>\n\n<@f.scaffold title=\"onX\" logline=\"Sup dawg, we heard you like annotations, so we put annotations in your annotations so you can annotate while you're annotating.\">\n\t<@f.history>\n\t\t<p>\n\t\t\tonX was introduced as experimental feature in lombok v0.11.8.\n\t\t</p>\n\t</@f.history>\n\n\t<@f.experimental>\n\t\t<ul>\n\t\t\t<li>\n\t\t\t\tUgly syntax. The syntax of this feature is not optimal, but it is the least convoluted syntax that could possibly work (for now!)\n\t\t\t</li><li>\n\t\t\t\tUncertainty: Future versions of javac may break this feature, and we may not be able to restore it.\n\t\t\t</li>\n\t\t</ul>\n\t\tCurrent status: <em>uncertain</em> - Currently we feel this feature cannot move out of experimental status.\n\t</@f.experimental>\n\n\t<@f.overview>\n\t\t<p>\n\t\t\t<strong>This feature is considered 'workaround status' - it exists in order to allow users of lombok that cannot work without this feature to have access to it anyway. If we find a better way to implement this feature, or some future java version introduces an alternative strategy, this feature can disappear without a reasonable deprecation period. Also, this feature may not work in future versions of javac. Use at your own discretion.</strong>\n\t\t</p><p>\n\t\t\tMost annotations that make lombok generate methods or constructors can be configured to also make lombok put custom annotations on elements in the generated code.\n\t\t</p><p>\n\t\t\t<code>@Getter</code>, <code>@Setter</code>, and <code>@Wither</code> support the <code>onMethod</code> option, which will put the listed annotations on the generated method.\n\t\t</p><p>\n\t\t\t<code>@AllArgsConstructor</code>, <code>@NoArgsConstructor</code>, and <code>@RequiredArgsConstructor</code> support the <code>onConstructor</code> option which will put the listed annotations on the generated constructor.\n\t\t</p><p>\n\t\t\t<code>@Setter</code> and <code>@Wither</code> support <code>onParam</code> in addition to <code>onMethod</code>; annotations listed will be put on the only parameter that the generated method has. <code>@EqualsAndHashCode</code> also supports <code>onParam</code>; the listed annotation(s) will be placed on the single parameter of the generated <code>equals</code> method, as well as any generated <code>canEqual</code> method.\n\t\t</p><p>\n\t\t\tThe syntax is a little strange and depends on the javac you are using.<br />\n\t\t\tOn javac7, to use any of the 3 <code>onX</code> features, you must wrap the annotations to be applied to the constructor / method / parameter in <code>@__(@AnnotationGoesHere)</code>. To apply multiple annotations, use <code>@__({@Annotation1, @Annotation2})</code>. The annotations can themselves obviously have parameters as well.<br />\n\t\t\tOn javac8 and up, you add an underscore after <code>onMethod</code>, <code>onParam</code>, or <code>onConstructor</code>.\n\t\t</p>\n\t</@f.overview>\n\n\t<@f.snippets name=\"experimental/onX\" />\n\n\t<@f.confKeys>\n\t\t<dt>\n\t\t\t<code>lombok.onX.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>onX</code> as a warning or error if configured.\n\t\t</dd>\n\t</@f.confKeys>\n\n\t<@f.smallPrint>\n\t\t<p>\n\t\t\tThe reason of the weird syntax is to make this feature work in javac 7 compilers; the <code>@__</code> type is an annotation reference to the annotation type <code>__</code> (double underscore) which doesn't actually exist; this makes javac 7 delay aborting the compilation process due to an error because it is possible an annotation processor will later create the <code>__</code> type. Instead, lombok applies the annotations and removes the references so that the error will never actually occur. The point is: The <code>__</code> type <em>must not exist</em>, otherwise the feature does not work. In the rare case that the <code>__</code> type does exist (and is imported or in the package), you can simply add more underscores. Technically any non-existent type would work, but to maintain consistency and readability and catch erroneous use, lombok considers it an error if the 'wrapper' annotation is anything but a series of underscores.\n\t\t</p><p>\n\t\t\tIn javac8, the above feature should work but due to a bug in javac8 it does not. However, starting in javac8, if the parameter name does not exist in the annotation type, compilation proceeds to a phase where lombok can fix it.\n\t\t</p><p>\n\t\t\tTo reiterate: This feature can disappear at any time; if you use this feature, be prepared to adjust your code when we find a nicer way of implementing this feature, or, if a future version of javac forces us to remove this feature entirely with no alternative.\n\t\t</p><p>\n\t\t\tThe <code>onX</code> parameter is not legal on any type-wide variant. For example, a <code>@Getter</code> annotation on a class does not support <code>onMethod</code>.\n\t\t</p>\n\t</@f.smallPrint>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/index.html",
    "content": "<#import \"../_scaffold.html\" as main>\n\n<@main.scaffold title=\"Stable\">\n\t<a class=\"tidelift-link\" href=\"/tidelift\">Get Lombok for Enterprise</a>\n\t<div class=\"page-header top5\">\n\t\t<div class=\"row text-center\">\n\t\t\t<@main.h1 title=\"Lombok features\" />\n\t\t</div>\n\t\t<div class=\"row\">\n\t\t\tThe <a href=\"/api/\">Lombok javadoc</a> is available, but we advise these pages.\n\t\t\t\n\t\t\t<@main.feature title=\"val\" href=\"val\">\n\t\t\t\tFinally! Hassle-free final local variables.\n\t\t\t</@main.feature>\n\n\t\t\t<@main.feature title=\"var\" href=\"var\">\n\t\t\t\tMutably! Hassle-free local variables.\n\t\t\t</@main.feature>\n\n\t\t\t<@main.feature title=\"@NonNull\" href=\"NonNull\">\n\t\t\t\tor: How I learned to stop worrying and love the NullPointerException.\n\t\t\t</@main.feature>\n\n\t\t\t<@main.feature title=\"@Cleanup\" href=\"Cleanup\">\n\t\t\t\tAutomatic resource management: Call your <code>close()</code> methods safely with no hassle.\n\t\t\t</@main.feature>\n\n\t\t\t<@main.feature title=\"@Getter/@Setter\" href=\"GetterSetter\">\n\t\t\t\tNever write <code>public int getFoo() {return foo;}</code> again.\n\t\t\t</@main.feature>\n\n\t\t\t<@main.feature title=\"@ToString\" href=\"ToString\">\n\t\t\t\tNo need to start a debugger to see your fields: Just let lombok generate a <code>toString</code> for\n\t\t\t\tyou!\n\t\t\t</@main.feature>\n\n\t\t\t<@main.feature title=\"@EqualsAndHashCode\" href=\"EqualsAndHashCode\">\n\t\t\t\tEquality made easy: Generates <code>hashCode</code> and <code>equals</code> implementations from the\n\t\t\t\tfields of your object..\n\t\t\t</@main.feature>\n\n\t\t\t<@main.feature title=\"@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor\" href=\"constructor\">\n\t\t\t\tConstructors made to order: Generates constructors that take no arguments, one argument per final /\n\t\t\t\tnon-nullfield, or one argument for every field.\n\t\t\t</@main.feature>\n\n\t\t\t<@main.feature title=\"@Data\" href=\"Data\">\n\t\t\t\tAll together now: A shortcut for <code>@ToString</code>, <code>@EqualsAndHashCode</code>,\n\t\t\t\t<code>@Getter</code> on all fields, and <code>@Setter</code> on all non-final fields, and\n\t\t\t\t<code>@RequiredArgsConstructor</code>!\n\t\t\t</@main.feature>\n\n\t\t\t<@main.feature title=\"@Value\" href=\"Value\">\n\t\t\t\tImmutable classes made very easy.\n\t\t\t</@main.feature>\n\n\t\t\t<@main.feature title=\"@Builder\" href=\"Builder\">\n\t\t\t\t... and Bob's your uncle: No-hassle fancy-pants APIs for object creation!\n\t\t\t</@main.feature>\n\n\t\t\t<@main.feature title=\"@SneakyThrows\" href=\"SneakyThrows\">\n\t\t\t\tTo boldly throw checked exceptions where no one has thrown them before!\n\t\t\t</@main.feature>\n\n\t\t\t<@main.feature title=\"@Synchronized\" href=\"Synchronized\">\n\t\t\t\t<code>synchronized</code> done right: Don't expose your locks.\n\t\t\t</@main.feature>\n\n\t\t\t<@main.feature title=\"@Locked\" href=\"Locked\">\n\t\t\t\tPop it and <strong>lock</strong> it! <code>ReentrantLock</code>, now with less hassle.\n\t\t\t</@main.feature>\n\t\t\t\n\t\t\t<@main.feature title=\"@With\" href=\"With\">\n\t\t\t\tImmutable 'setters' - methods that create a clone but with one changed field.\n\t\t\t</@main.feature>\n\n\t\t\t<@main.feature title=\"@Getter(lazy=true)\" href=\"GetterLazy\">\n\t\t\t\tLaziness is a virtue!\n\t\t\t</@main.feature>\n\n\t\t\t<@main.feature title=\"@Log\" href=\"log\">\n\t\t\t\tCaptain's Log, stardate 24435.7: &quot;What was that line again?&quot;\n\t\t\t</@main.feature>\n\t\t\t\n\t\t\t<@main.feature title=\"experimental\" href=\"/features/experimental/all\">\n\t\t\t\tHead to the lab: The new stuff we're working on.\n\t\t\t</@main.feature>\n\t\t</div>\n\n\t\t<div class=\"row\">\n\t\t\t<@main.h1 title=\"Configuration system\" />\n\n\t\t\t<div class=\"text-center\">\n\t\t\t\tLombok, made to order: <a href=\"configuration\">Configure lombok features</a> in one place for your entire project or even your workspace.\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"row\">\n\t\t\t<@main.h1 title=\"Running delombok\" />\n\n\t\t\t<div>\n\t\t\t\tDelombok copies your source files to another directory, replacing all lombok annotations with their desugared form. So, it'll turn <code>@Getter</code> back into the actual getter. It then removes the annotation. This is useful for all sorts of reasons; you can check out what's happening under the hood, if the unthinkable happens and you want to stop using lombok, you can easily remove all traces of it in your source, and you can use delombok to preprocess your source files for source-level tools such as javadoc and GWT. More information about how to run delombok, including instructions for build tools can be found at the <a href=\"delombok\">delombok page</a>.\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</@main.scaffold>\n"
  },
  {
    "path": "website/templates/features/log.html",
    "content": "<#import \"_features.html\" as f>\n\n<@f.scaffold title=\"@Log (and friends)\" logline=\"Captain's Log, stardate 24435.7: &quot;What was that line again?&quot;\">\n\t<@f.history>\n\t\t<p>\n\t\t\tThe various <code>@Log</code> variants were added in lombok v0.10.\n\t\t\t<em>NEW in lombok 0.10: </em>You can annotate any class with a log annotation to let lombok generate a logger field.<br/>\n\t\t\tThe logger is named <code>log</code> and the field's type depends on which logger you have selected.\n\t\t</p><p>\n\t\t\t<em>NEW in lombok v1.16.24: </em>Addition of google's FluentLogger (via <a href=\"#Flogger\"><code>@Flogger</code></a>).\n\t\t</p><p>\n\t\t\t<em>NEW in lombok v1.18.10: </em>Addition of <a href=\"#CustomLog\"><code>@CustomLog</code></a> which lets you add any logger by configuring how to create them with a config key.\n\t\t</p>\n\t</@f.history>\n\n\t<@f.overview>\n\t\t<p>\n\t\t\tYou put the variant of <code>@Log</code> on your class (whichever one applies to the logging system you use); you then have a static final <code>log</code> field, initialized as is the commonly prescribed way for the logging framework you use, which you can then use to write log statements.\n\t\t</p><p>\n\t\t\tThere are several choices available:<br />\n\t\t\t<dl>\n\t\t\t\t<dt id=\"CommonsLog\">\n\t\t\t\t\t<code>@CommonsLog</code>\n\t\t\t\t</dt><dd>\n\t\t\t\t\tCreates <code><span class=\"keyword\">private&nbsp;static&nbsp;final&nbsp;</span><a href=\"https://commons.apache.org/logging/apidocs/org/apache/commons/logging/Log.html\">org.apache.commons.logging.Log</a>&nbsp;<span class=\"staticfield\">log</span>&nbsp;=&nbsp;<a href=\"https://commons.apache.org/logging/apidocs/org/apache/commons/logging/LogFactory.html#getLog(java.lang.Class)\">org.apache.commons.logging.LogFactory.getLog</a>(LogExample.<span class=\"keyword\">class</span>);</code>\n\t\t\t\t</dd><dt id=\"Flogger\">\n\t\t\t\t\t<code>@Flogger</code>\n\t\t\t\t</dt><dd>\n\t\t\t\t\tCreates <code><span class=\"keyword\">private&nbsp;static&nbsp;final&nbsp;</span><a href=\"https://google.github.io/flogger/\">com.google.common.flogger.FluentLogger</a>&nbsp;<span class=\"staticfield\">log</span>&nbsp;=&nbsp;com.google.common.flogger.FluentLogger.forEnclosingClass();</code>\n\t\t\t\t</dd><dt id=\"JBossLog\">\n\t\t\t\t\t<code>@JBossLog</code>\n\t\t\t\t</dt><dd>\n\t\t\t\t\tCreates <code><span class=\"keyword\">private&nbsp;static&nbsp;final&nbsp;</span><a href=\"https://docs.jboss.org/jbosslogging/latest/org/jboss/logging/Logger.html\">org.jboss.logging.Logger</a>&nbsp;<span class=\"staticfield\">log</span>&nbsp;=&nbsp;<a href=\"https://docs.jboss.org/jbosslogging/latest/org/jboss/logging/Logger.html#getLogger(java.lang.Class)\">org.jboss.logging.Logger.getLogger</a>(LogExample.<span class=\"keyword\">class</span>);</code>\n\t\t\t\t</dd><dt id=\"javaLog\">\n\t\t\t\t\t<code>@Log</code>\n\t\t\t\t</dt><dd>\n\t\t\t\t\tCreates <code><span class=\"keyword\">private&nbsp;static&nbsp;final&nbsp;</span><a href=\"https://docs.oracle.com/javase/6/docs/api/java/util/logging/Logger.html\">java.util.logging.Logger</a>&nbsp;<span class=\"staticfield\">log</span>&nbsp;=&nbsp;<a href=\"https://docs.oracle.com/javase/6/docs/api/java/util/logging/Logger.html#getLogger(java.lang.String)\">java.util.logging.Logger.getLogger</a>(LogExample.<span class=\"keyword\">class</span>.getName());</code>\n\t\t\t\t</dd><dt id=\"Log4j\">\n\t\t\t\t\t<code>@Log4j</code>\n\t\t\t\t</dt><dd>\n\t\t\t\t\tCreates <code><span class=\"keyword\">private&nbsp;static&nbsp;final&nbsp;</span><a href=\"https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Logger.html\">org.apache.log4j.Logger</a>&nbsp;<span class=\"staticfield\">log</span>&nbsp;=&nbsp;<a href=\"https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Logger.html#getLogger(java.lang.Class)\">org.apache.log4j.Logger.getLogger</a>(LogExample.<span class=\"keyword\">class</span>);</code>\n\t\t\t\t</dd><dt id=\"Log4j2\">\n\t\t\t\t\t<code>@Log4j2</code>\n\t\t\t\t</dt><dd>\n\t\t\t\t\tCreates <code><span class=\"keyword\">private&nbsp;static&nbsp;final&nbsp;</span><a href=\"https://logging.apache.org/log4j/2.0/log4j-api/apidocs/org/apache/logging/log4j/Logger.html\">org.apache.logging.log4j.Logger</a>&nbsp;<span class=\"staticfield\">log</span>&nbsp;=&nbsp;<a href=\"https://logging.apache.org/log4j/2.0/log4j-api/apidocs/org/apache/logging/log4j/LogManager.html#getLogger(java.lang.Class)\">org.apache.logging.log4j.LogManager.getLogger</a>(LogExample.<span class=\"keyword\">class</span>);</code>\n\t\t\t\t</dd><dt id=\"Slf4j\">\n\t\t\t\t\t<code>@Slf4j</code>\n\t\t\t\t</dt><dd>\n\t\t\t\t\tCreates <code><span class=\"keyword\">private&nbsp;static&nbsp;final&nbsp;</span><a href=\"https://www.slf4j.org/api/org/slf4j/Logger.html\">org.slf4j.Logger</a>&nbsp;<span class=\"staticfield\">log</span>&nbsp;=&nbsp;<a href=\"https://www.slf4j.org/api/org/slf4j/LoggerFactory.html#getLogger(java.lang.Class)\">org.slf4j.LoggerFactory.getLogger</a>(LogExample.<span class=\"keyword\">class</span>);</code>\n\t\t\t\t</dd><dt id=\"Xslf4j\">\n\t\t\t\t\t<code>@XSlf4j</code>\n\t\t\t\t</dt><dd>\n\t\t\t\t\tCreates <code><span class=\"keyword\">private&nbsp;static&nbsp;final&nbsp;</span><a href=\"https://www.slf4j.org/api/org/slf4j/ext/XLogger.html\">org.slf4j.ext.XLogger</a>&nbsp;<span class=\"staticfield\">log</span>&nbsp;=&nbsp;<a href=\"https://www.slf4j.org/api/org/slf4j/ext/XLoggerFactory.html#getXLogger(java.lang.Class)\">org.slf4j.ext.XLoggerFactory.getXLogger</a>(LogExample.<span class=\"keyword\">class</span>);</code>\n\t\t\t\t</dd><dt id=\"CustomLog\">\n\t\t\t\t\t<code>@CustomLog</code>\n\t\t\t\t</dt><dd>\n\t\t\t\t\tCreates <code><span class=\"keyword\">private&nbsp;static&nbsp;final&nbsp;</span><em>com.foo.your.Logger</em>&nbsp;<span class=\"staticfield\">log</span>&nbsp;=&nbsp;<em>com.foo.your.LoggerFactory.createYourLogger</em>(LogExample.<span class=\"keyword\">class</span>);</code>\n\t\t\t\t\t<p>\n\t\t\t\t\t\tThis option <em>requires</em> that you add a configuration to your <a href=\"/features/configuration\"><code>lombok.config</code></a> file to specify what <code>@CustomLog</code> should do.\n\t\t\t\t\t</p><p>\n\t\t\t\t\t\tFor example:<code>lombok.log.custom.declaration = com.foo.your.Logger com.foo.your.LoggerFactory.createYourLog(TYPE)(TOPIC)</code> which would produce the above statement. First comes a type which is the type of your logger, then a space, then the type of your logger factory, then a dot, then the name of the logger factory method, and then 1 or 2 parameter definitions; at most one definition with <code>TOPIC</code> and at most one without <code>TOPIC</code>. Each parameter definition is specified as a parenthesised comma-separated list of parameter kinds. The options are: <code>TYPE</code> (passes this <code>@Log</code> decorated type, as a class), <code>NAME</code> (passes this <code>@Log</code> decorated type's fully qualified name), <code>TOPIC</code> (passes the explicitly chosen topic string set on the <code>@CustomLog</code> annotation), and <code>NULL</code> (passes <code>null</code>).\n\t\t\t\t\t</p><p>\n\t\t\t\t\t\tThe logger type is optional; if it is omitted, the logger factory type is used. (So, if your logger class has a static method that creates loggers, you can shorten your logger definition).\n\t\t\t\t\t</p><p>\n\t\t\t\t\t\tPlease contact us if there is a public, open source, somewhat commonly used logging framework that we don't yet have an explicit annotation for. The primary purpose of <code>@CustomLog</code> is to support your in-house, private logging frameworks.\n\t\t\t\t\t</p>\n\t\t\t\t</dd>\n\t\t\t</dl>\n\t\t</p><p>\n\t\t\tBy default, the topic (or name) of the logger will be the (name of) the class annotated with the <code>@Log</code> annotation. This can be customised by specifying the <code>topic</code> parameter. For example: <code>@XSlf4j(topic=\"reporting\")</code>.\n\t\t</p>\n\t</@f.overview>\n\n\t<@f.snippets name=\"Log\" />\n\n\t<@f.confKeys>\n\t\t<dt>\n\t\t\t<code>lombok.log.fieldName</code> = <em>an identifier</em> (default: <code>log</code>).\n\t\t</dt><dd>\n\t\t\tThe generated logger fieldname is by default '<code>log</code>', but you can change it to a different name with this setting.\n\t\t</dd><dt>\n\t\t\t<code>lombok.log.fieldIsStatic</code> = [<code>true</code> | <code>false</code>] (default: true)\n\t\t</dt><dd>\n\t\t\tNormally the generated logger is a <code>static</code> field. By setting this key to <code>false</code>, the generated field will be an instance field instead.\n\t\t</dd><dt>\n\t\t\t<code>lombok.log.custom.declaration</code> = <em>LoggerType </em> LoggerFactoryType.loggerFactoryMethod(loggerFactoryMethodParams)<em>(loggerFactoryMethodParams)</em>\n\t\t</dt><dd>\n\t\t\tConfigures what to generate when <code>@CustomLog</code> is used. (The italicized parts are optional). loggerFactoryMethodParams is a comma-separated list of zero to any number of parameter kinds to pass. Valid kinds: TYPE, NAME, TOPIC, and NULL. You can include a parameter definition for the case where no explicit topic is set (do not include the TOPIC in the parameter list), and for when an explicit topic is set (do include the TOPIC parameter in the list).\n\t\t</dd><dt>\n\t\t\t<code>lombok.log.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of any of the various log annotations as a warning or error if configured.\n\t\t</dd><dt>\n\t\t\t<code>lombok.log.custom.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@lombok.CustomLog</code> as a warning or error if configured.\n\t\t</dd><dt>\n\t\t\t<code>lombok.log.apacheCommons.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@lombok.extern.apachecommons.CommonsLog</code> as a warning or error if configured.\n\t\t</dd><dt>\n\t\t\t<code>lombok.log.flogger.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@lombok.extern.flogger.Flogger</code> as a warning or error if configured.\n\t\t</dd><dt>\n\t\t\t<code>lombok.log.jbosslog.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@lombok.extern.jbosslog.JBossLog</code> as a warning or error if configured.\n\t\t</dd><dt>\n\t\t\t<code>lombok.log.javaUtilLogging.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@lombok.extern.java.Log</code> as a warning or error if configured.\n\t\t</dd><dt>\n\t\t\t<code>lombok.log.log4j.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@lombok.extern.log4j.Log4j</code> as a warning or error if configured.\n\t\t</dd><dt>\n\t\t\t<code>lombok.log.log4j2.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@lombok.extern.log4j.Log4j2</code> as a warning or error if configured.\n\t\t</dd><dt>\n\t\t\t<code>lombok.log.slf4j.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@lombok.extern.slf4j.Slf4j</code> as a warning or error if configured.\n\t\t</dd><dt>\n\t\t\t<code>lombok.log.xslf4j.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>@lombok.extern.slf4j.XSlf4j</code> as a warning or error if configured.\n\t\t</dd>\n\t</@f.confKeys>\n\n\t<@f.smallPrint>\n\t\t<p>\n\t\t\tIf a field called <code>log</code> already exists, a warning will be emitted and no code will be generated.\n\t\t</p><p>\n\t\t\tA future feature of lombok's diverse log annotations is to find calls to the logger field and, if the chosen logging framework supports it and the log level can be compile-time determined from the log call, guard it with an <code>if</code> statement. This way if the log statement ends up being ignored, the potentially expensive calculation of the log string is avoided entirely. This does mean that you should <em>NOT</em> put any side-effects in the expression that you log.\n\t\t</p>\n\t</@f.smallPrint>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/val.html",
    "content": "<#import \"_features.html\" as f>\n\n<@f.scaffold title=\"val\" logline=\"Finally! Hassle-free final local variables.\">\n\t<@f.history>\n\t\t<p>\n\t\t\t<code>val</code> was introduced in lombok 0.10.\n\t\t</p>\n\t\t<p>\n\t\t\t<em>NEW in Lombok 1.18.22: </em><code>val</code> gets replaced with <code>final var</code>.\n\t\t</p>\n\t</@f.history>\n\t<@f.overview>\n\t\t<p>\n\t\t\tYou can use <code>val</code> as the type of a local variable declaration instead of actually writing the type. When you do this, the type will be inferred from the initializer expression. The local variable will also be made final. This feature works on local variables and on foreach loops only, not on fields. The initializer expression is required.\n\t\t</p><p>\n\t\t\t<code>val</code> is actually a 'type' of sorts, and exists as a real class in the <code>lombok</code> package. You must import it for val to work (or use <code>lombok.val</code> as the type). The existence of this type on a local variable declaration triggers both the adding of the <code>final</code> keyword as well as copying the type of the initializing expression which overwrites the 'fake' <code>val</code> type.\n\t\t</p><p>\n\t\t\t<em>WARNING: This feature does not currently work in NetBeans.</em>\n\t\t</p>\n\t</@f.overview>\n\n\t<@f.snippets name=\"val\" />\n\n\t<@f.confKeys>\n\t\t<dt>\n\t\t\t<code>lombok.val.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>val</code> as a warning or error if configured.\n\t\t</dd>\n\t</@f.confKeys>\n\n\t<@f.smallPrint>\n\t\t<p>\n\t\t\tFor compound types, the most common superclass is inferred, not any shared interfaces. For example, <code>bool ? new HashSet() : new ArrayList()</code> is an expression with a compound type: The result is both <code>AbstractCollection</code> as well as <code>Serializable</code>. The type inferred will be <code>AbstractCollection</code>, as that is a class, whereas <code>Serializable</code> is an interface.\n\t\t</p><p>\n\t\t\tIn ambiguous cases, such as when the initializer expression is <code>null</code>, <code>java.lang.Object</code> is inferred.\n\t\t</p>\n\t</@f.smallPrint>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/features/var.html",
    "content": "<#import \"_features.html\" as f>\n\n<@f.scaffold title=\"var\" logline=\"Mutably! Hassle-free local variables.\">\n\t<@f.history>\n\t\t<p><ul>\n\t\t\t<li><code>var</code> was promoted to the main package in lombok 1.16.20; given that <a href=\"http://openjdk.java.net/jeps/286\">JEP 286</a> establishes expectations, and lombok's take on <code>var</code> follows these, we've decided to promote <code>var</code> eventhough the feature remains controversial.</li>\n\t\t\t<li><code>var</code> was introduced in lombok 1.16.12 as experimental feature.</li>\n\t\t</ul></p>\n\t</@f.history>\n\n\t<@f.overview>\n\t\t<p>\n\t\t\t<code>var</code> works exactly like <a href=\"/features/val\"><code>val</code></a>, except the local variable is <em>not</em> marked as <code>final</code>.\n\t\t</p><p>\n\t\t\tThe type is still entirely derived from the mandatory initializer expression, and any further assignments, while now legal (because the variable is no longer <code>final</code>), aren't looked at to determine the appropriate type.<br />\n\t\t\tFor example, <code>var x = \"Hello\"; x = Color.RED;</code> does <em>not</em> work; the type of x will be inferred to be <code>java.lang.String</code> and thus, the <code>x = Color.RED</code> assignment will fail. If the type of <code>x</code> was inferred to be <code>java.lang.Object</code> this code would have compiled, but that's not how<code>var</code> works.\n\t\t</p>\n\t</@f.overview>\n\n\t<@f.confKeys>\n\t\t<dt>\n\t\t\t<code>lombok.var.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set)\n\t\t</dt><dd>\n\t\t\tLombok will flag any usage of <code>var</code> as a warning or error if configured.\n\t\t</dd>\n\t</@f.confKeys>\n</@f.scaffold>\n"
  },
  {
    "path": "website/templates/index.html",
    "content": "<#import \"/_scaffold.html\" as main>\n<@main.scaffold load=[\"/js/supporters.js\"]>\n\t<a class=\"tidelift-link\" href=\"/tidelift\">Get Lombok for Enterprise</a>\n\t<div class=\"page-header top5\">\n\t\t<div class=\"row text-center\">\n\t\t\t<@main.h1 title=\"Project Lombok\" />\n\t\t\t<p>\n\t\t\t\tProject Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.<br />\n\t\t\t\tNever write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.\n\t\t\t</p>\n\t\t</div>\n\t\t<div class=\"video text-center\">\n\t\t\t<a id=\"clickForVideo\" href=\"#\" role=\"button\" aria-label=\"Watch Video\"><img width=\"800\" height=\"200\" src=\"/img/video.png\" alt=\"Watch video\"></a>\n\t\t\t<video id=\"demoVideo\" hidden=\"hidden\" width=\"800\" height=\"480\" poster=\"/img/poster.png\" controls=\"controls\" preload=\"none\">\n\t\t\t\t<source src=\"https://projectlombok.org/videos/lombok.mp4\" type=\"video/mp4\" />\n\t\t\t\t<@main.h1 title=\"Can't watch the video?\" />\n\t\t\t\t<p>\n\t\t\t\t\t<a href=\"https://www.youtube.com/watch?v=VT3snjTeqhs\">See it on Youtube instead</a>.\n\t\t\t\t</p><p>\n\t\t\t\t\tOr, download the video:<br/>\n\t\t\t\t\t<a href=\"/videos/lombok.mp4\">MPEG4 / H.264 (Windows / Mac)</a> |\n\t\t\t\t</p>\n\t\t\t</video>\n\t\t\t<div class=\"row\">\n\t\t\t\t<div class=\"text-center\">\n\t\t\t\t\t<a href=\"https://objectcomputing.com/resources/publications/sett/january-2010-reducing-boilerplate-code-with-project-lombok\">Show me a text and images based explanation and tutorial instead!</a>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"row text-center supporterBar\">\n\t\t\t<h2 class=\"introText\" hidden=\"hidden\">Project Lombok is <a href=\"/supporters\">powered by</a>:</h2>\n\t\t\t<div class=\"supporterFooter\" hidden=\"hidden\"><a class=\"buttonLike\" href=\"/order-license-info\">I want to support Project Lombok too!</a></div>\n\t\t</div>\n\t</div>\n</@main.scaffold>\n"
  },
  {
    "path": "website/templates/order-license-info.html",
    "content": "<#import \"/_scaffold.html\" as main>\n\n<@main.scaffold title=\"Order / Donate\">\n\t<div class=\"page-header top5\">\n\t\t<div class=\"row text-center\">\n\t\t\t<h2>Professional support via Tidelift</h2>\n\t\t</div>\n\t\t<div class=\"row\">\n\t\t\t<p>\n\t\t\t\tTidelift offers professional support of open source tools. When you have a Tidelift subscription, they will help you inventory all the various open source tools and libraries you use, give one central location to check compliance, and a single channel for release notes and security advisories. The bulk of the tidelift subscription fee is redistributed to major open source projects, and Project Lombok is one of those 'lifted' projects. Therefore, your Tidelift subscription helps maintain Project Lombok!\n\t\t\t</p><p>\n\t\t\t\tWe recommend a <a class=\"tidelift-link-inline\" href=\"https://tidelift.com/subscription/pkg/maven-org-projectlombok-lombok?utm_source=maven-org-projectlombok-lombok&utm_medium=referral&utm_campaign=orderdonate\">Tidelift subscription</a> to any corporation that uses Project Lombok.\n\t\t</div>\n\t\t<div class=\"row text-center\">\n\t\t\t<h2>Order a professional or enterprise license</h2>\n\t\t</div>\n\t\t<div class=\"row\">\n\t\t\t<p>\n\t\t\t\tLombok is open source. We offer three licenses for using lombok. The standard license is free. Here you can order a professional or enterprise license.\n\t\t\t</p><p>\n\t\t\t\t<a class=\"buttonLike orderButton\" href=\"/order-license\">Order a professional or enterprise license</a><br />\n\t\t\t\t<a class=\"buttonLike orderButton\" href=\"https://www.patreon.com/lombok\">For individuals: Become a patreon</a>\n\t\t\t</p>\n\t\t\t<div class=\"row text-center\">\n\t\t\t\t<h2>Benefits of becoming a licensee</h2>\n\t\t\t</div>\n\t\t\t<p>\n\t\t\t\tLombok is and will remain a free, open source product. However, we ask you to consider becoming a licensee. Licensees will be <a href=\"/supporters\">listed</a> on the <code>projectlombok.org</code> website, we'll send you some stickers, and an official license. You'll be supporting the development of Project Lombok.\n\t\t\t</p>\n\t\t\t<div class=\"row text-center\">\n\t\t\t\t<h2>Small print</h2>\n\t\t\t</div>\n\t\t\t<p class=\"deemphasize\">\n\t\t\t\tAs part of being a professional or enterprise licensee, we will put your name, a logo, and possibly a link on our ‘supporters and licensees’ page. We'll also put (at random) some supporters and licensees on our front page. You may of course opt out of this offer. We may, at our discretion, opt not to list you. If we elect not to do so, you will be notified at the email address you fill in on our form, and you are as always free to cancel your license at any time.\n\t\t\t</p><p class=\"deemphasize\">\n\t\t\t\tProject Lombok is provided by the copyright holders and contributors &ldquo;as&nbsp;is&rdquo; and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed, even for professional and enterprise license holders. In no event shall the copyright holder or contributors be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including, but not limited to, procurement of substitute goods or services; loss of use, data, or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this software, even if advised of the possibility of such damage.\n\t\t\t</p>\n\t\t</div>\n\t</div>\n</@main.scaffold>\n"
  },
  {
    "path": "website/templates/order-license.html",
    "content": "<#import \"/_scaffold.html\" as main>\n\n<@main.scaffold load=[\"/js/order-license.js\"] title=\"Order a license\">\n\t<div class=\"page-header top5 order-license\">\n\t\t<div class=\"row text-center\">\n\t\t\t<h2>Order a professional or enterprise license</h2>\n\t\t</div>\n\t\t<div class=\"row\">\n\t\t\t<form>\n\t\t\t\t<fieldset class=\"form-group\">\n\t\t\t\t\t<legend>Basic information</legend>\n\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t<label for=\"companyName\">Company name</label>\n\t\t\t\t\t\t<input type=\"text\" class=\"form-control\" aria-describedby=\"companyNameHelp\" id=\"companyName\" placeholder=\"license holder name\" />\n\t\t\t\t\t\t<div id=\"companyNameErr\" class=\"formErr\" hidden=\"hidden\">Company name is a required field.</div>\n\t\t\t\t\t\t<small id=\"companyNameHelp\" class=\"form-text text-muted\">If applying for an individual license, fill in your own name.</small>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t<label for=\"email\">Email</label>\n\t\t\t\t\t\t<input type=\"email\" class=\"form-control\" aria-describedby=\"emailHelp\" id=\"email\" placeholder=\"email of contact / holder\" />\n\t\t\t\t\t\t<div id=\"emailErr\" class=\"formErr\" hidden=\"hidden\">Your email address is required; we will send the bill to this email address.</div>\n\t\t\t\t\t\t<small id=\"emailHelp\" class=\"form-text text-muted\">We will never share this email with any third parties; we'll email you the invoice at this email address.</small>\n\t\t\t\t\t</div>\n\t\t\t\t</fieldset>\n\t\t\t\t<fieldset class=\"form-group\">\n\t\t\t\t\t<legend>Type of license</legend>\n\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t<div class=\"form-check\">\n\t\t\t\t\t\t\t<label class=\"form-check-label\">\n\t\t\t\t\t\t\t\t<input type=\"radio\" class=\"form-check-input licenseType\" name=\"licenseType\" value=\"professional\" checked=\"checked\" />\n\t\t\t\t\t\t\t\tProfessional (€2,- per developer per month; ~ $2.40).\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"form-check\">\n\t\t\t\t\t\t\t<label class=\"form-check-label\">\n\t\t\t\t\t\t\t\t<input type=\"radio\" class=\"form-check-input licenseType\" name=\"licenseType\" value=\"enterprise\" />\n\t\t\t\t\t\t\t\tEnterprise (€5,- per developer per month; ~ $6.00).\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div id=\"licenseTypeErr\" class=\"formErr\" hidden=\"hidden\">License type is a required field.</div>\n\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t<label for=\"seats\"># of developers using lombok (minimum: 10)</label>\n\t\t\t\t\t\t<input type=\"number\" placeholder=\"# of developers\" class=\"form-control\" id=\"seats\" />\n\t\t\t\t\t\t<div id=\"seatsErr\" class=\"formErr\" hidden=\"hidden\">We need to know the # of developers to determine the license price, and that # needs to be at least 10.</div>\n\t\t\t\t\t</div>\n\t\t\t\t</fieldset>\n\t\t\t\t<fieldset class=\"form-group\">\n\t\t\t\t\t<legend>Payment</legend>\n\t\t\t\t\t<div class=\"form-check\">\n\t\t\t\t\t\t<label class=\"form-check-label\">\n\t\t\t\t\t\t\t<input type=\"radio\" class=\"form-check-input paymentType\" name=\"paymentType\" value=\"yearly\" checked=\"checked\" />\n\t\t\t\t\t\t\tYearly\n\t\t\t\t\t\t</label>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"form-check\">\n\t\t\t\t\t\t<label class=\"form-check-label\">\n\t\t\t\t\t\t\t<input type=\"radio\" class=\"form-check-input paymentType\" name=\"paymentType\" value=\"monthly\" />\n\t\t\t\t\t\t\tMonthly<span id=\"onlyYearlyWarning\" hidden=\"hidden\" class=\"warning\">The total license cost is sufficiently low that we'll bill you yearly.</span>\n\t\t\t\t\t\t</label>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div id=\"paymentTypeErr\" class=\"formErr\" hidden=\"hidden\">Payment type is a required field.</div>\n\t\t\t\t\t<div class=\"form-group\" hidden=\"hidden\" id=\"costIndicator\">\n\t\t\t\t\t</div>\n\t\t\t\t</fieldset>\n\t\t\t\t<fieldset class=\"form-group\">\n\t\t\t\t\t<legend>Mention</legend>\n\t\t\t\t\t<div class=\"form-check\">\n\t\t\t\t\t\t<label class=\"form-check-label\">\n\t\t\t\t\t\t\t<input type=\"checkbox\" class=\"form-check-input\" id=\"mentionMe\" name=\"mentionMe\" checked=\"checked\" />\n\t\t\t\t\t\t\tMention me on the <em>supporters / licensees</em> page.\n\t\t\t\t\t\t</label>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t<label for=\"companyUrl\">Company URL (optional)</label>\n\t\t\t\t\t\t<input type=\"url\" class=\"form-control\" id=\"companyUrl\" placeholder=\"URL of your company website\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t<label for=\"logo\">Company Logo (optional)</label>\n\t\t\t\t\t\t<input type=\"file\" style=\"display: none;\" id=\"logo\" name=\"logo\" />\n\t\t\t\t\t\t<button class=\"form-control\" id=\"companyLogo\">Upload a logo</button>\n\t\t\t\t\t\t<div id=\"logoCnt\" style=\"display: none;\"></div>\n\t\t\t\t\t\t<button class=\"form-control\" id=\"deleteCompanyLogo\" style=\"display: none;\">Remove logo</button>\n\t\t\t\t\t</div>\n\t\t\t\t</fieldset>\n\t\t\t\t<fieldset class=\"form-group\">\n\t\t\t\t\t<legend>Location and VAT</legend>\n\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t<div class=\"form-check\">\n\t\t\t\t\t\t\t<label class=\"form-check-label\">\n\t\t\t\t\t\t\t\t<input type=\"radio\" class=\"form-check-input locationType\" name=\"locationType\" value=\"eu\" checked=\"checked\" />\n\t\t\t\t\t\t\t\tWe are based in Europe\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"form-check\">\n\t\t\t\t\t\t\t<label class=\"form-check-label\">\n\t\t\t\t\t\t\t\t<input type=\"radio\" class=\"form-check-input locationType\" name=\"locationType\" value=\"usa\" />\n\t\t\t\t\t\t\t\tWe are based in the USA\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"form-check\">\n\t\t\t\t\t\t\t<label class=\"form-check-label\">\n\t\t\t\t\t\t\t\t<input type=\"radio\" class=\"form-check-input locationType\" name=\"locationType\" value=\"other\" />\n\t\t\t\t\t\t\t\tWe are based elsewhere\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div id=\"locationTypeErr\" class=\"formErr\" hidden=\"hidden\">Location (continent) is a required field.</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"form-group\" id=\"locationType_eu\">\n\t\t\t\t\t\t<label for=\"euVat\">EU VAT number</label>\n\t\t\t\t\t\t<input type=\"text\" class=\"form-control\" id=\"euVat\" placeholder=\"EU VAT number\" />\n\t\t\t\t\t\t<div id=\"euVatErr\" class=\"formErr\" hidden=\"hidden\">EU VAT is a required field. If you are an individual and you have no EU VAT number, consider giving us a <a href=\"https://www.patreon.com/lombok\">patreon</a> donation.</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"form-group\" hidden=\"hidden\" id=\"locationType_usa\">\n\t\t\t\t\t\tPlease <a href=\"/W8BEN_lombok.pdf\">download our W-8BEN form</a> for your tax records.\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"form-group\" hidden=\"hidden\" id=\"locationType_other\">\n\t\t\t\t\t\tPlease make sure you fulfill any local tax obligations for buying software from other countries.\n\t\t\t\t\t</div>\n\t\t\t\t</fieldset>\n\t\t\t\t<fieldset class=\"form-group\">\n\t\t\t\t\t<legend>Payment method</legend>\n\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t<div class=\"form-check\" id=\"paymentMethod_iban\">\n\t\t\t\t\t\t\t<label class=\"form-check-label\">\n\t\t\t\t\t\t\t\t<input type=\"radio\" class=\"form-check-input\" name=\"paymentMethod\" value=\"iban\" checked=\"checked\" />\n\t\t\t\t\t\t\t\tPay via IBAN (european bank transfer)\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"form-check\" hidden=\"hidden\" id=\"paymentMethod_intl\">\n\t\t\t\t\t\t\t<label class=\"form-check-label\">\n\t\t\t\t\t\t\t\t<input type=\"radio\" class=\"form-check-input\" name=\"paymentMethod\" value=\"intl\" />\n\t\t\t\t\t\t\t\tPay via international bank transfer (not suggested for bills less than €500,-)\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"form-check\">\n\t\t\t\t\t\t\t<label class=\"form-check-label\" id=\"paymentMethod_stripe\">\n\t\t\t\t\t\t\t\t<input type=\"radio\" class=\"form-check-input\" name=\"paymentMethod\" value=\"stripe\" />\n\t\t\t\t\t\t\t\tPay with Stripe (Credit Cards)\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div id=\"paymentMethodErr\" class=\"formErr\" hidden=\"hidden\">Payment method is a required field.</div>\n\t\t\t\t\t</div>\n\t\t\t\t</fieldset>\n\t\t\t\t<button type=\"submit\" id=\"submit\" class=\"btn btn-primary\">Submit order</button>\n\t\t\t\t<div id=\"orderHelp\">If you run into issues with the order form, or you have any other questions, please send us an email at <a href=\"mailto:orders@projectlombok.org\"><code>orders@projectlombok.org</code></a>. You can cancel your subscription at any time.</div>\n\t\t\t\t<div class=\"orderDetails\">Our EU VAT number: NL858105378B01</div>\n\t\t\t</p>\n\t\t</div>\n\t</div>\n</@main.scaffold>\n"
  },
  {
    "path": "website/templates/presentations/7lessons.html",
    "content": "<#import \"../_scaffold.html\" as main>\n<@main.scaffold>\n\t<div class=\"page-header top5\">\n\t\t<div class=\"row text-center\">\n\t\t\t<@main.h1 title=\"The 7 biggest mistakes we made in Project Lombok\" />\n\t\t\t<p>\n\t\t\t\tA presentation by Lombok's 2 core authors: Roel Spilker and Reinier Zwitserloot.<br />\n\t\t\t\tWe talk about the 7 biggest mistakes we made managing an open source project for the past 10 years.<br />\n\t\t\t\tFirst given at <a href=\"https://programm.javaland.eu/2019/#/scheduledEvent/579921\">Javaland (in Brühl, Germany) on March 19th, 2019</a>. Total length: 40 minutes.\n\t\t\t</p>\n\t\t</div>\n\t\t<div class=\"video text-center\">\n\t\t\t<video id=\"presentationVideo\" width=\"640\" height=\"360\" poster=\"/presentations/7lessons-poster.jpg\" controls=\"controls\" preload=\"none\">\n\t\t\t\t<source src=\"https://projectlombok.org/presentations/7lessons-vp9.webm\" type=\"video/webm\" />\n\t\t\t\t<source src=\"https://projectlombok.org/presentations/7lessons.webm\" type=\"video/webm\" />\n\t\t\t\t<source src=\"https://projectlombok.org/presentations/7lessons.mp4\" type=\"video/mp4\" />\n\t\t\t\t<@main.h1 title=\"Can't watch the video?\" />\n\t\t\t\t\t<p>\n\t\t\t\t\tYou can download it and watch it with, for example, <a href=\"https://www.videolan.org/vlc/index.html\">The open source VLC media player</a>:<br />\n\t\t\t\t\t<a href=\"/videos/7lessons.mp4\">Download: 7 biggest mistakes we made in Project Lombok</a>\n\t\t\t\t</p>\n\t\t\t</video>\n\t\t</div>\n\t</div>\n</@main.scaffold>\n"
  },
  {
    "path": "website/templates/security.html",
    "content": "<#import \"/_scaffold.html\" as main>\n<@main.scaffold title=\"Security Vulnerabilities\">\n\t<div class=\"page-header top5\">\n\t\t<div>\n\t\t\t<div class=\"row\">\n\t\t\t\t<p>\n\t\t\t\t\tLombok is a build-time only dependency; there is no need for <code>lombok.jar</code> to be available when your application is run, it just needs to be there when you compile your code.\n\t\t\t\t</p><p>\n\t\t\t\t\tTherefore, lombok is highly unlikely to be a source of security vulnerabilities.\n\t\t\t\t</p><p>\n\t\t\t\t\tNevertheless, if you have a concern or found a vulnerability, please disclose the vulnerability privately. We would like to coordinate with you so that we can release a fix for the vulnerability together with the disclosure of the vulnerability to the public. As an open source project we are not currently able to offer a monetary reward, but we will acknowledge your contribution (and we'll owe you a refreshing beverage of your choice, of course!), and work with you to set a reasonable timeline for a fix.\n\t\t\t\t</p><p>\n\t\t\t\t\tIf you want to report a vulnerability, please contact the <a href=\"https://tidelift.com/security\">tidelift security team</a>. Alternatively, you can contact us directly via <a href=\"mailto:security@projectlombok.org\">security@projectlombok.org</a>.\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</@main.scaffold>\n"
  },
  {
    "path": "website/templates/setup/_setup.html",
    "content": "<#import \"/_scaffold.html\" as main>\n\n<#macro introduction>\n\t<div class=\"row\">\n\t\t<#nested>\n\t</div>\n</#macro>\n\n<#macro section title>\n\t<div class=\"row\">\n\t\t<@main.h2 title=\"${title}\" />\n\n\t\t<#nested>\n\t</div>\n</#macro>\n\n<#macro scaffold title load=[]>\n\t<@main.scaffold load title>\n\t\t<div class=\"page-header top5\" id=\"featureContent\">\n\t\t\t<div class=\"row text-center\">\n\t\t\t\t<div class=\"header-group\">\n\t\t\t\t\t<@main.h1 title=\"${title}\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<#nested>\n\t\t</div>\n\t</@main.scaffold>\n</#macro>\n"
  },
  {
    "path": "website/templates/setup/android.html",
    "content": "<#import \"_setup.html\" as s>\n\n<@s.scaffold title=\"Android\">\n\t<@s.introduction>\n\t\t<p>\n\t\t\tAndroid development with lombok is easy and won't make your android application any 'heavier' because lombok is a compile-time only library. It is important to configure your android project properly to make sure lombok doesn't end up in your application and waste precious space on android devices.\n\t\t</p><p>\n\t\t\tThe instructions listed below are excerpts from <a href=\"https://github.com/excilys/androidannotations/wiki/Cookbook\">The\n\t\t\tAndroidAnnotations project cookbook</a>. You may wish to refer to that documentation for complete instructions; lombok is just\n\t\t\tthe equivalent to <code>androidannotations-VERSION.jar</code>; there is no <code>-api</code> aspect.\n\t\t</p>\n\t</@s.introduction>\n\n\t<@s.section title=\"Gradle\">\n\t\t<p>\n\t\t\t<ul><li>\n\t\t\t\tMake sure that the version of your android plugin is <code>&gt;= 0.4.3</code>\n\t\t\t</li><li>\n\t\t\t\tUse the <a href=\"https://github.com/franzbecker/gradle-lombok\">gradle-lombok</a> plugin.\n\t\t\t</li><li>\n\t\t\t\tIf you don't want to use the plugin, add Lombok to your application's <code>dependencies</code> block (requires Gradle v2.12 or newer):<br /><br />\n<pre>\ndependencies {\n\tcompileOnly \"org.projectlombok:lombok:${version}\"\n}</pre>\n\t\t\t</li></ul>\n\t\t</p>\n\t</@s.section>\n\n\t<@s.section title=\"Android Studio\">\n\t\t<p>\n\t\t\tFollow the previous instructions (<em>Gradle</em>). In addition to setting up your gradle project correctly, you need to add the <a href=\"https://plugins.jetbrains.com/plugin/6317\">Lombok IntelliJ plugin</a> to add lombok support to Android Studio:\n\t\t\t<ul><li>\n\t\t\t\tGo to <code>File &gt; Settings &gt; Plugins</code>\n\t\t\t</li><li>\n\t\t\t\tClick on <code>Browse repositories...</code>\n\t\t\t</li><li>\n\t\t\t\tSearch for <code>Lombok Plugin</code>\n\t\t\t</li><li>\n\t\t\t\tClick on <code>Install plugin</code>\n\t\t\t</li><li>\n\t\t\t\tRestart Android Studio\n\t\t\t</li></ul>\n\t\t</p>\n\t\t<p>\n\t\t\tModify your application's <code>dependencies</code> block:\n<pre>\ndependencies {\n\tcompileOnly 'org.projectlombok:lombok:${version}'\n\tannotationProcessor 'org.projectlombok:lombok:${version}'\n}</pre>\n\t</@s.section>\n\n\t<@s.section title=\"Eclipse\">\n\t\t<p>\n\t\t\tIn eclipse, create a 'lightweight' lombok jar that contains only the annotations by running:<br /><br />\n\t\t\t<pre>\njava -jar lombok.jar publicApi</pre>\n\t\t\tThen, add the <code>lombok-api.jar</code> file created by running this command to your android project instead of the complete <code>lombok.jar</code>, and, as usual, install lombok into eclipse by double-clicking <code>lombok.jar</code>.\n\t\t</p>\n\t</@s.section>\n\n\t<@s.section title=\"Maven\">\n\t\t<p>\n\t\t\tYou should be able to just follow the normal <a href=\"maven\">integrate lombok with maven instructions</a>.<br />\n\t\t\tNote that if you use android, eclipse, and maven together you may have to replace <code>lombok.jar</code> in your eclipse android project's build path (which you can modify in that project's properties page) with <code>lombok-api.jar</code>, as produced in the procedure explained for <em>Eclipse</em>, above.\n\t\t</p>\n\t</@s.section>\n\n\t<@s.section title=\"Ant\">\n\t\t<p>\n\t\t\t<ul><li>\n\t\t\t\tFind <code>build.xml</code> in <code>${r\"${ANDROID_SDK_ROOT}\"}/tools/ant/build.xml</code> and copy the <code>-compile</code> target into the paste buffer.\n\t\t\t</li><li>\n\t\t\t\tCopy this to the <code>build.xml</code> of your own project, right before the <code>&lt;import file=\"${r\"${sdk.dir}\"}/tools/ant/build.xml\"&gt;</code> line.\n\t\t\t</li><li>\n\t\t\t\tCreate a <code>compile-libs</code> directory in your own project and copy the complete <code>lombok.jar</code> to it.\n\t\t\t</li><li>\n\t\t\t\tNow modify the <code>&lt;classpath&gt;</code> entry inside the <code>&lt;javac&gt;</code> task in the <code>-compile</code> target you just copied:<br />\n\t\t\t\tadd <code>&lt;fileset dir=\"compile-libs\" includes=\"*.jar\" /&gt;</code> to it.\n\t\t\t</li></ul>\n\t\t</p>\n\t</@s.section>\n</@s.scaffold>\n"
  },
  {
    "path": "website/templates/setup/ant.html",
    "content": "<#import \"_setup.html\" as s>\n\n<@s.scaffold title=\"Ant+ivy\">\n\t<@s.introduction>\n\t\t<p>\n\t\t\tThis page explains how to compile your code when you use the <a href=\"https://ant.apache.org/\">Apache Ant</a> build tool. We suggest you use <a href=\"http://ant.apache.org/ivy/\">ivy</a>, the ant add-on that lets you fetch dependencies from the internet automatically.\n\t\t</p><p>\n\t\t\tLombok just needs to be on the classpath when you compile your code to do its work, so all you have to ensure, is that lombok is on the classpath in your <code>&lt;javac&gt;</code> task.\n\t\t</p>\n\t</@s.introduction>\n\n\t<@s.section title=\"Just ant\">\n\t\t<p>\n\t\t\tAssuming that you've put <code>lombok.jar</code> in a <code>lib</code> dir, your javac task would have to look like:<pre>\n&lt;javac srcdir=\"src\" destdir=\"build\" source=\"1.8\"&gt;\n\t&lt;classpath location=\"lib/lombok.jar\" /&gt;\n&lt;/javac&gt;</pre>\n\t\t</p>\n\t</@s.section>\n\t\n\t<@s.section title=\"Ant with Ivy\">\n\t\t<p>\n\t\t\tLombok is available in Maven Central, so you can tell ivy to fetch lombok like so (assuming you have a configuration named <code>build</code>:<pre>\n&lt;dependencies&gt;\n\t&lt;dependency org=\"org.projectlombok\" name=\"lombok\" rev=\"${version}\" conf=\"build->master\" /&gt;\n&lt;/dependencies&gt;</pre>\n\t\t</p>\n\t</@s.section>\n</@s.scaffold>\n"
  },
  {
    "path": "website/templates/setup/ecj.html",
    "content": "<#import \"_setup.html\" as s>\n\n<@s.scaffold title=\"ECJ\">\n\t<@s.introduction>\n\t\t<p>\n\t\t\tECJ (the Eclipse standalone compiler) is compatible with Lombok. Use the following command line to enable Lombok with ECJ:\n\t\t\t<pre>java <strong>-javaagent:lombok.jar=ECJ</strong> -jar ecj.jar -cp lombok.jar -source 1.8 <em class=\"note\">(rest of arguments)</em></pre>\n\t\t</p><p>\n\t\t\tYou may have to add the following VM argument, if you're using an older version of Lombok or Java:\n\t\t\t<pre><strong>-Xbootclasspath/p:lombok.jar</strong></pre>\n\t\t</p><p>\n\t\t\tIf you're using a tool based on ECJ, adding these VM arguments and adding <code>lombok.jar</code> to the classpath should work.\n\t\t</p>\n\t</@s.introduction>\n\t\n\t<@s.section title=\"Maven\">\n\t\t<p>\n\t\t\tLombok comes with a tiny bootstrap agent that can be included in your project to allow ECJ to easily work with Maven.\n\t\t\tTo create this agent, run:\n\t\t\t<pre>java -jar lombok.jar createMavenECJBootstrap -o <em class=\"note\">/path/to/project/root</em></pre>\n\t\t</p><p>\n\t\t\tThe -o path should contain your <code>pom.xml</code>.\n\t\t</p><p>\n\t\t\tThis will create two files, <code>.mvn/jvm.config</code> and <code>.mvn/lombok-bootstrap.jar</code>. Maven will use these files\n\t\t\tto activate the standard Lombok Java agent at the right time. These can be committed in source control for a portable build.\n\t\t</p><p>\n\t\t\tYou must also update your <code>pom.xml</code> to add Lombok as a dependency to the <code>maven-compiler-plugin</code>. A minimal example follows:<pre>\n&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n     xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n     xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\"&gt;\n  &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;\n\n  &lt;groupId&gt;org.projectlombok&lt;/groupId&gt;\n  &lt;artifactId&gt;eclipse-compiler-test&lt;/artifactId&gt;\n  &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;\n\n  &lt;properties&gt;\n    &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;\n    &lt;lombok.version&gt;${version}&lt;/lombok.version&gt;\n  &lt;/properties&gt;\n\n  &lt;dependencies&gt;\n    &lt;dependency&gt;\n      &lt;groupId&gt;org.projectlombok&lt;/groupId&gt;\n      &lt;artifactId&gt;lombok&lt;/artifactId&gt;\n      &lt;version&gt;&#36;{lombok.version}&lt;/version&gt;\n      &lt;scope&gt;provided&lt;/scope&gt;\n    &lt;/dependency&gt;\n  &lt;/dependencies&gt;\n\n  &lt;build&gt;\n    &lt;pluginManagement&gt;\n      &lt;plugins&gt;\n        &lt;plugin&gt;\n          &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;\n          &lt;version&gt;3.10.1&lt;/version&gt;\n          &lt;configuration&gt;\n            &lt;compilerId&gt;eclipse&lt;/compilerId&gt;\n          &lt;/configuration&gt;\n          &lt;dependencies&gt;\n            &lt;dependency&gt;\n              &lt;groupId&gt;org.codehaus.plexus&lt;/groupId&gt;\n              &lt;artifactId&gt;plexus-compiler-eclipse&lt;/artifactId&gt;\n              &lt;version&gt;2.11.1&lt;/version&gt;\n            &lt;/dependency&gt;\n            &lt;dependency&gt;\n              &lt;groupId&gt;org.projectlombok&lt;/groupId&gt;\n              &lt;artifactId&gt;lombok&lt;/artifactId&gt;\n              &lt;version&gt;&#36;{lombok.version}&lt;/version&gt;\n            &lt;/dependency&gt;\n          &lt;/dependencies&gt;\n        &lt;/plugin&gt;\n      &lt;/plugins&gt;\n    &lt;/pluginManagement&gt;\n  &lt;/build&gt;\n&lt;/project&gt;\n</pre>\n</p>\n\t</@s.section>\n</@s.scaffold>\n"
  },
  {
    "path": "website/templates/setup/eclipse.html",
    "content": "<#import \"_setup.html\" as s>\n\n<@s.scaffold title=\"Eclipse, Spring Tool Suite, (Red Hat) JBoss Developer Studio, MyEclipse\">\n\t<@s.introduction>\n\t\t<p>\n\t\t\tThe <a href=\"https://eclipse.org/\">Eclipse</a> editor is compatible with lombok. Eclipse offshoots are also compatible with lombok, specifically:\n\t\t\t<ul><li>\n\t\t\t\t<a href=\"https://www.genuitec.com/products/myeclipse/\">MyEclipse</a>\n\t\t\t</li><li>\n\t\t\t\t<a href=\"https://developers.redhat.com/products/devstudio/overview/\">Red Hat JBoss Developer Studio</a>\n\t\t\t</li><li>\n\t\t\t\t<a href=\"https://tools.jboss.org/downloads/devstudio/\">JBoss Developer Studio (JBDS)</a>\n\t\t\t</li><li>\n\t\t\t\t<a href=\"https://spring.io/tools\">Spring Tools Suite (STS)</a>\n\t\t\t</li></ul>\n\t\t</p><p>\n\t\t\tDouble-click lombok.jar (downloadable from this site, or from your maven repository; it's the same jar). This starts the eclipse installer which will find eclipse (and eclipse variants as listed above), and offers to install lombok into these eclipse installations. The same tool can also uninstall lombok: <br />\n\n\t\t\t<img src=\"/img/lombok-installer.png\" />\n\t\t</p><p>\n\t\t\tYou can check if your eclipse installation is lombok-enabled in eclipse's about dialog. The lombok version will be listed at the end of the copyright text:<br /><br />\n\n\t\t\t<img src=\"/img/eclipse-about.png\" />\n\t\t</p>\n\t</@s.introduction>\n\t<@s.section title=\"Via eclipse plugin installer\">\n\t\t<em>WARNING: This plugin installer is currently unsigned, and we have given up on figuring out how to fix that; if team eclipse or somebody else can help us out, we're all ears!</em>\n\t\t<p>\n\t\t\tYou can install lombok directly from within eclipse, and in that way, you can also include lombok as part of your team eclipse deployment configuration. To do this, use\n\t\t\tupdate site <code>https://projectlombok.org/p2</code>:<br />\n\t\t\t<br />\n\t\t\t<img width=\"448\" height=\"431\" src=\"/img/eclipse-p2-step1.png\" /><br />\n\t\t\t<br />\n\t\t\t<br />\n\t\t\t<img width=\"626\" height=\"216\" src=\"/img/eclipse-p2-step2.png\" />\n\t\t</p>\n\t\t<p><strong>NB: You need to actually quit Eclipse and start it again; the regular restart is not good enough.</strong>\n\t\t</p>\n\t</@s.section>\n</@s.scaffold>\n"
  },
  {
    "path": "website/templates/setup/gradle.html",
    "content": "<#import \"_setup.html\" as s>\n\n<@s.scaffold title=\"Gradle\">\n\t<@s.introduction>\n\t\t<p>\n\t\t\tTo set up lombok with any build tool, you have to specify that the lombok dependency is required to compile your source code, but does not need to be present when running/testing/jarring/otherwise deploying your code. Generally this is called a 'provided' dependency. This page explains how to integrate lombok with the <a href=\"https://gradle.org/\">Gradle build tool</a>.\n\t\t</p><p>\n\t\t\tLombok is available in maven central, so telling Gradle to download lombok is easy.\n\t\t</p>\n\t</@s.introduction>\n\n\t<@s.section title=\"The Lombok Gradle Plugin\">\n\t\t<p>\n\t\t\tThere is a plugin for gradle that we recommend you use; it makes deployment a breeze, and makes it easy to do additional tasks, such as delomboking. The plugin is open source. Read more <a href=\"https://plugins.gradle.org/plugin/io.freefair.lombok\">about the gradle-lombok plugin</a>.\n\t\t</p>\n\t</@s.section>\n\t\n\t<@s.section title=\"Gradle without a plugin\">\n\t\t<p>\n\t\t\tIf you don't want to use the plugin, gradle has the built-in <code>compileOnly</code> scope, which can be used to tell gradle to add lombok only during compilation. Your <code>build.gradle</code> or <code>build.gradle.kts</code> will look like:<pre>\nrepositories {\n\tmavenCentral()\n}\n\ndependencies {\n\tcompileOnly(\"org.projectlombok:lombok:${version}\")\n\tannotationProcessor(\"org.projectlombok:lombok:${version}\")\n\t\n\ttestCompileOnly(\"org.projectlombok:lombok:${version}\")\n\ttestAnnotationProcessor(\"org.projectlombok:lombok:${version}\")\n}</pre>\n\t\t</p><p>\n\t\t\tRemember that you still have to download <code>lombok.jar</code> (or find it in gradle's caches) and run it as a jarfile, if you wish to program in eclipse. The plugin makes that part easier.\n\t\t</p>\n\t</@s.section>\n\n\t<@s.section title=\"Android development\">\n\t\t<p>\n\t\t\tComplete instructions for integrating lombok with your android development is available on our <a href=\"android\">Using lombok for android development</a> page.\n\t\t</p>\n\t</@s.section>\n</@s.scaffold>\n"
  },
  {
    "path": "website/templates/setup/gwt.html",
    "content": "<#import \"_setup.html\" as s>\n\n<@s.scaffold title=\"GWT\">\n\t<@s.introduction>\n\t\t<p>\n\t\t\t<a href=\"http://www.gwtproject.org/\">GWT (Google Web Toolkit)</a> is compatible with lombok.\n\t\t</p><p>\n\t\t\tEdit your <code>proj-debug</code> and <code>proj-compile</code> batch scripts to add the following VM arguments:\n<pre>\njava <strong>-javaagent:lombok.jar=ECJ</strong> <em>(rest of arguments)</em>\n</pre>\n\t\t</p><p>\n\t\t\tThanks to Stephen Haberman for figuring this out.\n\t\t</p>\n\t</@s.introduction>\n\t\n\t<@s.section title=\"GWT plugin in Eclipse\">\n\t\t<p>\n\t\t\tTo use the GWT plugin in eclipse together with Lombok:<br />\n\t\t\tInstall lombok into eclipse as normal (start <code>lombok.jar</code> as an application).<br />\n\t\t\tDownload the JDT variant that GWT uses. For GWT v2.8.2 you'll need <a href=\"https://github.com/gwtproject/tools/raw/master/lib/eclipse/org.eclipse.jdt.core_3.11.2-CUSTOM-GWT-2.8-20160205.jar\">org.eclipse.jdt.core 3.11.2</a>; for the current GWT development snapshot, this is <a href=\"https://github.com/gwtproject/tools/raw/master/lib/eclipse/org.eclipse.jdt.core_3.13.50-CUSTOM-GWT-20171215.jar\">org.eclipse.jdt.core 3.13.50</a>. For more versions, search for jar files matching 'org.eclipse.jdt.core-{VERSION}-CUSTOM-GWT-{date}.jar in the <a href=\"https://github.com/gwtproject/tools/tree/master/lib/eclipse\">lib/eclipse section GWT's github page</a>.<br />\n\t\t\tConfigure the 'GWT/Compile' option in the eclipse GWT plugin; in the advanced section, add the following VM arguments:<br />\n<pre>-javaagent:/path/to/lombok.jar=ECJ\n-Xbootclasspath/p:/path/to/lombok.jar:/path/to/org.eclipse.jdt.core_fromPreviousStep.jar</pre>\nWhere the colon should be replaced with a semicolon on windows.<br />\n\t\t\tGWT Dev Mode needs a similar configuration: In the VM arguments section ('Arguments' tab), add:\n<pre>-javaagent:/path/to/lombok.jar=ECJ</pre>\n\t\t\tand in the 'Classpath' tab, add both lombok.jar and the org.eclipse.jdt.core file you downloaded.\n\t\t</p>\n\t\t<p>\n\t\t\tThe above instructions are contributed by Stas via the forum. Let us know if they work, or if you run into issues. Thanks and have fun!\n\t\t</p>\n\t</@s.section>\n</@s.scaffold>\n"
  },
  {
    "path": "website/templates/setup/index.html",
    "content": "<#import \"_setup.html\" as s>\n\n<@s.scaffold title=\"Using lombok\">\n\t<@s.introduction>\n\t\t<#list s.main.setupTargets as cat, tgtList>\n\t\t\t<h3 class=\"listHeader\">${cat}</h3>\n\t\t\t<ul>\n\t\t\t\t<#list tgtList as name, url>\n\t\t\t\t\t<li class=\"target\"><a href=\"/setup/${url}\">${name}</a></li>\n\t\t\t\t</#list>\n\t\t\t</ul>\n\t\t</#list>\n\t</@s.introduction>\n</@s.scaffold>\n"
  },
  {
    "path": "website/templates/setup/intellij.html",
    "content": "<#import \"_setup.html\" as s>\n\n<@s.scaffold title=\"IntelliJ IDEA\">\n\t<@s.introduction>\n\t\t<p>\n\t\t\tThe <a href=\"https://www.jetbrains.com/idea/\">Jetbrains IntelliJ IDEA</a> editor is compatible with lombok without a plugin as of version 2020.3 to version 2023.1.\n\t\t</p><p>\n\t\t\tFor versions prior to 2020.3 or later than 2023.1, you can add the <a href=\"https://plugins.jetbrains.com/plugin/6317\">Lombok IntelliJ plugin</a> to add lombok support for IntelliJ:\n\t\t\t<ul><li>\n\t\t\t\tGo to <code>File &gt; Settings &gt; Plugins</code>\n\t\t\t</li><li>\n\t\t\t\tClick on <code>Browse repositories...</code>\n\t\t\t</li><li>\n\t\t\t\tSearch for <code>Lombok Plugin</code>\n\t\t\t</li><li>\n\t\t\t\tClick on <code>Install plugin</code>\n\t\t\t</li><li>\n\t\t\t\tRestart IntelliJ IDEA\n\t\t\t</li></ul>\n\t\t</p>\n\t\t<p>\n\t\t\tYou can also check out <a href=\"https://www.baeldung.com/lombok-ide\">Setting up Lombok with Eclipse and IntelliJ</a>, a blog article on baeldung.\n\t\t</p>\n\t</@s.introduction>\n</@s.scaffold>\n"
  },
  {
    "path": "website/templates/setup/javac.html",
    "content": "<#import \"_setup.html\" as s>\n\n<@s.scaffold title=\"JavaC\">\n\t<@s.section title=\"JDK9+ with module-info.java\">\n\t\t<p>\n\t\t\tSupport for JDK9+ if you did modularize your own projects (you've written a <code>module-info.java</code> file):<br /><code>javac -cp lombok.jar -p lombok.jar ...</code><br />\n\t\t\tNote that you will have to add lombok to your <code>module-info.java</code> file:<pre>\nmodule <em>myapp</em> {\n\trequires static lombok;\n}</pre>\n\t\t</p><p>\n\t\t\tThe 'static' part ensures that you won't need lombok to be present at runtime.\n\t\t</p>\n\t</@s.section>\n\t\n\t<@s.section title=\"JDK 1.6 - 1.8 or no modules in later versions\">\n\t\t<p>\n\t\t\tJust put lombok on the classpath when compiling with any javac (version 1.6 - 1.8): <code>javac -cp lombok.jar ....</code>\n\t\t</p>\n\t\t<p>\n\t\t\tSupport for JDK9, if you haven't modularized your own projects yet (no <code>module-info.java</code> yet), is included in lombok starting with version 1.16.20. Just use lombok as normal: <code> javac -cp lombok.jar ...</code>\n\t\t</p><p>\n\t\t\tSupport for JDK9 if you did modularize your own projects (you've written a <code>module-info.java</code> file):<br /><code>javac -cp lombok.jar -p lombok.jar ...</code><br />\n\t\t\tNote that you will have to add lombok to your <code>module-info.java</code> file:<pre>\nmodule <em>myapp</em> {\n\trequires static lombok;\n}</pre>\n\t\t</p><p>\n\t\t\tThe 'static' part ensures that you won't need lombok to be present at runtime.\n\t\t</p>\n\t</@s.section>\n\t\n</@s.scaffold>\n"
  },
  {
    "path": "website/templates/setup/kobalt.html",
    "content": "<#import \"_setup.html\" as s>\n\n<@s.scaffold title=\"Kobalt\">\n\t<@s.introduction>\n\t\t<p>\n\t\t\tTo set up lombok with any build tool, you have to specify that the lombok dependency is required to compile your source code, but does not need to be present when running/testing/jarring/otherwise deploying your code. Generally this is called a 'provided' dependency. This page explains how to integrate lombok with the <a href=\"http://beust.com/kobalt/home/index.html\">Kobalt</a> build tool.\n\t\t</p><p>\n\t\t\tLombok is available in maven central, so telling Kobalt to download lombok is easy.\n\t\t</p>\n\t</@s.introduction>\n\n\t<@s.section title=\"Configuring Kobalt\">\n\t\t<p>\n\t\t\tTo add lombok as a 'provided' dependency to your project, write your <code>Built.kt</code> like so:<pre>\ndependencies {\n\tprovided(\"org.projectlombok:lombok:${version}\")\n}</pre>\n\t\t</p>\n\t</@s.section>\n</@s.scaffold>\n"
  },
  {
    "path": "website/templates/setup/maven.html",
    "content": "<#import \"_setup.html\" as s>\n\n<@s.scaffold title=\"Maven\">\n\t<@s.introduction>\n\t\t<p>\n\t\t\tTo set up lombok with any build tool, you have to specify that the lombok dependency is required to compile your source code, but does not need to be present when running/testing/jarring/otherwise deploying your code. Generally this is called a 'provided' dependency. This page explains how to integrate lombok with the <a href=\"https://maven.apache.org/\">Apache Maven</a> build tool.\n\t\t</p><p>\n\t\t\tLombok is available in maven central, so telling Maven to download lombok is easy.\n\t\t</p>\n\t</@s.introduction>\n\n\t<@s.section title=\"Adding lombok to your pom file\">\n\t\t<p>\n\t\t\tTo include lombok as a 'provided' dependency, add it to your <code>&lt;dependencies&gt;</code> block like so:\n\t\t</p>\n<pre>\n&lt;dependencies&gt;\n\t&lt;dependency&gt;\n\t\t&lt;groupId&gt;org.projectlombok&lt;/groupId&gt;\n\t\t&lt;artifactId&gt;lombok&lt;/artifactId&gt;\n\t\t&lt;version&gt;${version}&lt;/version&gt;\n\t\t&lt;scope&gt;provided&lt;/scope&gt;\n\t&lt;/dependency&gt;\n&lt;/dependencies&gt;\n</pre>\n\t\t<p>\n\t\t\tYou also need to add lombok as an annotation processor. This is mandatory starting with JDK23, or JDK9+ if compiling as modules (you have <code>module-info.java</code> files in your build):\n\t\t</p>\n<pre>\n&lt;build&gt;\n\t&lt;plugins&gt;\n\t\t&lt;plugin&gt;\n\t\t\t&lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;\n\t\t\t&lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;\n\t\t\t&lt;configuration&gt;\n\t\t\t\t&lt;annotationProcessorPaths&gt;\n\t\t\t\t\t&lt;path&gt;\n\t\t\t\t\t\t&lt;groupId&gt;org.projectlombok&lt;/groupId&gt;\n\t\t\t\t\t\t&lt;artifactId&gt;lombok&lt;/artifactId&gt;\n\t\t\t\t\t\t&lt;version&gt;${version}&lt;/version&gt;\n\t\t\t\t\t&lt;/path&gt;\n\t\t\t\t&lt;/annotationProcessorPaths&gt;\n\t\t\t&lt;/configuration&gt;\n\t\t&lt;/plugin&gt;\n\t&lt;/plugins&gt;\n&lt;/build&gt;\n</pre>\n\t</@s.section>\n\t\n\t<@s.section title=\"Eclipse Compiler (ECJ/JDT)\">\n\t\t<p>\n\t\t\tCheck out the instructions on <a href=\"/setup/ecj\">the ECJ page</a>.\n\t\t</p>\n\t</@s.section>\n\n\t<@s.section title=\"Delomboking: The Lombok Maven Plugin\">\n\t\t<p>\n\t\t\tThere is a plugin for Maven that we recommend you use if you want to delombok via maven. Useful if you want to run source analysis tools on your source <em>after</em> lombok has been applied, or if you want to generate javadoc. The plugin is open source. Read more <a href=\"http://awhitford.github.io/lombok.maven/lombok-maven-plugin/\">about the lombok maven plugin</a>.\n\t\t</p>\n\t</@s.section>\n</@s.scaffold>\n"
  },
  {
    "path": "website/templates/setup/netbeans.html",
    "content": "<#import \"_setup.html\" as s>\n\n<@s.scaffold title=\"Netbeans\">\n\t<@s.introduction>\n\t\t<p>\n\t\t\tThe <a href=\"https://netbeans.org/\">Netbeans</a> editor is compatible with lombok.\n\t\t\t<ol><li>\n\t\t\t\tAdd <code>lombok.jar</code> to the project libraries.\n\t\t\t</li><li>\n\t\t\t\tIn the project properties, in the section <code>Build &ndash; Compiling</code>, check the <code>&#39;Enable Annotation Processing in Editor&#39;</code> checkbox.\n\t\t\t</li></ol>\n\n\t\t\t<img src=\"/img/netbeans-enable-annotation-processing-in-editor.png\" />\n\t\t</p>\n\t</@s.introduction>\n</@s.scaffold>\n"
  },
  {
    "path": "website/templates/setup/vscode.html",
    "content": "<#import \"_setup.html\" as s>\n\n<@s.scaffold title=\"Microsoft Visual Studio Code\">\n\t<@s.introduction>\n\t\t<p>\n\t\t\tThe <a href=\"https://code.visualstudio.com/\">Microsoft Visual Studio Code</a> editor is compatible with lombok.\n\t\t</p><p>\n\t\t\tThe <a href=\"https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack\">Extension Pack for Java</a> provides built-in support for Lombok.\n\t\t\t<ul><li>\n\t\t\t\tpress <code>Ctrl + Shift + X</code> to open the extension manager.\n\t\t\t</li><li>\n\t\t\t\tType <code>java</code> to find the plugin, and click <code>install</code>.\n\t\t\t</li><li>\n\t\t\t\tReload VS Code when asked.\n\t\t\t</li></ul>\n\t\t</p>\n\t</@s.introduction>\n</@s.scaffold>\n"
  },
  {
    "path": "website/templates/supporters.html",
    "content": "<#import \"/_scaffold.html\" as main>\n\n<@main.scaffold load=[\"js/supporters.js\"] title=\"Supporters\">\n\t<div class=\"page-header top5\">\n\t\t<div class=\"row text-center\">\n\t\t\t<h1>Project Lombok supporters</h1>\n\t\t</div><div class=\"row supporters\">\n\t\t</div>\n\t</div>\n</@main.scaffold>\n"
  },
  {
    "path": "website/templates/tidelift.html",
    "content": "<#import \"/_scaffold.html\" as main>\n\n<@main.scaffold title=\"Project Lombok for Enterprise\">\n\t<div class=\"page-header top5 tidelift\">\n\t\t<div class=\"row text-center\">\n\t\t\t<h2>Available as part of the Tidelift Subscription</h2>\n\t\t</div>\n\t\t<div class=\"row\">\n\t\t\t<img src=\"/img/projectlombok-tidelift-mix.png\" width=\"200\" height=\"150\" class=\"pull-right\" alt=\"tidelift+lombok\" />\n\t\t\t<p>\n\t\t\t\tProject Lombok and the maintainers of thousands of other packages are working with Tidelift to deliver one enterprise subscription that covers all of the open source you use.\n\t\t\t</p><p>\n\t\t\t\tIf you want the flexibility of open source and the confidence of commercial-grade software, this is for you.\n\t\t\t</p>\n\t\t</div>\n\t\t<div class=\"row text-center\">\n\t\t\t<a class=\"tideliftb tideliftb1\" href=\"https://tidelift.com/subscription/pkg/maven-org-projectlombok-lombok?utm_source=maven-org-projectlombok-lombok&utm_medium=referral&utm_campaign=enterprise\">LEARN MORE</a> <a class=\"tideliftb tideliftb2\" href=\"https://tidelift.com/subscription/request-a-demo?utm_source=maven-org-projectlombok-lombok&utm_medium=referral&utm_campaign=enterprise\">REQUEST A DEMO</a>\n\t\t</div>\n\t\t<div class=\"row text-center\">\n\t\t\t<h2>The Tidelift Subscription manages your dependencies for you</h2>\n\t\t</div>\n\t\t<div class=\"row\">\n\t\t\t<p>\n\t\t\t\t<ul>\n\t\t\t\t\t<li>Get the tools you need to continuously catalog and understand the open source software that your application depends on.</li>\n\t\t\t\t\t<li>Your subscription helps pay the open source maintainers of the exact packages you use to ensure they meet the standards you require.</li>\n\t\t\t\t\t<li>Address issues proactively, with tools that scan for new security, licensing, and maintenance issues, and alert our participating open source maintainers so they can resolve them on your behalf.</li>\n\t\t\t\t\t<li>Measure and improve your open source dependencies' health—which improves your app’s health—and get a short list of high-impact steps your team can take to improve them even more.</li>\n\t\t\t\t\t<li>Get commercial assurances that don't come for free with open source packages, like intellectual property indemnification and support under a service level agreement. You expect these guarantees from proprietary software, and you can have them when using open source as well.</li>\n\t\t\t\t</ul>\n\t\t\t\tThe end result? All of the capabilities you expect from commercial-grade software, for the full breadth of open source you use. That means less time grappling with esoteric open source trivia, and more time building your own applications—and your business.\n\t\t</div>\n\t</div>\n</@main.scaffold>\n"
  },
  {
    "path": "website/usageExamples/BuilderExample_post.jpage",
    "content": "import java.util.Set;\n\npublic class BuilderExample {\n\tprivate long created;\n\tprivate String name;\n\tprivate int age;\n\tprivate Set<String> occupations;\n\t\n\tBuilderExample(String name, int age, Set<String> occupations) {\n\t\tthis.name = name;\n\t\tthis.age = age;\n\t\tthis.occupations = occupations;\n\t}\n\t\n\tprivate static long $default$created() {\n\t\treturn System.currentTimeMillis();\n\t}\n\t\n\tpublic static BuilderExampleBuilder builder() {\n\t\treturn new BuilderExampleBuilder();\n\t}\n\t\n\tpublic static class BuilderExampleBuilder {\n\t\tprivate long created;\n\t\tprivate boolean created$set;\n\t\tprivate String name;\n\t\tprivate int age;\n\t\tprivate java.util.ArrayList<String> occupations;\n\t\t\n\t\tBuilderExampleBuilder() {\n\t\t}\n\t\t\n\t\tpublic BuilderExampleBuilder created(long created) {\n\t\t\tthis.created = created;\n\t\t\tthis.created$set = true;\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\tpublic BuilderExampleBuilder name(String name) {\n\t\t\tthis.name = name;\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\tpublic BuilderExampleBuilder age(int age) {\n\t\t\tthis.age = age;\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\tpublic BuilderExampleBuilder occupation(String occupation) {\n\t\t\tif (this.occupations == null) {\n\t\t\t\tthis.occupations = new java.util.ArrayList<String>();\n\t\t\t}\n\t\t\t\n\t\t\tthis.occupations.add(occupation);\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\tpublic BuilderExampleBuilder occupations(Collection<? extends String> occupations) {\n\t\t\tif (this.occupations == null) {\n\t\t\t\tthis.occupations = new java.util.ArrayList<String>();\n\t\t\t}\n\n\t\t\tthis.occupations.addAll(occupations);\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\tpublic BuilderExampleBuilder clearOccupations() {\n\t\t\tif (this.occupations != null) {\n\t\t\t\tthis.occupations.clear();\n\t\t\t}\n\t\t\t\n\t\t\treturn this;\n\t\t}\n\n\t\tpublic BuilderExample build() {\n\t\t\t// complicated switch statement to produce a compact properly sized immutable set omitted.\n\t\t\tSet<String> occupations = ...;\n\t\t\treturn new BuilderExample(created$set ? created : BuilderExample.$default$created(), name, age, occupations);\n\t\t}\n\t\t\n\t\t@java.lang.Override\n\t\tpublic String toString() {\n\t\t\treturn \"BuilderExample.BuilderExampleBuilder(created = \" + this.created + \", name = \" + this.name + \", age = \" + this.age + \", occupations = \" + this.occupations + \")\";\n\t\t}\n\t}\n}"
  },
  {
    "path": "website/usageExamples/BuilderExample_pre.jpage",
    "content": "import lombok.Builder;\nimport lombok.Singular;\nimport java.util.Set;\n\n@Builder\npublic class BuilderExample {\n\t@Builder.Default private long created = System.currentTimeMillis();\n\tprivate String name;\n\tprivate int age;\n\t@Singular private Set<String> occupations;\n}\n"
  },
  {
    "path": "website/usageExamples/CleanupExample_post.jpage",
    "content": "import java.io.*;\n\npublic class CleanupExample {\n\tpublic static void main(String[] args) throws IOException {\n\t\tInputStream in = new FileInputStream(args[0]);\n\t\ttry {\n\t\t\tOutputStream out = new FileOutputStream(args[1]);\n\t\t\ttry {\n\t\t\t\tbyte[] b = new byte[10000];\n\t\t\t\twhile (true) {\n\t\t\t\t\tint r = in.read(b);\n\t\t\t\t\tif (r == -1) break;\n\t\t\t\t\tout.write(b, 0, r);\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (out != null) {\n\t\t\t\t\tout.close();\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tif (in != null) {\n\t\t\t\tin.close();\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/CleanupExample_pre.jpage",
    "content": "import lombok.Cleanup;\nimport java.io.*;\n\npublic class CleanupExample {\n\tpublic static void main(String[] args) throws IOException {\n\t\t@Cleanup InputStream in = new FileInputStream(args[0]);\n\t\t@Cleanup OutputStream out = new FileOutputStream(args[1]);\n\t\tbyte[] b = new byte[10000];\n\t\twhile (true) {\n\t\t\tint r = in.read(b);\n\t\t\tif (r == -1) break;\n\t\t\tout.write(b, 0, r);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/ConstructorExample_post.jpage",
    "content": "public class ConstructorExample<T> {\n\tprivate int x, y;\n\t@NonNull private T description;\n\t\n\tprivate ConstructorExample(T description) {\n\t\tif (description == null) throw new NullPointerException(\"description\");\n\t\tthis.description = description;\n\t}\n\t\n\tpublic static <T> ConstructorExample<T> of(T description) {\n\t\treturn new ConstructorExample<T>(description);\n\t}\n\t\n\t@java.beans.ConstructorProperties({\"x\", \"y\", \"description\"})\n\tprotected ConstructorExample(int x, int y, T description) {\n\t\tif (description == null) throw new NullPointerException(\"description\");\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.description = description;\n\t}\n\t\n\tpublic static class NoArgsExample {\n\t\t@NonNull private String field;\n\t\t\n\t\tpublic NoArgsExample() {\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/ConstructorExample_pre.jpage",
    "content": "import lombok.AccessLevel;\nimport lombok.RequiredArgsConstructor;\nimport lombok.AllArgsConstructor;\nimport lombok.NonNull;\n\n@RequiredArgsConstructor(staticName = \"of\")\n@AllArgsConstructor(access = AccessLevel.PROTECTED)\npublic class ConstructorExample<T> {\n\tprivate int x, y;\n\t@NonNull private T description;\n\t\n\t@NoArgsConstructor\n\tpublic static class NoArgsExample {\n\t\t@NonNull private String field;\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/DataExample_post.jpage",
    "content": "import java.util.Arrays;\n\npublic class DataExample {\n\tprivate final String name;\n\tprivate int age;\n\tprivate double score;\n\tprivate String[] tags;\n\t\n\tpublic DataExample(String name) {\n\t\tthis.name = name;\n\t}\n\t\n\tpublic String getName() {\n\t\treturn this.name;\n\t}\n\t\n\tvoid setAge(int age) {\n\t\tthis.age = age;\n\t}\n\t\n\tpublic int getAge() {\n\t\treturn this.age;\n\t}\n\t\n\tpublic void setScore(double score) {\n\t\tthis.score = score;\n\t}\n\t\n\tpublic double getScore() {\n\t\treturn this.score;\n\t}\n\t\n\tpublic String[] getTags() {\n\t\treturn this.tags;\n\t}\n\t\n\tpublic void setTags(String[] tags) {\n\t\tthis.tags = tags;\n\t}\n\t\n\t@Override public String toString() {\n\t\treturn \"DataExample(\" + this.getName() + \", \" + this.getAge() + \", \" + this.getScore() + \", \" + Arrays.deepToString(this.getTags()) + \")\";\n\t}\n\t\n\tprotected boolean canEqual(Object other) {\n\t\treturn other instanceof DataExample;\n\t}\n\t\n\t@Override public boolean equals(Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof DataExample)) return false;\n\t\tDataExample other = (DataExample) o;\n\t\tif (!other.canEqual((Object)this)) return false;\n\t\tif (this.getName() == null ? other.getName() != null : !this.getName().equals(other.getName())) return false;\n\t\tif (this.getAge() != other.getAge()) return false;\n\t\tif (Double.compare(this.getScore(), other.getScore()) != 0) return false;\n\t\tif (!Arrays.deepEquals(this.getTags(), other.getTags())) return false;\n\t\treturn true;\n\t}\n\t\n\t@Override public int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tfinal long temp1 = Double.doubleToLongBits(this.getScore());\n\t\tresult = (result*PRIME) + (this.getName() == null ? 43 : this.getName().hashCode());\n\t\tresult = (result*PRIME) + this.getAge();\n\t\tresult = (result*PRIME) + (int)(temp1 ^ (temp1 >>> 32));\n\t\tresult = (result*PRIME) + Arrays.deepHashCode(this.getTags());\n\t\treturn result;\n\t}\n\t\n\tpublic static class Exercise<T> {\n\t\tprivate final String name;\n\t\tprivate final T value;\n\t\t\n\t\tprivate Exercise(String name, T value) {\n\t\t\tthis.name = name;\n\t\t\tthis.value = value;\n\t\t}\n\t\t\n\t\tpublic static <T> Exercise<T> of(String name, T value) {\n\t\t\treturn new Exercise<T>(name, value);\n\t\t}\n\t\t\n\t\tpublic String getName() {\n\t\t\treturn this.name;\n\t\t}\n\t\t\n\t\tpublic T getValue() {\n\t\t\treturn this.value;\n\t\t}\n\t\t\n\t\t@Override public String toString() {\n\t\t\treturn \"Exercise(name=\" + this.getName() + \", value=\" + this.getValue() + \")\";\n\t\t}\n\t\t\n\t\tprotected boolean canEqual(Object other) {\n\t\t\treturn other instanceof Exercise;\n\t\t}\n\t\t\n\t\t@Override public boolean equals(Object o) {\n\t\t\tif (o == this) return true;\n\t\t\tif (!(o instanceof Exercise)) return false;\n\t\t\tExercise<?> other = (Exercise<?>) o;\n\t\t\tif (!other.canEqual((Object)this)) return false;\n\t\t\tif (this.getName() == null ? other.getValue() != null : !this.getName().equals(other.getName())) return false;\n\t\t\tif (this.getValue() == null ? other.getValue() != null : !this.getValue().equals(other.getValue())) return false;\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\t@Override public int hashCode() {\n\t\t\tfinal int PRIME = 59;\n\t\t\tint result = 1;\n\t\t\tresult = (result*PRIME) + (this.getName() == null ? 43 : this.getName().hashCode());\n\t\t\tresult = (result*PRIME) + (this.getValue() == null ? 43 : this.getValue().hashCode());\n\t\t\treturn result;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/DataExample_pre.jpage",
    "content": "import lombok.AccessLevel;\nimport lombok.Setter;\nimport lombok.Data;\nimport lombok.ToString;\n\n@Data public class DataExample {\n\tprivate final String name;\n\t@Setter(AccessLevel.PACKAGE) private int age;\n\tprivate double score;\n\tprivate String[] tags;\n\t\n\t@ToString(includeFieldNames=true)\n\t@Data(staticConstructor=\"of\")\n\tpublic static class Exercise<T> {\n\t\tprivate final String name;\n\t\tprivate final T value;\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/EqualsAndHashCodeExample_post.jpage",
    "content": "import java.util.Arrays;\n\npublic class EqualsAndHashCodeExample {\n\tprivate transient int transientVar = 10;\n\tprivate String name;\n\tprivate double score;\n\tprivate Shape shape = new Square(5, 10);\n\tprivate String[] tags;\n\tprivate int id;\n\t\n\tpublic String getName() {\n\t\treturn this.name;\n\t}\n\t\n\t@Override public boolean equals(Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof EqualsAndHashCodeExample)) return false;\n\t\tEqualsAndHashCodeExample other = (EqualsAndHashCodeExample) o;\n\t\tif (!other.canEqual((Object)this)) return false;\n\t\tif (this.getName() == null ? other.getName() != null : !this.getName().equals(other.getName())) return false;\n\t\tif (Double.compare(this.score, other.score) != 0) return false;\n\t\tif (!Arrays.deepEquals(this.tags, other.tags)) return false;\n\t\treturn true;\n\t}\n\t\n\t@Override public int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tfinal long temp1 = Double.doubleToLongBits(this.score);\n\t\tresult = (result*PRIME) + (this.name == null ? 43 : this.name.hashCode());\n\t\tresult = (result*PRIME) + (int)(temp1 ^ (temp1 >>> 32));\n\t\tresult = (result*PRIME) + Arrays.deepHashCode(this.tags);\n\t\treturn result;\n\t}\n\t\n\tprotected boolean canEqual(Object other) {\n\t\treturn other instanceof EqualsAndHashCodeExample;\n\t}\n\t\n\tpublic static class Square extends Shape {\n\t\tprivate final int width, height;\n\t\t\n\t\tpublic Square(int width, int height) {\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t}\n\t\t\n\t\t@Override public boolean equals(Object o) {\n\t\t\tif (o == this) return true;\n\t\t\tif (!(o instanceof Square)) return false;\n\t\t\tSquare other = (Square) o;\n\t\t\tif (!other.canEqual((Object)this)) return false;\n\t\t\tif (!super.equals(o)) return false;\n\t\t\tif (this.width != other.width) return false;\n\t\t\tif (this.height != other.height) return false;\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\t@Override public int hashCode() {\n\t\t\tfinal int PRIME = 59;\n\t\t\tint result = 1;\n\t\t\tresult = (result*PRIME) + super.hashCode();\n\t\t\tresult = (result*PRIME) + this.width;\n\t\t\tresult = (result*PRIME) + this.height;\n\t\t\treturn result;\n\t\t}\n\t\t\n\t\tprotected boolean canEqual(Object other) {\n\t\t\treturn other instanceof Square;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/EqualsAndHashCodeExample_pre.jpage",
    "content": "import lombok.EqualsAndHashCode;\n\n@EqualsAndHashCode\npublic class EqualsAndHashCodeExample {\n\tprivate transient int transientVar = 10;\n\tprivate String name;\n\tprivate double score;\n\t@EqualsAndHashCode.Exclude private Shape shape = new Square(5, 10);\n\tprivate String[] tags;\n\t@EqualsAndHashCode.Exclude private int id;\n\t\n\tpublic String getName() {\n\t\treturn this.name;\n\t}\n\t\n\t@EqualsAndHashCode(callSuper=true)\n\tpublic static class Square extends Shape {\n\t\tprivate final int width, height;\n\t\t\n\t\tpublic Square(int width, int height) {\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/GetterLazyExample_post.jpage",
    "content": "public class GetterLazyExample {\n\tprivate final java.util.concurrent.AtomicReference<java.lang.Object> cached = new java.util.concurrent.AtomicReference<java.lang.Object>();\n\t\n\tpublic double[] getCached() {\n\t\tjava.lang.Object value = this.cached.get();\n\t\tif (value == null) {\n\t\t\tsynchronized(this.cached) {\n\t\t\t\tvalue = this.cached.get();\n\t\t\t\tif (value == null) {\n\t\t\t\t\tfinal double[] actualValue = expensive();\n\t\t\t\t\tvalue = actualValue == null ? this.cached : actualValue;\n\t\t\t\t\tthis.cached.set(value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn (double[])(value == this.cached ? null : value);\n\t}\n\t\n\tprivate double[] expensive() {\n\t\tdouble[] result = new double[1000000];\n\t\tfor (int i = 0; i < result.length; i++) {\n\t\t\tresult[i] = Math.asin(i);\n\t\t}\n\t\treturn result;\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/GetterLazyExample_pre.jpage",
    "content": "import lombok.Getter;\n\npublic class GetterLazyExample {\n\t@Getter(lazy=true) private final double[] cached = expensive();\n\t\n\tprivate double[] expensive() {\n\t\tdouble[] result = new double[1000000];\n\t\tfor (int i = 0; i < result.length; i++) {\n\t\t\tresult[i] = Math.asin(i);\n\t\t}\n\t\treturn result;\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/GetterSetterExample_post.jpage",
    "content": "public class GetterSetterExample {\n\t/**\n\t * Age of the person. Water is wet.\n\t */\n\tprivate int age = 10;\n\n\t/**\n\t * Name of the person.\n\t */\n\tprivate String name;\n\t\n\t@Override public String toString() {\n\t\treturn String.format(\"%s (age: %d)\", name, age);\n\t}\n\t\n\t/**\n\t * Age of the person. Water is wet.\n\t *\n\t * @return The current value of this person's age. Circles are round.\n\t */\n\tpublic int getAge() {\n\t\treturn age;\n\t}\n\t\n\t/**\n\t * Age of the person. Water is wet.\n\t *\n\t * @param age New value for this person's age. Sky is blue.\n\t */\n\tpublic void setAge(int age) {\n\t\tthis.age = age;\n\t}\n\t\n\t/**\n\t * Changes the name of this person.\n\t *\n\t * @param name The new value.\n\t */\n\tprotected void setName(String name) {\n\t\tthis.name = name;\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/GetterSetterExample_pre.jpage",
    "content": "import lombok.AccessLevel;\nimport lombok.Getter;\nimport lombok.Setter;\n\npublic class GetterSetterExample {\n\t/**\n\t * Age of the person. Water is wet.\n\t * \n\t * @param age New value for this person's age. Sky is blue.\n\t * @return The current value of this person's age. Circles are round.\n\t */\n\t@Getter @Setter private int age = 10;\n\t\n\t/**\n\t * Name of the person.\n\t * -- SETTER --\n\t * Changes the name of this person.\n\t * \n\t * @param name The new value.\n\t */\n\t@Setter(AccessLevel.PROTECTED) private String name;\n\t\n\t@Override public String toString() {\n\t\treturn String.format(\"%s (age: %d)\", name, age);\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/LockedExample_post.jpage",
    "content": "public class LockedExample {\n\tprivate final ReadWriteLock lock = new ReentrantReadWriteLock();\n\tprivate final Lock baseLock = new ReentrantLock();\n\tprivate int value = 0;\n\t\n\tpublic int getValue() {\n\t\tthis.lock.readLock().lock();\n\t\ttry {\n\t\t\treturn value;\n\t\t} finally {\n\t\t\tthis.lock.readLock().unlock();\n\t\t}\n\t}\n\t\n\tpublic void setValue(int newValue) {\n\t\tthis.lock.writeLock().lock();\n\t\ttry {\n\t\t\tvalue = newValue;\n\t\t} finally {\n\t\t\tthis.lock.writeLock().unlock();\n\t\t}\n\t}\n\t\n\tpublic void foo() {\n\t\tthis.baseLock.lock();\n\t\ttry {\n\t\t\tSystem.out.println(\"bar\");\n\t\t} finally {\n\t\t\tthis.baseLock.unlock();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/LockedExample_pre.jpage",
    "content": "import lombok.Locked;\n\npublic class LockedExample {\n\tprivate int value = 0;\n\t\n\t@Locked.Read\n\tpublic int getValue() {\n\t\treturn value;\n\t}\n\t\n\t@Locked.Write\n\tpublic void setValue(int newValue) {\n\t\tvalue = newValue;\n\t}\n\t\n\t@Locked(\"baseLock\")\n\tpublic void foo() {\n\t\tSystem.out.println(\"bar\");\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/LogExample_post.jpage",
    "content": "public class LogExample {\n\tprivate static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());\n\t\n\tpublic static void main(String... args) {\n\t\tlog.severe(\"Something's wrong here\");\n\t}\n}\n\npublic class LogExampleOther {\n\tprivate static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExampleOther.class);\n\t\n\tpublic static void main(String... args) {\n\t\tlog.error(\"Something else is wrong here\");\n\t}\n}\n\npublic class LogExampleCategory {\n\tprivate static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(\"CounterLog\");\n\n\tpublic static void main(String... args) {\n\t\tlog.error(\"Calling the 'CounterLog' with a message\");\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/LogExample_pre.jpage",
    "content": "import lombok.extern.java.Log;\nimport lombok.extern.slf4j.Slf4j;\n\n@Log\npublic class LogExample {\n\t\n\tpublic static void main(String... args) {\n\t\tlog.severe(\"Something's wrong here\");\n\t}\n}\n\n@Slf4j\npublic class LogExampleOther {\n\t\n\tpublic static void main(String... args) {\n\t\tlog.error(\"Something else is wrong here\");\n\t}\n}\n\n@CommonsLog(topic=\"CounterLog\")\npublic class LogExampleCategory {\n\n\tpublic static void main(String... args) {\n\t\tlog.error(\"Calling the 'CounterLog' with a message\");\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/NonNullExample_post.jpage",
    "content": "import lombok.NonNull;\n\npublic class NonNullExample extends Something {\n\tprivate String name;\n\t\n\tpublic NonNullExample(@NonNull Person person) {\n\t\tsuper(\"Hello\");\n\t\tif (person == null) {\n\t\t\tthrow new NullPointerException(\"person is marked non-null but is null\");\n\t\t}\n\t\tthis.name = person.getName();\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/NonNullExample_pre.jpage",
    "content": "import lombok.NonNull;\n\npublic class NonNullExample extends Something {\n\tprivate String name;\n\t\n\tpublic NonNullExample(@NonNull Person person) {\n\t\tsuper(\"Hello\");\n\t\tthis.name = person.getName();\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/Singular-snippetExample_post.jpage",
    "content": "import java.util.Collection;\nimport java.util.Set;\nimport java.util.SortedMap;\nimport com.google.common.collect.ImmutableList;\n\npublic class SingularExample<T extends Number> {\n\tprivate Set<String> occupations;\n\tprivate ImmutableList<String> axes;\n\tprivate SortedMap<Integer, T> elves;\n\tprivate Collection<?> minutiae;\n\t\n\tSingularExample(Set<String> occupations, ImmutableList<String> axes, SortedMap<Integer, T> elves, Collection<?> minutiae) {\n\t\tthis.occupations = occupations;\n\t\tthis.axes = axes;\n\t\tthis.elves = elves;\n\t\tthis.minutiae = minutiae;\n\t}\n\t\n\tpublic static class SingularExampleBuilder<T extends Number> {\n\t\tprivate java.util.ArrayList<String> occupations;\n\t\tprivate com.google.common.collect.ImmutableList.Builder<String> axes;\n\t\tprivate java.util.ArrayList<Integer> elves$key;\n\t\tprivate java.util.ArrayList<T> elves$value;\n\t\tprivate java.util.ArrayList<java.lang.Object> minutiae;\n\t\t\n\t\tSingularExampleBuilder() {\n\t\t}\n\t\t\n\t\tpublic SingularExampleBuilder<T> occupation(String occupation) {\n\t\t\tif (this.occupations == null) {\n\t\t\t\tthis.occupations = new java.util.ArrayList<String>();\n\t\t\t}\n\t\t\t\n\t\t\tthis.occupations.add(occupation);\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\t@java.lang.SuppressWarnings(\"all\")\n\t\tpublic SingularExampleBuilder<T> occupations(java.util.Collection<? extends String> occupations) {\n\t\t\tif (this.occupations == null) {\n\t\t\t\tthis.occupations = new java.util.ArrayList<String>();\n\t\t\t}\n\t\t\t\n\t\t\tthis.occupations.addAll(occupations);\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\tpublic SingularExampleBuilder<T> clearOccupations() {\n\t\t\tif (this.occupations != null) this.occupations.clear();\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\tpublic SingularExampleBuilder<T> axis(String axis) {\n\t\t\tif (this.axes == null) {\n\t\t\t\tthis.axes = com.google.common.collect.ImmutableList.builder();\n\t\t\t}\n\t\t\t\n\t\t\tthis.axes.add(axis);\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\tpublic SingularExampleBuilder<T> axes(java.lang.Iterable<? extends String> axes) {\n\t\t\tif (this.axes == null) {\n\t\t\t\tthis.axes = com.google.common.collect.ImmutableList.builder();\n\t\t\t}\n\t\t\t\n\t\t\tthis.axes.addAll(axes);\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\tpublic SingularExampleBuilder<T> clearAxes() {\n\t\t\tif (this.axes != null) this.axes.clear();\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\tpublic SingularExampleBuilder<T> elf(Integer elfKey, T elfValue) {\n\t\t\tif (this.elves$key == null) {\n\t\t\t\tthis.elves$key = new java.util.ArrayList<Integer>();\n\t\t\t\tthis.elves$value = new java.util.ArrayList<T>();\n\t\t\t}\n\t\t\t\n\t\t\tthis.elves$key.add(elfKey);\n\t\t\tthis.elves$value.add(elfValue);\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\tpublic SingularExampleBuilder<T> elves(java.util.Map<? extends Integer, ? extends T> elves) {\n\t\t\tif (this.elves$key == null) {\n\t\t\t\tthis.elves$key = new java.util.ArrayList<Integer>();\n\t\t\t\tthis.elves$value = new java.util.ArrayList<T>();\n\t\t\t}\n\t\t\t\n\t\t\tfor (java.util.Map.Entry<? extends Integer, ? extends T> $lombokEntry : elves.entrySet()) {\n\t\t\t\tthis.elves$key.add($lombokEntry.getKey());\n\t\t\t\tthis.elves$value.add($lombokEntry.getValue());\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\tpublic SingularExampleBuilder<T> clearElves() {\n\t\t\tif (this.elves$key != null) {\n\t\t\t\tthis.elves$key.clear();\n\t\t\t\tthis.elves$value.clear();\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\tpublic SingularExampleBuilder<T> minutia(java.lang.Object minutia) {\n\t\t\tif (this.minutiae == null) {\n\t\t\t\tthis.minutiae = new java.util.ArrayList<java.lang.Object>();\n\t\t\t}\n\t\t\t\n\t\t\tthis.minutiae.add(minutia);\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\tpublic SingularExampleBuilder<T> minutiae(java.util.Collection<?> minutiae) {\n\t\t\tif (this.minutiae == null) {\n\t\t\t\tthis.minutiae = new java.util.ArrayList<java.lang.Object>();\n\t\t\t}\n\t\t\t\n\t\t\tthis.minutiae.addAll(minutiae);\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\tpublic SingularExampleBuilder<T> clearMinutiae() {\n\t\t\tif (this.minutiae != null) this.minutiae.clear();\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\tpublic SingularExample<T> build() {\n\t\t\tjava.util.Set<String> occupations;\n\t\t\tswitch (this.occupations == null ? 0 : this.occupations.size()) {\n\t\t\tcase 0: \n\t\t\t\toccupations = java.util.Collections.emptySet();\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase 1: \n\t\t\t\toccupations = java.util.Collections.singleton(this.occupations.get(0));\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tdefault: \n\t\t\t\toccupations = new java.util.LinkedHashSet<String>(this.occupations.size() < 1073741824 ? 1 + this.occupations.size() + (this.occupations.size() - 3) / 3 : java.lang.Integer.MAX_VALUE);\n\t\t\t\toccupations.addAll(this.occupations);\n\t\t\t\toccupations = java.util.Collections.unmodifiableSet(occupations);\n\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tcom.google.common.collect.ImmutableList<String> axes = this.axes == null ? com.google.common.collect.ImmutableList.<String>of() : this.axes.build();\n\t\t\t\n\t\t\tjava.util.SortedMap<Integer, T> elves = new java.util.TreeMap<Integer, T>();\n\t\t\tif (this.elves$key != null) for (int $i = 0; $i < (this.elves$key == null ? 0 : this.elves$key.size()); $i++) elves.put(this.elves$key.get($i), this.elves$value.get($i));\n\t\t\telves = java.util.Collections.unmodifiableSortedMap(elves);\n\t\t\t\n\t\t\tjava.util.Collection<java.lang.Object> minutiae;\n\t\t\tswitch (this.minutiae == null ? 0 : this.minutiae.size()) {\n\t\t\tcase 0: \n\t\t\t\tminutiae = java.util.Collections.emptyList();\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase 1: \n\t\t\t\tminutiae = java.util.Collections.singletonList(this.minutiae.get(0));\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tdefault: \n\t\t\t\tminutiae = java.util.Collections.unmodifiableList(new java.util.ArrayList<java.lang.Object>(this.minutiae));\n\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\treturn new SingularExample<T>(occupations, axes, elves, minutiae);\n\t\t}\n\t\t\n\t\t@java.lang.Override\n\t\tpublic java.lang.String toString() {\n\t\t\treturn \"SingularExample.SingularExampleBuilder(occupations=\" + this.occupations + \", axes=\" + this.axes + \", elves$key=\" + this.elves$key + \", elves$value=\" + this.elves$value + \", minutiae=\" + this.minutiae + \")\";\n\t\t}\n\t}\n\t\n\t@java.lang.SuppressWarnings(\"all\")\n\tpublic static <T extends Number> SingularExampleBuilder<T> builder() {\n\t\treturn new SingularExampleBuilder<T>();\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/Singular-snippetExample_pre.jpage",
    "content": "import lombok.Builder;\nimport lombok.Singular;\nimport java.util.Collection;\nimport java.util.Set;\nimport java.util.SortedMap;\nimport com.google.common.collect.ImmutableList;\n\n@Builder\npublic class SingularExample<T extends Number> {\n\tprivate @Singular Set<String> occupations;\n\tprivate @Singular(\"axis\") ImmutableList<String> axes;\n\tprivate @Singular SortedMap<Integer, T> elves;\n\tprivate @Singular Collection<?> minutiae;\n}\n"
  },
  {
    "path": "website/usageExamples/SneakyThrowsExample_post.jpage",
    "content": "import lombok.Lombok;\n\npublic class SneakyThrowsExample implements Runnable {\n\tpublic String utf8ToString(byte[] bytes) {\n\t\ttry {\n\t\t\treturn new String(bytes, \"UTF-8\");\n\t\t} catch (UnsupportedEncodingException e) {\n\t\t\tthrow Lombok.sneakyThrow(e);\n\t\t}\n\t}\n\t\n\tpublic void run() {\n\t\ttry {\n\t\t\tthrow new Throwable();\n\t\t} catch (Throwable t) {\n\t\t\tthrow Lombok.sneakyThrow(t);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/SneakyThrowsExample_pre.jpage",
    "content": "import lombok.SneakyThrows;\n\npublic class SneakyThrowsExample implements Runnable {\n\t@SneakyThrows(UnsupportedEncodingException.class)\n\tpublic String utf8ToString(byte[] bytes) {\n\t\treturn new String(bytes, \"UTF-8\");\n\t}\n\t\n\t@SneakyThrows\n\tpublic void run() {\n\t\tthrow new Throwable();\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/StandardExceptionExample_post.jpage",
    "content": "public class ExampleException extends Exception {\n    public ExampleException() {\n        this(null, null);\n    }\n\n    public ExampleException(String message) {\n        this(message, null);\n    }\n\n    public ExampleException(Throwable cause) {\n        this(cause != null ? cause.getMessage() : null, cause);\n    }\n\n    public ExampleException(String message, Throwable cause) {\n        super(message);\n        if (cause != null) super.initCause(cause);\n    }\n}"
  },
  {
    "path": "website/usageExamples/StandardExceptionExample_pre.jpage",
    "content": "import lombok.experimental.StandardException;\n\n@StandardException\npublic class ExampleException extends Exception {\n}"
  },
  {
    "path": "website/usageExamples/SynchronizedExample_post.jpage",
    "content": "public class SynchronizedExample {\n\tprivate static final Object $LOCK = new Object[0];\n\tprivate final Object $lock = new Object[0];\n\tprivate final Object readLock = new Object();\n\t\n\tpublic static void hello() {\n\t\tsynchronized($LOCK) {\n\t\t\tSystem.out.println(\"world\");\n\t\t}\n\t}\n\t\n\tpublic int answerToLife() {\n\t\tsynchronized($lock) {\n\t\t\treturn 42;\n\t\t}\n\t}\n\t\n\tpublic void foo() {\n\t\tsynchronized(readLock) {\n\t\t\tSystem.out.println(\"bar\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/SynchronizedExample_pre.jpage",
    "content": "import lombok.Synchronized;\n\npublic class SynchronizedExample {\n\tprivate final Object readLock = new Object();\n\t\n\t@Synchronized\n\tpublic static void hello() {\n\t\tSystem.out.println(\"world\");\n\t}\n\t\n\t@Synchronized\n\tpublic int answerToLife() {\n\t\treturn 42;\n\t}\n\t\n\t@Synchronized(\"readLock\")\n\tpublic void foo() {\n\t\tSystem.out.println(\"bar\");\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/ToStringExample_post.jpage",
    "content": "import java.util.Arrays;\n\npublic class ToStringExample {\n\tprivate static final int STATIC_VAR = 10;\n\tprivate String name;\n\tprivate Shape shape = new Square(5, 10);\n\tprivate String[] tags;\n\tprivate int id;\n\t\n\tpublic String getName() {\n\t\treturn this.name;\n\t}\n\t\n\tpublic static class Square extends Shape {\n\t\tprivate final int width, height;\n\t\t\n\t\tpublic Square(int width, int height) {\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t}\n\t\t\n\t\t@Override public String toString() {\n\t\t\treturn \"Square(super=\" + super.toString() + \", width=\" + this.width + \", height=\" + this.height + \")\";\n\t\t}\n\t}\n\t\n\t@Override public String toString() {\n\t\treturn \"ToStringExample(\" + this.getName() + \", \" + this.shape + \", \" + Arrays.deepToString(this.tags) + \")\";\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/ToStringExample_pre.jpage",
    "content": "import lombok.ToString;\n\n@ToString\npublic class ToStringExample {\n\tprivate static final int STATIC_VAR = 10;\n\tprivate String name;\n\tprivate Shape shape = new Square(5, 10);\n\tprivate String[] tags;\n\t@ToString.Exclude private int id;\n\t\n\tpublic String getName() {\n\t\treturn this.name;\n\t}\n\t\n\t@ToString(callSuper=true, includeFieldNames=true)\n\tpublic static class Square extends Shape {\n\t\tprivate final int width, height;\n\t\t\n\t\tpublic Square(int width, int height) {\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/ValueExample_post.jpage",
    "content": "import java.util.Arrays;\n\npublic final class ValueExample {\n\tprivate final String name;\n\tprivate int age;\n\tprivate final double score;\n\tprotected final String[] tags;\n\t\n\t@java.beans.ConstructorProperties({\"name\", \"age\", \"score\", \"tags\"})\n\tpublic ValueExample(String name, int age, double score, String[] tags) {\n\t\tthis.name = name;\n\t\tthis.age = age;\n\t\tthis.score = score;\n\t\tthis.tags = tags;\n\t}\n\t\n\tpublic String getName() {\n\t\treturn this.name;\n\t}\n\t\n\tpublic int getAge() {\n\t\treturn this.age;\n\t}\n\t\n\tpublic double getScore() {\n\t\treturn this.score;\n\t}\n\t\n\tpublic String[] getTags() {\n\t\treturn this.tags;\n\t}\n\t\n\t@java.lang.Override\n\tpublic boolean equals(Object o) {\n\t\tif (o == this) return true;\n\t\tif (!(o instanceof ValueExample)) return false;\n\t\tfinal ValueExample other = (ValueExample)o;\n\t\tfinal Object this$name = this.getName();\n\t\tfinal Object other$name = other.getName();\n\t\tif (this$name == null ? other$name != null : !this$name.equals(other$name)) return false;\n\t\tif (this.getAge() != other.getAge()) return false;\n\t\tif (Double.compare(this.getScore(), other.getScore()) != 0) return false;\n\t\tif (!Arrays.deepEquals(this.getTags(), other.getTags())) return false;\n\t\treturn true;\n\t}\n\t\n\t@java.lang.Override\n\tpublic int hashCode() {\n\t\tfinal int PRIME = 59;\n\t\tint result = 1;\n\t\tfinal Object $name = this.getName();\n\t\tresult = result * PRIME + ($name == null ? 43 : $name.hashCode());\n\t\tresult = result * PRIME + this.getAge();\n\t\tfinal long $score = Double.doubleToLongBits(this.getScore());\n\t\tresult = result * PRIME + (int)($score >>> 32 ^ $score);\n\t\tresult = result * PRIME + Arrays.deepHashCode(this.getTags());\n\t\treturn result;\n\t}\n\t\n\t@java.lang.Override\n\tpublic String toString() {\n\t\treturn \"ValueExample(name=\" + getName() + \", age=\" + getAge() + \", score=\" + getScore() + \", tags=\" + Arrays.deepToString(getTags()) + \")\";\n\t}\n\t\n\tValueExample withAge(int age) {\n\t\treturn this.age == age ? this : new ValueExample(name, age, score, tags);\n\t}\n\t\n\tpublic static final class Exercise<T> {\n\t\tprivate final String name;\n\t\tprivate final T value;\n\t\t\n\t\tprivate Exercise(String name, T value) {\n\t\t\tthis.name = name;\n\t\t\tthis.value = value;\n\t\t}\n\t\t\n\t\tpublic static <T> Exercise<T> of(String name, T value) {\n\t\t\treturn new Exercise<T>(name, value);\n\t\t}\n\t\t\n\t\tpublic String getName() {\n\t\t\treturn this.name;\n\t\t}\n\t\t\n\t\tpublic T getValue() {\n\t\t\treturn this.value;\n\t\t}\n\t\t\n\t\t@java.lang.Override\n\t\tpublic boolean equals(Object o) {\n\t\t\tif (o == this) return true;\n\t\t\tif (!(o instanceof ValueExample.Exercise)) return false;\n\t\t\tfinal Exercise<?> other = (Exercise<?>)o;\n\t\t\tfinal Object this$name = this.getName();\n\t\t\tfinal Object other$name = other.getName();\n\t\t\tif (this$name == null ? other$name != null : !this$name.equals(other$name)) return false;\n\t\t\tfinal Object this$value = this.getValue();\n\t\t\tfinal Object other$value = other.getValue();\n\t\t\tif (this$value == null ? other$value != null : !this$value.equals(other$value)) return false;\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\t@java.lang.Override\n\t\tpublic int hashCode() {\n\t\t\tfinal int PRIME = 59;\n\t\t\tint result = 1;\n\t\t\tfinal Object $name = this.getName();\n\t\t\tresult = result * PRIME + ($name == null ? 43 : $name.hashCode());\n\t\t\tfinal Object $value = this.getValue();\n\t\t\tresult = result * PRIME + ($value == null ? 43 : $value.hashCode());\n\t\t\treturn result;\n\t\t}\n\t\t\n\t\t@java.lang.Override\n\t\tpublic String toString() {\n\t\t\treturn \"ValueExample.Exercise(name=\" + getName() + \", value=\" + getValue() + \")\";\n\t\t}\n\t}\n}"
  },
  {
    "path": "website/usageExamples/ValueExample_pre.jpage",
    "content": "import lombok.AccessLevel;\nimport lombok.experimental.NonFinal;\nimport lombok.experimental.Value;\nimport lombok.experimental.With;\nimport lombok.ToString;\n\n@Value public class ValueExample {\n\tString name;\n\t@With(AccessLevel.PACKAGE) @NonFinal int age;\n\tdouble score;\n\tprotected String[] tags;\n\t\n\t@ToString(includeFieldNames=true)\n\t@Value(staticConstructor=\"of\")\n\tpublic static class Exercise<T> {\n\t\tString name;\n\t\tT value;\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/WithExample_post.jpage",
    "content": "import lombok.NonNull;\n\npublic class WithExample {\n\tprivate @NonNull final String name;\n\tprivate final int age;\n\n\tpublic WithExample(String name, int age) {\n\t\tif (name == null) throw new NullPointerException();\n\t\tthis.name = name;\n\t\tthis.age = age;\n\t}\n\n\tprotected WithExample withName(@NonNull String name) {\n\t\tif (name == null) throw new java.lang.NullPointerException(\"name\");\n\t\treturn this.name == name ? this : new WithExample(name, age);\n\t}\n\n\tpublic WithExample withAge(int age) {\n\t\treturn this.age == age ? this : new WithExample(name, age);\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/WithExample_pre.jpage",
    "content": "import lombok.AccessLevel;\nimport lombok.NonNull;\nimport lombok.With;\n\npublic class WithExample {\n\t@With(AccessLevel.PROTECTED) @NonNull private final String name;\n\t@With private final int age;\n\t\n\tpublic WithExample(@NonNull String name, int age) {\n\t\tthis.name = name;\n\t\tthis.age = age;\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/experimental/AccessorsExample_post.jpage",
    "content": "public class AccessorsExample {\n\tprivate int age = 10;\n\t\n\tpublic int age() {\n\t\treturn this.age;\n\t}\n\t\n\tpublic AccessorsExample age(final int age) {\n\t\tthis.age = age;\n\t\treturn this;\n\t}\n}\n\nclass PrefixExample {\n\tprivate String fName = \"Hello, World!\";\n\t\n\tpublic String getName() {\n\t\treturn this.fName;\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/experimental/AccessorsExample_pre.jpage",
    "content": "import lombok.experimental.Accessors;\nimport lombok.Getter;\nimport lombok.Setter;\n\n@Accessors(fluent = true)\npublic class AccessorsExample {\n\t@Getter @Setter\n\tprivate int age = 10;\n}\n\nclass PrefixExample {\n\t@Accessors(prefix = \"f\") @Getter\n\tprivate String fName = \"Hello, World!\";\n}\n"
  },
  {
    "path": "website/usageExamples/experimental/DelegateExample_post.jpage",
    "content": "import java.util.ArrayList;\nimport java.util.Collection;\n\npublic class DelegationExample {\n\tprivate interface SimpleCollection {\n\t\tboolean add(String item);\n\t\tboolean remove(Object item);\n\t}\n\t\n\tprivate final Collection<String> collection = new ArrayList<String>();\n\t\n\t@java.lang.SuppressWarnings(\"all\")\n\tpublic boolean add(final java.lang.String item) {\n\t\treturn this.collection.add(item);\n\t}\n\t\n\t@java.lang.SuppressWarnings(\"all\")\n\tpublic boolean remove(final java.lang.Object item) {\n\t\treturn this.collection.remove(item);\n\t}\n}\n\nclass ExcludesDelegateExample {\n\tlong counter = 0L;\n\t\n\tprivate interface Add {\n\t\tboolean add(String x);\n\t\tboolean addAll(Collection<? extends String> x);\n\t}\n\t\n\tprivate final Collection<String> collection = new ArrayList<String>();\n\t\n\tpublic boolean add(String item) {\n\t\tcounter++;\n\t\treturn collection.add(item);\n\t}\n\t\n\tpublic boolean addAll(Collection<? extends String> col) {\n\t\tcounter += col.size();\n\t\treturn collection.addAll(col);\n\t}\n\t\n\t@java.lang.SuppressWarnings(\"all\")\n\tpublic int size() {\n\t\treturn this.collection.size();\n\t}\n\t\n\t@java.lang.SuppressWarnings(\"all\")\n\tpublic boolean isEmpty() {\n\t\treturn this.collection.isEmpty();\n\t}\n\t\n\t@java.lang.SuppressWarnings(\"all\")\n\tpublic boolean contains(final java.lang.Object arg0) {\n\t\treturn this.collection.contains(arg0);\n\t}\n\t\n\t@java.lang.SuppressWarnings(\"all\")\n\tpublic java.util.Iterator<java.lang.String> iterator() {\n\t\treturn this.collection.iterator();\n\t}\n\t\n\t@java.lang.SuppressWarnings(\"all\")\n\tpublic java.lang.Object[] toArray() {\n\t\treturn this.collection.toArray();\n\t}\n\t\n\t@java.lang.SuppressWarnings(\"all\")\n\tpublic <T extends .java.lang.Object>T[] toArray(final T[] arg0) {\n\t\treturn this.collection.<T>toArray(arg0);\n\t}\n\t\n\t@java.lang.SuppressWarnings(\"all\")\n\tpublic boolean remove(final java.lang.Object arg0) {\n\t\treturn this.collection.remove(arg0);\n\t}\n\t\n\t@java.lang.SuppressWarnings(\"all\")\n\tpublic boolean containsAll(final java.util.Collection<?> arg0) {\n\t\treturn this.collection.containsAll(arg0);\n\t}\n\t\n\t@java.lang.SuppressWarnings(\"all\")\n\tpublic boolean removeAll(final java.util.Collection<?> arg0) {\n\t\treturn this.collection.removeAll(arg0);\n\t}\n\t\n\t@java.lang.SuppressWarnings(\"all\")\n\tpublic boolean retainAll(final java.util.Collection<?> arg0) {\n\t\treturn this.collection.retainAll(arg0);\n\t}\n\t\n\t@java.lang.SuppressWarnings(\"all\")\n\tpublic void clear() {\n\t\tthis.collection.clear();\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/experimental/DelegateExample_pre.jpage",
    "content": "import java.util.ArrayList;\nimport java.util.Collection;\n\nimport lombok.experimental.Delegate;\n\npublic class DelegationExample {\n\tprivate interface SimpleCollection {\n\t\tboolean add(String item);\n\t\tboolean remove(Object item);\n\t}\n\t\n\t@Delegate(types=SimpleCollection.class)\n\tprivate final Collection<String> collection = new ArrayList<String>();\n}\n\n\nclass ExcludesDelegateExample {\n\tlong counter = 0L;\n\t\n\tprivate interface Add {\n\t\tboolean add(String x);\n\t\tboolean addAll(Collection<? extends String> x);\n\t}\n\t\n\t@Delegate(excludes=Add.class)\n\tprivate final Collection<String> collection = new ArrayList<String>();\n\t\n\tpublic boolean add(String item) {\n\t\tcounter++;\n\t\treturn collection.add(item);\n\t}\n\t\n\tpublic boolean addAll(Collection<? extends String> col) {\n\t\tcounter += col.size();\n\t\treturn collection.addAll(col);\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/experimental/ExtensionMethodExample_post.jpage",
    "content": "public class ExtensionMethodExample {\n\tpublic String test() {\n\t\tint[] intArray = {5, 3, 8, 2};\n\t\tjava.util.Arrays.sort(intArray);\n\t\t\n\t\tString iAmNull = null;\n\t\treturn Extensions.or(iAmNull, Extensions.toTitleCase(\"hELlO, WORlD!\"));\n\t}\n}\n\nclass Extensions {\n\tpublic static <T> T or(T obj, T ifNull) {\n\t\treturn obj != null ? obj : ifNull;\n\t}\n\t\n\tpublic static String toTitleCase(String in) {\n\t\tif (in.isEmpty()) return in;\n\t\treturn \"\" + Character.toTitleCase(in.charAt(0)) +\n\t\t\t\tin.substring(1).toLowerCase();\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/experimental/ExtensionMethodExample_pre.jpage",
    "content": "import lombok.experimental.ExtensionMethod;\n\n@ExtensionMethod({java.util.Arrays.class, Extensions.class})\npublic class ExtensionMethodExample {\n\tpublic String test() {\n\t\tint[] intArray = {5, 3, 8, 2};\n\t\tintArray.sort();\n\t\t\n\t\tString iAmNull = null;\n\t\treturn iAmNull.or(\"hELlO, WORlD!\".toTitleCase());\n\t}\n}\n\nclass Extensions {\n\tpublic static <T> T or(T obj, T ifNull) {\n\t\treturn obj != null ? obj : ifNull;\n\t}\n\t\n\tpublic static String toTitleCase(String in) {\n\t\tif (in.isEmpty()) return in;\n\t\treturn \"\" + Character.toTitleCase(in.charAt(0)) +\n\t\t\t\tin.substring(1).toLowerCase();\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/experimental/FieldDefaultsExample_post.jpage",
    "content": "public class FieldDefaultsExample {\n\tpublic final int a;\n\tprivate final int b;\n\tprivate int c;\n\tfinal int d;\n\t\n\tFieldDefaultsExample() {\n\t\ta = 0;\n\t\tb = 0;\n\t\td = 0;\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/experimental/FieldDefaultsExample_pre.jpage",
    "content": "import lombok.AccessLevel;\nimport lombok.experimental.FieldDefaults;\nimport lombok.experimental.NonFinal;\nimport lombok.experimental.PackagePrivate;\n\n@FieldDefaults(makeFinal=true, level=AccessLevel.PRIVATE)\npublic class FieldDefaultsExample {\n\tpublic final int a;\n\tint b;\n\t@NonFinal int c;\n\t@PackagePrivate int d;\n\t\n\tFieldDefaultsExample() {\n\t\ta = 0;\n\t\tb = 0;\n\t\td = 0;\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/experimental/FieldNameConstantsExample_post.jpage",
    "content": "public class FieldNameConstantsExample {\n\tprivate final String iAmAField;\n\tprivate final int andSoAmI;\n\tprivate final int asAmI;\n\t\n\tpublic static final class Fields {\n\t\tpublic static final String iAmAField = \"iAmAField\";\n\t\tpublic static final String andSoAmI = \"andSoAmI\";\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/experimental/FieldNameConstantsExample_pre.jpage",
    "content": "import lombok.experimental.FieldNameConstants;\n\n@FieldNameConstants\npublic class FieldNameConstantsExample {\n\tprivate final String iAmAField;\n\tprivate final int andSoAmI;\n\t@FieldNameConstants.Exclude private final int asAmI;\n}\n"
  },
  {
    "path": "website/usageExamples/experimental/HelperExample_post.jpage",
    "content": "public class HelperExample {\n\tint someMethod(int arg1) {\n\t\tint localVar = 5;\n\n\t\tclass Helpers {\n\t\t\tint helperMethod(int arg) {\n\t\t\t\treturn arg + localVar;\n\t\t\t}\n\t\t}\n\t\tHelpers $Helpers = new Helpers();\n\n\t\treturn $Helpers.helperMethod(10);\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/experimental/HelperExample_pre.jpage",
    "content": "import lombok.experimental.Helper;\n\npublic class HelperExample {\n\tint someMethod(int arg1) {\n\t\tint localVar = 5;\n\n\t\t@Helper class Helpers {\n\t\t\tint helperMethod(int arg) {\n\t\t\t\treturn arg + localVar;\n\t\t\t}\n\t\t}\n\n\t\treturn helperMethod(10);\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/experimental/TolerateExample_post.jpage",
    "content": "public class TolerateExample {\n    @Setter\n    private Date date;\n\n    public void setDateFromString(String date) {\n        this.date = Date.valueOf(date);\n    }\n}\n"
  },
  {
    "path": "website/usageExamples/experimental/TolerateExample_pre.jpage",
    "content": "import lombok.experimental.Tolerate;\n\npublic class TolerateExample {\n    @Setter\n    private Date date;\n\n    @Tolerate\n    public void setDate(String date) {\n        this.date = Date.valueOf(date);\n    }\n}\n"
  },
  {
    "path": "website/usageExamples/experimental/UtilityClassExample_post.jpage",
    "content": "public final class UtilityClassExample {\n\tprivate static final int CONSTANT = 5;\n\n\tprivate UtilityClassExample() {\n\t\tthrow new java.lang.UnsupportedOperationException(\"This is a utility class and cannot be instantiated\");\n\t}\n\n\tpublic static int addSomething(int in) {\n\t\treturn in + CONSTANT;\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/experimental/UtilityClassExample_pre.jpage",
    "content": "import lombok.experimental.UtilityClass;\n\n@UtilityClass\npublic class UtilityClassExample {\n\tprivate final int CONSTANT = 5;\n\n\tpublic int addSomething(int in) {\n\t\treturn in + CONSTANT;\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/experimental/onXExample_post.jpage",
    "content": "import javax.inject.Inject;\nimport javax.persistence.Id;\nimport javax.persistence.Column;\nimport javax.validation.constraints.Max;\n\npublic class OnXExample {\n\tprivate long unid;\n\n\t@Inject\n\tpublic OnXExample(long unid) {\n\t\tthis.unid = unid;\n\t}\n\n\t@Id @Column(name=\"unique-id\")\n\tpublic long getUnid() {\n\t\treturn unid;\n\t}\n\n\tpublic void setUnid(@Max(10000) long unid) {\n\t\tthis.unid = unid;\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/experimental/onXExample_pre.jpage",
    "content": "import lombok.AllArgsConstructor;\nimport lombok.Getter;\nimport lombok.Setter;\n\nimport javax.inject.Inject;\nimport javax.persistence.Id;\nimport javax.persistence.Column;\nimport javax.validation.constraints.Max;\n\n@AllArgsConstructor(onConstructor_=@Inject)\npublic class OnXExample {\n\t@Getter(onMethod_={@Id, @Column(name=\"unique-id\")})\n\t@Setter(onParam_=@Max(10000))\n\tprivate long unid;\n}\n"
  },
  {
    "path": "website/usageExamples/experimental/varExample_post.jpage",
    "content": "import java.util.ArrayList;\nimport lombok.var;\n\npublic class VarExample {\n\tpublic String example() {\n\t\tArrayList<String> example = new ArrayList<String>();\n\t\texample.add(\"Hello, World!\");\n\t\tfinal String foo = example.get(0);\n\t\treturn foo.toLowerCase();\n\t}\n\n\tpublic void example2() {\n\t\tArrayList<String> list = new ArrayList<String>();\n\t\tlist.add(\"zero\");\n\t\tlist.add(\"one\");\n\t\tlist.add(\"two\");\n\t\tfor(int i = 0; i < list.size(); ++i) {\n\t\t\tSystem.out.printf(\"%d: %s\\n\", i, list.get(i));\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/experimental/varExample_pre.jpage",
    "content": "import java.util.ArrayList;\nimport lombok.var;\n\npublic class VarExample {\n\tpublic String example() {\n\t\tvar example = new ArrayList<String>();\n\t\texample.add(\"Hello, World!\");\n\t\tfinal var foo = example.get(0);\n\t\treturn foo.toLowerCase();\n\t}\n\n\tpublic void example2() {\n\t\tvar list = new ArrayList<String>();\n\t\tlist.add(\"zero\");\n\t\tlist.add(\"one\");\n\t\tlist.add(\"two\");\n\t\tfor(var i = 0; i < list.size(); ++i) {\n\t\t\tSystem.out.printf(\"%d: %s\\n\", i, list.get(i));\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/valExample_post.jpage",
    "content": "import java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic class ValExample {\n\tpublic String example() {\n\t\tfinal ArrayList<String> example = new ArrayList<String>();\n\t\texample.add(\"Hello, World!\");\n\t\tfinal String foo = example.get(0);\n\t\treturn foo.toLowerCase();\n\t}\n\t\n\tpublic void example2() {\n\t\tfinal HashMap<Integer, String> map = new HashMap<Integer, String>();\n\t\tmap.put(0, \"zero\");\n\t\tmap.put(5, \"five\");\n\t\tfor (final Map.Entry<Integer, String> entry : map.entrySet()) {\n\t\t\tSystem.out.printf(\"%d: %s\\n\", entry.getKey(), entry.getValue());\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "website/usageExamples/valExample_pre.jpage",
    "content": "import java.util.ArrayList;\nimport java.util.HashMap;\nimport lombok.val;\n\npublic class ValExample {\n\tpublic String example() {\n\t\tval example = new ArrayList<String>();\n\t\texample.add(\"Hello, World!\");\n\t\tval foo = example.get(0);\n\t\treturn foo.toLowerCase();\n\t}\n\t\n\tpublic void example2() {\n\t\tval map = new HashMap<Integer, String>();\n\t\tmap.put(0, \"zero\");\n\t\tmap.put(5, \"five\");\n\t\tfor (val entry : map.entrySet()) {\n\t\t\tSystem.out.printf(\"%d: %s\\n\", entry.getKey(), entry.getValue());\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "winsrc/.gitignore",
    "content": "lombok_installer_WindowsDriveInfo.o\nWindowsDriveInfo.dll\nWindowsDriveInfo-x86_64.dll\nWindowsDriveInfo-i386.dll\n"
  },
  {
    "path": "winsrc/lombok_installer_WindowsDriveInfo.c",
    "content": "/*\n * Copyright (C) 2009 The Project Lombok Authors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n#include <jni.h>\n#include <windows.h>\n#include <stdio.h>\n#include <winbase.h>\n#include \"lombok_installer_WindowsDriveInfo.h\"\n\n/*\n * Class:     lombok_installer_WindowsDriveInfo\n * Method:    getLogicalDrives0\n * Signature: ()I\n */\nJNIEXPORT jint JNICALL Java_lombok_installer_WindowsDriveInfo_getLogicalDrives0\n  (JNIEnv *env, jobject obj) {\n\treturn GetLogicalDrives();\n}\n\n/*\n * Class:     lombok_installer_WindowsDriveInfo\n * Method:    getDriveType\n * Signature: (Ljava/lang/String;)I\n */\nJNIEXPORT jint JNICALL Java_lombok_installer_WindowsDriveInfo_getDriveType\n  (JNIEnv *env, jobject obj, jstring drive) {\n\tconst char *str= (*env)->GetStringUTFChars(env, drive, 0);\n\tDWORD val = GetDriveTypeA(str);\n\t(*env)->ReleaseStringUTFChars(env, drive, str);\n\treturn val;\n}\n"
  },
  {
    "path": "winsrc/lombok_installer_WindowsDriveInfo.h",
    "content": "/* DO NOT EDIT THIS FILE - it is machine generated */\n#include <jni.h>\n/* Header for class lombok_installer_WindowsDriveInfo */\n\n#ifndef _Included_lombok_installer_WindowsDriveInfo\n#define _Included_lombok_installer_WindowsDriveInfo\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n/*\n * Class:     lombok_installer_WindowsDriveInfo\n * Method:    getLogicalDrives0\n * Signature: ()I\n */\nJNIEXPORT jint JNICALL Java_lombok_installer_WindowsDriveInfo_getLogicalDrives0\n  (JNIEnv *, jobject);\n\n/*\n * Class:     lombok_installer_WindowsDriveInfo\n * Method:    getDriveType\n * Signature: (Ljava/lang/String;)I\n */\nJNIEXPORT jint JNICALL Java_lombok_installer_WindowsDriveInfo_getDriveType\n  (JNIEnv *, jobject, jstring);\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  }
]