Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,12 @@ public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelaye
public boolean check(Event e) {
return isNegated() ^ strings.check(e, StringUtils::isAlphanumeric);
}


@Override
public Condition simplify() {
return simplifyWith(strings);
}

@Override
public String toString(@Nullable Event e, boolean debug) {
return strings.toString(e, debug) + " is" + (isNegated() ? "n't" : "") + " alphanumeric";
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/ch/njol/skript/conditions/CondCompare.java
Original file line number Diff line number Diff line change
Expand Up @@ -397,6 +397,11 @@ private boolean compareLists(Event event) {
return shouldMatch;
}

@Override
public Condition simplify() {
return simplifyWith(first, second, third);
}

@Override
public String toString(final @Nullable Event event, final boolean debug) {
String s;
Expand Down
18 changes: 11 additions & 7 deletions src/main/java/ch/njol/skript/conditions/CondContains.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,29 +3,28 @@
import ch.njol.skript.Skript;
import ch.njol.skript.SkriptConfig;
import ch.njol.skript.aliases.ItemType;
import ch.njol.skript.lang.VerboseAssert;
import ch.njol.skript.lang.util.common.AnyContains;
import ch.njol.skript.util.LiteralUtils;
import org.skriptlang.skript.lang.comparator.Relation;
import ch.njol.skript.doc.Description;
import ch.njol.skript.doc.Examples;
import ch.njol.skript.doc.Name;
import ch.njol.skript.doc.Since;
import ch.njol.skript.lang.Condition;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.skript.lang.VerboseAssert;
import ch.njol.skript.lang.util.SimpleExpression;
import org.skriptlang.skript.lang.comparator.Comparators;
import ch.njol.skript.lang.util.common.AnyContains;
import ch.njol.skript.util.LiteralUtils;
import ch.njol.util.Kleenean;
import ch.njol.util.StringUtils;
import org.bukkit.event.Event;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.skriptlang.skript.lang.converter.Converters;
import org.jetbrains.annotations.Nullable;
import org.skriptlang.skript.lang.comparator.Comparators;
import org.skriptlang.skript.lang.comparator.Relation;
import org.skriptlang.skript.lang.converter.Converters;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.StringJoiner;

Expand Down Expand Up @@ -183,6 +182,11 @@ public String getReceivedMessage(Event event) {
return joiner.toString();
}

@Override
public Condition simplify() {
return simplifyWith(containers, items);
}

@Override
public String toString(@Nullable Event e, boolean debug) {
return containers.toString(e, debug) + (isNegated() ? " doesn't contain " : " contains ") + items.toString(e, debug);
Expand Down
7 changes: 6 additions & 1 deletion src/main/java/ch/njol/skript/conditions/CondDate.java
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,12 @@ public boolean check(final Event e) {
timespan -> now - date.getTime() >= timespan.getAs(Timespan.TimePeriod.MILLISECOND)
), isNegated());
}


@Override
public Condition simplify() {
return simplifyWith(date, delta);
}

@Override
public String toString(final @Nullable Event e, final boolean debug) {
return date.toString(e, debug) + " was " + (isNegated() ? "less" : "more") + " than " + delta.toString(e, debug) + " ago";
Expand Down
12 changes: 8 additions & 4 deletions src/main/java/ch/njol/skript/conditions/CondIsFuel.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
package ch.njol.skript.conditions;

import org.bukkit.Material;

import ch.njol.skript.Skript;
import ch.njol.skript.aliases.ItemType;
import ch.njol.skript.conditions.base.PropertyCondition;
import ch.njol.skript.doc.Description;
import ch.njol.skript.doc.Examples;
import ch.njol.skript.doc.Name;
import ch.njol.skript.doc.RequiredPlugins;
import ch.njol.skript.doc.Since;
import ch.njol.skript.lang.Condition;
import org.bukkit.Material;

@Name("Is Fuel")
@Description("Checks whether an item can be used as fuel in a furnace.")
Expand All @@ -32,7 +31,12 @@ public class CondIsFuel extends PropertyCondition<ItemType> {
public boolean check(ItemType item) {
return item.getMaterial().isFuel();
}


@Override
public Condition simplify() {
return simplifyWith(getExpr());
}

@Override
protected String getPropertyName() {
return "fuel";
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/ch/njol/skript/conditions/CondIsInfinite.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import ch.njol.skript.doc.Example;
import ch.njol.skript.doc.Name;
import ch.njol.skript.doc.Since;
import ch.njol.skript.lang.Condition;
import ch.njol.skript.util.Timespan;
import org.bukkit.potion.PotionEffect;

Expand All @@ -28,6 +29,11 @@ public boolean check(Object object) {
return false;
}

@Override
public Condition simplify() {
return simplifyWith(getExpr());
}

@Override
protected String getPropertyName() {
return "infinite";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import ch.njol.skript.doc.Examples;
import ch.njol.skript.doc.Name;
import ch.njol.skript.doc.Since;
import ch.njol.skript.lang.Condition;
import org.bukkit.util.Vector;

@Name("Is Normalized")
Expand All @@ -21,7 +22,12 @@ public class CondIsVectorNormalized extends PropertyCondition<Vector> {
public boolean check(Vector vector) {
return vector.isNormalized();
}


@Override
public Condition simplify() {
return simplifyWith(getExpr());
}

@Override
protected String getPropertyName() {
return "normalized";
Expand Down
18 changes: 11 additions & 7 deletions src/main/java/ch/njol/skript/conditions/CondMatches.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,6 @@

package ch.njol.skript.conditions;

import java.util.Arrays;
import java.util.regex.Pattern;

import org.bukkit.event.Event;
import org.jetbrains.annotations.Nullable;

import ch.njol.skript.Skript;
import ch.njol.skript.doc.Description;
import ch.njol.skript.doc.Examples;
Expand All @@ -16,6 +10,11 @@
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.util.Kleenean;
import org.bukkit.event.Event;
import org.jetbrains.annotations.Nullable;

import java.util.Arrays;
import java.util.regex.Pattern;

@Name("Matches")
@Description("Checks whether the defined strings match the input regexes (Regular expressions).")
Expand Down Expand Up @@ -75,7 +74,12 @@ public boolean check(Event e) {
public boolean matches(String str, Pattern pattern) {
return partial ? pattern.matcher(str).find() : str.matches(pattern.pattern());
}


@Override
public Condition simplify() {
return simplifyWith(strings, regex);
}

@Override
public String toString(@Nullable Event e, boolean debug) {
return strings.toString(e, debug) + " " + (isNegated() ? "doesn't match" : "matches") + " " + regex.toString(e, debug);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,12 @@ public boolean check(Event e) {
String ver = version.getSingle(e);
return ver != null ? Skript.isRunningMinecraft(new Version(ver)) ^ isNegated() : false;
}


@Override
public Condition simplify() {
return simplifyWith(version);
}

@Override
public String toString(@Nullable Event e, boolean debug) {
return "is running minecraft " + version.toString(e, debug);
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/ch/njol/skript/conditions/CondPastFuture.java
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,11 @@ public boolean check(Event event) {
return dates.check(event, date -> date.compareTo(new Date()) < 0, isNegated());
}

@Override
public Condition simplify() {
return simplifyWith(dates);
}

@Override
public String toString(@Nullable Event event, boolean debug) {
return dates.toString(event, debug) + (dates.isSingle() ? " is" : " are") + " in the" + (isFuture ? " future" : " past");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,12 @@ public boolean check(Event e) {
},
isNegated());
}


@Override
public Condition simplify() {
return simplifyWith(strings, affix);
}

@Override
public String toString(@Nullable Event e, boolean debug) {
if (isNegated())
Expand Down
38 changes: 37 additions & 1 deletion src/main/java/ch/njol/skript/lang/Condition.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
import ch.njol.skript.Skript;
import ch.njol.skript.conditions.base.PropertyCondition;
import ch.njol.skript.config.Node;
import ch.njol.skript.lang.simplification.Simplifiable;
import ch.njol.skript.lang.util.SimpleExpression;
import ch.njol.skript.test.runner.TestMode;
import ch.njol.util.Kleenean;
import org.bukkit.event.Event;
import org.jetbrains.annotations.ApiStatus;
Expand All @@ -22,7 +24,7 @@
*
* @see Skript#registerCondition(Class, String...)
*/
public abstract class Condition extends Statement implements Conditional<Event>, SyntaxRuntimeErrorProducer {
public abstract class Condition extends Statement implements Conditional<Event>, SyntaxRuntimeErrorProducer, Simplifiable<Condition> {

public enum ConditionType {
/**
Expand Down Expand Up @@ -117,6 +119,40 @@ public Node getNode() {
return "condition";
}

@Override
public Condition simplify() {
return this;
}

/**
* Helper method for simplifying this {@link Condition} using the {@link Expression}s it requires to be evaluated.
* Providing no {@link Expression}s will result in a failed simplification process.
*
* @param exprs The {@link Expression}s required for evaluation.
* @return {@link SimplifiedCondition} if all of {@code exprs} are {@link Literal}s, otherwise {@code this}.
*/
public Condition simplifyWith(Expression<?>... exprs) {
return simplifyWith(TestMode.DEV_MODE, exprs);
}

/**
* Helper method for simplifying this {@link Condition} using the {@link Expression}s it requires to be evaluated.
* Providing no {@link Expression}s will result in a failed simplification process.
*
* @param warn Whether a warning should be outputted if it's simplifiable.
* @param exprs The {@link Expression}s required for evaluation.
* @return {@link SimplifiedCondition} if all of {@code exprs} are {@link Literal}s, otherwise {@code this}.
*/
public Condition simplifyWith(boolean warn, Expression<?>... exprs) {
if (exprs.length == 0)
return this;
for (Expression<?> expr : exprs) {
if (expr != null && !(expr instanceof Literal<?>))
return this;
}
Comment thread
Absolutionism marked this conversation as resolved.
Outdated
return SimplifiedCondition.fromCondition(this, warn);
}

/**
* Parse a raw string input as a condition.
*
Expand Down
98 changes: 98 additions & 0 deletions src/main/java/ch/njol/skript/lang/SimplifiedCondition.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
package ch.njol.skript.lang;

import ch.njol.skript.Skript;
import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.skript.lang.parser.ParserInstance;
import ch.njol.skript.lang.util.ContextlessEvent;
import ch.njol.util.Kleenean;
import org.bukkit.event.Event;
import org.jetbrains.annotations.Nullable;
import org.skriptlang.skript.lang.script.Script;
import org.skriptlang.skript.lang.script.ScriptWarning;

/**
* Represents a condition that can be simplified during initialization.
*/
public class SimplifiedCondition extends Condition {

/**
* Creates a new {@link SimplifiedCondition} from a {@link Condition} by evaluating it with a {@link ContextlessEvent}.
* Any expression used by {@code original} that requires specific event data cannot be safely simplified.
*
* @param original The original {@link Condition} to simplify.
* @return A new {@link SimplifiedCondition}.
*/
public static Condition fromCondition(Condition original) {
return fromCondition(original, true);
}

/**
* Creates a new {@link SimplifiedCondition} from a {@link Condition} by evaluating it with a {@link ContextlessEvent}.
* Any expression used by {@code original} that requires specific event data cannot be safely simplified.
*
* @param original The original {@link Condition} to simplify.
* @param warn Whether a warning should be outputted.
Comment thread
Absolutionism marked this conversation as resolved.
Outdated
* @return A new {@link SimplifiedCondition}.
*/
public static Condition fromCondition(Condition original, boolean warn) {
if (original instanceof SimplifiedCondition simplifiedCondition)
return simplifiedCondition;

Event event = ContextlessEvent.get();
boolean result = original.check(event);

if (warn) {
ParserInstance parser = ParserInstance.get();
Script script = parser.isActive() ? parser.getCurrentScript() : null;
if (script != null && !script.suppressesWarning(ScriptWarning.CONSTANT_CONDITION)) {
Skript.warning("The condition '" + original + "' will always be " + (result ? "true" : "false") + ".");
Comment thread
Absolutionism marked this conversation as resolved.
Outdated
}
}

return new SimplifiedCondition(original, result);
}

private final Condition source;
private final boolean result;

/**
* Constructs a new {@link SimplifiedCondition}.
*
* @param source The source {@link Condition} this was created from.
* @param result The evaluated result from {@code source} via {@link Condition#check(Event)}.
*/
private SimplifiedCondition(Condition source, boolean result) {
this.source = source;
this.result = result;
}

/**
* Returns the source {@link Condition} used to create this {@link SimplifiedCondition}.
*/
public Condition getSource() {
return source;
}

/**
* Returns the result that was evaluated from {@link #source} during initialization.
*/
public boolean getResult() {
return result;
}

@Override
public boolean init(Expression<?>[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
throw new UnsupportedOperationException();
}

@Override
public boolean check(Event event) {
return result;
}

@Override
public String toString(@Nullable Event event, boolean debug) {
return source.toString(event, debug);
}

}
Loading