diff options
Diffstat (limited to 'modules/mono/editor')
31 files changed, 428 insertions, 353 deletions
| diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Sdk/Sdk.targets b/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Sdk/Sdk.targets index 92e299d2f3..397ede9644 100644 --- a/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Sdk/Sdk.targets +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.NET.Sdk/Sdk/Sdk.targets @@ -17,6 +17,6 @@    <!-- C# source generators -->    <ItemGroup Condition=" '$(DisableImplicitGodotGeneratorReferences)' != 'true' "> -    <PackageReference Include="Godot.SourceGenerators" Version="$(PackageVersion_Godot_SourceGenerators)" /> +    <PackageReference Include="Godot.SourceGenerators" Version="$(PackageFloatingVersion_Godot)" />    </ItemGroup>  </Project> diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators.Sample/Generic.cs b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators.Sample/Generic.cs new file mode 100644 index 0000000000..2ddb8880c2 --- /dev/null +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators.Sample/Generic.cs @@ -0,0 +1,16 @@ +namespace Godot.SourceGenerators.Sample +{ +    partial class Generic<T> : Godot.Object +    { +    } + +    // Generic again but different generic parameters +    partial class Generic<T, R> : Godot.Object +    { +    } + +    // Generic again but without generic parameters +    partial class Generic : Godot.Object +    { +    } +} diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ScriptPathAttributeGenerator.cs b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ScriptPathAttributeGenerator.cs index a51728e221..fa65595290 100644 --- a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ScriptPathAttributeGenerator.cs +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/ScriptPathAttributeGenerator.cs @@ -97,9 +97,13 @@ namespace Godot.SourceGenerators                  string.Empty;              bool hasNamespace = classNs.Length != 0; -            string uniqueName = hasNamespace ? -                classNs + "." + className + "_ScriptPath_Generated" : -                className + "_ScriptPath_Generated"; +            var uniqueName = new StringBuilder(); +            if (hasNamespace) +                uniqueName.Append($"{classNs}."); +            uniqueName.Append(className); +            if (symbol.IsGenericType) +                uniqueName.Append($"Of{string.Join(string.Empty, symbol.TypeParameters)}"); +            uniqueName.Append("_ScriptPath_Generated");              var source = new StringBuilder(); @@ -121,6 +125,8 @@ namespace Godot.SourceGenerators              source.Append(attributes);              source.Append("\n    partial class ");              source.Append(className); +            if (symbol.IsGenericType) +                source.Append($"<{string.Join(", ", symbol.TypeParameters)}>");              source.Append("\n{\n}\n");              if (hasNamespace) @@ -128,7 +134,7 @@ namespace Godot.SourceGenerators                  source.Append("\n}\n");              } -            context.AddSource(uniqueName, SourceText.From(source.ToString(), Encoding.UTF8)); +            context.AddSource(uniqueName.ToString(), SourceText.From(source.ToString(), Encoding.UTF8));          }          private static void AddScriptTypesAssemblyAttr(GeneratorExecutionContext context, @@ -145,12 +151,15 @@ namespace Godot.SourceGenerators              foreach (var godotClass in godotClasses)              {                  var qualifiedName = godotClass.Key.ToDisplayString( -                    NullableFlowState.NotNull, SymbolDisplayFormat.FullyQualifiedFormat); +                    NullableFlowState.NotNull, SymbolDisplayFormat.FullyQualifiedFormat +                        .WithGenericsOptions(SymbolDisplayGenericsOptions.None));                  if (!first)                      sourceBuilder.Append(", ");                  first = false;                  sourceBuilder.Append("typeof(");                  sourceBuilder.Append(qualifiedName); +                if (godotClass.Key.IsGenericType) +                    sourceBuilder.Append($"<{new string(',', godotClass.Key.TypeParameters.Count() - 1)}>");                  sourceBuilder.Append(")");              } diff --git a/modules/mono/editor/GodotTools/GodotTools.BuildLogger/GodotBuildLogger.cs b/modules/mono/editor/GodotTools/GodotTools.BuildLogger/GodotBuildLogger.cs index 9b7b422276..2bf1cb7a18 100644 --- a/modules/mono/editor/GodotTools/GodotTools.BuildLogger/GodotBuildLogger.cs +++ b/modules/mono/editor/GodotTools/GodotTools.BuildLogger/GodotBuildLogger.cs @@ -12,12 +12,16 @@ namespace GodotTools.BuildLogger          public string Parameters { get; set; }          public LoggerVerbosity Verbosity { get; set; } +        private StreamWriter _logStreamWriter; +        private StreamWriter _issuesStreamWriter; +        private int _indent; +          public void Initialize(IEventSource eventSource)          {              if (null == Parameters)                  throw new LoggerException("Log directory parameter not specified."); -            var parameters = Parameters.Split(new[] { ';' }); +            string[] parameters = Parameters.Split(new[] { ';' });              string logDir = parameters[0]; @@ -35,8 +39,8 @@ namespace GodotTools.BuildLogger                  if (!Directory.Exists(logDir))                      Directory.CreateDirectory(logDir); -                logStreamWriter = new StreamWriter(logFile); -                issuesStreamWriter = new StreamWriter(issuesFile); +                _logStreamWriter = new StreamWriter(logFile); +                _issuesStreamWriter = new StreamWriter(issuesFile);              }              catch (Exception ex)              { @@ -66,12 +70,12 @@ namespace GodotTools.BuildLogger          private void eventSource_ProjectStarted(object sender, ProjectStartedEventArgs e)          {              WriteLine(e.Message); -            indent++; +            _indent++;          }          private void eventSource_ProjectFinished(object sender, ProjectFinishedEventArgs e)          { -            indent--; +            _indent--;              WriteLine(e.Message);          } @@ -87,7 +91,7 @@ namespace GodotTools.BuildLogger              string errorLine = $@"error,{e.File.CsvEscape()},{e.LineNumber},{e.ColumnNumber}," +                                 $"{e.Code?.CsvEscape() ?? string.Empty},{e.Message.CsvEscape()}," +                                 $"{e.ProjectFile?.CsvEscape() ?? string.Empty}"; -            issuesStreamWriter.WriteLine(errorLine); +            _issuesStreamWriter.WriteLine(errorLine);          }          private void eventSource_WarningRaised(object sender, BuildWarningEventArgs e) @@ -102,7 +106,7 @@ namespace GodotTools.BuildLogger              string warningLine = $@"warning,{e.File.CsvEscape()},{e.LineNumber},{e.ColumnNumber}," +                                   $"{e.Code?.CsvEscape() ?? string.Empty},{e.Message.CsvEscape()}," +                                   $"{e.ProjectFile?.CsvEscape() ?? string.Empty}"; -            issuesStreamWriter.WriteLine(warningLine); +            _issuesStreamWriter.WriteLine(warningLine);          }          private void eventSource_MessageRaised(object sender, BuildMessageEventArgs e) @@ -136,28 +140,24 @@ namespace GodotTools.BuildLogger          private void WriteLine(string line)          { -            for (int i = indent; i > 0; i--) +            for (int i = _indent; i > 0; i--)              { -                logStreamWriter.Write("\t"); +                _logStreamWriter.Write("\t");              } -            logStreamWriter.WriteLine(line); +            _logStreamWriter.WriteLine(line);          }          public void Shutdown()          { -            logStreamWriter.Close(); -            issuesStreamWriter.Close(); +            _logStreamWriter.Close(); +            _issuesStreamWriter.Close();          }          private bool IsVerbosityAtLeast(LoggerVerbosity checkVerbosity)          {              return Verbosity >= checkVerbosity;          } - -        private StreamWriter logStreamWriter; -        private StreamWriter issuesStreamWriter; -        private int indent;      }      internal static class StringExtensions diff --git a/modules/mono/editor/GodotTools/GodotTools.Core/ProcessExtensions.cs b/modules/mono/editor/GodotTools/GodotTools.Core/ProcessExtensions.cs index 43d40f2ad9..a4d7dedbd5 100644 --- a/modules/mono/editor/GodotTools/GodotTools.Core/ProcessExtensions.cs +++ b/modules/mono/editor/GodotTools/GodotTools.Core/ProcessExtensions.cs @@ -7,7 +7,7 @@ namespace GodotTools.Core  {      public static class ProcessExtensions      { -        public static async Task WaitForExitAsync(this Process process, CancellationToken cancellationToken = default(CancellationToken)) +        public static async Task WaitForExitAsync(this Process process, CancellationToken cancellationToken = default)          {              var tcs = new TaskCompletionSource<bool>(); diff --git a/modules/mono/editor/GodotTools/GodotTools.Core/StringExtensions.cs b/modules/mono/editor/GodotTools/GodotTools.Core/StringExtensions.cs index b217ae4bf7..60a4f297c9 100644 --- a/modules/mono/editor/GodotTools/GodotTools.Core/StringExtensions.cs +++ b/modules/mono/editor/GodotTools/GodotTools.Core/StringExtensions.cs @@ -7,6 +7,8 @@ namespace GodotTools.Core  {      public static class StringExtensions      { +        private static readonly string _driveRoot = Path.GetPathRoot(Environment.CurrentDirectory); +          public static string RelativeToPath(this string path, string dir)          {              // Make sure the directory ends with a path separator @@ -49,13 +51,11 @@ namespace GodotTools.Core              return Path.DirectorySeparatorChar + path;          } -        private static readonly string DriveRoot = Path.GetPathRoot(Environment.CurrentDirectory); -          public static bool IsAbsolutePath(this string path)          {              return path.StartsWith("/", StringComparison.Ordinal) ||                     path.StartsWith("\\", StringComparison.Ordinal) || -                   path.StartsWith(DriveRoot, StringComparison.Ordinal); +                   path.StartsWith(_driveRoot, StringComparison.Ordinal);          }          public static string ToSafeDirName(this string dirName, bool allowDirSeparator = false) diff --git a/modules/mono/editor/GodotTools/GodotTools.IdeMessaging/Client.cs b/modules/mono/editor/GodotTools/GodotTools.IdeMessaging/Client.cs index 0f50c90531..bc09e1ebf9 100644 --- a/modules/mono/editor/GodotTools/GodotTools.IdeMessaging/Client.cs +++ b/modules/mono/editor/GodotTools/GodotTools.IdeMessaging/Client.cs @@ -122,13 +122,19 @@ namespace GodotTools.IdeMessaging              this.logger = logger;              string projectMetadataDir = Path.Combine(godotProjectDir, ".godot", "mono", "metadata"); +            // FileSystemWatcher requires an existing directory +            if (!Directory.Exists(projectMetadataDir)) { +                // Check if the non hidden version exists +                string nonHiddenProjectMetadataDir = Path.Combine(godotProjectDir, "godot", "mono", "metadata"); +                if (Directory.Exists(nonHiddenProjectMetadataDir)) { +                    projectMetadataDir = nonHiddenProjectMetadataDir; +                } else { +                    Directory.CreateDirectory(projectMetadataDir); +                } +            }              MetaFilePath = Path.Combine(projectMetadataDir, GodotIdeMetadata.DefaultFileName); -            // FileSystemWatcher requires an existing directory -            if (!Directory.Exists(projectMetadataDir)) -                Directory.CreateDirectory(projectMetadataDir); -              fsWatcher = new FileSystemWatcher(projectMetadataDir, GodotIdeMetadata.DefaultFileName);          } diff --git a/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/DotNetSolution.cs b/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/DotNetSolution.cs index 284e94810a..355b21d63a 100644 --- a/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/DotNetSolution.cs +++ b/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/DotNetSolution.cs @@ -9,15 +9,40 @@ namespace GodotTools.ProjectEditor  {      public class DotNetSolution      { -        private string directoryPath; -        private readonly Dictionary<string, ProjectInfo> projects = new Dictionary<string, ProjectInfo>(); +        private const string _solutionTemplate = +@"Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +{0} +Global +	GlobalSection(SolutionConfigurationPlatforms) = preSolution +{1} +	EndGlobalSection +	GlobalSection(ProjectConfigurationPlatforms) = postSolution +{2} +	EndGlobalSection +EndGlobal +"; + +        private const string _projectDeclaration = +@"Project(""{{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}}"") = ""{0}"", ""{1}"", ""{{{2}}}"" +EndProject"; + +        private const string _solutionPlatformsConfig = +@"	{0}|Any CPU = {0}|Any CPU"; + +        private const string _projectPlatformsConfig = +@"		{{{0}}}.{1}|Any CPU.ActiveCfg = {1}|Any CPU +		{{{0}}}.{1}|Any CPU.Build.0 = {1}|Any CPU"; + +        private string _directoryPath; +        private readonly Dictionary<string, ProjectInfo> _projects = new Dictionary<string, ProjectInfo>();          public string Name { get; }          public string DirectoryPath          { -            get => directoryPath; -            set => directoryPath = value.IsAbsolutePath() ? value : Path.GetFullPath(value); +            get => _directoryPath; +            set => _directoryPath = value.IsAbsolutePath() ? value : Path.GetFullPath(value);          }          public class ProjectInfo @@ -29,22 +54,22 @@ namespace GodotTools.ProjectEditor          public void AddNewProject(string name, ProjectInfo projectInfo)          { -            projects[name] = projectInfo; +            _projects[name] = projectInfo;          }          public bool HasProject(string name)          { -            return projects.ContainsKey(name); +            return _projects.ContainsKey(name);          }          public ProjectInfo GetProjectInfo(string name)          { -            return projects[name]; +            return _projects[name];          }          public bool RemoveProject(string name)          { -            return projects.Remove(name); +            return _projects.Remove(name);          }          public void Save() @@ -58,7 +83,7 @@ namespace GodotTools.ProjectEditor              bool isFirstProject = true; -            foreach (var pair in projects) +            foreach (var pair in _projects)              {                  string name = pair.Key;                  ProjectInfo projectInfo = pair.Value; @@ -66,7 +91,7 @@ namespace GodotTools.ProjectEditor                  if (!isFirstProject)                      projectsDecl += "\n"; -                projectsDecl += string.Format(ProjectDeclaration, +                projectsDecl += string.Format(_projectDeclaration,                      name, projectInfo.PathRelativeToSolution.Replace("/", "\\"), projectInfo.Guid);                  for (int i = 0; i < projectInfo.Configs.Count; i++) @@ -79,15 +104,15 @@ namespace GodotTools.ProjectEditor                          projPlatformsCfg += "\n";                      } -                    slnPlatformsCfg += string.Format(SolutionPlatformsConfig, config); -                    projPlatformsCfg += string.Format(ProjectPlatformsConfig, projectInfo.Guid, config); +                    slnPlatformsCfg += string.Format(_solutionPlatformsConfig, config); +                    projPlatformsCfg += string.Format(_projectPlatformsConfig, projectInfo.Guid, config);                  }                  isFirstProject = false;              }              string solutionPath = Path.Combine(DirectoryPath, Name + ".sln"); -            string content = string.Format(SolutionTemplate, projectsDecl, slnPlatformsCfg, projPlatformsCfg); +            string content = string.Format(_solutionTemplate, projectsDecl, slnPlatformsCfg, projPlatformsCfg);              File.WriteAllText(solutionPath, content, Encoding.UTF8); // UTF-8 with BOM          } @@ -97,37 +122,12 @@ namespace GodotTools.ProjectEditor              Name = name;          } -        const string SolutionTemplate = -@"Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -{0} -Global -	GlobalSection(SolutionConfigurationPlatforms) = preSolution -{1} -	EndGlobalSection -	GlobalSection(ProjectConfigurationPlatforms) = postSolution -{2} -	EndGlobalSection -EndGlobal -"; - -        const string ProjectDeclaration = -@"Project(""{{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}}"") = ""{0}"", ""{1}"", ""{{{2}}}"" -EndProject"; - -        const string SolutionPlatformsConfig = -@"	{0}|Any CPU = {0}|Any CPU"; - -        const string ProjectPlatformsConfig = -@"		{{{0}}}.{1}|Any CPU.ActiveCfg = {1}|Any CPU -		{{{0}}}.{1}|Any CPU.Build.0 = {1}|Any CPU"; -          public static void MigrateFromOldConfigNames(string slnPath)          {              if (!File.Exists(slnPath))                  return; -            var input = File.ReadAllText(slnPath); +            string input = File.ReadAllText(slnPath);              if (!Regex.IsMatch(input, Regex.Escape("Tools|Any CPU")))                  return; @@ -151,7 +151,7 @@ EndProject";              };              var regex = new Regex(string.Join("|", dict.Keys.Select(Regex.Escape))); -            var result = regex.Replace(input, m => dict[m.Value]); +            string result = regex.Replace(input, m => dict[m.Value]);              if (result != input)              { diff --git a/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/IdentifierUtils.cs b/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/IdentifierUtils.cs index ed77076df3..31363df9ef 100644 --- a/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/IdentifierUtils.cs +++ b/modules/mono/editor/GodotTools/GodotTools.ProjectEditor/IdentifierUtils.cs @@ -91,7 +91,7 @@ namespace GodotTools.ProjectEditor              return identifier;          } -        static bool IsKeyword(string value, bool anyDoubleUnderscore) +        private static bool IsKeyword(string value, bool anyDoubleUnderscore)          {              // Identifiers that start with double underscore are meant to be used for reserved keywords.              // Only existing keywords are enforced, but it may be useful to forbid any identifier @@ -103,14 +103,14 @@ namespace GodotTools.ProjectEditor              }              else              { -                if (DoubleUnderscoreKeywords.Contains(value)) +                if (_doubleUnderscoreKeywords.Contains(value))                      return true;              } -            return Keywords.Contains(value); +            return _keywords.Contains(value);          } -        private static readonly HashSet<string> DoubleUnderscoreKeywords = new HashSet<string> +        private static readonly HashSet<string> _doubleUnderscoreKeywords = new HashSet<string>          {              "__arglist",              "__makeref", @@ -118,7 +118,7 @@ namespace GodotTools.ProjectEditor              "__refvalue",          }; -        private static readonly HashSet<string> Keywords = new HashSet<string> +        private static readonly HashSet<string> _keywords = new HashSet<string>          {              "as",              "do", diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/BuildInfo.cs b/modules/mono/editor/GodotTools/GodotTools/Build/BuildInfo.cs index 27737c3da0..28bf57dc21 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Build/BuildInfo.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Build/BuildInfo.cs @@ -13,7 +13,8 @@ namespace GodotTools.Build          public string[] Targets { get; }          public string Configuration { get; }          public bool Restore { get; } -        public Array<string> CustomProperties { get; } = new Array<string>(); // TODO Use List once we have proper serialization +        // TODO Use List once we have proper serialization +        public Array<string> CustomProperties { get; } = new Array<string>();          public string LogsDirPath => Path.Combine(GodotSharpDirs.BuildLogsDirs, $"{Solution.MD5Text()}_{Configuration}"); @@ -32,12 +33,12 @@ namespace GodotTools.Build              unchecked              {                  int hash = 17; -                hash = hash * 29 + Solution.GetHashCode(); -                hash = hash * 29 + Targets.GetHashCode(); -                hash = hash * 29 + Configuration.GetHashCode(); -                hash = hash * 29 + Restore.GetHashCode(); -                hash = hash * 29 + CustomProperties.GetHashCode(); -                hash = hash * 29 + LogsDirPath.GetHashCode(); +                hash = (hash * 29) + Solution.GetHashCode(); +                hash = (hash * 29) + Targets.GetHashCode(); +                hash = (hash * 29) + Configuration.GetHashCode(); +                hash = (hash * 29) + Restore.GetHashCode(); +                hash = (hash * 29) + CustomProperties.GetHashCode(); +                hash = (hash * 29) + LogsDirPath.GetHashCode();                  return hash;              }          } diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/BuildManager.cs b/modules/mono/editor/GodotTools/GodotTools/Build/BuildManager.cs index 2b6f972529..21bff70b15 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Build/BuildManager.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Build/BuildManager.cs @@ -32,7 +32,7 @@ namespace GodotTools.Build          private static void RemoveOldIssuesFile(BuildInfo buildInfo)          { -            var issuesFile = GetIssuesFilePath(buildInfo); +            string issuesFile = GetIssuesFilePath(buildInfo);              if (!File.Exists(issuesFile))                  return; diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/BuildOutputView.cs b/modules/mono/editor/GodotTools/GodotTools/Build/BuildOutputView.cs index 25e260beed..56fca6b5cb 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Build/BuildOutputView.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Build/BuildOutputView.cs @@ -22,14 +22,6 @@ namespace GodotTools.Build              public string ProjectFile { get; set; }          } -        private readonly Array<BuildIssue> issues = new Array<BuildIssue>(); // TODO Use List once we have proper serialization -        private ItemList issuesList; -        private TextEdit buildLog; -        private PopupMenu issuesListContextMenu; - -        private readonly object pendingBuildLogTextLock = new object(); -        [NotNull] private string pendingBuildLogText = string.Empty; -          [Signal] public event Action BuildStateChanged;          public bool HasBuildExited { get; private set; } = false; @@ -60,13 +52,21 @@ namespace GodotTools.Build              }          } -        private BuildInfo BuildInfo { get; set; } -          public bool LogVisible          { -            set => buildLog.Visible = value; +            set => _buildLog.Visible = value;          } +        // TODO Use List once we have proper serialization. +        private readonly Array<BuildIssue> _issues = new Array<BuildIssue>(); +        private ItemList _issuesList; +        private PopupMenu _issuesListContextMenu; +        private TextEdit _buildLog; +        private BuildInfo _buildInfo; + +        private readonly object _pendingBuildLogTextLock = new object(); +        [NotNull] private string _pendingBuildLogText = string.Empty; +          private void LoadIssuesFromFile(string csvFile)          {              using (var file = new Godot.File()) @@ -107,7 +107,7 @@ namespace GodotTools.Build                          else                              ErrorCount += 1; -                        issues.Add(issue); +                        _issues.Add(issue);                      }                  }                  finally @@ -119,21 +119,21 @@ namespace GodotTools.Build          private void IssueActivated(int idx)          { -            if (idx < 0 || idx >= issuesList.GetItemCount()) +            if (idx < 0 || idx >= _issuesList.ItemCount)                  throw new IndexOutOfRangeException("Item list index out of range");              // Get correct issue idx from issue list -            int issueIndex = (int)(long)issuesList.GetItemMetadata(idx); +            int issueIndex = (int)(long)_issuesList.GetItemMetadata(idx); -            if (issueIndex < 0 || issueIndex >= issues.Count) +            if (issueIndex < 0 || issueIndex >= _issues.Count)                  throw new IndexOutOfRangeException("Issue index out of range"); -            BuildIssue issue = issues[issueIndex]; +            BuildIssue issue = _issues[issueIndex];              if (string.IsNullOrEmpty(issue.ProjectFile) && string.IsNullOrEmpty(issue.File))                  return; -            string projectDir = issue.ProjectFile.Length > 0 ? issue.ProjectFile.GetBaseDir() : BuildInfo.Solution.GetBaseDir(); +            string projectDir = issue.ProjectFile.Length > 0 ? issue.ProjectFile.GetBaseDir() : _buildInfo.Solution.GetBaseDir();              string file = Path.Combine(projectDir.SimplifyGodotPath(), issue.File.SimplifyGodotPath()); @@ -153,14 +153,14 @@ namespace GodotTools.Build          public void UpdateIssuesList()          { -            issuesList.Clear(); +            _issuesList.Clear();              using (var warningIcon = GetThemeIcon("Warning", "EditorIcons"))              using (var errorIcon = GetThemeIcon("Error", "EditorIcons"))              { -                for (int i = 0; i < issues.Count; i++) +                for (int i = 0; i < _issues.Count; i++)                  { -                    BuildIssue issue = issues[i]; +                    BuildIssue issue = _issues[i];                      if (!(issue.Warning ? WarningsVisible : ErrorsVisible))                          continue; @@ -191,11 +191,11 @@ namespace GodotTools.Build                      int lineBreakIdx = text.IndexOf("\n", StringComparison.Ordinal);                      string itemText = lineBreakIdx == -1 ? text : text.Substring(0, lineBreakIdx); -                    issuesList.AddItem(itemText, issue.Warning ? warningIcon : errorIcon); +                    _issuesList.AddItem(itemText, issue.Warning ? warningIcon : errorIcon); -                    int index = issuesList.GetItemCount() - 1; -                    issuesList.SetItemTooltip(index, tooltip); -                    issuesList.SetItemMetadata(index, i); +                    int index = _issuesList.ItemCount - 1; +                    _issuesList.SetItemTooltip(index, tooltip); +                    _issuesList.SetItemMetadata(index, i);                  }              }          } @@ -205,12 +205,12 @@ namespace GodotTools.Build              HasBuildExited = true;              BuildResult = Build.BuildResult.Error; -            issuesList.Clear(); +            _issuesList.Clear(); -            var issue = new BuildIssue {Message = cause, Warning = false}; +            var issue = new BuildIssue { Message = cause, Warning = false };              ErrorCount += 1; -            issues.Add(issue); +            _issues.Add(issue);              UpdateIssuesList(); @@ -219,13 +219,13 @@ namespace GodotTools.Build          private void BuildStarted(BuildInfo buildInfo)          { -            BuildInfo = buildInfo; +            _buildInfo = buildInfo;              HasBuildExited = false; -            issues.Clear(); +            _issues.Clear();              WarningCount = 0;              ErrorCount = 0; -            buildLog.Text = string.Empty; +            _buildLog.Text = string.Empty;              UpdateIssuesList(); @@ -237,7 +237,7 @@ namespace GodotTools.Build              HasBuildExited = true;              BuildResult = result; -            LoadIssuesFromFile(Path.Combine(BuildInfo.LogsDirPath, BuildManager.MsBuildIssuesFileName)); +            LoadIssuesFromFile(Path.Combine(_buildInfo.LogsDirPath, BuildManager.MsBuildIssuesFileName));              UpdateIssuesList(); @@ -246,46 +246,46 @@ namespace GodotTools.Build          private void UpdateBuildLogText()          { -            lock (pendingBuildLogTextLock) +            lock (_pendingBuildLogTextLock)              { -                buildLog.Text += pendingBuildLogText; -                pendingBuildLogText = string.Empty; +                _buildLog.Text += _pendingBuildLogText; +                _pendingBuildLogText = string.Empty;                  ScrollToLastNonEmptyLogLine();              }          }          private void StdOutputReceived(string text)          { -            lock (pendingBuildLogTextLock) +            lock (_pendingBuildLogTextLock)              { -                if (pendingBuildLogText.Length == 0) +                if (_pendingBuildLogText.Length == 0)                      CallDeferred(nameof(UpdateBuildLogText)); -                pendingBuildLogText += text + "\n"; +                _pendingBuildLogText += text + "\n";              }          }          private void StdErrorReceived(string text)          { -            lock (pendingBuildLogTextLock) +            lock (_pendingBuildLogTextLock)              { -                if (pendingBuildLogText.Length == 0) +                if (_pendingBuildLogText.Length == 0)                      CallDeferred(nameof(UpdateBuildLogText)); -                pendingBuildLogText += text + "\n"; +                _pendingBuildLogText += text + "\n";              }          }          private void ScrollToLastNonEmptyLogLine()          {              int line; -            for (line = buildLog.GetLineCount(); line > 0; line--) +            for (line = _buildLog.GetLineCount(); line > 0; line--)              { -                string lineText = buildLog.GetLine(line); +                string lineText = _buildLog.GetLine(line);                  if (!string.IsNullOrEmpty(lineText) || !string.IsNullOrEmpty(lineText?.Trim()))                      break;              } -            buildLog.SetCaretLine(line); +            _buildLog.SetCaretLine(line);          }          public void RestartBuild() @@ -318,11 +318,11 @@ namespace GodotTools.Build                      // We don't allow multi-selection but just in case that changes later...                      string text = null; -                    foreach (int issueIndex in issuesList.GetSelectedItems()) +                    foreach (int issueIndex in _issuesList.GetSelectedItems())                      {                          if (text != null)                              text += "\n"; -                        text += issuesList.GetItemText(issueIndex); +                        text += _issuesList.GetItemText(issueIndex);                      }                      if (text != null) @@ -338,20 +338,20 @@ namespace GodotTools.Build          {              _ = index; // Unused -            issuesListContextMenu.Clear(); -            issuesListContextMenu.Size = new Vector2i(1, 1); +            _issuesListContextMenu.Clear(); +            _issuesListContextMenu.Size = new Vector2i(1, 1); -            if (issuesList.IsAnythingSelected()) +            if (_issuesList.IsAnythingSelected())              {                  // Add menu entries for the selected item -                issuesListContextMenu.AddIconItem(GetThemeIcon("ActionCopy", "EditorIcons"), +                _issuesListContextMenu.AddIconItem(GetThemeIcon("ActionCopy", "EditorIcons"),                      label: "Copy Error".TTR(), (int)IssuesContextMenuOption.Copy);              } -            if (issuesListContextMenu.GetItemCount() > 0) +            if (_issuesListContextMenu.ItemCount > 0)              { -                issuesListContextMenu.Position = (Vector2i)(issuesList.RectGlobalPosition + atPosition); -                issuesListContextMenu.Popup(); +                _issuesListContextMenu.Position = (Vector2i)(_issuesList.RectGlobalPosition + atPosition); +                _issuesListContextMenu.Popup();              }          } @@ -368,27 +368,27 @@ namespace GodotTools.Build              };              AddChild(hsc); -            issuesList = new ItemList +            _issuesList = new ItemList              {                  SizeFlagsVertical = (int)SizeFlags.ExpandFill,                  SizeFlagsHorizontal = (int)SizeFlags.ExpandFill // Avoid being squashed by the build log              }; -            issuesList.ItemActivated += IssueActivated; -            issuesList.AllowRmbSelect = true; -            issuesList.ItemRmbSelected += IssuesListRmbSelected; -            hsc.AddChild(issuesList); +            _issuesList.ItemActivated += IssueActivated; +            _issuesList.AllowRmbSelect = true; +            _issuesList.ItemRmbSelected += IssuesListRmbSelected; +            hsc.AddChild(_issuesList); -            issuesListContextMenu = new PopupMenu(); -            issuesListContextMenu.IdPressed += IssuesListContextOptionPressed; -            issuesList.AddChild(issuesListContextMenu); +            _issuesListContextMenu = new PopupMenu(); +            _issuesListContextMenu.IdPressed += IssuesListContextOptionPressed; +            _issuesList.AddChild(_issuesListContextMenu); -            buildLog = new TextEdit +            _buildLog = new TextEdit              {                  Editable = false,                  SizeFlagsVertical = (int)SizeFlags.ExpandFill,                  SizeFlagsHorizontal = (int)SizeFlags.ExpandFill // Avoid being squashed by the issues list              }; -            hsc.AddChild(buildLog); +            hsc.AddChild(_buildLog);              AddBuildEventListeners();          } diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/MSBuildPanel.cs b/modules/mono/editor/GodotTools/GodotTools/Build/MSBuildPanel.cs index 5f35d506de..e9cf7911be 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Build/MSBuildPanel.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Build/MSBuildPanel.cs @@ -11,10 +11,10 @@ namespace GodotTools.Build      {          public BuildOutputView BuildOutputView { get; private set; } -        private MenuButton buildMenuBtn; -        private Button errorsBtn; -        private Button warningsBtn; -        private Button viewLogBtn; +        private MenuButton _buildMenuBtn; +        private Button _errorsBtn; +        private Button _warningsBtn; +        private Button _viewLogBtn;          private void WarningsToggled(bool pressed)          { @@ -132,16 +132,16 @@ namespace GodotTools.Build              var toolBarHBox = new HBoxContainer { SizeFlagsHorizontal = (int)SizeFlags.ExpandFill };              AddChild(toolBarHBox); -            buildMenuBtn = new MenuButton { Text = "Build", Icon = GetThemeIcon("Play", "EditorIcons") }; -            toolBarHBox.AddChild(buildMenuBtn); +            _buildMenuBtn = new MenuButton { Text = "Build", Icon = GetThemeIcon("Play", "EditorIcons") }; +            toolBarHBox.AddChild(_buildMenuBtn); -            var buildMenu = buildMenuBtn.GetPopup(); +            var buildMenu = _buildMenuBtn.GetPopup();              buildMenu.AddItem("Build Solution".TTR(), (int)BuildMenuOptions.BuildSolution);              buildMenu.AddItem("Rebuild Solution".TTR(), (int)BuildMenuOptions.RebuildSolution);              buildMenu.AddItem("Clean Solution".TTR(), (int)BuildMenuOptions.CleanSolution);              buildMenu.IdPressed += BuildMenuOptionPressed; -            errorsBtn = new Button +            _errorsBtn = new Button              {                  HintTooltip = "Show Errors".TTR(),                  Icon = GetThemeIcon("StatusError", "EditorIcons"), @@ -150,10 +150,10 @@ namespace GodotTools.Build                  Pressed = true,                  FocusMode = FocusModeEnum.None              }; -            errorsBtn.Toggled += ErrorsToggled; -            toolBarHBox.AddChild(errorsBtn); +            _errorsBtn.Toggled += ErrorsToggled; +            toolBarHBox.AddChild(_errorsBtn); -            warningsBtn = new Button +            _warningsBtn = new Button              {                  HintTooltip = "Show Warnings".TTR(),                  Icon = GetThemeIcon("NodeWarning", "EditorIcons"), @@ -162,18 +162,18 @@ namespace GodotTools.Build                  Pressed = true,                  FocusMode = FocusModeEnum.None              }; -            warningsBtn.Toggled += WarningsToggled; -            toolBarHBox.AddChild(warningsBtn); +            _warningsBtn.Toggled += WarningsToggled; +            toolBarHBox.AddChild(_warningsBtn); -            viewLogBtn = new Button +            _viewLogBtn = new Button              {                  Text = "Show Output".TTR(),                  ToggleMode = true,                  Pressed = true,                  FocusMode = FocusModeEnum.None              }; -            viewLogBtn.Toggled += ViewLogToggled; -            toolBarHBox.AddChild(viewLogBtn); +            _viewLogBtn.Toggled += ViewLogToggled; +            toolBarHBox.AddChild(_viewLogBtn);              BuildOutputView = new BuildOutputView();              AddChild(BuildOutputView); @@ -185,12 +185,12 @@ namespace GodotTools.Build              if (what == NotificationThemeChanged)              { -                if (buildMenuBtn != null) -                    buildMenuBtn.Icon = GetThemeIcon("Play", "EditorIcons"); -                if (errorsBtn != null) -                    errorsBtn.Icon = GetThemeIcon("StatusError", "EditorIcons"); -                if (warningsBtn != null) -                    warningsBtn.Icon = GetThemeIcon("NodeWarning", "EditorIcons"); +                if (_buildMenuBtn != null) +                    _buildMenuBtn.Icon = GetThemeIcon("Play", "EditorIcons"); +                if (_errorsBtn != null) +                    _errorsBtn.Icon = GetThemeIcon("StatusError", "EditorIcons"); +                if (_warningsBtn != null) +                    _warningsBtn.Icon = GetThemeIcon("NodeWarning", "EditorIcons");              }          }      } diff --git a/modules/mono/editor/GodotTools/GodotTools/Build/MsBuildFinder.cs b/modules/mono/editor/GodotTools/GodotTools/Build/MsBuildFinder.cs index 774c49e705..a859c6f717 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Build/MsBuildFinder.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Build/MsBuildFinder.cs @@ -61,7 +61,7 @@ namespace GodotTools.Build                      }                      case BuildTool.JetBrainsMsBuild:                      { -                        var editorPath = (string)editorSettings.GetSetting(RiderPathManager.EditorPathSettingName); +                        string editorPath = (string)editorSettings.GetSetting(RiderPathManager.EditorPathSettingName);                          if (!File.Exists(editorPath))                              throw new FileNotFoundException($"Cannot find Rider executable. Tried with path: {editorPath}"); @@ -165,7 +165,9 @@ namespace GodotTools.Build              // Try to find 15.0 with vswhere -            var envNames = Internal.GodotIs32Bits() ? new[] {"ProgramFiles", "ProgramW6432"} : new[] {"ProgramFiles(x86)", "ProgramFiles"}; +            string[] envNames = Internal.GodotIs32Bits() ? +                envNames = new[] { "ProgramFiles", "ProgramW6432" } : +                envNames = new[] { "ProgramFiles(x86)", "ProgramFiles" };              string vsWherePath = null;              foreach (var envName in envNames) diff --git a/modules/mono/editor/GodotTools/GodotTools/Export/AotBuilder.cs b/modules/mono/editor/GodotTools/GodotTools/Export/AotBuilder.cs index f69307104f..37e6a34977 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Export/AotBuilder.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Export/AotBuilder.cs @@ -65,12 +65,12 @@ namespace GodotTools.Export              if (platform == OS.Platforms.iOS)              { -                var architectures = GetEnablediOSArchs(features).ToArray(); +                string[] architectures = GetEnablediOSArchs(features).ToArray();                  CompileAssembliesForiOS(exporter, isDebug, architectures, aotOpts, aotTempDir, assembliesPrepared, bclDir);              }              else if (platform == OS.Platforms.Android)              { -                var abis = GetEnabledAndroidAbis(features).ToArray(); +                string[] abis = GetEnabledAndroidAbis(features).ToArray();                  CompileAssembliesForAndroid(exporter, isDebug, abis, aotOpts, aotTempDir, assembliesPrepared, bclDir);              }              else @@ -138,7 +138,8 @@ namespace GodotTools.Export                  }                  else                  { -                    string outputDataLibDir = Path.Combine(outputDataDir, "Mono", platform == OS.Platforms.Windows ? "bin" : "lib"); +                    string libDir = platform == OS.Platforms.Windows ? "bin" : "lib"; +                    string outputDataLibDir = Path.Combine(outputDataDir, "Mono", libDir);                      File.Copy(tempOutputFilePath, Path.Combine(outputDataLibDir, outputFileName));                  }              } diff --git a/modules/mono/editor/GodotTools/GodotTools/Export/ExportPlugin.cs b/modules/mono/editor/GodotTools/GodotTools/Export/ExportPlugin.cs index 0b5aa72a81..3e46a89b7c 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Export/ExportPlugin.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Export/ExportPlugin.cs @@ -20,7 +20,7 @@ namespace GodotTools.Export      public class ExportPlugin : EditorExportPlugin      {          [Flags] -        enum I18NCodesets : long +        private enum I18NCodesets : long          {              None = 0,              CJK = 1, @@ -31,6 +31,8 @@ namespace GodotTools.Export              All = CJK | MidEast | Other | Rare | West          } +        private string _maybeLastExportError; +          private void AddI18NAssemblies(Godot.Collections.Dictionary<string, string> assemblies, string bclDir)          {              var codesets = (I18NCodesets)ProjectSettings.GetSetting("mono/export/i18n_codesets"); @@ -83,8 +85,6 @@ namespace GodotTools.Export              GlobalDef("mono/export/aot/android_toolchain_path", "");          } -        private string maybeLastExportError; -          private void AddFile(string srcPath, string dstPath, bool remap = false)          {              // Add file to the PCK @@ -129,14 +129,14 @@ namespace GodotTools.Export              }              catch (Exception e)              { -                maybeLastExportError = e.Message; +                _maybeLastExportError = e.Message;                  // 'maybeLastExportError' cannot be null or empty if there was an error, so we                  // must consider the possibility of exceptions being thrown without a message. -                if (string.IsNullOrEmpty(maybeLastExportError)) -                    maybeLastExportError = $"Exception thrown: {e.GetType().Name}"; +                if (string.IsNullOrEmpty(_maybeLastExportError)) +                    _maybeLastExportError = $"Exception thrown: {e.GetType().Name}"; -                GD.PushError($"Failed to export project: {maybeLastExportError}"); +                GD.PushError($"Failed to export project: {_maybeLastExportError}");                  Console.Error.WriteLine(e);                  // TODO: Do something on error once _ExportBegin supports failing.              } @@ -317,10 +317,10 @@ namespace GodotTools.Export                  Directory.Delete(aotTempDir, recursive: true);              // TODO: Just a workaround until the export plugins can be made to abort with errors -            if (!string.IsNullOrEmpty(maybeLastExportError)) // Check empty as well, because it's set to empty after hot-reloading +            if (!string.IsNullOrEmpty(_maybeLastExportError)) // Check empty as well, because it's set to empty after hot-reloading              { -                string lastExportError = maybeLastExportError; -                maybeLastExportError = null; +                string lastExportError = _maybeLastExportError; +                _maybeLastExportError = null;                  GodotSharpEditor.Instance.ShowErrorDialog(lastExportError, "Failed to export C# project");              } @@ -470,7 +470,7 @@ namespace GodotTools.Export          private static string DetermineDataDirNameForProject()          { -            var appName = (string)ProjectSettings.GetSetting("application/config/name"); +            string appName = (string)ProjectSettings.GetSetting("application/config/name");              string appNameSafe = appName.ToSafeDirName();              return $"data_{appNameSafe}";          } diff --git a/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs b/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs index 1faa6eeac0..98c6881166 100644 --- a/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs +++ b/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs @@ -21,18 +21,19 @@ namespace GodotTools  {      public class GodotSharpEditor : EditorPlugin, ISerializationListener      { -        private EditorSettings editorSettings; +        private EditorSettings _editorSettings; -        private PopupMenu menuPopup; +        private PopupMenu _menuPopup; -        private AcceptDialog errorDialog; +        private AcceptDialog _errorDialog; -        private Button bottomPanelBtn; -        private Button toolBarBuildButton; +        private Button _bottomPanelBtn; +        private Button _toolBarBuildButton; -        public GodotIdeManager GodotIdeManager { get; private set; } +        // TODO Use WeakReference once we have proper serialization. +        private WeakRef _exportPluginWeak; -        private WeakRef exportPluginWeak; // TODO Use WeakReference once we have proper serialization +        public GodotIdeManager GodotIdeManager { get; private set; }          public MSBuildPanel MSBuildPanel { get; private set; } @@ -42,7 +43,7 @@ namespace GodotTools          {              get              { -                var projectAssemblyName = (string)ProjectSettings.GetSetting("application/config/name"); +                string projectAssemblyName = (string)ProjectSettings.GetSetting("application/config/name");                  projectAssemblyName = projectAssemblyName.ToSafeDirName();                  if (string.IsNullOrEmpty(projectAssemblyName))                      projectAssemblyName = "UnnamedProject"; @@ -123,9 +124,9 @@ namespace GodotTools          private void _RemoveCreateSlnMenuOption()          { -            menuPopup.RemoveItem(menuPopup.GetItemIndex((int)MenuOptions.CreateSln)); -            bottomPanelBtn.Show(); -            toolBarBuildButton.Show(); +            _menuPopup.RemoveItem(_menuPopup.GetItemIndex((int)MenuOptions.CreateSln)); +            _bottomPanelBtn.Show(); +            _toolBarBuildButton.Show();          }          private void _MenuOptionPressed(int id) @@ -181,9 +182,9 @@ namespace GodotTools          public void ShowErrorDialog(string message, string title = "Error")          { -            errorDialog.Title = title; -            errorDialog.DialogText = message; -            errorDialog.PopupCentered(); +            _errorDialog.Title = title; +            _errorDialog.DialogText = message; +            _errorDialog.PopupCentered();          }          private static string _vsCodePath = string.Empty; @@ -196,7 +197,7 @@ namespace GodotTools          [UsedImplicitly]          public Error OpenInExternalEditor(Script script, int line, int col)          { -            var editorId = (ExternalEditorId)editorSettings.GetSetting("mono/editor/external_editor"); +            var editorId = (ExternalEditorId)_editorSettings.GetSetting("mono/editor/external_editor");              switch (editorId)              { @@ -287,7 +288,7 @@ namespace GodotTools                          }                      } -                    var resourcePath = ProjectSettings.GlobalizePath("res://"); +                    string resourcePath = ProjectSettings.GlobalizePath("res://");                      args.Add(resourcePath);                      string scriptPath = ProjectSettings.GlobalizePath(script.ResourcePath); @@ -346,7 +347,7 @@ namespace GodotTools          [UsedImplicitly]          public bool OverridesExternalEditor()          { -            return (ExternalEditorId)editorSettings.GetSetting("mono/editor/external_editor") != ExternalEditorId.None; +            return (ExternalEditorId)_editorSettings.GetSetting("mono/editor/external_editor") != ExternalEditorId.None;          }          public override bool _Build() @@ -387,8 +388,8 @@ namespace GodotTools          private void BuildStateChanged()          { -            if (bottomPanelBtn != null) -                bottomPanelBtn.Icon = MSBuildPanel.BuildOutputView.BuildStateIcon; +            if (_bottomPanelBtn != null) +                _bottomPanelBtn.Icon = MSBuildPanel.BuildOutputView.BuildStateIcon;          }          public override void _EnablePlugin() @@ -402,29 +403,33 @@ namespace GodotTools              var editorInterface = GetEditorInterface();              var editorBaseControl = editorInterface.GetBaseControl(); -            editorSettings = editorInterface.GetEditorSettings(); +            _editorSettings = editorInterface.GetEditorSettings(); -            errorDialog = new AcceptDialog(); -            editorBaseControl.AddChild(errorDialog); +            _errorDialog = new AcceptDialog(); +            editorBaseControl.AddChild(_errorDialog);              MSBuildPanel = new MSBuildPanel(); -            bottomPanelBtn = AddControlToBottomPanel(MSBuildPanel, "MSBuild".TTR()); +            _bottomPanelBtn = AddControlToBottomPanel(MSBuildPanel, "MSBuild".TTR());              AddChild(new HotReloadAssemblyWatcher {Name = "HotReloadAssemblyWatcher"}); -            menuPopup = new PopupMenu(); -            menuPopup.Hide(); +            _menuPopup = new PopupMenu(); +            _menuPopup.Hide(); + +            AddToolSubmenuItem("C#", _menuPopup); -            AddToolSubmenuItem("C#", menuPopup); +            var buildSolutionShortcut = (Shortcut)EditorShortcut("mono/build_solution"); -            toolBarBuildButton = new Button +            _toolBarBuildButton = new Button              {                  Text = "Build", -                HintTooltip = "Build solution", -                FocusMode = Control.FocusModeEnum.None +                HintTooltip = "Build Solution".TTR(), +                FocusMode = Control.FocusModeEnum.None, +                Shortcut = buildSolutionShortcut, +                ShortcutInTooltip = true              }; -            toolBarBuildButton.PressedSignal += BuildSolutionPressed; -            AddControlToContainer(CustomControlContainer.Toolbar, toolBarBuildButton); +            _toolBarBuildButton.PressedSignal += BuildSolutionPressed; +            AddControlToContainer(CustomControlContainer.Toolbar, _toolBarBuildButton);              if (File.Exists(GodotSharpDirs.ProjectSlnPath) && File.Exists(GodotSharpDirs.ProjectCsProjPath))              { @@ -432,12 +437,12 @@ namespace GodotTools              }              else              { -                bottomPanelBtn.Hide(); -                toolBarBuildButton.Hide(); -                menuPopup.AddItem("Create C# solution".TTR(), (int)MenuOptions.CreateSln); +                _bottomPanelBtn.Hide(); +                _toolBarBuildButton.Hide(); +                _menuPopup.AddItem("Create C# solution".TTR(), (int)MenuOptions.CreateSln);              } -            menuPopup.IdPressed += _MenuOptionPressed; +            _menuPopup.IdPressed += _MenuOptionPressed;              // External editor settings              EditorDef("mono/editor/external_editor", ExternalEditorId.None); @@ -465,7 +470,7 @@ namespace GodotTools                                     $",JetBrains Rider:{(int)ExternalEditorId.Rider}";              } -            editorSettings.AddPropertyInfo(new Godot.Collections.Dictionary +            _editorSettings.AddPropertyInfo(new Godot.Collections.Dictionary              {                  ["type"] = Variant.Type.Int,                  ["name"] = "mono/editor/external_editor", @@ -477,7 +482,7 @@ namespace GodotTools              var exportPlugin = new ExportPlugin();              AddExportPlugin(exportPlugin);              exportPlugin.RegisterExportSettings(); -            exportPluginWeak = WeakRef(exportPlugin); +            _exportPluginWeak = WeakRef(exportPlugin);              try              { @@ -500,15 +505,15 @@ namespace GodotTools          {              base.Dispose(disposing); -            if (exportPluginWeak != null) +            if (_exportPluginWeak != null)              {                  // We need to dispose our export plugin before the editor destroys EditorSettings.                  // Otherwise, if the GC disposes it at a later time, EditorExportPlatformAndroid                  // will be freed after EditorSettings already was, and its device polling thread                  // will try to access the EditorSettings singleton, resulting in null dereferencing. -                (exportPluginWeak.GetRef() as ExportPlugin)?.Dispose(); +                (_exportPluginWeak.GetRef() as ExportPlugin)?.Dispose(); -                exportPluginWeak.Dispose(); +                _exportPluginWeak.Dispose();              }              GodotIdeManager?.Dispose(); diff --git a/modules/mono/editor/GodotTools/GodotTools/HotReloadAssemblyWatcher.cs b/modules/mono/editor/GodotTools/GodotTools/HotReloadAssemblyWatcher.cs index b30c857c64..dd05f28af0 100644 --- a/modules/mono/editor/GodotTools/GodotTools/HotReloadAssemblyWatcher.cs +++ b/modules/mono/editor/GodotTools/GodotTools/HotReloadAssemblyWatcher.cs @@ -6,7 +6,7 @@ namespace GodotTools  {      public class HotReloadAssemblyWatcher : Node      { -        private Timer watchTimer; +        private Timer _watchTimer;          public override void _Notification(int what)          { @@ -27,22 +27,22 @@ namespace GodotTools          public void RestartTimer()          { -            watchTimer.Stop(); -            watchTimer.Start(); +            _watchTimer.Stop(); +            _watchTimer.Start();          }          public override void _Ready()          {              base._Ready(); -            watchTimer = new Timer +            _watchTimer = new Timer              {                  OneShot = false,                  WaitTime = (float)EditorDef("mono/assembly_watch_interval_sec", 0.5)              }; -            watchTimer.Timeout += TimerTimeout; -            AddChild(watchTimer); -            watchTimer.Start(); +            _watchTimer.Timeout += TimerTimeout; +            AddChild(_watchTimer); +            _watchTimer.Start();          }      }  } diff --git a/modules/mono/editor/GodotTools/GodotTools/Ides/GodotIdeManager.cs b/modules/mono/editor/GodotTools/GodotTools/Ides/GodotIdeManager.cs index 451ce39f5c..23339fe50b 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Ides/GodotIdeManager.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Ides/GodotIdeManager.cs @@ -10,22 +10,22 @@ namespace GodotTools.Ides  {      public sealed class GodotIdeManager : Node, ISerializationListener      { -        private MessagingServer MessagingServer { get; set; } +        private MessagingServer _messagingServer; -        private MonoDevelop.Instance monoDevelInstance; -        private MonoDevelop.Instance vsForMacInstance; +        private MonoDevelop.Instance _monoDevelInstance; +        private MonoDevelop.Instance _vsForMacInstance;          private MessagingServer GetRunningOrNewServer()          { -            if (MessagingServer != null && !MessagingServer.IsDisposed) -                return MessagingServer; +            if (_messagingServer != null && !_messagingServer.IsDisposed) +                return _messagingServer; -            MessagingServer?.Dispose(); -            MessagingServer = new MessagingServer(OS.GetExecutablePath(), ProjectSettings.GlobalizePath(GodotSharpDirs.ResMetadataDir), new GodotLogger()); +            _messagingServer?.Dispose(); +            _messagingServer = new MessagingServer(OS.GetExecutablePath(), ProjectSettings.GlobalizePath(GodotSharpDirs.ResMetadataDir), new GodotLogger()); -            _ = MessagingServer.Listen(); +            _ = _messagingServer.Listen(); -            return MessagingServer; +            return _messagingServer;          }          public override void _Ready() @@ -48,7 +48,7 @@ namespace GodotTools.Ides              if (disposing)              { -                MessagingServer?.Dispose(); +                _messagingServer?.Dispose();              }          } @@ -113,14 +113,14 @@ namespace GodotTools.Ides                      {                          if (Utils.OS.IsMacOS && editorId == ExternalEditorId.VisualStudioForMac)                          { -                            vsForMacInstance = (vsForMacInstance?.IsDisposed ?? true ? null : vsForMacInstance) ?? +                            _vsForMacInstance = (_vsForMacInstance?.IsDisposed ?? true ? null : _vsForMacInstance) ??                                                 new MonoDevelop.Instance(solutionPath, MonoDevelop.EditorId.VisualStudioForMac); -                            return vsForMacInstance; +                            return _vsForMacInstance;                          } -                        monoDevelInstance = (monoDevelInstance?.IsDisposed ?? true ? null : monoDevelInstance) ?? +                        _monoDevelInstance = (_monoDevelInstance?.IsDisposed ?? true ? null : _monoDevelInstance) ??                                              new MonoDevelop.Instance(solutionPath, MonoDevelop.EditorId.MonoDevelop); -                        return monoDevelInstance; +                        return _monoDevelInstance;                      }                      try @@ -159,15 +159,15 @@ namespace GodotTools.Ides          public readonly struct EditorPick          { -            private readonly string identity; +            private readonly string _identity;              public EditorPick(string identity)              { -                this.identity = identity; +                _identity = identity;              }              public bool IsAnyConnected() => -                GodotSharpEditor.Instance.GodotIdeManager.GetRunningOrNewServer().IsAnyConnected(identity); +                GodotSharpEditor.Instance.GodotIdeManager.GetRunningOrNewServer().IsAnyConnected(_identity);              private void SendRequest<TResponse>(Request request)                  where TResponse : Response, new() @@ -175,7 +175,7 @@ namespace GodotTools.Ides                  // Logs an error if no client is connected with the specified identity                  GodotSharpEditor.Instance.GodotIdeManager                      .GetRunningOrNewServer() -                    .BroadcastRequest<TResponse>(identity, request); +                    .BroadcastRequest<TResponse>(_identity, request);              }              public void SendOpenFile(string file) diff --git a/modules/mono/editor/GodotTools/GodotTools/Ides/MessagingServer.cs b/modules/mono/editor/GodotTools/GodotTools/Ides/MessagingServer.cs index eb34a2d0f7..6f11831b80 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Ides/MessagingServer.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Ides/MessagingServer.cs @@ -21,24 +21,26 @@ namespace GodotTools.Ides  {      public sealed class MessagingServer : IDisposable      { -        private readonly ILogger logger; +        private readonly ILogger _logger; -        private readonly FileStream metaFile; -        private string MetaFilePath { get; } +        private readonly FileStream _metaFile; +        private string _metaFilePath; -        private readonly SemaphoreSlim peersSem = new SemaphoreSlim(1); +        private readonly SemaphoreSlim _peersSem = new SemaphoreSlim(1); -        private readonly TcpListener listener; +        private readonly TcpListener _listener; -        private readonly Dictionary<string, Queue<NotifyAwaiter<bool>>> clientConnectedAwaiters = new Dictionary<string, Queue<NotifyAwaiter<bool>>>(); -        private readonly Dictionary<string, Queue<NotifyAwaiter<bool>>> clientDisconnectedAwaiters = new Dictionary<string, Queue<NotifyAwaiter<bool>>>(); +        private readonly Dictionary<string, Queue<NotifyAwaiter<bool>>> _clientConnectedAwaiters = +            new Dictionary<string, Queue<NotifyAwaiter<bool>>>(); +        private readonly Dictionary<string, Queue<NotifyAwaiter<bool>>> _clientDisconnectedAwaiters = +            new Dictionary<string, Queue<NotifyAwaiter<bool>>>();          public async Task<bool> AwaitClientConnected(string identity)          { -            if (!clientConnectedAwaiters.TryGetValue(identity, out var queue)) +            if (!_clientConnectedAwaiters.TryGetValue(identity, out var queue))              {                  queue = new Queue<NotifyAwaiter<bool>>(); -                clientConnectedAwaiters.Add(identity, queue); +                _clientConnectedAwaiters.Add(identity, queue);              }              var awaiter = new NotifyAwaiter<bool>(); @@ -48,10 +50,10 @@ namespace GodotTools.Ides          public async Task<bool> AwaitClientDisconnected(string identity)          { -            if (!clientDisconnectedAwaiters.TryGetValue(identity, out var queue)) +            if (!_clientDisconnectedAwaiters.TryGetValue(identity, out var queue))              {                  queue = new Queue<NotifyAwaiter<bool>>(); -                clientDisconnectedAwaiters.Add(identity, queue); +                _clientDisconnectedAwaiters.Add(identity, queue);              }              var awaiter = new NotifyAwaiter<bool>(); @@ -77,7 +79,7 @@ namespace GodotTools.Ides              if (IsDisposed)                  return; -            using (await peersSem.UseAsync()) +            using (await _peersSem.UseAsync())              {                  if (IsDisposed) // lock may not be fair                      return; @@ -95,19 +97,19 @@ namespace GodotTools.Ides                  foreach (var connection in Peers)                      connection.Dispose();                  Peers.Clear(); -                listener?.Stop(); +                _listener?.Stop(); -                metaFile?.Dispose(); +                _metaFile?.Dispose(); -                File.Delete(MetaFilePath); +                File.Delete(_metaFilePath);              }          }          public MessagingServer(string editorExecutablePath, string projectMetadataDir, ILogger logger)          { -            this.logger = logger; +            this._logger = logger; -            MetaFilePath = Path.Combine(projectMetadataDir, GodotIdeMetadata.DefaultFileName); +            _metaFilePath = Path.Combine(projectMetadataDir, GodotIdeMetadata.DefaultFileName);              // Make sure the directory exists              Directory.CreateDirectory(projectMetadataDir); @@ -115,13 +117,13 @@ namespace GodotTools.Ides              // The Godot editor's file system thread can keep the file open for writing, so we are forced to allow write sharing...              const FileShare metaFileShare = FileShare.ReadWrite; -            metaFile = File.Open(MetaFilePath, FileMode.Create, FileAccess.Write, metaFileShare); +            _metaFile = File.Open(_metaFilePath, FileMode.Create, FileAccess.Write, metaFileShare); -            listener = new TcpListener(new IPEndPoint(IPAddress.Loopback, port: 0)); -            listener.Start(); +            _listener = new TcpListener(new IPEndPoint(IPAddress.Loopback, port: 0)); +            _listener.Start(); -            int port = ((IPEndPoint)listener.Server.LocalEndPoint).Port; -            using (var metaFileWriter = new StreamWriter(metaFile, Encoding.UTF8)) +            int port = ((IPEndPoint)_listener.Server.LocalEndPoint).Port; +            using (var metaFileWriter = new StreamWriter(_metaFile, Encoding.UTF8))              {                  metaFileWriter.WriteLine(port);                  metaFileWriter.WriteLine(editorExecutablePath); @@ -130,30 +132,30 @@ namespace GodotTools.Ides          private async Task AcceptClient(TcpClient tcpClient)          { -            logger.LogDebug("Accept client..."); +            _logger.LogDebug("Accept client..."); -            using (var peer = new Peer(tcpClient, new ServerHandshake(), new ServerMessageHandler(), logger)) +            using (var peer = new Peer(tcpClient, new ServerHandshake(), new ServerMessageHandler(), _logger))              {                  // ReSharper disable AccessToDisposedClosure                  peer.Connected += () =>                  { -                    logger.LogInfo("Connection open with Ide Client"); +                    _logger.LogInfo("Connection open with Ide Client"); -                    if (clientConnectedAwaiters.TryGetValue(peer.RemoteIdentity, out var queue)) +                    if (_clientConnectedAwaiters.TryGetValue(peer.RemoteIdentity, out var queue))                      {                          while (queue.Count > 0)                              queue.Dequeue().SetResult(true); -                        clientConnectedAwaiters.Remove(peer.RemoteIdentity); +                        _clientConnectedAwaiters.Remove(peer.RemoteIdentity);                      }                  };                  peer.Disconnected += () =>                  { -                    if (clientDisconnectedAwaiters.TryGetValue(peer.RemoteIdentity, out var queue)) +                    if (_clientDisconnectedAwaiters.TryGetValue(peer.RemoteIdentity, out var queue))                      {                          while (queue.Count > 0)                              queue.Dequeue().SetResult(true); -                        clientDisconnectedAwaiters.Remove(peer.RemoteIdentity); +                        _clientDisconnectedAwaiters.Remove(peer.RemoteIdentity);                      }                  };                  // ReSharper restore AccessToDisposedClosure @@ -162,17 +164,17 @@ namespace GodotTools.Ides                  {                      if (!await peer.DoHandshake("server"))                      { -                        logger.LogError("Handshake failed"); +                        _logger.LogError("Handshake failed");                          return;                      }                  }                  catch (Exception e)                  { -                    logger.LogError("Handshake failed with unhandled exception: ", e); +                    _logger.LogError("Handshake failed with unhandled exception: ", e);                      return;                  } -                using (await peersSem.UseAsync()) +                using (await _peersSem.UseAsync())                      Peers.Add(peer);                  try @@ -181,7 +183,7 @@ namespace GodotTools.Ides                  }                  finally                  { -                    using (await peersSem.UseAsync()) +                    using (await _peersSem.UseAsync())                          Peers.Remove(peer);                  }              } @@ -192,7 +194,7 @@ namespace GodotTools.Ides              try              {                  while (!IsDisposed) -                    _ = AcceptClient(await listener.AcceptTcpClientAsync()); +                    _ = AcceptClient(await _listener.AcceptTcpClientAsync());              }              catch (Exception e)              { @@ -204,11 +206,11 @@ namespace GodotTools.Ides          public async void BroadcastRequest<TResponse>(string identity, Request request)              where TResponse : Response, new()          { -            using (await peersSem.UseAsync()) +            using (await _peersSem.UseAsync())              {                  if (!IsAnyConnected(identity))                  { -                    logger.LogError("Cannot write request. No client connected to the Godot Ide Server."); +                    _logger.LogError("Cannot write request. No client connected to the Godot Ide Server.");                      return;                  } @@ -225,16 +227,19 @@ namespace GodotTools.Ides          private class ServerHandshake : IHandshake          { -            private static readonly string ServerHandshakeBase = $"{Peer.ServerHandshakeName},Version={Peer.ProtocolVersionMajor}.{Peer.ProtocolVersionMinor}.{Peer.ProtocolVersionRevision}"; -            private static readonly string ClientHandshakePattern = $@"{Regex.Escape(Peer.ClientHandshakeName)},Version=([0-9]+)\.([0-9]+)\.([0-9]+),([_a-zA-Z][_a-zA-Z0-9]{{0,63}})"; +            private static readonly string _serverHandshakeBase = +                $"{Peer.ServerHandshakeName},Version={Peer.ProtocolVersionMajor}.{Peer.ProtocolVersionMinor}.{Peer.ProtocolVersionRevision}"; -            public string GetHandshakeLine(string identity) => $"{ServerHandshakeBase},{identity}"; +            private static readonly string _clientHandshakePattern = +                $@"{Regex.Escape(Peer.ClientHandshakeName)},Version=([0-9]+)\.([0-9]+)\.([0-9]+),([_a-zA-Z][_a-zA-Z0-9]{{0,63}})"; + +            public string GetHandshakeLine(string identity) => $"{_serverHandshakeBase},{identity}";              public bool IsValidPeerHandshake(string handshake, out string identity, ILogger logger)              {                  identity = null; -                var match = Regex.Match(handshake, ClientHandshakePattern); +                var match = Regex.Match(handshake, _clientHandshakePattern);                  if (!match.Success)                      return false; diff --git a/modules/mono/editor/GodotTools/GodotTools/Ides/MonoDevelop/Instance.cs b/modules/mono/editor/GodotTools/GodotTools/Ides/MonoDevelop/Instance.cs index fd7bbd5578..3f1d5ac3ca 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Ides/MonoDevelop/Instance.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Ides/MonoDevelop/Instance.cs @@ -10,17 +10,17 @@ namespace GodotTools.Ides.MonoDevelop      public class Instance : IDisposable      {          public DateTime LaunchTime { get; private set; } -        private readonly string solutionFile; -        private readonly EditorId editorId; +        private readonly string _solutionFile; +        private readonly EditorId _editorId; -        private Process process; +        private Process _process; -        public bool IsRunning => process != null && !process.HasExited; +        public bool IsRunning => _process != null && !_process.HasExited;          public bool IsDisposed { get; private set; }          public void Execute()          { -            bool newWindow = process == null || process.HasExited; +            bool newWindow = _process == null || _process.HasExited;              var args = new List<string>(); @@ -28,7 +28,7 @@ namespace GodotTools.Ides.MonoDevelop              if (OS.IsMacOS)              { -                string bundleId = BundleIds[editorId]; +                string bundleId = BundleIds[_editorId];                  if (Internal.IsOsxAppBundleInstalled(bundleId))                  { @@ -45,18 +45,18 @@ namespace GodotTools.Ides.MonoDevelop                  }                  else                  { -                    command = OS.PathWhich(ExecutableNames[editorId]); +                    command = OS.PathWhich(ExecutableNames[_editorId]);                  }              }              else              { -                command = OS.PathWhich(ExecutableNames[editorId]); +                command = OS.PathWhich(ExecutableNames[_editorId]);              }              args.Add("--ipc-tcp");              if (newWindow) -                args.Add("\"" + Path.GetFullPath(solutionFile) + "\""); +                args.Add("\"" + Path.GetFullPath(_solutionFile) + "\"");              if (command == null)                  throw new FileNotFoundException(); @@ -65,7 +65,7 @@ namespace GodotTools.Ides.MonoDevelop              if (newWindow)              { -                process = Process.Start(new ProcessStartInfo +                _process = Process.Start(new ProcessStartInfo                  {                      FileName = command,                      Arguments = string.Join(" ", args), @@ -88,14 +88,14 @@ namespace GodotTools.Ides.MonoDevelop              if (editorId == EditorId.VisualStudioForMac && !OS.IsMacOS)                  throw new InvalidOperationException($"{nameof(EditorId.VisualStudioForMac)} not supported on this platform"); -            this.solutionFile = solutionFile; -            this.editorId = editorId; +            _solutionFile = solutionFile; +            _editorId = editorId;          }          public void Dispose()          {              IsDisposed = true; -            process?.Dispose(); +            _process?.Dispose();          }          private static readonly IReadOnlyDictionary<EditorId, string> ExecutableNames; diff --git a/modules/mono/editor/GodotTools/GodotTools/Ides/Rider/RiderPathLocator.cs b/modules/mono/editor/GodotTools/GodotTools/Ides/Rider/RiderPathLocator.cs index 821532f759..71055f0125 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Ides/Rider/RiderPathLocator.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Ides/Rider/RiderPathLocator.cs @@ -11,6 +11,7 @@ using Environment = System.Environment;  using File = System.IO.File;  using Path = System.IO.Path;  using OS = GodotTools.Utils.OS; +  // ReSharper disable UnassignedField.Local  // ReSharper disable InconsistentNaming  // ReSharper disable UnassignedField.Global @@ -53,10 +54,10 @@ namespace GodotTools.Ides.Rider          private static RiderInfo[] CollectAllRiderPathsLinux()          {              var installInfos = new List<RiderInfo>(); -            var home = Environment.GetEnvironmentVariable("HOME"); +            string home = Environment.GetEnvironmentVariable("HOME");              if (!string.IsNullOrEmpty(home))              { -                var toolboxRiderRootPath = GetToolboxBaseDir(); +                string toolboxRiderRootPath = GetToolboxBaseDir();                  installInfos.AddRange(CollectPathsFromToolbox(toolboxRiderRootPath, "bin", "rider.sh", false)                    .Select(a => new RiderInfo(a, true)).ToList()); @@ -65,12 +66,12 @@ namespace GodotTools.Ides.Rider                  if (shortcut.Exists)                  { -                    var lines = File.ReadAllLines(shortcut.FullName); -                    foreach (var line in lines) +                    string[] lines = File.ReadAllLines(shortcut.FullName); +                    foreach (string line in lines)                      {                          if (!line.StartsWith("Exec=\""))                              continue; -                        var path = line.Split('"').Where((item, index) => index == 1).SingleOrDefault(); +                        string path = line.Split('"').Where((item, index) => index == 1).SingleOrDefault();                          if (string.IsNullOrEmpty(path))                              continue; @@ -82,7 +83,7 @@ namespace GodotTools.Ides.Rider              }              // snap install -            var snapInstallPath = "/snap/rider/current/bin/rider.sh"; +            string snapInstallPath = "/snap/rider/current/bin/rider.sh";              if (new FileInfo(snapInstallPath).Exists)                  installInfos.Add(new RiderInfo(snapInstallPath, false)); @@ -98,15 +99,15 @@ namespace GodotTools.Ides.Rider              if (folder.Exists)              {                  installInfos.AddRange(folder.GetDirectories("*Rider*.app") -                  .Select(a => new RiderInfo(Path.Combine(a.FullName, "Contents/MacOS/rider"), false)) -                  .ToList()); +                    .Select(a => new RiderInfo(Path.Combine(a.FullName, "Contents/MacOS/rider"), false)) +                    .ToList());              }              // /Users/user/Library/Application Support/JetBrains/Toolbox/apps/Rider/ch-1/181.3870.267/Rider EAP.app              // should be combined with "Contents/MacOS/rider" -            var toolboxRiderRootPath = GetToolboxBaseDir(); +            string toolboxRiderRootPath = GetToolboxBaseDir();              var paths = CollectPathsFromToolbox(toolboxRiderRootPath, "", "Rider*.app", true) -              .Select(a => new RiderInfo(Path.Combine(a, "Contents/MacOS/rider"), true)); +                .Select(a => new RiderInfo(Path.Combine(a, "Contents/MacOS/rider"), true));              installInfos.AddRange(paths);              return installInfos.ToArray(); @@ -134,7 +135,7 @@ namespace GodotTools.Ides.Rider          {              if (OS.IsWindows)              { -                var localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); +                string localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);                  return GetToolboxRiderRootPath(localAppData);              } diff --git a/modules/mono/editor/GodotTools/GodotTools/Ides/Rider/RiderPathManager.cs b/modules/mono/editor/GodotTools/GodotTools/Ides/Rider/RiderPathManager.cs index 60dd565ef2..ac29efb716 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Ides/Rider/RiderPathManager.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Ides/Rider/RiderPathManager.cs @@ -49,7 +49,7 @@ namespace GodotTools.Ides.Rider                  if (!paths.Any())                      return; -                var newPath = paths.Last().Path; +                string newPath = paths.Last().Path;                  Globals.EditorDef(EditorPathSettingName, newPath);                  editorSettings.SetSetting(EditorPathSettingName, newPath);              } @@ -57,7 +57,8 @@ namespace GodotTools.Ides.Rider          public static bool IsExternalEditorSetToRider(EditorSettings editorSettings)          { -            return editorSettings.HasSetting(EditorPathSettingName) && IsRider((string)editorSettings.GetSetting(EditorPathSettingName)); +            return editorSettings.HasSetting(EditorPathSettingName) && +                IsRider((string)editorSettings.GetSetting(EditorPathSettingName));          }          public static bool IsRider(string path) @@ -66,7 +67,7 @@ namespace GodotTools.Ides.Rider                  return false;              var fileInfo = new FileInfo(path); -            var filename = fileInfo.Name.ToLowerInvariant(); +            string filename = fileInfo.Name.ToLowerInvariant();              return filename.StartsWith("rider", StringComparison.Ordinal);          } @@ -83,7 +84,7 @@ namespace GodotTools.Ides.Rider              if (!paths.Any())                  return null; -            var newPath = paths.Last().Path; +            string newPath = paths.Last().Path;              editorSettings.SetSetting(EditorPathSettingName, newPath);              Globals.EditorDef(EditorPathSettingName, newPath);              return newPath; @@ -96,8 +97,8 @@ namespace GodotTools.Ides.Rider          public static void OpenFile(string slnPath, string scriptPath, int line)          { -            var pathFromSettings = GetRiderPathFromSettings(); -            var path = CheckAndUpdatePath(pathFromSettings); +            string pathFromSettings = GetRiderPathFromSettings(); +            string path = CheckAndUpdatePath(pathFromSettings);              var args = new List<string>();              args.Add(slnPath); diff --git a/modules/mono/editor/GodotTools/GodotTools/Internals/Globals.cs b/modules/mono/editor/GodotTools/GodotTools/Internals/Globals.cs index 793f84fd77..5c5ced8c29 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Internals/Globals.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Internals/Globals.cs @@ -13,6 +13,9 @@ namespace GodotTools.Internals          public static object EditorDef(string setting, object defaultValue, bool restartIfChanged = false) =>              internal_EditorDef(setting, defaultValue, restartIfChanged); +        public static object EditorShortcut(string setting) => +            internal_EditorShortcut(setting); +          [SuppressMessage("ReSharper", "InconsistentNaming")]          public static string TTR(this string text) => internal_TTR(text); @@ -28,6 +31,9 @@ namespace GodotTools.Internals          private static extern object internal_EditorDef(string setting, object defaultValue, bool restartIfChanged);          [MethodImpl(MethodImplOptions.InternalCall)] +        private static extern object internal_EditorShortcut(string setting); + +        [MethodImpl(MethodImplOptions.InternalCall)]          private static extern string internal_TTR(string text);      }  } diff --git a/modules/mono/editor/GodotTools/GodotTools/Internals/GodotSharpDirs.cs b/modules/mono/editor/GodotTools/GodotTools/Internals/GodotSharpDirs.cs index 6893bc1974..5e70c399b2 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Internals/GodotSharpDirs.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Internals/GodotSharpDirs.cs @@ -39,45 +39,57 @@ namespace GodotTools.Internals          [MethodImpl(MethodImplOptions.InternalCall)]          private static extern string internal_ResDataDir(); +          [MethodImpl(MethodImplOptions.InternalCall)]          private static extern string internal_ResMetadataDir(); +          [MethodImpl(MethodImplOptions.InternalCall)]          private static extern string internal_ResAssembliesBaseDir(); +          [MethodImpl(MethodImplOptions.InternalCall)]          private static extern string internal_ResAssembliesDir(); +          [MethodImpl(MethodImplOptions.InternalCall)]          private static extern string internal_ResConfigDir(); +          [MethodImpl(MethodImplOptions.InternalCall)]          private static extern string internal_ResTempDir(); +          [MethodImpl(MethodImplOptions.InternalCall)]          private static extern string internal_ResTempAssembliesBaseDir(); +          [MethodImpl(MethodImplOptions.InternalCall)]          private static extern string internal_ResTempAssembliesDir();          [MethodImpl(MethodImplOptions.InternalCall)]          private static extern string internal_MonoUserDir(); +          [MethodImpl(MethodImplOptions.InternalCall)]          private static extern string internal_MonoLogsDir();          #region Tools-only          [MethodImpl(MethodImplOptions.InternalCall)]          private static extern string internal_MonoSolutionsDir(); +          [MethodImpl(MethodImplOptions.InternalCall)]          private static extern string internal_BuildLogsDirs();          [MethodImpl(MethodImplOptions.InternalCall)]          private static extern string internal_ProjectSlnPath(); +          [MethodImpl(MethodImplOptions.InternalCall)]          private static extern string internal_ProjectCsProjPath();          [MethodImpl(MethodImplOptions.InternalCall)]          private static extern string internal_DataEditorToolsDir(); +          [MethodImpl(MethodImplOptions.InternalCall)]          private static extern string internal_DataEditorPrebuiltApiDir();          #endregion          [MethodImpl(MethodImplOptions.InternalCall)]          private static extern string internal_DataMonoEtcDir(); +          [MethodImpl(MethodImplOptions.InternalCall)]          private static extern string internal_DataMonoLibDir(); diff --git a/modules/mono/editor/GodotTools/GodotTools/Utils/FsPathUtils.cs b/modules/mono/editor/GodotTools/GodotTools/Utils/FsPathUtils.cs index c6724ccaf7..05499339b1 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Utils/FsPathUtils.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Utils/FsPathUtils.cs @@ -8,7 +8,7 @@ namespace GodotTools.Utils  {      public static class FsPathUtils      { -        private static readonly string ResourcePath = ProjectSettings.GlobalizePath("res://"); +        private static readonly string _resourcePath = ProjectSettings.GlobalizePath("res://");          private static bool PathStartsWithAlreadyNorm(this string childPath, string parentPath)          { @@ -34,7 +34,7 @@ namespace GodotTools.Utils          public static string LocalizePathWithCaseChecked(string path)          {              string pathNorm = path.NormalizePath() + Path.DirectorySeparatorChar; -            string resourcePathNorm = ResourcePath.NormalizePath() + Path.DirectorySeparatorChar; +            string resourcePathNorm = _resourcePath.NormalizePath() + Path.DirectorySeparatorChar;              if (!pathNorm.PathStartsWithAlreadyNorm(resourcePathNorm))                  return null; diff --git a/modules/mono/editor/GodotTools/GodotTools/Utils/OS.cs b/modules/mono/editor/GodotTools/GodotTools/Utils/OS.cs index 4624439665..93a1360cb6 100644 --- a/modules/mono/editor/GodotTools/GodotTools/Utils/OS.cs +++ b/modules/mono/editor/GodotTools/GodotTools/Utils/OS.cs @@ -13,10 +13,10 @@ namespace GodotTools.Utils      public static class OS      {          [MethodImpl(MethodImplOptions.InternalCall)] -        static extern string GetPlatformName(); +        private static extern string GetPlatformName();          [MethodImpl(MethodImplOptions.InternalCall)] -        static extern bool UnixFileHasExecutableAccess(string filePath); +        private static extern bool UnixFileHasExecutableAccess(string filePath);          public static class Names          { @@ -106,7 +106,10 @@ namespace GodotTools.Utils          public static string PathWhich([NotNull] string name)          { -            return IsWindows ? PathWhichWindows(name) : PathWhichUnix(name); +            if (IsWindows) +                return PathWhichWindows(name); + +            return PathWhichUnix(name);          }          private static string PathWhichWindows([NotNull] string name) @@ -129,7 +132,8 @@ namespace GodotTools.Utils              }              string nameExt = Path.GetExtension(name); -            bool hasPathExt = !string.IsNullOrEmpty(nameExt) && windowsExts.Contains(nameExt, StringComparer.OrdinalIgnoreCase); +            bool hasPathExt = !string.IsNullOrEmpty(nameExt) && +                windowsExts.Contains(nameExt, StringComparer.OrdinalIgnoreCase);              searchDirs.Add(System.IO.Directory.GetCurrentDirectory()); // last in the list diff --git a/modules/mono/editor/bindings_generator.cpp b/modules/mono/editor/bindings_generator.cpp index 7fdef8ff45..148a6796d2 100644 --- a/modules/mono/editor/bindings_generator.cpp +++ b/modules/mono/editor/bindings_generator.cpp @@ -365,8 +365,7 @@ String BindingsGenerator::bbcode_to_xml(const String &p_bbcode, const TypeInterf  				xml_output.append(link_target);  				xml_output.append("</c>");  			} else if (link_tag == "enum") { -				StringName search_cname = !target_itype ? target_cname : -															StringName(target_itype->name + "." + (String)target_cname); +				StringName search_cname = !target_itype ? target_cname : StringName(target_itype->name + "." + (String)target_cname);  				const Map<StringName, TypeInterface>::Element *enum_match = enum_types.find(search_cname); @@ -387,7 +386,7 @@ String BindingsGenerator::bbcode_to_xml(const String &p_bbcode, const TypeInterf  					xml_output.append(link_target);  					xml_output.append("</c>");  				} -			} else if (link_tag == "const") { +			} else if (link_tag == "constant") {  				if (!target_itype || !target_itype->is_object_type) {  					if (OS::get_singleton()->is_stdout_verbose()) {  						if (target_itype) { @@ -1524,7 +1523,7 @@ Error BindingsGenerator::_generate_cs_property(const BindingsGenerator::TypeInte  		if (getter->return_type.cname != setter_first_arg.type.cname) {  			// Special case for Node::set_name  			bool whitelisted = getter->return_type.cname == name_cache.type_StringName && -							   setter_first_arg.type.cname == name_cache.type_String; +					setter_first_arg.type.cname == name_cache.type_String;  			ERR_FAIL_COND_V_MSG(!whitelisted, ERR_BUG,  					"Return type from getter doesn't match first argument of setter for property: '" + @@ -2481,29 +2480,29 @@ bool BindingsGenerator::_arg_default_value_is_assignable_to_type(const Variant &  	switch (p_val.get_type()) {  		case Variant::NIL:  			return p_arg_type.is_object_type || -				   name_cache.is_nullable_type(p_arg_type.name); +					name_cache.is_nullable_type(p_arg_type.name);  		case Variant::BOOL:  			return p_arg_type.name == name_cache.type_bool;  		case Variant::INT:  			return p_arg_type.name == name_cache.type_sbyte || -				   p_arg_type.name == name_cache.type_short || -				   p_arg_type.name == name_cache.type_int || -				   p_arg_type.name == name_cache.type_byte || -				   p_arg_type.name == name_cache.type_ushort || -				   p_arg_type.name == name_cache.type_uint || -				   p_arg_type.name == name_cache.type_long || -				   p_arg_type.name == name_cache.type_ulong || -				   p_arg_type.name == name_cache.type_float || -				   p_arg_type.name == name_cache.type_double || -				   p_arg_type.is_enum; +					p_arg_type.name == name_cache.type_short || +					p_arg_type.name == name_cache.type_int || +					p_arg_type.name == name_cache.type_byte || +					p_arg_type.name == name_cache.type_ushort || +					p_arg_type.name == name_cache.type_uint || +					p_arg_type.name == name_cache.type_long || +					p_arg_type.name == name_cache.type_ulong || +					p_arg_type.name == name_cache.type_float || +					p_arg_type.name == name_cache.type_double || +					p_arg_type.is_enum;  		case Variant::FLOAT:  			return p_arg_type.name == name_cache.type_float || -				   p_arg_type.name == name_cache.type_double; +					p_arg_type.name == name_cache.type_double;  		case Variant::STRING:  		case Variant::STRING_NAME:  			return p_arg_type.name == name_cache.type_String || -				   p_arg_type.name == name_cache.type_StringName || -				   p_arg_type.name == name_cache.type_NodePath; +					p_arg_type.name == name_cache.type_StringName || +					p_arg_type.name == name_cache.type_NodePath;  		case Variant::NODE_PATH:  			return p_arg_type.name == name_cache.type_NodePath;  		case Variant::TRANSFORM2D: @@ -2535,13 +2534,13 @@ bool BindingsGenerator::_arg_default_value_is_assignable_to_type(const Variant &  			return p_arg_type.is_object_type;  		case Variant::VECTOR2I:  			return p_arg_type.name == name_cache.type_Vector2 || -				   p_arg_type.name == Variant::get_type_name(p_val.get_type()); +					p_arg_type.name == Variant::get_type_name(p_val.get_type());  		case Variant::RECT2I:  			return p_arg_type.name == name_cache.type_Rect2 || -				   p_arg_type.name == Variant::get_type_name(p_val.get_type()); +					p_arg_type.name == Variant::get_type_name(p_val.get_type());  		case Variant::VECTOR3I:  			return p_arg_type.name == name_cache.type_Vector3 || -				   p_arg_type.name == Variant::get_type_name(p_val.get_type()); +					p_arg_type.name == Variant::get_type_name(p_val.get_type());  		default:  			CRASH_NOW_MSG("Unexpected Variant type: " + itos(p_val.get_type()));  			break; @@ -2610,7 +2609,7 @@ bool BindingsGenerator::_populate_object_type_interfaces() {  		Map<StringName, StringName> accessor_methods;  		for (const PropertyInfo &property : property_list) { -			if (property.usage & PROPERTY_USAGE_GROUP || property.usage & PROPERTY_USAGE_SUBGROUP || property.usage & PROPERTY_USAGE_CATEGORY) { +			if (property.usage & PROPERTY_USAGE_GROUP || property.usage & PROPERTY_USAGE_SUBGROUP || property.usage & PROPERTY_USAGE_CATEGORY || (property.type == Variant::NIL && property.usage & PROPERTY_USAGE_ARRAY)) {  				continue;  			} @@ -2714,7 +2713,7 @@ bool BindingsGenerator::_populate_object_type_interfaces() {  				if (itype.cname != name_cache.type_Object || imethod.name != "free") {  					WARN_PRINT("Notification: New unexpected virtual non-overridable method found."  							   " We only expected Object.free, but found '" + -							   itype.name + "." + imethod.name + "'."); +							itype.name + "." + imethod.name + "'.");  				}  			} else if (return_info.type == Variant::INT && return_info.usage & PROPERTY_USAGE_CLASS_IS_ENUM) {  				imethod.return_type.cname = return_info.class_name; @@ -2723,7 +2722,7 @@ bool BindingsGenerator::_populate_object_type_interfaces() {  				imethod.return_type.cname = return_info.class_name;  				bool bad_reference_hint = !imethod.is_virtual && return_info.hint != PROPERTY_HINT_RESOURCE_TYPE && -										  ClassDB::is_parent_class(return_info.class_name, name_cache.type_RefCounted); +						ClassDB::is_parent_class(return_info.class_name, name_cache.type_RefCounted);  				ERR_FAIL_COND_V_MSG(bad_reference_hint, false,  						String() + "Return type is reference but hint is not '" _STR(PROPERTY_HINT_RESOURCE_TYPE) "'." +  								" Are you returning a reference type by pointer? Method: '" + itype.name + "." + imethod.name + "'."); diff --git a/modules/mono/editor/bindings_generator.h b/modules/mono/editor/bindings_generator.h index 8a85a1acbd..a7879e96c8 100644 --- a/modules/mono/editor/bindings_generator.h +++ b/modules/mono/editor/bindings_generator.h @@ -575,7 +575,7 @@ class BindingsGenerator {  			StaticCString::create(_STR(PackedByteArray)),  			StaticCString::create(_STR(PackedInt32Array)), -			StaticCString::create(_STR(PackedInt64rray)), +			StaticCString::create(_STR(PackedInt64Array)),  			StaticCString::create(_STR(PackedFloat32Array)),  			StaticCString::create(_STR(PackedFloat64Array)),  			StaticCString::create(_STR(PackedStringArray)), @@ -598,7 +598,7 @@ class BindingsGenerator {  	private:  		NameCache(const NameCache &); -		NameCache &operator=(const NameCache &); +		void operator=(const NameCache &);  	};  	NameCache name_cache; diff --git a/modules/mono/editor/code_completion.cpp b/modules/mono/editor/code_completion.cpp index d911f6461c..61d0890288 100644 --- a/modules/mono/editor/code_completion.cpp +++ b/modules/mono/editor/code_completion.cpp @@ -123,8 +123,8 @@ PackedStringArray get_code_completion(CompletionKind p_kind, const String &p_scr  				// AutoLoads  				OrderedHashMap<StringName, ProjectSettings::AutoloadInfo> autoloads = ProjectSettings::get_singleton()->get_autoload_list(); -				for (const KeyValue<StringName, ProjectSettings::AutoloadInfo> &E : autoloads) { -					const ProjectSettings::AutoloadInfo &info = E.value; +				for (OrderedHashMap<StringName, ProjectSettings::AutoloadInfo>::Element E = autoloads.front(); E; E = E.next()) { +					const ProjectSettings::AutoloadInfo &info = E.value();  					suggestions.push_back(quoted("/root/" + String(info.name)));  				}  			} @@ -155,7 +155,7 @@ PackedStringArray get_code_completion(CompletionKind p_kind, const String &p_scr  				dir_access->list_dir_begin();  				String filename = dir_access->get_next(); -				while (filename != "") { +				while (!filename.is_empty()) {  					if (filename == "." || filename == "..") {  						filename = dir_access->get_next();  						continue; diff --git a/modules/mono/editor/editor_internal_calls.cpp b/modules/mono/editor/editor_internal_calls.cpp index 6692a6efec..9a61b63c12 100644 --- a/modules/mono/editor/editor_internal_calls.cpp +++ b/modules/mono/editor/editor_internal_calls.cpp @@ -306,6 +306,12 @@ MonoObject *godot_icall_Globals_EditorDef(MonoString *p_setting, MonoObject *p_d  	return GDMonoMarshal::variant_to_mono_object(result);  } +MonoObject *godot_icall_Globals_EditorShortcut(MonoString *p_setting) { +	String setting = GDMonoMarshal::mono_string_to_godot(p_setting); +	Ref<Shortcut> result = ED_GET_SHORTCUT(setting); +	return GDMonoMarshal::variant_to_mono_object(result); +} +  MonoString *godot_icall_Globals_TTR(MonoString *p_text) {  	String text = GDMonoMarshal::mono_string_to_godot(p_text);  	return GDMonoMarshal::mono_string_from_godot(TTR(text)); @@ -380,6 +386,7 @@ void register_editor_internal_calls() {  	GDMonoUtils::add_internal_call("GodotTools.Internals.Globals::internal_EditorScale", godot_icall_Globals_EditorScale);  	GDMonoUtils::add_internal_call("GodotTools.Internals.Globals::internal_GlobalDef", godot_icall_Globals_GlobalDef);  	GDMonoUtils::add_internal_call("GodotTools.Internals.Globals::internal_EditorDef", godot_icall_Globals_EditorDef); +	GDMonoUtils::add_internal_call("GodotTools.Internals.Globals::internal_EditorShortcut", godot_icall_Globals_EditorShortcut);  	GDMonoUtils::add_internal_call("GodotTools.Internals.Globals::internal_TTR", godot_icall_Globals_TTR);  	// Utils.OS |