using System; using Microsoft.CodeAnalysis; namespace cmdwtf.BuildTimestampGenerator { [Generator] internal class BuildTimestamp : ISourceGenerator { public void Execute(GeneratorExecutionContext context) { DateTime executeTimeUtc = DateTime.UtcNow; DateTimeOffset executeTimeUtcOffset = new(executeTimeUtc); string source = $@"// Auto-generated code using System; using System.Diagnostics.CodeAnalysis; namespace {nameof(cmdwtf)} {{ /// /// A static class representing when it was generated. /// [ExcludeFromCodeCoverage] internal static class {nameof(BuildTimestamp)} {{ /// /// The timestamp (in Windows FILETIME, the number of 100ns intervals since /// 12:00 midnight, January 1, 1601 C.E. UTC) from when this source was generated. /// public const long FileTime = {executeTimeUtc.ToFileTime()}; /// /// The timestamp (in ticks elapsed since the beginning of the 21st century) /// from when this source was generated. /// public const long Ticks = {executeTimeUtc.Ticks}; /// /// The time this source was generated, as a . /// public static DateTime BuildTimeUtc {{ get; }} = DateTime.FromFileTimeUtc(FileTime); /// /// The time this source was generated, as a . /// public static DateTimeOffset BuildTimeDto {{ get; }} = new DateTimeOffset(BuildTimeUtc); /// /// The time this source was generated, as a . /// public static DateTime BuildTime {{ get; }} = BuildTimeDto.LocalDateTime; /// /// The time this source was generated as a Unix timestamp in UTC. /// public const long UnixTimeUtc = {executeTimeUtcOffset.ToUnixTimeSeconds()}; /// /// The time this source was generated as a Unix timestamp in local time. /// public static long UnixTime {{ get; }} = BuildTimeDto.ToUnixTimeSeconds(); /// /// The time this source was generated as a Unix millisecond timestamp in UTC. /// public const long UnixTimeMillisecondsUtc = {executeTimeUtcOffset.ToUnixTimeMilliseconds()}; /// /// The time this source was generated as a Unix millisecond timestamp in local time. /// public static long UnixTimeMilliseconds {{ get; }} = BuildTimeDto.ToUnixTimeMilliseconds(); }} }} "; context.AddSource($"{nameof(BuildTimestamp)}.g.cs", source); } public void Initialize(GeneratorInitializationContext context) { } } }