/// <summary>Called when the visitor visits a NamespaceDeclarationSyntax node.</summary>
        public override SyntaxNode VisitNamespaceDeclaration(NamespaceDeclarationSyntax node)
        {
            var u = _namespaces.Select(each => SyntaxFactory.UsingDirective(SyntaxFactory.ParseName($" {each}"))
                                       .WithLeadingTrivia(_leadingTrivia)
                                       .WithTrailingTrivia(_trailingTrivia)
                                       );


            if (node.Name != null && node.Name.GetType() == typeof(QualifiedNameSyntax))
            {
                var currUsings = new List <string>();
                var currNode   = ((QualifiedNameSyntax)node.Name);

                while (true)
                {
                    currUsings.Add(currNode.ToString());
                    if (currNode.Left == null || currNode.Left.GetType() != typeof(QualifiedNameSyntax))
                    {
                        break;
                    }
                    currNode = (QualifiedNameSyntax)currNode.Left;
                }
                u = u.Where(uName => !currUsings.Contains(uName.Name.ToString()));
            }
            node = node.AddUsings(u.ToArray());
            node = node.WithUsings(Sort(node.Usings));
            return(base.VisitNamespaceDeclaration(node));
        }
Exemplo n.º 2
0
        /// <summary>
        ///     Start code generation
        /// </summary>
        public void GenerateIntermediateCode()
        {
            if (Module == null)
            {
                throw new DataException("Please set Module before calling GenerateIntermediateCode()");
            }

            StandardFunctionRepository.Initialize(Module);

            _compiledCode = SyntaxFactory.CompilationUnit();

            MainClassNamespace = "Oberon0." + Module.Name;
            MainClassName      = Module.Name + "__Impl";

            // Create a namespace: (namespace CodeGenerationSample)
            _namespace = SyntaxFactory.NamespaceDeclaration(SyntaxFactory.ParseName(MainClassNamespace))
                         .NormalizeWhitespace();

            // Add System using statement: (using System)
            _namespace = _namespace.AddUsings(SyntaxFactory.UsingDirective(SyntaxFactory.ParseName("System")),
                                              SyntaxFactory.UsingDirective(SyntaxFactory.ParseName("AnyClone")));

            GenerateClass();

            _namespace = _namespace.AddMembers(_classDeclaration);

            _compiledCode = _compiledCode.AddMembers(_namespace).NormalizeWhitespace();
        }
 internal static NamespaceDeclarationSyntax AddUsing(this NamespaceDeclarationSyntax namespaceDeclaration, string fullName,
                                                     SyntaxTriviaList leadingTrivia)
 {
     return(namespaceDeclaration.AddUsings(
                UsingDirective(ConstructNameSyntax("System.Threading.Tasks"))
                .WithUsingKeyword(Token(leadingTrivia, SyntaxKind.UsingKeyword, TriviaList(Space)))
                .WithSemicolonToken(Token(TriviaList(), SyntaxKind.SemicolonToken, TriviaList(LineFeed)))
                ));
 }
Exemplo n.º 4
0
 public static NamespaceDeclarationSyntax AddUsings(this NamespaceDeclarationSyntax namespaceDeclarationSyntax, params string[] usings)
 {
     foreach (var usingName in usings)
     {
         var name        = SyntaxFactory.ParseName(usingName);
         var usingSyntax = SyntaxFactory.UsingDirective(name);
         namespaceDeclarationSyntax = namespaceDeclarationSyntax.AddUsings(usingSyntax);
     }
     return(namespaceDeclarationSyntax);
 }
Exemplo n.º 5
0
        /// <summary>Called when the visitor visits a NamespaceDeclarationSyntax node.</summary>
        public override SyntaxNode VisitNamespaceDeclaration(NamespaceDeclarationSyntax node)
        {
            var u = _namespaces.Select(each => SyntaxFactory.UsingDirective(SyntaxFactory.ParseName($" {each}"))
                                       .WithLeadingTrivia(_leadingTrivia)
                                       .WithTrailingTrivia(_trailingTrivia)
                                       ).ToArray();

            node = node.AddUsings(u);
            node = node.WithUsings(Sort(node.Usings));
            return(base.VisitNamespaceDeclaration(node));
        }
