Quiltflower 1.8.0
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!)