<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.0">Jekyll</generator><link href="https://www.cadixdev.org/feed.xml" rel="self" type="application/atom+xml" /><link href="https://www.cadixdev.org/" rel="alternate" type="text/html" /><updated>2021-02-18T15:24:56+00:00</updated><id>https://www.cadixdev.org/feed.xml</id><title type="html">Cadix Development Team</title><subtitle>We develop software for examining Java software, in both binary and source form - with a particular focus on obfuscated software.</subtitle><entry><title type="html">Atlas 0.2.2</title><link href="https://www.cadixdev.org/atlas/release/2021/02/10/atlas-0.2.2.html" rel="alternate" type="text/html" title="Atlas 0.2.2" /><published>2021-02-10T20:21:00+00:00</published><updated>2021-02-10T20:21:00+00:00</updated><id>https://www.cadixdev.org/atlas/release/2021/02/10/atlas-0.2.2</id><content type="html" xml:base="https://www.cadixdev.org/atlas/release/2021/02/10/atlas-0.2.2.html">&lt;p&gt;Atlas 0.2.2 implements new features introduced with Bombe 0.3.5, and
makes it easier to use Atlas to merely analyse artefacts.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;JarEntryTransformer#additions()&lt;/code&gt; is now supported&lt;/li&gt;
  &lt;li&gt;It is now possible to just ‘process’ a JAR file, where writing it to
file is not desired.&lt;/li&gt;
&lt;/ul&gt;</content><author><name></name></author><category term="atlas" /><category term="release" /><summary type="html">Atlas 0.2.2 implements new features introduced with Bombe 0.3.5, and makes it easier to use Atlas to merely analyse artefacts.</summary></entry><entry><title type="html">Bombe 0.3.5 and 0.4.4</title><link href="https://www.cadixdev.org/bombe/release/2021/02/09/bombe-0.3.5-and-0.4.4.html" rel="alternate" type="text/html" title="Bombe 0.3.5 and 0.4.4" /><published>2021-02-09T17:48:00+00:00</published><updated>2021-02-09T17:48:00+00:00</updated><id>https://www.cadixdev.org/bombe/release/2021/02/09/bombe-0.3.5-and-0.4.4</id><content type="html" xml:base="https://www.cadixdev.org/bombe/release/2021/02/09/bombe-0.3.5-and-0.4.4.html">&lt;p&gt;Bombe 0.3.5 and 0.4.4 are small releases introducing some new APIs to bolster the
capabilities of the jar transformation framework, namely allowing entries to be
introduced. To accomplish this, a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;JarEntryTransformer#additions()&lt;/code&gt; method has
been introduced.&lt;/p&gt;

&lt;p&gt;The remapping transformer will additionally strip signature files and entries
in the manifest. This transformer may in future be available standalone.&lt;/p&gt;

