Beispiel #1
0
        public IFileGroup AddFileGroup(IFileGroup fileGroup)
        {
            if (fileGroup == null)
            {
                var emptyFg = _fileGroups.FirstOrDefault(f => string.IsNullOrWhiteSpace(f.Name));
                if (emptyFg == null)
                {
                    emptyFg = new FileGroup();
                }
                return(emptyFg);
            }

            var exsiting = _fileGroups.FirstOrDefault(f => f.Name == fileGroup.Name);

            if (exsiting == null)
            {
                _fileGroups.Add(fileGroup);
                return(fileGroup);
            }
            else
            {
                foreach (var file in fileGroup.Files)
                {
                    exsiting.AddFile(file);
                }
                return(exsiting);
            }
        }
Beispiel #2
0
        public void GivenBusinessLogicBehaviourGenerator_WhenSingleNotSupportRegen_ThenSingleClassCreated()
        {
            var settings = Substitute.For <ISettings>();
            var module   = ModuleBuilders.CreateModule();

            var c = new BusinessLogicBehaviour.Generator(settings, module, module.Models.First());

            IFileGroup output = c.Create() as IFileGroup;

            Approvals.VerifyAll(output.Files, "file", f => $"{f.FullName}\r\n{f.Content}");
        }
Beispiel #3
0
        public void GivenDataAccessConfigGenerator_WhenSingleSupportRegen_ThenSingleClassCreated()
        {
            var settings = Substitute.For <ISettings>();

            settings.SupportRegen = true;
            var module = ModuleBuilders.CreateModule();

            var c = new EntityFrameworkClass.Generator(settings, module, module.Models.First());

            IFileGroup output = c.Create() as IFileGroup;

            Approvals.VerifyAll(output.Files, "file", f => $"{f.FullName}\r\n{f.Content}");
        }
Beispiel #4
0
        public void AddFileGroup(IFileGroup fileGroup)
        {
            if (fileGroup == null)
            {
                return;
            }

            if (_fileGroups.Any(f => f.Name == fileGroup.Name))
            {
                throw new FileGroupExistsException(fileGroup.Name);
            }

            _fileGroups.Add(fileGroup);
        }
