Ejemplo n.º 1
0
        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};");
        }
Ejemplo n.º 2
0
        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}");
        }
Ejemplo n.º 3
0
 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}{{");
 }
Ejemplo n.º 4
0
        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}{{");
        }
Ejemplo n.º 5
0
        // 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}
    }}
");
    }
Ejemplo n.º 7
0
        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}");
        }