diff --git a/src/main/java/amidst/clazz/real/detector/RealClassDetector.java b/src/main/java/amidst/clazz/real/RealClassDetector.java similarity index 58% rename from src/main/java/amidst/clazz/real/detector/RealClassDetector.java rename to src/main/java/amidst/clazz/real/RealClassDetector.java index 1b6d2036..bbfc47c7 100644 --- a/src/main/java/amidst/clazz/real/detector/RealClassDetector.java +++ b/src/main/java/amidst/clazz/real/RealClassDetector.java @@ -1,14 +1,14 @@ -package amidst.clazz.real.detector; +package amidst.clazz.real; import java.util.ArrayList; import java.util.List; -import amidst.clazz.real.RealClass; import amidst.documentation.Immutable; @Immutable -public abstract class RealClassDetector { - public RealClass firstMatching(List realClasses) { +@FunctionalInterface +public interface RealClassDetector { + public default RealClass firstMatching(List realClasses) { for (RealClass realClass : realClasses) { if (detect(realClass)) { return realClass; @@ -17,7 +17,7 @@ public abstract class RealClassDetector { return null; } - public List allMatching(List realClasses) { + public default List allMatching(List realClasses) { List result = new ArrayList(); for (RealClass realClass : realClasses) { if (detect(realClass)) { @@ -27,5 +27,5 @@ public abstract class RealClassDetector { return result; } - public abstract boolean detect(RealClass realClass); + public boolean detect(RealClass realClass); } diff --git a/src/main/java/amidst/clazz/real/detector/AllRCD.java b/src/main/java/amidst/clazz/real/detector/AllRCD.java deleted file mode 100644 index c40035a5..00000000 --- a/src/main/java/amidst/clazz/real/detector/AllRCD.java +++ /dev/null @@ -1,25 +0,0 @@ -package amidst.clazz.real.detector; - -import java.util.List; - -import amidst.clazz.real.RealClass; -import amidst.documentation.Immutable; - -@Immutable -public class AllRCD extends RealClassDetector { - private final List detectors; - - public AllRCD(List detectors) { - this.detectors = detectors; - } - - @Override - public boolean detect(RealClass realClass) { - for (RealClassDetector detector : detectors) { - if (!detector.detect(realClass)) { - return false; - } - } - return true; - } -} diff --git a/src/main/java/amidst/clazz/real/detector/AnyRCD.java b/src/main/java/amidst/clazz/real/detector/AnyRCD.java deleted file mode 100644 index 43627cc7..00000000 --- a/src/main/java/amidst/clazz/real/detector/AnyRCD.java +++ /dev/null @@ -1,25 +0,0 @@ -package amidst.clazz.real.detector; - -import java.util.List; - -import amidst.clazz.real.RealClass; -import amidst.documentation.Immutable; - -@Immutable -public class AnyRCD extends RealClassDetector { - private final List detectors; - - public AnyRCD(List detectors) { - this.detectors = detectors; - } - - @Override - public boolean detect(RealClass realClass) { - for (RealClassDetector detector : detectors) { - if (detector.detect(realClass)) { - return true; - } - } - return false; - } -} diff --git a/src/main/java/amidst/clazz/real/detector/FieldFlagsRCD.java b/src/main/java/amidst/clazz/real/detector/FieldFlagsRCD.java deleted file mode 100644 index 7453309d..00000000 --- a/src/main/java/amidst/clazz/real/detector/FieldFlagsRCD.java +++ /dev/null @@ -1,27 +0,0 @@ -package amidst.clazz.real.detector; - -import amidst.clazz.real.RealClass; -import amidst.clazz.real.RealClassField; -import amidst.documentation.Immutable; - -@Immutable -public class FieldFlagsRCD extends RealClassDetector { - private final int flags; - private final int[] fieldIndices; - - public FieldFlagsRCD(int flags, int... fieldIndices) { - this.flags = flags; - this.fieldIndices = fieldIndices; - } - - @Override - public boolean detect(RealClass realClass) { - for (int fieldIndex : fieldIndices) { - RealClassField field = realClass.getField(fieldIndex); - if (!field.hasFlags(flags)) { - return false; - } - } - return true; - } -} diff --git a/src/main/java/amidst/clazz/real/detector/LongRCD.java b/src/main/java/amidst/clazz/real/detector/LongRCD.java deleted file mode 100644 index 45e7918b..00000000 --- a/src/main/java/amidst/clazz/real/detector/LongRCD.java +++ /dev/null @@ -1,23 +0,0 @@ -package amidst.clazz.real.detector; - -import amidst.clazz.real.RealClass; -import amidst.documentation.Immutable; - -@Immutable -public class LongRCD extends RealClassDetector { - private final long[] longs; - - public LongRCD(long... longs) { - this.longs = longs; - } - - @Override - public boolean detect(RealClass realClass) { - for (long element : longs) { - if (!realClass.searchForLong(element)) { - return false; - } - } - return true; - } -} diff --git a/src/main/java/amidst/clazz/real/detector/NumberOfConstructorsRCD.java b/src/main/java/amidst/clazz/real/detector/NumberOfConstructorsRCD.java deleted file mode 100644 index 6e70f603..00000000 --- a/src/main/java/amidst/clazz/real/detector/NumberOfConstructorsRCD.java +++ /dev/null @@ -1,18 +0,0 @@ -package amidst.clazz.real.detector; - -import amidst.clazz.real.RealClass; -import amidst.documentation.Immutable; - -@Immutable -public class NumberOfConstructorsRCD extends RealClassDetector { - private final int count; - - public NumberOfConstructorsRCD(int count) { - this.count = count; - } - - @Override - public boolean detect(RealClass realClass) { - return realClass.getNumberOfConstructors() == count; - } -} diff --git a/src/main/java/amidst/clazz/real/detector/NumberOfFieldsRCD.java b/src/main/java/amidst/clazz/real/detector/NumberOfFieldsRCD.java deleted file mode 100644 index 57d5c4d0..00000000 --- a/src/main/java/amidst/clazz/real/detector/NumberOfFieldsRCD.java +++ /dev/null @@ -1,18 +0,0 @@ -package amidst.clazz.real.detector; - -import amidst.clazz.real.RealClass; -import amidst.documentation.Immutable; - -@Immutable -public class NumberOfFieldsRCD extends RealClassDetector { - private final int count; - - public NumberOfFieldsRCD(int count) { - this.count = count; - } - - @Override - public boolean detect(RealClass realClass) { - return realClass.getNumberOfFields() == count; - } -} diff --git a/src/main/java/amidst/clazz/real/detector/NumberOfMethodsRCD.java b/src/main/java/amidst/clazz/real/detector/NumberOfMethodsRCD.java deleted file mode 100644 index 6d9ed801..00000000 --- a/src/main/java/amidst/clazz/real/detector/NumberOfMethodsRCD.java +++ /dev/null @@ -1,18 +0,0 @@ -package amidst.clazz.real.detector; - -import amidst.clazz.real.RealClass; -import amidst.documentation.Immutable; - -@Immutable -public class NumberOfMethodsRCD extends RealClassDetector { - private final int count; - - public NumberOfMethodsRCD(int count) { - this.count = count; - } - - @Override - public boolean detect(RealClass realClass) { - return realClass.getNumberOfMethods() == count; - } -} diff --git a/src/main/java/amidst/clazz/real/detector/StringContainingRCD.java b/src/main/java/amidst/clazz/real/detector/StringContainingRCD.java deleted file mode 100644 index 187eceeb..00000000 --- a/src/main/java/amidst/clazz/real/detector/StringContainingRCD.java +++ /dev/null @@ -1,18 +0,0 @@ -package amidst.clazz.real.detector; - -import amidst.clazz.real.RealClass; -import amidst.documentation.Immutable; - -@Immutable -public class StringContainingRCD extends RealClassDetector { - private final String string; - - public StringContainingRCD(String string) { - this.string = string; - } - - @Override - public boolean detect(RealClass realClass) { - return realClass.searchForStringContaining(string); - } -} diff --git a/src/main/java/amidst/clazz/real/detector/Utf8EqualToRCD.java b/src/main/java/amidst/clazz/real/detector/Utf8EqualToRCD.java deleted file mode 100644 index e4be4aab..00000000 --- a/src/main/java/amidst/clazz/real/detector/Utf8EqualToRCD.java +++ /dev/null @@ -1,18 +0,0 @@ -package amidst.clazz.real.detector; - -import amidst.clazz.real.RealClass; -import amidst.documentation.Immutable; - -@Immutable -public class Utf8EqualToRCD extends RealClassDetector { - private final String utf8; - - public Utf8EqualToRCD(String utf8) { - this.utf8 = utf8; - } - - @Override - public boolean detect(RealClass realClass) { - return realClass.searchForUtf8EqualTo(utf8); - } -} diff --git a/src/main/java/amidst/clazz/real/detector/WildcardByteRCD.java b/src/main/java/amidst/clazz/real/detector/WildcardByteRCD.java deleted file mode 100644 index 6ce82f92..00000000 --- a/src/main/java/amidst/clazz/real/detector/WildcardByteRCD.java +++ /dev/null @@ -1,18 +0,0 @@ -package amidst.clazz.real.detector; - -import amidst.clazz.real.RealClass; -import amidst.documentation.Immutable; - -@Immutable -public class WildcardByteRCD extends RealClassDetector { - private final int[] bytes; - - public WildcardByteRCD(int[] bytes) { - this.bytes = bytes; - } - - @Override - public boolean detect(RealClass realClass) { - return realClass.isClassDataWildcardMatching(bytes); - } -} diff --git a/src/main/java/amidst/clazz/translator/CTBuilder.java b/src/main/java/amidst/clazz/translator/CTBuilder.java index e0215825..2ffe30a5 100644 --- a/src/main/java/amidst/clazz/translator/CTBuilder.java +++ b/src/main/java/amidst/clazz/translator/CTBuilder.java @@ -5,17 +5,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import amidst.clazz.real.detector.AllRCD; -import amidst.clazz.real.detector.AnyRCD; -import amidst.clazz.real.detector.FieldFlagsRCD; -import amidst.clazz.real.detector.LongRCD; -import amidst.clazz.real.detector.NumberOfConstructorsRCD; -import amidst.clazz.real.detector.NumberOfFieldsRCD; -import amidst.clazz.real.detector.NumberOfMethodsRCD; -import amidst.clazz.real.detector.RealClassDetector; -import amidst.clazz.real.detector.StringContainingRCD; -import amidst.clazz.real.detector.Utf8EqualToRCD; -import amidst.clazz.real.detector.WildcardByteRCD; +import amidst.clazz.real.RealClassDetector; import amidst.clazz.symbolic.declaration.SymbolicClassDeclaration; import amidst.clazz.symbolic.declaration.SymbolicConstructorDeclaration; import amidst.clazz.symbolic.declaration.SymbolicFieldDeclaration; @@ -30,84 +20,6 @@ import amidst.documentation.NotThreadSafe; */ @NotThreadSafe public class CTBuilder { - @NotThreadSafe - public class RCDBuilder { - private final List> allDetectors = new ArrayList>(); - private List detectors = new ArrayList(); - - private RealClassDetector constructThis() { - if (allDetectors.size() == 1) { - return new AllRCD(allDetectors.get(0)); - } else { - List result = new ArrayList(); - for (List detectors : allDetectors) { - result.add(new AllRCD(detectors)); - } - return new AnyRCD(result); - } - } - - public RCDBuilder or() { - allDetectors.add(detectors); - detectors = new ArrayList(); - return this; - } - - public SCDBuilder thenDeclareRequired(String symbolicClassName) { - return thenDeclare(symbolicClassName, false); - } - - public SCDBuilder thenDeclareOptional(String symbolicClassName) { - return thenDeclare(symbolicClassName, true); - } - - private SCDBuilder thenDeclare(String symbolicClassName, boolean isOptional) { - allDetectors.add(detectors); - CTBuilder.this.declarationBuilder.init(symbolicClassName, isOptional); - return CTBuilder.this.declarationBuilder; - } - - public RCDBuilder fieldFlags(int flags, int... fieldIndices) { - detectors.add(new FieldFlagsRCD(flags, fieldIndices)); - return this; - } - - public RCDBuilder longs(long... longs) { - detectors.add(new LongRCD(longs)); - return this; - } - - public RCDBuilder numberOfConstructors(int count) { - detectors.add(new NumberOfConstructorsRCD(count)); - return this; - } - - public RCDBuilder numberOfFields(int count) { - detectors.add(new NumberOfFieldsRCD(count)); - return this; - } - - public RCDBuilder numberOfMethods(int count) { - detectors.add(new NumberOfMethodsRCD(count)); - return this; - } - - public RCDBuilder stringContaining(String string) { - detectors.add(new StringContainingRCD(string)); - return this; - } - - public RCDBuilder utf8EqualTo(String utf8) { - detectors.add(new Utf8EqualToRCD(utf8)); - return this; - } - - public RCDBuilder wildcardBytes(int[] bytes) { - detectors.add(new WildcardByteRCD(bytes)); - return this; - } - } - @NotThreadSafe public class SCDBuilder { private String symbolicClassName; @@ -192,15 +104,31 @@ public class CTBuilder { private final CTBuilder previous; - private final RCDBuilder detectorBuilder = new RCDBuilder(); + private RealClassDetector detector = null; private final SCDBuilder declarationBuilder = new SCDBuilder(); private CTBuilder(CTBuilder previous) { this.previous = previous; } - public RCDBuilder ifDetect() { - return detectorBuilder; + public CTBuilder ifDetect(RealClassDetector detector) { + this.detector = detector; + return this; + } + + public SCDBuilder thenDeclareRequired(String symbolicClassName) { + return thenDeclare(symbolicClassName, false); + } + + public SCDBuilder thenDeclareOptional(String symbolicClassName) { + return thenDeclare(symbolicClassName, true); + } + + private SCDBuilder thenDeclare(String symbolicClassName, boolean isOptional) { + if(detector == null) + throw new IllegalStateException("can't declare a symbolic class without calling ifDetect before"); + CTBuilder.this.declarationBuilder.init(symbolicClassName, isOptional); + return CTBuilder.this.declarationBuilder; } public ClassTranslator construct() { @@ -209,7 +137,7 @@ public class CTBuilder { private Map constructResult() { Map result = constructPreviousResult(); - result.put(detectorBuilder.constructThis(), declarationBuilder.constructThis()); + result.put(detector, declarationBuilder.constructThis()); return result; } diff --git a/src/main/java/amidst/clazz/translator/ClassTranslator.java b/src/main/java/amidst/clazz/translator/ClassTranslator.java index 4fceac53..e063c591 100644 --- a/src/main/java/amidst/clazz/translator/ClassTranslator.java +++ b/src/main/java/amidst/clazz/translator/ClassTranslator.java @@ -6,7 +6,7 @@ import java.util.Map; import java.util.Map.Entry; import amidst.clazz.real.RealClass; -import amidst.clazz.real.detector.RealClassDetector; +import amidst.clazz.real.RealClassDetector; import amidst.clazz.symbolic.declaration.SymbolicClassDeclaration; import amidst.documentation.Immutable; diff --git a/src/main/java/amidst/mojangapi/minecraftinterface/local/DefaultClassTranslator.java b/src/main/java/amidst/mojangapi/minecraftinterface/local/DefaultClassTranslator.java index 66da95b5..7facc3cb 100644 --- a/src/main/java/amidst/mojangapi/minecraftinterface/local/DefaultClassTranslator.java +++ b/src/main/java/amidst/mojangapi/minecraftinterface/local/DefaultClassTranslator.java @@ -21,15 +21,14 @@ public enum DefaultClassTranslator { private ClassTranslator createClassTranslator() { return ClassTranslator .builder() - .ifDetect() - .wildcardBytes(createIntCacheWildcardBytes()) - .or() - .stringContaining(", tcache: ") + .ifDetect(c -> + c.isClassDataWildcardMatching(createIntCacheWildcardBytes()) + || c.searchForStringContaining(", tcache: ") + ) .thenDeclareRequired(SymbolicNames.CLASS_INT_CACHE) .requiredMethod(SymbolicNames.METHOD_INT_CACHE_RESET_INT_CACHE, "a").end() .next() - .ifDetect() - .stringContaining("default_1_1") + .ifDetect(c -> c.searchForStringContaining("default_1_1")) .thenDeclareOptional(SymbolicNames.CLASS_WORLD_TYPE) .requiredField(SymbolicNames.FIELD_WORLD_TYPE_DEFAULT, "b") .requiredField(SymbolicNames.FIELD_WORLD_TYPE_FLAT, "c") @@ -37,8 +36,11 @@ public enum DefaultClassTranslator { .requiredField(SymbolicNames.FIELD_WORLD_TYPE_AMPLIFIED, "e") .requiredField(SymbolicNames.FIELD_WORLD_TYPE_CUSTOMIZED, "f") .next() - .ifDetect() - .longs(1000L, 2001L, 2000L) + .ifDetect(c -> + c.searchForLong(1000L) + && c.searchForLong(2001L) + && c.searchForLong(2000L) + ) .thenDeclareRequired(SymbolicNames.CLASS_GEN_LAYER) // one if the initializeAllBiomeGenerators-methods is required! .optionalMethod(SymbolicNames.METHOD_GEN_LAYER_INITIALIZE_ALL_BIOME_GENERATORS_1, "a").real("long").end() @@ -46,19 +48,15 @@ public enum DefaultClassTranslator { .optionalMethod(SymbolicNames.METHOD_GEN_LAYER_INITIALIZE_ALL_BIOME_GENERATORS_3, "a").real("long").symbolic("WorldType").real("String").end() .requiredMethod(SymbolicNames.METHOD_GEN_LAYER_GET_INTS, "a").real("int") .real("int") .real("int") .real("int").end() .next() - .ifDetect() - .numberOfConstructors(0) - .numberOfMethods(6) - .numberOfFields(3) - .fieldFlags(AccessFlags.PRIVATE | AccessFlags.STATIC, 0, 1, 2) - .utf8EqualTo("isDebugEnabled") - .or() - .numberOfConstructors(0) - .numberOfMethods(6) - .numberOfFields(3) - .fieldFlags(AccessFlags.PUBLIC | AccessFlags.STATIC, 0) - .fieldFlags(AccessFlags.PRIVATE | AccessFlags.STATIC, 1, 2) - .utf8EqualTo("isDebugEnabled") + .ifDetect(c -> + c.getNumberOfConstructors() == 0 + && c.getNumberOfMethods() == 6 + && c.getNumberOfFields() == 3 + && c.getField(0).hasFlags(AccessFlags.STATIC) + && c.getField(1).hasFlags(AccessFlags.PRIVATE | AccessFlags.STATIC) + && c.getField(2).hasFlags(AccessFlags.PRIVATE | AccessFlags.STATIC) + && c.searchForUtf8EqualTo("isDebugEnabled") + ) .thenDeclareOptional(SymbolicNames.CLASS_BLOCK_INIT) .requiredMethod(SymbolicNames.METHOD_BLOCK_INIT_INITIALIZE, "c").end() .construct();