Exemplo n.º 6
0
        /// <summary> Create the namespace that contains the class(es). In this function, the usings are also created. </summary>
        private static NamespaceDeclarationSyntax CreateNamespaceDeclarationSyntax(string namespaceName, string[] usings)
        {
            // Create a namespace: (namespace CodeGenerationSample)
            NamespaceDeclarationSyntax @namespace = SyntaxFactory.NamespaceDeclaration(SyntaxFactory.ParseName(namespaceName)).NormalizeWhitespace();

            // Add System using statement: (using System)
            List <UsingDirectiveSyntax> usingDirectiveSyntaxes = CreateUsingDirectiveSyntaxes(usings);

            for (int i = 0; i < usingDirectiveSyntaxes.Count; i++)
            {
                @namespace = @namespace.AddUsings(usingDirectiveSyntaxes[i]);
            }

            return(@namespace);
        }
Exemplo n.º 7
0
        private static NamespaceDeclarationSyntax EmitUsingStatements(NamespaceDeclarationSyntax namespaceDeclaration, ISet <string> emittedUsings, IEnumerable <UsingDirectiveSyntax> usings)
        {
            foreach (var usingDirective in usings)
            {
                var fullString = usingDirective.NormalizeWhitespace().ToFullString();
                if (emittedUsings.Add(fullString))
                {
                    if (usingDirective.Name is IdentifierNameSyntax ins && ins.Identifier.ValueText.StartsWith("<global", StringComparison.OrdinalIgnoreCase))
                    {
                        continue;
                    }

                    namespaceDeclaration = namespaceDeclaration.AddUsings(usingDirective);
                }
            }

            return(namespaceDeclaration);
        }
Exemplo n.º 8
0
        private static GenerationResult Generate(SemanticModel sourceModel, SyntaxNode sourceSymbol, bool withRegeneration, IUnitTestGeneratorOptions options, NamespaceDeclarationSyntax targetNamespace, HashSet <string> usingsEmitted, CompilationUnitSyntax compilation, NamespaceDeclarationSyntax originalTargetNamespace)
        {
            var frameworkSet          = FrameworkSetFactory.Create(options);
            var typeParametersEmitted = new HashSet <string>();
            var model       = new TestableItemExtractor(sourceModel.SyntaxTree, sourceModel);
            var classModels = model.Extract(sourceSymbol).ToList();

            foreach (var c in classModels)
            {
                if (c.Declaration.Parent is NamespaceDeclarationSyntax namespaceDeclaration)
                {
                    targetNamespace = EmitUsingStatements(targetNamespace, usingsEmitted, SyntaxFactory.UsingDirective(SyntaxFactory.ParseName(namespaceDeclaration.Name.ToString())));
                }
            }

            foreach (var classModel in classModels)
            {
                var targetType = GetOrCreateTargetType(sourceSymbol, targetNamespace, frameworkSet, classModel, out var originalTargetType);

                targetNamespace = AddTypeParameterAliases(classModel, typeParametersEmitted, targetNamespace);

                targetType = ApplyStrategies(withRegeneration, targetType, frameworkSet, classModel);

                targetNamespace = AddTypeToTargetNamespace(originalTargetType, targetNamespace, targetType);

                foreach (var parameter in frameworkSet.Context.GenericTypes)
                {
                    targetNamespace = targetNamespace.AddUsings(
                        SyntaxFactory.UsingDirective(SyntaxFactory.QualifiedName(SyntaxFactory.IdentifierName(Strings.UnitTestGenerator_AddUsingStatements_System), SyntaxFactory.IdentifierName("String")))
                        .WithAlias(SyntaxFactory.NameEquals(SyntaxFactory.IdentifierName(parameter))));
                }
            }

            targetNamespace = AddUsingStatements(targetNamespace, usingsEmitted, frameworkSet, classModels);

            compilation = AddTargetNamespaceToCompilation(originalTargetNamespace, compilation, targetNamespace);

            var generationResult = CreateGenerationResult(compilation, classModels);

            AddAssembliesToGenerationResult(sourceModel, frameworkSet, generationResult);

            return(generationResult);
        }