&lt;h2 id=&quot;bombe-035&quot;&gt;Bombe 0.3.5&lt;/h2&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Jars&lt;/code&gt; utility has been deprecated in this version, advising consumers to
switch to Atlas. Jars was removed in 0.4.0, so this just serves as a final
notice to any lingering applications using the utility. Despite the deprecation,
support for the new additions API has been implemented.&lt;/p&gt;</content><author><name></name></author><category term="bombe" /><category term="release" /><summary type="html">Bombe 0.3.5 and 0.4.4 are small releases introducing some new APIs to bolster the capabilities of the jar transformation framework, namely allowing entries to be introduced. To accomplish this, a JarEntryTransformer#additions() method has been introduced.</summary></entry><entry><title type="html">Lorenz 0.5.7</title><link href="https://www.cadixdev.org/lorenz/release/2021/02/01/lorenz-0.5.7.html" rel="alternate" type="text/html" title="Lorenz 0.5.7" /><published>2021-02-01T15:12:00+00:00</published><updated>2021-02-01T15:12:00+00:00</updated><id>https://www.cadixdev.org/lorenz/release/2021/02/01/lorenz-0.5.7</id><content type="html" xml:base="https://www.cadixdev.org/lorenz/release/2021/02/01/lorenz-0.5.7.html">&lt;h2 id=&quot;fixes&quot;&gt;Fixes&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;CSRG and TSRG now ignore package mappings, rather than erroneously reading them
as class mappings.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MappingSet#deobfuscate(FieldType)&lt;/code&gt; will now correctly de-obfuscate object types
of inner classes, where the parent class has a mapping - but the inner class
does not.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/CadixDev/Lorenz/issues/29&quot;&gt;GH-29&lt;/a&gt;: Avoid inheriting field mappings from a parent where the child class has
a field of its own, of the same signature.&lt;/li&gt;
&lt;/ul&gt;</content><author><name></name></author><category term="lorenz" /><category term="release" /><summary type="html">Fixes</summary></entry><entry><title type="html">Atlas 0.2.1</title><link href="https://www.cadixdev.org/atlas/release/2021/01/30/atlas-0.2.1.html" rel="alternate" type="text/html" title="Atlas 0.2.1" /><published>2021-01-30T02:40:00+00:00</published><updated>2021-01-30T02:40:00+00:00</updated><id>https://www.cadixdev.org/atlas/release/2021/01/30/atlas-0.2.1</id><content type="html" xml:base="https://www.cadixdev.org/atlas/release/2021/01/30/atlas-0.2.1.html">&lt;p&gt;Atlas 0.2.1 provides some quality-of-life features designed to make Atlas more configurable and accountable.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Execeptions will no longer be dismissed when transforming, and rather rethrown (as was my intention).&lt;/li&gt;
  &lt;li&gt;Output jars will be repackaged to ensure that the manifest is read by JarInputStream correctly.&lt;/li&gt;
  &lt;li&gt;Atlases can specify their own ExecutorService to use, or their parallelism level if using our provided constructors.&lt;/li&gt;
&lt;/ul&gt;</content><author><name></name></author><category term="atlas" /><category term="release" /><summary type="html">Atlas 0.2.1 provides some quality-of-life features designed to make Atlas more configurable and accountable.</summary></entry><entry><title type="html">Lorenz 0.5.6</title><link href="https://www.cadixdev.org/lorenz/release/2020/11/27/lorenz-0.5.6.html" rel="alternate" type="text/html" title="Lorenz 0.5.6" /><published>2020-11-27T20:37:00+00:00</published><updated>2020-11-27T20:37:00+00:00</updated><id>https://www.cadixdev.org/lorenz/release/2020/11/27/lorenz-0.5.6</id><content type="html" xml:base="https://www.cadixdev.org/lorenz/release/2020/11/27/lorenz-0.5.6.html">&lt;h2 id=&quot;configurable-parallelism-during-mapping-merges&quot;&gt;Configurable Parallelism during mapping merges&lt;/h2&gt;

&lt;p&gt;The mapping merging system introduced in 0.5.4 merges mappings in parallel - which in quick testing can
improve the merge time by half. There may be cases where the max number of threads needs to be controlled.
One common example is debugging Lorenz itself, having multiple merge threads running at once can make
debugging a lot more difficult.&lt;/p&gt;

&lt;p&gt;This release just adds one new method to &lt;a href=&quot;https://github.com/CadixDev/Lorenz/blob/49be5233bff0adfaf59440ac37efdeccbb2893da/lorenz/src/main/java/org/cadixdev/lorenz/merge/MergeConfig.java&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MergeConfig&lt;/code&gt;&lt;/a&gt;:
&lt;a href=&quot;https://github.com/CadixDev/Lorenz/blob/49be5233bff0adfaf59440ac37efdeccbb2893da/lorenz/src/main/java/org/cadixdev/lorenz/merge/MergeConfig.java#L84-L95&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;getParallelism()&lt;/code&gt;&lt;/a&gt;.
Set this value using the new &lt;a href=&quot;https://github.com/CadixDev/Lorenz/blob/49be5233bff0adfaf59440ac37efdeccbb2893da/lorenz/src/main/java/org/cadixdev/lorenz/merge/MergeConfig.java#L185-L202&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;withParallelism()&lt;/code&gt;&lt;/a&gt;
method. Check the javadocs for more info.&lt;/p&gt;

