protected override void FormatType(string typeName, TypeAttachmentMetadata metadata, StringBuilder builder)
        {
            builder.Append($@"
    readonly partial struct {typeName} : IEquatable<{typeName}>
    {{
        private readonly string _backingId;

        /// <summary>
        /// Defines an empty value for <see cref=""{typeName}"" />.
        /// </summary>
        public static {typeName} Empty {{ get; }} = new {typeName}(string.Empty);

        /// <summary>
        /// Creates a <see cref=""{typeName}"" /> from a string.
        /// </summary>
        public static {typeName} FromString(string content) => new {typeName}(content);

        private {typeName}(string content)
        {{
            _backingId = content;
        }}

        /// <inheritdoc />
        public override int GetHashCode() => _backingId.GetHashCode();

        /// <inheritdoc />
        public override string ToString() => _backingId;

        /// <inheritdoc />
        public override bool Equals(object obj)
        {{
            if (obj is {typeName} otherId)
            {{
                return Equals(otherId);
            }}

            return false;
        }}

        /// <inheritdoc />
        public bool Equals({typeName} other) => _backingId.Equals(other._backingId, StringComparison.Ordinal);

        /// <inheritdoc />
        public static bool operator ==({typeName} left, {typeName} right)
        {{
            return left.Equals(right);
        }}

        /// <inheritdoc />
        public static bool operator !=({typeName} left, {typeName} right)
        {{
            return !(left == right);
        }}
    }}
");
        }
Exemplo n.º 2
0
        public void CreateTypeExtension(GeneratorExecutionContext context, INamedTypeSymbol extendingTypeSymbol, GenerationOptions options)
        {
            var metadata = new TypeAttachmentMetadata();

            // We're going to need System regardless.
            metadata.AddNamespace("System");

            foreach (var converter in _converters)
            {
                if (converter.ShouldGenerate(context, extendingTypeSymbol, options))
                {
                    converter.AddSource(context, extendingTypeSymbol, metadata, options);
                }
            }

            var code = WrapSourceOutput(extendingTypeSymbol, FormatType(extendingTypeSymbol, metadata));

            context.AddSource(GetGeneratedFileName(extendingTypeSymbol, "Generated"), code);
        }
Exemplo n.º 3
0
        private string FormatType(INamedTypeSymbol typeSymbol, TypeAttachmentMetadata metadata)
        {
            var builder = new StringBuilder();

            var name = typeSymbol.Name;

            foreach (var usingStatement in metadata.AdditionalNamespaces)
            {
                builder.Append($@"
    using {usingStatement};");
            }

            foreach (var attr in metadata.AttributeLiterals)
            {
                builder.Append($@"
    [{attr}]");
            }

            FormatType(name, metadata, builder);

            return(builder.ToString());
        }
Exemplo n.º 4
0
        protected override void FormatType(string typeName, TypeAttachmentMetadata metadata, StringBuilder builder)
        {
            builder.Append($@"
    readonly partial struct {typeName} : IEquatable<{typeName}>
    {{
        private readonly int _backingId;

        /// <summary>
        /// Get the default zero state of {typeName}.
        /// </summary>
        public static {typeName} Zero {{ get; }} = new {typeName}(0);

        /// <summary>
        /// Create a new {typeName} from a 32-bit integer.
        /// </summary>
        public static {typeName} FromInt(int number) => new {typeName}(number);

        /// <summary>
        /// Try to parse a {typeName} from its string representation.
        /// </summary>
        public static bool TryParse(string text, out {typeName} id)
        {{
            if (int.TryParse(text, out var intId))
            {{
                id = new {typeName}(intId);
                return true;
            }}

            id = Zero;
            return false;
        }}

        private {typeName}(int number)
        {{
            _backingId = number;
        }}

        /// <summary>
        /// Get the int value backing this value.
        /// </summary>
        public int ToInt() => _backingId;

        /// <inheritdoc />
        public override int GetHashCode() => _backingId.GetHashCode();

        /// <inheritdoc />
        public override string ToString() => _backingId.ToString();

        /// <inheritdoc />
        public override bool Equals(object obj)
        {{
            if (obj is {typeName} otherId)
            {{
                return Equals(otherId);
            }}

            return false;
        }}

        /// <inheritdoc />
        public bool Equals({typeName} other) => _backingId.Equals(other._backingId);

        /// <inheritdoc />
        public static bool operator ==({typeName} left, {typeName} right)
        {{
            return left.Equals(right);
        }}

        /// <inheritdoc />
        public static bool operator !=({typeName} left, {typeName} right)
        {{
            return !(left == right);
        }}
    }}
");
        }
        public void AddSource(GeneratorExecutionContext context, INamedTypeSymbol generatingForType, TypeAttachmentMetadata metadata, GenerationOptions options)
        {
            var code = WrapSourceOutput(generatingForType, CreateSource(generatingForType.Name));

            context.AddSource(GetGeneratedFileName(generatingForType, "NsJsonConverter"), code);

            metadata.AddAttributeLiteral($"Newtonsoft.Json.JsonConverter(typeof({generatingForType.Name}.{generatingForType.Name}NsJsonConverter))");
        }
        public void AddSource(GeneratorExecutionContext context, INamedTypeSymbol generatingForType, TypeAttachmentMetadata metadata, GenerationOptions options)
        {
            var code = WrapSourceOutput(generatingForType, CreateSource(generatingForType.Name));

            context.AddSource(GetGeneratedFileName(generatingForType, "BsonSerializer"), code);

            metadata.AddAttributeLiteral($"BsonSerializer(typeof({generatingForType.Name}.{generatingForType.Name}BsonSerialiser))");
            metadata.AddNamespace("MongoDB.Bson.Serialization.Attributes");
        }
Exemplo n.º 7
0
        protected override void FormatType(string typeName, TypeAttachmentMetadata metadata, StringBuilder builder)
        {
            builder.Append($@"
    readonly partial struct {typeName} : IEquatable<{typeName}>
    {{
        private readonly Guid _backingId;

        /// <summary>
        /// Get the default empty state of {typeName}.
        /// </summary>
        public static {typeName} Empty {{ get; }} = new {typeName}(Guid.Empty);

        /// <summary>
        /// Creates a new {typeName} from a standard Guid.
        /// </summary>
        public static {typeName} FromGuid(Guid guid) => new {typeName}(guid);

        /// <summary>
        /// Create a new ID with a random unique value.
        /// </summary>
        public static {typeName} New() => new {typeName}(Guid.NewGuid());

        /// <summary>
        /// Attempt to parse a {typeName} from a string.
        /// </summary>
        public static bool TryParse(string text, out {typeName} id)
        {{
            if (Guid.TryParseExact(text, ""N"", out var guidId))
            {{
                id = new {typeName}(guidId);

                return true;
            }}

            id = Empty;
            return false;
        }}

        private {typeName}(Guid guid)
        {{
            _backingId = guid;
        }}

        /// <summary>
        /// Get the underlying guid from this {typeName}.
        /// </summary>
        public Guid ToGuid() => _backingId;

        /// <inheritdoc />
        public override int GetHashCode() => _backingId.GetHashCode();

        /// <inheritdoc />
        public override string ToString() => _backingId.ToString(""N"");

        /// <inheritdoc />
        public override bool Equals(object obj)
        {{
            if (obj is {typeName} otherId)
            {{
                return Equals(otherId);
            }}

            return false;
        }}

        /// <inheritdoc />
        public bool Equals({typeName} other) => _backingId.Equals(other._backingId);

        /// <inheritdoc />
        public static bool operator ==({typeName} left, {typeName} right)
        {{
            return left.Equals(right);
        }}

        /// <inheritdoc />
        public static bool operator !=({typeName} left, {typeName} right)
        {{
            return !(left == right);
        }}
    }}
");
        }
Exemplo n.º 8
0
 protected abstract void FormatType(string typeName, TypeAttachmentMetadata metadata, StringBuilder builder);
        public void AddSource(GeneratorExecutionContext context, INamedTypeSymbol generatingForType, TypeAttachmentMetadata metadata, GenerationOptions options)
        {
            var code = WrapSourceOutput(generatingForType, CreateSource(generatingForType));

            context.AddSource(GetGeneratedFileName(generatingForType, "TypeConverter"), code);

            metadata.AddAttributeLiteral($"TypeConverter(typeof({generatingForType.Name}.{generatingForType.Name}TypeConverter))");
            metadata.AddNamespace("System.ComponentModel");
        }