Beispiel #5
0
        public Parameters GenerateParameters(CodeFileCSharp input, Settings pluginSettings, IMetadataReader metadataReader, ILogger logger, IFileGroup <CodeFileCSharp, GroupItemDetails> fileGroup = null)
        {
            var cSharpFile = input as CodeFileCSharp;

            var propertyAdderActivity = new ActivityFrame(pluginId: AddPropertyPlugin.Plugin.PluginId);

            NodeRecord record;

            return(new Parameters()
            {
                PropertiesToDecorate = cSharpFile
                                       .SyntaxTree
                                       .GetRoot()
                                       .DescendantNodes()
                                       .OfType <PropertyDeclarationSyntax>()
                                       .Where(d => metadataReader.NodeIsGeneratedBy(cSharpFile.NodePathService.GetNodePath(d), propertyAdderActivity, out record))
            });
        }
        public Parameters GenerateParameters(
            CodeFileCSharp input,
            Settings pluginSettings,
            IMetadataReader metadataReader,
            ILogger logger,
            IFileGroup <CodeFileCSharp, GroupItemDetails> fileGroup = null)
        {
            var onlyTypesToInclude = pluginSettings
                                     .OnlyTypesToInclude?
                                     .Select(t => input.SemanticModel.Compilation.GetTypeByMetadataName(t)
                                             ?? throw new InvalidOperationException($"Unable to resolve '{t}' from {Settings.OnlyTypesToIncludeKey} list in plugin configuration.")).ToArray();
            var typesToExclude = pluginSettings
                                 .TypesToExclude?
                                 .Select(t => input.SemanticModel.Compilation.GetTypeByMetadataName(t)
                                         ?? throw new InvalidOperationException($"Unable to resolve '{t}' from {Settings.TypesToExcludeKey} list in plugin configuration.")).ToArray();

            var result = new Parameters();

            foreach (var classDeclaration in input.SyntaxTree.GetRoot().DescendantNodes().OfType <ClassDeclarationSyntax>())
            {
                var declaredSymbol = input.SemanticModel.GetDeclaredSymbol(classDeclaration);
                var typeName       = declaredSymbol.GetFullMetadataName();

                ClassParameters classParams = new ClassParameters(typeName);

                Func <INamedTypeSymbol, bool> typeIsDefinedInInputGroup = (baseType) =>
                                                                          fileGroup
                                                                          .Files
                                                                          .Any(inputFile =>
                                                                               inputFile.Key.SyntaxTree
                                                                               .GetRoot()
                                                                               .DescendantNodes()
                                                                               .OfType <ClassDeclarationSyntax>()
                                                                               .Any(inputClass => SymbolEqualityComparer.Default.Equals(inputFile.Key.SemanticModel.GetDeclaredSymbol(inputClass), baseType)));

                Func <INamedTypeSymbol, bool> typeContainsOverridableTargetMethod = (type) =>
                                                                                    type != null &&
                                                                                    type.GetAllSymbols <IMethodSymbol>(SymbolKind.Method, Accessibility.Public)
                                                                                    .Any(m => m.Name == pluginSettings.PrintMethodName &&
                                                                                         m.Parameters.Length == 0 &&
                                                                                         SymbolEqualityComparer.Default.Equals(m.ReturnType, input.SemanticModel.Compilation.GetTypeByMetadataName(typeof(string).ToString())) &&
                                                                                         (m.IsVirtual || m.IsAbstract));

                classParams.Override =
                    (fileGroup != null &&
                     declaredSymbol
                     .GetBaseTypes()
                     .Any(baseType => typeIsDefinedInInputGroup(baseType))) ||
                    typeContainsOverridableTargetMethod(declaredSymbol.BaseType);

                foreach (var prop in declaredSymbol.GetAllSymbols <IPropertySymbol>(SymbolKind.Property, Accessibility.Public))
                {
                    classParams.Members.Add(new MemberParameters(prop.Name, this.Filter(onlyTypesToInclude, typesToExclude, prop.Type)));
                }

                foreach (var field in declaredSymbol.GetAllSymbols <IFieldSymbol>(SymbolKind.Field, Accessibility.Public))
                {
                    classParams.Members.Add(new MemberParameters(field.Name, this.Filter(onlyTypesToInclude, typesToExclude, field.Type)));
                }

                result.Classes.Add(classParams);
            }

            return(result);
        }
        public Parameters GenerateParameters(CodeFileCSharp input, Settings pluginSettings, IMetadataReader metadataReader, ILogger logger, IFileGroup <CodeFileCSharp, GroupItemDetails> fileGroup = null)
        {
            if (string.IsNullOrEmpty(pluginSettings.AstDescriptionJsonFilePath))
            {
                throw new InvalidOperationException($"Setting {Settings.AstDescriptionJsonFilePathKey} should be provided.");
            }

            var path = pluginSettings.AstDescriptionJsonFilePath;

            if (!Path.IsPathRooted(pluginSettings.AstDescriptionJsonFilePath))
            {
                path = Path.Combine(pluginSettings.BasePath, pluginSettings.AstDescriptionJsonFilePath);
            }

            var payload = File.ReadAllText(path);

            var description = JsonConvert.DeserializeObject <Root>(payload);

            var fixer = new InstanceReferenceFixer();

            description = (Root)fixer.FixInstanceReferences(description);

            var analyzer       = new DescriptionAnalyzer(pluginSettings);
            var astDescription = analyzer.Analyze(description);

            var parametersBuilder = new ParametersBuilder(pluginSettings);

            return(parametersBuilder.CreateParameters(astDescription));
        }
 public Parameters GenerateParameters(CodeFileCSharp input, Settings pluginSettings, IMetadataReader metadataReader, ILogger logger, IFileGroup <CodeFileCSharp, GroupItemDetails> fileGroup = null)
 {
     return(new Parameters());
 }
        public Parameters GenerateParameters(CodeFileCSharp input, Settings pluginSettings, IMetadataReader metadataReader, ILogger logger, IFileGroup <CodeFileCSharp, GroupItemDetails> fileGroup = null)
        {
            var result = new Parameters();

            foreach (var classDeclaration in input.SyntaxTree.GetRoot().DescendantNodes().OfType <ClassDeclarationSyntax>())
            {
                var           declaredSymbol = input.SemanticModel.GetDeclaredSymbol(classDeclaration);
                var           typeName       = declaredSymbol.GetFullMetadataName();
                List <string> names          = new List <string>();
                foreach (var name in pluginSettings.PropertyNames)
                {
                    if (declaredSymbol.GetMembers(name).Any())
                    {
                        if (!pluginSettings.SkipPropertyNameIfConflicts)
                        {
                            throw new InvalidOperationException($"Target class {typeName} already contains member named as {name}.");
                        }
                    }
                    else
                    {
                        names.Add(name);
                    }
                }

                result.TypePropertyNames.Add(typeName, names.ToArray());
            }

            return(result);
        }
