Skip to content

Commit d790fd9

Browse files
author
Aswin Gopal
committed
Rewrite processors only if it needs migration.
1 parent 41146c4 commit d790fd9

File tree

1 file changed

+43
-16
lines changed

1 file changed

+43
-16
lines changed

Packages/com.unity.inputsystem/InputSystem/Actions/InputActionAsset.cs

Lines changed: 43 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1014,56 +1014,83 @@ internal void MigrateJson(ref ReadFileJson parsedJson)
10141014
{
10151015
if (parsedJson.version >= JsonVersion.Version1)
10161016
return;
1017-
if ((parsedJson.maps?.Length ?? 0) > 0 && (parsedJson.version) < JsonVersion.Version1)
1017+
1018+
if ((parsedJson.maps?.Length ?? 0) > 0 && parsedJson.version < JsonVersion.Version1)
10181019
{
10191020
for (var mi = 0; mi < parsedJson.maps.Length; ++mi)
10201021
{
10211022
var mapJson = parsedJson.maps[mi];
1023+
if (mapJson.actions == null || mapJson.actions.Length == 0)
1024+
continue;
10221025
for (var ai = 0; ai < mapJson.actions.Length; ++ai)
10231026
{
10241027
var actionJson = mapJson.actions[ai];
10251028
var raw = actionJson.processors;
10261029
if (string.IsNullOrEmpty(raw))
10271030
continue;
10281031

1029-
var list = NameAndParameters.ParseMultiple(raw).ToList();
1030-
var rebuilt = new List<string>(list.Count);
1031-
foreach (var nap in list)
1032+
var originalTokens = raw.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries).Select(t => t.Trim()).ToList();
1033+
1034+
List<NameAndParameters> parsed = null;
1035+
NameAndParameters.ParseMultiple(raw, ref parsed);
1036+
if (parsed == null || parsed.Count == 0)
1037+
continue;
1038+
1039+
var canPreservePerToken = parsed.Count == originalTokens.Count;
1040+
var rebuiltTokens = canPreservePerToken ? new List<string>(originalTokens) : new List<string>(parsed.Count);
1041+
var anyProcessorChanged = false;
1042+
1043+
for (int pi = 0; pi < parsed.Count; pi++)
10321044
{
1045+
var nap = parsed[pi];
10331046
var procType = InputSystem.TryGetProcessor(nap.name);
1034-
if (nap.parameters.Count == 0 || procType == null)
1047+
if (procType == null || nap.parameters.Count == 0)
10351048
{
1036-
rebuilt.Add(nap.ToString());
1049+
if (!canPreservePerToken)
1050+
rebuiltTokens.Add(nap.ToString());
10371051
continue;
10381052
}
10391053

10401054
var dict = nap.parameters.ToDictionary(p => p.name, p => p.value.ToString());
1041-
var anyChanged = false;
1055+
var changedThisProcessor = false;
1056+
1057+
// For each enum parameter, if value is an ordinal index, replace with the underlying numeric enum value.
10421058
foreach (var field in procType.GetFields(BindingFlags.Public | BindingFlags.Instance).Where(f => f.FieldType.IsEnum))
10431059
{
1044-
if (dict.TryGetValue(field.Name, out var ordS) && int.TryParse(ordS, out var ord))
1060+
if (dict.TryGetValue(field.Name, out var ordStr) && int.TryParse(ordStr, out var ordinal))
10451061
{
10461062
var values = Enum.GetValues(field.FieldType).Cast<object>().ToArray();
1047-
if (ord >= 0 && ord < values.Length)
1063+
if (ordinal >= 0 && ordinal < values.Length)
10481064
{
1049-
dict[field.Name] = Convert.ToInt32(values[ord]).ToString();
1050-
anyChanged = true;
1065+
dict[field.Name] = Convert.ToInt32(values[ordinal]).ToString();
1066+
changedThisProcessor = true;
10511067
}
10521068
}
10531069
}
10541070

1055-
if (!anyChanged)
1071+
if (!changedThisProcessor)
10561072
{
1057-
rebuilt.Add(nap.ToString());
1058-
}
1073+
if (!canPreservePerToken)
1074+
rebuiltTokens.Add(nap.ToString());
1075+
}
10591076
else
10601077
{
1078+
// Rebuild only this processor’s text.
10611079
var paramText = string.Join(",", dict.Select(kv => $"{kv.Key}={kv.Value}"));
1062-
rebuilt.Add($"{nap.name}({paramText})");
1080+
var migrated = $"{nap.name}({paramText})";
1081+
1082+
if (canPreservePerToken)
1083+
rebuiltTokens[pi] = migrated;
1084+
else
1085+
rebuiltTokens.Add(migrated);
1086+
1087+
anyProcessorChanged = true;
10631088
}
10641089
}
10651090

1066-
actionJson.processors = string.Join(";", rebuilt);
1091+
// Only touch the processors string if something actually changed.
1092+
if (anyProcessorChanged)
1093+
actionJson.processors = string.Join(";", rebuiltTokens);
10671094
mapJson.actions[ai] = actionJson;
10681095
}
10691096
parsedJson.maps[mi] = mapJson;

0 commit comments

Comments
 (0)