private INotation GenerateImplementProperty(IPropertySymbolInfo property, ProxyGeneratorContext typeContext) { var context = new ProxyGeneratorContext() { Parent = typeContext, Symbol = property }; PropertyNotation notation; if (property.IsIndexer) { var indexer = new IndexerPropertyNotation(); indexer.Parameters.AddRange(property.Parameters.Select(i => new ParameterNotation() { Type = i.Type.FullName, Name = i.Name })); notation = indexer; } else { notation = new PropertyNotation(); } notation.IsOverride = !property.ContainingType.IsInterface && property.CanOverride(); notation.Accessibility = property.Accessibility; notation.Name = property.Name; notation.Type = property.Type.FullName; if (property.CanRead) { context.SetCurrentPropertyMethod(property.GetMethod); var getter = PropertyMethodNotation.Create(true); getter.Accessibility = property.GetMethod.Accessibility; var returnValueParameterName = context.GetReturnValueParameterName(); getter.Body.AddRange(Notation.Create("var ", returnValueParameterName, " = default(", property.Type.FullName, ");")); getter.Body.AddRange(Notation.Create("return ", returnValueParameterName, ";")); notation.Accessers.Add(getter); } if (property.CanWrite) { context.SetCurrentPropertyMethod(property.SetMethod); var setter = PropertyMethodNotation.Create(false); setter.Accessibility = property.SetMethod.Accessibility; setter.Body.Add(ConstNotations.Blank); notation.Accessers.Add(setter); } return(notation); }
private INotation CreateProxyProperty(IPropertySymbolInfo property, ProxyGeneratorContext typeContext) { var context = new ProxyGeneratorContext() { Parent = typeContext, Symbol = property }; PropertyNotation notation; List <INotation> callName = new List <INotation>(); if (property.IsIndexer) { var indexer = new IndexerPropertyNotation(); indexer.Parameters.AddRange(property.Parameters.Select(i => new ParameterNotation() { Type = i.Type.FullName, Name = i.Name })); notation = indexer; callName.Add(ConstNotations.OpenBracket); callName.Add(indexer.Parameters.ToCallParameters()); callName.Add(ConstNotations.CloseBracket); } else { callName.Add(ConstNotations.Dot); callName.Add(property.Name.ToNotation()); notation = new PropertyNotation(); } var isInterface = property.ContainingType.IsInterface; notation.IsOverride = !isInterface && property.CanOverride(); notation.Accessibility = property.Accessibility; notation.Name = property.Name; notation.Type = property.Type.FullName; if (property.CanRead) { context.SetCurrentPropertyMethod(property.GetMethod); var getter = PropertyMethodNotation.Create(true); getter.Accessibility = property.GetMethod.Accessibility; var returnValueParameterName = context.GetReturnValueParameterName(); getter.Body.AddRange(Notation.Create("var ", returnValueParameterName, " = default(", property.Type.FullName, ");")); getter.Body.AddRange(interceptors.SelectMany(i => i.BeforeMethod(context))); if (isInterface || (getter.Accessibility == AccessibilityInfo.Public || getter.Accessibility == AccessibilityInfo.Internal)) { getter.Body.AddRange(Notation.Create(returnValueParameterName, " = ", context.GetProxyFieldName())); getter.Body.AddRange(callName); getter.Body.Add(ConstNotations.Semicolon); } getter.Body.AddRange(interceptors.SelectMany(i => i.AfterMethod(context))); getter.Body.AddRange(Notation.Create("return ", returnValueParameterName, ";")); notation.Accessers.Add(getter); } if (property.CanWrite) { context.SetCurrentPropertyMethod(property.SetMethod); var setter = PropertyMethodNotation.Create(false); setter.Accessibility = property.SetMethod.Accessibility; var returnValueParameterName = context.GetReturnValueParameterName(); setter.Body.AddRange(Notation.Create("var ", returnValueParameterName, " = value;")); setter.Body.AddRange(interceptors.SelectMany(i => i.BeforeMethod(context))); if (isInterface || (setter.Accessibility == AccessibilityInfo.Public || setter.Accessibility == AccessibilityInfo.Internal)) { setter.Body.Add(context.GetProxyFieldName().ToNotation()); setter.Body.AddRange(callName); setter.Body.AddRange(Notation.Create(" = ", returnValueParameterName, ";")); } setter.Body.AddRange(interceptors.SelectMany(i => i.AfterMethod(context))); notation.Accessers.Add(setter); } return(notation); }