Skip to content

Commit b2fcc7d

Browse files
committed
Add Directory.Build.targets file parsing
1 parent 3a7474f commit b2fcc7d

File tree

7 files changed

+160
-1
lines changed

7 files changed

+160
-1
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using Kysect.DotnetProjectSystem.Projects;
2+
using Microsoft.Language.Xml;
3+
4+
namespace Kysect.DotnetProjectSystem.Tests.Projects;
5+
6+
public class DirectoryBuildTargetFileTests
7+
{
8+
[Fact]
9+
public void Create_FileWithTarget_ReturnFileWithTarget()
10+
{
11+
var content = """
12+
<Project>
13+
<Target Name="SomeTargetName" BeforeTargets="BeforeBuild">
14+
<PropertyGroup Condition="'$(SomeProperty)' == 'true'">
15+
<SomeProperty>false</SomeProperty>
16+
</PropertyGroup>
17+
</Target>
18+
</Project>
19+
""";
20+
21+
var dotnetBuildTargetFile = DirectoryBuildTargetFile.Create(content);
22+
23+
IReadOnlyCollection<IXmlElementSyntax> targets = dotnetBuildTargetFile.GetTargets();
24+
25+
targets.Should().HaveCount(1);
26+
}
27+
}

Sources/Kysect.DotnetProjectSystem.Tests/SolutionModification/DotnetSolutionModifierFactoryTests.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,4 +109,29 @@ public void Create_ForSolutionWithoutDirectoryFiles_DirectoryFileMustBeCreatedOn
109109
.ToXmlString(_syntaxFormatter)
110110
.Should().Be(directoryPackagesPropsContent);
111111
}
112+
113+
[Fact]
114+
public void Create_SolutionWithDirectoryBuildTargets_ReturnTargetFileContent()
115+
{
116+
string directoryBuildTargetContent = """
117+
<Project>
118+
<Target Name="SomeTargetName" BeforeTargets="BeforeBuild">
119+
<PropertyGroup Condition="'$(SomeProperty)' == 'true'">
120+
<SomeProperty>false</SomeProperty>
121+
</PropertyGroup>
122+
</Target>
123+
</Project>
124+
""";
125+
126+
_solutionFileStructureBuilderFactory.Create("Solution")
127+
.AddDirectoryBuildTargets(directoryBuildTargetContent)
128+
.Save(_currentPath);
129+
130+
DotnetSolutionModifier solutionModifier = _solutionModifierFactory.Create("Solution.sln");
131+
132+
solutionModifier
133+
.GetOrCreateDirectoryBuildTargetFile()
134+
.ToXmlString(_syntaxFormatter)
135+
.Should().Be(directoryBuildTargetContent);
136+
}
112137
}

Sources/Kysect.DotnetProjectSystem/FileStructureBuilding/SolutionFileStructureBuilder.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public class SolutionFileStructureBuilder
1616
private readonly List<SolutionStructureElement> _files;
1717
private DirectoryBuildPropsFile? _directoryBuildPropsFile;
1818
private DirectoryPackagesPropsFile? _directoryPackagesPropsFile;
19+
private DirectoryBuildTargetFile? _directoryBuildTargetFile;
1920

