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

---
 QtVsTest/Macro.cs |  127 +++++++++++++++++++++++++----------------
 1 files changed, 77 insertions(+), 50 deletions(-)

diff --git a/QtVsTest/Macro.cs b/QtVsTest/Macro.cs
index 1c1004d..e4477e8 100644
--- a/QtVsTest/Macro.cs
+++ b/QtVsTest/Macro.cs
@@ -82,7 +82,7 @@
         /// <summary>
         /// Name of reusable macro
         /// </summary>
-        public string Name { get; private set; }
+        private string Name { get; set; }
 
         /// <summary>
         /// True if macro compilation was successful
@@ -104,8 +104,9 @@
         /// </summary>
         public bool QuitWhenDone { get; private set; }
 
-        AsyncPackage Package { get; set; }
-        EnvDTE80.DTE2 Dte { get; set; }
+        AsyncPackage Package { get; }
+        EnvDTE80.DTE2 Dte { get; }
+        IntPtr MainWindowHWnd { get; }
 
         AutomationElement UiRoot => AutomationElement.RootElement;
 
@@ -115,65 +116,55 @@
             get
             {
                 if (_UiVsRoot == null)
-#if VS2022
-                    _UiVsRoot = AutomationElement.FromHandle(Dte.MainWindow.HWnd);
-#else
-                    _UiVsRoot = AutomationElement.FromHandle(new IntPtr(Dte.MainWindow.HWnd));
-#endif
+                    _UiVsRoot = AutomationElement.FromHandle(MainWindowHWnd);
                 return _UiVsRoot;
             }
         }
 
-        JoinableTaskFactory JoinableTaskFactory { get; set; }
-        CancellationToken ServerLoop { get; set; }
+        JoinableTaskFactory JoinableTaskFactory { get; }
+        CancellationToken ServerLoop { get; }
 
         string Message { get; set; }
 
         static MacroParser Parser { get; set; }
         MacroLines MacroLines { get; set; }
 
-        List<string> SelectedAssemblies { get { return _SelectedAssemblies; } }
-        List<string> _SelectedAssemblies =
-            new List<string>
-            {
-                "QtVsTest",
-                "System.Core",
-            };
+        private List<string> SelectedAssemblies { get; } = new List<string>
+        {
+            typeof(Macro).Assembly.FullName,
+            typeof(EnvDTE.DTE).Assembly.FullName,
+            typeof(AutomationElement).Assembly.FullName,
+            "System.Core",
+        };
 
         IEnumerable<string> RefAssemblies { get; set; }
 
-        List<string> Namespaces { get { return _Namespaces; } }
-        List<string> _Namespaces =
-            new List<string>
-            {
-                "System",
-                "System.Linq",
-                "System.Reflection",
-                "Task = System.Threading.Tasks.Task",
-                "System.Windows.Automation",
-                "EnvDTE",
-                "EnvDTE80",
-            };
+        private List<string> Namespaces { get; } = new List<string>
+        {
+            "System",
+            "System.Linq",
+            "System.Reflection",
+            "Task = System.Threading.Tasks.Task",
+            "System.Windows.Automation",
+            "EnvDTE",
+            "EnvDTE80",
+        };
 
-        Dictionary<string, VSServiceRef> ServiceRefs { get { return _ServiceRefs; } }
-        Dictionary<string, VSServiceRef> _ServiceRefs =
-            new Dictionary<string, VSServiceRef>
+        private Dictionary<string, VSServiceRef> ServiceRefs { get; } = new Dictionary<string, VSServiceRef>
+        {
             {
-                {
-                    "Dte", new VSServiceRef
+                "Dte", new VSServiceRef
                     { Name = "Dte", Interface = "DTE2", Type = "DTE" }
-                },
-            };
+            },
+        };
 
-        Dictionary<string, GlobalVar> GlobalVars { get { return _GlobalVars; } }
-        Dictionary<string, GlobalVar> _GlobalVars =
-            new Dictionary<string, GlobalVar>
+        private Dictionary<string, GlobalVar> GlobalVars { get; } = new Dictionary<string, GlobalVar>
+        {
             {
-                {
-                    "Result", new GlobalVar
+                "Result", new GlobalVar
                     { Type = "string", Name = "Result", InitialValueExpr = "string.Empty" }
-                },
-            };
+            },
+        };
 
         string CSharpMethodCode { get; set; }
         string CSharpClassCode { get; set; }
