From ca47896204482bf4a6979e3838bf7f09f61cebeb Mon Sep 17 00:00:00 2001
From: giy <giy@omp-system.ru>
Date: Fri, 02 Sep 2022 14:16:56 +0300
Subject: [PATCH] Обновление до версии 2.9.0
---
QtVsTools.Core/QtProject.cs | 944 ++++++++++++----------------------------------------------
1 files changed, 197 insertions(+), 747 deletions(-)
diff --git a/QtVsTools.Core/QtProject.cs b/QtVsTools.Core/QtProject.cs
index 613b4e5..a935f54 100644
--- a/QtVsTools.Core/QtProject.cs
+++ b/QtVsTools.Core/QtProject.cs
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2022 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt VS Tools.
@@ -26,22 +26,22 @@
**
****************************************************************************/
-using EnvDTE;
-using Microsoft.VisualStudio.VCProjectEngine;
using System;
-using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
-using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
-using QtVsTools.Core.QtMsBuild;
+using Microsoft.VisualStudio.Shell;
+using Microsoft.VisualStudio.VCProjectEngine;
+using EnvDTE;
namespace QtVsTools.Core
{
+ using QtMsBuild;
+
/// <summary>
/// QtProject holds the Qt specific properties for a Visual Studio project.
/// There exists at most one QtProject per EnvDTE.Project.
@@ -54,13 +54,14 @@
private VCProject vcPro;
private MocCmdChecker mocCmdChecker;
private Array lastConfigurationRowNames;
- private static Dictionary<Project, QtProject> instances = new Dictionary<Project, QtProject>();
- private QtMsBuildContainer qtMsBuild;
+ private static readonly Dictionary<Project, QtProject> instances = new Dictionary<Project, QtProject>();
+ private readonly QtMsBuildContainer qtMsBuild;
public static QtVsTools.VisualStudio.IProjectTracker ProjectTracker { get; set; }
public static QtProject Create(VCProject vcProject)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
return Create((Project)vcProject.Object);
}
@@ -81,6 +82,8 @@
private QtProject(Project project)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (project == null)
throw new QtVSException(SR.GetString("QtProject_CannotConstructWithoutValidProject"));
envPro = project;
@@ -105,35 +108,10 @@
return string.Empty;
try {
return config.GetEvaluatedPropertyValue(itemType + "RuleName");
- } catch (Exception e) {
- System.Diagnostics.Debug.WriteLine(
- e.Message + "\r\n\r\nStacktrace:\r\n" + e.StackTrace);
+ } catch (Exception exception) {
+ exception.Log();
return string.Empty;
}
- }
-
- public static string GetRuleName(VCProject project, string itemType)
- {
- if (project == null)
- return string.Empty;
- var configs = project.Configurations as IVCCollection;
- if (configs.Count == 0)
- return string.Empty;
- try {
- var firstConfig = configs.Item(1) as VCConfiguration;
- if (firstConfig == null)
- return string.Empty;
- return GetRuleName(firstConfig, itemType);
- } catch (Exception e) {
- System.Diagnostics.Debug.WriteLine(
- e.Message + "\r\n\r\nStacktrace:\r\n" + e.StackTrace);
- return string.Empty;
- }
- }
-
- public string GetRuleName(string itemType)
- {
- return GetRuleName(vcPro, itemType);
}
public static bool IsQtMsBuildEnabled(VCProject project)
@@ -157,6 +135,8 @@
public static bool IsQtMsBuildEnabled(Project project)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (project == null)
return false;
return IsQtMsBuildEnabled(project.Object as VCProject);
@@ -165,6 +145,8 @@
private bool? isQtMsBuildEnabled = null;
public bool IsQtMsBuildEnabled()
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (!isQtMsBuildEnabled.HasValue) {
if (vcPro != null)
isQtMsBuildEnabled = IsQtMsBuildEnabled(vcPro);
@@ -192,6 +174,8 @@
{
get
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var ret = false;
if (lastConfigurationRowNames == null) {
lastConfigurationRowNames = envPro.ConfigurationManager.ConfigurationRowNames as Array;
@@ -213,6 +197,8 @@
/// <param name="uiFile">name of the ui file</param>
public string GetUiGeneratedFileName(string uiFile)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var fi = new FileInfo(uiFile);
var file = fi.Name;
if (HelperFunctions.IsUicFile(file)) {
@@ -248,8 +234,11 @@
/// replaced by the value of configName.
/// <param name="file">full file name of either the header or the source file</param>
/// <returns></returns>
- private string GetRelativeMocFilePath(string file, string configName, string platformName)
+ private string GetRelativeMocFilePath(string file, string configName = null,
+ string platformName = null)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var fileName = GetMocFileName(file);
if (fileName == null)
return null;
@@ -260,65 +249,38 @@
return mocDir;
}
- /// <summary>
- /// Returns the file name of the generated moc file relative to the
- /// project directory.
- /// </summary>
- /// The returned file path may contain the macros $(ConfigurationName) and $(PlatformName).
- /// <param name="file">full file name of either the header or the source file</param>
- /// <returns></returns>
- private string GetRelativeMocFilePath(string file)
- {
- return GetRelativeMocFilePath(file, null, null);
- }
-
- /// <summary>
- /// Marks the specified project as a Qt project.
- /// </summary>
- public void MarkAsQtProject()
- {
- vcPro.keyword = string.Format("{0}_v{1}",
- Resources.qtProjectKeyword, Resources.qtProjectFormatVersion);
- }
-
public static int GetFormatVersion(VCProject vcPro)
{
if (vcPro == null)
return 0;
- if (vcPro.keyword.StartsWith(Resources.qtProjectKeyword,
- StringComparison.InvariantCultureIgnoreCase)) {
+ if (vcPro.keyword.StartsWith(Resources.qtProjectKeyword, StringComparison.Ordinal))
return Convert.ToInt32(vcPro.keyword.Substring(6));
- } else if (vcPro.keyword.StartsWith(Resources.qtProjectV2Keyword,
- StringComparison.InvariantCultureIgnoreCase)) {
+ if (vcPro.keyword.StartsWith(Resources.qtProjectV2Keyword, StringComparison.Ordinal))
return 200;
- } else {
- return 0;
- }
+ return 0;
}
public static int GetFormatVersion(Project pro)
{
- if (pro == null)
- return 0;
- return GetFormatVersion(pro.Object as VCProject);
+ ThreadHelper.ThrowIfNotOnUIThread();
+ return GetFormatVersion(pro?.Object as VCProject);
}
- public int FormatVersion { get { return GetFormatVersion(Project); } }
-
- public string GetPropertyValue(string propName)
+ public int FormatVersion
{
- return GetPropertyValue(Project, propName);
- }
-
- public string GetPropertyValue(string configName, string platformName, string propName)
- {
- return GetPropertyValue(Project, configName, platformName, propName);
+ get
+ {
+ ThreadHelper.ThrowIfNotOnUIThread();
+ return GetFormatVersion(Project);
+ }
}
public static string GetPropertyValue(
EnvDTE.Project dteProject,
string propName)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var activeConfig = dteProject.ConfigurationManager?.ActiveConfiguration;
if (activeConfig == null)
return null;
@@ -331,6 +293,8 @@
EnvDTE.Configuration dteConfig,
string propName)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (dteProject == null || dteConfig == null)
return null;
return GetPropertyValue(
@@ -338,16 +302,6 @@
dteConfig.ConfigurationName,
dteConfig.PlatformName,
propName);
- }
-
- public static string GetPropertyValue(
- EnvDTE.Project dteProject,
- string configName,
- string platformName,
- string propName)
- {
- return GetPropertyValue(
- dteProject.Object as VCProject, configName, platformName, propName);
}
public static string GetPropertyValue(
@@ -374,123 +328,10 @@
return vcConfig.GetEvaluatedPropertyValue(propName);
}
- public void AddDefine(string define, uint bldConf)
- {
- foreach (VCConfiguration config in (IVCCollection)vcPro.Configurations) {
- var compiler = CompilerToolWrapper.Create(config);
-
- if (((!IsDebugConfiguration(config)) && ((bldConf & BuildConfig.Release) != 0)) ||
- ((IsDebugConfiguration(config)) && ((bldConf & BuildConfig.Debug) != 0))) {
- compiler.AddPreprocessorDefinition(define);
- }
- }
- }
-
- public void AddModule(int id)
- {
- if (HasModule(id))
- return;
-
- var vm = QtVersionManager.The();
- var versionInfo = vm.GetVersionInfo(Project);
- if (versionInfo == null)
- versionInfo = vm.GetVersionInfo(vm.GetDefaultVersion());
-
- foreach (VCConfiguration config in (IVCCollection)vcPro.Configurations) {
-
- var info = QtModules.Instance.Module(id);
- if (FormatVersion >= Resources.qtMinFormatVersion_Settings) {
- var config3 = config as VCConfiguration3;
- if (config3 == null)
- continue;
- if (!string.IsNullOrEmpty(info.proVarQT)) {
- var qtModulesValue = config.GetUnevaluatedPropertyValue("QtModules");
- var qtModules = new HashSet<string>(
- !string.IsNullOrEmpty(qtModulesValue)
- ? qtModulesValue.Split(';')
- : new string[] { });
- qtModules.UnionWith(info.proVarQT.Split(' '));
- config3.SetPropertyValue(Resources.projLabelQtSettings, true,
- "QtModules", string.Join(";", qtModules));
- }
- // In V3 project format, compiler and linker options
- // required by modules are set by Qt/MSBuild.
- continue;
- }
-
- var compiler = CompilerToolWrapper.Create(config);
- var linker = (VCLinkerTool)((IVCCollection)config.Tools).Item("VCLinkerTool");
-
- if (compiler != null) {
- foreach (var define in info.Defines)
- compiler.AddPreprocessorDefinition(define);
-
- var incPathList = info.GetIncludePath();
- foreach (var incPath in incPathList)
- compiler.AddAdditionalIncludeDirectories(incPath);
- }
- if (linker != null) {
- var moduleLibs = info.GetLibs(IsDebugConfiguration(config), versionInfo);
- var linkerWrapper = new LinkerToolWrapper(linker);
- var additionalDeps = linkerWrapper.AdditionalDependencies;
- var dependenciesChanged = false;
- if (additionalDeps == null || additionalDeps.Count == 0) {
- additionalDeps = moduleLibs;
- dependenciesChanged = true;
- } else {
- foreach (var moduleLib in moduleLibs) {
- if (!additionalDeps.Contains(moduleLib)) {
- additionalDeps.Add(moduleLib);
- dependenciesChanged = true;
- }
- }
- }
- if (dependenciesChanged)
- linkerWrapper.AdditionalDependencies = additionalDeps;
- }
- }
- }
-
- public void RemoveModule(int id)
- {
- foreach (VCConfiguration config in (IVCCollection)vcPro.Configurations) {
- var compiler = CompilerToolWrapper.Create(config);
- var linker = (VCLinkerTool)((IVCCollection)config.Tools).Item("VCLinkerTool");
-
- var info = QtModules.Instance.Module(id);
- if (compiler != null) {
- foreach (var define in info.Defines)
- compiler.RemovePreprocessorDefinition(define);
- var additionalIncludeDirs = compiler.AdditionalIncludeDirectories;
- if (additionalIncludeDirs != null) {
- var lst = new List<string>(additionalIncludeDirs);
- foreach (var includePath in info.IncludePath) {
- lst.Remove(includePath);
- lst.Remove('\"' + includePath + '\"');
- }
- compiler.AdditionalIncludeDirectories = lst;
- }
- }
- if (linker != null && linker.AdditionalDependencies != null) {
- var linkerWrapper = new LinkerToolWrapper(linker);
- var vm = QtVersionManager.The();
- var versionInfo = vm.GetVersionInfo(Project);
- if (versionInfo == null)
- versionInfo = vm.GetVersionInfo(vm.GetDefaultVersion());
-
- var moduleLibs = info.GetLibs(IsDebugConfiguration(config), versionInfo);
- var additionalDependencies = linkerWrapper.AdditionalDependencies;
- var dependenciesChanged = false;
- foreach (var moduleLib in moduleLibs)
- dependenciesChanged |= additionalDependencies.Remove(moduleLib);
- if (dependenciesChanged)
- linkerWrapper.AdditionalDependencies = additionalDependencies;
- }
- }
- }
-
public void UpdateModules(VersionInformation oldVersion, VersionInformation newVersion)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
foreach (VCConfiguration config in (IVCCollection)vcPro.Configurations) {
var linker = (VCLinkerTool)((IVCCollection)config.Tools).Item("VCLinkerTool");
@@ -500,7 +341,7 @@
var additionalDependencies = linkerWrapper.AdditionalDependencies;
var libsDesktop = new List<string>();
- foreach (var module in QtModules.Instance.GetAvailableModules()) {
+ foreach (var module in QtModules.Instance.GetAvailableModules(newVersion.qtMajor)) {
if (HasModule(module.Id))
libsDesktop.AddRange(module.AdditionalLibraries);
}
@@ -538,133 +379,11 @@
}
}
+ // TODO: remove once all callers are moved into Legacy namespace
public bool HasModule(int id)
{
- var foundInIncludes = false;
- var foundInLibs = false;
-
- var vm = QtVersionManager.The();
- var versionInfo = vm.GetVersionInfo(Project);
- if (versionInfo == null)
- versionInfo = vm.GetVersionInfo(vm.GetDefaultVersion());
- if (versionInfo == null)
- return false; // neither a default or project Qt version
- var info = QtModules.Instance.Module(id);
- if (info == null)
- return false;
-
- foreach (VCConfiguration config in (IVCCollection)vcPro.Configurations) {
- var compiler = CompilerToolWrapper.Create(config);
- var linker = (VCLinkerTool)((IVCCollection)config.Tools).Item("VCLinkerTool");
-
- if (compiler != null) {
- if (compiler.GetAdditionalIncludeDirectories() == null)
- continue;
- var incPathList = info.GetIncludePath();
- var includeDirs = compiler.GetAdditionalIncludeDirectoriesList();
- foundInIncludes = (incPathList.Count > 0);
- foreach (var incPath in incPathList) {
- var fixedIncludeDir = FixFilePathForComparison(incPath);
- if (!includeDirs.Any(dir =>
- FixFilePathForComparison(dir) == fixedIncludeDir)) {
- foundInIncludes = false;
- break;
- }
- }
- }
-
- if (foundInIncludes)
- break;
-
- List<string> libs = null;
- if (linker != null) {
- var linkerWrapper = new LinkerToolWrapper(linker);
- libs = linkerWrapper.AdditionalDependencies;
- }
-
- if (libs != null) {
- var moduleLibs = info.GetLibs(IsDebugConfiguration(config), versionInfo);
- foundInLibs = moduleLibs.All(moduleLib => libs.Contains(moduleLib));
- }
- }
- return foundInIncludes || foundInLibs;
- }
-
- public void WriteProjectBasicConfigurations(uint type, bool usePrecompiledHeader)
- {
- WriteProjectBasicConfigurations(type, usePrecompiledHeader, null);
- }
-
- public void WriteProjectBasicConfigurations(uint type, bool usePrecompiledHeader, VersionInformation vi)
- {
- var configType = ConfigurationTypes.typeApplication;
- var targetExtension = ".exe";
- string qtVersion = null;
- var vm = QtVersionManager.The();
- if (vi == null) {
- qtVersion = vm.GetDefaultVersion();
- vi = vm.GetVersionInfo(qtVersion);
- }
-
- switch (type & TemplateType.ProjectType) {
- case TemplateType.DynamicLibrary:
- configType = ConfigurationTypes.typeDynamicLibrary;
- targetExtension = ".dll";
- break;
- case TemplateType.StaticLibrary:
- configType = ConfigurationTypes.typeStaticLibrary;
- targetExtension = ".lib";
- break;
- }
-
- foreach (VCConfiguration config in (IVCCollection)vcPro.Configurations) {
- config.ConfigurationType = configType;
- var compiler = CompilerToolWrapper.Create(config);
- var linker = (VCLinkerTool)((IVCCollection)config.Tools).Item("VCLinkerTool");
- var librarian = (VCLibrarianTool)((IVCCollection)config.Tools).Item("VCLibrarianTool");
-
- if (linker != null) {
- if ((type & TemplateType.ConsoleSystem) != 0)
- linker.SubSystem = subSystemOption.subSystemConsole;
- else
- linker.SubSystem = subSystemOption.subSystemWindows;
-
- linker.OutputFile = "$(OutDir)\\$(ProjectName)" + targetExtension;
- } else {
- librarian.OutputFile = "$(OutDir)\\$(ProjectName)" + targetExtension;
- }
-
- if ((type & TemplateType.PluginProject) != 0)
- compiler.AddPreprocessorDefinition("QT_PLUGIN");
-
- var isDebugConfiguration = false;
- if (config.Name.StartsWith("Release", StringComparison.Ordinal)) {
- compiler.SetDebugInformationFormat(debugOption.debugDisabled);
- compiler.RuntimeLibrary = runtimeLibraryOption.rtMultiThreadedDLL;
- } else if (config.Name.StartsWith("Debug", StringComparison.Ordinal)) {
- isDebugConfiguration = true;
- compiler.SetOptimization(optimizeOption.optimizeDisabled);
- compiler.SetDebugInformationFormat(debugOption.debugEnabled);
- compiler.RuntimeLibrary = runtimeLibraryOption.rtMultiThreadedDebugDLL;
- }
-
- compiler.SetTreatWChar_tAsBuiltInType(true);
-
- if (linker != null)
- linker.GenerateDebugInformation = isDebugConfiguration;
-
- if (usePrecompiledHeader)
- UsePrecompiledHeaders(config);
- }
- if ((type & TemplateType.PluginProject) != 0)
- MarkAsDesignerPluginProject();
- }
-
- public void MarkAsDesignerPluginProject()
- {
- Project.Globals["IsDesignerPlugin"] = true.ToString();
- if (!Project.Globals.get_VariablePersists("IsDesignerPlugin"))
- Project.Globals.set_VariablePersists("IsDesignerPlugin", true);
+ ThreadHelper.ThrowIfNotOnUIThread();
+ return Legacy.QtProject.HasModule(envPro, id);
}
public void AddUic4BuildStepMsBuild(
@@ -672,8 +391,7 @@
string description,
string outputFile)
{
- var file = config.File as VCFile;
- if (file != null)
+ if (config.File is VCFile file)
file.ItemType = QtUic.ItemTypeName;
qtMsBuild.SetItemProperty(config, QtUic.Property.ExecutionDescription, description);
qtMsBuild.SetItemProperty(config, QtUic.Property.OutputFile, outputFile);
@@ -701,6 +419,8 @@
/// <param name="file">file</param>
public void AddUic4BuildStep(VCFile file)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (GetFormatVersion(vcPro) >= Resources.qtMinFormatVersion_Settings) {
file.ItemType = QtUic.ItemTypeName;
return;
@@ -736,7 +456,7 @@
}
}
if (toolSettings == CustomTool.CustomBuildStep && !uiFileExists)
- AddFileInFilter(Filters.GeneratedFiles(), uiFile);
+ AddFileInFilter(Filters.GeneratedFiles(), uiFile, false);
} catch {
throw new QtVSException(SR.GetString("QtProject_CannotAddUicStep", file.FullPath));
}
@@ -796,15 +516,15 @@
public string GetDefines(VCFileConfiguration conf)
{
var defines = string.Empty;
- var propsFile = conf.Tool as IVCRulePropertyStorage;
- var projectConfig = conf.ProjectConfiguration as VCConfiguration;
- var propsProject = projectConfig.Rules.Item("CL") as IVCRulePropertyStorage;
- if (propsFile != null) {
+ if (conf.Tool is IVCRulePropertyStorage propsFile) {
try {
defines = propsFile.GetUnevaluatedPropertyValue("PreprocessorDefinitions");
} catch { }
}
- if (string.IsNullOrEmpty(defines) && propsProject != null) {
+
+ var projectConfig = conf.ProjectConfiguration as VCConfiguration;
+ if (string.IsNullOrEmpty(defines)
+ && projectConfig?.Rules.Item("CL") is IVCRulePropertyStorage propsProject) {
try {
defines = propsProject.GetUnevaluatedPropertyValue("PreprocessorDefinitions");
} catch { }
@@ -846,12 +566,11 @@
var projectConfig = conf.ProjectConfiguration as VCConfiguration;
includeList.AddRange(GetIncludesFromCompilerTool(CompilerToolWrapper.Create(projectConfig)));
- var propertySheets = projectConfig.PropertySheets as IVCCollection;
- if (propertySheets != null) {
+ if (projectConfig.PropertySheets is IVCCollection propertySheets) {
foreach (VCPropertySheet sheet in propertySheets)
includeList.AddRange(GetIncludesFromPropertySheet(sheet));
}
-
+
var ompModified = new List<string>();
string sDir = "$(SolutionDir)";
foreach (string inc in includeList) {
@@ -884,8 +603,7 @@
private List<string> GetIncludesFromPropertySheet(VCPropertySheet sheet)
{
var includeList = GetIncludesFromCompilerTool(CompilerToolWrapper.Create(sheet));
- var propertySheets = sheet.PropertySheets as IVCCollection;
- if (propertySheets != null) {
+ if (sheet.PropertySheets is IVCCollection propertySheets) {
foreach (VCPropertySheet subSheet in propertySheets)
includeList.AddRange(GetIncludesFromPropertySheet(subSheet));
}
@@ -903,18 +621,10 @@
return new List<string>();
}
- private static bool IsDebugConfiguration(VCConfiguration conf)
- {
- var tool = CompilerToolWrapper.Create(conf);
- if (tool != null) {
- return tool.RuntimeLibrary == runtimeLibraryOption.rtMultiThreadedDebug
- || tool.RuntimeLibrary == runtimeLibraryOption.rtMultiThreadedDebugDLL;
- }
- return false;
- }
-
private string GetPCHMocOptions(VCFile file, CompilerToolWrapper compiler)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
// As .moc files are included, we should not add anything there
if (!HelperFunctions.IsHeaderFile(file.Name))
return string.Empty;
@@ -941,12 +651,13 @@
VCFileConfiguration workFileConfig,
VCFile mocFile)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var hasDifferentMocFilePerConfig =
QtVSIPSettings.HasDifferentMocFilePerConfig(envPro);
var hasDifferentMocFilePerPlatform =
QtVSIPSettings.HasDifferentMocFilePerPlatform(envPro);
- var workFile = workFileConfig.File as VCFile;
var mocFileName = GetMocFileName(sourceFile.FullPath);
var mocableIsCPP = HelperFunctions.IsMocFile(mocFileName);
var vcConfig = workFileConfig.ProjectConfiguration as VCConfiguration;
@@ -1025,6 +736,8 @@
string includes,
string description)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var workFile = workFileConfig.File as VCFile;
var mocFileName = GetMocFileName(sourceFile.FullPath);
var mocableIsCPP = HelperFunctions.IsMocFile(mocFileName);
@@ -1068,6 +781,7 @@
+ mocFileName + "))";
var regExp = new Regex(pattern);
var matchList = regExp.Matches(tool.Outputs.Replace(ProjectMacros.Name, baseFileName));
+
if (matchList.Count > 0) {
if (matchList[0].Length > 0)
outputMocFile = matchList[0].ToString();
@@ -1202,6 +916,8 @@
string includes,
string description)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var baseFileName = sourceFile.Name.Remove(sourceFile.Name.LastIndexOf('.'));
var outputMocFile = GetRelativeMocFilePath(sourceFile.FullPath);
var outputMocPath = Path.GetDirectoryName(outputMocFile);
@@ -1233,7 +949,8 @@
VCFileConfiguration workConfig,
CustomTool toolSettings)
{
- var workFile = workConfig.File as VCFile;
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var mocFileName = GetMocFileName(sourceFile.FullPath);
var mocableIsCPP = HelperFunctions.IsMocFile(mocFileName);
var vcConfig = workConfig.ProjectConfiguration as VCConfiguration;
@@ -1316,6 +1033,8 @@
/// <param name="file">file</param>
public void AddMocStep(VCFile file)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (GetFormatVersion(vcPro) >= Resources.qtMinFormatVersion_Settings) {
file.ItemType = QtMoc.ItemTypeName;
if (HelperFunctions.IsSourceFile(file.FullPath)) {
@@ -1343,8 +1062,7 @@
File.WriteAllText(cbtFullPath, string.Format(
"This is a dummy file needed to create {0}", mocFileName));
file = AddFileInSubfilter(Filters.GeneratedFiles(), null, cbtFullPath, true);
- var mocFileItem = file.Object as ProjectItem;
- if (mocFileItem != null)
+ if (file.Object is ProjectItem mocFileItem)
HelperFunctions.EnsureCustomBuildToolAvailable(mocFileItem);
}
@@ -1417,6 +1135,8 @@
public bool HasMocStep(VCFile file, string mocOutDir = null)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (file.ItemType == QtMoc.ItemTypeName)
return true;
@@ -1452,6 +1172,8 @@
public void RefreshRccSteps()
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
Messages.Print("\r\n=== Update rcc steps ===");
var files = GetResourceFiles();
@@ -1482,6 +1204,8 @@
public void RefreshRccSteps(string oldRccDir)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
RefreshRccSteps();
UpdateCompilerIncludePaths(oldRccDir, QtVSIPSettings.GetRccDirectory(envPro));
}
@@ -1493,8 +1217,7 @@
string nameOnly,
string qrcCppFile)
{
- var file = vfc.File as VCFile;
- if (file != null)
+ if (vfc.File is VCFile file)
file.ItemType = QtRcc.ItemTypeName;
qtMsBuild.SetItemProperty(vfc,
QtRcc.Property.ExecutionDescription, "Rcc'ing " + ProjectMacros.FileName + "...");
@@ -1509,16 +1232,15 @@
string nameOnly,
string qrcCppFile)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var qrcFile = vfc.File as VCFile;
var rccOptsCfg = rccOpts;
var cmdLine = string.Empty;
var cbt = HelperFunctions.GetCustomBuildTool(vfc);
-
cbt.AdditionalDependencies = filesInQrcFile;
-
cbt.Description = "Rcc'ing " + ProjectMacros.FileName + "...";
-
cbt.Outputs = qrcCppFile.Replace(nameOnly, ProjectMacros.Name);
cmdLine += "\"" + Resources.rcc4Command + "\""
@@ -1539,6 +1261,8 @@
public void UpdateRccStep(VCFile qrcFile, RccOptions rccOpts)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (GetFormatVersion(vcPro) >= Resources.qtMinFormatVersion_Settings) {
qrcFile.ItemType = QtRcc.ItemTypeName;
return;
@@ -1548,8 +1272,6 @@
IsQtMsBuildEnabled() ? CustomTool.MSBuildTarget : CustomTool.CustomBuildStep;
var vcpro = (VCProject)qrcFile.project;
- var dteObject = ((Project)vcpro.Object).DTE;
-
var qtPro = Create(vcpro);
var parser = new QrcParser(qrcFile.FullPath);
var filesInQrcFile = ProjectMacros.Path;
@@ -1606,7 +1328,7 @@
}
}
- static public void ExcludeFromAllBuilds(VCFile file)
+ public static void ExcludeFromAllBuilds(VCFile file)
{
if (file == null)
return;
@@ -1672,8 +1394,7 @@
List<VCFile> GetCppMocFiles(VCFile cppFile)
{
List<VCFile> mocFiles = new List<VCFile>();
- var vcProj = cppFile.project as VCProject;
- if (vcProj != null) {
+ if (cppFile.project is VCProject vcProj) {
mocFiles.AddRange(from VCFile vcFile
in (IVCCollection)vcProj.Files
where vcFile.ItemType == "CustomBuild"
@@ -1697,27 +1418,29 @@
bool HasCppMocFiles(VCFile cppFile)
{
- if (!IsQtMsBuildEnabled()) {
+ ThreadHelper.ThrowIfNotOnUIThread();
+
+ if (!IsQtMsBuildEnabled())
return File.Exists(Path.ChangeExtension(cppFile.FullPath, ".cbt"));
- } else {
- var vcProj = cppFile.project as VCProject;
- if (vcProj != null) {
- foreach (VCFile vcFile in (IVCCollection)vcProj.Files) {
- if (vcFile.ItemType == "CustomBuild") {
- if (IsCppMocFileCustomBuild(vcProj, vcFile, cppFile))
- return true;
- } else if (vcFile.ItemType == QtMoc.ItemTypeName) {
- if (IsCppMocFileQtMsBuild(vcProj, vcFile, cppFile))
- return true;
- }
+
+ if (cppFile.project is VCProject vcProj) {
+ foreach (VCFile vcFile in (IVCCollection)vcProj.Files) {
+ if (vcFile.ItemType == "CustomBuild") {
+ if (IsCppMocFileCustomBuild(vcProj, vcFile, cppFile))
+ return true;
+ } else if (vcFile.ItemType == QtMoc.ItemTypeName) {
+ if (IsCppMocFileQtMsBuild(vcProj, vcFile, cppFile))
+ return true;
}
}
- return false;
}
+ return false;
}
public void RemoveMocStep(VCFile file)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (file.ItemType == QtMoc.ItemTypeName) {
RemoveMocStepQtMsBuild(file);
} else if (HelperFunctions.IsHeaderFile(file.Name)) {
@@ -1756,6 +1479,7 @@
/// <param name="file">file</param>
public void RemoveMocStepCustomBuild(VCFile file)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
try {
if (!HasMocStep(file))
return;
@@ -1890,14 +1614,11 @@
public VCFile GetFileFromProject(string fileName)
{
fileName = HelperFunctions.NormalizeRelativeFilePath(fileName);
-
- var nf = fileName;
if (!HelperFunctions.IsAbsoluteFilePath(fileName))
- nf = HelperFunctions.NormalizeFilePath(vcPro.ProjectDirectory + "\\" + fileName);
- nf = nf.ToLower();
+ fileName = HelperFunctions.NormalizeFilePath(vcPro.ProjectDirectory + "\\" + fileName);
foreach (VCFile f in (IVCCollection)vcPro.Files) {
- if (f.FullPath.ToLower() == nf)
+ if (f.FullPath.Equals(fileName, StringComparison.OrdinalIgnoreCase))
return f;
}
return null;
@@ -1913,7 +1634,7 @@
{
var fi = new FileInfo(HelperFunctions.NormalizeRelativeFilePath(fileName));
foreach (VCFile f in (IVCCollection)vcPro.Files) {
- if (string.Equals(f.Name, fi.Name, StringComparison.OrdinalIgnoreCase))
+ if (f.Name.Equals(fi.Name, StringComparison.OrdinalIgnoreCase))
yield return f;
}
}
@@ -1924,34 +1645,6 @@
foreach (VCFilter subfilter in (IVCCollection)filter.Filters)
tmpList.AddRange(GetAllFilesFromFilter(subfilter));
return tmpList;
- }
-
- /// <summary>
- /// Adds a file to a filter. If the filter doesn't exist yet, it
- /// will be created. (Doesn't check for duplicates)
- /// </summary>
- /// <param name="filter">fake filter</param>
- /// <param name="fileName">relative file name</param>
- /// <returns>A VCFile object of the added file.</returns>
- public VCFile AddFileInFilter(FakeFilter filter, string fileName)
- {
- return AddFileInFilter(filter, fileName, false);
- }
-
- public void RemoveItem(ProjectItem item)
- {
- foreach (ProjectItem tmpFilter in Project.ProjectItems) {
- if (tmpFilter.Name == item.Name) {
- tmpFilter.Remove();
- return;
- }
- foreach (ProjectItem tmpItem in tmpFilter.ProjectItems) {
- if (tmpItem.Name == item.Name) {
- tmpItem.Remove();
- return;
- }
- }
- }
}
/// <summary>
@@ -1972,7 +1665,8 @@
return AddFileInSubfilter(filter, subfilterName, fileName, false);
}
- public VCFile AddFileInSubfilter(FakeFilter filter, string subfilterName, string fileName, bool checkForDuplicates)
+ public VCFile AddFileInSubfilter(FakeFilter filter, string subfilterName, string fileName,
+ bool checkForDuplicates)
{
try {
var vfilt = FindFilterFromGuid(filter.UniqueIdentifier);
@@ -1981,7 +1675,7 @@
// check if user already created this filter... then add guid
vfilt = FindFilterFromName(filter.Name);
if (vfilt == null)
- throw new QtVSException(SR.GetString("QtProject_CannotAddFilter", filter.Name));
+ throw new QtVSException($"Project cannot add filter {filter.Name}");
} else {
vfilt = (VCFilter)vcPro.AddFilter(filter.Name);
}
@@ -2014,14 +1708,7 @@
}
if (!subfilterFound) {
if (!vfilt.CanAddFilter(subfilterName))
- throw new QtVSException(SR.GetString("QtProject_CannotAddFilter", filter.Name));
-
-#if !(VS2017 || VS2019 || VS2022)
- // TODO: Enable once the freeze gets fixed in VS.
- vfilt = (VCFilter)vfilt.AddFilter(subfilterName);
- vfilt.Filter = "cpp;moc";
- vfilt.SourceControlFiles = false;
-#endif
+ throw new QtVSException($"Project cannot add filter {filter.Name}");
}
}
@@ -2034,10 +1721,13 @@
if (vfilt.CanAddFile(fileName))
return (VCFile)(vfilt.AddFile(fileName));
- throw new QtVSException(SR.GetString("QtProject_CannotAddFile", fileName));
- } catch {
- throw new QtVSException(SR.GetString("QtProject_CannotAddFile", fileName));
+ throw new QtVSException($"Cannot add file {fileName} to filter.");
+ } catch (QtVSException) {
+ throw;
+ } catch (Exception e){
+ throw new QtVSException($"Cannot add file {fileName} to filter.", e);
}
+
}
/// <summary>
@@ -2165,94 +1855,38 @@
}
}
- public void AddDirectories()
+ public static bool IsQtPlugin(Core.QtProject qtPro)
{
- try {
- // resource directory
- var fi = new FileInfo(envPro.FullName);
- var dfi = new DirectoryInfo(fi.DirectoryName + "\\" + Resources.resourceDir);
- dfi.Create();
- } catch {
- throw new QtVSException(SR.GetString("QtProject_CannotCreateResourceDir"));
- }
- AddFilterToProject(Filters.ResourceFiles());
- }
+ ThreadHelper.ThrowIfNotOnUIThread();
- public void Finish()
- {
- try {
- var solutionExplorer = dte.Windows.Item(Constants.vsWindowKindSolutionExplorer);
- if (solutionExplorer != null) {
- var hierarchy = (UIHierarchy)solutionExplorer.Object;
- var projects = hierarchy.UIHierarchyItems.Item(1).UIHierarchyItems;
+ if (qtPro.FormatVersion < Resources.qtMinFormatVersion_Settings)
+ return false;
- foreach (UIHierarchyItem itm in projects) {
- if (itm.Name == envPro.Name) {
- foreach (UIHierarchyItem i in itm.UIHierarchyItems) {
- if (i.Name == Filters.GeneratedFiles().Name)
- i.UIHierarchyItems.Expanded = false;
- }
- break;
- }
- }
- }
- } catch { }
-
- ProjectTracker?.AddProject(envPro);
- }
-
- public bool IsDesignerPluginProject()
- {
- var b = false;
- if (Project.Globals.get_VariablePersists("IsDesignerPlugin")) {
- var s = (string)Project.Globals["IsDesignerPlugin"];
- try {
- b = bool.Parse(s);
- } catch { }
- }
- return b;
- }
-
- /// <summary>
- /// Adds a file to a specified filter in a project.
- /// </summary>
- /// <param name="destName">name of the file in the project (relative to the project directory)</param>
- /// <param name="filter">filter</param>
- /// <returns>VCFile</returns>
- public VCFile AddFileToProject(string destName, FakeFilter filter)
- {
- VCFile file = null;
- if (filter != null)
- file = AddFileInFilter(filter, destName);
- else
- file = (VCFile)vcPro.AddFile(destName);
-
- if (file == null)
- return null;
-
- if (HelperFunctions.IsHeaderFile(file.Name)) {
- foreach (VCConfiguration config in (IVCCollection)vcPro.Configurations) {
- var compiler = CompilerToolWrapper.Create(config);
- if (compiler == null)
- continue;
-
- var paths = compiler.GetAdditionalIncludeDirectoriesList();
- var fi = new FileInfo(file.FullPath);
- var relativePath = HelperFunctions.GetRelativePath(ProjectDir, fi.Directory.ToString());
- var fixedRelativePath = FixFilePathForComparison(relativePath);
- if (!paths.Any(p => FixFilePathForComparison(p) == fixedRelativePath))
- compiler.AddAdditionalIncludeDirectories(relativePath);
+ foreach (VCConfiguration config in qtPro.VCProject.Configurations as IVCCollection) {
+ if ((config.Rules.Item("QtRule10_Settings") as IVCRulePropertyStorage)
+ .GetEvaluatedPropertyValue("QtPlugin") == "true") {
+ return true;
}
}
- return file;
+ return false;
+ }
+
+ public static void MarkAsQtPlugin(Core.QtProject qtPro)
+ {
+ foreach (VCConfiguration config in qtPro.VCProject.Configurations as IVCCollection) {
+ (config.Rules.Item("QtRule10_Settings") as IVCRulePropertyStorage)
+ .SetPropertyValue("QtPlugin", "true");
+ }
}
/// <summary>
/// adjusts the whitespaces, tabs in the given file according to VS settings
/// </summary>
/// <param name="file"></param>
- public void AdjustWhitespace(string file)
+ public static void AdjustWhitespace(DTE dte, string file)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (!File.Exists(file))
return;
@@ -2299,89 +1933,6 @@
return whitespaces;
}
- /// <summary>
- /// Copy a file to the projects folder. Does not add the file to the project.
- /// </summary>
- /// <param name="srcFile">full name of the file to add</param>
- /// <param name="destFolder">the name of the project folder</param>
- /// <param name="destName">name of the file in the project (relative to the project directory)</param>
- /// <returns>full name of the destination file</returns>
- public static string CopyFileToFolder(string srcFile, string destFolder, string destName)
- {
- var fullDestName = destFolder + "\\" + destName;
- var fi = new FileInfo(fullDestName);
-
- var replace = true;
- if (File.Exists(fullDestName)) {
- if (DialogResult.No == MessageBox.Show(SR.GetString("QtProject_FileExistsInProjectFolder", destName)
- , SR.GetString("Resources_QtVsTools"), MessageBoxButtons.YesNo, MessageBoxIcon.Question)) {
- replace = false;
- }
- }
-
- if (replace) {
- if (!fi.Directory.Exists)
- fi.Directory.Create();
- File.Copy(srcFile, fullDestName, true);
- var attribs = File.GetAttributes(fullDestName);
- File.SetAttributes(fullDestName, attribs & (~FileAttributes.ReadOnly));
- }
- return fi.FullName;
- }
-
- public static void ReplaceTokenInFile(string file, string token, string replacement)
- {
- var text = string.Empty;
- try {
- var reader = new StreamReader(file);
- text = reader.ReadToEnd();
- reader.Close();
- } catch (Exception e) {
- Messages.DisplayErrorMessage(
- SR.GetString("QtProject_CannotReplaceTokenRead", token, replacement, e.ToString()));
- return;
- }
-
- try {
- if (token.ToUpper() == "%PRE_DEF%" && !Char.IsLetter(replacement[0]))
- replacement = "_" + replacement;
-
- text = text.Replace(token, replacement);
- var writer = new StreamWriter(file);
- writer.Write(text);
- writer.Close();
- } catch (Exception e) {
- Messages.DisplayErrorMessage(
- SR.GetString("QtProject_CannotReplaceTokenWrite", token, replacement, e.ToString()));
- }
- }
-
- public void RepairGeneratedFilesStructure()
- {
- DeleteGeneratedFiles();
-
- var files = new ConcurrentBag<VCFile>();
- Task.WaitAll(
- Task.Run(() =>
- Parallel.ForEach(((IVCCollection)vcPro.Files).Cast<VCFile>(), file =>
- {
- var name = file.Name;
- if (!HelperFunctions.IsHeaderFile(name) && !HelperFunctions.IsSourceFile(name))
- return;
- if (HelperFunctions.HasQObjectDeclaration(file))
- files.Add(file);
- })
- )
- );
-
- qtMsBuild.BeginSetItemProperties();
- foreach (var file in files) {
- RemoveMocStep(file);
- AddMocStep(file);
- }
- qtMsBuild.EndSetItemProperties();
- }
-
public void TranslateFilterNames()
{
var filters = vcPro.Filters as IVCCollection;
@@ -2402,37 +1953,10 @@
}
}
- public static string CreateQrcFile(string projectDir, string className, string destName)
- {
- var fullDestName = projectDir + "\\" + destName;
-
- if (!File.Exists(fullDestName)) {
- FileStream s = null;
- try {
- s = File.Open(fullDestName, FileMode.CreateNew);
- if (s.CanWrite) {
- using (var sw = new StreamWriter(s)) {
- s = null;
- sw.WriteLine("<RCC>");
- sw.WriteLine(" <qresource prefix=\"" + className + "\">");
- sw.WriteLine(" </qresource>");
- sw.WriteLine("</RCC>");
- }
- }
- } finally {
- if (s != null)
- s.Dispose();
- }
- var attribs = File.GetAttributes(fullDestName);
- File.SetAttributes(fullDestName, attribs & (~FileAttributes.ReadOnly));
- }
-
- var fi = new FileInfo(fullDestName);
- return fi.FullName;
- }
-
public void AddActiveQtBuildStep(string version, string defFile = null)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (FormatVersion < Resources.qtMinFormatVersion_ClProperties)
return;
@@ -2463,6 +1987,8 @@
private void UpdateCompilerIncludePaths(string oldDir, string newDir)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var fixedOldDir = FixFilePathForComparison(oldDir);
var dirs = new[] {
FixFilePathForComparison(QtVSIPSettings.GetUicDirectory(envPro)),
@@ -2516,6 +2042,8 @@
public void UpdateUicSteps(string oldUicDir, bool update_inc_path)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
Messages.Print("\r\n=== Update uic steps ===");
var vcFilter = FindFilterFromGuid(Filters.GeneratedFiles().UniqueIdentifier);
if (vcFilter != null) {
@@ -2538,7 +2066,7 @@
qtMsBuild.BeginSetItemProperties();
foreach (var file in files) {
- if (HelperFunctions.IsUicFile(file.Name) && !IsUic3File(file)) {
+ if (HelperFunctions.IsUicFile(file.Name)) {
AddUic4BuildStep(file);
Messages.Print("Update uic step for " + file.Name + ".");
++updatedFiles;
@@ -2549,42 +2077,6 @@
UpdateCompilerIncludePaths(oldUicDir, QtVSIPSettings.GetUicDirectory(envPro));
Messages.Print("\r\n=== " + updatedFiles + " uic steps updated. ===\r\n");
- }
-
- private static bool IsUic3File(VCFile file)
- {
- foreach (VCFileConfiguration config in (IVCCollection)file.FileConfigurations) {
- var tool = HelperFunctions.GetCustomBuildTool(config);
- if (tool == null)
- return false;
- if (tool.CommandLine.IndexOf("uic3.exe", StringComparison.OrdinalIgnoreCase) > -1)
- return true;
- }
- return false;
- }
-
- public bool UsePrecompiledHeaders(VCConfiguration config)
- {
- var compiler = CompilerToolWrapper.Create(config);
- return UsePrecompiledHeaders(compiler);
- }
-
- private bool UsePrecompiledHeaders(CompilerToolWrapper compiler)
- {
- try {
- compiler.SetUsePrecompiledHeader(pchOption.pchUseUsingSpecific);
- var pcHeaderThrough = GetPrecompiledHeaderThrough();
- if (string.IsNullOrEmpty(pcHeaderThrough))
- pcHeaderThrough = "stdafx.h";
- compiler.SetPrecompiledHeaderThrough(pcHeaderThrough);
- var pcHeaderFile = GetPrecompiledHeaderFile();
- if (string.IsNullOrEmpty(pcHeaderFile))
- pcHeaderFile = ".\\$(ConfigurationName)/" + Project.Name + ".pch";
- compiler.SetPrecompiledHeaderFile(pcHeaderFile);
- return true;
- } catch {
- return false;
- }
}
public bool UsesPrecompiledHeaders()
@@ -2637,32 +2129,6 @@
return null;
}
- public string GetPrecompiledHeaderFile()
- {
- foreach (VCConfiguration config in vcPro.Configurations as IVCCollection) {
- var file = GetPrecompiledHeaderFile(config);
- if (!string.IsNullOrEmpty(file))
- return file;
- }
- return null;
- }
-
- public static string GetPrecompiledHeaderFile(VCConfiguration config)
- {
- var compiler = CompilerToolWrapper.Create(config);
- return GetPrecompiledHeaderFile(compiler);
- }
-
- private static string GetPrecompiledHeaderFile(CompilerToolWrapper compiler)
- {
- try {
- var file = compiler.GetPrecompiledHeaderFile();
- if (!string.IsNullOrEmpty(file))
- return file;
- } catch { }
- return null;
- }
-
public static void SetPCHOption(VCFile vcFile, pchOption option)
{
foreach (VCFileConfiguration config in vcFile.FileConfigurations as IVCCollection) {
@@ -2692,6 +2158,8 @@
/// <returns></returns>
private VCFile GetGeneratedMocFile(string fileName, VCFileConfiguration fileConfig)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (QtVSIPSettings.HasDifferentMocFilePerConfig(envPro)
|| QtVSIPSettings.HasDifferentMocFilePerPlatform(envPro)) {
var projectConfig = (VCConfiguration)fileConfig.ProjectConfiguration;
@@ -2763,6 +2231,8 @@
public void RefreshMocSteps()
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
// Ignore when using shared compiler properties
if (GetFormatVersion(vcPro) >= Resources.qtMinFormatVersion_ClProperties)
return;
@@ -2790,6 +2260,7 @@
public void RefreshMocStep(VCFile vcfile)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
RefreshMocStep(vcfile, true);
}
@@ -2803,6 +2274,8 @@
/// <param name="vcfile"></param>
private void RefreshMocStep(VCFile vcfile, bool singleFile)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var isHeaderFile = HelperFunctions.IsHeaderFile(vcfile.FullPath);
if (!isHeaderFile && !HelperFunctions.IsSourceFile(vcfile.FullPath))
return;
@@ -2942,6 +2415,8 @@
public void OnExcludedFromBuildChanged(VCFile vcFile, VCFileConfiguration vcFileCfg)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
// Update the ExcludedFromBuild flags of the mocced file
// according to the ExcludedFromBuild flag of the mocable source file.
var moccedFileName = GetMocFileName(vcFile.Name);
@@ -3011,6 +2486,8 @@
public void UpdateMocSteps(string oldMocDir)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
Messages.Print("\r\n=== Update moc steps ===");
var orgFiles = new List<VCFile>();
var abandonedMocFiles = new List<string>();
@@ -3053,8 +2530,8 @@
try {
RemoveMocStep(file);
AddMocStep(file);
- } catch (QtVSException e) {
- Messages.Print(e.Message);
+ } catch (QtVSException exception) {
+ exception.Log();
continue;
}
Messages.Print("Moc step updated successfully for " + file.Name + ".");
@@ -3073,6 +2550,8 @@
private void Clean()
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var solutionConfigs = envPro.DTE.Solution.SolutionBuild.SolutionConfigurations;
var backup = new List<KeyValuePair<SolutionContext, bool>>();
foreach (SolutionConfiguration config in solutionConfigs) {
@@ -3125,47 +2604,6 @@
}
}
- public bool isWinRT()
- {
- try {
- var vcProject = Project.Object as VCProject;
- var vcConfigs = vcProject.Configurations as IVCCollection;
- var vcConfig = vcConfigs.Item(1) as VCConfiguration;
- var appType = vcConfig.GetEvaluatedPropertyValue("ApplicationType");
- if (appType == "Windows Store")
- return true;
- } catch { }
- return false;
- }
-
- public bool PromptChangeQtVersion(string oldVersion, string newVersion)
- {
- var versionManager = QtVersionManager.The();
- var viOld = versionManager.GetVersionInfo(oldVersion);
- var viNew = versionManager.GetVersionInfo(newVersion);
-
- if (viOld == null || viNew == null)
- return true;
-
- var oldIsWinRt = viOld.isWinRT();
- var newIsWinRt = viNew.isWinRT();
-
- if (newIsWinRt == oldIsWinRt || newIsWinRt == isWinRT())
- return true;
-
- var promptCaption = string.Format("Change Qt Version ({0})", Project.Name);
- var promptText = string.Format(
- "Changing Qt version from {0} to {1}.\r\n" +
- "Project might not build. Are you sure?",
- newIsWinRt ? "Win32" : "WinRT",
- newIsWinRt ? "WinRT" : "Win32"
- );
-
- return (MessageBox.Show(
- promptText, promptCaption, MessageBoxButtons.YesNo, MessageBoxIcon.Warning)
- == DialogResult.Yes);
- }
-
/// <summary>
/// Changes the Qt version of this project.
/// </summary>
@@ -3175,6 +2613,8 @@
/// <returns>true, if the operation performed successfully</returns>
public bool ChangeQtVersion(string oldVersion, string newVersion, ref bool newProjectCreated)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
newProjectCreated = false;
var versionManager = QtVersionManager.The();
var viNew = versionManager.GetVersionInfo(newVersion);
@@ -3243,6 +2683,8 @@
public bool SelectSolutionPlatform(string platformName)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
foreach (SolutionConfiguration solutionCfg in dte.Solution.SolutionBuild.SolutionConfigurations) {
var contexts = solutionCfg.SolutionContexts;
for (var i = 1; i <= contexts.Count; ++i) {
@@ -3268,6 +2710,8 @@
public void CreatePlatform(string oldPlatform, string newPlatform,
VersionInformation viOld, VersionInformation viNew, ref bool newProjectCreated)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
try {
var cfgMgr = envPro.ConfigurationManager;
cfgMgr.AddPlatform(newPlatform, oldPlatform, true);
@@ -3329,9 +2773,7 @@
if (genVCFilter == null)
return;
- var error = false;
- error = DeleteFilesFromFilter(genVCFilter);
- if (error)
+ if (DeleteFilesFromFilter(genVCFilter))
Messages.Print(SR.GetString("DeleteGeneratedFilesError"));
}
@@ -3389,7 +2831,7 @@
resFile.Remove();
}
- static private void AddPlatformToVCProj(string projectFileName, string oldPlatformName, string newPlatformName)
+ private static void AddPlatformToVCProj(string projectFileName, string oldPlatformName, string newPlatformName)
{
var tempFileName = Path.GetTempFileName();
var fi = new FileInfo(projectFileName);
@@ -3404,7 +2846,7 @@
fi.Delete();
}
- static private void AddPlatformToVCProj(XmlDocument doc, string oldPlatformName, string newPlatformName)
+ private static void AddPlatformToVCProj(XmlDocument doc, string oldPlatformName, string newPlatformName)
{
var vsProj = doc.DocumentElement.SelectSingleNode("/VisualStudioProject");
var platforms = vsProj.SelectSingleNode("Platforms");
@@ -3438,7 +2880,7 @@
}
}
- static private void SetTargetMachine(VCLinkerTool linker, VersionInformation versionInfo)
+ private static void SetTargetMachine(VCLinkerTool linker, VersionInformation versionInfo)
{
var qMakeLFlagsWindows = versionInfo.GetQMakeConfEntry("QMAKE_LFLAGS_WINDOWS");
var rex = new Regex("/MACHINE:(\\S+)");
@@ -3476,6 +2918,8 @@
public void CollapseFilter(string filterName)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var solutionExplorer = (UIHierarchy)dte.Windows.Item(Constants.vsext_wk_SProjectWindow).Object;
if (solutionExplorer.UIHierarchyItems.Count == 0)
return;
@@ -3489,6 +2933,8 @@
private UIHierarchyItem FindProjectHierarchyItem(UIHierarchy hierarchy)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (hierarchy.UIHierarchyItems.Count == 0)
return null;
@@ -3504,6 +2950,8 @@
private UIHierarchyItem FindProjectHierarchyItem(UIHierarchyItem root)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
UIHierarchyItem projectItem = null;
try {
if (root.Name == envPro.Name)
@@ -3524,6 +2972,7 @@
/// </summary>
public string GetQtVersion()
{
+ ThreadHelper.ThrowIfNotOnUIThread();
return QtVersionManager.The().GetProjectQtVersion(envPro);
}
@@ -3532,6 +2981,7 @@
/// </summary>
public void SetQtEnvironment()
{
+ ThreadHelper.ThrowIfNotOnUIThread();
SetQtEnvironment(QtVersionManager.The().GetProjectQtVersion(envPro));
}
@@ -3540,6 +2990,7 @@
/// </summary>
public void SetQtEnvironment(string qtVersion)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
SetQtEnvironment(qtVersion, string.Empty);
}
@@ -3548,6 +2999,8 @@
/// </summary>
public void SetQtEnvironment(string qtVersion, string solutionConfig, bool build = false)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (string.IsNullOrEmpty(qtVersion))
return;
@@ -3558,6 +3011,7 @@
if (qtVersion != "$(QTDIR)")
qtDir = QtVersionManager.The().GetInstallPath(qtVersion);
HelperFunctions.SetEnvironmentVariableEx("QTDIR", qtDir);
+
try {
var propertyAccess = (IVCBuildPropertyStorage)vcPro;
var vcprj = envPro.Object as VCProject;
@@ -3590,8 +3044,7 @@
debuggerEnv = propertyAccess.GetPropertyValue(
"LocalDebuggerEnvironment", cur_solution, "UserFile");
if (!string.IsNullOrEmpty(debuggerEnv)) {
- var debugSettings = conf.DebugSettings as VCDebugSettings;
- if (debugSettings != null) {
+ if (conf.DebugSettings is VCDebugSettings debugSettings) {
//Get original value without expanded properties
debuggerEnv = debugSettings.Environment;
}
@@ -3624,9 +3077,8 @@
var projProps = vcProj as IVCBuildPropertyStorage;
try {
return projProps.GetPropertyValue(pszPropName, Config.Name, "UserFile");
- } catch (Exception e) {
- System.Diagnostics.Debug.WriteLine(
- e.Message + "\r\n\r\nStacktrace:\r\n" + e.StackTrace);
+ } catch (Exception exception) {
+ exception.Log();
return string.Empty;
}
}
@@ -3637,9 +3089,8 @@
var projProps = vcProj as IVCBuildPropertyStorage;
try {
projProps.SetPropertyValue(pszPropName, Config.Name, "UserFile", pszPropValue);
- } catch (Exception e) {
- System.Diagnostics.Debug.WriteLine(
- e.Message + "\r\n\r\nStacktrace:\r\n" + e.StackTrace);
+ } catch (Exception exception) {
+ exception.Log();
}
}
@@ -3649,9 +3100,8 @@
var projProps = vcProj as IVCBuildPropertyStorage;
try {
projProps.RemoveProperty(pszPropName, Config.Name, "UserFile");
- } catch (Exception e) {
- System.Diagnostics.Debug.WriteLine(
- e.Message + "\r\n\r\nStacktrace:\r\n" + e.StackTrace);
+ } catch (Exception exception) {
+ exception.Log();
}
}
}
@@ -3970,10 +3420,10 @@
{
if (propertyStorage == null)
return null;
- if (propertyStorage is VCFileConfiguration)
- return GetParentProject(propertyStorage as VCFileConfiguration);
- else if (propertyStorage is VCConfiguration)
- return GetParentProject(propertyStorage as VCConfiguration);
+ if (propertyStorage is VCFileConfiguration configuration)
+ return GetParentProject(configuration);
+ else if (propertyStorage is VCConfiguration storage)
+ return GetParentProject(storage);
return null;
}
@@ -4026,8 +3476,7 @@
public class VCMacroExpander : IVSMacroExpander
{
- object config;
-
+ readonly object config;
public VCMacroExpander(object config)
{
this.config = config;
@@ -4042,14 +3491,15 @@
public class QtCustomBuildTool
{
- QtMsBuildContainer qtMsBuild;
- VCFileConfiguration vcConfig;
- VCFile vcFile;
- VCCustomBuildTool tool;
- VCMacroExpander macros;
+ readonly QtMsBuildContainer qtMsBuild;
+ readonly VCFileConfiguration vcConfig;
+ readonly VCFile vcFile;
+ readonly VCCustomBuildTool tool;
+ readonly VCMacroExpander macros;
enum FileItemType { Other = 0, CustomBuild, QtMoc, QtRcc, QtRepc, QtUic };
- FileItemType itemType = FileItemType.Other;
+ readonly FileItemType itemType = FileItemType.Other;
+
public QtCustomBuildTool(VCFileConfiguration vcConfig, QtMsBuildContainer container = null)
{
if (container != null)
--
Gitblit v1.9.1