public static void BuildDispatcher(ICompiler compiler, IList<MethodDeclaration> methodDeclarations, string dispatcherMethodName, string returnType, string targetMethodName) { var constructorNumber = 0; var argumentPrefix = "c_par"; // TODO: Hardcoded as public, however, not sure right now what to do if signatures differ. var accessModifier = "public "; var isStatic = methodDeclarations.Any(x => x.Modifiers != null && x.Modifiers.Any(y => y.Data == Keywords.Static)) ? "static " : string.Empty; compiler.AddLine(string.Format("{0}{1}{2}({3}): {4} {{", accessModifier, isStatic, dispatcherMethodName, OverloadHelper.GetDispatcherParameters(methodDeclarations, argumentPrefix), returnType)); compiler.IncreaseIndentation(); { foreach (var constructor in methodDeclarations) { compiler.AddLine("if ("); compiler.IncreaseIndentation(); { var parametersAreDefined = GetParametersAreDefined(methodDeclarations, constructor, argumentPrefix); var parametersAreOfRightType = GetParametersAreOfRightType(constructor, argumentPrefix); if (string.IsNullOrEmpty(parametersAreOfRightType)) { compiler.AddLine(parametersAreDefined); } else { compiler.AddLine(string.Format("{0} &&", parametersAreDefined)); compiler.AddLine(parametersAreOfRightType); } } compiler.DecreaseIndentation(); compiler.AddLine(") {"); compiler.IncreaseIndentation(); { var parNumber = 0; var arguments = constructor.Arguments.Count != 0 ? constructor.Arguments .Select(x => string.Format("<{0}{1}>{2}{3}", compiler.GetTypeString(x.Type, "GetConstructorCallCastType"), GetArrayDepth(x.ArrayDepth), argumentPrefix, parNumber++)) .Aggregate((x, y) => x + ", " + y) : string.Empty; compiler.AddLine(string.Format("this.{0}{1}({2});", targetMethodName, constructorNumber++, arguments)); compiler.AddLine("return;"); } compiler.DecreaseIndentation(); compiler.AddLine("}"); compiler.AddBlankLine(); } } if (methodDeclarations.Count > 0) { compiler.AddLine(@"throw new Error(""Unrecognized paramaters called."")"); } compiler.DecreaseIndentation(); compiler.AddLine("}"); compiler.AddBlankLine(); }