in EnvDTE.Host/Callback/Util/ProjectExtensions.cs [151:185]
public static bool IsCPSProject([NotNull] this IProject project, Lifetime propertyWriteLifetime) =>
project.GetOrCreateProperty(propertyWriteLifetime, IsCPSPropertyKey, p =>
p.IsProjectFromUserView() && !p.IsSolutionFolder() &&
(p.IsDotNetCoreProject() || (p.IsSharedProject() && !IsCppProject(p)) || p.IsDockerComposeProject()
|| p.IsEcmaScriptProject() || IsFSharpProject(p) || IsServiceFabricProject(p)));
[PublicAPI]
private static bool IsFSharpProject([NotNull] this IProject project) =>
project.ProjectProperties.ProjectTypeGuids.LastOrDefault().ToString().Equals(FSharpProjectTypeGuid);
[PublicAPI]
public static bool IsCppProject([NotNull] this IProject project) => project.HasFlavour<CppProjectFlavor>();
[PublicAPI]
public static bool IsServiceFabricProject([NotNull] this IProject project) =>
project.HasFlavour<ServiceFabricProjectFlavor>();
/// <summary>
/// Returns the hierarchical path of the project as a list of project model item IDs.
/// This path is meant to be used with <c>ProjectImplementation.GetFromPath</c> on the client side to retrieve the project.
/// </summary>
[PublicAPI]
public static List<int> GetProjectPath([NotNull] this IProject project, ProjectModelViewHost viewHost) =>
project.GetPathChain().Select(viewHost.GetIdByItem).Reverse().ToList();
private static string CalculateProjectUniqueName([NotNull] IProject project)
{
if (project.IsMiscFilesProject()) return "<MiscFiles>";
if (project.IsSolutionFolder()) return $"{project.Name}{project.Guid.ToString("B").ToUpperInvariant()}";
var solutionDirPath = project.GetSolution().SolutionDirectory;
var projectFilePath = project.ProjectFileLocation;
return projectFilePath.MakeRelativeTo(solutionDirPath).FullPath;
}