Skip to content

Commit fe1b318

Browse files
sailroGitHub Enterprise
authored andcommitted
Merge pull request #195 from unity/control-generation-style
Control generation style
2 parents 5c9cc58 + 2ef8e61 commit fe1b318

10 files changed

+109
-20
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
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;
8+
using System.Collections.Generic;
9+
10+
namespace Microsoft.Unity.VisualStudio.Editor
11+
{
12+
internal enum GeneratorStyle
13+
{
14+
SDK = 1,
15+
Legacy = 2,
16+
}
17+
18+
internal static class GeneratorFactory
19+
{
20+
private static readonly Dictionary<GeneratorStyle, IGenerator> _generators = new Dictionary<GeneratorStyle, IGenerator>();
21+
22+
static GeneratorFactory()
23+
{
24+
_generators.Add(GeneratorStyle.SDK, new SdkStyleProjectGeneration());
25+
_generators.Add(GeneratorStyle.Legacy, new LegacyStyleProjectGeneration());
26+
}
27+
28+
public static IGenerator GetInstance(GeneratorStyle style)
29+
{
30+
var forceStyleString = OnSelectingCSProjectStyle();
31+
if (forceStyleString != null && Enum.TryParse<GeneratorStyle>(forceStyleString, out var forceStyle))
32+
style = forceStyle;
33+
34+
if (_generators.TryGetValue(style, out var result))
35+
return result;
36+
37+
throw new ArgumentException("Unknown generator style");
38+
}
39+
40+
private static string OnSelectingCSProjectStyle()
41+
{
42+
foreach (var method in TypeCacheHelper.GetPostProcessorCallbacks(nameof(OnSelectingCSProjectStyle)))
43+
{
44+
object retValue = method.Invoke(null, Array.Empty<object>());
45+
if (method.ReturnType != typeof(string))
46+
continue;
47+
48+
return retValue as string;
49+
}
50+
51+
return null;
52+
}
53+
}
54+
}

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

Lines changed: 7 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/LegacyStyleProjectGeneration.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace Microsoft.Unity.VisualStudio.Editor
1212

