Fixes to BlockMask and "char" masks (#1787)

* If a char mask  is successfully created from the full input, return it

* Don't double-up adding a block to a BlockMaskBuilder (if adding by regex is successful)
 - InputParseException is thrown if unsuccessful

* Fix optimisation of BlockMask for negation of a single block type
 - Fixes #1755

* Allow early returning of an optimized MaskIntersection to avoid unnecessary work

* Actually allow underscore in isAlphanumericUnd
 - Fixes #1626

* Replace a few more hard-coded air internal IDs

* Don't fail silently if BlockMaskBuilder#addRegex doesn't work when testing all block types

* Remove unused import
This commit is contained in:
Jordan
2022-06-16 15:24:48 +01:00
committed by GitHub
parent f2bab901f4
commit fd00635533
5 changed files with 53 additions and 23 deletions

View File

@@ -127,6 +127,9 @@ public class RichMaskParser extends FaweParser<Mask> {
case '%', '$', '<', '>', '!' -> {
input = input.substring(input.indexOf(char0) + 1);
mask = parseFromInput(char0 + "[" + input + "]", context);
if (mask != null) {
return mask;
}
}
case '#' -> {
if (!(input.charAt(1) == '#')) {
@@ -145,6 +148,10 @@ public class RichMaskParser extends FaweParser<Mask> {
try {
builder.addRegex(full);
} catch (InputParseException ignored) {
context.setPreferringWildcard(false);
context.setRestricted(false);
BaseBlock block = worldEdit.getBlockFactory().parseFromInput(full, context);
builder.add(block);
} catch (PatternSyntaxException e) {
throw new SuggestInputParseException(
new NoMatchException(Caption.of("fawe.error.parse.unknown-mask", full,
@@ -166,10 +173,6 @@ public class RichMaskParser extends FaweParser<Mask> {
}
);
}
context.setPreferringWildcard(false);
context.setRestricted(false);
BaseBlock block = worldEdit.getBlockFactory().parseFromInput(full, context);
builder.add(block);
mask = builder.build(extent);
}
}

View File

@@ -123,7 +123,7 @@ public class BlockMaskBuilder {
if (input.charAt(input.length() - 1) == ']') {
int propStart = StringMan.findMatchingBracket(input, input.length() - 1);
if (propStart == -1) {
return;
throw new InputParseException(Caption.of("fawe.error.no-block-found", TextComponent.of(input)));
}
MutableCharSequence charSequence = MutableCharSequence.getTemporal();
@@ -250,11 +250,16 @@ public class BlockMaskBuilder {
if (StringMan.isAlphanumericUnd(input)) {
add(BlockTypes.parse(input));
} else {
boolean success = false;
for (BlockType myType : BlockTypesCache.values) {
if (myType.getId().matches(input)) {
add(myType);
success = true;
}
}
if (!success) {
throw new InputParseException(Caption.of("fawe.error.no-block-found", TextComponent.of(input)));
}
}
}
});

View File

@@ -295,7 +295,7 @@ public class StringMan {
public static boolean isAlphanumericUnd(CharSequence str) {
for (int i = 0; i < str.length(); i++) {
final char c = str.charAt(i);
if (c < 0x30 || c >= 0x3a && c <= 0x40 || c > 0x5a && c <= 0x60 || c > 0x7a) {
if (c < 0x30 || c >= 0x3a && c <= 0x40 || c > 0x5a && c <= 0x60 && c != 0x5f || c > 0x7a) {
return false;
}
}