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/MsBuildProject.cs | 104 +++++++++++++++++++++++++--------------------------
1 files changed, 51 insertions(+), 53 deletions(-)
diff --git a/QtVsTools.Core/MsBuildProject.cs b/QtVsTools.Core/MsBuildProject.cs
index 3b11f34..3eff430 100644
--- a/QtVsTools.Core/MsBuildProject.cs
+++ b/QtVsTools.Core/MsBuildProject.cs
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2017 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.
@@ -30,22 +30,22 @@
using System.IO;
using System.Collections.Generic;
using System.Text;
+using System.Text.RegularExpressions;
using System.Linq;
using System.Xml;
using System.Xml.Linq;
-using QtVsTools.Core.QtMsBuild;
-using System.Text.RegularExpressions;
using Microsoft.Build.Construction;
using Microsoft.Build.Execution;
using Microsoft.Build.Evaluation;
-using QtVsTools.VisualStudio;
-using QtVsTools.SyntaxAnalysis;
-using EnvDTE;
+using Microsoft.VisualStudio.Shell;
namespace QtVsTools.Core
{
+ using QtMsBuild;
+ using SyntaxAnalysis;
+
using static HelperFunctions;
- using static RegExpr;
+ using static SyntaxAnalysis.RegExpr;
public class MsBuildProject
{
@@ -65,7 +65,8 @@
User,
Count
}
- MsBuildXmlFile[] files = new MsBuildXmlFile[(int)Files.Count];
+
+ readonly MsBuildXmlFile[] files = new MsBuildXmlFile[(int)Files.Count];
MsBuildProject()
{
@@ -94,7 +95,7 @@
}
}
- private static XNamespace ns = "http://schemas.microsoft.com/developer/msbuild/2003";
+ private static readonly XNamespace ns = "http://schemas.microsoft.com/developer/msbuild/2003";
public static MsBuildProject Load(string pathToProject)
{
@@ -293,12 +294,8 @@
if (ConfigCondition == null)
return false;
- // Get default Qt dir
- string defaultQtDir = null;
var defaultVersionName = QtVersionManager.The().GetDefaultVersion();
var defaultVersion = QtVersionManager.The().GetVersionInfo(defaultVersionName);
- if (defaultVersion != null)
- defaultQtDir = defaultVersion.qtDir;
// Get project configurations
var configs = this[Files.Project].xml
@@ -314,15 +311,6 @@
.FirstOrDefault();
if (globals == null)
return false;
-
- // Get project configuration properties
- var configProps = this[Files.Project].xml
- .Elements(ns + "Project")
- .Elements(ns + "PropertyGroup")
- .Where(pg =>
- (string)pg.Attribute("Label") == "Configuration"
- && pg.Attribute("Condition") != null)
- .ToDictionary(pg => (string)pg.Attribute("Condition"));
// Set Qt project format version
var projKeyword = globals
@@ -386,10 +374,8 @@
foreach (var pg in uncategorizedPropertyGroups) {
foreach (var p in pg.Elements().ToList()) {
var condition = p.Attribute("Condition") ?? pg.Attribute("Condition");
- XElement configPropertyGroup = null;
- if (condition != null)
- propertyGroups.TryGetValue((string)condition, out configPropertyGroup);
- if (configPropertyGroup != null) {
+ if (condition != null && propertyGroups
+ .TryGetValue((string)condition, out XElement configPropertyGroup)) {
p.Remove();
p.SetAttributeValue("Condition", null);
configPropertyGroup.Add(p);
@@ -535,12 +521,10 @@
foreach (var configQtSettings in qtSettings) {
var configCondition = (string)configQtSettings.Attribute("Condition");
- XElement oldConfigQtInstall;
- if (oldQtInstall.TryGetValue(configCondition, out oldConfigQtInstall))
+ if (oldQtInstall.TryGetValue(configCondition, out XElement oldConfigQtInstall))
configQtSettings.Add(oldConfigQtInstall);
- XElement oldConfigQtSettings;
- if (oldQtSettings.TryGetValue(configCondition, out oldConfigQtSettings)) {
+ if (oldQtSettings.TryGetValue(configCondition, out XElement oldConfigQtSettings)) {
foreach (var qtSetting in oldConfigQtSettings.Elements())
configQtSettings.Add(qtSetting);
}
@@ -600,6 +584,11 @@
.Elements(ns + "ItemDefinitionGroup")
.Elements(ns + "Link");
+ var resourceCompiler = this[Files.Project].xml
+ .Elements(ns + "Project")
+ .Elements(ns + "ItemDefinitionGroup")
+ .Elements(ns + "ResourceCompile");
+
// Qt module names, to copy to QtModules property
var moduleNames = new HashSet<string>();
@@ -613,9 +602,9 @@
var moduleLibs = new HashSet<string>();
// Go through all known Qt modules and check which ones are currently being used
- foreach (var module in QtModules.Instance.GetAvailableModules()) {
+ foreach (var module in QtModules.Instance.GetAvailableModules(defaultVersion.qtMajor)) {
- if (IsModuleUsed(module, compiler, linker)) {
+ if (IsModuleUsed(module, compiler, linker, resourceCompiler)) {
// Qt module names, to copy to QtModules property
if (!string.IsNullOrEmpty(module.proVarQT))
@@ -670,6 +659,12 @@
.Select(x => Unquote(x))
// Exclude paths rooted on $(QTDIR)
.Where(x => !x.StartsWith("$(QTDIR)", IGNORE_CASE))));
+ }
+
+ // Remove Qt module macros from resource compiler properties
+ foreach (var defines in resourceCompiler.Elements(ns + "PreprocessorDefinitions")) {
+ defines.SetValue(string.Join(";", defines.Value.Split(';')
+ .Where(x => !moduleDefines.Contains(x))));
}
// Add Qt module names to QtModules project property
@@ -778,7 +773,8 @@
bool IsModuleUsed(
QtModule module,
IEnumerable<XElement> compiler,
- IEnumerable<XElement> linker)
+ IEnumerable<XElement> linker,
+ IEnumerable<XElement> resourceCompiler)
{
// Module .lib is present in linker additional dependencies
if (linker.Elements(ns + "AdditionalDependencies")
@@ -788,8 +784,15 @@
return true;
}
- // Module macro is present in pre-processor definitions
+ // Module macro is present in the compiler pre-processor definitions
if (compiler.Elements(ns + "PreprocessorDefinitions")
+ .SelectMany(x => x.Value.Split(';'))
+ .Any(x => module.Defines.Contains(x))) {
+ return true;
+ }
+
+ // Module macro is present in resource compiler pre-processor definitions
+ if (resourceCompiler.Elements(ns + "PreprocessorDefinitions")
.SelectMany(x => x.Value.Split(';'))
.Any(x => module.Defines.Contains(x))) {
return true;
@@ -958,9 +961,9 @@
commandLine = replace(row.itemName, commandLine);
//
// * Configuration/platform, e.g. x64\Debug --> $(Platform)\$(Configuration)
- commandLine = commandLine
- .Replace(configName, "$(Configuration)",
- StringComparison.InvariantCultureIgnoreCase)
+ // * ignore any word other than the expected configuration, e.g. lrelease.exe
+ commandLine = Regex.Replace(commandLine, @"\b" + configName + @"\b",
+ "$(Configuration)", RegexOptions.IgnoreCase)
.Replace(platformName, "$(Platform)",
StringComparison.InvariantCultureIgnoreCase);
@@ -969,8 +972,7 @@
evaluator.Properties.Add(configProp.Name.LocalName, (string)configProp);
if (!qtMsBuild.SetCommandLine(itemType, item, commandLine, evaluator)) {
int lineNumber = 1;
- var errorLine = row.command as IXmlLineInfo;
- if (errorLine != null && errorLine.HasLineInfo())
+ if (row.command is IXmlLineInfo errorLine && errorLine.HasLineInfo())
lineNumber = errorLine.LineNumber;
Messages.Print(string.Format(
@@ -1059,8 +1061,7 @@
return (string)cbt.Attribute("Include");
}
}
- string ouputFile;
- if (!properties.TryGetValue(QtMoc.Property.InputFile, out ouputFile))
+ if (!properties.TryGetValue(QtMoc.Property.InputFile, out string ouputFile))
return (string)cbt.Attribute("Include");
return ouputFile;
}
@@ -1085,8 +1086,7 @@
Path.IsPathRooted(x) ? x : Path.Combine(projDir, x)));
var outputItems = new List<XElement>();
foreach (var outputFile in outputFiles) {
- List<XElement> mocOutput = null;
- if (projItemsByPath.TryGetValue(outputFile, out mocOutput)) {
+ if (projItemsByPath.TryGetValue(outputFile, out List<XElement> mocOutput)) {
outputItems.AddRange(mocOutput);
hasGeneratedFiles |= hasGeneratedFiles ? true : mocOutput
.Where(x => !x.Elements(ns + "ExcludedFromBuild")
@@ -1469,17 +1469,16 @@
class MSBuildEvaluator : IVSMacroExpander, IDisposable
{
- MsBuildXmlFile projFile;
- string tempProjFilePath;
- XElement evaluateTarget;
- XElement evaluateProperty;
- ProjectRootElement projRoot;
- public Dictionary<string, string> expansionCache;
+ private readonly MsBuildXmlFile projFile;
+ private string tempProjFilePath;
+ private XElement evaluateTarget;
+ private XElement evaluateProperty;
+ private ProjectRootElement projRoot;
+ private readonly Dictionary<string, string> expansionCache;
public Dictionary<string, string> Properties
{
get;
- private set;
}
public MSBuildEvaluator(MsBuildXmlFile projFile)
@@ -1522,8 +1521,7 @@
public string ExpandString(string stringToExpand)
{
- string expandedString;
- if (TryExpansionCache(stringToExpand, out expandedString))
+ if (TryExpansionCache(stringToExpand, out string expandedString))
return expandedString;
if (evaluateTarget == null) {
@@ -1649,7 +1647,7 @@
return true;
}
- static Regex ConditionParser =
+ static readonly Regex ConditionParser =
new Regex(@"\'\$\(Configuration[^\)]*\)\|\$\(Platform[^\)]*\)\'\=\=\'([^\']+)\'");
class MsBuildConverterProvider : IPropertyStorageProvider
--
Gitblit v1.9.1