public void Execute(GeneratorExecutionContext context) { try { var factory = new StringFactory(); var reader = new ResourceFileReader(); var files = FilesToProcess(context); foreach (var file in files) { if (context.CancellationToken.IsCancellationRequested) { return; } var fileName = Path.GetFileNameWithoutExtension(file.Path).Split('.').First(); var metadata = new ResourceGenerationMetadata(fileName, "BridgeSource"); var content = reader.Read(file.GetText(context.CancellationToken)?.ToString() ?? string.Empty); var group = factory.CreateGroup(content); var source = factory.GenerateSource(group, metadata); if (!context.CancellationToken.IsCancellationRequested) { context.AddSource(fileName, SourceText.From(source, Encoding.UTF8)); } } } catch (Exception) { // ignored } }
public string GenerateSource(Group forGroup, ResourceGenerationMetadata metadata) { var sb = new StringBuilder(FileTemplate); Append(sb, GenerateClass(forGroup, metadata), Content, 1); Append(sb, GenerateInterface(forGroup, metadata), InterfaceContent, 1); Replace(sb, Namespace, metadata.Namespace); return(sb.ToString()); }
private void AddClassProperties(StringBuilder classBuilder, Group forGroup, ResourceGenerationMetadata metadata, int depth) { var subPropertiesBuilder = new StringBuilder(); var entriesBuilder = new StringBuilder(); var initializerBuilder = new StringBuilder(); var propertyNames = new HashSet <string>(); foreach (var group in forGroup.SubGroups) { var singleBuilder = new StringBuilder(SubClassPropertyTemplate); Replace(singleBuilder, PropertyType, InterfaceName(group, metadata.FileName)); var name = NameFor(@group, metadata.FileName); Replace(singleBuilder, PropertyName, name); propertyNames.Add(name); subPropertiesBuilder.AppendLine(singleBuilder.ToString()); initializerBuilder.AppendLine($"{name} = new {name}Class(stringLocalizer);"); } foreach (var entry in forGroup.Entries) { var parameter = ResolveParameter(entry); StringBuilder singleBuilder; if (parameter.Any()) { singleBuilder = new StringBuilder(TextPropertyMethodTemplate); Replace(singleBuilder, MethodParameter, PropertyMethodParameter(entry)); Append(singleBuilder, MethodImplementation(entry), MethodContent, depth); } else { singleBuilder = new StringBuilder(TextPropertyTemplate); } var name = entry.Name.Split('.').Last(); if (propertyNames.Contains(name)) { name = $"{name}String"; } Replace(singleBuilder, StringLocalizerKey, entry.Name); Replace(singleBuilder, PropertyName, name); entriesBuilder.AppendLine(singleBuilder.ToString()); } Append(classBuilder, subPropertiesBuilder.ToString(), SubClassProperties, depth); Append(classBuilder, entriesBuilder.ToString(), Properties, depth); Append(classBuilder, initializerBuilder.ToString(), PropertyInitializer, depth); }
public string GenerateInterface(Group forGroup, ResourceGenerationMetadata metadata, int currentLevel = 0) { var sb = new StringBuilder(InterfaceTemplate); var interfaceName = InterfacePrefix + NameFor(forGroup, metadata.FileName); AddInterfaceProperties(sb, forGroup, metadata, currentLevel + 1); var subInterfaceBuilder = new StringBuilder(); foreach (var subGroup in forGroup.SubGroups) { subInterfaceBuilder.AppendLine(GenerateInterface(subGroup, metadata, currentLevel)); } Append(sb, subInterfaceBuilder.ToString(), SubInterfaces, currentLevel + 1); Replace(sb, TypeName, interfaceName); return(sb.ToString()); }
public string GenerateClass(Group forGroup, ResourceGenerationMetadata metadata, int currentLevel = 0) { var sb = new StringBuilder(ClassTemplate); var isRoot = string.IsNullOrEmpty(forGroup.CommonKey); string modifier; var className = NameFor(forGroup, metadata.FileName); var inherits = $" : {InterfaceName(forGroup, metadata.FileName)}"; if (isRoot) { modifier = "public sealed"; } else { modifier = "private"; className = $"{className}Class"; } AddClassProperties(sb, forGroup, metadata, currentLevel + 1); var subClassBuilder = new StringBuilder(); foreach (var subGroup in forGroup.SubGroups) { subClassBuilder.AppendLine(GenerateClass(subGroup, metadata, currentLevel)); } Append(sb, subClassBuilder.ToString(), SubClasses, currentLevel + 1); Replace(sb, ClassModifier, modifier); Replace(sb, FileName, metadata.FileName); Replace(sb, TypeName, className); Replace(sb, Inherits, inherits); return(sb.ToString()); }
private void AddInterfaceProperties(StringBuilder interfaceBuilder, Group forGroup, ResourceGenerationMetadata metadata, int depth) { var subPropertiesBuilder = new StringBuilder(); var propertyNames = new HashSet <string>(); foreach (var group in forGroup.SubGroups) { var singleBuilder = new StringBuilder(InterfacePropertyTemplate); var name = NameFor(@group, metadata.FileName); Replace(singleBuilder, PropertyType, $"{InterfacePrefix}{name}"); Replace(singleBuilder, PropertyName, name); propertyNames.Add(name); subPropertiesBuilder.AppendLine(singleBuilder.ToString()); } foreach (var entry in forGroup.Entries) { var parameter = ResolveParameter(entry); StringBuilder singleBuilder; if (parameter.Any()) { singleBuilder = new StringBuilder(InterfacePropertyMethodTemplate); Replace(singleBuilder, MethodParameter, PropertyMethodParameter(entry)); } else { singleBuilder = new StringBuilder(InterfacePropertyTemplate); } var name = entry.Name.Split('.').Last(); if (propertyNames.Contains(name)) { name = $"{name}String"; } Replace(singleBuilder, PropertyType, "string"); Replace(singleBuilder, PropertyName, name); subPropertiesBuilder.AppendLine(singleBuilder.ToString()); } Append(interfaceBuilder, subPropertiesBuilder.ToString(), InterfaceProperties, depth); }