Quiltflower is a fork of Fernflower adding additional features for use with the Quilt toolchain.

Overview

Quiltflower

Quiltflower is a fork of Fernflower adding additional features for use with the Quilt toolchain.

Changes include:

  • Javadoc application
  • Multithreading
  • Handful of other fixes

When pulling from upstream, use https://github.com/fesh0r/fernflower

About Fernflower

Fernflower is the first actually working analytical decompiler for Java and probably for a high-level programming language in general. Naturally it is still under development, please send your bug reports and improvement suggestions to the issue tracker.

Licence

Fernflower is licenced under the Apache Licence Version 2.0.

Running from command line

java -jar fernflower.jar [-

* means 0 or more times
+ means 1 or more times

: file or directory with files to be decompiled. Directories are recursively scanned. Allowed file extensions are class, zip and jar. Sources prefixed with -e= mean "library" files that won't be decompiled, but taken into account when analysing relationships between classes or methods. Especially renaming of identifiers (s. option 'ren') can benefit from information about external classes.

: destination directory

Examples:

java -jar fernflower.jar -hes=0 -hdc=0 c:\Temp\binary\ -e=c:\Java\rt.jar c:\Temp\source\

java -jar fernflower.jar -dgs=1 c:\Temp\binary\library.jar c:\Temp\binary\Boot.class c:\Temp\source\

Command-line options

With the exception of mpm and urc the value of 1 means the option is activated, 0 - deactivated. Default value, if any, is given between parentheses.

Typically, the following options will be changed by user, if any: hes, hdc, dgs, mpm, ren, urc The rest of options can be left as they are: they are aimed at professional reverse engineers.

  • rbr (1): hide bridge methods
  • rsy (0): hide synthetic class members
  • din (1): decompile inner classes
  • dc4 (1): collapse 1.4 class references
  • das (1): decompile assertions
  • hes (1): hide empty super invocation
  • hdc (1): hide empty default constructor
  • dgs (0): decompile generic signatures
  • ner (1): assume return not throwing exceptions
  • den (1): decompile enumerations
  • rgn (1): remove getClass() invocation, when it is part of a qualified new statement
  • lit (0): output numeric literals "as-is"
  • asc (0): encode non-ASCII characters in string and character literals as Unicode escapes
  • bto (1): interpret int 1 as boolean true (workaround to a compiler bug)
  • nns (0): allow for not set synthetic attribute (workaround to a compiler bug)
  • uto (1): consider nameless types as java.lang.Object (workaround to a compiler architecture flaw)
  • udv (1): reconstruct variable names from debug information, if present
  • rer (1): remove empty exception ranges
  • fdi (1): de-inline finally structures
  • mpm (0): maximum allowed processing time per decompiled method, in seconds. 0 means no upper limit
  • ren (0): rename ambiguous (resp. obfuscated) classes and class elements
  • urc (-): full name of a user-supplied class implementing IIdentifierRenamer interface. It is used to determine which class identifiers should be renamed and provides new identifier names (see "Renaming identifiers")
  • inn (1): check for IntelliJ IDEA-specific @NotNull annotation and remove inserted code if found
  • lac (0): decompile lambda expressions to anonymous classes
  • nls (0): define new line character to be used for output. 0 - '\r\n' (Windows), 1 - '\n' (Unix), default is OS-dependent
  • ind: indentation string (default is 3 spaces)
  • log (INFO): a logging level, possible values are TRACE, INFO, WARN, ERROR

Renaming identifiers

Some obfuscators give classes and their member elements short, meaningless and above all ambiguous names. Recompiling of such code leads to a great number of conflicts. Therefore it is advisable to let the decompiler rename elements in its turn, ensuring uniqueness of each identifier.

Option 'ren' (i.e. -ren=1) activates renaming functionality. Default renaming strategy goes as follows:

  • rename an element if its name is a reserved word or is shorter than 3 characters
  • new names are built according to a simple pattern: (class|method|field)_
    You can overwrite this rules by providing your own implementation of the 4 key methods invoked by the decompiler while renaming. Simply pass a class that implements org.jetbrains.java.decompiler.main.extern.IIdentifierRenamer in the option 'urc' (e.g. -urc=com.example.MyRenamer) to Fernflower. The class must be available on the application classpath.

The meaning of each method should be clear from naming: toBeRenamed determine whether the element will be renamed, while the other three provide new names for classes, methods and fields respectively.

Comments
  • invalid constant type Error

    invalid constant type Error

    Hi, Your product has performed very well among the available options, but there are some problems when using it, which I request you to check and fix. like the: INFO: Decompiling class com/adventnet/client/components/table/pdf/PropertySheetRenderer WARN: Method getDollarReqParams (Ljava/lang/String;Lcom/adventnet/client/view/web/ViewContext;)Ljava/lang/String; in class com/adventnet/client/components/table/template/FillTable couldn't be written. java.lang.RuntimeException: invalid constant type: Ljava/lang/Object; at org.jetbrains.java.decompiler.modules.decompiler.exps.ConstExprent.toJava(ConstExprent.java:347) at org.jetbrains.java.decompiler.modules.decompiler.exps.AssignmentExprent.toJava(AssignmentExprent.java:146) at org.jetbrains.java.decompiler.modules.decompiler.ExprProcessor.listToJava(ExprProcessor.java:858) at org.jetbrains.java.decompiler.modules.decompiler.stats.BasicBlockStatement.toJava(BasicBlockStatement.java:65) at org.jetbrains.java.decompiler.modules.decompiler.stats.IfStatement.toJava(IfStatement.java:199) at org.jetbrains.java.decompiler.modules.decompiler.ExprProcessor.jmpWrapper(ExprProcessor.java:796) at org.jetbrains.java.decompiler.modules.decompiler.stats.SequenceStatement.toJava(SequenceStatement.java:111) at org.jetbrains.java.decompiler.modules.decompiler.ExprProcessor.jmpWrapper(ExprProcessor.java:796) at org.jetbrains.java.decompiler.modules.decompiler.stats.CatchStatement.toJava(CatchStatement.java:178) at org.jetbrains.java.decompiler.modules.decompiler.stats.RootStatement.toJava(RootStatement.java:37) at org.jetbrains.java.decompiler.main.ClassWriter.methodToJava(ClassWriter.java:1084) at org.jetbrains.java.decompiler.main.ClassWriter.classToJava(ClassWriter.java:334) at org.jetbrains.java.decompiler.main.ClassesProcessor.writeClass(ClassesProcessor.java:480) at org.jetbrains.java.decompiler.main.Fernflower.getClassContent(Fernflower.java:156) at org.jetbrains.java.decompiler.struct.ContextUnit.lambda$save$0(ContextUnit.java:179) at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

    bug Priority: High Subsystem: Variables 
    opened by sayyad84 7
  • JDK-19 adds `String::valueOf` calls to string concatenation

    JDK-19 adds `String::valueOf` calls to string concatenation

    With https://github.com/openjdk/jdk/commit/cfee4512f7048e9cf440078e9eb87d37c7ebcdd9 extra String::valueOf calls are inserted for objects passed to makeConcatWithConstants. Quiltflower should remove these for better readability.

    enhancement good first issue Subsystem: Statement Structure Priority: Low 
    opened by skyrising 6
  • Record pattern tests

    Record pattern tests

    Adds java 19 preview tests with record patterns. Most of these decompile fairly straightforwardly.

    The decompiled code is invalid as the proxy methods aren't shown, but still called. TestRecordPattern4.test2 is also wrong at the end, reusing var21 where it should not (should be the value of c, runs correctly).

    opened by l-Luna 4
  • fix: rename entities obfuscated class detection

    fix: rename entities obfuscated class detection

    Previously, it would not detect classes like a$a or aaa$aaa which caused some issues. I am not sure if a cache would be needed since I am using regex now. As an additional thought, the regex could be a cli paramater since names could be obfuscated differently.

    Fixes point 3 & possibly 2 of #112

    Subsystem: Writing Priority: High bugfix 
    opened by rushiiMachine 4
  • Random NPEs while decompiling

    Random NPEs while decompiling

    Here are some of the stacktraces Cannot read field "nested" because "parent_class" is null Three in a row

    I haven't managed to reproduce any of these I was using Quiltflower 1.4.1 with fabric-loom 0.7 with this

    buildscript {
        repositories {
            mavenCentral()
            maven {
                name 'Fabric'
                url 'https://maven.fabricmc.net/'
            }
            mavenLocal()
        }
        dependencies {
            classpath (group: 'fabric-loom', name: 'fabric-loom.gradle.plugin', version: '0.7-SNAPSHOT') { // From Fabric
                exclude group: 'net.fabricmc', module: 'fabric-fernflower'
            }
            classpath 'org.quiltmc:quiltflower:1.4.1+local' // From mavenLocal
        }
    }
    
    opened by ByMartrixx 4
  • Latest IJ plugin fails to download the quiltflower decompiler

    Latest IJ plugin fails to download the quiltflower decompiler

    Env

    IntelliJ IDEA 2022.3 RC (Ultimate Edition)
    Build #IU-223.7571.123, built on November 23, 2022
    macOS 12.5
    net.earthcomputer.quiltflowerintellij (1.0.4)
    Kotlin: 223-1.7.20-release-201-IJ7571.123
    

    Getting the following error

    java.lang.Throwable: Failed to download quiltflower 1.8.1 from https://maven.quiltmc.org/repository/snapshot/org/quiltmc/quiltflower/1.8.1-SNAPSHOT/quiltflower-1.8.1.jar: 404
    	at com.intellij.openapi.diagnostic.Logger.error(Logger.java:202)
    	at net.earthcomputer.quiltflowerintellij.QuiltflowerState$downloadQuiltflower$1$future$1$1.invoke(QuiltflowerState.kt:162)
    	at net.earthcomputer.quiltflowerintellij.QuiltflowerState$downloadQuiltflower$1$future$1$1.invoke(QuiltflowerState.kt:122
    )
    
    opened by sureshg 3
  • Seemingly dangling file systems for input jars in 1.9.0

    Seemingly dangling file systems for input jars in 1.9.0

    The bug

    After updating LQF to Quiltflower 1.9.0 (and fixing a compilation error due to a rename), the LQF tests are failing with FileSystemExceptions on Windows.

    This only happens with the decompilation path using Loom's current decompilation API (Loom 0.11+), so the relevant code can be found in LQF's impl.modern.QuiltflowerDecompiler

    More specifically, when Loom tries to apply line mappings to the jar, it fails due to the compiled Minecraft jar "being in use by another process". This didn't happen in the previous commit where all tests succeeded.

        Caused by: java.io.UncheckedIOException: Failed to remap line numbers
        	at net.fabricmc.loom.task.GenerateSourcesTask$DecompileAction.doDecompile(GenerateSourcesTask.java:281)
        	at net.fabricmc.loom.task.GenerateSourcesTask$DecompileAction.execute(GenerateSourcesTask.java:224)
        	... 22 more
        Caused by: java.nio.file.FileSystemException: D:\a\LoomQuiltflower\LoomQuiltflower\build\tmp\test\work\.gradle-test-kit\caches\fabric-loom\1.16.5\net.fabricmc.yarn.1_16_5.1.16.5+build.10-v2\minecraft-merged-named.jar: The process cannot access the file because it is being used by another process
        	at net.fabricmc.loom.task.GenerateSourcesTask$DecompileAction.doDecompile(GenerateSourcesTask.java:278)
        	... 23 more
    

    Note that since this has happened before in some specific setups, I try to force-close any file systems pointing to the input jar, but that doesn't seem to help with this crash.

    Replacing deprecations?

    Avoiding using my own bytecode provider and the deprecated Fernflower constructor via reflection still didn't solve the issue: https://github.com/Juuxel/LoomQuiltflower/commit/85aa26b578e13785b4988b5d2d04187a02c6d1c1

    https://github.com/QuiltMC/quiltflower/blob/2124e6e0062c1ce266981c4c5aa47e40acef08a8/src/org/jetbrains/java/decompiler/main/Fernflower.java#L31-L36

    Even though the code should now run the upper constructor that doesn't use any of my code for reading the inputs, the tests still fail. This leads me to believe it's a QF regression.

    opened by Juuxel 3
  • Use SSAU to validate finally blocks with variables inside

    Use SSAU to validate finally blocks with variables inside

    This PR uses SSAU to resolve differences in variable indices between finally duplicated blocks. Also marks semaphore variables more clearly in the code.

    enhancement Subsystem: Statement Structure Priority: High 
    opened by SuperCoder7979 3
  • Decompiler produces an (illegal) switch expression where it doesn't makes sense

    Decompiler produces an (illegal) switch expression where it doesn't makes sense

    Source

      public void test(Object a) {
        switch (10000) {
          default: {
            Object vvv26 = null;
            while (vvv26 == null) {
            }
          }
          case -79:
            long vvv36 = -5851592879203823622L;
          case 320:
            if (a != null) {
              return;
            }
        }
        System.out.println("Hi");
      }
    

    Result:

       public void test(Object a) {
         long var4 = switch(10000) {
            case 320 -> {
            }
            default -> {
               Object vvv26 = null;
    
               while(vvv26 == null) {
               }
            }
            case -79 -> -5851592879203823622L;
         };
         if (a == null) {
            System.out.println("Hi");
         }
      }
    
    bug Subsystem: Statement Structure Priority: High 
    opened by Kroppeb 3
  • Fix loops from extending too far due to postdominance not discovering all possible nodes

    Fix loops from extending too far due to postdominance not discovering all possible nodes

    This PR fixes the longstanding bug where too many loops would get created due to an issue with postdominance not discovering all possible nodes to extend a new general statement over. It also adds new tracing over DomHelper to better trace it's logic and find problems. This PR also eliminates entirely the "baby shark" issue.

    Future work before this PR can be undrafted:

    • Find out why adding the loop body to the header's postdom set causes strange issues
    • Add comments explaining what everything is doing
    • Test on nested loops with switches. There are some weird regressions there (not in the test suite yet)
    • Remove debug code left in the classes
    enhancement Subsystem: Statement Structure Priority: Medium 
    opened by SuperCoder7979 3
  • Resolves #151: Remove Unnecessary String.valueOfs()

    Resolves #151: Remove Unnecessary String.valueOfs()

    Resolves: #151 Tests: attempted to test, IntelliJ kept skipping the test for some reason. Output: WARN: Invalid signature: SourceFile. Not sure what's up with that, but in any case I did my best with the code and hopefully it works. It's literally one line and while I saw something more fancy being done with the other String.valueOf() remover that seemed to depend on index and hopefully would be unnecessary for removing from parameters.

    @SuperCoder7979 let me know if this was what you wanted! Sorry, bit new to this 😅

    enhancement Subsystem: Statement Structure Priority: Medium 
    opened by thewindsofwinter 3
  • Method references referring to super methods decompile weirdly

    Method references referring to super methods decompile weirdly

    Method references referring to super methods seem to decompile weirdly. An easy-to-find example of this can be found in the gradle class org.gradle.api.internal.artifacts.DefaultArtifactRepositoryContainer. The source code in question can be found here: https://github.com/gradle/gradle/blob/3200a204ba96f503f1171b3584258a53ecd91bd2/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/DefaultArtifactRepositoryContainer.java#L38

    This initializer looks like this:

    private final Action<ArtifactRepository> addLastAction = DefaultArtifactRepositoryContainer.super::add;
    

    But is decompiled by quiltflower (I believe I have the most recent version; I am using the intellij plugin) as this:

    private final Action<ArtifactRepository> addLastAction = x$0 -> access$101(this, x$0);
    

    (access$101 is the name of the synthetic lambda method generated for the method reference)

    opened by lukebemish 0
  • Add long option names & update help message

    Add long option names & update help message

    This also may allow for easier work on combination flags, like perhaps a --no-removal which would apply --no-remove-bridge --no-remove-synthetic --no-remove-getclass --no-remove-empty-try-catch --no-remove-imports or something like that

    opened by sschr15 0
  • "Could not properly define all variable types" in decompiled Kotlin lambdas

    QF version: 1.9.0

    Some examples from Adorn code:

    AdornItemGroups
       // $QF: Could not properly define all variable types!
       // Please report this to the Quiltflower issue tracker, at https://github.com/QuiltMC/quiltflower/issues with a copy of the class file (if you have the rights to distribute it!)
       private final void addIngredients(ItemGroupBuildContext $this$addIngredients) {
          if ($this$addIngredients instanceof ItemGroupModifyContext var10000) {
             Item var10001 = Items.STICK;
             Intrinsics.checkNotNullExpressionValue(Items.STICK, "STICK");
             var10000.addAfter((ItemConvertible)var10001, CollectionsKt.listOf(AdornItems.INSTANCE.getSTONE_ROD()));
          } else {
             $this$addIngredients.add((ItemConvertible)AdornItems.INSTANCE.getSTONE_ROD());
          }
       }
    
    ItemGroupBridgeFabric
       // $QF: Could not properly define all variable types!
       // Please report this to the Quiltflower issue tracker, at https://github.com/QuiltMC/quiltflower/issues with a copy of the class file (if you have the rights to distribute it!)
       private static final void addItems$lambda_1/* $QF was: addItems$lambda-1*/(Function1 $configurator, final FabricItemGroupEntries entries) {
          Intrinsics.checkNotNullParameter($configurator, "$configurator");
          <undefinedtype> context = new ItemGroupModifyContext() {
             @Override
             public void add(@NotNull ItemConvertible item) {
                Intrinsics.checkNotNullParameter(item, "item");
                entries.add(item);
             }
    
             @Override
             public void addAfter(@NotNull ItemConvertible after, @NotNull List<? extends ItemConvertible> items) {
                Intrinsics.checkNotNullParameter(after, "after");
                Intrinsics.checkNotNullParameter(items, "items");
                FabricItemGroupEntries var10000 = entries;
                Collection $this$toTypedArray$iv = items;
                int $i$f$toTypedArray = 0;
                Object[] var10002 = $this$toTypedArray$iv.toArray(new ItemConvertible[0]);
                Intrinsics.checkNotNull(var10002, "null cannot be cast to non-null type kotlin.Array<T of kotlin.collections.ArraysKt__ArraysJVMKt.toTypedArray>");
                ItemConvertible[] var3 = (ItemConvertible[])var10002;
                var10000.addAfter(after, Arrays.copyOf((ItemConvertible[])var3, var3.length));
             }
          };
          $configurator.invoke(context);
       }
    

    Full output: https://gist.github.com/Juuxel/8abad176be25114fe4518bbf1c467be0

    Here are the class files: adorn-classes.zip

    opened by Juuxel 0
  • OR expression on ints produced from consecutive `ifne`s

    OR expression on ints produced from consecutive `ifne`s

    QF version: 1.9.0

    Extract from decompiled code:

          int var3 = 1;           // an int variable...
          int var4 = 0;
          var1 = 1;
          var2 = 1;
          var4 = 26;
          if (var3 || 1 == 0) {   // ...used in an OR expression?
    

    Relevant javap output:

            19: iload_3
            20: ifne          28
            23: ldc           #7                  // int 1
            25: ifne          41
    

    The class file was created using a custom compiler for Advent of Code 2016's day 12 challenge and its "assembunny" language.

    (It's the puzzle input compiled to JVM bytecode - if executed, the class will compute and print the answer to that day's part 2)

    bug Priority: Medium Subsystem: Variables Subsystem: Parsing 
    opened by Juuxel 0
  • Will there be a new version that supports Java 8

    Will there be a new version that supports Java 8

    Hello all,

    Recently, I was developing a project based on QuiltFlower, but because of some requirements, I had to use Java 8 to do it, so I was forced to downgrade to version 1.8.1 of QuiiltFlower. Will you provide a version that can run on Java 8 in the future?

    Kind Regards

    Priority: Low 
    opened by 4ra1n 1
Releases(1.9.0)
  • 1.9.0(Oct 28, 2022)

    Quiltflower 1.9.0 brings dozens of bug fixes, new features, improved decompilation, and an improved way to interact with the Quiltflower API. NOTE: This version requires a minimum of Java 11 to run!

    Some highlights include:

    • Improved switch pattern matching support
    • Changed default settings to improve code output by default
    • Fixed the "baby shark" bug (multiple nested infinite loops in a row)
    • Optimized memory, CPU, and disk usage

    Please report any issues at https://github.com/QuiltMC/quiltflower/issues. The full changelog for this version goes as follows:

    Click here to expand the full changelog
    • Added support for transitive and static modifiers in module info (Thanks kb1000!)
    • Added improved support for switch pattern matching (Thanks Luna!)
    • Added implementation version to manifest (Thanks nbauma109!)
    • Added some support for constant dynamic resugaring
    • Added lazy loading for classpath jars (Thanks, zml!)
    • Added new option to verify variable merges
    • Added new option to decompile preview features
    • Added support for decompiling out of executables
    • Enabled try loop fix by default
    • Enabled ternary conditions by default
    • Improved API for developer usability (Thanks, zml!)
    • Improved marking of monitorenter and monitorexit opcodes when they aren't resugared properly
    • Improved resugaring of switch expressions over enums
    • Improved default values in switch expressions
    • Improved tracking of assignments in try blocks
    • Improved Pi value parentheses
    • Improved rename entities iteration order to be sequential based on classes seen
    • Improved bytecode to line mappings
    • Improved the experimental try loop fix to extend to try-finally blocks
    • Improved help message when running through the command line (thanks sschr!)
    • Renamed $FF: tags in decompiled code to $QF:
    • Rewrote ternary processing code and made it much more accurate
    • Optimized code for speed and memory usage
    • Optimized file reading and parsing
    • Updated help message
    • Fixed most cases of longstanding issue where multiple nested infinite loops would be created
    • Fixed "invalid constant type" issue with variable merging
    • Fixed many subtle issues with code generation due to improper internal state management
    • Fixed some invalid code generation with assignments in if statements
    • Fixed if pattern matching shadowing already defined variables
    • Fixed do-while loops not being created when they are the last statement inside of an outer loop
    • Fixed finally blocks inside of loops causing a crash
    • Fixed methods and fields not getting renamed by rename entities
    • Fixed bogus var10000 variables showing up in some cases
    • Fixed catch blocks being removed entirely
    • Fixed Object[] not being casted correctly
    • Fixed CME in loop creation
    • Fixed synchronized statements not decompiling correctly when the last statement is a throw
    • Fixed finally blocks in loops causing improper break statements
    • Fixed extra parenthesis around array accesses
    • Fixed extra casts being applied in method calls when not needed
    • Fixed foreach loops being created when the iteration variable is used earlier
    • Fixed improper loop generation when the loop is the first block
    • Fixed returns in loops when breaks make more sense, in loops where it's the first block
    • Fixed finally blocks in synchronized statements causing crashes
    • Fixed assignments becoming improper inside of try blocks
    • Fixed some cases where booleans and ints would merge together
    • Fixed more cases of int x = true;
    • Fixed an infinite loop OOM combo with finally processing
    • Fixed synchronized statements not decompiling correctly when in a loop
    • Fixed arrays being initialized with char values instead of number literals
    • Fixed some cases of switch expressions being created when they shouldn't be
    • Fixed empty newlines at the end of sequence statements
    • Fixed static fields showing up before enum fields
    • Fixed some rare label issues with breaks out of try statements
    • Fixed some extraneous generic casts on assignments
    • Fixed some generic union type casts being improper
    • Fixed rare concurrency issues causing crashes
    • Fixed toString not removed in string concat (thanks, thewindsofwinter!)
    • Fixed incorrect assignment exprent modification for assignments with a condition (Thanks Totty!)
    • Fixed class cast exception when creating a foreach over array with multiple dimensions
    • Fixed NullPointerException when writing some switch on string statements
    • Merged from upstream: Fixed an infinite loop while decompiling obfuscated code
    • Fixed NullPointerException when parsing enum method descriptors
    • Fixed casts not being applied on byte->int coercion
    • Fixed casts not being applied on Object parameters
    • Fixed a few casts with anonymous classes
    Source code(tar.gz)
    Source code(zip)
    quiltflower-1.9.0.jar(973.91 KB)
  • 1.8.1(Apr 29, 2022)

  • 1.8.0(Apr 5, 2022)

    The changelog for this version is very long, so here are the highlights:

    • Improved the quality and cleanliness of the output
    • Many fixes to generics
    • Many fixes to loops
    • Dozens of bugs and crashes fixed
    Click here to expand the full changelog
    • Added ++/-- inlining when possible
    • Added variable renaming when there's multiple variables with the same name
    • Added switch statement brace enclosing when the multiple variables are in different case branches
    • Added switch expression in assert support
    • Added Implementation-Name: Quiltflower to jar manifest (thanks jnp!)
    • Added formatting on complex if-else chains (thanks Earthcomputer!)
    • Added basic switch pattern matching support for preview versions
    • Changed some default options: generic signatures and synthetic members are now hidden by default, pattern matching is enabled, and ternary-in-if is disabled
    • Improved default branch hiding on switches when it's an empty fallthrough
    • Improved generic casts on ternaries
    • Improved generic casts on assigns
    • Improved ternary type inference when one branch is null
    • Improved detection of explicit generic invocations, such as Comparator.<...>comparing()
    • Improved variable merging in loops (improved variable liveness calculation)
    • Improved if-else statement structure to prevent highly nested if-else statements
    • Improved conversion of labeled continues to breaks to produce correct but cleaner code
    • Improved if statements with a single labeled sequence by lifting the label to the if statement, making it clearer what is being jumped to by the label
    • Improved the experimental try loop fix, now works better and doesn't break on random code
    • Improved the IResultSaver API (thanks zml!)
    • Improved pattern matching significantly
    • Improved string concat support, now supports makeConcat as well as makeConcatWithConstants
    • Improved infinite loop with return at the end condensing significantly better
    • Improved labeled break -> continue resugaring
    • Optimized excess memory usage
    • Fixed <unknown> variables in foreach loops
    • Fixed null being cast when it doesn't need to be
    • Fixed constructor invocations having extra parenthesis
    • Fixed switch expressions not having parenthesis around them when they should
    • Fixed instances where variables were cast twice
    • Fixed switch statements in finally blocks causing issues
    • Fixed synchronized statements having a null argument when object is being assigned to null
    • Fixed synchronized statements removing autoboxing
    • Fixed method()[i] += 0; not being properly inlined
    • Fixed copying files to directories not working properly
    • Fixed boxing issues with field initializers
    • Fixed rare crashes with inconsistent idom sequences
    • Fixed continues becoming implicit when they should be explicit
    • Fixed local classes not decompiling breaking entire file
    • Fixed double brace initializers in java 17 placing extra modifiers on the braces
    • Fixed some cases where stack variables created by the dup bytecode family were not simplified
    • Fixed swap based constructor invocations
    • Fixed cases where while loops were improperly created, moving a continue out of the loop
    • Fixed case when there are 2 pops after a jump (thanks Kroppeb!)
    • Fixed expression reordering in array initializes resulting in semantically different code (thanks Kroppeb!)
    • Fixed phantom continue or break at the end of a loop
    • Fixed statement graph ordering being incorrect in certain cases
    • Fixed IndexOutOfBounds in ternary processing
    • Fixed statement graph not discovering all nodes, leading to <unknown> variables
    • Fixed improper loop elimination when the loop was required to make the output correct
    • Fixed generics not casting on super keyword (contravariance)
    • Fixed open file systems not being closed (thanks CoolMineman!)
    • Fixed decompilation error with kotlin when enums (thanks Juuz!)
    Source code(tar.gz)
    Source code(zip)
    quiltflower-1.8.0.jar(852.91 KB)
  • 1.7.0(Dec 7, 2021)

    • Added switch expression support
    • Added decompiled code formatting (Thanks Earthcomputer!)
    • Added proper try-with-resource return support
    • Fixed try with resources statements inlining statements when it shouldn't
    • Added comments to decompiled code when there are oddities, such as finally blocks failing to inline
    • Added support for eclipse switch-on-enum
    • Added bytecode dumping on error (Thanks skyrising!)
    • Added exception dumping on error (Thanks skyrising!)
    • Added link to Quiltflower issue tracker on error
    • Added toggle for override annotation
    • Improved linemapping
    • Improved initializers not being inlined when they needed a static qualification in a lambda (Thanks skyrising!)
    • Fixed empty infinite loops composed of 2+ gotos failing to decompile
    • Fixed decompiling from the command line creating files instead of folders
    • Fixed created jars having extra folder entries saved as files
    • Fixed certain errors being able to cause classes to not be decompiled
    • Fixed classes in pre 1.0 java not being parsed
    • Fixed enums being marked as sealed (Thanks skyrising!)
    • Fixed recursive lambdas causing stackoverflow
    • Fixed references to inner classes in other classes breaking the entire method
    Source code(tar.gz)
    Source code(zip)
    quiltflower-1.7.0.jar(816.98 KB)
  • 1.6.1(Nov 24, 2021)

  • 1.6.0(Nov 8, 2021)

    • Added try with resources support
    • Added if pattern matching support
    • Added ternary in if statement and loop support
    • Added ternary constant simplification (Thanks MatrixX!)
    • Added bytecode and exception in errored methods
    • Added support for polymorphic methodhandles (Thanks skyrising!)
    • Added the "DOT_ERROR_EXPORT_DIR" option to dump graphs only in errored methods
    • Added local record and enum support (Thanks MatrixX!)
    • Added some warnings for when known invalid code was produced, such as synchronize over null
    • Added some explicit exceptions for some NPEs and IOOBEs
    • Added ability to use just the java runtime as a library instead of the entire classpath (Thanks skyrising!)
    • Added multiple new decompiler options
    • Improved some control flow around returns and exceptions
    • Fixed empty for loops being made when they were empty, now they're while loops
    • Fixed decompiling of default record methods
    • Fixed empty infinite loops not being decompiled
    • Fixed assignments in final fields being inlined when they shouldn't be
    • Fixed loops being while(true) when they were regular loops
    • Fixed rare crash where long was incorrectly typed
    • Fixed bug with casts and parenthesis
    • Fixed invalid zip file creation (Thanks Geolykt!)
    • Fixed IOOBE with sequence inlining
    • Fixed local classes with lvt capture crashing (Thanks MatrixX!)
    • Fixed some foreach loops with generics having a variable type of
    • Fixed rare NPE with default case in switch over string
    • Fixed private interface methods having default modifier
    • Fixed classes in default package having a leading dot
    • Fixed local classes being put in the wrong location (Thanks skyrising!)
    • Fixed fields with lambdas capturing the enclosing class being moved to static blocks (Thanks skyrising!)
    • Fixed some unboxing casts being removed with generic variables (Thanks skyrising!)
    • Fixed crash with array initializers in static blocks trying to be inlined
    • Optimized code (Thanks Kroppeb and skyrising!)
    Source code(tar.gz)
    Source code(zip)
    quiltflower-1.6.0.jar(783.88 KB)
  • 1.5.0(Jun 15, 2021)

    • Added override annotation support
    • Added more support for uninlining pi constants (Thanks Will BL!)
    • Improved handling of methods with same name and descriptor (Thanks skyrising!)
    • Improved performance of loading library code (Thanks skyrising!)
    • Fixed empty string concatenation
    • Fixed generic parameter crash
    • Fixed Objects.requireNonNull not being removed when they should be
    • Fixed chars being used for arithmetic operations and returns
    • Fixed compound assignments such as += and *= not being created
    • Fixed random crashes occurring during decompilation (#13)
    Source code(tar.gz)
    Source code(zip)
    quiltflower-1.5.0.jar(738.47 KB)
  • 1.4.0(May 28, 2021)

Owner
null
This is a sample application demonstrating Quarkus features and best practices

Quarkus Superheroes Sample Table of Contents Introduction Project automation GitHub action automation Application Resource Generation Running Locally

QuarkusIO 123 Jan 6, 2023
Spigot plugin featuring a wide variety of features for a server based on modules.

CTSNC, standing for Custom Chat, Tablist, Scoreboard, NameTag & Chat, is a all-round solution based on multiple modules each featuring a dedicated function while CTSNC acts as the core. Here all configuration files are housed for easy management and customization.

null 2 Dec 30, 2022
An easy to use Hindi keyboard Android app

AasaanHindi-Keyboard-app An easy to use Hindi keyboard Android app. Easy and fast Hindi typing.

Ankit Kumar 1 Jan 20, 2022
A Fast, Secure, Ready to use, Highly customizable email verifier API

Email verification API What is this? A Fast, Secure, Ready to use, Highly customizable email verifier API. How to use Clone the project git clone http

Amir 3 Oct 4, 2022
Lightweight and easy-to-use SkinChangerAPI for Bukkit plugin

Lightweight and easy-to-use SkinChangerAPI for Bukkit plugin

Gabriel MERCIER 6 Jul 1, 2022
lobster is an easy-to-use Discord bot to play music in any voice channel

lobster is an easy-to-use Discord bot to play music in any voice channel

lundy 6 Apr 8, 2022
Fork of JProcesses with additional features and enhancements. Get cross-platform process details in Java.

Fork of JProcesses with additional features and enhancements. Get cross-platform process details in Java. Add this as dependency to your project via Maven/Gradle/Sbt/Leinigen (requires Java 7 or higher).

Osiris-Team 4 Mar 17, 2022
Use Quilt Mappings on Loom

Quilt Mappings on Loom The time has finally arrived! Quilt Mappings are now usable in Loom! Ever wanted to use mappings other than Yarn or MojMap? Qui

null 15 Dec 7, 2022
kotlin decompiler based on quiltflower

Quiltflower Quiltflower is a fork of Fernflower and ForgeFlower adding additional features for use with the Quilt toolchain. Changes include: Javadoc

Joseph Burton 39 Jan 8, 2023
A TestNG like dataprovider runner for JUnit with many additional features

junit-dataprovider Have a look to this repositories Wiki pages for documenation, usage examples and further information. Table of contents Home What i

TNG Technology Consulting GmbH 237 Sep 7, 2022
DataFX - is a JavaFX frameworks that provides additional features to create MVC based applications in JavaFX by providing routing and a context for CDI.

What you’ve stumbled upon here is a project that intends to make retrieving, massaging, populating, viewing, and editing data in JavaFX UI controls ea

Guigarage 110 Dec 29, 2022
To quickly integrate your applications into the EdgeGallery platform, we provide the toolchain project to help developers quickly modify code and migrate applications to the platform.

Toolchain 工具链 工具链是MEC Developer开发者平台中的一个重要特性,当x86平台的App想要上车ARM平台时,底层的代码不可避免的需要进行修改或重写。 App提供者可以通过MEC Developer开发者平台中集成的工具链进行源代码分析,定位需要修改的源代码并根据指导意见进行修

EdgeGallery 19 Jan 7, 2022
A toolchain for Minecraft: Java Edition that builds a workspace to interact with the game using the official mappings provided to the public by Mojang Studios.

VanillaGradle is a toolchain for Minecraft: Java Edition that provides a workspace to interact with the game using official mappings provided by Mojan

SpongePowered 75 Nov 22, 2022
JMusic bot fork with new features and fixes

JMusicBot-Fork (by d1m0s23) A cross-platform Discord music bot with a clean interface, and that is easy to set up and run yourself! ?? SetupPage Fork

d1m0s23 24 Nov 18, 2022
Official Quilt template mod.

Quilt Template Mod The official Quilt template Mod. You can use it as a template for your own mods! Usage In order to use this mod as a template: Crea

null 117 Jan 2, 2023
Official Quilt template mod.

Quilt Template Mod The official Quilt template Mod. You can use it as a template for your own mods! Usage In order to use this mod as a template: Crea

null 32 May 7, 2022
A minimal sit mod for Fabric & Quilt using Polymer.

Polysit A polymer-based server-side sit mod for Fabric & Quilt! How to Use? Requirements: Minecraft 1.18.2 Polymer Polysit One of either mod loader: Q

The Glitch 5 Jun 30, 2022
Controls for adding Parallax effects for Java (JavaFX)

FXParallax Parallax framework for Java (JavaFX). This framework adds controls to add Parallax effects to JavaFX application, this effect can add a sen

Pedro Duque Vieira 36 Sep 30, 2022