Beispiel #10
0
        public Parameters GenerateParameters(CodeFileTs input, Settings pluginSettings, IMetadataReader metadataReader, ILogger logger, IFileGroup <CodeFileTs, GroupItemDetails> fileGroup = null)
        {
            var searcher = new SearchVisitor();

            var classDeclarations = searcher.FindNodes <StClassDeclaration>(input.Model, c => true).ToArray();

            return(new Parameters()
            {
                AdditionalProperty = classDeclarations.Any(d => metadataReader.NodeIsGeneratedBy(input.NodePathService.GetNodePath(d), new ActivityFrame(pluginId: "TsTestPlugin"), out _))
            });
        }
Beispiel #11
0
        public Parameters GenerateParameters(CodeFileCSharp input, Settings pluginSettings, IMetadataReader metadataReader, ILogger logger, IFileGroup <CodeFileCSharp, GroupItemDetails> fileGroup = null)
        {
            List <string> names = new List <string>();

            foreach (var classDeclaration in input.SyntaxTree.GetRoot().DescendantNodes().OfType <ClassDeclarationSyntax>())
            {
                names.Add(classDeclaration.Identifier.ValueText);
            }

            return(new Parameters()
            {
                ClassNames = names.ToArray()
            });
        }
        public Parameters GenerateParameters(CodeFileCSharp input, Settings pluginSettings, IMetadataReader metadataReader, ILogger logger, IFileGroup <CodeFileCSharp, GroupItemDetails> fileGroup = null)
        {
            var typesToSkip = pluginSettings.TypesToSkip != null && pluginSettings.TypesToSkip.Length > 0
                ? new HashSet <string>(pluginSettings.TypesToSkip)
                : new HashSet <string>();

            INamedTypeSymbol sourceNodeBaseType = null;

            if (!string.IsNullOrEmpty(pluginSettings.SourceNodeBaseType))
            {
                sourceNodeBaseType = input.SemanticModel.Compilation.GetTypeByMetadataName(pluginSettings.SourceNodeBaseType);
                if (sourceNodeBaseType == null)
                {
                    throw new InvalidOperationException($"Cannot resolve required base type {pluginSettings.SourceNodeBaseType} from compilation.");
                }
            }

            List <NodeTypeInfo> items = new List <NodeTypeInfo>();

            foreach (var classDeclaration in input.SyntaxTree.GetRoot().DescendantNodes().OfType <ClassDeclarationSyntax>())
            {
                var declaredSymbol = input.SemanticModel.GetDeclaredSymbol(classDeclaration);

                var hasRequiredNodeBaseType = declaredSymbol.InheritsFromOrImplementsOrEqualsIgnoringConstruction(sourceNodeBaseType);

                if (hasRequiredNodeBaseType && !typesToSkip.Contains(declaredSymbol.GetFullMetadataName()))
                {
                    items.Add(this.GenerateForClass(declaredSymbol, sourceNodeBaseType, input.SemanticModel, pluginSettings));
                }
            }

            return(new Parameters(items));
        }
        public Parameters GenerateParameters(CodeFileCSharp input, Settings pluginSettings, IMetadataReader metadataReader, ILogger logger, IFileGroup <CodeFileCSharp, GroupItemDetails> fileGroup = null)
        {
            var result = new Parameters();

            var ignoreProperties = pluginSettings.IgnorePropertyNames != null && pluginSettings.IgnorePropertyNames.Length > 0
               ? new HashSet <string>(pluginSettings.IgnorePropertyNames)
               : new HashSet <string>();

            var typesToFold = pluginSettings.TypesToUnfold != null && pluginSettings.TypesToUnfold.Length > 0
                ? new HashSet <string>(pluginSettings.TypesToUnfold)
                : new HashSet <string>();

            INamedTypeSymbol requiredType = null;

            if (!string.IsNullOrEmpty(pluginSettings.RequiredClassBaseType))
            {
                requiredType = input.SemanticModel.Compilation.GetTypeByMetadataName(pluginSettings.RequiredClassBaseType);
                if (requiredType == null)
                {
                    throw new InvalidOperationException($"Cannot resolve required base type {pluginSettings.RequiredClassBaseType} from compilation.");
                }
            }

            foreach (var classDeclaration in input.SyntaxTree.GetRoot().DescendantNodes().OfType <ClassDeclarationSyntax>())
            {
                if (requiredType != null && classDeclaration.BaseList != null)
                {
                    bool hasRequiredType = false;
                    foreach (var baseType in classDeclaration.BaseList.Types)
                    {
                        var typeInfo = input.SemanticModel.GetTypeInfo(baseType.Type);

                        if (typeInfo.Type.InheritsFromOrImplementsOrEqualsIgnoringConstruction(requiredType))
                        {
                            hasRequiredType = true;
                            break;
                        }
                    }

                    if (!hasRequiredType)
                    {
                        continue;
                    }
                }

                var extensionClass = new ExtensionClass();
                var declaredSymbol = input.SemanticModel.GetDeclaredSymbol(classDeclaration);
                if (declaredSymbol.IsAbstract)
                {
                    continue;
                }

                extensionClass.ExtensionClassName      = $"{declaredSymbol.Name}Extensions";
                extensionClass.RelatedClassSymbol      = declaredSymbol;
                extensionClass.RelatedClassDeclaration = classDeclaration;

                var props =
                    declaredSymbol.GetAllSymbols <IPropertySymbol>(SymbolKind.Property, Accessibility.Public)
                    .Where(p => !p.IsStatic)
                    .ToArray();

                if (props.Length > 0)
                {
                    extensionClass.Members.AddRange(this.GetExtensionMembers(props, declaredSymbol, typesToFold, requiredType, ignoreProperties, pluginSettings));
                    ////var outputFile = (CodeFileCSharp)this.outputStream.CreateCodeFile($"{declaredSymbol.Name}Extensions.cs");
                }

                extensionClass.Include = !typesToFold.Contains(declaredSymbol.MetadataName) && extensionClass.Members.Any(m => m.Include);

                result.ExtensionClasses.Add(extensionClass);
            }

            return(result);
        }
 public Parameters GenerateParameters(CodeFileCSharp input, Settings pluginSettings, IMetadataReader metadataReader, ILogger logger, IFileGroup <CodeFileCSharp, GroupItemDetails> fileGroup = null)
 {
     return(new Parameters()
     {
         PropertiesToDecorate = (input as CodeFileCSharp).SyntaxTree.GetRoot().DescendantNodes().OfType <PropertyDeclarationSyntax>()
     });
 }