public static void GeneratePropertyGetterReturnsField( this StringBuilder source, string indent, IFieldSymbol fieldSymbol, Accessibility Accessibility ) { var accessor = Accessibility != Accessibility.NotApplicable ? $"{Accessibility.ToFriendlyString()} " : ""; source.AppendLine($"{indent}{accessor}get => {fieldSymbol.Name};"); }
public static void GeneratePropertyGetterStart( this StringBuilder source, string indent, bool useExpression, Accessibility Accessibility ) { var accessor = Accessibility != Accessibility.NotApplicable ? $"{Accessibility.ToFriendlyString()} " : ""; var expression = useExpression ? " => " : $"\n{indent}{{"; source.AppendLine($"{indent}{accessor}get{expression}"); }
public static void GenerateEnumStart( this StringBuilder source, string enumName, string indent, bool useFlags, Accessibility accessor = Accessibility.Public ) { if (useFlags) { source.AppendLine($"{indent}[System.Flags]"); } source.AppendLine($"{indent}{accessor.ToFriendlyString()} enum {enumName}\n{indent}{{"); }
public static void GeneratePropertyStart( this StringBuilder source, string indent, Accessibility accessors, bool isVirtual, IFieldSymbol fieldSymbol ) { var propertyName = fieldSymbol.GetPropertyName(); var virt = isVirtual ? "virtual " : ""; source.AppendLine($"{indent}{accessors.ToFriendlyString()} {virt}{fieldSymbol.Type} {propertyName}"); source.AppendLine($"{indent}{{"); }
// TODO: Generalize this to any field using dynamic indentation public static void GenerateClassField( this StringBuilder source, string indent, Accessibility accessors, InstanceModifier instance, string type, string variableName, string value ) { var instanceStr = instance == InstanceModifier.None ? "" : $"{instance.ToFriendlyString()} "; var accessorStr = accessors == Accessibility.NotApplicable ? "" : $"{accessors.ToFriendlyString()} "; var valueStr = value == null ? "" : $" = {value}"; source.AppendLine($"{indent}{accessorStr}{instanceStr}{type} {variableName}{valueStr};"); }
/// <inheritdoc/> protected override string CreateClass(string nestedClasses) { if (_viewModelPropertyType is null) { throw new InvalidOperationException("Must have a valid view model type."); } if (PropertyTypeName is null || string.IsNullOrWhiteSpace(PropertyTypeName)) { throw new InvalidOperationException("Must have a valid PropertyTypeName"); } var viewModelPropertyAccess = _viewModelPropertyAccess.ToFriendlyString(); var viewModelPropertyTypeName = _viewModelPropertyType.GetTypeName().Replace('+', '.'); var propertyAccess = _propertyAccess.ToFriendlyString(); var propertyTypeName = PropertyTypeName.Replace('+', '.'); var oneWayBindString = string.Empty; var twoWayBindString = string.Empty; if (_oneWayBindInvocation is not null) { oneWayBindString = @$ "public IDisposable {MethodNames.GetBindOneWaySubscription}() {{ var instance = this; return {_oneWayBindInvocation}; }}"; } if (_twoWayBindInvocation is not null) { twoWayBindString = @$ "public IDisposable {MethodNames.GetBindTwoWaySubscription}() {{ var instance = this; return {_twoWayBindInvocation}; }}"; } return($@" {ClassAccess.ToFriendlyString()} partial class {ClassName} : INotifyPropertyChanged {{ private {viewModelPropertyTypeName} _viewModel; private {propertyTypeName} _value; public event PropertyChangedEventHandler PropertyChanged; {propertyAccess} {propertyTypeName} Value {{ get => _value; set => RaiseAndSetIfChanged(ref _value, value); }} {viewModelPropertyAccess} {viewModelPropertyTypeName} ViewModel {{ get => _viewModel; set => RaiseAndSetIfChanged(ref _viewModel, value); }} {oneWayBindString} {twoWayBindString} public IObservable<object> {MethodNames.GetWhenChangedTargetObservable}() {{ return this.WhenChanged(x => x.ViewModel); }} public IObservable<object> {MethodNames.GetWhenChangedObservable}() {{ return this.WhenChanged(x => x.Value); }} protected void RaiseAndSetIfChanged<T>(ref T fieldValue, T value, [CallerMemberName] string propertyName = null) {{ if (EqualityComparer<T>.Default.Equals(fieldValue, value)) {{ return; }} fieldValue = value; OnPropertyChanged(propertyName); }} protected virtual void OnPropertyChanged(string propertyName) {{ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); }} {nestedClasses} }} "); }
public static void GenerateAutoProperty( this StringBuilder source, Accessibility accessors, string type, string propertyName, Accessibility?getAccessor, Accessibility?setAccessor, string indent, bool useInit = false, string defaultValue = null, bool isOverride = false ) { if (getAccessor == null && setAccessor == null) { throw new ArgumentNullException($"Must specify a {nameof(getAccessor)} or {nameof(setAccessor)} parameter"); } var getter = getAccessor == null ? "" : $"{(getAccessor != Accessibility.NotApplicable ? $"{getAccessor.Value.ToFriendlyString()} " : "")}get;"; var getterSpace = getAccessor != null ? " " : ""; var setOrInit = useInit ? "init;" : "set;"; var setterAccessor = setAccessor is null or Accessibility.NotApplicable ? "" : $"{setAccessor.Value.ToFriendlyString() ?? ""} "; var setter = setAccessor == null ? "" : $"{getterSpace}{setterAccessor}{setOrInit}"; var propertyAccessor = accessors == Accessibility.NotApplicable ? "" : $"{accessors.ToFriendlyString()} "; var printOverride = isOverride ? "override " : ""; var printDefaultValue = defaultValue != null ? $"{(setAccessor != null ? " =" : "")} {defaultValue};" : ""; var printGetterSetter = setAccessor == null ? "=>" : $"{{ {getter}{setter} }}"; source.AppendLine($"{indent}{propertyAccessor}{printOverride}{type} {propertyName} {printGetterSetter}{printDefaultValue}"); }