Пример #1
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);
        }
 public CommonMethodAsNodeBasedProgram(Common.Types.Method source)
 {
     mySource = source;
 }