Example #1
0
        private async Task <Solution> CreateTestDataBuilderAsync(
            Document contextDocument, TypeDeclarationSyntax declaration, CancellationToken cancellationToken)
        {
            try {
                Project  contextDocumentProject = contextDocument.Project;
                Solution originalSolution       = contextDocumentProject.Solution;
                Project  testProject            = originalSolution.Projects.FirstOrDefault(p => p.Name == contextDocument.Project.Name + ".Test");
                if (testProject == null)
                {
                    return(originalSolution);
                }

                SemanticModel semanticModel = await contextDocument.GetSemanticModelAsync(cancellationToken);

                ISymbol typeSymbol = semanticModel.GetDeclaredSymbol(declaration, cancellationToken);

                /*Datei erstellen*/
                string[] folders = { "src", "Builders" };
                TestDataBuilderSyntaxWriter testDataBuilderSyntaxWriter = new TestDataBuilderSyntaxWriter(
                    typeSymbol.Name,
                    typeSymbol.ContainingNamespace.ToString());
                SyntaxNode syntaxNode = testDataBuilderSyntaxWriter.CreateBuilderClass();

                SyntaxNode formattedBuilderClassSyntax = Formatter.Format(syntaxNode, testProject.Solution.Workspace);

                /*Klasse anpassen*/
                SourceText sourceText = formattedBuilderClassSyntax.GetText();
                Document   testDataBuilderDocument = testProject.AddDocument(typeSymbol.Name + "Builder.cs", sourceText, folders);
                return(testDataBuilderDocument.Project.Solution);
            } catch (Exception e) {
                Debug.WriteLine(e.Message);
                throw;
            }
        }
Example #2
0
        internal static bool IsAccordingSetterMethod(IFieldSymbol field, IMethodSymbol setterMethod)
        {
            string fieldNameWithoutUnderscore = field.Name.Substring(1);
            string expectedNameInMethod       = TestDataBuilderSyntaxWriter.ToUpperCamelCase(fieldNameWithoutUnderscore);

            if (setterMethod.Name.EndsWith(expectedNameInMethod) && !setterMethod.Parameters.Any())
            {
                /*Die Methode hat den gleichen Namen wie das Feld (ohne _ und mit großem Anfangsbuchstaben) und hat keine Parameter => sollte passen. */
                /*Bsp.: _isPublished => Published() */
                return(true);
            }
            else
            {
                foreach (IParameterSymbol methodParameter in setterMethod.Parameters)
                {
                    if (methodParameter.Name == fieldNameWithoutUnderscore && TypeHelper.AreTypesEqual(field.Type, methodParameter.Type))
                    {
                        /*Der Name des Parameters entspricht dem Namen (ohne _) und die Typen sind gleich. => sollte passen*/
                        /*Bsp.: string _firstname => WithFirstname(string firstname) */
                        /*Bsp.: string _name => WithFirstname(string name) */
                        /*Bsp.: DateTime _createdAt und User _createdBy => CreatedByAndAt(User createdBy, DateTime createdAt) */
                        return(true);
                    }
                }
            }

            return(false);
        }
Example #3
0
        private ClassDeclarationSyntax AddCreateMethodForBuilder(
            ClassDeclarationSyntax originalCreateClassDeclarationSyntax, ITypeSymbol builderTypeSymbol)
        {
            int indexForNewPublicMethod = TestDataBuilderSyntaxWriter.GetIndexForNewPublicMethod(originalCreateClassDeclarationSyntax);

            SyntaxList <MemberDeclarationSyntax> memberDeclarationSyntaxs =
                originalCreateClassDeclarationSyntax.Members.Insert(indexForNewPublicMethod, GetCreateMethodSyntax(builderTypeSymbol));

            return(originalCreateClassDeclarationSyntax.WithMembers(memberDeclarationSyntaxs));
        }
Example #4
0
        protected override async Task <Document> GetChangedDocumentAsync(CancellationToken cancellationToken)
        {
            Project documentProject = Context.Document.Project;
            string  testProjectName = documentProject.Name + ".Test";
            Project testProject     = documentProject.Solution.Projects.SingleOrDefault(p => p.Name == testProjectName);

            if (testProject == null)
            {
                return(null);
            }

            Compilation fieldCompilation = await documentProject.GetCompilationAsync(cancellationToken);

            SemanticModel semanticModel = fieldCompilation.GetSemanticModel(Declaration.SyntaxTree);
            IFieldSymbol  fieldSymbol   = (IFieldSymbol)semanticModel.GetDeclaredSymbol(Declaration.Declaration.Variables[0]);
            ITypeSymbol   type          = fieldSymbol.ContainingType;

            string      builderTypeName = type.Name + "Builder";
            Compilation compilation     = await testProject.GetCompilationAsync(cancellationToken);

            ITypeSymbol builderSymbol = compilation.GetSymbolsWithName(s => s == builderTypeName, SymbolFilter.Type).OfType <ITypeSymbol>()
                                        .FirstOrDefault();

            if (builderSymbol == null)
            {
                return(null);
            }

            SyntaxReference        builderSymbolDeclaringSyntaxReference = builderSymbol.DeclaringSyntaxReferences[0];
            ClassDeclarationSyntax classDeclarationFromSymbol            = builderSymbolDeclaringSyntaxReference.GetSyntax() as ClassDeclarationSyntax;

            if (classDeclarationFromSymbol == null)
            {
                return(null);
            }

            Document               document           = testProject.GetDocument(classDeclarationFromSymbol.SyntaxTree);
            SyntaxTree             documentSyntaxTree = document.GetSyntaxTreeAsync(cancellationToken).Result;
            SyntaxNode             root = documentSyntaxTree.GetRoot();
            ClassDeclarationSyntax originalClassDeclarationSyntax = root.DescendantNodes().OfType <ClassDeclarationSyntax>().FirstOrDefault();

            if (originalClassDeclarationSyntax == null)
            {
                return(null);
            }

            ClassDeclarationSyntax changedBuilderClassSyntax =
                TestDataBuilderSyntaxWriter.UpdateBuilderToGenerateCodeToSetField(originalClassDeclarationSyntax, builderSymbol, fieldSymbol, type);

            SyntaxNode formattedBuilderClassSyntax = Formatter.Format(changedBuilderClassSyntax, document.Project.Solution.Workspace);
            SyntaxNode changedRootNode             = root.ReplaceNode(originalClassDeclarationSyntax, formattedBuilderClassSyntax);

            return(document.WithSyntaxRoot(changedRootNode));
        }