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]]"); 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); 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 GetInlineInit(Expression item, AbstractEmitterBlock block, string thisScope) { Expression expr = null; if (item is NamedExpression namedExpression) { expr = namedExpression.Expression; } else if (item is NamedArgumentExpression namedArgumentExpression) { expr = namedArgumentExpression.Expression; } var rr = block.Emitter.Resolver.ResolveNode(item); 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; inlineCode = Helpers.ConvertTokens(block.Emitter, inlineCode, member); bool hasThis = inlineCode.Contains("{this}"); if (inlineCode.StartsWith("<self>")) { hasThis = true; inlineCode = inlineCode.Substring(6); } if (hasThis) { inlineCode = inlineCode.Replace("{this}", thisScope); if (member is IProperty) { var argsInfo = new ArgumentsInfo(block.Emitter, item, rr); argsInfo.ArgumentsExpressions = new Expression[] { expr }; argsInfo.ArgumentsNames = new string[] { "value" }; argsInfo.ThisArgument = thisScope; 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(thisScope + "." + inlineCode); expr.AcceptVisitor(block.Emitter); if (block.Emitter.Writers.Count > count) { inlineCode = block.PopWriter(true); } } else { block.Write(thisScope + "." + inlineCode); } } block.Emitter.IsAssignment = oldIsAssignment; block.Emitter.IsUnaryAccessor = oldUnary; block.RestoreWriter(oldWriter); } } if (inlineCode != null && inlineCode.Trim().EndsWith(";")) { inlineCode = inlineCode.Trim().TrimEnd(';'); } return(inlineCode); }