public static void Generate(CodeMemberMethod method, HashSet <string> globals) { var gen = new LocalVariableGenerator(method.Parameters, method.Statements, globals); gen.Analyze(new List <CodeStatement>(), method.Statements); gen.Generate(); }
public void VisitDecorated(Decorated d) { var decorators = d.Decorations.ToList(); if (this.properties.TryGetValue(d, out var propdef)) { if (propdef.IsTranslated) { return; } decorators.Remove(propdef.GetterDecoration); decorators.Remove(propdef.SetterDecoration); this.customAttrs = decorators.Select(dd => VisitDecorator(dd)); var prop = gen.PropertyDef( propdef.Name, () => GeneratePropertyGetter(propdef.Getter), () => GeneratePropertySetter(propdef.Setter)); LocalVariableGenerator.Generate(null, prop.GetStatements, globals); LocalVariableGenerator.Generate( new List <CodeParameterDeclarationExpression> { new CodeParameterDeclarationExpression(prop.PropertyType, "value"), }, prop.SetStatements, globals); propdef.IsTranslated = true; } else { this.customAttrs = d.Decorations.Select(dd => VisitDecorator(dd)); d.Statement.Accept(this); } }
public static void Generate(CodeMemberMethod method) { var gen = new LocalVariableGenerator(method); gen.Analyze(new List <CodeStatement>(), method.Statements); gen.Generate(); }
public static void Generate(List <CodeParameterDeclarationExpression> parameters, List <CodeStatement> statements, HashSet <string> globals) { parameters = parameters ?? new List <CodeParameterDeclarationExpression>(); var gen = new LocalVariableGenerator(parameters, statements, globals); gen.Analyze(new List <CodeStatement>(), statements); gen.Generate(); }
protected override CodeMemberMethod Generate(CodeTypeReference retType, CodeParameterDeclarationExpression[] parms) { var method = gen.LambdaMethod(parms, () => Xlat(f.body)); GenerateTupleParameterUnpackers(method); LocalVariableGenerator.Generate(method, globals); return(method); }
protected override CodeMemberMethod Generate(CodeTypeReference ignore, CodeParameterDeclarationExpression[] parms) { var cons = gen.Constructor(parms, () => XlatConstructor(f.body)); GenerateTupleParameterUnpackers(cons); LocalVariableGenerator.Generate(cons, globals); return(cons); }
protected virtual CodeMemberMethod Generate(CodeParameterDeclarationExpression[] parms) { CodeMemberMethod method; if (isStatic) { method = gen.StaticMethod(fnName, parms, () => Xlat(f.body)); } else { method = gen.Method(fnName, parms, () => Xlat(f.body)); } GenerateTupleParameterUnpackers(method); LocalVariableGenerator.Generate(method); return(method); }
protected virtual CodeMemberMethod Generate(CodeTypeReference retType, CodeParameterDeclarationExpression[] parms) { CodeMemberMethod method; if (isStatic) { method = gen.StaticMethod(fnName, retType, parms, () => Xlat(f.body)); } else { method = gen.Method(fnName, retType, parms, () => Xlat(f.body)); } method.IsAsync = isAsync; GenerateTupleParameterUnpackers(method); LocalVariableGenerator.Generate(method, globals); return(method); }
/// <summary> /// Processes the decorators of <paramref name="stmt"/>. /// </summary> /// <param name="stmt"></param> /// <returns>If true, the body of the statement has been /// translated, so don't do it again.</returns> public bool VisitDecorators(Statement stmt) { if (stmt.decorators == null) { return(false); } var decorators = stmt.decorators; if (this.properties.TryGetValue(stmt, out var propdef)) { if (propdef.IsTranslated) { return(true); } decorators.Remove(propdef.GetterDecoration); decorators.Remove(propdef.SetterDecoration); this.customAttrs = decorators.Select(dd => VisitDecorator(dd)); var prop = gen.PropertyDef( propdef.Name, () => GeneratePropertyGetter(propdef.Getter), () => GeneratePropertySetter(propdef.Setter)); LocalVariableGenerator.Generate(null, prop.GetStatements, globals); LocalVariableGenerator.Generate( new List <CodeParameterDeclarationExpression> { new CodeParameterDeclarationExpression(prop.PropertyType, "value"), }, prop.SetStatements, globals); propdef.IsTranslated = true; return(true); } else { this.customAttrs = stmt.decorators.Select(dd => VisitDecorator(dd)); return(false); } }