예제 #1
0
파일: SlugCI.cs 프로젝트: SlugEnt/SlugCI
        private void LoadSolutionInfo()
        {
            List <string> solutionFiles = SearchForSolutionFile(CISession.RootDirectory.ToString(), ".sln");

            ControlFlow.Assert(solutionFiles.Count != 0, "Unable to find the solution file");
            ControlFlow.Assert(solutionFiles.Count == 1, "Found more than 1 solution file under the root directory -  - We can only work with 1 solution file." + CISession.RootDirectory.ToString());
            CISession.SolutionFileName = solutionFiles[0];
            CISession.Solution         = SolutionSerializer.DeserializeFromFile <Solution>(CISession.SolutionFileName);
            CISession.SolutionPath     = CISession.Solution.Directory;
        }
예제 #2
0
        public void Execute(GeneratorExecutionContext context)
        {
            var compilation           = context.Compilation;
            var allTypes              = compilation.Assembly.GlobalNamespace.GetAllTypes();
            var membersWithAttributes = allTypes.SelectMany(x => x.GetMembers())
                                        .Where(x => x is IPropertySymbol || x is IFieldSymbol)
                                        .Select(x => (Member: x, AttributeData: x.GetAttributeData("global::Nuke.Common.ProjectModel.SolutionAttribute")))
                                        .Where(x => x.AttributeData != null).ToList();

            if (membersWithAttributes.Count == 0)
            {
                return;
            }

            var rootDirectory   = GetRootDirectoryFrom(compilation);
            var compilationUnit = CompilationUnit()
                                  .AddUsings(UsingDirective(IdentifierName("Nuke.Common.ProjectModel")));

            foreach (var(member, attributeData) in membersWithAttributes)
            {
                var attributeArguments = attributeData.NamedArguments;
                if (attributeArguments.SingleOrDefault(x => x.Key == "GenerateProjects").Value.Value as bool? != true)
                {
                    continue;
                }

                var solutionFile = GetSolutionFileFromParametersFile(rootDirectory, member.Name);
                var solution     = SolutionSerializer.DeserializeFromFile <Solution>(solutionFile);

                var classDeclaration = GetSolutionFolderDeclaration(member.Name, solution.SolutionFolders, solution.Projects, isSolution: true);
                compilationUnit = compilationUnit
                                  .AddMembers(member.ContainingType.ContainingNamespace.Equals(compilation.GlobalNamespace, SymbolEqualityComparer.Default)
                        ? NamespaceDeclaration(IdentifierName(member.ContainingType.ContainingNamespace.GetFullName()))
                                              .AddMembers(classDeclaration)
                        : classDeclaration);
            }

            var source = compilationUnit.NormalizeWhitespace().ToFullString();

            context.AddSource(nameof(StronglyTypedSolutionGenerator), source);
        }