github Vineflower/vineflower 1.12.0
Vineflower 1.12.0

4 hours ago

Vineflower 1.12.0 is the next major release of Vineflower, improving how variables are handled, beautifying the decompiler output, improving Kotlin support, as well as dozens of bug fixes and smaller features. Thanks to all the contributors who submitted patches for this release!

NOTE
This release contains two different jars. The "regular" jar, with no classifier, contains both the main decompiler and the three bundled plugins. The "slim" jar, with the "-slim" classifier, contains only the main decompiler itself. If confused, just get the regular jar as usual.

The full changelog is as follows:

Click here to expand the full changelog
  • Added flag to verify different types of variable merges
  • Added system to check for malformed generic types
  • Added support for ranges in Kotlin loops
  • Added API support for Markdown javadoc
  • Added compact canonical constructor support for records (Thanks, Owen!)
  • Reduced Kotlin plugin file size
  • Fixed line mapping for some field initializers being dropped
  • Removed semicolons in Kotlin code
  • Added prettifier for if-else statements that removes else statements when the if body unconditionally returns
  • Fixed writing of labels in Kotlin
  • Added --method-to-decompile option to specify a single method in a class to decompile
  • Fixed inner interfaces and enums including redundant public and static keywords (Thanks, Owen!)
  • Fixed specifying with --only and a single source causing the source to be treated as an output (Thanks, sciwhiz!)
  • Added Automatic-Module-Name to jar (Thanks, TropheusJ!)
  • Added support for eclipse switch-on-string (Thanks, aoqia!)
  • Added support for Kotlin lambdas and anonymous objects
  • Improved heuristic for detecting for loops, now loops aren't created where the initial variable isn't used in the condition
  • Added more hooks for the plugin API
  • Fixed ConcurrentModificationException in lambda processing
  • Fixed exception variables losing their variable names
  • Fixed variables with no uses losing their local variable names
  • Fixed some record pattern matches losing their local variable names
  • Fixed generic parsing issues in Kotlin
  • Improved inference of variable types based on use site
  • Removed redundant primitive casts
  • Fixed integers constants turning into chars in switch expressions and ternaries
  • Fixed recursive writing due to inlining returns into switch expressions
  • Improved method renaming when illegal characters are used
  • Fixed variables with illegal names from being written
  • Added comma separation support for --only and -e
  • Fixed non-class entries not being written when using --only
  • Fixed ambiguous vararg calls not emitting casts, leading to wrong method being picked
  • Fixed IndexOutOfBoundsException when writing generic method calls
  • Fixed string concat with one string not being recognized
  • Fixed crash when writing constantdynamic values in invokedynamic calls
  • Fixed redundant variable definitions before switch expressions (Thanks, coehlrich!)
  • Fixed some overwritten variables used later incorrectly being dropped (Thanks, coehlrich!)
  • Fixed bytecode offsets being dropped for monitorexit
  • Fixed writing text token types for type annotations
  • Fixed multi-exception catches losing the last type
  • Fixed multi-exception catches being written in the wrong order
  • Fixed LVT names being used when LVT names are disabled
  • Fixed parsing error with breaks inside a finally
  • Optimized decompiling methods with try with resources
  • Fixed infinite loop in generic mapping
  • Remapped Kotlin plugin's metadata classes to a Vineflower package to avoid conflicts
  • Enabled using the java runtime by default
  • Fixed type annotations on records
  • Fixed record pattern matching not being recognized in some cases (Thanks, coehlrich!)
  • Removed more synthetic Objects.requireNonNull generated by javac
  • Removed synthetic variables emitted before lambdas (Thanks, coehlrich!)
  • Fixed invalid ++/-- created with floats and doubles
  • Fixed assert statements being improperly resugared in some cases
  • Added option for only decompiling methods based on aregular expression
  • Fixed crash when encountering MethodType constant pool entries
  • Fixed some improper clashing variable remapping (Thanks, coehlrich!)
  • Fixed for each loop being improperly created when iterator is used afterwards
  • Fixed finally blocks being improperly decompiled in Kotlin
  • Fixed crash due to improper statement graph after loop elimination
  • Added support for Kotlin's infix functions and properties
  • Added support for Kotlin's multifile classes
  • Fixed iinc opcode causing improper output for finally blocks
  • Fixed empty super() not being removed when it's not the first statement in constructor
  • Fixed dropped code when using ternaries in a foreach loop
  • Fixed pattern match variables being renamed (Thanks, coehlrich!)
  • Fixed user written variables with no use being dropped in Kotlin code
  • Fixed some ++/-- and ternaries not being recognized in Kotlin code
  • Fixed some switch-on-string not being recognized (Thanks, aoqia!)
  • Fixed some switch pattern matches with return not removing synthetic outer loop (Thanks, coehlrich!)
  • Fixed returns in try-finally code not being inlined (Thanks, coehlrich!)
  • Fixed returns in try-with-resources code not being inlined (Thanks, coehlrich and jaidaken!)
  • Fixed switch expressions not being inlined when none of the cases have a yield (Thanks, coehlrich!)
  • Fixed switch-on-string with null cases crashing
  • Fixed many NullPointerExceptions and IndexOutOfBoundsExceptions

Please report any issues to https://github.com/Vineflower/vineflower/issues!

Don't miss a new vineflower release

NewReleases is sending notifications on new releases.