diff --git a/src/main/java/net/fabricmc/mappingio/adapter/EmptyElementFilter.java b/src/main/java/net/fabricmc/mappingio/adapter/EmptyElementFilter.java
new file mode 100644
index 00000000..71a5c0ea
--- /dev/null
+++ b/src/main/java/net/fabricmc/mappingio/adapter/EmptyElementFilter.java
@@ -0,0 +1,370 @@
+/*
+ * Copyright (c) 2025 FabricMC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package net.fabricmc.mappingio.adapter;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+import org.jetbrains.annotations.Nullable;
+
+import net.fabricmc.mappingio.MappedElementKind;
+import net.fabricmc.mappingio.MappingVisitor;
+
+/**
+ * A mapping visitor that filters out elements which effectively don't contain any data.
+ * Elements are only forwarded if they have:
+ *
+ * - a non-{@code null} comment,
+ *
- a non-{@code null} or non-equal destination name,
+ *
- a non-{@code null} or non-equal destination descriptor,
+ *
- or a child element to which one of these points applies.
+ *
+ */
+public final class EmptyElementFilter extends ForwardingMappingVisitor {
+ /**
+ * Creates a new {@link EmptyElementFilter} that treats destination names and descriptors which are equal to their source counterparts as empty.
+ *
+ * @param next The next visitor to forward the data to.
+ */
+ public EmptyElementFilter(MappingVisitor next) {
+ this(next, true);
+ }
+
+ /**
+ * @param next The next visitor to forward the data to.
+ * @param treatSrcOnDstAsEmpty Whether destination names and descriptors that are equal to their source counterparts should be treated as empty.
+ */
+ public EmptyElementFilter(MappingVisitor next, boolean treatSrcOnDstAsEmpty) {
+ super(next);
+ this.treatSrcOnDstAsEmpty = treatSrcOnDstAsEmpty;
+ init();
+ }
+
+ private void init() {
+ dstNsCount = -1;
+ memberKind = null;
+ localKind = null;
+ classSrcName = null;
+ memberSrcName = null;
+ memberSrcDesc = null;
+ localSrcName = null;
+ localLvIndex = -1;
+ argPosition = -1;
+ varLvtRowIndex = -1;
+ varStartOpIdx = -1;
+ varEndOpIdx = -1;
+ classDstNames = null;
+ memberDstNames = null;
+ memberDstDescs = null;
+ localDstNames = null;
+ classComment = null;
+ memberComment = null;
+ localComment = null;
+ forwardClass = false;
+ forwardMember = false;
+ forwardLocal = false;
+ forwardedClass = false;
+ forwardedMember = false;
+ forwardedLocal = false;
+ visitClass = true;
+ visitMember = true;
+ visitLocal = true;
+ }
+
+ @Override
+ public void reset() {
+ init();
+ super.reset();
+ }
+
+ @Override
+ public boolean visitHeader() throws IOException {
+ super.visitHeader();
+ return true;
+ }
+
+ @Override
+ public void visitNamespaces(String srcNamespace, List dstNamespaces) throws IOException {
+ super.visitNamespaces(srcNamespace, dstNamespaces);
+
+ dstNsCount = dstNamespaces.size();
+ classDstNames = new String[dstNsCount];
+ memberDstNames = new String[dstNsCount];
+ memberDstDescs = new String[dstNsCount];
+ localDstNames = new String[dstNsCount];
+ }
+
+ @Override
+ public boolean visitClass(String srcName) throws IOException {
+ forwardClass = false;
+ forwardMember = false;
+ forwardLocal = false;
+ forwardedClass = false;
+ visitClass = true;
+ classSrcName = srcName;
+ Arrays.fill(classDstNames, null);
+ classComment = null;
+ return true;
+ }
+
+ @Override
+ public boolean visitField(String srcName, @Nullable String srcDesc) throws IOException {
+ memberKind = MappedElementKind.FIELD;
+ return visitMember(srcName, srcDesc);
+ }
+
+ @Override
+ public boolean visitMethod(String srcName, @Nullable String srcDesc) throws IOException {
+ memberKind = MappedElementKind.METHOD;
+ return visitMember(srcName, srcDesc);
+ }
+
+ private boolean visitMember(String srcName, @Nullable String srcDesc) throws IOException {
+ forwardMember = false;
+ forwardLocal = false;
+ forwardedMember = false;
+ visitMember = true;
+ memberSrcName = srcName;
+ memberSrcDesc = srcDesc;
+ Arrays.fill(memberDstNames, null);
+ Arrays.fill(memberDstDescs, null);
+ memberComment = null;
+ return true;
+ }
+
+ @Override
+ public boolean visitMethodArg(int argPosition, int lvIndex, @Nullable String srcName) throws IOException {
+ localKind = MappedElementKind.METHOD_ARG;
+ this.argPosition = argPosition;
+ return visitLocal(lvIndex, srcName);
+ }
+
+ @Override
+ public boolean visitMethodVar(int lvtRowIndex, int lvIndex, int startOpIdx, int endOpIdx, @Nullable String srcName) throws IOException {
+ localKind = MappedElementKind.METHOD_VAR;
+ this.varLvtRowIndex = lvtRowIndex;
+ this.varStartOpIdx = startOpIdx;
+ this.varEndOpIdx = endOpIdx;
+ return visitLocal(lvIndex, srcName);
+ }
+
+ private boolean visitLocal(int lvIndex, @Nullable String srcName) throws IOException {
+ forwardLocal = false;
+ forwardedLocal = false;
+ visitLocal = true;
+ localSrcName = srcName;
+ localLvIndex = lvIndex;
+ Arrays.fill(localDstNames, null);
+ localComment = null;
+ return true;
+ }
+
+ @Override
+ public void visitDstName(MappedElementKind targetKind, int namespace, String name) throws IOException {
+ boolean forward = name != null && !(treatSrcOnDstAsEmpty && name.equals(getSrcName(targetKind)));
+
+ switch (targetKind) {
+ case CLASS:
+ forwardClass |= forward;
+ classDstNames[namespace] = name;
+ break;
+ case FIELD:
+ case METHOD:
+ forwardClass |= forward;
+ forwardMember |= forward;
+ memberDstNames[namespace] = name;
+ break;
+ case METHOD_ARG:
+ case METHOD_VAR:
+ forwardClass |= forward;
+ forwardMember |= forward;
+ forwardLocal |= forward;
+ localDstNames[namespace] = name;
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown target kind: " + targetKind);
+ }
+ }
+
+ private String getSrcName(MappedElementKind targetKind) {
+ switch (targetKind) {
+ case CLASS:
+ return classSrcName;
+ case FIELD:
+ case METHOD:
+ return memberSrcName;
+ case METHOD_ARG:
+ case METHOD_VAR:
+ return localSrcName;
+ default:
+ throw new IllegalArgumentException("Unknown target kind: " + targetKind);
+ }
+ }
+
+ @Override
+ public void visitDstDesc(MappedElementKind targetKind, int namespace, String desc) throws IOException {
+ assert targetKind == memberKind;
+ boolean forward = desc != null && !(treatSrcOnDstAsEmpty && desc.equals(memberSrcDesc));
+
+ forwardClass |= forward;
+ forwardMember |= forward;
+ memberDstDescs[namespace] = desc;
+ }
+
+ @Override
+ public boolean visitElementContent(MappedElementKind targetKind) throws IOException {
+ forward(targetKind);
+ return true;
+ }
+
+ @Override
+ public void visitComment(MappedElementKind targetKind, String comment) throws IOException {
+ if (comment == null) {
+ return;
+ }
+
+ switch (targetKind) {
+ case CLASS:
+ forwardClass = true;
+ classComment = comment;
+ break;
+ case FIELD:
+ case METHOD:
+ forwardClass = true;
+ forwardMember = true;
+ memberComment = comment;
+ break;
+ case METHOD_ARG:
+ case METHOD_VAR:
+ forwardClass = true;
+ forwardMember = true;
+ forwardLocal = true;
+ localComment = comment;
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown target kind: " + targetKind);
+ }
+
+ forward(targetKind);
+ }
+
+ private void forward(MappedElementKind targetKind) throws IOException {
+ if (forwardClass && !forwardedClass && visitClass) {
+ if (visitClass = super.visitClass(classSrcName)) {
+ for (int i = 0; i < dstNsCount; i++) {
+ if (classDstNames[i] != null) {
+ super.visitDstName(MappedElementKind.CLASS, i, classDstNames[i]);
+ }
+ }
+
+ visitClass = super.visitElementContent(MappedElementKind.CLASS);
+ forwardedClass = true;
+
+ if (visitClass && classComment != null) {
+ super.visitComment(MappedElementKind.CLASS, classComment);
+ }
+ }
+ }
+
+ if (forwardMember && !forwardedMember && visitClass && visitMember) {
+ if (memberKind == MappedElementKind.FIELD) {
+ visitMember = super.visitField(memberSrcName, memberSrcDesc);
+ } else {
+ visitMember = super.visitMethod(memberSrcName, memberSrcDesc);
+ }
+
+ if (visitMember) {
+ for (int i = 0; i < dstNsCount; i++) {
+ if (memberDstNames[i] != null) {
+ super.visitDstName(memberKind, i, memberDstNames[i]);
+ }
+
+ if (memberDstDescs[i] != null) {
+ super.visitDstDesc(memberKind, i, memberDstDescs[i]);
+ }
+ }
+
+ visitMember = super.visitElementContent(memberKind);
+ forwardedMember = true;
+
+ if (visitMember && memberComment != null) {
+ super.visitComment(memberKind, memberComment);
+ }
+ }
+ }
+
+ if (forwardLocal && !forwardedLocal && visitClass && visitMember && visitLocal) {
+ if (localKind == MappedElementKind.METHOD_ARG) {
+ visitLocal = super.visitMethodArg(argPosition, localLvIndex, localSrcName);
+ } else {
+ visitLocal = super.visitMethodVar(varLvtRowIndex, localLvIndex, varStartOpIdx, varEndOpIdx, localSrcName);
+ }
+
+ if (visitLocal) {
+ for (int i = 0; i < dstNsCount; i++) {
+ if (localDstNames[i] != null) {
+ super.visitDstName(localKind, i, localDstNames[i]);
+ }
+ }
+
+ visitLocal = super.visitElementContent(localKind);
+ forwardedLocal = true;
+
+ if (visitLocal && localComment != null) {
+ super.visitComment(localKind, localComment);
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean visitEnd() throws IOException {
+ init();
+ return super.visitEnd();
+ }
+
+ private final boolean treatSrcOnDstAsEmpty;
+ private int dstNsCount;
+ private MappedElementKind memberKind;
+ private MappedElementKind localKind;
+ private String classSrcName;
+ private String memberSrcName;
+ private String memberSrcDesc;
+ private String localSrcName;
+ private int localLvIndex;
+ private int argPosition;
+ private int varLvtRowIndex;
+ private int varStartOpIdx;
+ private int varEndOpIdx;
+ private String[] classDstNames;
+ private String[] memberDstNames;
+ private String[] memberDstDescs;
+ private String[] localDstNames;
+ private String classComment;
+ private String memberComment;
+ private String localComment;
+ private boolean forwardClass;
+ private boolean forwardMember;
+ private boolean forwardLocal;
+ private boolean forwardedClass;
+ private boolean forwardedMember;
+ private boolean forwardedLocal;
+ private boolean visitClass;
+ private boolean visitMember;
+ private boolean visitLocal;
+}
diff --git a/src/main/java/net/fabricmc/mappingio/adapter/SubsetChecker.java b/src/main/java/net/fabricmc/mappingio/adapter/SubsetChecker.java
index a8d57452..5082150d 100644
--- a/src/main/java/net/fabricmc/mappingio/adapter/SubsetChecker.java
+++ b/src/main/java/net/fabricmc/mappingio/adapter/SubsetChecker.java
@@ -19,9 +19,11 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
+import java.util.Set;
import java.util.function.Consumer;
import org.jetbrains.annotations.ApiStatus;
@@ -66,7 +68,9 @@ public SubsetChecker(MappingTreeView supTree, @Nullable MappingFormat supFormat,
@Override
public void visitNamespaces(String srcNamespace, List dstNamespaces) throws IOException {
- String expectedSrcNs = subFeatures.hasNamespaces() ? supTree.getSrcNamespace() : MappingUtil.NS_SOURCE_FALLBACK;
+ String expectedSrcNs = subFeatures.hasNamespaces() && supFeatures.hasNamespaces()
+ ? supTree.getSrcNamespace()
+ : srcNamespace;
assertEquals(expectedSrcNs, srcNamespace, "Incoming mappings have different source namespace than supTree");
subDstNamespaces = new ArrayList<>(dstNamespaces);
@@ -113,6 +117,8 @@ public boolean visitClass(String srcName, @Nullable String[] dstNames) throws IO
if (!supFeatures.supportsClasses()) return true; // sub-elements might still be supported
ClassMappingView supCls = supTree.getClass(srcName);
+ visitedIncomingParentElements.add(srcName);
+
boolean supHasDstNames = supFeatures.classes().dstNames() != FeaturePresence.ABSENT;
boolean subHasDstNames = subFeatures.classes().dstNames() != FeaturePresence.ABSENT;
boolean supHasRepackaging = supFeatures.classes().hasRepackaging();
@@ -203,8 +209,8 @@ public boolean visitField(String srcClsName, String srcName, @Nullable String sr
if (!supFeatures.supportsFields()) return true;
String subFldId = srcClsName + "#" + srcName + ":" + srcDesc;
- ClassMappingView supCls = requireNonNull(supTree.getClass(srcClsName), "Incoming field's parent class not contained in supTree: " + subFldId);
- FieldMappingView supFld = supCls.getField(srcName, srcDesc);
+ ClassMappingView supCls = getVisitedSupCls(srcClsName, "Incoming field's parent class not contained in supTree: " + subFldId);
+ FieldMappingView supFld = supCls == null ? null : supCls.getField(srcName, srcDesc);
boolean supHasSrcDescs = supFeatures.fields().srcDescs() != FeaturePresence.ABSENT;
boolean subHasSrcDescs = subFeatures.fields().srcDescs() != FeaturePresence.ABSENT;
@@ -213,6 +219,7 @@ public boolean visitField(String srcClsName, String srcName, @Nullable String sr
boolean supHasDstDescs = supFeatures.fields().dstDescs() != FeaturePresence.ABSENT;
boolean subHasDstDescs = subFeatures.fields().dstDescs() != FeaturePresence.ABSENT;
boolean supRequiresSrcDescs = supFeatures.fields().srcDescs() == FeaturePresence.REQUIRED;
+ boolean supRequiresDstDescs = supFeatures.fields().dstDescs() == FeaturePresence.REQUIRED;
if (supFld == null) { // supTree doesn't have this field, ensure the incoming mappings don't have any data for it
String[] subDstNames = null;
@@ -223,9 +230,20 @@ public boolean visitField(String srcClsName, String srcName, @Nullable String sr
boolean noData = isEmpty(subDstNames) && isEmpty(subDstDescs);
boolean missingRequiredSrcDesc = supRequiresSrcDescs && srcDesc == null;
+ boolean missingRequiredDstDesc = supRequiresDstDescs;
+
+ for (int subNs = 0; supRequiresDstDescs && subNs < subDstNames.length; subNs++) {
+ String subDstName = subDstNames == null ? null : subDstNames[subNs];
+ String subDstDesc = subDstDescs == null ? null : subDstDescs[subNs];
- assertTrue(noData || missingRequiredSrcDesc, "Incoming field not contained in supTree: " + subFldId);
- return !missingRequiredSrcDesc;
+ if (subDstDesc != null && (subDstName != null || supFeatures.fields().dstNames() != FeaturePresence.REQUIRED)) {
+ missingRequiredDstDesc = false;
+ break;
+ }
+ }
+
+ assertTrue(noData || missingRequiredSrcDesc || missingRequiredDstDesc, "Incoming field not contained in supTree: " + subFldId);
+ return !missingRequiredSrcDesc && !missingRequiredDstDesc;
}
String supFldId = srcClsName + "#" + srcName + ":" + supFld.getSrcDesc();
@@ -287,8 +305,9 @@ public boolean visitMethod(String srcClsName, String srcName, @Nullable String s
if (!supFeatures.supportsMethods()) return true;
String subMthId = srcClsName + "#" + srcName + srcDesc;
- ClassMappingView supCls = requireNonNull(supTree.getClass(srcClsName), "Incoming method's parent class not contained in supTree: " + subMthId);
- MethodMappingView supMth = supCls.getMethod(srcName, srcDesc);
+ ClassMappingView supCls = getVisitedSupCls(srcClsName, "Incoming method's parent class not contained in supTree: " + subMthId);
+ MethodMappingView supMth = supCls == null ? null : supCls.getMethod(srcName, srcDesc);
+ visitedIncomingParentElements.add(subMthId);
boolean supHasSrcDescs = supFeatures.methods().srcDescs() != FeaturePresence.ABSENT;
boolean subHasSrcDescs = subFeatures.methods().srcDescs() != FeaturePresence.ABSENT;
@@ -297,6 +316,7 @@ public boolean visitMethod(String srcClsName, String srcName, @Nullable String s
boolean supHasDstDescs = supFeatures.methods().dstDescs() != FeaturePresence.ABSENT;
boolean subHasDstDescs = subFeatures.methods().dstDescs() != FeaturePresence.ABSENT;
boolean supRequiresSrcDescs = supFeatures.methods().srcDescs() == FeaturePresence.REQUIRED;
+ boolean supRequiresDstDescs = supFeatures.methods().dstDescs() == FeaturePresence.REQUIRED;
if (supMth == null) { // supTree doesn't have this method, ensure the incoming mappings don't have any data for it
String[] subDstNames = null;
@@ -307,9 +327,20 @@ public boolean visitMethod(String srcClsName, String srcName, @Nullable String s
boolean noData = isEmpty(subDstNames) && isEmpty(subDstDescs);
boolean missingRequiredSrcDesc = supRequiresSrcDescs && srcDesc == null;
+ boolean missingRequiredDstDesc = supRequiresDstDescs;
+
+ for (int subNs = 0; supRequiresDstDescs && subNs < subDstNames.length; subNs++) {
+ String subDstName = subDstNames == null ? null : subDstNames[subNs];
+ String subDstDesc = subDstDescs == null ? null : subDstDescs[subNs];
+
+ if (subDstDesc != null && (subDstName != null || supFeatures.methods().dstNames() != FeaturePresence.REQUIRED)) {
+ missingRequiredDstDesc = false;
+ break;
+ }
+ }
- assertTrue(noData || missingRequiredSrcDesc, "Incoming method not contained in supTree: " + subMthId);
- return !missingRequiredSrcDesc;
+ assertTrue(noData || missingRequiredSrcDesc || missingRequiredDstDesc, "Incoming method not contained in supTree: " + subMthId);
+ return !missingRequiredSrcDesc && !missingRequiredDstDesc;
}
String supMthId = srcClsName + "#" + srcName + supMth.getSrcDesc();
@@ -372,9 +403,10 @@ public boolean visitMethodArg(String srcClsName, String srcMethodName, @Nullable
if (!supFeatures.supportsArgs()) return true;
String subArgId = srcClsName + "#" + srcMethodName + srcMethodDesc + ":" + argPosition + ":" + lvIndex + ":" + srcName;
- ClassMappingView supCls = requireNonNull(supTree.getClass(srcClsName), "Incoming arg's parent class not contained in supTree: " + subArgId);
- MethodMappingView supMth = requireNonNull(supCls.getMethod(srcMethodName, srcMethodDesc), "Incoming arg's parent method not contained in supTree: " + subArgId);
- MethodArgMappingView supArg = supMth.getArg(argPosition, lvIndex, srcName);
+
+ ClassMappingView supCls = getVisitedSupCls(srcClsName, "Incoming arg's parent class not contained in supTree: " + subArgId);
+ MethodMappingView supMth = supCls == null ? null : getVisitedSupMth(supCls, srcMethodName, srcMethodDesc, "Incoming arg's parent method not contained in supTree: " + subArgId);
+ MethodArgMappingView supArg = supMth == null ? null : supMth.getArg(argPosition, lvIndex, srcName);
boolean supHasPositions = supFeatures.args().positions() != FeaturePresence.ABSENT;
boolean subHasPositions = subFeatures.args().positions() != FeaturePresence.ABSENT;
@@ -448,9 +480,9 @@ public boolean visitMethodVar(String srcClsName, String srcMethodName, @Nullable
if (!supFeatures.supportsVars()) return true;
String subVarId = srcClsName + "#" + srcMethodName + srcMethodDesc + ":" + lvtRowIndex + ":" + lvIndex + ":" + startOpIdx + ":" + endOpIdx + ":" + srcName;
- ClassMappingView supCls = requireNonNull(supTree.getClass(srcClsName), "Incoming var's parent class not contained in supTree: " + subVarId);
- MethodMappingView supMth = requireNonNull(supCls.getMethod(srcMethodName, srcMethodDesc), "Incoming var's parent method not contained in supTree: " + subVarId);
- MethodVarMappingView supVar = supMth.getVar(lvtRowIndex, lvIndex, startOpIdx, endOpIdx, srcName);
+ ClassMappingView supCls = getVisitedSupCls(srcClsName, "Incoming var's parent class not contained in supTree: " + subVarId);
+ MethodMappingView supMth = supCls == null ? null : getVisitedSupMth(supCls, srcMethodName, srcMethodDesc, "Incoming var's parent method not contained in supTree: " + subVarId);
+ MethodVarMappingView supVar = supMth == null ? null : supMth.getVar(lvtRowIndex, lvIndex, startOpIdx, endOpIdx, srcName);
boolean supHasLvIndices = supFeatures.vars().lvIndices() != FeaturePresence.ABSENT;
boolean subHasLvIndices = subFeatures.vars().lvIndices() != FeaturePresence.ABSENT;
@@ -575,12 +607,27 @@ private String getPackage(String name) {
return lastSlash == -1 ? null : name.substring(0, lastSlash);
}
+ @Nullable
+ private ClassMappingView getVisitedSupCls(String clsSrcName, String notFoundMessage) {
+ ClassMappingView supCls = supTree.getClass(clsSrcName);
+ assertTrue(supCls != null || visitedIncomingParentElements.contains(clsSrcName), notFoundMessage);
+ return supCls;
+ }
+
+ @Nullable
+ private MethodMappingView getVisitedSupMth(ClassMappingView supCls, String mthSrcName, String mthSrcDesc, String notFoundMessage) {
+ MethodMappingView supMth = supCls.getMethod(mthSrcName, mthSrcDesc);
+ assertTrue(supMth != null || visitedIncomingParentElements.contains(mthSrcName), notFoundMessage);
+ return supMth;
+ }
+
private final MappingTreeView supTree;
private final int supDstNsCount;
private final MappingFormat subFormat;
private final FeatureSet supFeatures;
private final FeatureSet subFeatures;
private final Consumer errorHandler;
+ private final Set visitedIncomingParentElements = new HashSet<>();
private int subNsIfSupNotNamespaced;
private List subDstNamespaces;
}
diff --git a/src/test/java/net/fabricmc/mappingio/test/TestFileUpdater.java b/src/test/java/net/fabricmc/mappingio/test/TestFileUpdater.java
index 6da855c1..ef6ca392 100644
--- a/src/test/java/net/fabricmc/mappingio/test/TestFileUpdater.java
+++ b/src/test/java/net/fabricmc/mappingio/test/TestFileUpdater.java
@@ -23,12 +23,14 @@
import java.util.Comparator;
import java.util.stream.Stream;
+import net.fabricmc.mappingio.MappingFlag;
import net.fabricmc.mappingio.MappingVisitor;
import net.fabricmc.mappingio.MappingWriter;
import net.fabricmc.mappingio.adapter.MappingNsCompleter;
import net.fabricmc.mappingio.format.MappingFormat;
import net.fabricmc.mappingio.test.TestMappings.MappingDir;
import net.fabricmc.mappingio.test.lib.jool.Unchecked;
+import net.fabricmc.mappingio.tree.MemoryMappingTree;
public class TestFileUpdater {
public static void main(String[] args) throws IOException {
@@ -50,6 +52,7 @@ public static void main(String[] args) throws IOException {
}
MappingVisitor target = MappingWriter.create(dir.pathFor(format), format);
+ boolean useIntermediateTree = false;
if (dir == TestMappings.READING.REPEATED_ELEMENTS) {
boolean isEnigma = format == MappingFormat.ENIGMA_FILE || format == MappingFormat.ENIGMA_DIR;
@@ -58,11 +61,21 @@ public static void main(String[] args) throws IOException {
continue;
}
- if (dir.isIn(TestMappings.PROPAGATION.BASE_DIR) && !format.features().hasNamespaces()) {
+ if (dir.isIn(TestMappings.FILTERING.BASE_DIR)) {
+ boolean needsFldDstDesc = target.getFlags().contains(MappingFlag.NEEDS_DST_FIELD_DESC);
+ boolean needsMthDstDesc = target.getFlags().contains(MappingFlag.NEEDS_DST_METHOD_DESC);
+ useIntermediateTree |= needsFldDstDesc || needsMthDstDesc;
+ } else if (dir.isIn(TestMappings.PROPAGATION.BASE_DIR) && !format.features().hasNamespaces()) {
target = new MappingNsCompleter(target);
}
- dir.generate(target);
+ if (useIntermediateTree) {
+ MemoryMappingTree tree = new MemoryMappingTree();
+ dir.generate(tree);
+ tree.accept(target);
+ } else {
+ dir.generate(target);
+ }
}
}
}
@@ -76,6 +89,10 @@ private static Path mkDir(Path path) throws IOException {
}
private static void rmDir(Path path) throws IOException {
+ if (!Files.exists(path)) {
+ return;
+ }
+
try (Stream paths = Files.walk(path)) {
paths.sorted(Comparator.reverseOrder()).forEach(Unchecked.consumer(Files::deleteIfExists));
}
diff --git a/src/test/java/net/fabricmc/mappingio/test/TestMappings.java b/src/test/java/net/fabricmc/mappingio/test/TestMappings.java
index 6adc02a8..4f1fa39f 100644
--- a/src/test/java/net/fabricmc/mappingio/test/TestMappings.java
+++ b/src/test/java/net/fabricmc/mappingio/test/TestMappings.java
@@ -34,6 +34,7 @@
import net.fabricmc.mappingio.MappingReader;
import net.fabricmc.mappingio.MappingUtil;
import net.fabricmc.mappingio.MappingVisitor;
+import net.fabricmc.mappingio.adapter.EmptyElementFilter;
import net.fabricmc.mappingio.adapter.ForwardingMappingVisitor;
import net.fabricmc.mappingio.adapter.NopMappingVisitor;
import net.fabricmc.mappingio.adapter.OuterClassNamePropagator;
@@ -50,7 +51,7 @@
*/
public class TestMappings {
public static T generateValid(T target) throws IOException {
- MappingVisitor delegate = target instanceof VisitOrderVerifier ? target : new VisitOrderVerifier(target);
+ MappingVisitor delegate = visitOrderVerifierWrapped(target);
if (delegate.visitHeader()) {
delegate.visitNamespaces(MappingUtil.NS_SOURCE_FALLBACK, Arrays.asList(MappingUtil.NS_TARGET_FALLBACK, MappingUtil.NS_TARGET_FALLBACK + "2"));
@@ -179,7 +180,7 @@ public void visitComment(MappedElementKind targetKind, String comment) throws IO
}
public static T generateHoles(T target) throws IOException {
- MappingVisitor delegate = target instanceof VisitOrderVerifier ? target : new VisitOrderVerifier(target);
+ MappingVisitor delegate = visitOrderVerifierWrapped(target);
if (delegate.visitHeader()) {
delegate.visitNamespaces(MappingUtil.NS_SOURCE_FALLBACK, Arrays.asList(MappingUtil.NS_TARGET_FALLBACK, MappingUtil.NS_TARGET_FALLBACK + "2"));
@@ -291,7 +292,7 @@ public static T generateHoles(T target) throws IOExce
}
public static T generateOuterClassNamePropagation(T target) throws IOException {
- MappingVisitor delegate = target instanceof VisitOrderVerifier ? target : new VisitOrderVerifier(target);
+ MappingVisitor delegate = visitOrderVerifierWrapped(target);
String srcNs = MappingUtil.NS_SOURCE_FALLBACK;
List dstNamespaces = Arrays.asList("dstNs0", "dstNs1", "dstNs2", "dstNs3", "dstNs4", "dstNs5", "dstNs6");
@@ -357,6 +358,405 @@ public static T generateOuterClassNamePropagation(T t
return target;
}
+ public static T generateEmptyElementFiltering(T target) throws IOException {
+ MappingVisitor delegate = visitOrderVerifierWrapped(target);
+
+ if (delegate.visitHeader()) {
+ delegate.visitNamespaces("nsA", Arrays.asList("nsB", "nsC"));
+ }
+
+ if (delegate.visitContent()) {
+ String clsPrefix = "cls";
+ String fieldPrefix = "fld";
+ String methodPrefix = "mth";
+ String argPrefix = "arg";
+ String varPrefix = "var";
+ String commentSuffix = "Comment";
+ String nsASuffix = "NsAName";
+ String nsBSuffix = "NsBName";
+ String nsCSuffix = "NsCName";
+ String clsName, clsNsAName;
+ String fldName, fldNsAName;
+ String mthName, mthNsAName;
+ String argName, argNsAName;
+ String varName, varNsAName;
+ String fldDesc = "I";
+ String mthDesc = "()I";
+ int clsNum = 0;
+ int fieldNum = 0;
+ int methodNum = 0;
+ int argNum = 0;
+ int varNum = 0;
+
+ // Classes
+ if (delegate.visitClass(clsNsAName = (clsName = clsPrefix + clsNum++) + nsASuffix)) {
+ delegate.visitDstName(MappedElementKind.CLASS, 0, clsName + nsBSuffix);
+ delegate.visitDstName(MappedElementKind.CLASS, 1, clsName + nsCSuffix);
+ delegate.visitElementContent(MappedElementKind.CLASS);
+ }
+
+ if (delegate.visitClass(clsNsAName = (clsName = clsPrefix + clsNum++) + nsASuffix)) {
+ delegate.visitDstName(MappedElementKind.CLASS, 0, clsName + nsBSuffix);
+ delegate.visitElementContent(MappedElementKind.CLASS);
+ }
+
+ if (delegate.visitClass(clsNsAName = (clsName = clsPrefix + clsNum++) + nsASuffix)) {
+ delegate.visitDstName(MappedElementKind.CLASS, 1, clsName + nsCSuffix);
+ delegate.visitElementContent(MappedElementKind.CLASS);
+ }
+
+ if (delegate.visitClass(clsNsAName = (clsName = clsPrefix + clsNum++) + nsASuffix)) {
+ delegate.visitDstName(MappedElementKind.CLASS, 0, clsNsAName);
+ delegate.visitDstName(MappedElementKind.CLASS, 1, clsName + nsCSuffix);
+ delegate.visitElementContent(MappedElementKind.CLASS);
+ }
+
+ if (delegate.visitClass(clsNsAName = (clsName = clsPrefix + clsNum++) + nsASuffix)) {
+ delegate.visitDstName(MappedElementKind.CLASS, 0, clsName + nsBSuffix);
+ delegate.visitDstName(MappedElementKind.CLASS, 1, clsNsAName);
+ delegate.visitElementContent(MappedElementKind.CLASS);
+ }
+
+ if (delegate.visitClass(clsNsAName = (clsName = clsPrefix + clsNum++) + nsASuffix)) {
+ delegate.visitDstName(MappedElementKind.CLASS, 0, clsNsAName);
+ delegate.visitDstName(MappedElementKind.CLASS, 1, clsNsAName);
+ delegate.visitElementContent(MappedElementKind.CLASS);
+ }
+
+ if (delegate.visitClass(clsNsAName = (clsName = clsPrefix + clsNum++) + nsASuffix)) {
+ delegate.visitDstName(MappedElementKind.CLASS, 0, clsNsAName);
+ delegate.visitElementContent(MappedElementKind.CLASS);
+ }
+
+ if (delegate.visitClass(clsNsAName = (clsName = clsPrefix + clsNum++) + nsASuffix)) {
+ delegate.visitDstName(MappedElementKind.CLASS, 1, clsNsAName);
+ delegate.visitElementContent(MappedElementKind.CLASS);
+ }
+
+ if (delegate.visitClass(clsNsAName = (clsName = clsPrefix + clsNum++) + nsASuffix)) {
+ delegate.visitElementContent(MappedElementKind.CLASS);
+ }
+
+ if (delegate.visitClass(clsNsAName = (clsName = clsPrefix + clsNum++) + nsASuffix)) {
+ if (delegate.visitElementContent(MappedElementKind.CLASS)) {
+ delegate.visitComment(MappedElementKind.CLASS, clsName + commentSuffix);
+ }
+ }
+
+ for (int pass = 1; pass <= 2; pass++) {
+ if (delegate.visitClass(clsNsAName = (clsName = clsPrefix + clsNum++) + nsASuffix)) {
+ if (delegate.visitElementContent(MappedElementKind.CLASS)) {
+ if (delegate.visitField(fldNsAName = (fldName = fieldPrefix + fieldNum++) + nsASuffix, fldDesc)) {
+ if (pass == 2) {
+ delegate.visitDstName(MappedElementKind.FIELD, 0, fldNsAName);
+ }
+
+ delegate.visitElementContent(MappedElementKind.FIELD);
+ }
+ }
+ }
+
+ if (delegate.visitClass(clsNsAName = (clsName = clsPrefix + clsNum++) + nsASuffix)) {
+ if (delegate.visitElementContent(MappedElementKind.CLASS)) {
+ if (delegate.visitMethod(mthNsAName = (mthName = methodPrefix + methodNum++) + nsASuffix, mthDesc)) {
+ if (pass == 2) {
+ delegate.visitDstName(MappedElementKind.METHOD, 0, mthNsAName);
+ }
+
+ delegate.visitElementContent(MappedElementKind.METHOD);
+ }
+ }
+ }
+
+ if (delegate.visitClass(clsNsAName = (clsName = clsPrefix + clsNum++) + nsASuffix)) {
+ if (delegate.visitElementContent(MappedElementKind.CLASS)) {
+ if (delegate.visitMethod(mthNsAName = (mthName = methodPrefix + methodNum++) + nsASuffix, mthDesc)) {
+ if (delegate.visitElementContent(MappedElementKind.METHOD)) {
+ if (delegate.visitMethodArg(argNum, argNum, argNsAName = (argName = argPrefix + argNum++) + nsASuffix)) {
+ if (pass == 2) {
+ delegate.visitDstName(MappedElementKind.METHOD_ARG, 0, argNsAName);
+ }
+
+ delegate.visitElementContent(MappedElementKind.METHOD_ARG);
+ }
+ }
+ }
+ }
+ }
+
+ if (delegate.visitClass(clsNsAName = (clsName = clsPrefix + clsNum++) + nsASuffix)) {
+ if (delegate.visitElementContent(MappedElementKind.CLASS)) {
+ if (delegate.visitMethod(mthNsAName = (mthName = methodPrefix + methodNum++) + nsASuffix, mthDesc)) {
+ if (delegate.visitElementContent(MappedElementKind.METHOD)) {
+ if (delegate.visitMethodVar(varNum, varNum, varNum, varNum + 1, varNsAName = (varName = varPrefix + varNum++) + nsASuffix)) {
+ if (pass == 2) {
+ delegate.visitDstName(MappedElementKind.METHOD_VAR, 0, varNsAName);
+ }
+
+ delegate.visitElementContent(MappedElementKind.METHOD_VAR);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // Fields
+ if (delegate.visitClass(clsNsAName = (clsName = clsPrefix + clsNum++) + nsASuffix)) {
+ if (delegate.visitElementContent(MappedElementKind.CLASS)) {
+ if (delegate.visitField(fldNsAName = (fldName = fieldPrefix + fieldNum++) + nsASuffix, fldDesc)) {
+ delegate.visitDstName(MappedElementKind.FIELD, 0, fldName + nsBSuffix);
+ delegate.visitDstName(MappedElementKind.FIELD, 1, fldName + nsCSuffix);
+ delegate.visitElementContent(MappedElementKind.FIELD);
+ }
+
+ if (delegate.visitField(fldNsAName = (fldName = fieldPrefix + fieldNum++) + nsASuffix, fldDesc)) {
+ delegate.visitDstName(MappedElementKind.FIELD, 0, fldName + nsBSuffix);
+ delegate.visitElementContent(MappedElementKind.FIELD);
+ }
+
+ if (delegate.visitField(fldNsAName = (fldName = fieldPrefix + fieldNum++) + nsASuffix, fldDesc)) {
+ delegate.visitDstName(MappedElementKind.FIELD, 1, fldName + nsCSuffix);
+ delegate.visitElementContent(MappedElementKind.FIELD);
+ }
+
+ if (delegate.visitField(fldNsAName = (fldName = fieldPrefix + fieldNum++) + nsASuffix, fldDesc)) {
+ delegate.visitDstName(MappedElementKind.FIELD, 0, fldNsAName);
+ delegate.visitDstName(MappedElementKind.FIELD, 1, fldName + nsCSuffix);
+ delegate.visitElementContent(MappedElementKind.FIELD);
+ }
+
+ if (delegate.visitField(fldNsAName = (fldName = fieldPrefix + fieldNum++) + nsASuffix, fldDesc)) {
+ delegate.visitDstName(MappedElementKind.FIELD, 0, fldName + nsBSuffix);
+ delegate.visitDstName(MappedElementKind.FIELD, 1, fldNsAName);
+ delegate.visitElementContent(MappedElementKind.FIELD);
+ }
+
+ if (delegate.visitField(fldNsAName = (fldName = fieldPrefix + fieldNum++) + nsASuffix, fldDesc)) {
+ delegate.visitDstName(MappedElementKind.FIELD, 0, fldNsAName);
+ delegate.visitDstName(MappedElementKind.FIELD, 1, fldNsAName);
+ delegate.visitElementContent(MappedElementKind.FIELD);
+ }
+
+ if (delegate.visitField(fldNsAName = (fldName = fieldPrefix + fieldNum++) + nsASuffix, fldDesc)) {
+ delegate.visitDstName(MappedElementKind.FIELD, 0, fldNsAName);
+ delegate.visitElementContent(MappedElementKind.FIELD);
+ }
+
+ if (delegate.visitField(fldNsAName = (fldName = fieldPrefix + fieldNum++) + nsASuffix, fldDesc)) {
+ delegate.visitDstName(MappedElementKind.FIELD, 1, fldNsAName);
+ delegate.visitElementContent(MappedElementKind.FIELD);
+ }
+
+ if (delegate.visitField(fldNsAName = (fldName = fieldPrefix + fieldNum++) + nsASuffix, fldDesc)) {
+ delegate.visitElementContent(MappedElementKind.FIELD);
+ }
+
+ if (delegate.visitField(fldNsAName = (fldName = fieldPrefix + fieldNum++) + nsASuffix, fldDesc)) {
+ if (delegate.visitElementContent(MappedElementKind.FIELD)) {
+ delegate.visitComment(MappedElementKind.FIELD, fldName + commentSuffix);
+ }
+ }
+ }
+ }
+
+ // Methods
+ if (delegate.visitClass(clsNsAName = (clsName = clsPrefix + clsNum++) + nsASuffix)) {
+ if (delegate.visitElementContent(MappedElementKind.CLASS)) {
+ if (delegate.visitMethod(mthNsAName = (mthName = methodPrefix + methodNum++) + nsASuffix, mthDesc)) {
+ delegate.visitDstName(MappedElementKind.METHOD, 0, mthName + nsBSuffix);
+ delegate.visitDstName(MappedElementKind.METHOD, 1, mthName + nsCSuffix);
+ delegate.visitElementContent(MappedElementKind.METHOD);
+ }
+
+ if (delegate.visitMethod(mthNsAName = (mthName = methodPrefix + methodNum++) + nsASuffix, mthDesc)) {
+ delegate.visitDstName(MappedElementKind.METHOD, 0, mthName + nsBSuffix);
+ delegate.visitElementContent(MappedElementKind.METHOD);
+ }
+
+ if (delegate.visitMethod(mthNsAName = (mthName = methodPrefix + methodNum++) + nsASuffix, mthDesc)) {
+ delegate.visitDstName(MappedElementKind.METHOD, 1, mthName + nsCSuffix);
+ delegate.visitElementContent(MappedElementKind.METHOD);
+ }
+
+ if (delegate.visitMethod(mthNsAName = (mthName = methodPrefix + methodNum++) + nsASuffix, mthDesc)) {
+ delegate.visitDstName(MappedElementKind.METHOD, 0, mthNsAName);
+ delegate.visitDstName(MappedElementKind.METHOD, 1, mthName + nsCSuffix);
+ delegate.visitElementContent(MappedElementKind.METHOD);
+ }
+
+ if (delegate.visitMethod(mthNsAName = (mthName = methodPrefix + methodNum++) + nsASuffix, mthDesc)) {
+ delegate.visitDstName(MappedElementKind.METHOD, 0, mthName + nsBSuffix);
+ delegate.visitDstName(MappedElementKind.METHOD, 1, mthNsAName);
+ delegate.visitElementContent(MappedElementKind.METHOD);
+ }
+
+ if (delegate.visitMethod(mthNsAName = (mthName = methodPrefix + methodNum++) + nsASuffix, mthDesc)) {
+ delegate.visitDstName(MappedElementKind.METHOD, 0, mthNsAName);
+ delegate.visitDstName(MappedElementKind.METHOD, 1, mthNsAName);
+ delegate.visitElementContent(MappedElementKind.METHOD);
+ }
+
+ if (delegate.visitMethod(mthNsAName = (mthName = methodPrefix + methodNum++) + nsASuffix, mthDesc)) {
+ delegate.visitDstName(MappedElementKind.METHOD, 0, mthNsAName);
+ delegate.visitElementContent(MappedElementKind.METHOD);
+ }
+
+ if (delegate.visitMethod(mthNsAName = (mthName = methodPrefix + methodNum++) + nsASuffix, mthDesc)) {
+ delegate.visitDstName(MappedElementKind.METHOD, 1, mthNsAName);
+ delegate.visitElementContent(MappedElementKind.METHOD);
+ }
+
+ if (delegate.visitMethod(mthNsAName = (mthName = methodPrefix + methodNum++) + nsASuffix, mthDesc)) {
+ delegate.visitElementContent(MappedElementKind.METHOD);
+ }
+
+ if (delegate.visitMethod(mthNsAName = (mthName = methodPrefix + methodNum++) + nsASuffix, mthDesc)) {
+ if (delegate.visitElementContent(MappedElementKind.METHOD)) {
+ delegate.visitComment(MappedElementKind.METHOD, mthName + commentSuffix);;
+ }
+ }
+ }
+ }
+
+ // Method args
+ if (delegate.visitClass(clsNsAName = (clsName = clsPrefix + clsNum++) + nsASuffix)) {
+ if (delegate.visitElementContent(MappedElementKind.CLASS)) {
+ if (delegate.visitMethod(mthNsAName = (mthName = methodPrefix + methodNum++) + nsASuffix, mthDesc)) {
+ if (delegate.visitElementContent(MappedElementKind.METHOD)) {
+ if (delegate.visitMethodArg(argNum, argNum, argNsAName = (argName = argPrefix + argNum++) + nsASuffix)) {
+ delegate.visitDstName(MappedElementKind.METHOD_ARG, 0, argName + nsBSuffix);
+ delegate.visitDstName(MappedElementKind.METHOD_ARG, 1, argName + nsCSuffix);
+ delegate.visitElementContent(MappedElementKind.METHOD_ARG);
+ }
+
+ if (delegate.visitMethodArg(argNum, argNum, argNsAName = (argName = argPrefix + argNum++) + nsASuffix)) {
+ delegate.visitDstName(MappedElementKind.METHOD_ARG, 0, argName + nsBSuffix);
+ delegate.visitElementContent(MappedElementKind.METHOD_ARG);
+ }
+
+ if (delegate.visitMethodArg(argNum, argNum, argNsAName = (argName = argPrefix + argNum++) + nsASuffix)) {
+ delegate.visitDstName(MappedElementKind.METHOD_ARG, 1, argName + nsCSuffix);
+ delegate.visitElementContent(MappedElementKind.METHOD_ARG);
+ }
+
+ if (delegate.visitMethodArg(argNum, argNum, argNsAName = (argName = argPrefix + argNum++) + nsASuffix)) {
+ delegate.visitDstName(MappedElementKind.METHOD_ARG, 0, argNsAName);
+ delegate.visitDstName(MappedElementKind.METHOD_ARG, 1, argName + nsCSuffix);
+ delegate.visitElementContent(MappedElementKind.METHOD_ARG);
+ }
+
+ if (delegate.visitMethodArg(argNum, argNum, argNsAName = (argName = argPrefix + argNum++) + nsASuffix)) {
+ delegate.visitDstName(MappedElementKind.METHOD_ARG, 0, argName + nsBSuffix);
+ delegate.visitDstName(MappedElementKind.METHOD_ARG, 1, argNsAName);
+ delegate.visitElementContent(MappedElementKind.METHOD_ARG);
+ }
+
+ if (delegate.visitMethodArg(argNum, argNum, argNsAName = (argName = argPrefix + argNum++) + nsASuffix)) {
+ delegate.visitDstName(MappedElementKind.METHOD_ARG, 0, argNsAName);
+ delegate.visitDstName(MappedElementKind.METHOD_ARG, 1, argNsAName);
+ delegate.visitElementContent(MappedElementKind.METHOD_ARG);
+ }
+
+ if (delegate.visitMethodArg(argNum, argNum, argNsAName = (argName = argPrefix + argNum++) + nsASuffix)) {
+ delegate.visitDstName(MappedElementKind.METHOD_ARG, 0, argNsAName);
+ delegate.visitElementContent(MappedElementKind.METHOD_ARG);
+ }
+
+ if (delegate.visitMethodArg(argNum, argNum, argNsAName = (argName = argPrefix + argNum++) + nsASuffix)) {
+ delegate.visitDstName(MappedElementKind.METHOD_ARG, 1, argNsAName);
+ delegate.visitElementContent(MappedElementKind.METHOD_ARG);
+ }
+
+ if (delegate.visitMethodArg(argNum, argNum, argNsAName = (argName = argPrefix + argNum++) + nsASuffix)) {
+ delegate.visitElementContent(MappedElementKind.METHOD_ARG);
+ }
+
+ if (delegate.visitMethodArg(argNum, argNum, argNsAName = (argName = argPrefix + argNum++) + nsASuffix)) {
+ if (delegate.visitElementContent(MappedElementKind.METHOD_ARG)) {
+ delegate.visitComment(MappedElementKind.METHOD_ARG, argName + commentSuffix);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // Method vars
+ if (delegate.visitClass(clsNsAName = (clsName = clsPrefix + clsNum++) + nsASuffix)) {
+ if (delegate.visitElementContent(MappedElementKind.CLASS)) {
+ if (delegate.visitMethod(mthNsAName = (mthName = methodPrefix + methodNum++) + nsASuffix, mthDesc)) {
+ if (delegate.visitElementContent(MappedElementKind.METHOD)) {
+ if (delegate.visitMethodVar(varNum, varNum, varNum, varNum + 1, varNsAName = (varName = varPrefix + varNum++) + nsASuffix)) {
+ delegate.visitDstName(MappedElementKind.METHOD_VAR, 0, varName + nsBSuffix);
+ delegate.visitDstName(MappedElementKind.METHOD_VAR, 1, varName + nsCSuffix);
+ delegate.visitElementContent(MappedElementKind.METHOD_VAR);
+ }
+
+ if (delegate.visitMethodVar(varNum, varNum, varNum, varNum + 1, varNsAName = (varName = varPrefix + varNum++) + nsASuffix)) {
+ delegate.visitDstName(MappedElementKind.METHOD_VAR, 0, varName + nsBSuffix);
+ delegate.visitElementContent(MappedElementKind.METHOD_VAR);
+ }
+
+ if (delegate.visitMethodVar(varNum, varNum, varNum, varNum + 1, varNsAName = (varName = varPrefix + varNum++) + nsASuffix)) {
+ delegate.visitDstName(MappedElementKind.METHOD_VAR, 1, varName + nsCSuffix);
+ delegate.visitElementContent(MappedElementKind.METHOD_VAR);
+ }
+
+ if (delegate.visitMethodVar(varNum, varNum, varNum, varNum + 1, varNsAName = (varName = varPrefix + varNum++) + nsASuffix)) {
+ delegate.visitDstName(MappedElementKind.METHOD_VAR, 0, varNsAName);
+ delegate.visitDstName(MappedElementKind.METHOD_VAR, 1, varName + nsCSuffix);
+ delegate.visitElementContent(MappedElementKind.METHOD_VAR);
+ }
+
+ if (delegate.visitMethodVar(varNum, varNum, varNum, varNum + 1, varNsAName = (varName = varPrefix + varNum++) + nsASuffix)) {
+ delegate.visitDstName(MappedElementKind.METHOD_VAR, 0, varName + nsBSuffix);
+ delegate.visitDstName(MappedElementKind.METHOD_VAR, 1, varNsAName);
+ delegate.visitElementContent(MappedElementKind.METHOD_VAR);
+ }
+
+ if (delegate.visitMethodVar(varNum, varNum, varNum, varNum + 1, varNsAName = (varName = varPrefix + varNum++) + nsASuffix)) {
+ delegate.visitDstName(MappedElementKind.METHOD_VAR, 0, varNsAName);
+ delegate.visitDstName(MappedElementKind.METHOD_VAR, 1, varNsAName);
+ delegate.visitElementContent(MappedElementKind.METHOD_VAR);
+ }
+
+ if (delegate.visitMethodVar(varNum, varNum, varNum, varNum + 1, varNsAName = (varName = varPrefix + varNum++) + nsASuffix)) {
+ delegate.visitDstName(MappedElementKind.METHOD_VAR, 0, varNsAName);
+ delegate.visitElementContent(MappedElementKind.METHOD_VAR);
+ }
+
+ if (delegate.visitMethodVar(varNum, varNum, varNum, varNum + 1, varNsAName = (varName = varPrefix + varNum++) + nsASuffix)) {
+ delegate.visitDstName(MappedElementKind.METHOD_VAR, 1, varNsAName);
+ delegate.visitElementContent(MappedElementKind.METHOD_VAR);
+ }
+
+ if (delegate.visitMethodVar(varNum, varNum, varNum, varNum + 1, varNsAName = (varName = varPrefix + varNum++) + nsASuffix)) {
+ delegate.visitElementContent(MappedElementKind.METHOD_VAR);
+ }
+
+ if (delegate.visitMethodVar(varNum, varNum, varNum, varNum + 1, varNsAName = (varName = varPrefix + varNum++) + nsASuffix)) {
+ if (delegate.visitElementContent(MappedElementKind.METHOD_VAR)) {
+ delegate.visitComment(MappedElementKind.METHOD_VAR, varName + commentSuffix);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (!delegate.visitEnd()) {
+ generateEmptyElementFiltering(delegate);
+ }
+
+ return target;
+ }
+
+ private static VisitOrderVerifier visitOrderVerifierWrapped(MappingVisitor target) {
+ return target instanceof VisitOrderVerifier ? (VisitOrderVerifier) target : new VisitOrderVerifier(target);
+ }
+
private static MappingDir register(MappingDir dir) {
dirs.add(dir);
dirsByPath.put(dir.path, dir);
@@ -407,13 +807,44 @@ public T generate(T target) throws IOException {
});
public static final MappingDir PROPAGATED = register(new MappingDir(BASE_DIR.resolve("propagated/")) {
public T generate(T target) throws IOException {
- generateOuterClassNamePropagation(new OuterClassNamePropagator(target));
+ generateOuterClassNamePropagation(new OuterClassNamePropagator(visitOrderVerifierWrapped(target)));
return target;
};
});
public static final MappingDir PROPAGATED_EXCEPT_REMAPPED_DST = register(new MappingDir(BASE_DIR.resolve("propagated-except-remapped-dst/")) {
public T generate(T target) throws IOException {
- generateOuterClassNamePropagation(new OuterClassNamePropagator(target, null, false));
+ generateOuterClassNamePropagation(
+ new OuterClassNamePropagator(
+ visitOrderVerifierWrapped(target),
+ null,
+ false));
+ return target;
+ };
+ });
+ }
+
+ public static class FILTERING {
+ public static final Path BASE_DIR = TestUtil.getResource("/filtering/");
+
+ public static final MappingDir UNFILTERED = register(new MappingDir(BASE_DIR.resolve("unfiltered/")) {
+ public T generate(T target) throws IOException {
+ return generateEmptyElementFiltering(target);
+ };
+ });
+
+ public static final MappingDir FILTERED = register(new MappingDir(BASE_DIR.resolve("filtered/")) {
+ public T generate(T target) throws IOException {
+ generateEmptyElementFiltering(new EmptyElementFilter(visitOrderVerifierWrapped(target)));
+ return target;
+ };
+ });
+
+ public static final MappingDir FILTERED_EXCEPT_SRC_ON_DST = register(new MappingDir(BASE_DIR.resolve("filtered-except-src-on-dst/")) {
+ public T generate(T target) throws IOException {
+ generateEmptyElementFiltering(
+ new EmptyElementFilter(
+ visitOrderVerifierWrapped(target),
+ false));
return target;
};
});
@@ -423,6 +854,7 @@ public T generate(T target) throws IOException {
// Force-load classes to ensure all MappingDirs are registered
READING.BASE_DIR.toString();
PROPAGATION.BASE_DIR.toString();
+ FILTERING.BASE_DIR.toString();
}
public abstract static class MappingDir {
@@ -464,5 +896,10 @@ public boolean supportsGeneration() {
}
public abstract T generate(T target) throws IOException;
+
+ @Override
+ public String toString() {
+ return TestUtil.getResource("/").relativize(path).toString();
+ }
}
}
diff --git a/src/test/java/net/fabricmc/mappingio/test/tests/OuterClassNamePropagationTest.java b/src/test/java/net/fabricmc/mappingio/test/tests/OuterClassNamePropagationTest.java
index fd6c73f2..7f6b3fac 100644
--- a/src/test/java/net/fabricmc/mappingio/test/tests/OuterClassNamePropagationTest.java
+++ b/src/test/java/net/fabricmc/mappingio/test/tests/OuterClassNamePropagationTest.java
@@ -16,6 +16,7 @@
package net.fabricmc.mappingio.test.tests;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -127,16 +128,20 @@ public void tree() throws IOException {
}
private void checkDiskEquivalence(VisitableMappingTree tree, boolean processRemappedDstNames) throws IOException {
+ MappingDir dir = processRemappedDstNames
+ ? TestMappings.PROPAGATION.PROPAGATED
+ : TestMappings.PROPAGATION.PROPAGATED_EXCEPT_REMAPPED_DST;
+
for (MappingFormat format : MappingFormat.values()) {
- MappingDir dir = processRemappedDstNames
- ? TestMappings.PROPAGATION.PROPAGATED
- : TestMappings.PROPAGATION.PROPAGATED_EXCEPT_REMAPPED_DST;
+ assertDoesNotThrow(() -> checkDiskEquivalence(dir, format, tree), "Failed for " + dir + " with " + format);
+ }
+ }
- VisitableMappingTree diskTree = dir.read(format, new MemoryMappingTree());
+ private void checkDiskEquivalence(MappingDir dir, MappingFormat format, VisitableMappingTree tree) throws IOException {
+ VisitableMappingTree diskTree = dir.read(format, new MemoryMappingTree());
- tree.accept(new FlatAsRegularMappingVisitor(new SubsetAsserter(diskTree, format, null)));
- diskTree.accept(new FlatAsRegularMappingVisitor(new SubsetAsserter(tree, null, format)));
- }
+ tree.accept(new FlatAsRegularMappingVisitor(new SubsetAsserter(diskTree, format, null)));
+ diskTree.accept(new FlatAsRegularMappingVisitor(new SubsetAsserter(tree, null, format)));
}
private static class OuterClassNameChecker extends NopMappingVisitor {
diff --git a/src/test/java/net/fabricmc/mappingio/test/tests/filtering/EmptyElementFilterTest.java b/src/test/java/net/fabricmc/mappingio/test/tests/filtering/EmptyElementFilterTest.java
new file mode 100644
index 00000000..4af11fc1
--- /dev/null
+++ b/src/test/java/net/fabricmc/mappingio/test/tests/filtering/EmptyElementFilterTest.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2025 FabricMC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package net.fabricmc.mappingio.test.tests.filtering;
+
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+
+import java.io.IOException;
+
+import org.junit.jupiter.api.Test;
+
+import net.fabricmc.mappingio.MappingVisitor;
+import net.fabricmc.mappingio.adapter.EmptyElementFilter;
+import net.fabricmc.mappingio.adapter.FlatAsRegularMappingVisitor;
+import net.fabricmc.mappingio.format.MappingFormat;
+import net.fabricmc.mappingio.test.TestMappings;
+import net.fabricmc.mappingio.test.TestMappings.MappingDir;
+import net.fabricmc.mappingio.test.visitors.SubsetAsserter;
+import net.fabricmc.mappingio.tree.MemoryMappingTree;
+import net.fabricmc.mappingio.tree.VisitableMappingTree;
+
+public class EmptyElementFilterTest {
+ private static T acceptMappings(T visitor) throws IOException {
+ return TestMappings.generateEmptyElementFiltering(visitor);
+ }
+
+ @Test
+ public void run() throws IOException {
+ for (int pass = 1; pass <= 2; pass++) {
+ boolean treatSrcOnDstAsEmpty = pass == 1;
+ VisitableMappingTree tree = new MemoryMappingTree();
+
+ acceptMappings(new EmptyElementFilter(tree, treatSrcOnDstAsEmpty));
+ check(tree, treatSrcOnDstAsEmpty);
+ }
+ }
+
+ private void check(VisitableMappingTree tree, boolean treatSrcOnDstAsEmpty) throws IOException {
+ MappingDir dir = treatSrcOnDstAsEmpty
+ ? TestMappings.FILTERING.FILTERED
+ : TestMappings.FILTERING.FILTERED_EXCEPT_SRC_ON_DST;
+
+ for (MappingFormat format : MappingFormat.values()) {
+ assertDoesNotThrow(() -> checkDiskEquivalence(tree, dir, format), "Failed for " + dir + " with " + format);
+ }
+ }
+
+ private void checkDiskEquivalence(VisitableMappingTree tree, MappingDir dir, MappingFormat format) throws IOException {
+ VisitableMappingTree diskTree = dir.read(format, new MemoryMappingTree());
+
+ tree.accept(new FlatAsRegularMappingVisitor(new SubsetAsserter(diskTree, format, null)));
+ diskTree.accept(new FlatAsRegularMappingVisitor(new SubsetAsserter(tree, null, format)));
+ }
+}
diff --git a/src/test/java/net/fabricmc/mappingio/test/tests/reading/DetectionTest.java b/src/test/java/net/fabricmc/mappingio/test/tests/reading/DetectionTest.java
index d4dc56b0..62aad5bb 100644
--- a/src/test/java/net/fabricmc/mappingio/test/tests/reading/DetectionTest.java
+++ b/src/test/java/net/fabricmc/mappingio/test/tests/reading/DetectionTest.java
@@ -16,6 +16,7 @@
package net.fabricmc.mappingio.test.tests.reading;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -43,7 +44,7 @@ public void run() throws Exception {
if (format == MappingFormat.RECAF_SIMPLE_FILE) {
assertThrows(AssertionFailedError.class, () -> check(dir, format));
} else {
- check(dir, format);
+ assertDoesNotThrow(() -> check(dir, format), "Failed for " + dir + " with " + format);
}
}
}
diff --git a/src/test/java/net/fabricmc/mappingio/test/tests/reading/ValidContentReadTest.java b/src/test/java/net/fabricmc/mappingio/test/tests/reading/ValidContentReadTest.java
index 8a6eea1a..4f18a24b 100644
--- a/src/test/java/net/fabricmc/mappingio/test/tests/reading/ValidContentReadTest.java
+++ b/src/test/java/net/fabricmc/mappingio/test/tests/reading/ValidContentReadTest.java
@@ -16,6 +16,8 @@
package net.fabricmc.mappingio.test.tests.reading;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+
import java.nio.file.Files;
import org.jetbrains.annotations.Nullable;
@@ -39,7 +41,7 @@ public class ValidContentReadTest {
public void run() throws Exception {
for (MappingDir dir : TestMappings.values()) {
for (MappingFormat format : MappingFormat.values()) {
- check(dir, format);
+ assertDoesNotThrow(() -> check(dir, format), "Failed for " + dir + " with " + format);
}
}
}
@@ -70,6 +72,9 @@ private void check(MappingDir dir, MappingFormat format) throws Exception {
}
tree = new MemoryMappingTree();
+ String oldSrcNs = format.features().hasNamespaces()
+ ? referenceTree.getSrcNamespace()
+ : MappingUtil.NS_SOURCE_FALLBACK;
String newSrcNs = format.features().hasNamespaces()
? referenceTree.getDstNamespaces().get(0)
: MappingUtil.NS_TARGET_FALLBACK;
@@ -77,7 +82,7 @@ private void check(MappingDir dir, MappingFormat format) throws Exception {
new VisitOrderVerifier(
new MappingSourceNsSwitch(
new VisitOrderVerifier(tree, allowConsecutiveDuplicateElementVisits),
- referenceTree.getSrcNamespace()),
+ oldSrcNs),
allowConsecutiveDuplicateElementVisits),
newSrcNs);
diff --git a/src/test/java/net/fabricmc/mappingio/test/tests/visiting/VisitEndTest.java b/src/test/java/net/fabricmc/mappingio/test/tests/visiting/VisitEndTest.java
index b70a2db2..8fb1eb98 100644
--- a/src/test/java/net/fabricmc/mappingio/test/tests/visiting/VisitEndTest.java
+++ b/src/test/java/net/fabricmc/mappingio/test/tests/visiting/VisitEndTest.java
@@ -16,6 +16,7 @@
package net.fabricmc.mappingio.test.tests.visiting;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -46,7 +47,7 @@ public class VisitEndTest {
public void run() throws Exception {
for (MappingDir dir : TestMappings.values()) {
for (MappingFormat format : MappingFormat.values()) {
- check(dir, format);
+ assertDoesNotThrow(() -> check(dir, format), "Failed for " + dir + " with " + format);
}
}
}
diff --git a/src/test/java/net/fabricmc/mappingio/test/tests/writing/WriteTest.java b/src/test/java/net/fabricmc/mappingio/test/tests/writing/WriteTest.java
index e6a9542e..7eca6ee0 100644
--- a/src/test/java/net/fabricmc/mappingio/test/tests/writing/WriteTest.java
+++ b/src/test/java/net/fabricmc/mappingio/test/tests/writing/WriteTest.java
@@ -16,6 +16,8 @@
package net.fabricmc.mappingio.test.tests.writing;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+
import java.io.IOException;
import java.nio.file.Path;
@@ -48,7 +50,7 @@ public class WriteTest {
public void run() throws Exception {
for (MappingDir dir : TestMappings.values()) {
for (MappingFormat format : MappingFormat.values()) {
- check(dir, format);
+ assertDoesNotThrow(() -> check(dir, format), "Failed for " + dir + " with " + format);
}
}
}
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/csrg.csrg b/src/test/resources/filtering/filtered-except-src-on-dst/csrg.csrg
new file mode 100644
index 00000000..dae3acd7
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/csrg.csrg
@@ -0,0 +1,20 @@
+cls0NsAName cls0NsBName
+cls1NsAName cls1NsBName
+cls3NsAName cls3NsAName
+cls4NsAName cls4NsBName
+cls5NsAName cls5NsAName
+cls6NsAName cls6NsAName
+cls14NsAName fld1NsAName fld1NsAName
+cls15NsAName mth3NsAName ()I mth3NsAName
+cls18NsAName fld2NsAName fld2NsBName
+cls18NsAName fld3NsAName fld3NsBName
+cls18NsAName fld5NsAName fld5NsAName
+cls18NsAName fld6NsAName fld6NsBName
+cls18NsAName fld7NsAName fld7NsAName
+cls18NsAName fld8NsAName fld8NsAName
+cls19NsAName mth6NsAName ()I mth6NsBName
+cls19NsAName mth7NsAName ()I mth7NsBName
+cls19NsAName mth9NsAName ()I mth9NsAName
+cls19NsAName mth10NsAName ()I mth10NsBName
+cls19NsAName mth11NsAName ()I mth11NsAName
+cls19NsAName mth12NsAName ()I mth12NsAName
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls0NsBName.mapping b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls0NsBName.mapping
new file mode 100644
index 00000000..2865bcb5
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls0NsBName.mapping
@@ -0,0 +1 @@
+CLASS cls0NsAName cls0NsBName
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls14NsAName.mapping b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls14NsAName.mapping
new file mode 100644
index 00000000..b3592e81
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls14NsAName.mapping
@@ -0,0 +1,2 @@
+CLASS cls14NsAName
+ FIELD fld1NsAName fld1NsAName I
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls15NsAName.mapping b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls15NsAName.mapping
new file mode 100644
index 00000000..ddc214f6
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls15NsAName.mapping
@@ -0,0 +1,2 @@
+CLASS cls15NsAName
+ METHOD mth3NsAName mth3NsAName ()I
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls16NsAName.mapping b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls16NsAName.mapping
new file mode 100644
index 00000000..0c94e4db
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls16NsAName.mapping
@@ -0,0 +1,3 @@
+CLASS cls16NsAName
+ METHOD mth4NsAName ()I
+ ARG 1 arg1NsAName
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls17NsAName.mapping b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls17NsAName.mapping
new file mode 100644
index 00000000..ee1e651e
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls17NsAName.mapping
@@ -0,0 +1,2 @@
+CLASS cls17NsAName
+ METHOD mth5NsAName ()I
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls18NsAName.mapping b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls18NsAName.mapping
new file mode 100644
index 00000000..23408d86
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls18NsAName.mapping
@@ -0,0 +1,11 @@
+CLASS cls18NsAName
+ FIELD fld2NsAName fld2NsBName I
+ FIELD fld3NsAName fld3NsBName I
+ FIELD fld4NsAName I
+ FIELD fld5NsAName fld5NsAName I
+ FIELD fld6NsAName fld6NsBName I
+ FIELD fld7NsAName fld7NsAName I
+ FIELD fld8NsAName fld8NsAName I
+ FIELD fld9NsAName I
+ FIELD fld11NsAName I
+ COMMENT fld11Comment
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls19NsAName.mapping b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls19NsAName.mapping
new file mode 100644
index 00000000..7f09ab01
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls19NsAName.mapping
@@ -0,0 +1,11 @@
+CLASS cls19NsAName
+ METHOD mth6NsAName mth6NsBName ()I
+ METHOD mth7NsAName mth7NsBName ()I
+ METHOD mth8NsAName ()I
+ METHOD mth9NsAName mth9NsAName ()I
+ METHOD mth10NsAName mth10NsBName ()I
+ METHOD mth11NsAName mth11NsAName ()I
+ METHOD mth12NsAName mth12NsAName ()I
+ METHOD mth13NsAName ()I
+ METHOD mth15NsAName ()I
+ COMMENT mth15Comment
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls1NsBName.mapping b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls1NsBName.mapping
new file mode 100644
index 00000000..3e6ee819
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls1NsBName.mapping
@@ -0,0 +1 @@
+CLASS cls1NsAName cls1NsBName
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls20NsAName.mapping b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls20NsAName.mapping
new file mode 100644
index 00000000..880e72ca
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls20NsAName.mapping
@@ -0,0 +1,12 @@
+CLASS cls20NsAName
+ METHOD mth16NsAName ()I
+ ARG 2 arg2NsBName
+ ARG 3 arg3NsBName
+ ARG 4
+ ARG 5 arg5NsAName
+ ARG 6 arg6NsBName
+ ARG 7 arg7NsAName
+ ARG 8 arg8NsAName
+ ARG 9
+ ARG 11
+ COMMENT arg11Comment
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls21NsAName.mapping b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls21NsAName.mapping
new file mode 100644
index 00000000..d634194f
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls21NsAName.mapping
@@ -0,0 +1,2 @@
+CLASS cls21NsAName
+ METHOD mth17NsAName ()I
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls2NsAName.mapping b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls2NsAName.mapping
new file mode 100644
index 00000000..d20f6419
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls2NsAName.mapping
@@ -0,0 +1 @@
+CLASS cls2NsAName
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls3NsAName.mapping b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls3NsAName.mapping
new file mode 100644
index 00000000..755f8a61
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls3NsAName.mapping
@@ -0,0 +1 @@
+CLASS cls3NsAName cls3NsAName
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls4NsBName.mapping b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls4NsBName.mapping
new file mode 100644
index 00000000..15a4e79d
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls4NsBName.mapping
@@ -0,0 +1 @@
+CLASS cls4NsAName cls4NsBName
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls5NsAName.mapping b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls5NsAName.mapping
new file mode 100644
index 00000000..13a97f43
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls5NsAName.mapping
@@ -0,0 +1 @@
+CLASS cls5NsAName cls5NsAName
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls6NsAName.mapping b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls6NsAName.mapping
new file mode 100644
index 00000000..33c177e2
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls6NsAName.mapping
@@ -0,0 +1 @@
+CLASS cls6NsAName cls6NsAName
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls7NsAName.mapping b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls7NsAName.mapping
new file mode 100644
index 00000000..810eace1
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls7NsAName.mapping
@@ -0,0 +1 @@
+CLASS cls7NsAName
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls9NsAName.mapping b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls9NsAName.mapping
new file mode 100644
index 00000000..eed5719c
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/enigma-dir/cls9NsAName.mapping
@@ -0,0 +1,2 @@
+CLASS cls9NsAName
+ COMMENT cls9Comment
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/enigma.mappings b/src/test/resources/filtering/filtered-except-src-on-dst/enigma.mappings
new file mode 100644
index 00000000..1c39de56
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/enigma.mappings
@@ -0,0 +1,55 @@
+CLASS cls0NsAName cls0NsBName
+CLASS cls1NsAName cls1NsBName
+CLASS cls2NsAName
+CLASS cls3NsAName cls3NsAName
+CLASS cls4NsAName cls4NsBName
+CLASS cls5NsAName cls5NsAName
+CLASS cls6NsAName cls6NsAName
+CLASS cls7NsAName
+CLASS cls9NsAName
+ COMMENT cls9Comment
+CLASS cls14NsAName
+ FIELD fld1NsAName fld1NsAName I
+CLASS cls15NsAName
+ METHOD mth3NsAName mth3NsAName ()I
+CLASS cls16NsAName
+ METHOD mth4NsAName ()I
+ ARG 1 arg1NsAName
+CLASS cls17NsAName
+ METHOD mth5NsAName ()I
+CLASS cls18NsAName
+ FIELD fld2NsAName fld2NsBName I
+ FIELD fld3NsAName fld3NsBName I
+ FIELD fld4NsAName I
+ FIELD fld5NsAName fld5NsAName I
+ FIELD fld6NsAName fld6NsBName I
+ FIELD fld7NsAName fld7NsAName I
+ FIELD fld8NsAName fld8NsAName I
+ FIELD fld9NsAName I
+ FIELD fld11NsAName I
+ COMMENT fld11Comment
+CLASS cls19NsAName
+ METHOD mth6NsAName mth6NsBName ()I
+ METHOD mth7NsAName mth7NsBName ()I
+ METHOD mth8NsAName ()I
+ METHOD mth9NsAName mth9NsAName ()I
+ METHOD mth10NsAName mth10NsBName ()I
+ METHOD mth11NsAName mth11NsAName ()I
+ METHOD mth12NsAName mth12NsAName ()I
+ METHOD mth13NsAName ()I
+ METHOD mth15NsAName ()I
+ COMMENT mth15Comment
+CLASS cls20NsAName
+ METHOD mth16NsAName ()I
+ ARG 2 arg2NsBName
+ ARG 3 arg3NsBName
+ ARG 4
+ ARG 5 arg5NsAName
+ ARG 6 arg6NsBName
+ ARG 7 arg7NsAName
+ ARG 8 arg8NsAName
+ ARG 9
+ ARG 11
+ COMMENT arg11Comment
+CLASS cls21NsAName
+ METHOD mth17NsAName ()I
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/jam.jam b/src/test/resources/filtering/filtered-except-src-on-dst/jam.jam
new file mode 100644
index 00000000..43d1fd6d
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/jam.jam
@@ -0,0 +1,27 @@
+CL cls0NsAName cls0NsBName
+CL cls1NsAName cls1NsBName
+CL cls3NsAName cls3NsAName
+CL cls4NsAName cls4NsBName
+CL cls5NsAName cls5NsAName
+CL cls6NsAName cls6NsAName
+FD cls14NsAName fld1NsAName I fld1NsAName
+MD cls15NsAName mth3NsAName ()I mth3NsAName
+MP cls16NsAName mth4NsAName ()I 1 arg1NsAName
+FD cls18NsAName fld2NsAName I fld2NsBName
+FD cls18NsAName fld3NsAName I fld3NsBName
+FD cls18NsAName fld5NsAName I fld5NsAName
+FD cls18NsAName fld6NsAName I fld6NsBName
+FD cls18NsAName fld7NsAName I fld7NsAName
+FD cls18NsAName fld8NsAName I fld8NsAName
+MD cls19NsAName mth6NsAName ()I mth6NsBName
+MD cls19NsAName mth7NsAName ()I mth7NsBName
+MD cls19NsAName mth9NsAName ()I mth9NsAName
+MD cls19NsAName mth10NsAName ()I mth10NsBName
+MD cls19NsAName mth11NsAName ()I mth11NsAName
+MD cls19NsAName mth12NsAName ()I mth12NsAName
+MP cls20NsAName mth16NsAName ()I 2 arg2NsBName
+MP cls20NsAName mth16NsAName ()I 3 arg3NsBName
+MP cls20NsAName mth16NsAName ()I 5 arg5NsAName
+MP cls20NsAName mth16NsAName ()I 6 arg6NsBName
+MP cls20NsAName mth16NsAName ()I 7 arg7NsAName
+MP cls20NsAName mth16NsAName ()I 8 arg8NsAName
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/jobf.jobf b/src/test/resources/filtering/filtered-except-src-on-dst/jobf.jobf
new file mode 100644
index 00000000..fb636714
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/jobf.jobf
@@ -0,0 +1,20 @@
+c cls0NsAName = cls0NsBName
+c cls1NsAName = cls1NsBName
+c cls3NsAName = cls3NsAName
+c cls4NsAName = cls4NsBName
+c cls5NsAName = cls5NsAName
+c cls6NsAName = cls6NsAName
+f cls14NsAName.fld1NsAName:I = fld1NsAName
+m cls15NsAName.mth3NsAName()I = mth3NsAName
+f cls18NsAName.fld2NsAName:I = fld2NsBName
+f cls18NsAName.fld3NsAName:I = fld3NsBName
+f cls18NsAName.fld5NsAName:I = fld5NsAName
+f cls18NsAName.fld6NsAName:I = fld6NsBName
+f cls18NsAName.fld7NsAName:I = fld7NsAName
+f cls18NsAName.fld8NsAName:I = fld8NsAName
+m cls19NsAName.mth6NsAName()I = mth6NsBName
+m cls19NsAName.mth7NsAName()I = mth7NsBName
+m cls19NsAName.mth9NsAName()I = mth9NsAName
+m cls19NsAName.mth10NsAName()I = mth10NsBName
+m cls19NsAName.mth11NsAName()I = mth11NsAName
+m cls19NsAName.mth12NsAName()I = mth12NsAName
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/migration-map.xml b/src/test/resources/filtering/filtered-except-src-on-dst/migration-map.xml
new file mode 100644
index 00000000..54a63a82
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/migration-map.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/proguard.txt b/src/test/resources/filtering/filtered-except-src-on-dst/proguard.txt
new file mode 100644
index 00000000..11fead9f
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/proguard.txt
@@ -0,0 +1,24 @@
+cls0NsAName -> cls0NsBName:
+cls1NsAName -> cls1NsBName:
+cls3NsAName -> cls3NsAName:
+cls4NsAName -> cls4NsBName:
+cls5NsAName -> cls5NsAName:
+cls6NsAName -> cls6NsAName:
+cls14NsAName -> cls14NsAName:
+ int fld1NsAName -> fld1NsAName
+cls15NsAName -> cls15NsAName:
+ int mth3NsAName() -> mth3NsAName
+cls18NsAName -> cls18NsAName:
+ int fld2NsAName -> fld2NsBName
+ int fld3NsAName -> fld3NsBName
+ int fld5NsAName -> fld5NsAName
+ int fld6NsAName -> fld6NsBName
+ int fld7NsAName -> fld7NsAName
+ int fld8NsAName -> fld8NsAName
+cls19NsAName -> cls19NsAName:
+ int mth6NsAName() -> mth6NsBName
+ int mth7NsAName() -> mth7NsBName
+ int mth9NsAName() -> mth9NsAName
+ int mth10NsAName() -> mth10NsBName
+ int mth11NsAName() -> mth11NsAName
+ int mth12NsAName() -> mth12NsAName
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/recaf-simple.txt b/src/test/resources/filtering/filtered-except-src-on-dst/recaf-simple.txt
new file mode 100644
index 00000000..5991c8f7
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/recaf-simple.txt
@@ -0,0 +1,20 @@
+cls0NsAName cls0NsBName
+cls1NsAName cls1NsBName
+cls3NsAName cls3NsAName
+cls4NsAName cls4NsBName
+cls5NsAName cls5NsAName
+cls6NsAName cls6NsAName
+cls14NsAName.fld1NsAName I fld1NsAName
+cls15NsAName.mth3NsAName()I mth3NsAName
+cls18NsAName.fld2NsAName I fld2NsBName
+cls18NsAName.fld3NsAName I fld3NsBName
+cls18NsAName.fld5NsAName I fld5NsAName
+cls18NsAName.fld6NsAName I fld6NsBName
+cls18NsAName.fld7NsAName I fld7NsAName
+cls18NsAName.fld8NsAName I fld8NsAName
+cls19NsAName.mth6NsAName()I mth6NsBName
+cls19NsAName.mth7NsAName()I mth7NsBName
+cls19NsAName.mth9NsAName()I mth9NsAName
+cls19NsAName.mth10NsAName()I mth10NsBName
+cls19NsAName.mth11NsAName()I mth11NsAName
+cls19NsAName.mth12NsAName()I mth12NsAName
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/srg.srg b/src/test/resources/filtering/filtered-except-src-on-dst/srg.srg
new file mode 100644
index 00000000..f730c4aa
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/srg.srg
@@ -0,0 +1,20 @@
+CL: cls0NsAName cls0NsBName
+CL: cls1NsAName cls1NsBName
+CL: cls3NsAName cls3NsAName
+CL: cls4NsAName cls4NsBName
+CL: cls5NsAName cls5NsAName
+CL: cls6NsAName cls6NsAName
+FD: cls14NsAName/fld1NsAName cls14NsAName/fld1NsAName
+MD: cls15NsAName/mth3NsAName ()I cls15NsAName/mth3NsAName ()I
+FD: cls18NsAName/fld2NsAName cls18NsAName/fld2NsBName
+FD: cls18NsAName/fld3NsAName cls18NsAName/fld3NsBName
+FD: cls18NsAName/fld5NsAName cls18NsAName/fld5NsAName
+FD: cls18NsAName/fld6NsAName cls18NsAName/fld6NsBName
+FD: cls18NsAName/fld7NsAName cls18NsAName/fld7NsAName
+FD: cls18NsAName/fld8NsAName cls18NsAName/fld8NsAName
+MD: cls19NsAName/mth6NsAName ()I cls19NsAName/mth6NsBName ()I
+MD: cls19NsAName/mth7NsAName ()I cls19NsAName/mth7NsBName ()I
+MD: cls19NsAName/mth9NsAName ()I cls19NsAName/mth9NsAName ()I
+MD: cls19NsAName/mth10NsAName ()I cls19NsAName/mth10NsBName ()I
+MD: cls19NsAName/mth11NsAName ()I cls19NsAName/mth11NsAName ()I
+MD: cls19NsAName/mth12NsAName ()I cls19NsAName/mth12NsAName ()I
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/tiny.tiny b/src/test/resources/filtering/filtered-except-src-on-dst/tiny.tiny
new file mode 100644
index 00000000..345a3793
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/tiny.tiny
@@ -0,0 +1,27 @@
+v1 nsA nsB nsC
+CLASS cls0NsAName cls0NsBName cls0NsCName
+CLASS cls1NsAName cls1NsBName
+CLASS cls2NsAName cls2NsCName
+CLASS cls3NsAName cls3NsAName cls3NsCName
+CLASS cls4NsAName cls4NsBName cls4NsAName
+CLASS cls5NsAName cls5NsAName cls5NsAName
+CLASS cls6NsAName cls6NsAName
+CLASS cls7NsAName cls7NsAName
+FIELD cls14NsAName I fld1NsAName fld1NsAName
+METHOD cls15NsAName ()I mth3NsAName mth3NsAName
+FIELD cls18NsAName I fld2NsAName fld2NsBName fld2NsCName
+FIELD cls18NsAName I fld3NsAName fld3NsBName
+FIELD cls18NsAName I fld4NsAName fld4NsCName
+FIELD cls18NsAName I fld5NsAName fld5NsAName fld5NsCName
+FIELD cls18NsAName I fld6NsAName fld6NsBName fld6NsAName
+FIELD cls18NsAName I fld7NsAName fld7NsAName fld7NsAName
+FIELD cls18NsAName I fld8NsAName fld8NsAName
+FIELD cls18NsAName I fld9NsAName fld9NsAName
+METHOD cls19NsAName ()I mth6NsAName mth6NsBName mth6NsCName
+METHOD cls19NsAName ()I mth7NsAName mth7NsBName
+METHOD cls19NsAName ()I mth8NsAName mth8NsCName
+METHOD cls19NsAName ()I mth9NsAName mth9NsAName mth9NsCName
+METHOD cls19NsAName ()I mth10NsAName mth10NsBName mth10NsAName
+METHOD cls19NsAName ()I mth11NsAName mth11NsAName mth11NsAName
+METHOD cls19NsAName ()I mth12NsAName mth12NsAName
+METHOD cls19NsAName ()I mth13NsAName mth13NsAName
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/tinyV2.tiny b/src/test/resources/filtering/filtered-except-src-on-dst/tinyV2.tiny
new file mode 100644
index 00000000..56616569
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/tinyV2.tiny
@@ -0,0 +1,67 @@
+tiny 2 0 nsA nsB nsC
+c cls0NsAName cls0NsBName cls0NsCName
+c cls1NsAName cls1NsBName
+c cls2NsAName cls2NsCName
+c cls3NsAName cls3NsAName cls3NsCName
+c cls4NsAName cls4NsBName cls4NsAName
+c cls5NsAName cls5NsAName cls5NsAName
+c cls6NsAName cls6NsAName
+c cls7NsAName cls7NsAName
+c cls9NsAName
+ c cls9Comment
+c cls14NsAName
+ f I fld1NsAName fld1NsAName
+c cls15NsAName
+ m ()I mth3NsAName mth3NsAName
+c cls16NsAName
+ m ()I mth4NsAName
+ p 1 arg1NsAName arg1NsAName
+c cls17NsAName
+ m ()I mth5NsAName
+ v 1 1 1 var1NsAName var1NsAName
+c cls18NsAName
+ f I fld2NsAName fld2NsBName fld2NsCName
+ f I fld3NsAName fld3NsBName
+ f I fld4NsAName fld4NsCName
+ f I fld5NsAName fld5NsAName fld5NsCName
+ f I fld6NsAName fld6NsBName fld6NsAName
+ f I fld7NsAName fld7NsAName fld7NsAName
+ f I fld8NsAName fld8NsAName
+ f I fld9NsAName fld9NsAName
+ f I fld11NsAName
+ c fld11Comment
+c cls19NsAName
+ m ()I mth6NsAName mth6NsBName mth6NsCName
+ m ()I mth7NsAName mth7NsBName
+ m ()I mth8NsAName mth8NsCName
+ m ()I mth9NsAName mth9NsAName mth9NsCName
+ m ()I mth10NsAName mth10NsBName mth10NsAName
+ m ()I mth11NsAName mth11NsAName mth11NsAName
+ m ()I mth12NsAName mth12NsAName
+ m ()I mth13NsAName mth13NsAName
+ m ()I mth15NsAName
+ c mth15Comment
+c cls20NsAName
+ m ()I mth16NsAName
+ p 2 arg2NsAName arg2NsBName arg2NsCName
+ p 3 arg3NsAName arg3NsBName
+ p 4 arg4NsAName arg4NsCName
+ p 5 arg5NsAName arg5NsAName arg5NsCName
+ p 6 arg6NsAName arg6NsBName arg6NsAName
+ p 7 arg7NsAName arg7NsAName arg7NsAName
+ p 8 arg8NsAName arg8NsAName
+ p 9 arg9NsAName arg9NsAName
+ p 11 arg11NsAName
+ c arg11Comment
+c cls21NsAName
+ m ()I mth17NsAName
+ v 2 2 2 var2NsAName var2NsBName var2NsCName
+ v 3 3 3 var3NsAName var3NsBName
+ v 4 4 4 var4NsAName var4NsCName
+ v 5 5 5 var5NsAName var5NsAName var5NsCName
+ v 6 6 6 var6NsAName var6NsBName var6NsAName
+ v 7 7 7 var7NsAName var7NsAName var7NsAName
+ v 8 8 8 var8NsAName var8NsAName
+ v 9 9 9 var9NsAName var9NsAName
+ v 11 11 11 var11NsAName
+ c var11Comment
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/tsrg.tsrg b/src/test/resources/filtering/filtered-except-src-on-dst/tsrg.tsrg
new file mode 100644
index 00000000..b72dc993
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/tsrg.tsrg
@@ -0,0 +1,24 @@
+cls0NsAName cls0NsBName
+cls1NsAName cls1NsBName
+cls3NsAName cls3NsAName
+cls4NsAName cls4NsBName
+cls5NsAName cls5NsAName
+cls6NsAName cls6NsAName
+cls14NsAName cls14NsAName
+ fld1NsAName fld1NsAName
+cls15NsAName cls15NsAName
+ mth3NsAName ()I mth3NsAName
+cls18NsAName cls18NsAName
+ fld2NsAName fld2NsBName
+ fld3NsAName fld3NsBName
+ fld5NsAName fld5NsAName
+ fld6NsAName fld6NsBName
+ fld7NsAName fld7NsAName
+ fld8NsAName fld8NsAName
+cls19NsAName cls19NsAName
+ mth6NsAName ()I mth6NsBName
+ mth7NsAName ()I mth7NsBName
+ mth9NsAName ()I mth9NsAName
+ mth10NsAName ()I mth10NsBName
+ mth11NsAName ()I mth11NsAName
+ mth12NsAName ()I mth12NsAName
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/tsrgV2.tsrg b/src/test/resources/filtering/filtered-except-src-on-dst/tsrgV2.tsrg
new file mode 100644
index 00000000..b9ef4950
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/tsrgV2.tsrg
@@ -0,0 +1,44 @@
+tsrg2 nsA nsB nsC
+cls0NsAName cls0NsBName cls0NsCName
+cls1NsAName cls1NsBName cls1NsAName
+cls2NsAName cls2NsAName cls2NsCName
+cls3NsAName cls3NsAName cls3NsCName
+cls4NsAName cls4NsBName cls4NsAName
+cls5NsAName cls5NsAName cls5NsAName
+cls6NsAName cls6NsAName cls6NsAName
+cls7NsAName cls7NsAName cls7NsAName
+cls14NsAName cls14NsAName cls14NsAName
+ fld1NsAName I fld1NsAName fld1NsAName
+cls15NsAName cls15NsAName cls15NsAName
+ mth3NsAName ()I mth3NsAName mth3NsAName
+cls16NsAName cls16NsAName cls16NsAName
+ mth4NsAName ()I mth4NsAName mth4NsAName
+ 1 arg1NsAName arg1NsAName arg1NsAName
+cls18NsAName cls18NsAName cls18NsAName
+ fld2NsAName I fld2NsBName fld2NsCName
+ fld3NsAName I fld3NsBName fld3NsAName
+ fld4NsAName I fld4NsAName fld4NsCName
+ fld5NsAName I fld5NsAName fld5NsCName
+ fld6NsAName I fld6NsBName fld6NsAName
+ fld7NsAName I fld7NsAName fld7NsAName
+ fld8NsAName I fld8NsAName fld8NsAName
+ fld9NsAName I fld9NsAName fld9NsAName
+cls19NsAName cls19NsAName cls19NsAName
+ mth6NsAName ()I mth6NsBName mth6NsCName
+ mth7NsAName ()I mth7NsBName mth7NsAName
+ mth8NsAName ()I mth8NsAName mth8NsCName
+ mth9NsAName ()I mth9NsAName mth9NsCName
+ mth10NsAName ()I mth10NsBName mth10NsAName
+ mth11NsAName ()I mth11NsAName mth11NsAName
+ mth12NsAName ()I mth12NsAName mth12NsAName
+ mth13NsAName ()I mth13NsAName mth13NsAName
+cls20NsAName cls20NsAName cls20NsAName
+ mth16NsAName ()I mth16NsAName mth16NsAName
+ 2 arg2NsAName arg2NsBName arg2NsCName
+ 3 arg3NsAName arg3NsBName arg3NsAName
+ 4 arg4NsAName arg4NsAName arg4NsCName
+ 5 arg5NsAName arg5NsAName arg5NsCName
+ 6 arg6NsAName arg6NsBName arg6NsAName
+ 7 arg7NsAName arg7NsAName arg7NsAName
+ 8 arg8NsAName arg8NsAName arg8NsAName
+ 9 arg9NsAName arg9NsAName arg9NsAName
diff --git a/src/test/resources/filtering/filtered-except-src-on-dst/xsrg.xsrg b/src/test/resources/filtering/filtered-except-src-on-dst/xsrg.xsrg
new file mode 100644
index 00000000..76c838c1
--- /dev/null
+++ b/src/test/resources/filtering/filtered-except-src-on-dst/xsrg.xsrg
@@ -0,0 +1,20 @@
+CL: cls0NsAName cls0NsBName
+CL: cls1NsAName cls1NsBName
+CL: cls3NsAName cls3NsAName
+CL: cls4NsAName cls4NsBName
+CL: cls5NsAName cls5NsAName
+CL: cls6NsAName cls6NsAName
+FD: cls14NsAName/fld1NsAName I cls14NsAName/fld1NsAName I
+MD: cls15NsAName/mth3NsAName ()I cls15NsAName/mth3NsAName ()I
+FD: cls18NsAName/fld2NsAName I cls18NsAName/fld2NsBName I
+FD: cls18NsAName/fld3NsAName I cls18NsAName/fld3NsBName I
+FD: cls18NsAName/fld5NsAName I cls18NsAName/fld5NsAName I
+FD: cls18NsAName/fld6NsAName I cls18NsAName/fld6NsBName I
+FD: cls18NsAName/fld7NsAName I cls18NsAName/fld7NsAName I
+FD: cls18NsAName/fld8NsAName I cls18NsAName/fld8NsAName I
+MD: cls19NsAName/mth6NsAName ()I cls19NsAName/mth6NsBName ()I
+MD: cls19NsAName/mth7NsAName ()I cls19NsAName/mth7NsBName ()I
+MD: cls19NsAName/mth9NsAName ()I cls19NsAName/mth9NsAName ()I
+MD: cls19NsAName/mth10NsAName ()I cls19NsAName/mth10NsBName ()I
+MD: cls19NsAName/mth11NsAName ()I cls19NsAName/mth11NsAName ()I
+MD: cls19NsAName/mth12NsAName ()I cls19NsAName/mth12NsAName ()I
diff --git a/src/test/resources/filtering/filtered/csrg.csrg b/src/test/resources/filtering/filtered/csrg.csrg
new file mode 100644
index 00000000..d32408db
--- /dev/null
+++ b/src/test/resources/filtering/filtered/csrg.csrg
@@ -0,0 +1,12 @@
+cls0NsAName cls0NsBName
+cls1NsAName cls1NsBName
+cls3NsAName cls3NsAName
+cls4NsAName cls4NsBName
+cls18NsAName fld2NsAName fld2NsBName
+cls18NsAName fld3NsAName fld3NsBName
+cls18NsAName fld5NsAName fld5NsAName
+cls18NsAName fld6NsAName fld6NsBName
+cls19NsAName mth6NsAName ()I mth6NsBName
+cls19NsAName mth7NsAName ()I mth7NsBName
+cls19NsAName mth9NsAName ()I mth9NsAName
+cls19NsAName mth10NsAName ()I mth10NsBName
diff --git a/src/test/resources/filtering/filtered/enigma-dir/cls0NsBName.mapping b/src/test/resources/filtering/filtered/enigma-dir/cls0NsBName.mapping
new file mode 100644
index 00000000..2865bcb5
--- /dev/null
+++ b/src/test/resources/filtering/filtered/enigma-dir/cls0NsBName.mapping
@@ -0,0 +1 @@
+CLASS cls0NsAName cls0NsBName
diff --git a/src/test/resources/filtering/filtered/enigma-dir/cls18NsAName.mapping b/src/test/resources/filtering/filtered/enigma-dir/cls18NsAName.mapping
new file mode 100644
index 00000000..4c3ab404
--- /dev/null
+++ b/src/test/resources/filtering/filtered/enigma-dir/cls18NsAName.mapping
@@ -0,0 +1,8 @@
+CLASS cls18NsAName
+ FIELD fld2NsAName fld2NsBName I
+ FIELD fld3NsAName fld3NsBName I
+ FIELD fld4NsAName I
+ FIELD fld5NsAName fld5NsAName I
+ FIELD fld6NsAName fld6NsBName I
+ FIELD fld11NsAName I
+ COMMENT fld11Comment
diff --git a/src/test/resources/filtering/filtered/enigma-dir/cls19NsAName.mapping b/src/test/resources/filtering/filtered/enigma-dir/cls19NsAName.mapping
new file mode 100644
index 00000000..83076b01
--- /dev/null
+++ b/src/test/resources/filtering/filtered/enigma-dir/cls19NsAName.mapping
@@ -0,0 +1,8 @@
+CLASS cls19NsAName
+ METHOD mth6NsAName mth6NsBName ()I
+ METHOD mth7NsAName mth7NsBName ()I
+ METHOD mth8NsAName ()I
+ METHOD mth9NsAName mth9NsAName ()I
+ METHOD mth10NsAName mth10NsBName ()I
+ METHOD mth15NsAName ()I
+ COMMENT mth15Comment
diff --git a/src/test/resources/filtering/filtered/enigma-dir/cls1NsBName.mapping b/src/test/resources/filtering/filtered/enigma-dir/cls1NsBName.mapping
new file mode 100644
index 00000000..3e6ee819
--- /dev/null
+++ b/src/test/resources/filtering/filtered/enigma-dir/cls1NsBName.mapping
@@ -0,0 +1 @@
+CLASS cls1NsAName cls1NsBName
diff --git a/src/test/resources/filtering/filtered/enigma-dir/cls20NsAName.mapping b/src/test/resources/filtering/filtered/enigma-dir/cls20NsAName.mapping
new file mode 100644
index 00000000..8176048b
--- /dev/null
+++ b/src/test/resources/filtering/filtered/enigma-dir/cls20NsAName.mapping
@@ -0,0 +1,9 @@
+CLASS cls20NsAName
+ METHOD mth16NsAName ()I
+ ARG 2 arg2NsBName
+ ARG 3 arg3NsBName
+ ARG 4
+ ARG 5 arg5NsAName
+ ARG 6 arg6NsBName
+ ARG 11
+ COMMENT arg11Comment
diff --git a/src/test/resources/filtering/filtered/enigma-dir/cls21NsAName.mapping b/src/test/resources/filtering/filtered/enigma-dir/cls21NsAName.mapping
new file mode 100644
index 00000000..d634194f
--- /dev/null
+++ b/src/test/resources/filtering/filtered/enigma-dir/cls21NsAName.mapping
@@ -0,0 +1,2 @@
+CLASS cls21NsAName
+ METHOD mth17NsAName ()I
diff --git a/src/test/resources/filtering/filtered/enigma-dir/cls2NsAName.mapping b/src/test/resources/filtering/filtered/enigma-dir/cls2NsAName.mapping
new file mode 100644
index 00000000..d20f6419
--- /dev/null
+++ b/src/test/resources/filtering/filtered/enigma-dir/cls2NsAName.mapping
@@ -0,0 +1 @@
+CLASS cls2NsAName
diff --git a/src/test/resources/filtering/filtered/enigma-dir/cls3NsAName.mapping b/src/test/resources/filtering/filtered/enigma-dir/cls3NsAName.mapping
new file mode 100644
index 00000000..755f8a61
--- /dev/null
+++ b/src/test/resources/filtering/filtered/enigma-dir/cls3NsAName.mapping
@@ -0,0 +1 @@
+CLASS cls3NsAName cls3NsAName
diff --git a/src/test/resources/filtering/filtered/enigma-dir/cls4NsBName.mapping b/src/test/resources/filtering/filtered/enigma-dir/cls4NsBName.mapping
new file mode 100644
index 00000000..15a4e79d
--- /dev/null
+++ b/src/test/resources/filtering/filtered/enigma-dir/cls4NsBName.mapping
@@ -0,0 +1 @@
+CLASS cls4NsAName cls4NsBName
diff --git a/src/test/resources/filtering/filtered/enigma-dir/cls9NsAName.mapping b/src/test/resources/filtering/filtered/enigma-dir/cls9NsAName.mapping
new file mode 100644
index 00000000..eed5719c
--- /dev/null
+++ b/src/test/resources/filtering/filtered/enigma-dir/cls9NsAName.mapping
@@ -0,0 +1,2 @@
+CLASS cls9NsAName
+ COMMENT cls9Comment
diff --git a/src/test/resources/filtering/filtered/enigma.mappings b/src/test/resources/filtering/filtered/enigma.mappings
new file mode 100644
index 00000000..4c92d260
--- /dev/null
+++ b/src/test/resources/filtering/filtered/enigma.mappings
@@ -0,0 +1,34 @@
+CLASS cls0NsAName cls0NsBName
+CLASS cls1NsAName cls1NsBName
+CLASS cls2NsAName
+CLASS cls3NsAName cls3NsAName
+CLASS cls4NsAName cls4NsBName
+CLASS cls9NsAName
+ COMMENT cls9Comment
+CLASS cls18NsAName
+ FIELD fld2NsAName fld2NsBName I
+ FIELD fld3NsAName fld3NsBName I
+ FIELD fld4NsAName I
+ FIELD fld5NsAName fld5NsAName I
+ FIELD fld6NsAName fld6NsBName I
+ FIELD fld11NsAName I
+ COMMENT fld11Comment
+CLASS cls19NsAName
+ METHOD mth6NsAName mth6NsBName ()I
+ METHOD mth7NsAName mth7NsBName ()I
+ METHOD mth8NsAName ()I
+ METHOD mth9NsAName mth9NsAName ()I
+ METHOD mth10NsAName mth10NsBName ()I
+ METHOD mth15NsAName ()I
+ COMMENT mth15Comment
+CLASS cls20NsAName
+ METHOD mth16NsAName ()I
+ ARG 2 arg2NsBName
+ ARG 3 arg3NsBName
+ ARG 4
+ ARG 5 arg5NsAName
+ ARG 6 arg6NsBName
+ ARG 11
+ COMMENT arg11Comment
+CLASS cls21NsAName
+ METHOD mth17NsAName ()I
diff --git a/src/test/resources/filtering/filtered/jam.jam b/src/test/resources/filtering/filtered/jam.jam
new file mode 100644
index 00000000..6ed1bf09
--- /dev/null
+++ b/src/test/resources/filtering/filtered/jam.jam
@@ -0,0 +1,16 @@
+CL cls0NsAName cls0NsBName
+CL cls1NsAName cls1NsBName
+CL cls3NsAName cls3NsAName
+CL cls4NsAName cls4NsBName
+FD cls18NsAName fld2NsAName I fld2NsBName
+FD cls18NsAName fld3NsAName I fld3NsBName
+FD cls18NsAName fld5NsAName I fld5NsAName
+FD cls18NsAName fld6NsAName I fld6NsBName
+MD cls19NsAName mth6NsAName ()I mth6NsBName
+MD cls19NsAName mth7NsAName ()I mth7NsBName
+MD cls19NsAName mth9NsAName ()I mth9NsAName
+MD cls19NsAName mth10NsAName ()I mth10NsBName
+MP cls20NsAName mth16NsAName ()I 2 arg2NsBName
+MP cls20NsAName mth16NsAName ()I 3 arg3NsBName
+MP cls20NsAName mth16NsAName ()I 5 arg5NsAName
+MP cls20NsAName mth16NsAName ()I 6 arg6NsBName
diff --git a/src/test/resources/filtering/filtered/jobf.jobf b/src/test/resources/filtering/filtered/jobf.jobf
new file mode 100644
index 00000000..53bb6f5a
--- /dev/null
+++ b/src/test/resources/filtering/filtered/jobf.jobf
@@ -0,0 +1,12 @@
+c cls0NsAName = cls0NsBName
+c cls1NsAName = cls1NsBName
+c cls3NsAName = cls3NsAName
+c cls4NsAName = cls4NsBName
+f cls18NsAName.fld2NsAName:I = fld2NsBName
+f cls18NsAName.fld3NsAName:I = fld3NsBName
+f cls18NsAName.fld5NsAName:I = fld5NsAName
+f cls18NsAName.fld6NsAName:I = fld6NsBName
+m cls19NsAName.mth6NsAName()I = mth6NsBName
+m cls19NsAName.mth7NsAName()I = mth7NsBName
+m cls19NsAName.mth9NsAName()I = mth9NsAName
+m cls19NsAName.mth10NsAName()I = mth10NsBName
diff --git a/src/test/resources/filtering/filtered/migration-map.xml b/src/test/resources/filtering/filtered/migration-map.xml
new file mode 100644
index 00000000..bbe7b1a1
--- /dev/null
+++ b/src/test/resources/filtering/filtered/migration-map.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/test/resources/filtering/filtered/proguard.txt b/src/test/resources/filtering/filtered/proguard.txt
new file mode 100644
index 00000000..ffb1a88b
--- /dev/null
+++ b/src/test/resources/filtering/filtered/proguard.txt
@@ -0,0 +1,14 @@
+cls0NsAName -> cls0NsBName:
+cls1NsAName -> cls1NsBName:
+cls3NsAName -> cls3NsAName:
+cls4NsAName -> cls4NsBName:
+cls18NsAName -> cls18NsAName:
+ int fld2NsAName -> fld2NsBName
+ int fld3NsAName -> fld3NsBName
+ int fld5NsAName -> fld5NsAName
+ int fld6NsAName -> fld6NsBName
+cls19NsAName -> cls19NsAName:
+ int mth6NsAName() -> mth6NsBName
+ int mth7NsAName() -> mth7NsBName
+ int mth9NsAName() -> mth9NsAName
+ int mth10NsAName() -> mth10NsBName
diff --git a/src/test/resources/filtering/filtered/recaf-simple.txt b/src/test/resources/filtering/filtered/recaf-simple.txt
new file mode 100644
index 00000000..14698d3b
--- /dev/null
+++ b/src/test/resources/filtering/filtered/recaf-simple.txt
@@ -0,0 +1,12 @@
+cls0NsAName cls0NsBName
+cls1NsAName cls1NsBName
+cls3NsAName cls3NsAName
+cls4NsAName cls4NsBName
+cls18NsAName.fld2NsAName I fld2NsBName
+cls18NsAName.fld3NsAName I fld3NsBName
+cls18NsAName.fld5NsAName I fld5NsAName
+cls18NsAName.fld6NsAName I fld6NsBName
+cls19NsAName.mth6NsAName()I mth6NsBName
+cls19NsAName.mth7NsAName()I mth7NsBName
+cls19NsAName.mth9NsAName()I mth9NsAName
+cls19NsAName.mth10NsAName()I mth10NsBName
diff --git a/src/test/resources/filtering/filtered/srg.srg b/src/test/resources/filtering/filtered/srg.srg
new file mode 100644
index 00000000..407ab75d
--- /dev/null
+++ b/src/test/resources/filtering/filtered/srg.srg
@@ -0,0 +1,12 @@
+CL: cls0NsAName cls0NsBName
+CL: cls1NsAName cls1NsBName
+CL: cls3NsAName cls3NsAName
+CL: cls4NsAName cls4NsBName
+FD: cls18NsAName/fld2NsAName cls18NsAName/fld2NsBName
+FD: cls18NsAName/fld3NsAName cls18NsAName/fld3NsBName
+FD: cls18NsAName/fld5NsAName cls18NsAName/fld5NsAName
+FD: cls18NsAName/fld6NsAName cls18NsAName/fld6NsBName
+MD: cls19NsAName/mth6NsAName ()I cls19NsAName/mth6NsBName ()I
+MD: cls19NsAName/mth7NsAName ()I cls19NsAName/mth7NsBName ()I
+MD: cls19NsAName/mth9NsAName ()I cls19NsAName/mth9NsAName ()I
+MD: cls19NsAName/mth10NsAName ()I cls19NsAName/mth10NsBName ()I
diff --git a/src/test/resources/filtering/filtered/tiny.tiny b/src/test/resources/filtering/filtered/tiny.tiny
new file mode 100644
index 00000000..f77fa321
--- /dev/null
+++ b/src/test/resources/filtering/filtered/tiny.tiny
@@ -0,0 +1,16 @@
+v1 nsA nsB nsC
+CLASS cls0NsAName cls0NsBName cls0NsCName
+CLASS cls1NsAName cls1NsBName
+CLASS cls2NsAName cls2NsCName
+CLASS cls3NsAName cls3NsAName cls3NsCName
+CLASS cls4NsAName cls4NsBName cls4NsAName
+FIELD cls18NsAName I fld2NsAName fld2NsBName fld2NsCName
+FIELD cls18NsAName I fld3NsAName fld3NsBName
+FIELD cls18NsAName I fld4NsAName fld4NsCName
+FIELD cls18NsAName I fld5NsAName fld5NsAName fld5NsCName
+FIELD cls18NsAName I fld6NsAName fld6NsBName fld6NsAName
+METHOD cls19NsAName ()I mth6NsAName mth6NsBName mth6NsCName
+METHOD cls19NsAName ()I mth7NsAName mth7NsBName
+METHOD cls19NsAName ()I mth8NsAName mth8NsCName
+METHOD cls19NsAName ()I mth9NsAName mth9NsAName mth9NsCName
+METHOD cls19NsAName ()I mth10NsAName mth10NsBName mth10NsAName
diff --git a/src/test/resources/filtering/filtered/tinyV2.tiny b/src/test/resources/filtering/filtered/tinyV2.tiny
new file mode 100644
index 00000000..9c77e9c3
--- /dev/null
+++ b/src/test/resources/filtering/filtered/tinyV2.tiny
@@ -0,0 +1,42 @@
+tiny 2 0 nsA nsB nsC
+c cls0NsAName cls0NsBName cls0NsCName
+c cls1NsAName cls1NsBName
+c cls2NsAName cls2NsCName
+c cls3NsAName cls3NsAName cls3NsCName
+c cls4NsAName cls4NsBName cls4NsAName
+c cls9NsAName
+ c cls9Comment
+c cls18NsAName
+ f I fld2NsAName fld2NsBName fld2NsCName
+ f I fld3NsAName fld3NsBName
+ f I fld4NsAName fld4NsCName
+ f I fld5NsAName fld5NsAName fld5NsCName
+ f I fld6NsAName fld6NsBName fld6NsAName
+ f I fld11NsAName
+ c fld11Comment
+c cls19NsAName
+ m ()I mth6NsAName mth6NsBName mth6NsCName
+ m ()I mth7NsAName mth7NsBName
+ m ()I mth8NsAName mth8NsCName
+ m ()I mth9NsAName mth9NsAName mth9NsCName
+ m ()I mth10NsAName mth10NsBName mth10NsAName
+ m ()I mth15NsAName
+ c mth15Comment
+c cls20NsAName
+ m ()I mth16NsAName
+ p 2 arg2NsAName arg2NsBName arg2NsCName
+ p 3 arg3NsAName arg3NsBName
+ p 4 arg4NsAName arg4NsCName
+ p 5 arg5NsAName arg5NsAName arg5NsCName
+ p 6 arg6NsAName arg6NsBName arg6NsAName
+ p 11 arg11NsAName
+ c arg11Comment
+c cls21NsAName
+ m ()I mth17NsAName
+ v 2 2 2 var2NsAName var2NsBName var2NsCName
+ v 3 3 3 var3NsAName var3NsBName
+ v 4 4 4 var4NsAName var4NsCName
+ v 5 5 5 var5NsAName var5NsAName var5NsCName
+ v 6 6 6 var6NsAName var6NsBName var6NsAName
+ v 11 11 11 var11NsAName
+ c var11Comment
diff --git a/src/test/resources/filtering/filtered/tsrg.tsrg b/src/test/resources/filtering/filtered/tsrg.tsrg
new file mode 100644
index 00000000..97a460f1
--- /dev/null
+++ b/src/test/resources/filtering/filtered/tsrg.tsrg
@@ -0,0 +1,14 @@
+cls0NsAName cls0NsBName
+cls1NsAName cls1NsBName
+cls3NsAName cls3NsAName
+cls4NsAName cls4NsBName
+cls18NsAName cls18NsAName
+ fld2NsAName fld2NsBName
+ fld3NsAName fld3NsBName
+ fld5NsAName fld5NsAName
+ fld6NsAName fld6NsBName
+cls19NsAName cls19NsAName
+ mth6NsAName ()I mth6NsBName
+ mth7NsAName ()I mth7NsBName
+ mth9NsAName ()I mth9NsAName
+ mth10NsAName ()I mth10NsBName
diff --git a/src/test/resources/filtering/filtered/tsrgV2.tsrg b/src/test/resources/filtering/filtered/tsrgV2.tsrg
new file mode 100644
index 00000000..40793256
--- /dev/null
+++ b/src/test/resources/filtering/filtered/tsrgV2.tsrg
@@ -0,0 +1,25 @@
+tsrg2 nsA nsB nsC
+cls0NsAName cls0NsBName cls0NsCName
+cls1NsAName cls1NsBName cls1NsAName
+cls2NsAName cls2NsAName cls2NsCName
+cls3NsAName cls3NsAName cls3NsCName
+cls4NsAName cls4NsBName cls4NsAName
+cls18NsAName cls18NsAName cls18NsAName
+ fld2NsAName I fld2NsBName fld2NsCName
+ fld3NsAName I fld3NsBName fld3NsAName
+ fld4NsAName I fld4NsAName fld4NsCName
+ fld5NsAName I fld5NsAName fld5NsCName
+ fld6NsAName I fld6NsBName fld6NsAName
+cls19NsAName cls19NsAName cls19NsAName
+ mth6NsAName ()I mth6NsBName mth6NsCName
+ mth7NsAName ()I mth7NsBName mth7NsAName
+ mth8NsAName ()I mth8NsAName mth8NsCName
+ mth9NsAName ()I mth9NsAName mth9NsCName
+ mth10NsAName ()I mth10NsBName mth10NsAName
+cls20NsAName cls20NsAName cls20NsAName
+ mth16NsAName ()I mth16NsAName mth16NsAName
+ 2 arg2NsAName arg2NsBName arg2NsCName
+ 3 arg3NsAName arg3NsBName arg3NsAName
+ 4 arg4NsAName arg4NsAName arg4NsCName
+ 5 arg5NsAName arg5NsAName arg5NsCName
+ 6 arg6NsAName arg6NsBName arg6NsAName
diff --git a/src/test/resources/filtering/filtered/xsrg.xsrg b/src/test/resources/filtering/filtered/xsrg.xsrg
new file mode 100644
index 00000000..f53e92d3
--- /dev/null
+++ b/src/test/resources/filtering/filtered/xsrg.xsrg
@@ -0,0 +1,12 @@
+CL: cls0NsAName cls0NsBName
+CL: cls1NsAName cls1NsBName
+CL: cls3NsAName cls3NsAName
+CL: cls4NsAName cls4NsBName
+FD: cls18NsAName/fld2NsAName I cls18NsAName/fld2NsBName I
+FD: cls18NsAName/fld3NsAName I cls18NsAName/fld3NsBName I
+FD: cls18NsAName/fld5NsAName I cls18NsAName/fld5NsAName I
+FD: cls18NsAName/fld6NsAName I cls18NsAName/fld6NsBName I
+MD: cls19NsAName/mth6NsAName ()I cls19NsAName/mth6NsBName ()I
+MD: cls19NsAName/mth7NsAName ()I cls19NsAName/mth7NsBName ()I
+MD: cls19NsAName/mth9NsAName ()I cls19NsAName/mth9NsAName ()I
+MD: cls19NsAName/mth10NsAName ()I cls19NsAName/mth10NsBName ()I
diff --git a/src/test/resources/filtering/unfiltered/csrg.csrg b/src/test/resources/filtering/unfiltered/csrg.csrg
new file mode 100644
index 00000000..dae3acd7
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/csrg.csrg
@@ -0,0 +1,20 @@
+cls0NsAName cls0NsBName
+cls1NsAName cls1NsBName
+cls3NsAName cls3NsAName
+cls4NsAName cls4NsBName
+cls5NsAName cls5NsAName
+cls6NsAName cls6NsAName
+cls14NsAName fld1NsAName fld1NsAName
+cls15NsAName mth3NsAName ()I mth3NsAName
+cls18NsAName fld2NsAName fld2NsBName
+cls18NsAName fld3NsAName fld3NsBName
+cls18NsAName fld5NsAName fld5NsAName
+cls18NsAName fld6NsAName fld6NsBName
+cls18NsAName fld7NsAName fld7NsAName
+cls18NsAName fld8NsAName fld8NsAName
+cls19NsAName mth6NsAName ()I mth6NsBName
+cls19NsAName mth7NsAName ()I mth7NsBName
+cls19NsAName mth9NsAName ()I mth9NsAName
+cls19NsAName mth10NsAName ()I mth10NsBName
+cls19NsAName mth11NsAName ()I mth11NsAName
+cls19NsAName mth12NsAName ()I mth12NsAName
diff --git a/src/test/resources/filtering/unfiltered/enigma-dir/cls0NsBName.mapping b/src/test/resources/filtering/unfiltered/enigma-dir/cls0NsBName.mapping
new file mode 100644
index 00000000..2865bcb5
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/enigma-dir/cls0NsBName.mapping
@@ -0,0 +1 @@
+CLASS cls0NsAName cls0NsBName
diff --git a/src/test/resources/filtering/unfiltered/enigma-dir/cls10NsAName.mapping b/src/test/resources/filtering/unfiltered/enigma-dir/cls10NsAName.mapping
new file mode 100644
index 00000000..5bf1ec82
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/enigma-dir/cls10NsAName.mapping
@@ -0,0 +1,2 @@
+CLASS cls10NsAName
+ FIELD fld0NsAName I
diff --git a/src/test/resources/filtering/unfiltered/enigma-dir/cls11NsAName.mapping b/src/test/resources/filtering/unfiltered/enigma-dir/cls11NsAName.mapping
new file mode 100644
index 00000000..751d515d
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/enigma-dir/cls11NsAName.mapping
@@ -0,0 +1,2 @@
+CLASS cls11NsAName
+ METHOD mth0NsAName ()I
diff --git a/src/test/resources/filtering/unfiltered/enigma-dir/cls12NsAName.mapping b/src/test/resources/filtering/unfiltered/enigma-dir/cls12NsAName.mapping
new file mode 100644
index 00000000..7299b370
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/enigma-dir/cls12NsAName.mapping
@@ -0,0 +1,3 @@
+CLASS cls12NsAName
+ METHOD mth1NsAName ()I
+ ARG 0
diff --git a/src/test/resources/filtering/unfiltered/enigma-dir/cls13NsAName.mapping b/src/test/resources/filtering/unfiltered/enigma-dir/cls13NsAName.mapping
new file mode 100644
index 00000000..ba4c07ea
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/enigma-dir/cls13NsAName.mapping
@@ -0,0 +1,2 @@
+CLASS cls13NsAName
+ METHOD mth2NsAName ()I
diff --git a/src/test/resources/filtering/unfiltered/enigma-dir/cls14NsAName.mapping b/src/test/resources/filtering/unfiltered/enigma-dir/cls14NsAName.mapping
new file mode 100644
index 00000000..b3592e81
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/enigma-dir/cls14NsAName.mapping
@@ -0,0 +1,2 @@
+CLASS cls14NsAName
+ FIELD fld1NsAName fld1NsAName I
diff --git a/src/test/resources/filtering/unfiltered/enigma-dir/cls15NsAName.mapping b/src/test/resources/filtering/unfiltered/enigma-dir/cls15NsAName.mapping
new file mode 100644
index 00000000..ddc214f6
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/enigma-dir/cls15NsAName.mapping
@@ -0,0 +1,2 @@
+CLASS cls15NsAName
+ METHOD mth3NsAName mth3NsAName ()I
diff --git a/src/test/resources/filtering/unfiltered/enigma-dir/cls16NsAName.mapping b/src/test/resources/filtering/unfiltered/enigma-dir/cls16NsAName.mapping
new file mode 100644
index 00000000..0c94e4db
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/enigma-dir/cls16NsAName.mapping
@@ -0,0 +1,3 @@
+CLASS cls16NsAName
+ METHOD mth4NsAName ()I
+ ARG 1 arg1NsAName
diff --git a/src/test/resources/filtering/unfiltered/enigma-dir/cls17NsAName.mapping b/src/test/resources/filtering/unfiltered/enigma-dir/cls17NsAName.mapping
new file mode 100644
index 00000000..ee1e651e
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/enigma-dir/cls17NsAName.mapping
@@ -0,0 +1,2 @@
+CLASS cls17NsAName
+ METHOD mth5NsAName ()I
diff --git a/src/test/resources/filtering/unfiltered/enigma-dir/cls18NsAName.mapping b/src/test/resources/filtering/unfiltered/enigma-dir/cls18NsAName.mapping
new file mode 100644
index 00000000..40c459db
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/enigma-dir/cls18NsAName.mapping
@@ -0,0 +1,12 @@
+CLASS cls18NsAName
+ FIELD fld2NsAName fld2NsBName I
+ FIELD fld3NsAName fld3NsBName I
+ FIELD fld4NsAName I
+ FIELD fld5NsAName fld5NsAName I
+ FIELD fld6NsAName fld6NsBName I
+ FIELD fld7NsAName fld7NsAName I
+ FIELD fld8NsAName fld8NsAName I
+ FIELD fld9NsAName I
+ FIELD fld10NsAName I
+ FIELD fld11NsAName I
+ COMMENT fld11Comment
diff --git a/src/test/resources/filtering/unfiltered/enigma-dir/cls19NsAName.mapping b/src/test/resources/filtering/unfiltered/enigma-dir/cls19NsAName.mapping
new file mode 100644
index 00000000..e5a5c30d
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/enigma-dir/cls19NsAName.mapping
@@ -0,0 +1,12 @@
+CLASS cls19NsAName
+ METHOD mth6NsAName mth6NsBName ()I
+ METHOD mth7NsAName mth7NsBName ()I
+ METHOD mth8NsAName ()I
+ METHOD mth9NsAName mth9NsAName ()I
+ METHOD mth10NsAName mth10NsBName ()I
+ METHOD mth11NsAName mth11NsAName ()I
+ METHOD mth12NsAName mth12NsAName ()I
+ METHOD mth13NsAName ()I
+ METHOD mth14NsAName ()I
+ METHOD mth15NsAName ()I
+ COMMENT mth15Comment
diff --git a/src/test/resources/filtering/unfiltered/enigma-dir/cls1NsBName.mapping b/src/test/resources/filtering/unfiltered/enigma-dir/cls1NsBName.mapping
new file mode 100644
index 00000000..3e6ee819
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/enigma-dir/cls1NsBName.mapping
@@ -0,0 +1 @@
+CLASS cls1NsAName cls1NsBName
diff --git a/src/test/resources/filtering/unfiltered/enigma-dir/cls20NsAName.mapping b/src/test/resources/filtering/unfiltered/enigma-dir/cls20NsAName.mapping
new file mode 100644
index 00000000..e50eca36
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/enigma-dir/cls20NsAName.mapping
@@ -0,0 +1,13 @@
+CLASS cls20NsAName
+ METHOD mth16NsAName ()I
+ ARG 2 arg2NsBName
+ ARG 3 arg3NsBName
+ ARG 4
+ ARG 5 arg5NsAName
+ ARG 6 arg6NsBName
+ ARG 7 arg7NsAName
+ ARG 8 arg8NsAName
+ ARG 9
+ ARG 10
+ ARG 11
+ COMMENT arg11Comment
diff --git a/src/test/resources/filtering/unfiltered/enigma-dir/cls21NsAName.mapping b/src/test/resources/filtering/unfiltered/enigma-dir/cls21NsAName.mapping
new file mode 100644
index 00000000..d634194f
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/enigma-dir/cls21NsAName.mapping
@@ -0,0 +1,2 @@
+CLASS cls21NsAName
+ METHOD mth17NsAName ()I
diff --git a/src/test/resources/filtering/unfiltered/enigma-dir/cls2NsAName.mapping b/src/test/resources/filtering/unfiltered/enigma-dir/cls2NsAName.mapping
new file mode 100644
index 00000000..d20f6419
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/enigma-dir/cls2NsAName.mapping
@@ -0,0 +1 @@
+CLASS cls2NsAName
diff --git a/src/test/resources/filtering/unfiltered/enigma-dir/cls3NsAName.mapping b/src/test/resources/filtering/unfiltered/enigma-dir/cls3NsAName.mapping
new file mode 100644
index 00000000..755f8a61
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/enigma-dir/cls3NsAName.mapping
@@ -0,0 +1 @@
+CLASS cls3NsAName cls3NsAName
diff --git a/src/test/resources/filtering/unfiltered/enigma-dir/cls4NsBName.mapping b/src/test/resources/filtering/unfiltered/enigma-dir/cls4NsBName.mapping
new file mode 100644
index 00000000..15a4e79d
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/enigma-dir/cls4NsBName.mapping
@@ -0,0 +1 @@
+CLASS cls4NsAName cls4NsBName
diff --git a/src/test/resources/filtering/unfiltered/enigma-dir/cls5NsAName.mapping b/src/test/resources/filtering/unfiltered/enigma-dir/cls5NsAName.mapping
new file mode 100644
index 00000000..13a97f43
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/enigma-dir/cls5NsAName.mapping
@@ -0,0 +1 @@
+CLASS cls5NsAName cls5NsAName
diff --git a/src/test/resources/filtering/unfiltered/enigma-dir/cls6NsAName.mapping b/src/test/resources/filtering/unfiltered/enigma-dir/cls6NsAName.mapping
new file mode 100644
index 00000000..33c177e2
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/enigma-dir/cls6NsAName.mapping
@@ -0,0 +1 @@
+CLASS cls6NsAName cls6NsAName
diff --git a/src/test/resources/filtering/unfiltered/enigma-dir/cls7NsAName.mapping b/src/test/resources/filtering/unfiltered/enigma-dir/cls7NsAName.mapping
new file mode 100644
index 00000000..810eace1
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/enigma-dir/cls7NsAName.mapping
@@ -0,0 +1 @@
+CLASS cls7NsAName
diff --git a/src/test/resources/filtering/unfiltered/enigma-dir/cls8NsAName.mapping b/src/test/resources/filtering/unfiltered/enigma-dir/cls8NsAName.mapping
new file mode 100644
index 00000000..b8148141
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/enigma-dir/cls8NsAName.mapping
@@ -0,0 +1 @@
+CLASS cls8NsAName
diff --git a/src/test/resources/filtering/unfiltered/enigma-dir/cls9NsAName.mapping b/src/test/resources/filtering/unfiltered/enigma-dir/cls9NsAName.mapping
new file mode 100644
index 00000000..eed5719c
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/enigma-dir/cls9NsAName.mapping
@@ -0,0 +1,2 @@
+CLASS cls9NsAName
+ COMMENT cls9Comment
diff --git a/src/test/resources/filtering/unfiltered/enigma.mappings b/src/test/resources/filtering/unfiltered/enigma.mappings
new file mode 100644
index 00000000..5ca29aae
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/enigma.mappings
@@ -0,0 +1,68 @@
+CLASS cls0NsAName cls0NsBName
+CLASS cls1NsAName cls1NsBName
+CLASS cls2NsAName
+CLASS cls3NsAName cls3NsAName
+CLASS cls4NsAName cls4NsBName
+CLASS cls5NsAName cls5NsAName
+CLASS cls6NsAName cls6NsAName
+CLASS cls7NsAName
+CLASS cls8NsAName
+CLASS cls9NsAName
+ COMMENT cls9Comment
+CLASS cls10NsAName
+ FIELD fld0NsAName I
+CLASS cls11NsAName
+ METHOD mth0NsAName ()I
+CLASS cls12NsAName
+ METHOD mth1NsAName ()I
+ ARG 0
+CLASS cls13NsAName
+ METHOD mth2NsAName ()I
+CLASS cls14NsAName
+ FIELD fld1NsAName fld1NsAName I
+CLASS cls15NsAName
+ METHOD mth3NsAName mth3NsAName ()I
+CLASS cls16NsAName
+ METHOD mth4NsAName ()I
+ ARG 1 arg1NsAName
+CLASS cls17NsAName
+ METHOD mth5NsAName ()I
+CLASS cls18NsAName
+ FIELD fld2NsAName fld2NsBName I
+ FIELD fld3NsAName fld3NsBName I
+ FIELD fld4NsAName I
+ FIELD fld5NsAName fld5NsAName I
+ FIELD fld6NsAName fld6NsBName I
+ FIELD fld7NsAName fld7NsAName I
+ FIELD fld8NsAName fld8NsAName I
+ FIELD fld9NsAName I
+ FIELD fld10NsAName I
+ FIELD fld11NsAName I
+ COMMENT fld11Comment
+CLASS cls19NsAName
+ METHOD mth6NsAName mth6NsBName ()I
+ METHOD mth7NsAName mth7NsBName ()I
+ METHOD mth8NsAName ()I
+ METHOD mth9NsAName mth9NsAName ()I
+ METHOD mth10NsAName mth10NsBName ()I
+ METHOD mth11NsAName mth11NsAName ()I
+ METHOD mth12NsAName mth12NsAName ()I
+ METHOD mth13NsAName ()I
+ METHOD mth14NsAName ()I
+ METHOD mth15NsAName ()I
+ COMMENT mth15Comment
+CLASS cls20NsAName
+ METHOD mth16NsAName ()I
+ ARG 2 arg2NsBName
+ ARG 3 arg3NsBName
+ ARG 4
+ ARG 5 arg5NsAName
+ ARG 6 arg6NsBName
+ ARG 7 arg7NsAName
+ ARG 8 arg8NsAName
+ ARG 9
+ ARG 10
+ ARG 11
+ COMMENT arg11Comment
+CLASS cls21NsAName
+ METHOD mth17NsAName ()I
diff --git a/src/test/resources/filtering/unfiltered/jam.jam b/src/test/resources/filtering/unfiltered/jam.jam
new file mode 100644
index 00000000..43d1fd6d
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/jam.jam
@@ -0,0 +1,27 @@
+CL cls0NsAName cls0NsBName
+CL cls1NsAName cls1NsBName
+CL cls3NsAName cls3NsAName
+CL cls4NsAName cls4NsBName
+CL cls5NsAName cls5NsAName
+CL cls6NsAName cls6NsAName
+FD cls14NsAName fld1NsAName I fld1NsAName
+MD cls15NsAName mth3NsAName ()I mth3NsAName
+MP cls16NsAName mth4NsAName ()I 1 arg1NsAName
+FD cls18NsAName fld2NsAName I fld2NsBName
+FD cls18NsAName fld3NsAName I fld3NsBName
+FD cls18NsAName fld5NsAName I fld5NsAName
+FD cls18NsAName fld6NsAName I fld6NsBName
+FD cls18NsAName fld7NsAName I fld7NsAName
+FD cls18NsAName fld8NsAName I fld8NsAName
+MD cls19NsAName mth6NsAName ()I mth6NsBName
+MD cls19NsAName mth7NsAName ()I mth7NsBName
+MD cls19NsAName mth9NsAName ()I mth9NsAName
+MD cls19NsAName mth10NsAName ()I mth10NsBName
+MD cls19NsAName mth11NsAName ()I mth11NsAName
+MD cls19NsAName mth12NsAName ()I mth12NsAName
+MP cls20NsAName mth16NsAName ()I 2 arg2NsBName
+MP cls20NsAName mth16NsAName ()I 3 arg3NsBName
+MP cls20NsAName mth16NsAName ()I 5 arg5NsAName
+MP cls20NsAName mth16NsAName ()I 6 arg6NsBName
+MP cls20NsAName mth16NsAName ()I 7 arg7NsAName
+MP cls20NsAName mth16NsAName ()I 8 arg8NsAName
diff --git a/src/test/resources/filtering/unfiltered/jobf.jobf b/src/test/resources/filtering/unfiltered/jobf.jobf
new file mode 100644
index 00000000..fb636714
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/jobf.jobf
@@ -0,0 +1,20 @@
+c cls0NsAName = cls0NsBName
+c cls1NsAName = cls1NsBName
+c cls3NsAName = cls3NsAName
+c cls4NsAName = cls4NsBName
+c cls5NsAName = cls5NsAName
+c cls6NsAName = cls6NsAName
+f cls14NsAName.fld1NsAName:I = fld1NsAName
+m cls15NsAName.mth3NsAName()I = mth3NsAName
+f cls18NsAName.fld2NsAName:I = fld2NsBName
+f cls18NsAName.fld3NsAName:I = fld3NsBName
+f cls18NsAName.fld5NsAName:I = fld5NsAName
+f cls18NsAName.fld6NsAName:I = fld6NsBName
+f cls18NsAName.fld7NsAName:I = fld7NsAName
+f cls18NsAName.fld8NsAName:I = fld8NsAName
+m cls19NsAName.mth6NsAName()I = mth6NsBName
+m cls19NsAName.mth7NsAName()I = mth7NsBName
+m cls19NsAName.mth9NsAName()I = mth9NsAName
+m cls19NsAName.mth10NsAName()I = mth10NsBName
+m cls19NsAName.mth11NsAName()I = mth11NsAName
+m cls19NsAName.mth12NsAName()I = mth12NsAName
diff --git a/src/test/resources/filtering/unfiltered/migration-map.xml b/src/test/resources/filtering/unfiltered/migration-map.xml
new file mode 100644
index 00000000..54a63a82
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/migration-map.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/resources/filtering/unfiltered/proguard.txt b/src/test/resources/filtering/unfiltered/proguard.txt
new file mode 100644
index 00000000..11fead9f
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/proguard.txt
@@ -0,0 +1,24 @@
+cls0NsAName -> cls0NsBName:
+cls1NsAName -> cls1NsBName:
+cls3NsAName -> cls3NsAName:
+cls4NsAName -> cls4NsBName:
+cls5NsAName -> cls5NsAName:
+cls6NsAName -> cls6NsAName:
+cls14NsAName -> cls14NsAName:
+ int fld1NsAName -> fld1NsAName
+cls15NsAName -> cls15NsAName:
+ int mth3NsAName() -> mth3NsAName
+cls18NsAName -> cls18NsAName:
+ int fld2NsAName -> fld2NsBName
+ int fld3NsAName -> fld3NsBName
+ int fld5NsAName -> fld5NsAName
+ int fld6NsAName -> fld6NsBName
+ int fld7NsAName -> fld7NsAName
+ int fld8NsAName -> fld8NsAName
+cls19NsAName -> cls19NsAName:
+ int mth6NsAName() -> mth6NsBName
+ int mth7NsAName() -> mth7NsBName
+ int mth9NsAName() -> mth9NsAName
+ int mth10NsAName() -> mth10NsBName
+ int mth11NsAName() -> mth11NsAName
+ int mth12NsAName() -> mth12NsAName
diff --git a/src/test/resources/filtering/unfiltered/recaf-simple.txt b/src/test/resources/filtering/unfiltered/recaf-simple.txt
new file mode 100644
index 00000000..5991c8f7
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/recaf-simple.txt
@@ -0,0 +1,20 @@
+cls0NsAName cls0NsBName
+cls1NsAName cls1NsBName
+cls3NsAName cls3NsAName
+cls4NsAName cls4NsBName
+cls5NsAName cls5NsAName
+cls6NsAName cls6NsAName
+cls14NsAName.fld1NsAName I fld1NsAName
+cls15NsAName.mth3NsAName()I mth3NsAName
+cls18NsAName.fld2NsAName I fld2NsBName
+cls18NsAName.fld3NsAName I fld3NsBName
+cls18NsAName.fld5NsAName I fld5NsAName
+cls18NsAName.fld6NsAName I fld6NsBName
+cls18NsAName.fld7NsAName I fld7NsAName
+cls18NsAName.fld8NsAName I fld8NsAName
+cls19NsAName.mth6NsAName()I mth6NsBName
+cls19NsAName.mth7NsAName()I mth7NsBName
+cls19NsAName.mth9NsAName()I mth9NsAName
+cls19NsAName.mth10NsAName()I mth10NsBName
+cls19NsAName.mth11NsAName()I mth11NsAName
+cls19NsAName.mth12NsAName()I mth12NsAName
diff --git a/src/test/resources/filtering/unfiltered/srg.srg b/src/test/resources/filtering/unfiltered/srg.srg
new file mode 100644
index 00000000..f730c4aa
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/srg.srg
@@ -0,0 +1,20 @@
+CL: cls0NsAName cls0NsBName
+CL: cls1NsAName cls1NsBName
+CL: cls3NsAName cls3NsAName
+CL: cls4NsAName cls4NsBName
+CL: cls5NsAName cls5NsAName
+CL: cls6NsAName cls6NsAName
+FD: cls14NsAName/fld1NsAName cls14NsAName/fld1NsAName
+MD: cls15NsAName/mth3NsAName ()I cls15NsAName/mth3NsAName ()I
+FD: cls18NsAName/fld2NsAName cls18NsAName/fld2NsBName
+FD: cls18NsAName/fld3NsAName cls18NsAName/fld3NsBName
+FD: cls18NsAName/fld5NsAName cls18NsAName/fld5NsAName
+FD: cls18NsAName/fld6NsAName cls18NsAName/fld6NsBName
+FD: cls18NsAName/fld7NsAName cls18NsAName/fld7NsAName
+FD: cls18NsAName/fld8NsAName cls18NsAName/fld8NsAName
+MD: cls19NsAName/mth6NsAName ()I cls19NsAName/mth6NsBName ()I
+MD: cls19NsAName/mth7NsAName ()I cls19NsAName/mth7NsBName ()I
+MD: cls19NsAName/mth9NsAName ()I cls19NsAName/mth9NsAName ()I
+MD: cls19NsAName/mth10NsAName ()I cls19NsAName/mth10NsBName ()I
+MD: cls19NsAName/mth11NsAName ()I cls19NsAName/mth11NsAName ()I
+MD: cls19NsAName/mth12NsAName ()I cls19NsAName/mth12NsAName ()I
diff --git a/src/test/resources/filtering/unfiltered/tiny.tiny b/src/test/resources/filtering/unfiltered/tiny.tiny
new file mode 100644
index 00000000..345a3793
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/tiny.tiny
@@ -0,0 +1,27 @@
+v1 nsA nsB nsC
+CLASS cls0NsAName cls0NsBName cls0NsCName
+CLASS cls1NsAName cls1NsBName
+CLASS cls2NsAName cls2NsCName
+CLASS cls3NsAName cls3NsAName cls3NsCName
+CLASS cls4NsAName cls4NsBName cls4NsAName
+CLASS cls5NsAName cls5NsAName cls5NsAName
+CLASS cls6NsAName cls6NsAName
+CLASS cls7NsAName cls7NsAName
+FIELD cls14NsAName I fld1NsAName fld1NsAName
+METHOD cls15NsAName ()I mth3NsAName mth3NsAName
+FIELD cls18NsAName I fld2NsAName fld2NsBName fld2NsCName
+FIELD cls18NsAName I fld3NsAName fld3NsBName
+FIELD cls18NsAName I fld4NsAName fld4NsCName
+FIELD cls18NsAName I fld5NsAName fld5NsAName fld5NsCName
+FIELD cls18NsAName I fld6NsAName fld6NsBName fld6NsAName
+FIELD cls18NsAName I fld7NsAName fld7NsAName fld7NsAName
+FIELD cls18NsAName I fld8NsAName fld8NsAName
+FIELD cls18NsAName I fld9NsAName fld9NsAName
+METHOD cls19NsAName ()I mth6NsAName mth6NsBName mth6NsCName
+METHOD cls19NsAName ()I mth7NsAName mth7NsBName
+METHOD cls19NsAName ()I mth8NsAName mth8NsCName
+METHOD cls19NsAName ()I mth9NsAName mth9NsAName mth9NsCName
+METHOD cls19NsAName ()I mth10NsAName mth10NsBName mth10NsAName
+METHOD cls19NsAName ()I mth11NsAName mth11NsAName mth11NsAName
+METHOD cls19NsAName ()I mth12NsAName mth12NsAName
+METHOD cls19NsAName ()I mth13NsAName mth13NsAName
diff --git a/src/test/resources/filtering/unfiltered/tinyV2.tiny b/src/test/resources/filtering/unfiltered/tinyV2.tiny
new file mode 100644
index 00000000..7cd09ba9
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/tinyV2.tiny
@@ -0,0 +1,82 @@
+tiny 2 0 nsA nsB nsC
+c cls0NsAName cls0NsBName cls0NsCName
+c cls1NsAName cls1NsBName
+c cls2NsAName cls2NsCName
+c cls3NsAName cls3NsAName cls3NsCName
+c cls4NsAName cls4NsBName cls4NsAName
+c cls5NsAName cls5NsAName cls5NsAName
+c cls6NsAName cls6NsAName
+c cls7NsAName cls7NsAName
+c cls8NsAName
+c cls9NsAName
+ c cls9Comment
+c cls10NsAName
+ f I fld0NsAName
+c cls11NsAName
+ m ()I mth0NsAName
+c cls12NsAName
+ m ()I mth1NsAName
+ p 0 arg0NsAName
+c cls13NsAName
+ m ()I mth2NsAName
+ v 0 0 0 var0NsAName
+c cls14NsAName
+ f I fld1NsAName fld1NsAName
+c cls15NsAName
+ m ()I mth3NsAName mth3NsAName
+c cls16NsAName
+ m ()I mth4NsAName
+ p 1 arg1NsAName arg1NsAName
+c cls17NsAName
+ m ()I mth5NsAName
+ v 1 1 1 var1NsAName var1NsAName
+c cls18NsAName
+ f I fld2NsAName fld2NsBName fld2NsCName
+ f I fld3NsAName fld3NsBName
+ f I fld4NsAName fld4NsCName
+ f I fld5NsAName fld5NsAName fld5NsCName
+ f I fld6NsAName fld6NsBName fld6NsAName
+ f I fld7NsAName fld7NsAName fld7NsAName
+ f I fld8NsAName fld8NsAName
+ f I fld9NsAName fld9NsAName
+ f I fld10NsAName
+ f I fld11NsAName
+ c fld11Comment
+c cls19NsAName
+ m ()I mth6NsAName mth6NsBName mth6NsCName
+ m ()I mth7NsAName mth7NsBName
+ m ()I mth8NsAName mth8NsCName
+ m ()I mth9NsAName mth9NsAName mth9NsCName
+ m ()I mth10NsAName mth10NsBName mth10NsAName
+ m ()I mth11NsAName mth11NsAName mth11NsAName
+ m ()I mth12NsAName mth12NsAName
+ m ()I mth13NsAName mth13NsAName
+ m ()I mth14NsAName
+ m ()I mth15NsAName
+ c mth15Comment
+c cls20NsAName
+ m ()I mth16NsAName
+ p 2 arg2NsAName arg2NsBName arg2NsCName
+ p 3 arg3NsAName arg3NsBName
+ p 4 arg4NsAName arg4NsCName
+ p 5 arg5NsAName arg5NsAName arg5NsCName
+ p 6 arg6NsAName arg6NsBName arg6NsAName
+ p 7 arg7NsAName arg7NsAName arg7NsAName
+ p 8 arg8NsAName arg8NsAName
+ p 9 arg9NsAName arg9NsAName
+ p 10 arg10NsAName
+ p 11 arg11NsAName
+ c arg11Comment
+c cls21NsAName
+ m ()I mth17NsAName
+ v 2 2 2 var2NsAName var2NsBName var2NsCName
+ v 3 3 3 var3NsAName var3NsBName
+ v 4 4 4 var4NsAName var4NsCName
+ v 5 5 5 var5NsAName var5NsAName var5NsCName
+ v 6 6 6 var6NsAName var6NsBName var6NsAName
+ v 7 7 7 var7NsAName var7NsAName var7NsAName
+ v 8 8 8 var8NsAName var8NsAName
+ v 9 9 9 var9NsAName var9NsAName
+ v 10 10 10 var10NsAName
+ v 11 11 11 var11NsAName
+ c var11Comment
diff --git a/src/test/resources/filtering/unfiltered/tsrg.tsrg b/src/test/resources/filtering/unfiltered/tsrg.tsrg
new file mode 100644
index 00000000..b72dc993
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/tsrg.tsrg
@@ -0,0 +1,24 @@
+cls0NsAName cls0NsBName
+cls1NsAName cls1NsBName
+cls3NsAName cls3NsAName
+cls4NsAName cls4NsBName
+cls5NsAName cls5NsAName
+cls6NsAName cls6NsAName
+cls14NsAName cls14NsAName
+ fld1NsAName fld1NsAName
+cls15NsAName cls15NsAName
+ mth3NsAName ()I mth3NsAName
+cls18NsAName cls18NsAName
+ fld2NsAName fld2NsBName
+ fld3NsAName fld3NsBName
+ fld5NsAName fld5NsAName
+ fld6NsAName fld6NsBName
+ fld7NsAName fld7NsAName
+ fld8NsAName fld8NsAName
+cls19NsAName cls19NsAName
+ mth6NsAName ()I mth6NsBName
+ mth7NsAName ()I mth7NsBName
+ mth9NsAName ()I mth9NsAName
+ mth10NsAName ()I mth10NsBName
+ mth11NsAName ()I mth11NsAName
+ mth12NsAName ()I mth12NsAName
diff --git a/src/test/resources/filtering/unfiltered/tsrgV2.tsrg b/src/test/resources/filtering/unfiltered/tsrgV2.tsrg
new file mode 100644
index 00000000..b9ef4950
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/tsrgV2.tsrg
@@ -0,0 +1,44 @@
+tsrg2 nsA nsB nsC
+cls0NsAName cls0NsBName cls0NsCName
+cls1NsAName cls1NsBName cls1NsAName
+cls2NsAName cls2NsAName cls2NsCName
+cls3NsAName cls3NsAName cls3NsCName
+cls4NsAName cls4NsBName cls4NsAName
+cls5NsAName cls5NsAName cls5NsAName
+cls6NsAName cls6NsAName cls6NsAName
+cls7NsAName cls7NsAName cls7NsAName
+cls14NsAName cls14NsAName cls14NsAName
+ fld1NsAName I fld1NsAName fld1NsAName
+cls15NsAName cls15NsAName cls15NsAName
+ mth3NsAName ()I mth3NsAName mth3NsAName
+cls16NsAName cls16NsAName cls16NsAName
+ mth4NsAName ()I mth4NsAName mth4NsAName
+ 1 arg1NsAName arg1NsAName arg1NsAName
+cls18NsAName cls18NsAName cls18NsAName
+ fld2NsAName I fld2NsBName fld2NsCName
+ fld3NsAName I fld3NsBName fld3NsAName
+ fld4NsAName I fld4NsAName fld4NsCName
+ fld5NsAName I fld5NsAName fld5NsCName
+ fld6NsAName I fld6NsBName fld6NsAName
+ fld7NsAName I fld7NsAName fld7NsAName
+ fld8NsAName I fld8NsAName fld8NsAName
+ fld9NsAName I fld9NsAName fld9NsAName
+cls19NsAName cls19NsAName cls19NsAName
+ mth6NsAName ()I mth6NsBName mth6NsCName
+ mth7NsAName ()I mth7NsBName mth7NsAName
+ mth8NsAName ()I mth8NsAName mth8NsCName
+ mth9NsAName ()I mth9NsAName mth9NsCName
+ mth10NsAName ()I mth10NsBName mth10NsAName
+ mth11NsAName ()I mth11NsAName mth11NsAName
+ mth12NsAName ()I mth12NsAName mth12NsAName
+ mth13NsAName ()I mth13NsAName mth13NsAName
+cls20NsAName cls20NsAName cls20NsAName
+ mth16NsAName ()I mth16NsAName mth16NsAName
+ 2 arg2NsAName arg2NsBName arg2NsCName
+ 3 arg3NsAName arg3NsBName arg3NsAName
+ 4 arg4NsAName arg4NsAName arg4NsCName
+ 5 arg5NsAName arg5NsAName arg5NsCName
+ 6 arg6NsAName arg6NsBName arg6NsAName
+ 7 arg7NsAName arg7NsAName arg7NsAName
+ 8 arg8NsAName arg8NsAName arg8NsAName
+ 9 arg9NsAName arg9NsAName arg9NsAName
diff --git a/src/test/resources/filtering/unfiltered/xsrg.xsrg b/src/test/resources/filtering/unfiltered/xsrg.xsrg
new file mode 100644
index 00000000..76c838c1
--- /dev/null
+++ b/src/test/resources/filtering/unfiltered/xsrg.xsrg
@@ -0,0 +1,20 @@
+CL: cls0NsAName cls0NsBName
+CL: cls1NsAName cls1NsBName
+CL: cls3NsAName cls3NsAName
+CL: cls4NsAName cls4NsBName
+CL: cls5NsAName cls5NsAName
+CL: cls6NsAName cls6NsAName
+FD: cls14NsAName/fld1NsAName I cls14NsAName/fld1NsAName I
+MD: cls15NsAName/mth3NsAName ()I cls15NsAName/mth3NsAName ()I
+FD: cls18NsAName/fld2NsAName I cls18NsAName/fld2NsBName I
+FD: cls18NsAName/fld3NsAName I cls18NsAName/fld3NsBName I
+FD: cls18NsAName/fld5NsAName I cls18NsAName/fld5NsAName I
+FD: cls18NsAName/fld6NsAName I cls18NsAName/fld6NsBName I
+FD: cls18NsAName/fld7NsAName I cls18NsAName/fld7NsAName I
+FD: cls18NsAName/fld8NsAName I cls18NsAName/fld8NsAName I
+MD: cls19NsAName/mth6NsAName ()I cls19NsAName/mth6NsBName ()I
+MD: cls19NsAName/mth7NsAName ()I cls19NsAName/mth7NsBName ()I
+MD: cls19NsAName/mth9NsAName ()I cls19NsAName/mth9NsAName ()I
+MD: cls19NsAName/mth10NsAName ()I cls19NsAName/mth10NsBName ()I
+MD: cls19NsAName/mth11NsAName ()I cls19NsAName/mth11NsAName ()I
+MD: cls19NsAName/mth12NsAName ()I cls19NsAName/mth12NsAName ()I