public static string ReplaceInlineArgs(AbstractEmitterBlock block, string inline, Expression[] args) { var emitter = block.Emitter; inline = _formatArg.Replace(inline, delegate(Match m) { int count = emitter.Writers.Count; string key = m.Groups[2].Value; string modifier = m.Groups[1].Success ? m.Groups[4].Value : null; StringBuilder oldSb = emitter.Output; emitter.Output = new StringBuilder(); Expression expr = null; if (Regex.IsMatch(key, "^\\d+$")) { expr = args.Skip(int.Parse(key)).FirstOrDefault(); } else { expr = args.FirstOrDefault(e => e.ToString() == key); } string s = ""; if (expr != null) { var writer = block.SaveWriter(); block.NewWriter(); expr.AcceptVisitor(emitter); s = emitter.Output.ToString(); block.RestoreWriter(writer); if (modifier == "raw") { s = s.Trim('"'); } } block.Write(block.WriteIndentToString(s)); if (emitter.Writers.Count != count) { block.PopWriter(); } string replacement = emitter.Output.ToString(); emitter.Output = oldSb; return(replacement); }); return(inline); }
public static string GetInlineInit(Expression item, AbstractEmitterBlock block) { Expression expr = null; if (item is NamedExpression) { var namedExpression = (NamedExpression)item; expr = namedExpression.Expression; } else if (item is NamedArgumentExpression) { var namedArgumentExpression = (NamedArgumentExpression)item; expr = namedArgumentExpression.Expression; } var rr = block.Emitter.Resolver.ResolveNode(item, block.Emitter); string inlineCode = null; if (expr != null && rr is MemberResolveResult) { var member = ((MemberResolveResult)rr).Member; if (member is IProperty) { var setter = ((IProperty)member).Setter; if (setter != null) { inlineCode = block.Emitter.GetInline(setter); } } else { inlineCode = block.Emitter.GetInline(member); } if (inlineCode != null) { bool oldIsAssignment = block.Emitter.IsAssignment; bool oldUnary = block.Emitter.IsUnaryAccessor; var oldWriter = block.SaveWriter(); block.NewWriter(); block.Emitter.IsAssignment = true; block.Emitter.IsUnaryAccessor = false; bool hasThis = inlineCode.Contains("{this}"); if (inlineCode.StartsWith("<self>")) { hasThis = true; inlineCode = inlineCode.Substring(6); } if (hasThis) { inlineCode = inlineCode.Replace("{this}", "this"); if (member is IProperty) { var argsInfo = new ArgumentsInfo(block.Emitter, item, rr); argsInfo.ArgumentsExpressions = new Expression[] { expr }; argsInfo.ArgumentsNames = new string[] { "value" }; argsInfo.ThisArgument = "this"; argsInfo.NamedExpressions = argsInfo.CreateNamedExpressions(argsInfo.ArgumentsNames, argsInfo.ArgumentsExpressions); inlineCode = inlineCode.Replace("{0}", "[[0]]"); new InlineArgumentsBlock(block.Emitter, argsInfo, inlineCode).Emit(); inlineCode = block.Emitter.Output.ToString(); inlineCode = inlineCode.Replace("[[0]]", "{0}"); } } else { if (member.SymbolKind == SymbolKind.Property) { var count = block.Emitter.Writers.Count; block.PushWriter("this." + inlineCode); expr.AcceptVisitor(block.Emitter); if (block.Emitter.Writers.Count > count) { inlineCode = block.PopWriter(true); } } else { block.Write("this." + inlineCode); } } block.Emitter.IsAssignment = oldIsAssignment; block.Emitter.IsUnaryAccessor = oldUnary; block.RestoreWriter(oldWriter); } } if (inlineCode != null && !inlineCode.Trim().EndsWith(";")) { inlineCode += ";"; } return(inlineCode); }
public static string GetInlineInit(KeyValuePair <IMember, ResolveResult> item, AbstractEmitterBlock block) { string inlineCode = null; var member = item.Key; if (member is IProperty) { var setter = ((IProperty)member).Setter; if (setter != null) { inlineCode = block.Emitter.GetInline(setter); } } else { inlineCode = block.Emitter.GetInline(member); } if (inlineCode != null) { bool oldIsAssignment = block.Emitter.IsAssignment; bool oldUnary = block.Emitter.IsUnaryAccessor; var oldWriter = block.SaveWriter(); block.NewWriter(); block.Emitter.IsAssignment = true; block.Emitter.IsUnaryAccessor = false; bool hasThis = Helpers.HasThis(inlineCode); inlineCode = Helpers.ConvertTokens(block.Emitter, inlineCode, member); if (inlineCode.StartsWith("<self>")) { hasThis = true; inlineCode = inlineCode.Substring(6); } if (hasThis) { inlineCode = inlineCode.Replace("{this}", "this"); if (member is IProperty) { inlineCode = inlineCode.Replace("{0}", "[[0]]"); AttributeCreateBlock.WriteResolveResult(item.Value, block); var value = block.Emitter.Output.ToString(); inlineCode = inlineCode.Replace("{value}", value); inlineCode = inlineCode.Replace("[[0]]", "{0}"); } } else { if (member.SymbolKind == SymbolKind.Property) { var count = block.Emitter.Writers.Count; block.PushWriter("this." + inlineCode); AttributeCreateBlock.WriteResolveResult(item.Value, block); if (block.Emitter.Writers.Count > count) { inlineCode = block.PopWriter(true); } } else { block.Write("this." + inlineCode); } } block.Emitter.IsAssignment = oldIsAssignment; block.Emitter.IsUnaryAccessor = oldUnary; block.RestoreWriter(oldWriter); } if (inlineCode != null && !inlineCode.Trim().EndsWith(";")) { inlineCode += ";"; } return(inlineCode); }
public static string ReplaceInlineArgs(AbstractEmitterBlock block, string inline, Expression[] args) { var emitter = block.Emitter; inline = _formatArg.Replace(inline, delegate(Match m) { int count = emitter.Writers.Count; string key = m.Groups[2].Value; string modifier = m.Groups[1].Success ? m.Groups[4].Value : null; StringBuilder oldSb = emitter.Output; emitter.Output = new StringBuilder(); Expression expr = null; if (Regex.IsMatch(key, "^\\d+$")) { expr = args.Skip(int.Parse(key)).FirstOrDefault(); } else { expr = args.FirstOrDefault(e => e.ToString() == key); } string s = ""; if (expr != null) { var writer = block.SaveWriter(); block.NewWriter(); expr.AcceptVisitor(emitter); s = emitter.Output.ToString(); block.RestoreWriter(writer); if (modifier == "raw") { s = s.Trim('"'); } } block.Write(block.WriteIndentToString(s)); if (emitter.Writers.Count != count) { block.PopWriter(); } string replacement = emitter.Output.ToString(); emitter.Output = oldSb; return replacement; }); return inline; }