&lt;h2 id=&quot;allow-arbitrary-indexes-for-parameter-mappings&quot;&gt;Allow arbitrary indexes for parameter mappings&lt;/h2&gt;

&lt;p&gt;Method mappings may now contain parameter mappings for arbitrary indexes, rather than being constrained to
between 0 and the number of parameters in the method signature. This is nice from a general flexibility
perspective as Lorenz is only a container and isn’t intended for validating mappings, but also fixes the issue
where Lorenz can’t read mappings which using 1-indexed method parameters for instance methods. With this change
it’s up to the user to decide how to use parameter mappings, Lorenz doesn’t dictate anything one way or the
other (just like the other mapping types).&lt;/p&gt;

&lt;p&gt;Any code which worked with Lorenz before will still continue to work, as this change only removes constraints
which used to be present. If some code was written which relied on the existing index checks then this will
technically be a breaking change, as you’ll need to handle those checks yourself. That is likely to be a minor
edge case however, so this is still considered a minor release.&lt;/p&gt;</content><author><name></name></author><category term="lorenz" /><category term="release" /><summary type="html">Configurable Parallelism during mapping merges</summary></entry><entry><title type="html">Lorenz 0.5.5</title><link href="https://www.cadixdev.org/lorenz/release/2020/11/07/lorenz-0.5.5.html" rel="alternate" type="text/html" title="Lorenz 0.5.5" /><published>2020-11-07T13:03:00+00:00</published><updated>2020-11-07T13:03:00+00:00</updated><id>https://www.cadixdev.org/lorenz/release/2020/11/07/lorenz-0.5.5</id><content type="html" xml:base="https://www.cadixdev.org/lorenz/release/2020/11/07/lorenz-0.5.5.html">&lt;h2 id=&quot;writer-configurations&quot;&gt;Writer configurations&lt;/h2&gt;

&lt;p&gt;Writer configurations are a powerful new feature that allows the output of
mappings writers to be fine-tuned as consumers would like. Currently, this
is limited to:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The sorting functions used to write mappings for classes, fields, and
methods.&lt;/li&gt;
  &lt;li&gt;The API is open-ended, so there is potential for further additions to be
made.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Writer configurations can be created fluently through use the provided
builder, which includes our default implementations.&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MappingsWriterConfig&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MappingsWriterConfig&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;builder&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;classMappingComparator&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Comparator&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;comparing&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;Mapping:&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getFullObfuscatedName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;))&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;fieldMappingComparator&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Comparator&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;comparing&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;Mapping:&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getFullObfuscatedName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;))&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;methodMappingComparator&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Comparator&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;comparing&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;Mapping:&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getFullObfuscatedName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;))&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;They are applied to a mappings writer by use of the new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#setConfig&lt;/code&gt; method,
and can be retrieved through the corresponding &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#getConfig()&lt;/code&gt; method.&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;writer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setConfig&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;MappingsWriterConfig&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;builder&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;fixes&quot;&gt;Fixes&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;The Kin mapping writer now produces consistent output, sorting the
mappings as per the provided comparators. Output is also now rid of ‘junk’
mappings (those without valid children mappings, or a de-obf mapping of
their own).&lt;/li&gt;
&lt;/ul&gt;</content><author><name></name></author><category term="lorenz" /><category term="release" /><summary type="html">Writer configurations</summary></entry><entry><title type="html">licenser 0.5.0</title><link href="https://www.cadixdev.org/gradle/release/2020/10/04/licenser-0.5.0.html" rel="alternate" type="text/html" title="licenser 0.5.0" /><published>2020-10-04T22:15:00+00:00</published><updated>2020-10-04T22:15:00+00:00</updated><id>https://www.cadixdev.org/gradle/release/2020/10/04/licenser-0.5.0</id><content type="html" xml:base="https://www.cadixdev.org/gradle/release/2020/10/04/licenser-0.5.0.html">&lt;p&gt;We have made the first release of &lt;a href=&quot;https://github.com/CadixDev/licenser&quot;&gt;licenser&lt;/a&gt; under the Cadix Development organisation,
which brings the project up-to-date and ready for changes being made to Gradle in 7.0.&lt;/p&gt;