1313
internal class LegacyStyleProjectGeneration : ProjectGeneration
1414
{
15-
internal override string StyleName => "Legacy";
15+
internal override GeneratorStyle Style => GeneratorStyle.Legacy;
1616

1717
public LegacyStyleProjectGeneration(string tempDirectory, IAssemblyNameProvider assemblyNameProvider, IFileIO fileIoProvider, IGUIDGenerator guidGenerator) : base(tempDirectory, assemblyNameProvider, fileIoProvider, guidGenerator)
1818
{

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

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
using System.Collections.Generic;
88
using System.IO;
99
using System.Linq;
10-
using SR = System.Reflection;
1110
using System.Security;
1211
using System.Security.Cryptography;
1312
using System.Text;
@@ -87,7 +86,7 @@ public ProjectGeneration(string tempDirectory, IAssemblyNameProvider assemblyNam
8786
SetupProjectSupportedExtensions();
8887
}
8988

90-
internal virtual string StyleName => "";
89+
internal virtual GeneratorStyle Style => GeneratorStyle.Legacy;
9190

9291
/// <summary>
9392
/// Syncs the scripting solution if any affected files are relevant.
@@ -416,18 +415,9 @@ private void SyncSolutionFileIfNotChanged(string path, string newContents)
416415
SyncFileIfNotChanged(path, newContents);
417416
}
418417

419-
private static IEnumerable<SR.MethodInfo> GetPostProcessorCallbacks(string name)
420-
{
421-
return TypeCache
422-
.GetTypesDerivedFrom<AssetPostprocessor>()
423-
.Where(t => t.Assembly.GetName().Name != KnownAssemblies.Bridge) // never call into the bridge if loaded with the package
424-
.Select(t => t.GetMethod(name, SR.BindingFlags.Public | SR.BindingFlags.NonPublic | SR.BindingFlags.Static))
425-
.Where(m => m != null);
426-
}
427-
428418
static void OnGeneratedCSProjectFiles()
429419
{
430-
foreach (var method in GetPostProcessorCallbacks(nameof(OnGeneratedCSProjectFiles)))
420+
foreach (var method in TypeCacheHelper.GetPostProcessorCallbacks(nameof(OnGeneratedCSProjectFiles)))
431421
{
432422
method.Invoke(null, Array.Empty<object>());
433423
}
@@ -437,7 +427,7 @@ private static bool OnPreGeneratingCSProjectFiles()
437427
{
438428
bool result = false;
439429

440-
foreach (var method in GetPostProcessorCallbacks(nameof(OnPreGeneratingCSProjectFiles)))
430+
foreach (var method in TypeCacheHelper.GetPostProcessorCallbacks(nameof(OnPreGeneratingCSProjectFiles)))
441431
{
442432
var retValue = method.Invoke(null, Array.Empty<object>());
443433
if (method.ReturnType == typeof(bool))
@@ -451,7 +441,7 @@ private static bool OnPreGeneratingCSProjectFiles()
451441

452442
private static string InvokeAssetPostProcessorGenerationCallbacks(string name, string path, string content)
453443
{
454-
foreach (var method in GetPostProcessorCallbacks(name))
444+
foreach (var method in TypeCacheHelper.GetPostProcessorCallbacks(name))
455445
{
456446
var args = new[] { path, content };
457447
var returnValue = method.Invoke(null, args);
@@ -843,7 +833,7 @@ internal void GetProjectHeaderVstuFlavoring(ProjectProperties properties, String
843833

844834
headerBuilder.Append(@" <UnityProjectGenerator>Package</UnityProjectGenerator>").Append(k_WindowsNewline);
845835
headerBuilder.Append(@" <UnityProjectGeneratorVersion>").Append(properties.FlavoringPackageVersion).Append(@"</UnityProjectGeneratorVersion>").Append(k_WindowsNewline);
846-
headerBuilder.Append(@" <UnityProjectGeneratorStyle>").Append(StyleName).Append("</UnityProjectGeneratorStyle>").Append(k_WindowsNewline);
836+
headerBuilder.Append(@" <UnityProjectGeneratorStyle>").Append(Style).Append("</UnityProjectGeneratorStyle>").Append(k_WindowsNewline);
847837
headerBuilder.Append(@" <UnityProjectType>").Append(properties.FlavoringProjectType).Append(@"</UnityProjectType>").Append(k_WindowsNewline);
848838
headerBuilder.Append(@" <UnityBuildTarget>").Append(properties.FlavoringBuildTarget).Append(@"</UnityBuildTarget>").Append(k_WindowsNewline);
849839
headerBuilder.Append(@" <UnityVersion>").Append(properties.FlavoringUnityVersion).Append(@"</UnityVersion>").Append(k_WindowsNewline);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ namespace Microsoft.Unity.VisualStudio.Editor
1414
{
1515
internal class SdkStyleProjectGeneration : ProjectGeneration
1616
{
17-
internal override string StyleName => "SDK";
17+
internal override GeneratorStyle Style => GeneratorStyle.SDK;
1818

1919
internal class SdkStyleAssemblyNameProvider : AssemblyNameProvider
2020
{
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
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 SR = System.Reflection;
8+
9+
using System.Collections.Generic;
10+
using System.Linq;
11+
using UnityEditor;
12+
13+
namespace Microsoft.Unity.VisualStudio.Editor {
14+
15+
internal class TypeCacheHelper
16+
{
17+
internal static IEnumerable<SR.MethodInfo> GetPostProcessorCallbacks(string name)
18+
{
19+
return TypeCache
20+
.GetTypesDerivedFrom<AssetPostprocessor>()
21+
.Where(t => t.Assembly.GetName().Name != KnownAssemblies.Bridge) // never call into the bridge if loaded with the package
22+
.Select(t => t.GetMethod(name, SR.BindingFlags.Public | SR.BindingFlags.NonPublic | SR.BindingFlags.Static))
23+
.Where(m => m != null);
24+
}
25+
}
26+
27+
}

Packages/com.unity.ide.visualstudio/Editor/ProjectGeneration/TypeCacheHelper.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/VisualStudioCodeInstallation.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ namespace Microsoft.Unity.VisualStudio.Editor
1717
{
1818
internal class VisualStudioCodeInstallation : VisualStudioInstallation
1919
{
20-
private static readonly IGenerator _generator = new SdkStyleProjectGeneration();
20+
private static readonly IGenerator _generator = GeneratorFactory.GetInstance(GeneratorStyle.SDK);
2121

2222
public override bool SupportsAnalyzers
2323
{

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ internal class VisualStudioForMacInstallation : VisualStudioInstallation
3131
new VersionPair(8,0, /* => */ 7,3),
3232
};
3333

34-
private static readonly IGenerator _generator = new LegacyStyleProjectGeneration();
34+
private static readonly IGenerator _generator = new DynamicGeneration(GeneratorStyle.Legacy);
3535

3636
public override bool SupportsAnalyzers
3737
{

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ internal class VisualStudioForWindowsInstallation : VisualStudioInstallation
4343
};
4444

4545
private static string _vsWherePath = null;
46-
private static readonly IGenerator _generator = new LegacyStyleProjectGeneration();
46+
private static readonly IGenerator _generator = GeneratorFactory.GetInstance(GeneratorStyle.Legacy);
4747

4848
public override bool SupportsAnalyzers
4949
{

0 commit comments

Comments
 (0)