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