Exemplo n.º 9
0
        public CSharpSyntaxNode Convert(SourceFile sourceFile)
        {
            CompilationUnitSyntax csCompilationUnit = SyntaxFactory.CompilationUnit();

            foreach (string us in this.Context.Config.Usings)
            {
                csCompilationUnit = csCompilationUnit.AddUsings(SyntaxFactory.UsingDirective(SyntaxFactory.ParseName(us)));
            }

            csCompilationUnit = csCompilationUnit.AddMembers(sourceFile.MouduleDeclarations.ToCsNodes <MemberDeclarationSyntax>());
            foreach (Node import in sourceFile.ImportDeclarations)
            {
                foreach (UsingDirectiveSyntax usingSyntax in import.ToCsNode <SyntaxList <UsingDirectiveSyntax> >())
                {
                    csCompilationUnit = csCompilationUnit.AddUsings(usingSyntax);
                }
            }

            List <Node> typeAliases     = sourceFile.TypeAliases;
            List <Node> typeDefinitions = this.FilterTypes(sourceFile.TypeDefinitions);

            if (typeAliases.Count > 0 || typeDefinitions.Count > 0)
            {
                string ns = sourceFile.Document.GetPackageName();
                if (!string.IsNullOrEmpty(ns))
                {
                    NamespaceDeclarationSyntax nsSyntaxNode = SyntaxFactory.NamespaceDeclaration(SyntaxFactory.ParseName(ns));
                    nsSyntaxNode = nsSyntaxNode
                                   .AddUsings(typeAliases.ToCsNodes <UsingDirectiveSyntax>())
                                   .AddMembers(typeDefinitions.ToCsNodes <MemberDeclarationSyntax>());
                    csCompilationUnit = csCompilationUnit.AddMembers(nsSyntaxNode);
                }
                else
                {
                    csCompilationUnit = csCompilationUnit
                                        .AddUsings(typeAliases.ToCsNodes <UsingDirectiveSyntax>())
                                        .AddMembers(typeDefinitions.ToCsNodes <MemberDeclarationSyntax>());
                }
            }

            return(csCompilationUnit);
        }
Exemplo n.º 10
0
        private static NamespaceDeclarationSyntax AddTypeParameterAliases(ClassModel classModel, HashSet <string> typeParametersEmitted, NamespaceDeclarationSyntax targetNamespace)
        {
            foreach (var parameter in classModel.Declaration.TypeParameterList?.Parameters ?? Enumerable.Empty <TypeParameterSyntax>())
            {
                var aliasedName = parameter.Identifier.ToString();
                if (targetNamespace.DescendantNodes().OfType <UsingDirectiveSyntax>().Any(node => string.Equals(node.Alias?.Name?.ToString(), aliasedName, StringComparison.OrdinalIgnoreCase)))
                {
                    continue;
                }

                if (typeParametersEmitted.Add(parameter.Identifier.ValueText))
                {
                    targetNamespace = targetNamespace.AddUsings(
                        SyntaxFactory.UsingDirective(SyntaxFactory.QualifiedName(SyntaxFactory.IdentifierName(Strings.UnitTestGenerator_AddUsingStatements_System), SyntaxFactory.IdentifierName("String")))
                        .WithAlias(SyntaxFactory.NameEquals(SyntaxFactory.IdentifierName(parameter.Identifier))));
                }
            }

            return(targetNamespace);
        }
Exemplo n.º 11
0
        public CSharpSyntaxNode Convert(ModuleDeclaration module)
        {
            string ns = this.GetNamespace(module);

            if (this.Context.Config.NamespaceMappings.ContainsKey(ns))
            {
                ns = this.Context.Config.NamespaceMappings[ns];
            }
            else if (!string.IsNullOrEmpty(this.Context.Config.Namespace))
            {
                ns = this.Context.Config.Namespace;
            }

            NamespaceDeclarationSyntax nsSyntax = SyntaxFactory.NamespaceDeclaration(SyntaxFactory.ParseName(ns));
            ModuleBlock mb = module.GetModuleBlock();

            if (mb != null)
            {
                nsSyntax = nsSyntax
                           .AddUsings(mb.TypeAliases.ToCsNodes <UsingDirectiveSyntax>())
                           .WithMembers(mb.ToCsNode <SyntaxList <MemberDeclarationSyntax> >());
            }
            return(nsSyntax);
        }
