87 lines
2.6 KiB
C#
87 lines
2.6 KiB
C#
using System;
|
|
using System.Reflection;
|
|
|
|
namespace Ingvar.LiveWatch
|
|
{
|
|
public class WatchVariableCreator
|
|
{
|
|
public WatchVariable CreateEmpty(string name)
|
|
{
|
|
var variable = new WatchVariable()
|
|
{
|
|
Name = name
|
|
};
|
|
|
|
return variable;
|
|
}
|
|
|
|
public WatchVariable GetOrAdd(WatchStorage storage, string path, bool directChild = true)
|
|
{
|
|
var currentStorage = storage;
|
|
WatchVariable currentVariable = default;
|
|
WatchVariable currentParent = null;
|
|
|
|
if (directChild)
|
|
{
|
|
GetOrCreateVariable(path);
|
|
return currentVariable;
|
|
}
|
|
|
|
var variableNames = path.Split(Watch.PathSeparator);
|
|
|
|
foreach (var variableName in variableNames)
|
|
{
|
|
GetOrCreateVariable(variableName);
|
|
|
|
currentStorage = currentVariable.Childs;
|
|
currentParent = currentVariable;
|
|
}
|
|
|
|
void GetOrCreateVariable(string variableName)
|
|
{
|
|
var pathExists = currentStorage.TryGet(variableName, out currentVariable);
|
|
|
|
if (!pathExists)
|
|
{
|
|
currentVariable = CreateEmpty(variableName);
|
|
currentVariable.Parent = currentParent;
|
|
var catchUpCount = WatchServices.VariableUpdater.ValuesCount + (!WatchServices.VariableUpdater.AnyPushSinceUpdate ? 0 : -1);
|
|
|
|
WatchServices.VariableUpdater.CatchUpWithValuesCount(currentVariable, catchUpCount);
|
|
currentStorage.Add(currentVariable);
|
|
}
|
|
}
|
|
|
|
return currentVariable;
|
|
}
|
|
|
|
public void PushEmpty(WatchVariable variable, bool withRoot = true, int maxRecursionDepth = 10)
|
|
{
|
|
if (maxRecursionDepth <= 0)
|
|
return;
|
|
|
|
if (withRoot)
|
|
{
|
|
variable.Values.PushEmpty();
|
|
WatchServices.VariableUpdater.UpdateTotalValuesCount(variable);
|
|
}
|
|
|
|
foreach (var childWatchPair in variable.Childs.Items)
|
|
PushEmpty(childWatchPair.Value, true, maxRecursionDepth - 1);
|
|
}
|
|
|
|
public bool IsAlwaysShrinkable(WatchVariable variable)
|
|
{
|
|
if (variable.RuntimeMeta.AlwaysShrinkable)
|
|
return true;
|
|
|
|
if (variable.Parent != null && variable.Parent.RuntimeMeta.AlwaysShrinkable)
|
|
{
|
|
variable.RuntimeMeta.AlwaysShrinkable = true;
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|
|
} |