&lt;h2 id=&quot;usage&quot;&gt;Usage&lt;/h2&gt;

&lt;div class=&quot;language-gradle highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;plugins&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'org.cadixdev.licenser'&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'0.5.0'&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;future&quot;&gt;Future&lt;/h2&gt;

&lt;p&gt;In future, we would like to look at migrating our Gradle plugins over to Kotlin - a
type-safe language still preserving the lack of great boilerplate using Java, that
seems to be the direction that Gradle is heading towards.&lt;/p&gt;

&lt;p&gt;This will be a good opportunity to review functionality in our plugins, and work with
our communities to resolve long-term frustrations with our projects.&lt;/p&gt;

&lt;p&gt;A more broad goal is to introduce further configuration to allow fine-tuning of our
plugins across-the-board, sparked by &lt;a href=&quot;https://github.com/CadixDev/gitpatcher/issues/4&quot;&gt;lack therefor in gitpatcher&lt;/a&gt;.&lt;/p&gt;</content><author><name></name></author><category term="gradle" /><category term="release" /><summary type="html">We have made the first release of licenser under the Cadix Development organisation, which brings the project up-to-date and ready for changes being made to Gradle in 7.0.</summary></entry><entry><title type="html">Lorenz 0.5.4</title><link href="https://www.cadixdev.org/lorenz/release/2020/08/25/lorenz-0.5.4.html" rel="alternate" type="text/html" title="Lorenz 0.5.4" /><published>2020-08-25T03:48:00+00:00</published><updated>2020-08-25T03:48:00+00:00</updated><id>https://www.cadixdev.org/lorenz/release/2020/08/25/lorenz-0.5.4</id><content type="html" xml:base="https://www.cadixdev.org/lorenz/release/2020/08/25/lorenz-0.5.4.html">&lt;p&gt;Lorenz 0.5.4 includes yet-more bug fixes, and a new (and vastly more powerful)
mapping merging API.&lt;/p&gt;

&lt;p&gt;The ProGuard mapping reader now also reads field types.&lt;/p&gt;

&lt;p&gt;The Bombe dependency has been bumped to 0.3.4, resolving a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NullPointerException&lt;/code&gt;
that would occur when using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ClassLoaderClassProvider&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;merging&quot;&gt;Merging&lt;/h2&gt;

&lt;p&gt;Lorenz now has a new mappings merging API which aims at fulfilling 3 main goals:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Improve the output of the merging operation significantly, supporting many more edge cases and handling merges
with less complete mapping sets.&lt;/li&gt;
  &lt;li&gt;Allow configuring (to some degree) the merging process to control some aspects of the default merge process.&lt;/li&gt;
  &lt;li&gt;Provide an API which is extensible and modifiable at multiple levels to enable custom merge situations.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There are a limited number of possible edge cases one would expect to run into when merging, so we laid them all out
and made decisions on how best to handle them in the default case. Due to the extensible API users can override and
change any of the default behavioe as necessary. The default behavior is laid out as follows:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Left&lt;/th&gt;
      &lt;th&gt;Right&lt;/th&gt;
      &lt;th&gt;Output&lt;/th&gt;
      &lt;th&gt;Note&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;A -&amp;gt; B&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;B -&amp;gt; C&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;A -&amp;gt; C&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Typical case, easiest to handle&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;A -&amp;gt; B&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;em&gt;Missing&lt;/em&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;A -&amp;gt; B&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Standalone mappings get copied&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;em&gt;Missing&lt;/em&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;B -&amp;gt; C&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;B -&amp;gt; C&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;Standalone mappings get copied&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;A -&amp;gt; B&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;X -&amp;gt; Y&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;A -&amp;gt; B&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;X -&amp;gt; Y&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;This is no different than the 2 above cases with missing mappings on each side. This is just meant to be a further example that if two unrelated mappings are present, a standard merger won’t know how to handle them other than copying both.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;A -&amp;gt; B&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;A -&amp;gt; C&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;A -&amp;gt; C&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;By default the right mapping is considered the “most up to date” mappings, so in the case where both mapping sets provide mappings for the same obfuscated name, the right mapping is used in the default implementation.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;A -&amp;gt; B&lt;/code&gt; (types)&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;B -&amp;gt; B&lt;/code&gt; (types) and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;A -&amp;gt; C&lt;/code&gt; (names)&lt;/td&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;A -&amp;gt; B&lt;/code&gt; (types) and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;A -&amp;gt; C&lt;/code&gt; (names)&lt;/td&gt;
      &lt;td&gt;This is an example of a special case situation where the left mapping only maps types, then the second mapping set only maps members, but from the expectation that the first mapping set was already applied. The default implementation should handle this case correctly.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;blockquote&gt;
  &lt;p&gt;How to read the above chart: Each mapping operation is made up of a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;left&lt;/code&gt; side and a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;right&lt;/code&gt; side. The chart