Exemplo n.º 12
0
        private static void Main(string[] args)
        {
            string assemblyName = "cls" + Guid.NewGuid().ToString("N");             //Path.GetRandomFileName();

            var sourceCode = CreateSourceCode(assemblyName);


            SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(sourceCode);

            var root = (CompilationUnitSyntax)syntaxTree.GetRoot();

            NamespaceDeclarationSyntax namespaceDeclaration = SyntaxFactory.NamespaceDeclaration(SyntaxFactory.IdentifierName(assemblyName));


            var newCompilationUnit = SyntaxFactory.CompilationUnit()
                                     .AddMembers
                                     (
                namespaceDeclaration
                .AddUsings(root.Usings.ToArray())
                .AddMembers(root.Members[0])
                                     );

            syntaxTree = SyntaxFactory.SyntaxTree(newCompilationUnit);             //CSharpSyntaxTree.Create(newCompilationUnit);


            var diagnostics = syntaxTree.GetDiagnostics().ToArray();


            //if (root.Kind() == SyntaxKind.CompilationUnit)
            //{
            //	CompilationUnitSyntax compilationUnit = (CompilationUnitSyntax) root;
            //	Do(compilationUnit.Members[0]);
            //}

            MetadataReference[] references =
            {
                MetadataReference.CreateFromFile(typeof(object).GetTypeInfo().Assembly.Location)
            };

            Compilation compilation = CSharpCompilation.Create
                                      (
                assemblyName: assemblyName,
                syntaxTrees: new[] { syntaxTree },
                references: references,
                options: new CSharpCompilationOptions(OutputKind.ConsoleApplication /*, mainTypeName: assemblyName + ".Program", usings: new[] { "System" }*/)
                                      );

            byte[] bytes;
            var    result = Emit(compilation, out bytes);

            if (result.Success)
            {
                Assembly assembly = Assembly.Load(/*ms.ToArray()*/ bytes);
                //var appType = assembly.GetType("App .Program");
                //var mainMethod = appType.GetMethod("Main", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy, null, new Type[0], null);
                //var retVal = mainMethod.Invoke(null, null);
                assembly.EntryPoint.Invoke(null, new object[] { new[] { Environment.CurrentDirectory } });
            }
            else
            {
                IEnumerable <Diagnostic> failures = result.Diagnostics.Where(diagnostic =>
                                                                             diagnostic.IsWarningAsError ||
                                                                             diagnostic.Severity == DiagnosticSeverity.Error);

                foreach (Diagnostic diagnostic in failures)
                {
                    switch (diagnostic.Location.Kind)
                    {
                    case LocationKind.SourceFile:
                    case LocationKind.XmlFile:
                    case LocationKind.ExternalFile:
                        FileLinePositionSpan lineSpan       = diagnostic.Location.GetLineSpan();
                        FileLinePositionSpan mappedLineSpan = diagnostic.Location.GetMappedLineSpan();
                        if (lineSpan.IsValid && mappedLineSpan.IsValid)
                        {
                            string path;
                            string basePath;
                            if (mappedLineSpan.HasMappedPath)
                            {
                                path     = mappedLineSpan.Path;
                                basePath = lineSpan.Path;
                            }
                            else
                            {
                                path     = lineSpan.Path;
                                basePath = (string)null;
                            }
                            //return string.Format(formatter, "{0}{1}: {2}: {3}", (object)this.FormatSourcePath(path, basePath, formatter), (object)this.FormatSourceSpan(mappedLineSpan.Span, formatter), (object)this.GetMessagePrefix(diagnostic), (object)diagnostic.GetMessage((IFormatProvider)cultureInfo));
                        }

                        break;
                    }
                    Location     location      = diagnostic.Location;
                    LinePosition startPosition = location.GetMappedLineSpan().Span.Start;

                    TextSpan sourceSpan = location.SourceSpan;
                    var      location1  = location.SourceTree.GetLineSpan(sourceSpan);
                    var      sourceText = location.SourceTree.GetText().Lines.GetLineFromPosition(location.SourceSpan.Start).ToString().Substring(8, 7);

                    Console.Error.WriteLine($"({startPosition.Line + 1},{startPosition.Character + 1}) {diagnostic.Id} : {diagnostic.GetMessage()}");
                }
            }
        }