Skip to content

Commit 8b3b4a0

Browse files
authored
Package v4.1 and Visualizers v4.6 (#131)
* Fixing Guid constant translation, re: #119 * Fixing various string concat issues, re: #120, #123 * Including cast parentheses in cast index access subject, re: #122 * Rendering string.Concat(Object) calls as method calls instead of concatenation, re: #116 * Fixing custom method conversion unary translation, re: #117 * Ading configuration option to show string.Concat() calls as-is * Fixing solution-item links * Updating to v4.1 * Updating NUnit test runner version * v4.1 NuGet package * Adding release notes * Updating release notes * Reverting assembly * Fixing install path miss with non-numeric install directory, re: #127 * Visualizer stability etc (#130) * Visualizer stability improvements, re: #121 * Adding string.Concat() menu item to visualizer * Updating version number * Adding separate VS17.6 visualizer * Switching build configurations * v4.6 installer + assemblies --------- Co-authored-by: Steve Wilkes <[email protected]> --------- Co-authored-by: Steve Wilkes <[email protected]>
1 parent 17bfbcc commit 8b3b4a0

File tree

56 files changed

+1343
-1010
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searcx below for content that may be hidden.

56 files changed

+1343
-1010
lines changed

‎src/ReadableExpressions.sln

+46-24
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "ReadableExpressions.UnitTes
8787
EndProject
8888
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReadableExpressions.UnitTests.Net7", "Tests\ReadableExpressions.UnitTests.Net7\ReadableExpressions.UnitTests.Net7.csproj", "{53A69151-1721-4ED5-BB65-6A750D46B133}"
8989
EndProject
90+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReadableExpressions.Visualizers.Vs17.6", "Visualizers\ReadableExpressions.Visualizers.Vs17.6\ReadableExpressions.Visualizers.Vs17.6.csproj", "{CAC4A53F-D4B9-4AD5-864A-F1141ECE91DA}"
91+
EndProject
92+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReadableExpressions.Visualizers.Vs17.6.ObjectSource", "Visualizers\ReadableExpressions.Visualizers.Vs17.6.ObjectSource\ReadableExpressions.Visualizers.Vs17.6.ObjectSource.csproj", "{EFF649F7-ABD2-49E6-BA1A-07BC34F89AA2}"
93+
EndProject
9094
Global
9195
GlobalSection(SolutionConfigurationPlatforms) = preSolution
9296
Debug|Any CPU = Debug|Any CPU
@@ -106,36 +110,36 @@ Global
106110
{A62B2409-1E63-41EB-A0CB-374B942903D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
107111
{A62B2409-1E63-41EB-A0CB-374B942903D0}.Debug|x86.ActiveCfg = Debug|Any CPU
108112
{A62B2409-1E63-41EB-A0CB-374B942903D0}.Debug|x86.Build.0 = Debug|Any CPU
109-
{A62B2409-1E63-41EB-A0CB-374B942903D0}.Release|Any CPU.ActiveCfg = Debug|Any CPU
110-
{A62B2409-1E63-41EB-A0CB-374B942903D0}.Release|Any CPU.Build.0 = Debug|Any CPU
113+
{A62B2409-1E63-41EB-A0CB-374B942903D0}.Release|Any CPU.ActiveCfg = Release|Any CPU
114+
{A62B2409-1E63-41EB-A0CB-374B942903D0}.Release|Any CPU.Build.0 = Release|Any CPU
111115
{A62B2409-1E63-41EB-A0CB-374B942903D0}.Release|x86.ActiveCfg = Release|Any CPU
112116
{A62B2409-1E63-41EB-A0CB-374B942903D0}.Release|x86.Build.0 = Release|Any CPU
113117
{ABDE919F-9341-4633-A004-0CBDEAB22797}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
114118
{ABDE919F-9341-4633-A004-0CBDEAB22797}.Debug|x86.ActiveCfg = Debug|Any CPU
115119
{ABDE919F-9341-4633-A004-0CBDEAB22797}.Debug|x86.Build.0 = Debug|Any CPU
116-
{ABDE919F-9341-4633-A004-0CBDEAB22797}.Release|Any CPU.ActiveCfg = Debug|Any CPU
117-
{ABDE919F-9341-4633-A004-0CBDEAB22797}.Release|Any CPU.Build.0 = Debug|Any CPU
120+
{ABDE919F-9341-4633-A004-0CBDEAB22797}.Release|Any CPU.ActiveCfg = Release|Any CPU
121+
{ABDE919F-9341-4633-A004-0CBDEAB22797}.Release|Any CPU.Build.0 = Release|Any CPU
118122
{ABDE919F-9341-4633-A004-0CBDEAB22797}.Release|x86.ActiveCfg = Release|Any CPU
119123
{ABDE919F-9341-4633-A004-0CBDEAB22797}.Release|x86.Build.0 = Release|Any CPU
120124
{19F8AD3E-61D6-41EC-828A-D51906014F8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
121125
{19F8AD3E-61D6-41EC-828A-D51906014F8B}.Debug|x86.ActiveCfg = Debug|Any CPU
122126
{19F8AD3E-61D6-41EC-828A-D51906014F8B}.Debug|x86.Build.0 = Debug|Any CPU
123-
{19F8AD3E-61D6-41EC-828A-D51906014F8B}.Release|Any CPU.ActiveCfg = Debug|Any CPU
124-
{19F8AD3E-61D6-41EC-828A-D51906014F8B}.Release|Any CPU.Build.0 = Debug|Any CPU
127+
{19F8AD3E-61D6-41EC-828A-D51906014F8B}.Release|Any CPU.ActiveCfg = Release|Any CPU
128+
{19F8AD3E-61D6-41EC-828A-D51906014F8B}.Release|Any CPU.Build.0 = Release|Any CPU
125129
{19F8AD3E-61D6-41EC-828A-D51906014F8B}.Release|x86.ActiveCfg = Release|Any CPU
126130
{19F8AD3E-61D6-41EC-828A-D51906014F8B}.Release|x86.Build.0 = Release|Any CPU
127131
{9152D600-47E1-49D8-9951-2C516F194902}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
128132
{9152D600-47E1-49D8-9951-2C516F194902}.Debug|x86.ActiveCfg = Debug|Any CPU
129133
{9152D600-47E1-49D8-9951-2C516F194902}.Debug|x86.Build.0 = Debug|Any CPU
130-
{9152D600-47E1-49D8-9951-2C516F194902}.Release|Any CPU.ActiveCfg = Debug|Any CPU
131-
{9152D600-47E1-49D8-9951-2C516F194902}.Release|Any CPU.Build.0 = Debug|Any CPU
134+
{9152D600-47E1-49D8-9951-2C516F194902}.Release|Any CPU.ActiveCfg = Release|Any CPU
135+
{9152D600-47E1-49D8-9951-2C516F194902}.Release|Any CPU.Build.0 = Release|Any CPU
132136
{9152D600-47E1-49D8-9951-2C516F194902}.Release|x86.ActiveCfg = Release|Any CPU
133137
{9152D600-47E1-49D8-9951-2C516F194902}.Release|x86.Build.0 = Release|Any CPU
134138
{27506162-46CD-4BB6-9734-1CCF8207529A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
135139
{27506162-46CD-4BB6-9734-1CCF8207529A}.Debug|x86.ActiveCfg = Debug|Any CPU
136140
{27506162-46CD-4BB6-9734-1CCF8207529A}.Debug|x86.Build.0 = Debug|Any CPU
137-
{27506162-46CD-4BB6-9734-1CCF8207529A}.Release|Any CPU.ActiveCfg = Debug|Any CPU
138-
{27506162-46CD-4BB6-9734-1CCF8207529A}.Release|Any CPU.Build.0 = Debug|Any CPU
141+
{27506162-46CD-4BB6-9734-1CCF8207529A}.Release|Any CPU.ActiveCfg = Release|Any CPU
142+
{27506162-46CD-4BB6-9734-1CCF8207529A}.Release|Any CPU.Build.0 = Release|Any CPU
139143
{27506162-46CD-4BB6-9734-1CCF8207529A}.Release|x86.ActiveCfg = Release|Any CPU
140144
{27506162-46CD-4BB6-9734-1CCF8207529A}.Release|x86.Build.0 = Release|Any CPU
141145
{147DDCCE-CDD3-4DD0-8BA3-D3F2F239E161}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
@@ -170,8 +174,8 @@ Global
170174
{4D0C6CF1-F71F-4648-97C7-C8F38E7E464E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
171175
{4D0C6CF1-F71F-4648-97C7-C8F38E7E464E}.Debug|x86.ActiveCfg = Debug|Any CPU
172176
{4D0C6CF1-F71F-4648-97C7-C8F38E7E464E}.Debug|x86.Build.0 = Debug|Any CPU
173-
{4D0C6CF1-F71F-4648-97C7-C8F38E7E464E}.Release|Any CPU.ActiveCfg = Debug|Any CPU
174-
{4D0C6CF1-F71F-4648-97C7-C8F38E7E464E}.Release|Any CPU.Build.0 = Debug|Any CPU
177+
{4D0C6CF1-F71F-4648-97C7-C8F38E7E464E}.Release|Any CPU.ActiveCfg = Release|Any CPU
178+
{4D0C6CF1-F71F-4648-97C7-C8F38E7E464E}.Release|Any CPU.Build.0 = Release|Any CPU
175179
{4D0C6CF1-F71F-4648-97C7-C8F38E7E464E}.Release|x86.ActiveCfg = Release|Any CPU
176180
{4D0C6CF1-F71F-4648-97C7-C8F38E7E464E}.Release|x86.Build.0 = Release|Any CPU
177181
{26270B39-08A9-47ED-AE24-73A81CA0FDDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
@@ -217,43 +221,43 @@ Global
217221
{4BF1ADEF-3ACF-4519-B9B0-11A7C5EABDEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
218222
{4BF1ADEF-3ACF-4519-B9B0-11A7C5EABDEC}.Debug|x86.ActiveCfg = Debug|Any CPU
219223
{4BF1ADEF-3ACF-4519-B9B0-11A7C5EABDEC}.Debug|x86.Build.0 = Debug|Any CPU
220-
{4BF1ADEF-3ACF-4519-B9B0-11A7C5EABDEC}.Release|Any CPU.ActiveCfg = Debug|Any CPU
221-
{4BF1ADEF-3ACF-4519-B9B0-11A7C5EABDEC}.Release|Any CPU.Build.0 = Debug|Any CPU
224+
{4BF1ADEF-3ACF-4519-B9B0-11A7C5EABDEC}.Release|Any CPU.ActiveCfg = Release|Any CPU
225+
{4BF1ADEF-3ACF-4519-B9B0-11A7C5EABDEC}.Release|Any CPU.Build.0 = Release|Any CPU
222226
{4BF1ADEF-3ACF-4519-B9B0-11A7C5EABDEC}.Release|x86.ActiveCfg = Release|Any CPU
223227
{4BF1ADEF-3ACF-4519-B9B0-11A7C5EABDEC}.Release|x86.Build.0 = Release|Any CPU
224228
{8327CEB4-7804-42E4-BD7C-B777986A816E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
225229
{8327CEB4-7804-42E4-BD7C-B777986A816E}.Debug|x86.ActiveCfg = Debug|Any CPU
226230
{8327CEB4-7804-42E4-BD7C-B777986A816E}.Debug|x86.Build.0 = Debug|Any CPU
227-
{8327CEB4-7804-42E4-BD7C-B777986A816E}.Release|Any CPU.ActiveCfg = Debug|Any CPU
228-
{8327CEB4-7804-42E4-BD7C-B777986A816E}.Release|Any CPU.Build.0 = Debug|Any CPU
231+
{8327CEB4-7804-42E4-BD7C-B777986A816E}.Release|Any CPU.ActiveCfg = Release|Any CPU
232+
{8327CEB4-7804-42E4-BD7C-B777986A816E}.Release|Any CPU.Build.0 = Release|Any CPU
229233
{8327CEB4-7804-42E4-BD7C-B777986A816E}.Release|x86.ActiveCfg = Release|Any CPU
230234
{8327CEB4-7804-42E4-BD7C-B777986A816E}.Release|x86.Build.0 = Release|Any CPU
231235
{DD325679-500F-4B26-85F7-015CC95D9718}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
232236
{DD325679-500F-4B26-85F7-015CC95D9718}.Debug|x86.ActiveCfg = Debug|Any CPU
233237
{DD325679-500F-4B26-85F7-015CC95D9718}.Debug|x86.Build.0 = Debug|Any CPU
234-
{DD325679-500F-4B26-85F7-015CC95D9718}.Release|Any CPU.ActiveCfg = Debug|Any CPU
235-
{DD325679-500F-4B26-85F7-015CC95D9718}.Release|Any CPU.Build.0 = Debug|Any CPU
238+
{DD325679-500F-4B26-85F7-015CC95D9718}.Release|Any CPU.ActiveCfg = Release|Any CPU
239+
{DD325679-500F-4B26-85F7-015CC95D9718}.Release|Any CPU.Build.0 = Release|Any CPU
236240
{DD325679-500F-4B26-85F7-015CC95D9718}.Release|x86.ActiveCfg = Release|Any CPU
237241
{DD325679-500F-4B26-85F7-015CC95D9718}.Release|x86.Build.0 = Release|Any CPU
238242
{3519A878-B8D6-437B-91E6-FCF124BC6465}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
239243
{3519A878-B8D6-437B-91E6-FCF124BC6465}.Debug|x86.ActiveCfg = Debug|Any CPU
240244
{3519A878-B8D6-437B-91E6-FCF124BC6465}.Debug|x86.Build.0 = Debug|Any CPU
241-
{3519A878-B8D6-437B-91E6-FCF124BC6465}.Release|Any CPU.ActiveCfg = Debug|Any CPU
242-
{3519A878-B8D6-437B-91E6-FCF124BC6465}.Release|Any CPU.Build.0 = Debug|Any CPU
245+
{3519A878-B8D6-437B-91E6-FCF124BC6465}.Release|Any CPU.ActiveCfg = Release|Any CPU
246+
{3519A878-B8D6-437B-91E6-FCF124BC6465}.Release|Any CPU.Build.0 = Release|Any CPU
243247
{3519A878-B8D6-437B-91E6-FCF124BC6465}.Release|x86.ActiveCfg = Release|Any CPU
244248
{3519A878-B8D6-437B-91E6-FCF124BC6465}.Release|x86.Build.0 = Release|Any CPU
245249
{170EE1BF-C862-4683-8CD1-C5EAFCBD4B52}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
246250
{170EE1BF-C862-4683-8CD1-C5EAFCBD4B52}.Debug|x86.ActiveCfg = Debug|Any CPU
247251
{170EE1BF-C862-4683-8CD1-C5EAFCBD4B52}.Debug|x86.Build.0 = Debug|Any CPU
248-
{170EE1BF-C862-4683-8CD1-C5EAFCBD4B52}.Release|Any CPU.ActiveCfg = Debug|Any CPU
249-
{170EE1BF-C862-4683-8CD1-C5EAFCBD4B52}.Release|Any CPU.Build.0 = Debug|Any CPU
252+
{170EE1BF-C862-4683-8CD1-C5EAFCBD4B52}.Release|Any CPU.ActiveCfg = Release|Any CPU
253+
{170EE1BF-C862-4683-8CD1-C5EAFCBD4B52}.Release|Any CPU.Build.0 = Release|Any CPU
250254
{170EE1BF-C862-4683-8CD1-C5EAFCBD4B52}.Release|x86.ActiveCfg = Release|Any CPU
251255
{170EE1BF-C862-4683-8CD1-C5EAFCBD4B52}.Release|x86.Build.0 = Release|Any CPU
252256
{DA28DD2A-8D1B-4976-AD3C-69F80C1165E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
253257
{DA28DD2A-8D1B-4976-AD3C-69F80C1165E8}.Debug|x86.ActiveCfg = Debug|Any CPU
254258
{DA28DD2A-8D1B-4976-AD3C-69F80C1165E8}.Debug|x86.Build.0 = Debug|Any CPU
255-
{DA28DD2A-8D1B-4976-AD3C-69F80C1165E8}.Release|Any CPU.ActiveCfg = Debug|Any CPU
256-
{DA28DD2A-8D1B-4976-AD3C-69F80C1165E8}.Release|Any CPU.Build.0 = Debug|Any CPU
259+
{DA28DD2A-8D1B-4976-AD3C-69F80C1165E8}.Release|Any CPU.ActiveCfg = Release|Any CPU
260+
{DA28DD2A-8D1B-4976-AD3C-69F80C1165E8}.Release|Any CPU.Build.0 = Release|Any CPU
257261
{DA28DD2A-8D1B-4976-AD3C-69F80C1165E8}.Release|x86.ActiveCfg = Release|Any CPU
258262
{DA28DD2A-8D1B-4976-AD3C-69F80C1165E8}.Release|x86.Build.0 = Release|Any CPU
259263
{7000A01B-B4DA-4F30-87FF-B3EA4057BBE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
@@ -334,6 +338,22 @@ Global
334338
{53A69151-1721-4ED5-BB65-6A750D46B133}.Release|Any CPU.Build.0 = Release|Any CPU
335339
{53A69151-1721-4ED5-BB65-6A750D46B133}.Release|x86.ActiveCfg = Release|Any CPU
336340
{53A69151-1721-4ED5-BB65-6A750D46B133}.Release|x86.Build.0 = Release|Any CPU
341+
{CAC4A53F-D4B9-4AD5-864A-F1141ECE91DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
342+
{CAC4A53F-D4B9-4AD5-864A-F1141ECE91DA}.Debug|Any CPU.Build.0 = Debug|Any CPU
343+
{CAC4A53F-D4B9-4AD5-864A-F1141ECE91DA}.Debug|x86.ActiveCfg = Debug|Any CPU
344+
{CAC4A53F-D4B9-4AD5-864A-F1141ECE91DA}.Debug|x86.Build.0 = Debug|Any CPU
345+
{CAC4A53F-D4B9-4AD5-864A-F1141ECE91DA}.Release|Any CPU.ActiveCfg = Release|Any CPU
346+
{CAC4A53F-D4B9-4AD5-864A-F1141ECE91DA}.Release|Any CPU.Build.0 = Release|Any CPU
347+
{CAC4A53F-D4B9-4AD5-864A-F1141ECE91DA}.Release|x86.ActiveCfg = Release|Any CPU
348+
{CAC4A53F-D4B9-4AD5-864A-F1141ECE91DA}.Release|x86.Build.0 = Release|Any CPU
349+
{EFF649F7-ABD2-49E6-BA1A-07BC34F89AA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
350+
{EFF649F7-ABD2-49E6-BA1A-07BC34F89AA2}.Debug|Any CPU.Build.0 = Debug|Any CPU
351+
{EFF649F7-ABD2-49E6-BA1A-07BC34F89AA2}.Debug|x86.ActiveCfg = Debug|Any CPU
352+
{EFF649F7-ABD2-49E6-BA1A-07BC34F89AA2}.Debug|x86.Build.0 = Debug|Any CPU
353+
{EFF649F7-ABD2-49E6-BA1A-07BC34F89AA2}.Release|Any CPU.ActiveCfg = Release|Any CPU
354+
{EFF649F7-ABD2-49E6-BA1A-07BC34F89AA2}.Release|Any CPU.Build.0 = Release|Any CPU
355+
{EFF649F7-ABD2-49E6-BA1A-07BC34F89AA2}.Release|x86.ActiveCfg = Release|Any CPU
356+
{EFF649F7-ABD2-49E6-BA1A-07BC34F89AA2}.Release|x86.Build.0 = Release|Any CPU
337357
EndGlobalSection
338358
GlobalSection(SolutionProperties) = preSolution
339359
HideSolutionNode = FALSE
@@ -372,6 +392,8 @@ Global
372392
{C00A01BD-4C32-4C77-975B-D3D7CE1AC8B1} = {E2401C71-C5F2-46FB-B5A3-E6EFB85106B9}
373393
{5AA5C674-F7FE-4FF5-98B6-03C9F9B70D1B} = {E2401C71-C5F2-46FB-B5A3-E6EFB85106B9}
374394
{53A69151-1721-4ED5-BB65-6A750D46B133} = {E2401C71-C5F2-46FB-B5A3-E6EFB85106B9}
395+
{CAC4A53F-D4B9-4AD5-864A-F1141ECE91DA} = {4A12EE3E-81ED-4842-A69F-9D15413DC46D}
396+
{EFF649F7-ABD2-49E6-BA1A-07BC34F89AA2} = {4A12EE3E-81ED-4842-A69F-9D15413DC46D}
375397
EndGlobalSection
376398
GlobalSection(ExtensibilityGlobals) = postSolution
377399
SolutionGuid = {7EFE121E-7A84-43A4-8C76-7EE70DF2736A}

‎src/Visualizers/CommonVisualizerAssemblyInfo.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@
44
[assembly: AssemblyCompany("AgileObjects")]
55
[assembly: AssemblyProduct("ReadableExpressions.Visualizers")]
66

7-
[assembly: AssemblyVersion("4.5.0")]
8-
[assembly: AssemblyFileVersion("4.5.0")]
7+
[assembly: AssemblyVersion("4.6.0")]
8+
[assembly: AssemblyFileVersion("4.6.0")]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
namespace AgileObjects.ReadableExpressions.Visualizers.Installer.Custom;
2+
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Diagnostics;
6+
using System.IO;
7+
using System.Linq;
8+
using Microsoft.Win32;
9+
10+
internal class Post2015VsInstallation : IDisposable
11+
{
12+
private static readonly Dictionary<int, Version> _vsVersionsByYear = Visualizer
13+
.VsYearByVersionNumber
14+
.Select(kvp => new { Version = kvp.Key, Year = kvp.Value })
15+
.Where(_ => _.Year > 2015)
16+
.GroupBy(_ => _.Year)
17+
.ToDictionary(yearGroup => yearGroup.Key, yearGroup => yearGroup
18+
.Select(_ => _.Version)
19+
.OrderBy(version => version)
20+
.Last());
21+
22+
private readonly Version _vsVersion;
23+
private bool _hasVisualizer;
24+
25+
public Post2015VsInstallation(RegistryKey post2015Key)
26+
{
27+
RegistryKey = post2015Key;
28+
29+
using (var capabilitiesKey = post2015Key.OpenSubKey("Capabilities"))
30+
{
31+
InstallDirectory = GetInstallPath(capabilitiesKey);
32+
_vsVersion = GetVsFullVersion(capabilitiesKey, InstallDirectory);
33+
}
34+
35+
IsValid = _vsVersion != null && InstallDirectory != null;
36+
}
37+
38+
#region Setup
39+
40+
private static string GetInstallPath(RegistryKey capabilitiesKey)
41+
{
42+
var installPath = capabilitiesKey.GetValue("ApplicationDescription") as string;
43+
44+
if (string.IsNullOrWhiteSpace(installPath))
45+
{
46+
return null;
47+
}
48+
49+
var indexOfIde = installPath.IndexOf("IDE", StringComparison.OrdinalIgnoreCase);
50+
51+
if (indexOfIde == -1)
52+
{
53+
return null;
54+
}
55+
56+
installPath = installPath.Substring(0, indexOfIde + "IDE".Length);
57+
58+
if (installPath.StartsWith("@", StringComparison.Ordinal))
59+
{
60+
installPath = installPath.Substring(1);
61+
}
62+
63+
return Directory.Exists(installPath) ? installPath : null;
64+
}
65+
66+
private static Version GetVsFullVersion(
67+
RegistryKey capabilitiesKey,
68+
string installDirectory)
69+
{
70+
return
71+
GetVsFullVersion(
72+
installDirectory,
73+
Path.DirectorySeparatorChar,
74+
Path.AltDirectorySeparatorChar) ??
75+
GetVsFullVersion(
76+
capabilitiesKey.GetValue("ApplicationName") as string,
77+
' ');
78+
}
79+
80+
private static Version GetVsFullVersion(
81+
string installPath,
82+
params char[] pathSplitCharacters)
83+
{
84+
if (string.IsNullOrWhiteSpace(installPath))
85+
{
86+
return null;
87+
}
88+
89+
if (TryGetDevEnvVersion(installPath, out var version))
90+
{
91+
return version;
92+
}
93+
94+
var vsYearNumber = installPath
95+
.Trim()
96+
.Split(pathSplitCharacters)
97+
.Reverse()
98+
.Select(segment => int.TryParse(segment, out var yearNumber) ? yearNumber : default(int?))
99+
.FirstOrDefault(yearNumber =>
100+
yearNumber.HasValue &&
101+
_vsVersionsByYear.ContainsKey(yearNumber.Value));
102+
103+
return vsYearNumber.HasValue
104+
? _vsVersionsByYear[vsYearNumber.Value]
105+
: null;
106+
}
107+
108+
private static bool TryGetDevEnvVersion(
109+
string installPath,
110+
out Version vsVersion)
111+
{
112+
try
113+
{
114+
var devEnvFileInfo =
115+
new FileInfo(Path.Combine(installPath, "devenv.exe"));
116+
117+
if (!devEnvFileInfo.Exists)
118+
{
119+
vsVersion = null;
120+
return false;
121+
}
122+
123+
var versionInfo = FileVersionInfo
124+
.GetVersionInfo(devEnvFileInfo.FullName);
125+
126+
vsVersion = new(versionInfo.FileMajorPart, versionInfo.FileMinorPart);
127+
return true;
128+
}
129+
catch
130+
{
131+
vsVersion = null;
132+
return false;
133+
}
134+
}
135+
136+
#endregion
137+
138+
public bool IsValid { get; }
139+
140+
public RegistryKey RegistryKey { get; }
141+
142+
public string InstallDirectory { get; }
143+
144+
public bool ShouldInstall(Version visualizerVsVersion)
145+
{
146+
if (_hasVisualizer)
147+
{
148+
return false;
149+
}
150+
151+
if (_vsVersion.Major == visualizerVsVersion.Major &&
152+
_vsVersion.Minor >= visualizerVsVersion.Minor)
153+
{
154+
_hasVisualizer = true;
155+
return true;
156+
}
157+
158+
return false;
159+
}
160+
161+
public void Dispose() => RegistryKey.Dispose();
162+
}

‎src/Visualizers/Installation/ReadableExpressions.Visualizers.Installer.Custom/ReadableExpressions.Visualizers.Installer.Custom.csproj

+13-7
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
<Compile Include="VisualizerInstaller.cs" />
5959
<Compile Include="VsixManifest.cs" />
6060
<Compile Include="VsixManifestInstaller.cs" />
61-
<Compile Include="VsPost2015Data.cs" />
61+
<Compile Include="Post2015VsInstallation.cs" />
6262
<EmbeddedResource Include="extension.vsixmanifest">
6363
<SubType>Designer</SubType>
6464
</EmbeddedResource>
@@ -98,18 +98,24 @@
9898
<EmbeddedResource Include="..\..\VisualizerAssemblies\AgileObjects.ReadableExpressions.Visualizers.Vs16.ObjectSource.dll">
9999
<Link>AgileObjects.ReadableExpressions.Visualizers.Vs16.ObjectSource.dll</Link>
100100
</EmbeddedResource>
101-
<EmbeddedResource Include="..\..\VisualizerAssemblies\AgileObjects.NetStandardPolyfills.dll">
102-
<Link>AgileObjects.NetStandardPolyfills.dll</Link>
103-
</EmbeddedResource>
104-
<EmbeddedResource Include="..\..\VisualizerAssemblies\AgileObjects.ReadableExpressions.dll">
105-
<Link>AgileObjects.ReadableExpressions.dll</Link>
106-
</EmbeddedResource>
107101
<EmbeddedResource Include="..\..\VisualizerAssemblies\AgileObjects.ReadableExpressions.Visualizers.Vs17.dll">
108102
<Link>AgileObjects.ReadableExpressions.Visualizers.Vs17.dll</Link>
109103
</EmbeddedResource>
110104
<EmbeddedResource Include="..\..\VisualizerAssemblies\AgileObjects.ReadableExpressions.Visualizers.Vs17.ObjectSource.dll">
111105
<Link>AgileObjects.ReadableExpressions.Visualizers.Vs17.ObjectSource.dll</Link>
112106
</EmbeddedResource>
107+
<EmbeddedResource Include="..\..\VisualizerAssemblies\AgileObjects.ReadableExpressions.Visualizers.Vs17.6.dll">
108+
<Link>AgileObjects.ReadableExpressions.Visualizers.Vs17.6.dll</Link>
109+
</EmbeddedResource>
110+
<EmbeddedResource Include="..\..\VisualizerAssemblies\AgileObjects.ReadableExpressions.Visualizers.Vs17.6.ObjectSource.dll">
111+
<Link>AgileObjects.ReadableExpressions.Visualizers.Vs17.6.ObjectSource.dll</Link>
112+
</EmbeddedResource>
113+
<EmbeddedResource Include="..\..\VisualizerAssemblies\AgileObjects.NetStandardPolyfills.dll">
114+
<Link>AgileObjects.NetStandardPolyfills.dll</Link>
115+
</EmbeddedResource>
116+
<EmbeddedResource Include="..\..\VisualizerAssemblies\AgileObjects.ReadableExpressions.dll">
117+
<Link>AgileObjects.ReadableExpressions.dll</Link>
118+
</EmbeddedResource>
113119
<Content Include="CustomAction.config" />
114120
</ItemGroup>
115121
<ItemGroup>

0 commit comments

Comments
 (0)