represents this with the directional arrow &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-&amp;gt;&lt;/code&gt;. Merge operations in the table apply to any individual mapping,
not the whole mapping set. That is, a field name mapping merging with another field name, or a class name merging
with another class name.&lt;/p&gt;

  &lt;p&gt;Handling merges with less complete mappings sets are what is intended by the last row.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;directionality&quot;&gt;Directionality&lt;/h3&gt;

&lt;p&gt;It may seem a natural goal for merging mapping sets is for the merge operation to be commutative - in other words, when
merging &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;A -&amp;gt; B&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;B -&amp;gt; C&lt;/code&gt; you would get the same result as when merging &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C -&amp;gt; B&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;B -&amp;gt; A&lt;/code&gt; (except, reversed).&lt;/p&gt;

&lt;p&gt;This is true for &lt;em&gt;most&lt;/em&gt; cases, but for some special cases - most notably duplicate mappings - this property just can’t
be handled in any reasonable way. In these situations where a decision has to be made regarding whether to keep one
mapping or another (and neither being a better option by itself) we use the position of the mapping as the heuristic for
which one to keep.&lt;/p&gt;

&lt;p&gt;When merging &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;A -&amp;gt; B&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;B -&amp;gt; C&lt;/code&gt; the names you get in the output are &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;C&lt;/code&gt;. Because of this, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;right&lt;/code&gt; side of a merge
is considered the more correct set of names (since it is the output). If the merge operation were to be reversed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;A&lt;/code&gt;
would be preferred instead. Because of this it is important to consider which direction works best for you merge.&lt;/p&gt;

&lt;h3 id=&quot;other-scenarios&quot;&gt;Other Scenarios&lt;/h3&gt;

&lt;p&gt;There’s also 2 other factors necessary to consider when merging mapping sets that we’ll go over:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Duplicate mappings are possible&lt;/li&gt;
  &lt;li&gt;Field mappings can have type signature&lt;/li&gt;
&lt;/ol&gt;

&lt;h4 id=&quot;handling-duplicates&quot;&gt;Handling Duplicates&lt;/h4&gt;

&lt;p&gt;A duplicate mapping is when both mapping sets define a mapping for the same obfuscated member. For example, if you were
to merge the following mappings, they would be considered duplicated because they both share &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;com.example.Example&lt;/code&gt; as
the obfuscated name.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;com.example.Example -&amp;gt; com.example.OtherExample1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;com.example.Example -&amp;gt; com.example.OtherExample2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For the default merge implementation &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;right&lt;/code&gt; mappings take priority for all duplicate merge scenarios. So in this case
the mapping which would be present in the output mapping set would be:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;com.example.Example -&amp;gt; com.example.OtherExample2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;handling-field-types&quot;&gt;Handling Field Types&lt;/h4&gt;

&lt;p&gt;Field mappings can have types, but often don’t. Because Java doesn’t allow duplicate field names visible in any class
it’s not always necessary to explicitly list the type of the field. The complication comes when merging mapping sets
where one mapping set does and the other doesn’t contain field types. In this scenario looking up the field from one
mapping set to another in the default case by simply using the field signature would fail, as the type descriptor is
missing in one of the mapping sets.&lt;/p&gt;

