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); } }
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); } }