private bool DoesTreeCall(IApplyBlock function, IApplyBlock currentCheck, List <IApplyBlock> check = null)
        {
            if (check == null)
            {
                check = new List <IApplyBlock>();
            }
            if (currentCheck.CallInfo == null)
            {
                return(false);
            }

            if (function is DefinedMethod dm && currentCheck is IMethod asMethod && (dm == asMethod || asMethod.Attributes.AllOverrideOptions().Contains(dm)))
            {
                return(!asMethod.Attributes.Recursive);
            }

            if (check.Contains(currentCheck))
            {
                return(false);
            }
            check.Add(currentCheck);

            foreach (var call in currentCheck.CallInfo.Calls)
            {
                if (DoesTreeCall(function, call.Key, check))
                {
                    return(true);
                }
            }
            return(false);
        }
        private bool DoesTreeCall(IApplyBlock function, IApplyBlock currentCheck, List <IApplyBlock> check = null)
        {
            if (check == null)
            {
                check = new List <IApplyBlock>();
            }

            if (function == currentCheck)
            {
                if (function is DefinedMethod && ((DefinedMethod)function).IsRecursive)
                {
                    return(false);
                }
                else
                {
                    return(true);
                }
            }

            if (check.Contains(currentCheck))
            {
                return(false);
            }
            check.Add(currentCheck);

            foreach (var call in currentCheck.CallInfo.Calls)
            {
                if (DoesTreeCall(function, call.Key, check))
                {
                    return(true);
                }
            }
            return(false);
        }
 public void Call(IApplyBlock callBlock, DocRange range)
 {
     if (!Calls.ContainsKey(callBlock))
     {
         Calls.Add(callBlock, new List <DocRange>());
     }
     Calls[callBlock].Add(range);
 }
Ejemplo n.º 4
0
 public void ApplyBlock(IApplyBlock apply)
 {
     _applyBlocks.Add(apply);
     if (apply.CallInfo != null)
     {
         _recursionCheck.Add(apply.CallInfo);
     }
 }
 public MethodStack(IApplyBlock function)
 {
     Function = function;
 }
 public RecursiveCallHandler(IApplyBlock applyBlock, bool recursionAllowed, string typeName = "function")
 {
     _applyBlock       = applyBlock;
     _recursionAllowed = recursionAllowed;
     _typeName         = typeName;
 }
 public void ApplyBlock(IApplyBlock apply)
 {
     applyBlocks.Add(apply);
 }
 public CallInfo(IApplyBlock function, ScriptFile script)
 {
     Function = function;
     Script   = script;
 }
Ejemplo n.º 9
0
 public bool WasCalled(IApplyBlock callable) => MethodStack.Any(ms => ms.Function == this);
 public RecursiveCallHandler(IApplyBlock applyBlock, string typeName = "function")
 {
     _applyBlock = applyBlock;
     _typeName   = typeName;
 }