&lt;p&gt;The new merge system provides a configuration option for whether to handle this case. The default options is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LOOSE&lt;/code&gt; -
that is, first check for the signature, but also check for just the field name and use it if the field
signature can’t be found. This can be switched to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;STRICT&lt;/code&gt; where all field mappings must match signatures exactly.&lt;/p&gt;

&lt;h3 id=&quot;merging-code-and-api&quot;&gt;Merging Code and API&lt;/h3&gt;

&lt;p&gt;The new merging system is made up of 2 main classes:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/CadixDev/Lorenz/blob/312c9ed737964b21a9058b29ec041831c955b537/lorenz/src/main/java/org/cadixdev/lorenz/merge/MappingSetMerger.java&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MappingSetMerger&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/CadixDev/Lorenz/blob/312c9ed737964b21a9058b29ec041831c955b537/lorenz/src/main/java/org/cadixdev/lorenz/merge/MappingSetMergerHandler.java&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MappingSetMergerHandler&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The JavaDocs for each class go into considerable detail on exactly what each class is and how it’s used, but here’s a
quick rundown:&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MappingSetMerger&lt;/code&gt; is the entry point for the merge operation. It’s an interface with a default implementation which
can be retrieved with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MappingSetMerger.create()&lt;/code&gt;. It does the job of walking the class hierarchy of both mapping sets
and finding the members of each side that should be merged together. It decides which members to include based on the
&lt;a href=&quot;https://github.com/CadixDev/Lorenz/blob/312c9ed737964b21a9058b29ec041831c955b537/lorenz/src/main/java/org/cadixdev/lorenz/merge/MergeConfig.java&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MergeConfig&lt;/code&gt;&lt;/a&gt;
provided in the call to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;create()&lt;/code&gt; (or just the default config if none was provided) and determines which  individual
case each merge is.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MappingSetMerger&lt;/code&gt; is available with an overridable default implementation in case it’s necessary to modify how the
above cases are decided individually. It is designed to let a user override individual methods in order to change said
logic when necessary, but the general idea is that in most cases you’ll never need to modify the default implementation
of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MappingSetMerger&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MappingSetMerger&lt;/code&gt; doesn’t handle actually merging the mappings, all it does is recognize which type of merge each merge
is, and delegates the handling of that merge to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MappingSetMergerHandler&lt;/code&gt;. This handler class has individual methods for
each mapping case, and is a fully-default interface. This means you can implement &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MappingSetMergerHandler&lt;/code&gt; and override
only the mapping cases you want to modify for your custom merge operation. The merge cases are all described by the
method names (and explained in further detail in the JavaDoc), and look like:&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nc&quot;&gt;FieldMapping&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;mergeFieldMappings&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;FieldMapping&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;FieldMapping&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;strictRight&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;FieldMapping&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;looseRight&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ClassMapping&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;?,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;?&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MergeContext&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;nc&quot;&gt;FieldMapping&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;mergeDuplicateFieldMappings&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;FieldMapping&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;FieldMapping&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;strictRightDuplicate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;FieldMapping&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;looseRightDuplicate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;FieldMapping&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;strictRightContinuation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;FieldMapping&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;looseRightContinuation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ClassMapping&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;?,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;?&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MergeContext&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;nc&quot;&gt;FieldMapping&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;addLeftFieldMapping&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;FieldMapping&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ClassMapping&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;?,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;?&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MergeContext&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;nc&quot;&gt;FieldMapping&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;addRightFieldMapping&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;FieldMapping&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;right&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ClassMapping&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;?,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;?&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MergeContext&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If you only need some custom logic when the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;right&lt;/code&gt; mapping set provides a mapping that the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;left&lt;/code&gt; mapping set doesn’t
provide, then you could just override &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;addRightFieldMapping&lt;/code&gt; with your custom logic and leave everything else default.
You wouldn’t need to worry about walking the hierarchy or copying of the other members or handling any other special
cases.&lt;/p&gt;

