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; }
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); }