2021
public SolutionFileStructureBuilder(IFileSystem fileSystem, XmlDocumentSyntaxFormatter syntaxFormatter, string solutionName)
2122
{
@@ -66,11 +67,22 @@ public SolutionFileStructureBuilder AddDirectoryPackagesProps(DirectoryPackagesP
6667
return this;
6768
}
6869

70+
public SolutionFileStructureBuilder AddDirectoryBuildTargets(string content)
71+
{
72+
return AddDirectoryBuildTargets(DirectoryBuildTargetFile.Create(content));
73+
}
74+
75+
public SolutionFileStructureBuilder AddDirectoryBuildTargets(DirectoryBuildTargetFile directoryBuildTargetFile)
76+
{
77+
_directoryBuildTargetFile = directoryBuildTargetFile;
78+
return this;
79+
}
80+
6981
public void Save(string solutionDirectory)
7082
{
7183
string solutionFileContent = CreateSolutionFile(_fileSystem);
7284

73-
DirectoryExtensions.EnsureDirectoryExists(_fileSystem, solutionDirectory);
85+
_fileSystem.EnsureDirectoryExists(solutionDirectory);
7486
_fileSystem.File.WriteAllText(_fileSystem.Path.Combine(solutionDirectory, $"{_solutionName}.sln"), solutionFileContent);
7587

7688
if (_directoryBuildPropsFile is not null)
@@ -79,6 +91,9 @@ public void Save(string solutionDirectory)
7991
if (_directoryPackagesPropsFile is not null)
8092
AddFile([SolutionItemNameConstants.DirectoryPackagesProps], _directoryPackagesPropsFile.File.ToXmlString(_syntaxFormatter));
8193

94+
if (_directoryBuildTargetFile is not null)
95+
AddFile([SolutionItemNameConstants.DirectoryBuildTargets], _directoryBuildTargetFile.ToXmlString(_syntaxFormatter));
96+
8297
foreach (SolutionStructureElement? solutionFileInfo in _files)
8398
{
8499
string partialFilePath = _fileSystem.Path.Combine(solutionFileInfo.Path.ToArray());
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
using Kysect.CommonLib.BaseTypes.Extensions;
2+
using Kysect.DotnetProjectSystem.Xml;
3+
using Microsoft.Language.Xml;
4+
5+
namespace Kysect.DotnetProjectSystem.Projects;
6+
7+
public class DirectoryBuildTargetFile
8+
{
9+
private XmlDocumentSyntax _content;
10+
11+
public static DirectoryBuildTargetFile CreateEmpty()
12+
{
13+
string contentTemplate =
14+
"""
15+
<Project>
16+
</Project>
17+
""";
18+
19+
return Create(contentTemplate);
20+
}
21+
22+
public static DirectoryBuildTargetFile Create(string content)
23+
{
24+
XmlDocumentSyntax xmlDocumentSyntax = Parser.ParseText(content);
25+
if (xmlDocumentSyntax.RootSyntax is null)
26+
return CreateEmpty();
27+
28+
return new DirectoryBuildTargetFile(xmlDocumentSyntax);
29+
}
30+
31+
public DirectoryBuildTargetFile(XmlDocumentSyntax content)
32+
{
33+
_content = content;
34+
}
35+
36+
public IReadOnlyCollection<IXmlElementSyntax> GetTargets()
37+
{
38+
return GetNodesByName("Target");
39+
}
40+
41+
public IReadOnlyCollection<IXmlElementSyntax> GetNodesByName(string name)
42+
{
43+
return _content.GetNodesByName(name);
44+
}
45+
46+
public void UpdateDocument(Func<XmlDocumentSyntax, XmlDocumentSyntax> morphism)
47+
{
48+
morphism.ThrowIfNull();
49+
_content = morphism(_content);
50+
}
51+
52+
public string ToXmlString(XmlDocumentSyntaxFormatter formatter)
53+
{
54+
formatter.ThrowIfNull();
55+
56+
return formatter.Format(_content).ToFullString();
57+
}
58+
}

Sources/Kysect.DotnetProjectSystem/SolutionModification/DotnetSolutionModifier.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public class DotnetSolutionModifier
1313
private readonly IFileSystem _fileSystem;
1414
private DirectoryBuildPropsFile? _directoryBuildPropsModifier;
1515
private DirectoryPackagesPropsFile? _directoryPackagePropsModifier;
16+
private DirectoryBuildTargetFile? _directoryBuildTargetFile;
1617
private readonly Dictionary<string, DotnetCsprojFile> _projects;
1718

1819
public IReadOnlyCollection<KeyValuePair<string, DotnetCsprojFile>> Projects => _projects;
@@ -29,17 +30,25 @@ public DirectoryPackagesPropsFile GetOrCreateDirectoryPackagePropsModifier()
2930
return _directoryPackagePropsModifier;
3031
}
3132

33+
public DirectoryBuildTargetFile GetOrCreateDirectoryBuildTargetFile()
34+
{
35+
_directoryBuildTargetFile ??= DirectoryBuildTargetFile.CreateEmpty();
36+
return _directoryBuildTargetFile;
37+
}
38+
3239
public DotnetSolutionModifier(
3340
Dictionary<string, DotnetCsprojFile> projects,
3441
DirectoryBuildPropsFile? directoryBuildPropsModifier,
3542
DirectoryPackagesPropsFile? directoryPackagePropsModifier,
43+
DirectoryBuildTargetFile? directoryBuildTargetsFile,
3644
IFileSystem fileSystem,
3745
IFileInfo solutionPath,
3846
XmlDocumentSyntaxFormatter syntaxFormatter)
3947
{
4048
_projects = projects;
4149
_directoryBuildPropsModifier = directoryBuildPropsModifier;
4250
_directoryPackagePropsModifier = directoryPackagePropsModifier;
51+
_directoryBuildTargetFile = directoryBuildTargetsFile;
4352
_fileSystem = fileSystem;
4453
_solutionPath = solutionPath;
4554
_syntaxFormatter = syntaxFormatter;
@@ -61,6 +70,12 @@ public void Save()
6170
_fileSystem.File.WriteAllText(directoryPackagesPropsPath, _directoryPackagePropsModifier.File.ToXmlString(_syntaxFormatter));
6271
}
6372

73+
if (_directoryBuildTargetFile is not null)
74+
{
75+
string directoryPackagesPropsPath = _fileSystem.Path.Combine(_solutionPath.Directory.FullName, SolutionItemNameConstants.DirectoryBuildTargets);
76+
_fileSystem.File.WriteAllText(directoryPackagesPropsPath, _directoryBuildTargetFile.ToXmlString(_syntaxFormatter));
77+
}
78+
6479
foreach (KeyValuePair<string, DotnetCsprojFile> projectModifier in _projects)
6580
{
6681
_fileSystem.File.WriteAllText(projectModifier.Key, projectModifier.Value.File.ToXmlString(_syntaxFormatter));

Sources/Kysect.DotnetProjectSystem/SolutionModification/DotnetSolutionModifierFactory.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,14 @@ public DotnetSolutionModifier Create(string solutionPath)
2828

2929
DirectoryBuildPropsFile? directoryBuildPropsModifier = TryCreateDirectoryBuildPropsFile(solutionFileInfo);
3030
DirectoryPackagesPropsFile? directoryPackagesPropsFile = TryCreateDirectoryPackagesPropsFile(solutionFileInfo);
31+
DirectoryBuildTargetFile? directoryBuildTargetsFile = TryCreateDirectoryBuildTargetsFile(solutionFileInfo);
3132
Dictionary<string, DotnetCsprojFile> projects = CreateProjectModifiers(solutionFileInfo);
3233

3334
return new DotnetSolutionModifier(
3435
projects,
3536
directoryBuildPropsModifier,
3637
directoryPackagesPropsFile,
38+
directoryBuildTargetsFile,
3739
_fileSystem,
3840
solutionFileInfo,
3941
_syntaxFormatter);
@@ -63,6 +65,22 @@ public DotnetSolutionModifier Create(string solutionPath)
6365
return new DirectoryPackagesPropsFile(dotnetProjectFile);
6466
}
6567

68+
private DirectoryBuildTargetFile? TryCreateDirectoryBuildTargetsFile(IFileInfo solutionFileInfo)
69+
{
70+
solutionFileInfo.Directory.ThrowIfNull();
71+
72+
string path = _fileSystem.Path.Combine(solutionFileInfo.Directory.FullName, SolutionItemNameConstants.DirectoryBuildTargets);
73+
if (!_fileSystem.File.Exists(path))
74+
return null;
75+
76+
string fileContent =
77+
_fileSystem.File.Exists(path)
78+
? _fileSystem.File.ReadAllText(path)
79+
: string.Empty;
80+
81+
return DirectoryBuildTargetFile.Create(fileContent);
82+
}
83+
6684
private Dictionary<string, DotnetCsprojFile> CreateProjectModifiers(IFileInfo solutionFileInfo)
6785
{
6886
solutionFileInfo.Directory.ThrowIfNull();

Sources/Kysect.DotnetProjectSystem/Tools/SolutionItemNameConstants.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ public static class SolutionItemNameConstants
44
{
55
public const string DirectoryBuildProps = "Directory.Build.props";
66
public const string DirectoryPackagesProps = "Directory.Packages.props";
7+
public const string DirectoryBuildTargets = "Directory.Build.targets";
78
}

0 commit comments

Comments
 (0)