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); } }
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}"); }
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}"); }
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); }
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); }
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 _)) }); }
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>() }); }