private INotation CreateProxyMethod(IMethodSymbolInfo method, ProxyGeneratorContext typeContext) { var context = new ProxyGeneratorContext() { Parent = typeContext, Symbol = method }; var notation = method.ToNotationDefinition(); context.SetCurrentMethodNotation(notation); var isInterface = method.ContainingType.IsInterface; notation.IsOverride = !isInterface && method.CanOverride(); var returnValueParameterName = context.GetReturnValueParameterName(); if (method.HasReturnValue) { notation.Body.AddRange(Notation.Create("var ", returnValueParameterName, " = default(", method.IsAsync ? method.ReturnType.TypeArguments.First().FullName : method.ReturnType.FullName, ");")); } notation.Body.Add(method.Parameters.Where(i => i.RefKind == RefKindInfo.Out).Select(i => $"{i.Name} = default;".ToNotation()).Combine()); notation.Body.AddRange(interceptors.SelectMany(i => i.BeforeMethod(context))); if (isInterface || (!method.IsAbstract && (method.Accessibility == AccessibilityInfo.Internal || method.Accessibility == AccessibilityInfo.Public))) { if (method.HasReturnValue) { notation.Body.AddRange(Notation.Create(returnValueParameterName, " = ")); } notation.Body.AddRange(Notation.Create(method.IsAsync ? "await " : string.Empty, method.ContainingType.IsInterface && !method.IsAbstract ? $"({context.GetProxyFieldName()} as {method.ContainingType.FullName})" : context.GetProxyFieldName(), ".", method.Name)); notation.Body.Add(ConstNotations.OpenParen); notation.Body.Add(notation.Parameters.ToCallParameters()); notation.Body.Add(ConstNotations.CloseParen); notation.Body.Add(ConstNotations.Semicolon); } notation.Body.AddRange(interceptors.SelectMany(i => i.AfterMethod(context))); if (method.HasReturnValue) { notation.Body.AddRange(Notation.Create("return ", returnValueParameterName, ";")); } return(notation); }
private INotation GenerateImplementMethod(IMethodSymbolInfo method, ProxyGeneratorContext typeContext) { var context = new ProxyGeneratorContext() { Parent = typeContext, Symbol = method }; var notation = method.ToNotationDefinition(); context.SetCurrentMethodNotation(notation); notation.IsOverride = !method.ContainingType.IsInterface && method.CanOverride(); notation.Body.Add(method.Parameters.Where(i => i.RefKind == RefKindInfo.Out).Select(i => $"{i.Name} = default;".ToNotation()).Combine()); var returnValueParameterName = context.GetReturnValueParameterName(); if (method.HasReturnValue) { notation.Body.AddRange(Notation.Create("var ", returnValueParameterName, " = default(", method.IsAsync ? method.ReturnType.TypeArguments.First().FullName : method.ReturnType.FullName, ");")); } if (method.HasReturnValue) { notation.Body.AddRange(Notation.Create("return ", returnValueParameterName, ";")); } return(notation); }