Skip to content

Commit 840a633

Browse files
committed
fix: Limit incomplete EntityID filters to auto-complete, to avoid breaking collection accessing
1 parent eb3df87 commit 840a633

File tree

2 files changed

+11
-10
lines changed

2 files changed

+11
-10
lines changed

CelesteTAS-EverestInterop/Source/InfoHUD/TargetQuery.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public virtual (bool CanEnumerate, bool ShouldOverride) CanEnumerateMemberEntrie
3939
public virtual object[] ResolveInstances(Type type) => [];
4040

4141
/// Can process the query arguments into special members, to allow for custom syntax
42-
public virtual IEnumerable<string> ProcessQueryArguments(IEnumerable<string> queryArgs) => queryArgs;
42+
public virtual IEnumerable<string> ProcessQueryArguments(IEnumerable<string> queryArgs, bool isAutoComplete) => queryArgs;
4343
/// Should format the query arguments back into their original custom syntax form
4444
public virtual IEnumerable<string> FormatQueryArguments(IEnumerable<string> queryArgs) => queryArgs;
4545

@@ -514,7 +514,7 @@ internal static IEnumerable<MethodInfo> EnumerateViableMethods(Type type, Varian
514514

515515
internal static IEnumerator<CommandAutoCompleteEntry> ResolveAutoCompleteEntries(string[] queryArgs, Variant variant, Type[]? targetTypeFilter = null) {
516516
// Process query arguments
517-
queryArgs = Handlers.Aggregate((IEnumerable<string>) queryArgs, (current, handler) => handler.ProcessQueryArguments(current)).ToArray();
517+
queryArgs = Handlers.Aggregate((IEnumerable<string>) queryArgs, (current, handler) => handler.ProcessQueryArguments(current, isAutoComplete: true)).ToArray();
518518
// Drop last argument for prefix
519519
string queryPrefix = queryArgs.Length <= 1 ? string.Empty : string.Join('.', Handlers.Aggregate((IEnumerable<string>) queryArgs[..^1], (current, handler) => handler.FormatQueryArguments(current)));
520520
string memberQueryPrefix = queryArgs.Length <= 1 ? queryPrefix : $"{queryPrefix}.";
@@ -844,7 +844,7 @@ internal static IEnumerable<string> GetQueryArgs(string[] args, int index) {
844844
}
845845

846846
return Handlers
847-
.Aggregate((IEnumerable<string>) args[index].Split('.'), (current, handler) => handler.ProcessQueryArguments(current))
847+
.Aggregate((IEnumerable<string>) args[index].Split('.'), (current, handler) => handler.ProcessQueryArguments(current, isAutoComplete: true))
848848
// Only skip last part if we're currently editing that
849849
.SkipLast(args.Length == index + 1 ? 1 : 0);
850850
}
@@ -859,7 +859,7 @@ public static HashSet<Type> ResolveBaseTypes(string[] queryArgs, out string[] me
859859
}
860860

861861
if (processArgs) {
862-
queryArgs = Handlers.Aggregate((IEnumerable<string>) queryArgs, (current, handler) => handler.ProcessQueryArguments(current)).ToArray();
862+
queryArgs = Handlers.Aggregate((IEnumerable<string>) queryArgs, (current, handler) => handler.ProcessQueryArguments(current, isAutoComplete: false)).ToArray();
863863
}
864864

865865
if (queryArgs.Any(arg => arg == InvalidQueryArgument)) {

CelesteTAS-EverestInterop/Source/InfoHUD/TargetQueryHandlers.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,7 @@ public override (bool CanEnumerate, bool ShouldOverride) CanEnumerateMemberEntri
484484
return (CanEnumerate: false, ShouldOverride: false);
485485
}
486486

487-
public override IEnumerable<string> ProcessQueryArguments(IEnumerable<string> queryArgs) {
487+
public override IEnumerable<string> ProcessQueryArguments(IEnumerable<string> queryArgs, bool isAutoComplete) {
488488
using var enumerator = queryArgs.GetEnumerator();
489489
while (enumerator.MoveNext()) {
490490
string arg = enumerator.Current;
@@ -505,7 +505,7 @@ public override IEnumerable<string> ProcessQueryArguments(IEnumerable<string> qu
505505
yield return TargetQuery.InvalidQueryArgument;
506506
yield break;
507507
}
508-
} else if (IncompleteEntityIDRegex.Match(arg) is { Success: true} entityIncompleteMatch) {
508+
} else if (isAutoComplete && IncompleteEntityIDRegex.Match(arg) is { Success: true } entityIncompleteMatch) {
509509
yield return entityIncompleteMatch.Groups[1].Value;
510510
yield return IncompleteEntityIDKey;
511511
yield return entityIncompleteMatch.Groups[2].Value;
@@ -514,7 +514,7 @@ public override IEnumerable<string> ProcessQueryArguments(IEnumerable<string> qu
514514
// Only exists for auto-complete, so disallow arguments following this
515515
yield return TargetQuery.InvalidQueryArgument;
516516
}
517-
} else if (ComponentRegex.Match(arg) is { Success: true} componentMatch) {
517+
} else if (ComponentRegex.Match(arg) is { Success: true } componentMatch) {
518518
yield return componentMatch.Groups[1].Value;
519519
yield return ComponentKey;
520520
yield return componentMatch.Groups[2].Value;
@@ -1087,7 +1087,7 @@ internal class CollectionQueryHandler : TargetQuery.Handler {
10871087
private const string SpreadKey = "___SpreadCollection___";
10881088
private const string IndexKey = "___Index___";
10891089

1090-
public override IEnumerable<string> ProcessQueryArguments(IEnumerable<string> queryArgs) {
1090+
public override IEnumerable<string> ProcessQueryArguments(IEnumerable<string> queryArgs, bool isAutoComplete) {
10911091
foreach (string arg in queryArgs) {
10921092
if (arg.EndsWith('*')) {
10931093
string newArg = arg[..^1];
@@ -1162,6 +1162,7 @@ public override IEnumerable<string> ProcessQueryArguments(IEnumerable<string> qu
11621162
keyType = type.GenericTypeArguments[0];
11631163
}
11641164

1165+
// TODO: This supports resolving target-queries, but the query-arg parsing logic does not..
11651166
var keyResult = TargetQuery.ResolveValue([memberArgs[memberIdx][IndexKey.Length..]], [keyType]);
11661167
if (keyResult.CheckFailure(out var error)) {
11671168
value = null;
@@ -1432,7 +1433,7 @@ private class ButtonBindingData {
14321433
} else {
14331434
return Result<bool, TargetQuery.MemberAccessError>.Ok(false);
14341435
}
1435-
1436+
14361437
var nodes = button.Nodes;
14371438
var mouseButtons = button.Binding.Mouse;
14381439
var data = (ButtonBindingData) value!;
@@ -1545,7 +1546,7 @@ public override IEnumerator<CommandAutoCompleteEntry> EnumerateTypeEntries(Type
15451546
// Only ASCII alphabet is allowed
15461547
continue;
15471548
}
1548-
1549+
15491550
yield return new CommandAutoCompleteEntry {
15501551
Name = key.ToString(),
15511552
Extra = "Key",

0 commit comments

Comments
 (0)