예제 #1
0
        public static void RecursiveBuildStack(
            CodegenMethod methodNode,
            string name,
            CodegenClassMethods methods,
            CodegenClassProperties properties)
        {
            if (methodNode.OptionalSymbolProvider == null) {
                throw new ArgumentException("Method node does not have symbol provider");
            }

            IDictionary<string, Type> currentSymbols = new Dictionary<string, Type>();
            methodNode.OptionalSymbolProvider.Provide(currentSymbols);

            if (!(methodNode is CodegenCtor)) {
                var footprint = new CodegenMethodFootprint(
                    methodNode.ReturnType,
                    methodNode.ReturnTypeName,
                    methodNode.LocalParams,
                    methodNode.AdditionalDebugInfo);
                var method = new CodegenMethodWGraph(
                    name,
                    footprint,
                    methodNode.Block,
                    true,
                    methodNode.IsOverride,
                    methodNode.IsStatic);

                methodNode.AssignedMethod = method;
                methods.PublicMethods.Add(method);
            }

            foreach (var child in methodNode.Children) {
                RecursiveAdd(
                    child,
                    currentSymbols,
                    methods,
                    properties,
                    methodNode.IsStatic);
            }
        }
예제 #2
0
        private static void RecursiveAdd(
            CodegenMethod methodNode,
            IDictionary<string, Type> currentSymbols,
            CodegenClassMethods classMethods,
            CodegenClassProperties classProperties,
            bool isStatic)
        {
            ISet<string> namesPassed = GetNamesPassed(methodNode);
            methodNode.DeepParameters = namesPassed;

            IList<CodegenNamedParam> paramset = new List<CodegenNamedParam>(
                namesPassed.Count + methodNode.LocalParams.Count);

            // add local params
            foreach (var named in methodNode.LocalParams) {
                paramset.Add(named);
            }

            // add pass-thru for those methods that do not have their own scope
            if (methodNode.OptionalSymbolProvider == null) {
                foreach (var nameX in namesPassed) {
                    var symbolType = currentSymbols.Get(nameX);
                    if (symbolType == null) {
                        throw new IllegalStateException(
                            "Failed to find named parameter '" +
                            nameX +
                            "' for method from " +
                            methodNode.AdditionalDebugInfo);
                    }

                    paramset.Add(new CodegenNamedParam(symbolType, nameX));
                }
            }
            else {
                currentSymbols = new Dictionary<string, Type>();
                methodNode.OptionalSymbolProvider.Provide(currentSymbols);
            }

            var name = "M" + classMethods.PrivateMethods.Count;
            var footprint = new CodegenMethodFootprint(
                methodNode.ReturnType,
                methodNode.ReturnTypeName,
                paramset,
                methodNode.AdditionalDebugInfo);
            var method = new CodegenMethodWGraph(
                name,
                footprint,
                methodNode.Block,
                false,
                methodNode.IsOverride,
                isStatic);

            methodNode.AssignedMethod = method;
            classMethods.PrivateMethods.Add(method);

            foreach (var child in methodNode.Children) {
                RecursiveAdd(
                    child,
                    currentSymbols,
                    classMethods,
                    classProperties,
                    isStatic);
            }
        }