&lt;p&gt;This separation of concerns between determining what &lt;em&gt;kind&lt;/em&gt; of merge each case is and actually &lt;em&gt;handling&lt;/em&gt; the merge
operation for each merge case hopefully will allow you to easily customize mapping merges for whatever custom situation
you have.&lt;/p&gt;

&lt;h4 id=&quot;existing-code&quot;&gt;Existing Code&lt;/h4&gt;

&lt;p&gt;Each of the existing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;merge()&lt;/code&gt; methods on each of the mapping classes have all been updated to use this new merge
system. The methods haven’t been removed and are still binary compatible with any existing code you have which may be
using it. The output of the merge may differ however, as the logic has been considerably modified as described above.&lt;/p&gt;

&lt;h4 id=&quot;one-last-thing&quot;&gt;One Last Thing&lt;/h4&gt;

&lt;p&gt;The default implementation of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MappingSetMerger&lt;/code&gt; merges top-level classes in parallel. This is okay because
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MappingSetMergerHandler&lt;/code&gt; is a stateless class, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MappingSetMerger&lt;/code&gt; is completely thread-safe. Due to this merge time
fell by as much as half of the previous merge time when testing against Minecraft mapping sets.&lt;/p&gt;</content><author><name></name></author><category term="lorenz" /><category term="release" /><summary type="html">Lorenz 0.5.4 includes yet-more bug fixes, and a new (and vastly more powerful) mapping merging API.</summary></entry><entry><title type="html">Bombe 0.3.4 and 0.4.3</title><link href="https://www.cadixdev.org/bombe/release/2020/08/19/bombe-0.3.4-and-0.4.3.html" rel="alternate" type="text/html" title="Bombe 0.3.4 and 0.4.3" /><published>2020-08-19T10:26:00+00:00</published><updated>2020-08-19T10:26:00+00:00</updated><id>https://www.cadixdev.org/bombe/release/2020/08/19/bombe-0.3.4-and-0.4.3</id><content type="html" xml:base="https://www.cadixdev.org/bombe/release/2020/08/19/bombe-0.3.4-and-0.4.3.html">&lt;p&gt;Bombe 0.3.4 and 0.4.3 resolves a regression made when splitting up the previous systems in
Bombe 0.2.x, specifically a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NullPointerException&lt;/code&gt; that can occur when using
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ClassLoaderClassProvider&lt;/code&gt;.&lt;/p&gt;</content><author><name></name></author><category term="bombe" /><category term="release" /><summary type="html">Bombe 0.3.4 and 0.4.3 resolves a regression made when splitting up the previous systems in Bombe 0.2.x, specifically a NullPointerException that can occur when using ClassLoaderClassProvider.</summary></entry><entry><title type="html">Bombe 0.3.3 and 0.4.2</title><link href="https://www.cadixdev.org/bombe/release/2020/08/11/bombe-0.3.3-and-0.4.2.html" rel="alternate" type="text/html" title="Bombe 0.3.3 and 0.4.2" /><published>2020-08-11T20:05:00+00:00</published><updated>2020-08-11T20:05:00+00:00</updated><id>https://www.cadixdev.org/bombe/release/2020/08/11/bombe-0.3.3-and-0.4.2</id><content type="html" xml:base="https://www.cadixdev.org/bombe/release/2020/08/11/bombe-0.3.3-and-0.4.2.html">&lt;p&gt;Bombe 0.3.3 and 0.4.2 resolves an oversight when bumping to ASM 7, notably that our
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ClassProviderInheritanceProvider&lt;/code&gt; was still using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ASM6&lt;/code&gt; - this has now been resolved to use
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ASM7&lt;/code&gt;, in addition to a new constructor to allow for third-parties to specify which ASM API
version they wish to use.&lt;/p&gt;</content><author><name></name></author><category term="bombe" /><category term="release" /><summary type="html">Bombe 0.3.3 and 0.4.2 resolves an oversight when bumping to ASM 7, notably that our ClassProviderInheritanceProvider was still using ASM6 - this has now been resolved to use ASM7, in addition to a new constructor to allow for third-parties to specify which ASM API version they wish to use.</summary></entry></feed>