public void RemoveMethod(IMethodHolder <TNode> owner, string methodName)
        {
            var methodId = Methods.Find(methodName);

            Trace.Assert(methodId.HasValue);

            RemoveMethod(owner, new ResolvedMethodId(methodId.Value));
        }
Exemple #2
0
        public void UpdateMethod(IMethodHolder <Node> owner, Common.Types.Method source)
        {
            var method = myProgram.GetOrCreateMethod(owner, source.Id.Value);

            myProgram.ClearMethod(method);

            // Variables.
            var localVariables = source.Variables.Cast <LocalVariableReference>()
                                 .Select(reference =>
            {
                var defaultType = reference.DefaultType == null ? -1 :
                                  myProgram.GetOrCreateClass(reference.DefaultType).Id.GlobalId;
                return(new ResolvedLocalVariable(reference.Index, defaultType));
            });

            if (owner is ResolvedMethod <Node> owningMethod)
            {
                var possibleVariables = owningMethod.Variables.ToDictionary(pair => pair.Key, pair => pair.Value);
                foreach (var local in localVariables)
                {
                    if (!possibleVariables.ContainsKey(local.LocalId))
                    {
                        possibleVariables.Add(local.LocalId, local);
                    }
                }
                localVariables = possibleVariables.Values;
            }

            foreach (var localVariable in localVariables)
            {
                method.AddLocalVariable(localVariable);
            }

            foreach (var attribute in source.Attributes)
            {
                var attributeId = myProgram.GetOrCreateAttribute(attribute);
                method.AddAttribute(attributeId);
            }

            // LocalFunctions.
            if (source.LocalMethods != null)
            {
                foreach (var localMethod in source.LocalMethods)
                {
                    UpdateMethod(method, localMethod);
                }
            }

            // Body.
            var bodyAdapter = new CommonMethodAsNodeBasedProgram(source);

            UpdateMethodBody(owner, source.Id, bodyAdapter);
        }
Exemple #3
0
        public void UpdateMethodBody(IMethodHolder <Node> owner, MethodId id, INodeBasedProgram <int> body)
        {
            var method = myProgram.GetOrCreateMethod(owner, id.Value);
            var mapper = GetLocalMapper(method);

            var identity            = new IdentityTransducer <Node>();
            var invocationsResolver = new InvocationsResolvingTransducer <Node>();
            var assignmentsResolver = new AssignmentsResolvingTransducer <Node>();

            var transducer = assignmentsResolver.Compose(invocationsResolver).Compose(identity);

            transducer.Transform(body, myProgram, method, mapper);

            //myProgram.DumpToDot("C:/work/graph.dot");
        }
        public void RemoveMethod(IMethodHolder <TNode> owner, ResolvedMethodId methodId)
        {
            var method = owner.FindLocalMethod(methodId);

            var toRemove = method.Methods.Keys.ToList();

            foreach (var localFunction in toRemove)
            {
                RemoveMethod(method, localFunction);
            }

            var toDelete = method.GetOwnedNodes();

            foreach (var node in toDelete)
            {
                RemoveVertex(node);
                myOnNodeRemovedHandler(node);
            }

            var exists = owner.RemoveMethod(methodId);

            Trace.Assert(exists);
        }
        public ResolvedMethod <TNode> GetOrCreateMethod(IMethodHolder <TNode> owner, string name)
        {
            var rawMethodId = Methods.FindOrAdd(name);
            var methodId    = new ResolvedMethodId(rawMethodId);

            var method = owner.FindLocalMethod(methodId);

            if (method == null)
            {
                var start = myNodesProvider();
                var end   = myNodesProvider();

                AddVertex(start);
                AddVertex(end);

                method = new ResolvedMethod <TNode>(methodId, start, end);

                owner.AddMethod(methodId, method);
                return(method);
            }

            return(method);
        }