@@ -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