Compare commits

..

5 Commits

Author SHA1 Message Date
Auxilor
b035fa8940 Changed deprecations 2023-01-27 12:52:55 +00:00
Auxilor
25c087592d Cached placeholder lookups 2023-01-27 12:45:57 +00:00
Auxilor
083cb39771 Cleanups, fixes 2023-01-27 12:20:51 +00:00
Auxilor
eb3e0f5c09 Updated to 6.50.0 2023-01-27 12:18:01 +00:00
Auxilor
08f43ddafd Added dynamic placeholders 2023-01-27 12:17:51 +00:00
10 changed files with 372 additions and 24 deletions

View File

@@ -1,13 +1,16 @@
package com.willfp.eco.core.integrations.placeholder; package com.willfp.eco.core.integrations.placeholder;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.LoadingCache; import com.github.benmanes.caffeine.cache.LoadingCache;
import com.willfp.eco.core.Eco; import com.willfp.eco.core.Eco;
import com.willfp.eco.core.EcoPlugin; import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.placeholder.AdditionalPlayer; import com.willfp.eco.core.placeholder.AdditionalPlayer;
import com.willfp.eco.core.placeholder.DynamicPlaceholder;
import com.willfp.eco.core.placeholder.InjectablePlaceholder; import com.willfp.eco.core.placeholder.InjectablePlaceholder;
import com.willfp.eco.core.placeholder.Placeholder; import com.willfp.eco.core.placeholder.Placeholder;
import com.willfp.eco.core.placeholder.PlaceholderInjectable; import com.willfp.eco.core.placeholder.PlaceholderInjectable;
import com.willfp.eco.core.placeholder.PlayerDynamicPlaceholder;
import com.willfp.eco.core.placeholder.PlayerPlaceholder; import com.willfp.eco.core.placeholder.PlayerPlaceholder;
import com.willfp.eco.core.placeholder.PlayerStaticPlaceholder; import com.willfp.eco.core.placeholder.PlayerStaticPlaceholder;
import com.willfp.eco.core.placeholder.PlayerlessPlaceholder; import com.willfp.eco.core.placeholder.PlayerlessPlaceholder;
@@ -24,6 +27,7 @@ import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher; import java.util.regex.Matcher;
@@ -37,13 +41,20 @@ public final class PlaceholderManager {
/** /**
* All registered placeholders. * All registered placeholders.
*/ */
private static final Map<EcoPlugin, Map<String, Placeholder>> REGISTERED_PLACEHOLDERS = new HashMap<>(); private static final Map<EcoPlugin, Map<Pattern, Placeholder>> REGISTERED_PLACEHOLDERS = new HashMap<>();
/** /**
* All registered placeholder integrations. * All registered placeholder integrations.
*/ */
private static final Set<PlaceholderIntegration> REGISTERED_INTEGRATIONS = new HashSet<>(); private static final Set<PlaceholderIntegration> REGISTERED_INTEGRATIONS = new HashSet<>();
/**
* Placeholder Lookup Cache.
*/
private static final Cache<PlaceholderLookup, Optional<Placeholder>> PLACEHOLDER_LOOKUP_CACHE = Caffeine.newBuilder()
.expireAfterWrite(1, TimeUnit.SECONDS)
.build();
/** /**
* Placeholder Cache. * Placeholder Cache.
*/ */
@@ -51,10 +62,17 @@ public final class PlaceholderManager {
.expireAfterWrite(50, TimeUnit.MILLISECONDS) .expireAfterWrite(50, TimeUnit.MILLISECONDS)
.build(key -> key.entry.getValue(key.player)); .build(key -> key.entry.getValue(key.player));
/**
* Dynamic Placeholder Cache.
*/
private static final LoadingCache<DynamicEntryWithPlayer, String> DYNAMIC_PLACEHOLDER_CACHE = Caffeine.newBuilder()
.expireAfterWrite(50, TimeUnit.MILLISECONDS)
.build(key -> key.entry.getValue(key.args, key.player));
/** /**
* The default PlaceholderAPI pattern; brought in for compatibility. * The default PlaceholderAPI pattern; brought in for compatibility.
*/ */
private static final Pattern PATTERN = Pattern.compile("[%]([^% ]+)[%]"); private static final Pattern PATTERN = Pattern.compile("%([^% ]+)%");
/** /**
* Empty injectable object. * Empty injectable object.
@@ -88,14 +106,17 @@ public final class PlaceholderManager {
* @param placeholder The placeholder to register. * @param placeholder The placeholder to register.
*/ */
public static void registerPlaceholder(@NotNull final Placeholder placeholder) { public static void registerPlaceholder(@NotNull final Placeholder placeholder) {
if (placeholder instanceof StaticPlaceholder) { if (placeholder instanceof StaticPlaceholder || placeholder instanceof PlayerStaticPlaceholder) {
throw new IllegalArgumentException("Static placeholders cannot be registered!"); throw new IllegalArgumentException("Static placeholders cannot be registered!");
} }
EcoPlugin plugin = placeholder.getPlugin() == null ? Eco.get().getEcoPlugin() : placeholder.getPlugin(); EcoPlugin plugin = placeholder.getPlugin() == null ? Eco.get().getEcoPlugin() : placeholder.getPlugin();
Map<String, Placeholder> pluginPlaceholders = REGISTERED_PLACEHOLDERS
Map<Pattern, Placeholder> pluginPlaceholders = REGISTERED_PLACEHOLDERS
.getOrDefault(plugin, new HashMap<>()); .getOrDefault(plugin, new HashMap<>());
pluginPlaceholders.put(placeholder.getIdentifier(), placeholder);
pluginPlaceholders.put(placeholder.getPattern(), placeholder);
REGISTERED_PLACEHOLDERS.put(plugin, pluginPlaceholders); REGISTERED_PLACEHOLDERS.put(plugin, pluginPlaceholders);
} }
@@ -136,21 +157,47 @@ public final class PlaceholderManager {
public static String getResult(@Nullable final Player player, public static String getResult(@Nullable final Player player,
@NotNull final String identifier, @NotNull final String identifier,
@Nullable final EcoPlugin plugin) { @Nullable final EcoPlugin plugin) {
EcoPlugin owner = plugin == null ? Eco.get().getEcoPlugin() : plugin; // This is really janky, and it sucks, but it works so?
Placeholder placeholder = REGISTERED_PLACEHOLDERS.getOrDefault(owner, new HashMap<>()).get(identifier.toLowerCase()); // Compensating for regex being slow so that's why we get it.
Placeholder placeholder = PLACEHOLDER_LOOKUP_CACHE.get(
new PlaceholderLookup(identifier, plugin),
(it) -> {
EcoPlugin owner = plugin == null ? Eco.get().getEcoPlugin() : plugin;
if (placeholder == null && plugin != null) { // I hate the streams API.
Placeholder alternate = REGISTERED_PLACEHOLDERS.getOrDefault(Eco.get().getEcoPlugin(), new HashMap<>()) Optional<Placeholder> found = REGISTERED_PLACEHOLDERS
.get(identifier.toLowerCase()); .getOrDefault(owner, new HashMap<>())
if (alternate != null) { .entrySet()
placeholder = alternate; .stream().filter(entry -> entry.getKey().matcher(identifier).matches())
} .map(Map.Entry::getValue)
} .findFirst();
if (found.isEmpty() && plugin != null) {
// Here we go again! Something about legacy support? I don't remember.
// I won't touch it though, I'm scared of the placeholder system.
found = REGISTERED_PLACEHOLDERS
.getOrDefault(Eco.get().getEcoPlugin(), new HashMap<>())
.entrySet()
.stream().filter(entry -> entry.getKey().matcher(identifier).matches())
.map(Map.Entry::getValue)
.findFirst();
}
return found;
}
).orElse(null);
if (placeholder == null) { if (placeholder == null) {
return ""; return "";
} }
/*
This code here is *really* not very good. It's mega externalized logic hacked
together and made worse by the addition of dynamic placeholders. But it works,
and it means I don't have to rewrite the whole placeholder system. So it's
good enough for me.
*/
if (placeholder instanceof PlayerPlaceholder playerPlaceholder) { if (placeholder instanceof PlayerPlaceholder playerPlaceholder) {
if (player == null) { if (player == null) {
return ""; return "";
@@ -159,6 +206,14 @@ public final class PlaceholderManager {
} }
} else if (placeholder instanceof PlayerlessPlaceholder playerlessPlaceholder) { } else if (placeholder instanceof PlayerlessPlaceholder playerlessPlaceholder) {
return playerlessPlaceholder.getValue(); return playerlessPlaceholder.getValue();
} else if (placeholder instanceof PlayerDynamicPlaceholder playerDynamicPlaceholder) {
if (player == null) {
return "";
} else {
return DYNAMIC_PLACEHOLDER_CACHE.get(new DynamicEntryWithPlayer(playerDynamicPlaceholder, identifier, player));
}
} else if (placeholder instanceof DynamicPlaceholder dynamicPlaceholder) {
return dynamicPlaceholder.getValue(identifier);
} else { } else {
return ""; return "";
} }
@@ -245,8 +300,10 @@ public final class PlaceholderManager {
for (PlaceholderIntegration integration : REGISTERED_INTEGRATIONS) { for (PlaceholderIntegration integration : REGISTERED_INTEGRATIONS) {
processed = integration.translate(processed, player); processed = integration.translate(processed, player);
} }
for (InjectablePlaceholder injection : context.getPlaceholderInjections()) { for (InjectablePlaceholder injection : context.getPlaceholderInjections()) {
// Do I know this is a bad way of doing this? Yes. // Do I know this is a bad way of doing this? Yes.
// I know it's deprecated, but it's fast.
if (injection instanceof StaticPlaceholder placeholder) { if (injection instanceof StaticPlaceholder placeholder) {
processed = processed.replace("%" + placeholder.getIdentifier() + "%", placeholder.getValue()); processed = processed.replace("%" + placeholder.getIdentifier() + "%", placeholder.getValue());
} else if (injection instanceof PlayerStaticPlaceholder placeholder && player != null) { } else if (injection instanceof PlayerStaticPlaceholder placeholder && player != null) {
@@ -280,11 +337,22 @@ public final class PlaceholderManager {
return new ArrayList<>(found); return new ArrayList<>(found);
} }
private record PlaceholderLookup(@NotNull String identifier,
@Nullable EcoPlugin plugin) {
}
private record EntryWithPlayer(@NotNull PlayerPlaceholder entry, private record EntryWithPlayer(@NotNull PlayerPlaceholder entry,
@NotNull Player player) { @NotNull Player player) {
} }
private record DynamicEntryWithPlayer(@NotNull PlayerDynamicPlaceholder entry,
@NotNull String args,
@NotNull Player player) {
}
private PlaceholderManager() { private PlaceholderManager() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated"); throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
} }

View File

@@ -0,0 +1,102 @@
package com.willfp.eco.core.placeholder;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.integrations.placeholder.PlaceholderManager;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Objects;
import java.util.function.Function;
import java.util.regex.Pattern;
/**
* A placeholder that does not require a player and supports dynamic styles.
*/
public final class DynamicPlaceholder implements Placeholder {
/**
* The placeholder pattern.
*/
private final Pattern pattern;
/**
* The function to retrieve the output of the placeholder.
*/
private final Function<String, String> function;
/**
* The plugin for the placeholder.
*/
private final EcoPlugin plugin;
/**
* Create a new dynamic placeholder.
*
* @param plugin The plugin.
* @param pattern The pattern.
* @param function The function to retrieve the value.
*/
public DynamicPlaceholder(@NotNull final EcoPlugin plugin,
@NotNull final Pattern pattern,
@NotNull final Function<String, String> function) {
this.plugin = plugin;
this.pattern = pattern;
this.function = function;
}
/**
* Get the value of the placeholder.
*
* @param args The args.
* @return The value.
*/
@NotNull
public String getValue(@NotNull final String args) {
return function.apply(args);
}
/**
* Register the placeholder.
*
* @return The placeholder.
*/
public DynamicPlaceholder register() {
PlaceholderManager.registerPlaceholder(this);
return this;
}
@Override
public @NotNull EcoPlugin getPlugin() {
return this.plugin;
}
@Override
@Deprecated
public @NotNull String getIdentifier() {
return "dynamic";
}
@NotNull
@Override
public Pattern getPattern() {
return this.pattern;
}
@Override
public boolean equals(@Nullable final Object o) {
if (this == o) {
return true;
}
if (!(o instanceof DynamicPlaceholder that)) {
return false;
}
return Objects.equals(this.getPattern(), that.getPattern())
&& Objects.equals(this.getPlugin(), that.getPlugin());
}
@Override
public int hashCode() {
return Objects.hash(this.getIdentifier(), this.getPlugin());
}
}

View File

@@ -2,13 +2,14 @@ package com.willfp.eco.core.placeholder;
import com.willfp.eco.core.Eco; import com.willfp.eco.core.Eco;
import com.willfp.eco.core.EcoPlugin; import com.willfp.eco.core.EcoPlugin;
import org.jetbrains.annotations.NotNull;
/** /**
* Placeholders that can be injected into {@link PlaceholderInjectable} objects. * Placeholders that can be injected into {@link PlaceholderInjectable} objects.
*/ */
public sealed interface InjectablePlaceholder extends Placeholder permits PlayerStaticPlaceholder, StaticPlaceholder { public sealed interface InjectablePlaceholder extends Placeholder permits PlayerStaticPlaceholder, StaticPlaceholder {
@Override @Override
default EcoPlugin getPlugin() { default @NotNull EcoPlugin getPlugin() {
return Eco.get().getEcoPlugin(); return Eco.get().getEcoPlugin();
} }
} }

View File

@@ -1,16 +1,22 @@
package com.willfp.eco.core.placeholder; package com.willfp.eco.core.placeholder;
import com.willfp.eco.core.EcoPlugin; import com.willfp.eco.core.EcoPlugin;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.regex.Pattern;
/** /**
* A placeholder represents a string that can hold a value. * A placeholder represents a string that can hold a value.
*/ */
public sealed interface Placeholder permits PlayerPlaceholder, PlayerlessPlaceholder, InjectablePlaceholder { public sealed interface Placeholder permits PlayerPlaceholder, PlayerlessPlaceholder,
DynamicPlaceholder, PlayerDynamicPlaceholder, InjectablePlaceholder {
/** /**
* Get the plugin that holds the placeholder. * Get the plugin that holds the placeholder.
* *
* @return The plugin. * @return The plugin.
*/ */
@Nullable
EcoPlugin getPlugin(); EcoPlugin getPlugin();
/** /**
@@ -18,5 +24,16 @@ public sealed interface Placeholder permits PlayerPlaceholder, PlayerlessPlaceho
* *
* @return The identifier. * @return The identifier.
*/ */
@NotNull
String getIdentifier(); String getIdentifier();
/**
* Get the pattern for the placeholder.
*
* @return The pattern.
*/
@NotNull
default Pattern getPattern() {
return Pattern.compile(this.getIdentifier());
}
} }

View File

@@ -0,0 +1,105 @@
package com.willfp.eco.core.placeholder;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.integrations.placeholder.PlaceholderManager;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Objects;
import java.util.function.BiFunction;
import java.util.regex.Pattern;
/**
* A placeholder that does not require a player and supports dynamic styles.
*/
public final class PlayerDynamicPlaceholder implements Placeholder {
/**
* The placeholder pattern.
*/
private final Pattern pattern;
/**
* The function to retrieve the output of the placeholder.
*/
private final BiFunction<String, Player, String> function;
/**
* The plugin for the placeholder.
*/
private final EcoPlugin plugin;
/**
* Create a new dynamic placeholder.
*
* @param plugin The plugin.
* @param pattern The pattern.
* @param function The function to retrieve the value.
*/
public PlayerDynamicPlaceholder(@NotNull final EcoPlugin plugin,
@NotNull final Pattern pattern,
@NotNull final BiFunction<String, Player, String> function) {
this.plugin = plugin;
this.pattern = pattern;
this.function = function;
}
/**
* Get the value of the placeholder.
*
* @param args The args.
* @param player The player.
* @return The value.
*/
@NotNull
public String getValue(@NotNull final String args,
@NotNull final Player player) {
return function.apply(args, player);
}
/**
* Register the placeholder.
*
* @return The placeholder.
*/
public PlayerDynamicPlaceholder register() {
PlaceholderManager.registerPlaceholder(this);
return this;
}
@Override
public @NotNull EcoPlugin getPlugin() {
return this.plugin;
}
@Override
@Deprecated
public @NotNull String getIdentifier() {
return "dynamic";
}
@NotNull
@Override
public Pattern getPattern() {
return this.pattern;
}
@Override
public boolean equals(@Nullable final Object o) {
if (this == o) {
return true;
}
if (!(o instanceof PlayerDynamicPlaceholder that)) {
return false;
}
return Objects.equals(this.getPattern(), that.getPattern())
&& Objects.equals(this.getPlugin(), that.getPlugin());
}
@Override
public int hashCode() {
return Objects.hash(this.getIdentifier(), this.getPlugin());
}
}

View File

@@ -8,6 +8,7 @@ import org.jetbrains.annotations.Nullable;
import java.util.Objects; import java.util.Objects;
import java.util.function.Function; import java.util.function.Function;
import java.util.regex.Pattern;
/** /**
* A placeholder that requires a player. * A placeholder that requires a player.
@@ -18,6 +19,11 @@ public final class PlayerPlaceholder implements Placeholder {
*/ */
private final String identifier; private final String identifier;
/**
* The placeholder pattern.
*/
private final Pattern pattern;
/** /**
* The function to retrieve the output of the placeholder given a player. * The function to retrieve the output of the placeholder given a player.
*/ */
@@ -40,6 +46,7 @@ public final class PlayerPlaceholder implements Placeholder {
@NotNull final Function<Player, String> function) { @NotNull final Function<Player, String> function) {
this.plugin = plugin; this.plugin = plugin;
this.identifier = identifier; this.identifier = identifier;
this.pattern = Pattern.compile(identifier);
this.function = function; this.function = function;
} }
@@ -49,6 +56,7 @@ public final class PlayerPlaceholder implements Placeholder {
* @param player The player. * @param player The player.
* @return The value. * @return The value.
*/ */
@NotNull
public String getValue(@NotNull final Player player) { public String getValue(@NotNull final Player player) {
return function.apply(player); return function.apply(player);
} }
@@ -64,15 +72,21 @@ public final class PlayerPlaceholder implements Placeholder {
} }
@Override @Override
public EcoPlugin getPlugin() { public @NotNull EcoPlugin getPlugin() {
return this.plugin; return this.plugin;
} }
@Override @Override
public String getIdentifier() { public @NotNull String getIdentifier() {
return this.identifier; return this.identifier;
} }
@NotNull
@Override
public Pattern getPattern() {
return this.pattern;
}
@Override @Override
public boolean equals(@Nullable final Object o) { public boolean equals(@Nullable final Object o) {
if (this == o) { if (this == o) {

View File

@@ -6,6 +6,7 @@ import org.jetbrains.annotations.Nullable;
import java.util.Objects; import java.util.Objects;
import java.util.function.Function; import java.util.function.Function;
import java.util.regex.Pattern;
/** /**
* A placeholder that cannot be registered, and exists purely in injection. * A placeholder that cannot be registered, and exists purely in injection.
@@ -16,6 +17,11 @@ public final class PlayerStaticPlaceholder implements InjectablePlaceholder {
*/ */
private final String identifier; private final String identifier;
/**
* The placeholder pattern.
*/
private final Pattern pattern;
/** /**
* The function to retrieve the output of the placeholder. * The function to retrieve the output of the placeholder.
*/ */
@@ -30,6 +36,7 @@ public final class PlayerStaticPlaceholder implements InjectablePlaceholder {
public PlayerStaticPlaceholder(@NotNull final String identifier, public PlayerStaticPlaceholder(@NotNull final String identifier,
@NotNull final Function<Player, String> function) { @NotNull final Function<Player, String> function) {
this.identifier = identifier; this.identifier = identifier;
this.pattern = Pattern.compile(identifier);
this.function = function; this.function = function;
} }
@@ -39,15 +46,22 @@ public final class PlayerStaticPlaceholder implements InjectablePlaceholder {
* @param player The player. * @param player The player.
* @return The value. * @return The value.
*/ */
@NotNull
public String getValue(@NotNull final Player player) { public String getValue(@NotNull final Player player) {
return function.apply(player); return function.apply(player);
} }
@Override @Override
public String getIdentifier() { public @NotNull String getIdentifier() {
return this.identifier; return this.identifier;
} }
@NotNull
@Override
public Pattern getPattern() {
return this.pattern;
}
@Override @Override
public boolean equals(@Nullable final Object o) { public boolean equals(@Nullable final Object o) {
if (this == o) { if (this == o) {

View File

@@ -7,16 +7,22 @@ import org.jetbrains.annotations.Nullable;
import java.util.Objects; import java.util.Objects;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.regex.Pattern;
/** /**
* A placeholder that does not require a player. * A placeholder that does not require a player.
*/ */
public final class PlayerlessPlaceholder implements Placeholder { public final class PlayerlessPlaceholder implements Placeholder {
/** /**
* The name of the placeholder. * The placeholder identifier.
*/ */
private final String identifier; private final String identifier;
/**
* The placeholder pattern.
*/
private final Pattern pattern;
/** /**
* The function to retrieve the output of the placeholder. * The function to retrieve the output of the placeholder.
*/ */
@@ -39,6 +45,7 @@ public final class PlayerlessPlaceholder implements Placeholder {
@NotNull final Supplier<String> function) { @NotNull final Supplier<String> function) {
this.plugin = plugin; this.plugin = plugin;
this.identifier = identifier; this.identifier = identifier;
this.pattern = Pattern.compile(identifier);
this.function = function; this.function = function;
} }
@@ -62,15 +69,21 @@ public final class PlayerlessPlaceholder implements Placeholder {
} }
@Override @Override
public EcoPlugin getPlugin() { public @NotNull EcoPlugin getPlugin() {
return this.plugin; return this.plugin;
} }
@Override @Override
public String getIdentifier() { public @NotNull String getIdentifier() {
return this.identifier; return this.identifier;
} }
@NotNull
@Override
public Pattern getPattern() {
return this.pattern;
}
@Override @Override
public boolean equals(@Nullable final Object o) { public boolean equals(@Nullable final Object o) {
if (this == o) { if (this == o) {

View File

@@ -5,6 +5,7 @@ import org.jetbrains.annotations.Nullable;
import java.util.Objects; import java.util.Objects;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.regex.Pattern;
/** /**
* A placeholder that cannot be registered, and exists purely in injection. * A placeholder that cannot be registered, and exists purely in injection.
@@ -15,6 +16,11 @@ public final class StaticPlaceholder implements InjectablePlaceholder {
*/ */
private final String identifier; private final String identifier;
/**
* The placeholder pattern.
*/
private final Pattern pattern;
/** /**
* The function to retrieve the output of the placeholder. * The function to retrieve the output of the placeholder.
*/ */
@@ -29,6 +35,7 @@ public final class StaticPlaceholder implements InjectablePlaceholder {
public StaticPlaceholder(@NotNull final String identifier, public StaticPlaceholder(@NotNull final String identifier,
@NotNull final Supplier<String> function) { @NotNull final Supplier<String> function) {
this.identifier = identifier; this.identifier = identifier;
this.pattern = Pattern.compile(identifier);
this.function = function; this.function = function;
} }
@@ -37,15 +44,22 @@ public final class StaticPlaceholder implements InjectablePlaceholder {
* *
* @return The value. * @return The value.
*/ */
@NotNull
public String getValue() { public String getValue() {
return function.get(); return function.get();
} }
@Override @Override
public String getIdentifier() { public @NotNull String getIdentifier() {
return this.identifier; return this.identifier;
} }
@NotNull
@Override
public Pattern getPattern() {
return this.pattern;
}
@Override @Override
public boolean equals(@Nullable final Object o) { public boolean equals(@Nullable final Object o) {
if (this == o) { if (this == o) {

View File

@@ -1,3 +1,3 @@
version = 6.49.2 version = 6.50.0
plugin-name = eco plugin-name = eco
kotlin.code.style = official kotlin.code.style = official