Skip to content

Commit 836c2d9

Browse files
committed
Add LegacyStyle/SdkStyle generators
1 parent a369a75 commit 836c2d9

File tree

8 files changed

+217
-81
lines changed

8 files changed

+217
-81
lines changed

Assets/Editor/CSProjAssetTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ void Start()
4040
public virtual void SetUp()
4141
{
4242
var projectDirectory = Directory.GetParent(Application.dataPath).FullName;
43-
m_ProjectGeneration = new ProjectGeneration(projectDirectory);
43+
m_ProjectGeneration = new LegacyStyleProjectGeneration(projectDirectory);
4444
}
4545

4646
[UnityTearDown]

Packages/com.unity.ide.visualstudio.tests/Tests/Editor/SynchronizerBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public SynchronizerBuilder()
5252

5353
public ProjectGeneration Build()
5454
{
55-
return m_ProjectGeneration = new ProjectGeneration(projectDirectory, m_AssemblyProvider.Object, m_FileIoMock, m_GUIDGenerator.Object);
55+
return m_ProjectGeneration = new LegacyStyleProjectGeneration(projectDirectory, m_AssemblyProvider.Object, m_FileIoMock, m_GUIDGenerator.Object);
5656
}
5757

5858
public SynchronizerBuilder WithSolutionText(string solutionText)
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Unity Technologies.
3+
* Copyright (c) Microsoft Corporation. All rights reserved.
4+
* Licensed under the MIT License. See License.txt in the project root for license information.
5+
*--------------------------------------------------------------------------------------------*/
6+
7+
using System.Text;
8+
using UnityEditor.Compilation;
9+
10+
namespace Microsoft.Unity.VisualStudio.Editor
11+
{
12+
13+
internal class LegacyStyleProjectGeneration : ProjectGeneration
14+
{
15+
public LegacyStyleProjectGeneration(string tempDirectory, IAssemblyNameProvider assemblyNameProvider, IFileIO fileIoProvider, IGUIDGenerator guidGenerator) : base(tempDirectory, assemblyNameProvider, fileIoProvider, guidGenerator)
16+
{
17+
}
18+
19+
public LegacyStyleProjectGeneration(string tempDirectory) : base(tempDirectory)
20+
{
21+
}
22+
23+
public LegacyStyleProjectGeneration()
24+
{
25+
}
26+
27+
internal override void GetProjectHeader(ProjectProperties properties, out StringBuilder headerBuilder)
28+
{
29+
headerBuilder = new StringBuilder();
30+
31+
//Header
32+
headerBuilder.Append(@"<?xml version=""1.0"" encoding=""utf-8""?>").Append(k_WindowsNewline);
33+
headerBuilder.Append(@"<Project ToolsVersion=""4.0"" DefaultTargets=""Build"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">").Append(k_WindowsNewline);
34+
headerBuilder.Append(@" <PropertyGroup>").Append(k_WindowsNewline);
35+
headerBuilder.Append(@" <LangVersion>").Append(properties.LangVersion).Append(@"</LangVersion>").Append(k_WindowsNewline);
36+
headerBuilder.Append(@" </PropertyGroup>").Append(k_WindowsNewline);
37+
headerBuilder.Append(@" <PropertyGroup>").Append(k_WindowsNewline);
38+
headerBuilder.Append(@" <Configuration Condition="" '$(Configuration)' == '' "">Debug</Configuration>").Append(k_WindowsNewline);
39+
headerBuilder.Append(@" <Platform Condition="" '$(Platform)' == '' "">AnyCPU</Platform>").Append(k_WindowsNewline);
40+
headerBuilder.Append(@" <ProductVersion>10.0.20506</ProductVersion>").Append(k_WindowsNewline);
41+
headerBuilder.Append(@" <SchemaVersion>2.0</SchemaVersion>").Append(k_WindowsNewline);
42+
headerBuilder.Append(@" <RootNamespace>").Append(properties.RootNamespace).Append(@"</RootNamespace>").Append(k_WindowsNewline);
43+
headerBuilder.Append(@" <ProjectGuid>{").Append(properties.ProjectGuid).Append(@"}</ProjectGuid>").Append(k_WindowsNewline);
44+
headerBuilder.Append(@" <OutputType>Library</OutputType>").Append(k_WindowsNewline);
45+
headerBuilder.Append(@" <AppDesignerFolder>Properties</AppDesignerFolder>").Append(k_WindowsNewline);
46+
headerBuilder.Append(@" <AssemblyName>").Append(properties.AssemblyName).Append(@"</AssemblyName>").Append(k_WindowsNewline);
47+
headerBuilder.Append(@" <TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>").Append(k_WindowsNewline);
48+
headerBuilder.Append(@" <FileAlignment>512</FileAlignment>").Append(k_WindowsNewline);
49+
headerBuilder.Append(@" <BaseDirectory>.</BaseDirectory>").Append(k_WindowsNewline);
50+
headerBuilder.Append(@" </PropertyGroup>").Append(k_WindowsNewline);
51+
52+
GetProjectHeaderConfigurations(properties, headerBuilder);
53+
54+
// Explicit references
55+
headerBuilder.Append(@" <PropertyGroup>").Append(k_WindowsNewline);
56+
headerBuilder.Append(@" <NoConfig>true</NoConfig>").Append(k_WindowsNewline);
57+
headerBuilder.Append(@" <NoStdLib>true</NoStdLib>").Append(k_WindowsNewline);
58+
headerBuilder.Append(@" <AddAdditionalExplicitAssemblyReferences>false</AddAdditionalExplicitAssemblyReferences>").Append(k_WindowsNewline);
59+
headerBuilder.Append(@" <ImplicitlyExpandNETStandardFacades>false</ImplicitlyExpandNETStandardFacades>").Append(k_WindowsNewline);
60+
headerBuilder.Append(@" <ImplicitlyExpandDesignTimeFacades>false</ImplicitlyExpandDesignTimeFacades>").Append(k_WindowsNewline);
61+
headerBuilder.Append(@" </PropertyGroup>").Append(k_WindowsNewline);
62+
63+
GetProjectHeaderVstuFlavoring(properties, headerBuilder);
64+
GetProjectHeaderAnalyzers(properties, headerBuilder);
65+
}
66+
67+
protected override void AppendProjectReference(Assembly assembly, Assembly reference, StringBuilder projectBuilder)
68+
{
69+
// If the current assembly is a Player project, we want to project-reference the corresponding Player project
70+
var referenceName = m_AssemblyNameProvider.GetAssemblyName(assembly.outputPath, reference.name);
71+
72+
projectBuilder.Append(@" <ProjectReference Include=""").Append(referenceName).Append(GetProjectExtension()).Append(@""">").Append(k_WindowsNewline);
73+
projectBuilder.Append(" <Project>{").Append(ProjectGuid(referenceName)).Append("}</Project>").Append(k_WindowsNewline);
74+
projectBuilder.Append(" <Name>").Append(referenceName).Append("</Name>").Append(k_WindowsNewline);
75+
projectBuilder.Append(" </ProjectReference>").Append(k_WindowsNewline);
76+
}
77+
78+
protected override void GetProjectFooter(StringBuilder footerBuilder)
79+
{
80+
footerBuilder.Append(string.Join(k_WindowsNewline,
81+
@" <Import Project=""$(MSBuildToolsPath)\Microsoft.CSharp.targets"" />",
82+
@" <Target Name=""GenerateTargetFrameworkMonikerAttribute"" />",
83+
@" <!-- To modify your build process, add your task inside one of the targets below and uncomment it.",
84+
@" Other similar extension points exist, see Microsoft.Common.targets.",
85+
@" <Target Name=""BeforeBuild"">",
86+
@" </Target>",
87+
@" <Target Name=""AfterBuild"">",
88+
@" </Target>",
89+
@" -->",
90+
@"</Project>",
91+
@""));
92+
}
93+
}
94+
}

Packages/com.unity.ide.visualstudio/Editor/ProjectGeneration/LegacyStyleProjectGeneration.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Packages/com.unity.ide.visualstudio/Editor/ProjectGeneration/ProjectGeneration.cs

Lines changed: 44 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,14 @@ public interface IGenerator
3737
IAssemblyNameProvider AssemblyNameProvider { get; }
3838
}
3939

40-
public class ProjectGeneration : IGenerator
40+
public abstract class ProjectGeneration : IGenerator
4141
{
4242
public static readonly string MSBuildNamespaceUri = "http://schemas.microsoft.com/developer/msbuild/2003";
4343
public IAssemblyNameProvider AssemblyNameProvider => m_AssemblyNameProvider;
4444
public string ProjectDirectory { get; }
4545

4646
// Use this to have the same newline ending on all platforms for consistency.
47-
const string k_WindowsNewline = "\r\n";
47+
protected const string k_WindowsNewline = "\r\n";
4848

4949
const string m_SolutionProjectEntryTemplate = @"Project(""{{{0}}}"") = ""{1}"", ""{2}"", ""{{{3}}}""{4}EndProject";
5050

@@ -60,7 +60,7 @@ public class ProjectGeneration : IGenerator
6060
HashSet<string> m_BuiltinSupportedExtensions = new HashSet<string>();
6161

6262
readonly string m_ProjectName;
63-
readonly IAssemblyNameProvider m_AssemblyNameProvider;
63+
protected readonly IAssemblyNameProvider m_AssemblyNameProvider;
6464
readonly IFileIO m_FileIOProvider;
6565
readonly IGUIDGenerator m_GUIDGenerator;
6666
bool m_ShouldGenerateAll;
@@ -366,7 +366,7 @@ private Dictionary<string, string> GenerateAllAssetProjectParts()
366366
stringBuilders[assemblyName] = projectBuilder;
367367
}
368368

369-
IncludeAsset(projectBuilder, "None", asset);
369+
IncludeAsset(projectBuilder, IncludeAssetTag.None, asset);
370370
}
371371
}
372372

@@ -378,7 +378,13 @@ private Dictionary<string, string> GenerateAllAssetProjectParts()
378378
return result;
379379
}
380380

381-
private void IncludeAsset(StringBuilder builder, string tag, string asset)
381+
protected enum IncludeAssetTag
382+
{
383+
Compile,
384+
None
385+
}
386+
387+
protected virtual void IncludeAsset(StringBuilder builder, IncludeAssetTag tag, string asset)
382388
{
383389
var filename = EscapedRelativePathFor(asset, out var packageInfo);
384390

@@ -517,7 +523,7 @@ private string ProjectText(Assembly assembly,
517523

518524
if ("dll" != extensionWithoutDot)
519525
{
520-
IncludeAsset(projectBuilder, "Compile", file);
526+
IncludeAsset(projectBuilder, IncludeAssetTag.Compile, file);
521527
}
522528
else
523529
{
@@ -562,19 +568,13 @@ private string ProjectText(Assembly assembly,
562568
projectBuilder.Append(" <ItemGroup>").Append(k_WindowsNewline);
563569
foreach (var reference in assembly.assemblyReferences.Where(i => i.sourceFiles.Any(ShouldFileBePartOfSolution)))
564570
{
565-
// If the current assembly is a Player project, we want to project-reference the corresponding Player project
566-
var referenceName = m_AssemblyNameProvider.GetAssemblyName(assembly.outputPath, reference.name);
567-
568-
projectBuilder.Append(@" <ProjectReference Include=""").Append(referenceName).Append(GetProjectExtension()).Append(@""">").Append(k_WindowsNewline);
569-
projectBuilder.Append(" <Project>{").Append(ProjectGuid(referenceName)).Append("}</Project>").Append(k_WindowsNewline);
570-
projectBuilder.Append(" <Name>").Append(referenceName).Append("</Name>").Append(k_WindowsNewline);
571-
projectBuilder.Append(" </ProjectReference>").Append(k_WindowsNewline);
571+
AppendProjectReference(assembly, reference, projectBuilder);
572572
}
573573

574574
projectBuilder.Append(@" </ItemGroup>").Append(k_WindowsNewline);
575575
}
576576

577-
projectBuilder.Append(GetProjectFooter());
577+
GetProjectFooter(projectBuilder);
578578
return projectBuilder.ToString();
579579
}
580580

@@ -594,6 +594,8 @@ private static string XmlEscape(string s)
594594
return SecurityElement.Escape(s);
595595
}
596596

597+
protected abstract void AppendProjectReference(Assembly assembly, Assembly reference, StringBuilder projectBuilder);
598+
597599
private void AppendReference(string fullReference, StringBuilder projectBuilder)
598600
{
599601
var escapedFullPath = EscapedRelativePathFor(fullReference, out _);
@@ -765,30 +767,10 @@ private static ProjectType ProjectTypeOf(string fileName)
765767
return ProjectType.Game;
766768
}
767769

768-
private void GetProjectHeader(ProjectProperties properties, out StringBuilder headerBuilder)
769-
{
770-
headerBuilder = new StringBuilder();
770+
internal abstract void GetProjectHeader(ProjectProperties properties, out StringBuilder headerBuilder);
771771

772-
//Header
773-
headerBuilder.Append(@"<?xml version=""1.0"" encoding=""utf-8""?>").Append(k_WindowsNewline);
774-
headerBuilder.Append(@"<Project ToolsVersion=""4.0"" DefaultTargets=""Build"" xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">").Append(k_WindowsNewline);
775-
headerBuilder.Append(@" <PropertyGroup>").Append(k_WindowsNewline);
776-
headerBuilder.Append(@" <LangVersion>").Append(properties.LangVersion).Append(@"</LangVersion>").Append(k_WindowsNewline);
777-
headerBuilder.Append(@" </PropertyGroup>").Append(k_WindowsNewline);
778-
headerBuilder.Append(@" <PropertyGroup>").Append(k_WindowsNewline);
779-
headerBuilder.Append(@" <Configuration Condition="" '$(Configuration)' == '' "">Debug</Configuration>").Append(k_WindowsNewline);
780-
headerBuilder.Append(@" <Platform Condition="" '$(Platform)' == '' "">AnyCPU</Platform>").Append(k_WindowsNewline);
781-
headerBuilder.Append(@" <ProductVersion>10.0.20506</ProductVersion>").Append(k_WindowsNewline);
782-
headerBuilder.Append(@" <SchemaVersion>2.0</SchemaVersion>").Append(k_WindowsNewline);
783-
headerBuilder.Append(@" <RootNamespace>").Append(properties.RootNamespace).Append(@"</RootNamespace>").Append(k_WindowsNewline);
784-
headerBuilder.Append(@" <ProjectGuid>{").Append(properties.ProjectGuid).Append(@"}</ProjectGuid>").Append(k_WindowsNewline);
785-
headerBuilder.Append(@" <OutputType>Library</OutputType>").Append(k_WindowsNewline);
786-
headerBuilder.Append(@" <AppDesignerFolder>Properties</AppDesignerFolder>").Append(k_WindowsNewline);
787-
headerBuilder.Append(@" <AssemblyName>").Append(properties.AssemblyName).Append(@"</AssemblyName>").Append(k_WindowsNewline);
788-
headerBuilder.Append(@" <TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>").Append(k_WindowsNewline);
789-
headerBuilder.Append(@" <FileAlignment>512</FileAlignment>").Append(k_WindowsNewline);
790-
headerBuilder.Append(@" <BaseDirectory>.</BaseDirectory>").Append(k_WindowsNewline);
791-
headerBuilder.Append(@" </PropertyGroup>").Append(k_WindowsNewline);
772+
internal static void GetProjectHeaderConfigurations(ProjectProperties properties, StringBuilder headerBuilder)
773+
{
792774
headerBuilder.Append(@" <PropertyGroup Condition="" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "">").Append(k_WindowsNewline);
793775
headerBuilder.Append(@" <DebugSymbols>true</DebugSymbols>").Append(k_WindowsNewline);
794776
headerBuilder.Append(@" <DebugType>full</DebugType>").Append(k_WindowsNewline);
@@ -809,26 +791,10 @@ private void GetProjectHeader(ProjectProperties properties, out StringBuilder he
809791
headerBuilder.Append(@" <NoWarn>0169</NoWarn>").Append(k_WindowsNewline);
810792
headerBuilder.Append(@" <AllowUnsafeBlocks>").Append(properties.Unsafe).Append(@"</AllowUnsafeBlocks>").Append(k_WindowsNewline);
811793
headerBuilder.Append(@" </PropertyGroup>").Append(k_WindowsNewline);
794+
}
812795

813-
// Explicit references
814-
headerBuilder.Append(@" <PropertyGroup>").Append(k_WindowsNewline);
815-
headerBuilder.Append(@" <NoConfig>true</NoConfig>").Append(k_WindowsNewline);
816-
headerBuilder.Append(@" <NoStdLib>true</NoStdLib>").Append(k_WindowsNewline);
817-
headerBuilder.Append(@" <AddAdditionalExplicitAssemblyReferences>false</AddAdditionalExplicitAssemblyReferences>").Append(k_WindowsNewline);
818-
headerBuilder.Append(@" <ImplicitlyExpandNETStandardFacades>false</ImplicitlyExpandNETStandardFacades>").Append(k_WindowsNewline);
819-
headerBuilder.Append(@" <ImplicitlyExpandDesignTimeFacades>false</ImplicitlyExpandDesignTimeFacades>").Append(k_WindowsNewline);
820-
headerBuilder.Append(@" </PropertyGroup>").Append(k_WindowsNewline);
821-
822-
// Flavoring
823-
headerBuilder.Append(@" <PropertyGroup>").Append(k_WindowsNewline);
824-
headerBuilder.Append(@" <ProjectTypeGuids>{E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>").Append(k_WindowsNewline);
825-
headerBuilder.Append(@" <UnityProjectGenerator>Package</UnityProjectGenerator>").Append(k_WindowsNewline);
826-
headerBuilder.Append(@" <UnityProjectGeneratorVersion>").Append(properties.FlavoringPackageVersion).Append(@"</UnityProjectGeneratorVersion>").Append(k_WindowsNewline);
827-
headerBuilder.Append(@" <UnityProjectType>").Append(properties.FlavoringProjectType).Append(@"</UnityProjectType>").Append(k_WindowsNewline);
828-
headerBuilder.Append(@" <UnityBuildTarget>").Append(properties.FlavoringBuildTarget).Append(@"</UnityBuildTarget>").Append(k_WindowsNewline);
829-
headerBuilder.Append(@" <UnityVersion>").Append(properties.FlavoringUnityVersion).Append(@"</UnityVersion>").Append(k_WindowsNewline);
830-
headerBuilder.Append(@" </PropertyGroup>").Append(k_WindowsNewline);
831-
796+
internal static void GetProjectHeaderAnalyzers(ProjectProperties properties, StringBuilder headerBuilder)
797+
{
832798
if (!string.IsNullOrEmpty(properties.RulesetPath))
833799
{
834800
headerBuilder.Append(@" <PropertyGroup>").Append(k_WindowsNewline);
@@ -864,22 +830,26 @@ private void GetProjectHeader(ProjectProperties properties, out StringBuilder he
864830
}
865831
}
866832

867-
private static string GetProjectFooter()
833+
internal static void GetProjectHeaderVstuFlavoring(ProjectProperties properties, StringBuilder headerBuilder, bool includeProjectTypeGuids = true)
868834
{
869-
return string.Join(k_WindowsNewline,
870-
@" <Import Project=""$(MSBuildToolsPath)\Microsoft.CSharp.targets"" />",
871-
@" <Target Name=""GenerateTargetFrameworkMonikerAttribute"" />",
872-
@" <!-- To modify your build process, add your task inside one of the targets below and uncomment it.",
873-
@" Other similar extension points exist, see Microsoft.Common.targets.",
874-
@" <Target Name=""BeforeBuild"">",
875-
@" </Target>",
876-
@" <Target Name=""AfterBuild"">",
877-
@" </Target>",
878-
@" -->",
879-
@"</Project>",
880-
@"");
835+
// Flavoring
836+
headerBuilder.Append(@" <PropertyGroup>").Append(k_WindowsNewline);
837+
838+
if (includeProjectTypeGuids)
839+
{
840+
headerBuilder.Append(@" <ProjectTypeGuids>{E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>").Append(k_WindowsNewline);
841+
}
842+
843+
headerBuilder.Append(@" <UnityProjectGenerator>Package</UnityProjectGenerator>").Append(k_WindowsNewline);
844+
headerBuilder.Append(@" <UnityProjectGeneratorVersion>").Append(properties.FlavoringPackageVersion).Append(@"</UnityProjectGeneratorVersion>").Append(k_WindowsNewline);
845+
headerBuilder.Append(@" <UnityProjectType>").Append(properties.FlavoringProjectType).Append(@"</UnityProjectType>").Append(k_WindowsNewline);
846+
headerBuilder.Append(@" <UnityBuildTarget>").Append(properties.FlavoringBuildTarget).Append(@"</UnityBuildTarget>").Append(k_WindowsNewline);
847+
headerBuilder.Append(@" <UnityVersion>").Append(properties.FlavoringUnityVersion).Append(@"</UnityVersion>").Append(k_WindowsNewline);
848+
headerBuilder.Append(@" </PropertyGroup>").Append(k_WindowsNewline);
881849
}
882850

851+
protected abstract void GetProjectFooter(StringBuilder footerBuilder);
852+
883853
private static string GetSolutionText()
884854
{
885855
return string.Join(k_WindowsNewline,
@@ -1024,7 +994,7 @@ private string GetProjectActiveConfigurations(string projectGuid)
1024994
projectGuid);
1025995
}
1026996

1027-
private string EscapedRelativePathFor(string file, out UnityEditor.PackageManager.PackageInfo packageInfo)
997+
protected string EscapedRelativePathFor(string file, out UnityEditor.PackageManager.PackageInfo packageInfo)
1028998
{
1029999
var projectDir = ProjectDirectory.NormalizePathSeparators();
10301000
file = file.NormalizePathSeparators();
@@ -1042,24 +1012,24 @@ private string EscapedRelativePathFor(string file, out UnityEditor.PackageManage
10421012
return XmlFilename(path);
10431013
}
10441014

1045-
private static string SkipPathPrefix(string path, string prefix)
1015+
protected static string SkipPathPrefix(string path, string prefix)
10461016
{
10471017
if (path.StartsWith($"{prefix}{Path.DirectorySeparatorChar}") && (path.Length > prefix.Length))
10481018
return path.Substring(prefix.Length + 1);
10491019
return path;
10501020
}
10511021

1052-
static string GetProjectExtension()
1022+
protected static string GetProjectExtension()
10531023
{
10541024
return ".csproj";
10551025
}
10561026

1057-
private string ProjectGuid(string assemblyName)
1027+
protected string ProjectGuid(string assemblyName)
10581028
{
10591029
return m_GUIDGenerator.ProjectGuid(m_ProjectName, assemblyName);
10601030
}
10611031

1062-
private string ProjectGuid(Assembly assembly)
1032+
protected string ProjectGuid(Assembly assembly)
10631033
{
10641034
return ProjectGuid(m_AssemblyNameProvider.GetAssemblyName(assembly.outputPath, assembly.name));
10651035
}

0 commit comments

Comments
 (0)