@@ -187,10 +178,10 @@
         const BindingFlags PUBLIC_STATIC = BindingFlags.Public | BindingFlags.Static;
         const StringComparison IGNORE_CASE = StringComparison.InvariantCultureIgnoreCase;
 
-        static ConcurrentDictionary<string, Macro> Macros
+        static readonly ConcurrentDictionary<string, Macro> Macros
             = new ConcurrentDictionary<string, Macro>();
 
-        static ConcurrentDictionary<string, object> Globals
+        static readonly ConcurrentDictionary<string, object> Globals
             = new ConcurrentDictionary<string, object>();
 
         /// <summary>
@@ -202,6 +193,7 @@
         public Macro(
             AsyncPackage package,
             EnvDTE80.DTE2 dte,
+            IntPtr mainWindowHWnd,
             JoinableTaskFactory joinableTaskFactory,
             CancellationToken serverLoop)
         {
@@ -209,6 +201,7 @@
             JoinableTaskFactory = joinableTaskFactory;
             ServerLoop = serverLoop;
             Dte = dte;
+            MainWindowHWnd = mainWindowHWnd;
             ErrorMsg("Uninitialized");
         }
 
@@ -510,6 +503,8 @@
                     return false;
                 break;
             }
+
+            csharp.AppendLine();
             return true;
         }
 
@@ -615,6 +610,38 @@
 
                 csharp.AppendFormat(@"
                     await WaitExpr({0}, () => UiContext = {1});", timeout, context);
+
+            } else if (s.Args[0].Equals("find", IGNORE_CASE)) {
+                //# ui find [all] [_var_name_] [_timeout_] => <_scope_>, <_condition_>
+
+                var args = new Queue<string>(s.Args.Skip(1));
+
+                bool findAll = false;
+                if (args.Any() && args.Peek().Equals("all", IGNORE_CASE)) {
+                    findAll = true;
+                    args.Dequeue();
+                }
+                string funcName = findAll ? "FindAll" : "FindFirst";
+                string varType = findAll ? "AutomationElementCollection" : "AutomationElement";
+
+                string varName = null;
+                if (args.Any() && !char.IsDigit(args.Peek()[0]))
+                    varName = args.Dequeue();
+                if (findAll && string.IsNullOrEmpty(varName))
+                    return ErrorMsg("Invalid #ui statement");
+
+                int timeout = 3000;
+                if (args.Any() && char.IsDigit(args.Peek()[0]))
+                    timeout = int.Parse(args.Dequeue());
+
+                if (varName == null) {
+                    varName = "UiContext";
+                } else {
+                    csharp.Append($@"
+                        {varType} {varName} = null;");
+                }
+                csharp.Append($@"
+                    await WaitExpr({timeout}, () => {varName} = UiContext.{funcName}({s.Code}));");
 
             } else if (s.Args[0].Equals("pattern", IGNORE_CASE)) {
                 //# ui pattern <_TypeName_> <_VarName_> [ => _string_ [, _string_, ... ] ]
@@ -790,7 +817,9 @@
                     File.Delete(macroDllPath);
                 return ErrorMsg(string.Join("\r\n",
                     CompilerResults.Errors.Cast<CompilerError>()
-                        .Select(x => x.ErrorText)));
+                        .Select(x => $"{x.Line}: {x.ErrorText}")
+                        .Append(CSharpClassCode)
+                        .Union(RefAssemblies)));
             }
 
             MacroAssembly = AppDomain.CurrentDomain.Load(File.ReadAllBytes(macroDllPath));
@@ -927,8 +956,7 @@
             foreach (var globalVar in GlobalVars.Values) {
                 string varName = globalVar.Name;
                 Type varType = globalVar.FieldInfo.FieldType;
-                object value;
-                if (Globals.TryGetValue(varName, out value)) {
+                if (Globals.TryGetValue(varName, out object value)) {
                     Type valueType = value.GetType();
                     if (!varType.IsAssignableFrom(valueType)) {
                         throw new InvalidCastException(string.Format(
@@ -968,8 +996,7 @@
 
         static Macro GetMacro(string name)
         {
-            Macro macro;
-            if (!Macros.TryGetValue(name, out macro))
+            if (!Macros.TryGetValue(name, out Macro macro))
                 return null;
             return macro;
         }

--
Gitblit v1.9.1