C#: Begin move to .NET Core
We're targeting .NET 5 for now to make development easier while .NET 6 is not yet released. TEMPORARY REGRESSIONS --------------------- Assembly unloading is not implemented yet. As such, many Godot resources are leaked at exit. This will be re-implemented later together with assembly hot-reloading.
This commit is contained in:
parent
513ee857a9
commit
f9a67ee9da
96 changed files with 2475 additions and 5615 deletions
|
|
@ -1,4 +1,4 @@
|
|||
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Godot.NET.Sdk", "Godot.NET.Sdk\Godot.NET.Sdk.csproj", "{31B00BFA-DEA1-42FA-A472-9E54A92A8A5F}"
|
||||
EndProject
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netstandard2.1</TargetFramework>
|
||||
<TargetFramework>net5.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
|
|
|
|||
|
|
@ -7,8 +7,6 @@ namespace GodotTools.BuildLogger
|
|||
{
|
||||
public class GodotBuildLogger : ILogger
|
||||
{
|
||||
public static readonly string AssemblyPath = Path.GetFullPath(typeof(GodotBuildLogger).Assembly.Location);
|
||||
|
||||
public string Parameters { get; set; }
|
||||
public LoggerVerbosity Verbosity { get; set; }
|
||||
|
||||
|
|
|
|||
|
|
@ -5,6 +5,6 @@
|
|||
<LangVersion>7.2</LangVersion>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Build.Framework" Version="16.5.0" />
|
||||
<PackageReference Include="Microsoft.Build.Framework" Version="15.1.548" ExcludeAssets="runtime" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<ProjectGuid>{639E48BD-44E5-4091-8EDD-22D36DC0768D}</ProjectGuid>
|
||||
<TargetFramework>netstandard2.0</TargetFramework>
|
||||
<TargetFramework>net5.0</TargetFramework>
|
||||
<LangVersion>7.2</LangVersion>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<ProjectGuid>{B06C2951-C8E3-4F28-80B2-717CF327EB19}</ProjectGuid>
|
||||
<OutputType>Exe</OutputType>
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<ProjectGuid>{EAFFF236-FA96-4A4D-BD23-0E51EF988277}</ProjectGuid>
|
||||
<OutputType>Exe</OutputType>
|
||||
|
|
|
|||
|
|
@ -1,32 +1,16 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<ProjectGuid>{A8CDAD94-C6D4-4B19-A7E7-76C53CC92984}</ProjectGuid>
|
||||
<TargetFramework>net472</TargetFramework>
|
||||
<TargetFramework>net5.0</TargetFramework>
|
||||
<LangVersion>7.2</LangVersion>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Build" Version="16.5.0" />
|
||||
<PackageReference Include="Microsoft.Build" Version="15.1.548" ExcludeAssets="runtime" />
|
||||
<PackageReference Include="Microsoft.Build.Locator" Version="1.2.6" />
|
||||
<PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.0" PrivateAssets="All" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\GodotTools.Core\GodotTools.Core.csproj" />
|
||||
<ProjectReference Include="..\GodotTools.Shared\GodotTools.Shared.csproj" />
|
||||
</ItemGroup>
|
||||
<!--
|
||||
The Microsoft.Build.Runtime package is too problematic so we create a MSBuild.exe stub. The workaround described
|
||||
here doesn't work with Microsoft.NETFramework.ReferenceAssemblies: https://github.com/microsoft/msbuild/issues/3486
|
||||
We need a MSBuild.exe file as there's an issue in Microsoft.Build where it executes platform dependent code when
|
||||
searching for MSBuild.exe before the fallback to not using it. A stub is fine as it should never be executed.
|
||||
-->
|
||||
<ItemGroup>
|
||||
<None Include="MSBuild.exe" CopyToOutputDirectory="Always" />
|
||||
</ItemGroup>
|
||||
<Target Name="CopyMSBuildStubWindows" AfterTargets="Build" Condition=" '$(GodotPlatform)' == 'windows' Or ( '$(GodotPlatform)' == '' And '$(OS)' == 'Windows_NT' ) ">
|
||||
<PropertyGroup>
|
||||
<GodotSourceRootPath>$(SolutionDir)/../../../../</GodotSourceRootPath>
|
||||
<GodotOutputDataDir>$(GodotSourceRootPath)/bin/GodotSharp</GodotOutputDataDir>
|
||||
</PropertyGroup>
|
||||
<!-- Need to copy it here as well on Windows -->
|
||||
<Copy SourceFiles="MSBuild.exe" DestinationFiles="$(GodotOutputDataDir)\Mono\lib\mono\v4.0\MSBuild.exe" />
|
||||
</Target>
|
||||
</Project>
|
||||
|
|
|
|||
|
|
@ -21,7 +21,8 @@ namespace GodotTools.ProjectEditor
|
|||
root.Sdk = GodotSdkAttrValue;
|
||||
|
||||
var mainGroup = root.AddPropertyGroup();
|
||||
mainGroup.AddProperty("TargetFramework", "netstandard2.1");
|
||||
mainGroup.AddProperty("TargetFramework", "net5.0");
|
||||
mainGroup.AddProperty("EnableDynamicLoading", "true");
|
||||
|
||||
string sanitizedName = IdentifierUtils.SanitizeQualifiedIdentifier(name, allowEmptyIdentifiers: true);
|
||||
|
||||
|
|
|
|||
|
|
@ -19,6 +19,9 @@ namespace GodotTools.ProjectEditor
|
|||
|
||||
public static class ProjectUtils
|
||||
{
|
||||
public static void MSBuildLocatorRegisterDefaults()
|
||||
=> Microsoft.Build.Locator.MSBuildLocator.RegisterDefaults();
|
||||
|
||||
public static MSBuildProject Open(string path)
|
||||
{
|
||||
var root = ProjectRootElement.Open(path);
|
||||
|
|
@ -42,7 +45,8 @@ namespace GodotTools.ProjectEditor
|
|||
var root = project.Root;
|
||||
string godotSdkAttrValue = ProjectGenerator.GodotSdkAttrValue;
|
||||
|
||||
if (!string.IsNullOrEmpty(root.Sdk) && root.Sdk.Trim().Equals(godotSdkAttrValue, StringComparison.OrdinalIgnoreCase))
|
||||
if (!string.IsNullOrEmpty(root.Sdk) &&
|
||||
root.Sdk.Trim().Equals(godotSdkAttrValue, StringComparison.OrdinalIgnoreCase))
|
||||
return;
|
||||
|
||||
root.Sdk = godotSdkAttrValue;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netstandard2.0</TargetFramework>
|
||||
<TargetFramework>net5.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
<Import Project="GenerateGodotNupkgsVersions.targets" />
|
||||
</Project>
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 2012
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GodotTools.ProjectEditor", "GodotTools.ProjectEditor\GodotTools.ProjectEditor.csproj", "{A8CDAD94-C6D4-4B19-A7E7-76C53CC92984}"
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
using System;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using GodotTools.Ides.Rider;
|
||||
using GodotTools.Internals;
|
||||
using JetBrains.Annotations;
|
||||
using static GodotTools.Internals.Globals;
|
||||
using File = GodotTools.Utils.File;
|
||||
using OS = GodotTools.Utils.OS;
|
||||
|
|
@ -159,7 +159,7 @@ namespace GodotTools.Build
|
|||
}
|
||||
}
|
||||
|
||||
public static bool BuildProjectBlocking(string config, [CanBeNull] string[] targets = null, [CanBeNull] string platform = null)
|
||||
public static bool BuildProjectBlocking(string config, [MaybeNull] string[] targets = null, [MaybeNull] string platform = null)
|
||||
{
|
||||
var buildInfo = new BuildInfo(GodotSharpDirs.ProjectSlnPath, targets ?? new[] {"Build"}, config, restore: true);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
using Godot;
|
||||
using System;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using Godot.Collections;
|
||||
using GodotTools.Internals;
|
||||
using JetBrains.Annotations;
|
||||
using File = GodotTools.Utils.File;
|
||||
using Path = System.IO.Path;
|
||||
|
||||
|
|
|
|||
|
|
@ -127,7 +127,7 @@ namespace GodotTools.Build
|
|||
|
||||
arguments += $@" /t:{string.Join(",", buildInfo.Targets)} " +
|
||||
$@"""/p:{"Configuration=" + buildInfo.Configuration}"" /v:normal " +
|
||||
$@"""/l:{typeof(GodotBuildLogger).FullName},{GodotBuildLogger.AssemblyPath};{buildInfo.LogsDirPath}""";
|
||||
$@"""{AddLoggerArgument(buildInfo)}""";
|
||||
|
||||
foreach (string customProperty in buildInfo.CustomProperties)
|
||||
{
|
||||
|
|
@ -137,6 +137,14 @@ namespace GodotTools.Build
|
|||
return arguments;
|
||||
}
|
||||
|
||||
private static string AddLoggerArgument(BuildInfo buildInfo)
|
||||
{
|
||||
string buildLoggerPath = Path.Combine(GodotSharpDirs.DataEditorToolsDir,
|
||||
"GodotTools.BuildLogger.dll");
|
||||
|
||||
return $"/l:{typeof(GodotBuildLogger).FullName},{buildLoggerPath};{buildInfo.LogsDirPath}";
|
||||
}
|
||||
|
||||
private static void RemovePlatformVariable(StringDictionary environmentVariables)
|
||||
{
|
||||
// EnvironmentVariables is case sensitive? Seriously?
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
using System;
|
||||
using Godot;
|
||||
using GodotTools.Internals;
|
||||
using JetBrains.Annotations;
|
||||
using static GodotTools.Internals.Globals;
|
||||
using File = GodotTools.Utils.File;
|
||||
|
||||
|
|
@ -28,7 +27,6 @@ namespace GodotTools.Build
|
|||
BuildOutputView.UpdateIssuesList();
|
||||
}
|
||||
|
||||
[UsedImplicitly]
|
||||
public void BuildSolution()
|
||||
{
|
||||
if (!File.Exists(GodotSharpDirs.ProjectSlnPath))
|
||||
|
|
@ -57,7 +55,6 @@ namespace GodotTools.Build
|
|||
Internal.ReloadAssemblies(softReload: false);
|
||||
}
|
||||
|
||||
[UsedImplicitly]
|
||||
private void RebuildSolution()
|
||||
{
|
||||
if (!File.Exists(GodotSharpDirs.ProjectSlnPath))
|
||||
|
|
@ -86,7 +83,6 @@ namespace GodotTools.Build
|
|||
Internal.ReloadAssemblies(softReload: false);
|
||||
}
|
||||
|
||||
[UsedImplicitly]
|
||||
private void CleanSolution()
|
||||
{
|
||||
if (!File.Exists(GodotSharpDirs.ProjectSlnPath))
|
||||
|
|
|
|||
|
|
@ -3,13 +3,13 @@ using Godot.NativeInterop;
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Runtime.CompilerServices;
|
||||
using GodotTools.Build;
|
||||
using GodotTools.Core;
|
||||
using GodotTools.Internals;
|
||||
using JetBrains.Annotations;
|
||||
using static GodotTools.Internals.Globals;
|
||||
using Directory = GodotTools.Utils.Directory;
|
||||
using File = GodotTools.Utils.File;
|
||||
|
|
@ -238,8 +238,9 @@ namespace GodotTools.Export
|
|||
using godot_string buildConfigAux = Marshaling.mono_string_to_godot(buildConfig);
|
||||
using godot_string bclDirAux = Marshaling.mono_string_to_godot(bclDir);
|
||||
godot_dictionary assembliesAux = ((Godot.Collections.Dictionary)assemblies).NativeValue;
|
||||
internal_GetExportedAssemblyDependencies(initialAssembliesAux, buildConfigAux, bclDirAux,
|
||||
ref assembliesAux);
|
||||
// TODO
|
||||
throw new NotImplementedException();
|
||||
//internal_GetExportedAssemblyDependencies(initialAssembliesAux, buildConfigAux, bclDirAux, ref assembliesAux);
|
||||
|
||||
AddI18NAssemblies(assemblies, bclDir);
|
||||
|
||||
|
|
@ -349,7 +350,7 @@ namespace GodotTools.Export
|
|||
}
|
||||
}
|
||||
|
||||
[NotNull]
|
||||
[return: NotNull]
|
||||
private static string ExportDataDirectory(string[] features, string platform, bool isDebug, string outputDir)
|
||||
{
|
||||
string target = isDebug ? "release_debug" : "release";
|
||||
|
|
@ -498,10 +499,5 @@ namespace GodotTools.Export
|
|||
string appNameSafe = appName.ToSafeDirName();
|
||||
return $"data_{appNameSafe}";
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern void internal_GetExportedAssemblyDependencies(
|
||||
in godot_dictionary initialAssemblies, in godot_string buildConfig,
|
||||
in godot_string customBclDir, ref godot_dictionary dependencyAssemblies);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ namespace GodotTools
|
|||
}
|
||||
}
|
||||
|
||||
[UsedImplicitly]
|
||||
private bool CreateProjectSolution()
|
||||
{
|
||||
using (var pr = new EditorProgress("create_csharp_solution", "Generating solution...".TTR(), 2))
|
||||
|
|
@ -75,7 +76,7 @@ namespace GodotTools
|
|||
{
|
||||
Guid = guid,
|
||||
PathRelativeToSolution = name + ".csproj",
|
||||
Configs = new List<string> {"Debug", "ExportDebug", "ExportRelease"}
|
||||
Configs = new List<string> { "Debug", "ExportDebug", "ExportRelease" }
|
||||
};
|
||||
|
||||
solution.AddNewProject(name, projectInfo);
|
||||
|
|
@ -123,7 +124,8 @@ namespace GodotTools
|
|||
try
|
||||
{
|
||||
string fallbackFolder = NuGetUtils.GodotFallbackFolderPath;
|
||||
NuGetUtils.AddFallbackFolderToUserNuGetConfigs(NuGetUtils.GodotFallbackFolderName, fallbackFolder);
|
||||
NuGetUtils.AddFallbackFolderToUserNuGetConfigs(NuGetUtils.GodotFallbackFolderName,
|
||||
fallbackFolder);
|
||||
NuGetUtils.AddBundledPackagesToFallbackFolder(fallbackFolder);
|
||||
}
|
||||
catch (Exception e)
|
||||
|
|
@ -201,13 +203,15 @@ namespace GodotTools
|
|||
try
|
||||
{
|
||||
if (Godot.OS.IsStdoutVerbose())
|
||||
Console.WriteLine($"Running: \"{command}\" {string.Join(" ", args.Select(a => $"\"{a}\""))}");
|
||||
Console.WriteLine(
|
||||
$"Running: \"{command}\" {string.Join(" ", args.Select(a => $"\"{a}\""))}");
|
||||
|
||||
OS.RunProcess(command, args);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
GD.PushError($"Error when trying to run code editor: VisualStudio. Exception message: '{e.Message}'");
|
||||
GD.PushError(
|
||||
$"Error when trying to run code editor: VisualStudio. Exception message: '{e.Message}'");
|
||||
}
|
||||
|
||||
break;
|
||||
|
|
@ -378,6 +382,8 @@ namespace GodotTools
|
|||
{
|
||||
base._EnablePlugin();
|
||||
|
||||
ProjectUtils.MSBuildLocatorRegisterDefaults();
|
||||
|
||||
if (Instance != null)
|
||||
throw new InvalidOperationException();
|
||||
Instance = this;
|
||||
|
|
@ -393,7 +399,7 @@ namespace GodotTools
|
|||
MSBuildPanel = new MSBuildPanel();
|
||||
_bottomPanelBtn = AddControlToBottomPanel(MSBuildPanel, "MSBuild".TTR());
|
||||
|
||||
AddChild(new HotReloadAssemblyWatcher {Name = "HotReloadAssemblyWatcher"});
|
||||
AddChild(new HotReloadAssemblyWatcher { Name = "HotReloadAssemblyWatcher" });
|
||||
|
||||
_menuPopup = new PopupMenu();
|
||||
_menuPopup.Hide();
|
||||
|
|
@ -469,7 +475,8 @@ namespace GodotTools
|
|||
try
|
||||
{
|
||||
// At startup we make sure NuGet.Config files have our Godot NuGet fallback folder included
|
||||
NuGetUtils.AddFallbackFolderToUserNuGetConfigs(NuGetUtils.GodotFallbackFolderName, NuGetUtils.GodotFallbackFolderPath);
|
||||
NuGetUtils.AddFallbackFolderToUserNuGetConfigs(NuGetUtils.GodotFallbackFolderName,
|
||||
NuGetUtils.GodotFallbackFolderPath);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,7 +1,8 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<ProjectGuid>{27B00618-A6F2-4828-B922-05CAEB08C286}</ProjectGuid>
|
||||
<TargetFramework>net472</TargetFramework>
|
||||
<TargetFramework>net5.0</TargetFramework>
|
||||
<EnableDynamicLoading>true</EnableDynamicLoading>
|
||||
<LangVersion>8</LangVersion>
|
||||
<!-- The Godot editor uses the Debug Godot API assemblies -->
|
||||
<GodotApiConfiguration>Debug</GodotApiConfiguration>
|
||||
|
|
@ -21,6 +22,8 @@
|
|||
<PackageReference Include="JetBrains.Annotations" Version="2019.1.3.0" ExcludeAssets="runtime" PrivateAssets="all" />
|
||||
<PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.0" PrivateAssets="All" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
||||
<!-- For RiderPathLocator -->
|
||||
<PackageReference Include="Microsoft.Win32.Registry" Version="5.0.0" />
|
||||
<Reference Include="GodotSharp">
|
||||
<HintPath>$(GodotApiAssembliesDir)/GodotSharp.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
using Godot;
|
||||
using GodotTools.Internals;
|
||||
using JetBrains.Annotations;
|
||||
using static GodotTools.Internals.Globals;
|
||||
|
||||
namespace GodotTools
|
||||
|
|
@ -25,6 +26,7 @@ namespace GodotTools
|
|||
Internal.ReloadAssemblies(softReload: false);
|
||||
}
|
||||
|
||||
[UsedImplicitly]
|
||||
public void RestartTimer()
|
||||
{
|
||||
_watchTimer.Stop();
|
||||
|
|
|
|||
|
|
@ -1,9 +1,10 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Runtime.Versioning;
|
||||
using Godot;
|
||||
using JetBrains.Annotations;
|
||||
using Microsoft.Win32;
|
||||
using Newtonsoft.Json;
|
||||
using Directory = System.IO.Directory;
|
||||
|
|
@ -113,6 +114,7 @@ namespace GodotTools.Ides.Rider
|
|||
return installInfos.ToArray();
|
||||
}
|
||||
|
||||
[SupportedOSPlatform("windows")]
|
||||
private static RiderInfo[] CollectRiderInfosWindows()
|
||||
{
|
||||
var installInfos = new List<RiderInfo>();
|
||||
|
|
@ -217,6 +219,7 @@ namespace GodotTools.Ides.Rider
|
|||
throw new Exception("Unknown OS.");
|
||||
}
|
||||
|
||||
[SupportedOSPlatform("windows")]
|
||||
private static void CollectPathsFromRegistry(string registryKey, List<string> installPaths)
|
||||
{
|
||||
using (var key = Registry.CurrentUser.OpenSubKey(registryKey))
|
||||
|
|
@ -229,6 +232,7 @@ namespace GodotTools.Ides.Rider
|
|||
}
|
||||
}
|
||||
|
||||
[SupportedOSPlatform("windows")]
|
||||
private static void CollectPathsFromRegistry(List<string> installPaths, RegistryKey key)
|
||||
{
|
||||
if (key == null) return;
|
||||
|
|
@ -324,7 +328,7 @@ namespace GodotTools.Ides.Rider
|
|||
{
|
||||
public string install_location;
|
||||
|
||||
[CanBeNull]
|
||||
[return: MaybeNull]
|
||||
public static string GetInstallLocationFromJson(string json)
|
||||
{
|
||||
try
|
||||
|
|
@ -378,7 +382,7 @@ namespace GodotTools.Ides.Rider
|
|||
public string version;
|
||||
public string versionSuffix;
|
||||
|
||||
[CanBeNull]
|
||||
[return: MaybeNull]
|
||||
internal static ProductInfo GetProductInfo(string json)
|
||||
{
|
||||
try
|
||||
|
|
@ -402,7 +406,7 @@ namespace GodotTools.Ides.Rider
|
|||
// ReSharper disable once InconsistentNaming
|
||||
public ActiveApplication active_application;
|
||||
|
||||
[CanBeNull]
|
||||
[return: MaybeNull]
|
||||
public static string GetLatestBuildFromJson(string json)
|
||||
{
|
||||
try
|
||||
|
|
|
|||
|
|
@ -9,23 +9,12 @@ namespace GodotTools.Internals
|
|||
{
|
||||
public string Task { get; }
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern void internal_Create(in godot_string task, in godot_string label, int amount,
|
||||
bool canCancel);
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern void internal_Dispose(in godot_string task);
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern bool internal_Step(in godot_string task, in godot_string state, int step,
|
||||
bool forceRefresh);
|
||||
|
||||
public EditorProgress(string task, string label, int amount, bool canCancel = false)
|
||||
{
|
||||
Task = task;
|
||||
using godot_string taskIn = Marshaling.mono_string_to_godot(task);
|
||||
using godot_string labelIn = Marshaling.mono_string_to_godot(label);
|
||||
internal_Create(taskIn, labelIn, amount, canCancel);
|
||||
Internal.godot_icall_EditorProgress_Create(taskIn, labelIn, amount, canCancel);
|
||||
}
|
||||
|
||||
~EditorProgress()
|
||||
|
|
@ -39,7 +28,7 @@ namespace GodotTools.Internals
|
|||
public void Dispose()
|
||||
{
|
||||
using godot_string taskIn = Marshaling.mono_string_to_godot(Task);
|
||||
internal_Dispose(taskIn);
|
||||
Internal.godot_icall_EditorProgress_Dispose(taskIn);
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
|
||||
|
|
@ -47,14 +36,14 @@ namespace GodotTools.Internals
|
|||
{
|
||||
using godot_string taskIn = Marshaling.mono_string_to_godot(Task);
|
||||
using godot_string stateIn = Marshaling.mono_string_to_godot(state);
|
||||
internal_Step(taskIn, stateIn, step, forceRefresh);
|
||||
Internal.godot_icall_EditorProgress_Step(taskIn, stateIn, step, forceRefresh);
|
||||
}
|
||||
|
||||
public bool TryStep(string state, int step = -1, bool forceRefresh = true)
|
||||
{
|
||||
using godot_string taskIn = Marshaling.mono_string_to_godot(Task);
|
||||
using godot_string stateIn = Marshaling.mono_string_to_godot(state);
|
||||
return internal_Step(taskIn, stateIn, step, forceRefresh);
|
||||
return Internal.godot_icall_EditorProgress_Step(taskIn, stateIn, step, forceRefresh);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,13 +6,13 @@ namespace GodotTools.Internals
|
|||
{
|
||||
public static class Globals
|
||||
{
|
||||
public static float EditorScale => internal_EditorScale();
|
||||
public static float EditorScale => Internal.godot_icall_Globals_EditorScale();
|
||||
|
||||
public static unsafe object GlobalDef(string setting, object defaultValue, bool restartIfChanged = false)
|
||||
{
|
||||
using godot_string settingIn = Marshaling.mono_string_to_godot(setting);
|
||||
using godot_variant defaultValueIn = Marshaling.mono_object_to_variant(defaultValue);
|
||||
internal_GlobalDef(settingIn, defaultValueIn, restartIfChanged, out godot_variant result);
|
||||
Internal.godot_icall_Globals_GlobalDef(settingIn, defaultValueIn, restartIfChanged, out godot_variant result);
|
||||
using (result)
|
||||
return Marshaling.variant_to_mono_object(&result);
|
||||
}
|
||||
|
|
@ -21,7 +21,7 @@ namespace GodotTools.Internals
|
|||
{
|
||||
using godot_string settingIn = Marshaling.mono_string_to_godot(setting);
|
||||
using godot_variant defaultValueIn = Marshaling.mono_object_to_variant(defaultValue);
|
||||
internal_EditorDef(settingIn, defaultValueIn, restartIfChanged, out godot_variant result);
|
||||
Internal.godot_icall_Globals_EditorDef(settingIn, defaultValueIn, restartIfChanged, out godot_variant result);
|
||||
using (result)
|
||||
return Marshaling.variant_to_mono_object(&result);
|
||||
}
|
||||
|
|
@ -29,7 +29,7 @@ namespace GodotTools.Internals
|
|||
public static unsafe object EditorShortcut(string setting)
|
||||
{
|
||||
using godot_string settingIn = Marshaling.mono_string_to_godot(setting);
|
||||
internal_EditorShortcut(settingIn, out godot_variant result);
|
||||
Internal.godot_icall_Globals_EditorShortcut(settingIn, out godot_variant result);
|
||||
using (result)
|
||||
return Marshaling.variant_to_mono_object(&result);
|
||||
}
|
||||
|
|
@ -38,28 +38,9 @@ namespace GodotTools.Internals
|
|||
public static string TTR(this string text)
|
||||
{
|
||||
using godot_string textIn = Marshaling.mono_string_to_godot(text);
|
||||
internal_TTR(textIn, out godot_string dest);
|
||||
Internal.godot_icall_Globals_TTR(textIn, out godot_string dest);
|
||||
using (dest)
|
||||
return Marshaling.mono_string_from_godot(dest);
|
||||
}
|
||||
|
||||
// Internal Calls
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern float internal_EditorScale();
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern void internal_GlobalDef(in godot_string setting, in godot_variant defaultValue,
|
||||
bool restartIfChanged, out godot_variant result);
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern void internal_EditorDef(in godot_string setting, in godot_variant defaultValue,
|
||||
bool restartIfChanged, out godot_variant result);
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern void internal_EditorShortcut(in godot_string setting, out godot_variant result);
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern void internal_TTR(in godot_string text, out godot_string dest);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ namespace GodotTools.Internals
|
|||
{
|
||||
get
|
||||
{
|
||||
internal_ResMetadataDir(out godot_string dest);
|
||||
Internal.godot_icall_GodotSharpDirs_ResMetadataDir(out godot_string dest);
|
||||
using (dest)
|
||||
return Marshaling.mono_string_from_godot(dest);
|
||||
}
|
||||
|
|
@ -19,7 +19,7 @@ namespace GodotTools.Internals
|
|||
{
|
||||
get
|
||||
{
|
||||
internal_ResTempAssembliesBaseDir(out godot_string dest);
|
||||
Internal.godot_icall_GodotSharpDirs_ResTempAssembliesBaseDir(out godot_string dest);
|
||||
using (dest)
|
||||
return Marshaling.mono_string_from_godot(dest);
|
||||
}
|
||||
|
|
@ -29,7 +29,7 @@ namespace GodotTools.Internals
|
|||
{
|
||||
get
|
||||
{
|
||||
internal_MonoUserDir(out godot_string dest);
|
||||
Internal.godot_icall_GodotSharpDirs_MonoUserDir(out godot_string dest);
|
||||
using (dest)
|
||||
return Marshaling.mono_string_from_godot(dest);
|
||||
}
|
||||
|
|
@ -39,7 +39,7 @@ namespace GodotTools.Internals
|
|||
{
|
||||
get
|
||||
{
|
||||
internal_BuildLogsDirs(out godot_string dest);
|
||||
Internal.godot_icall_GodotSharpDirs_BuildLogsDirs(out godot_string dest);
|
||||
using (dest)
|
||||
return Marshaling.mono_string_from_godot(dest);
|
||||
}
|
||||
|
|
@ -49,7 +49,7 @@ namespace GodotTools.Internals
|
|||
{
|
||||
get
|
||||
{
|
||||
internal_ProjectSlnPath(out godot_string dest);
|
||||
Internal.godot_icall_GodotSharpDirs_ProjectSlnPath(out godot_string dest);
|
||||
using (dest)
|
||||
return Marshaling.mono_string_from_godot(dest);
|
||||
}
|
||||
|
|
@ -59,7 +59,7 @@ namespace GodotTools.Internals
|
|||
{
|
||||
get
|
||||
{
|
||||
internal_ProjectCsProjPath(out godot_string dest);
|
||||
Internal.godot_icall_GodotSharpDirs_ProjectCsProjPath(out godot_string dest);
|
||||
using (dest)
|
||||
return Marshaling.mono_string_from_godot(dest);
|
||||
}
|
||||
|
|
@ -69,35 +69,10 @@ namespace GodotTools.Internals
|
|||
{
|
||||
get
|
||||
{
|
||||
internal_DataEditorToolsDir(out godot_string dest);
|
||||
Internal.godot_icall_GodotSharpDirs_DataEditorToolsDir(out godot_string dest);
|
||||
using (dest)
|
||||
return Marshaling.mono_string_from_godot(dest);
|
||||
}
|
||||
}
|
||||
|
||||
#region Internal
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern void internal_ResMetadataDir(out godot_string r_dest);
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern void internal_ResTempAssembliesBaseDir(out godot_string r_dest);
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern void internal_MonoUserDir(out godot_string r_dest);
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern void internal_BuildLogsDirs(out godot_string r_dest);
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern void internal_ProjectSlnPath(out godot_string r_dest);
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern void internal_ProjectCsProjPath(out godot_string r_dest);
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern void internal_DataEditorToolsDir(out godot_string r_dest);
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,12 +1,13 @@
|
|||
using System;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
using Godot;
|
||||
using Godot.NativeInterop;
|
||||
using GodotTools.IdeMessaging.Requests;
|
||||
|
||||
namespace GodotTools.Internals
|
||||
{
|
||||
public static class Internal
|
||||
internal static class Internal
|
||||
{
|
||||
public const string CSharpLanguageType = "CSharpScript";
|
||||
public const string CSharpLanguageExtension = ".cs";
|
||||
|
|
@ -15,7 +16,7 @@ namespace GodotTools.Internals
|
|||
{
|
||||
get
|
||||
{
|
||||
internal_FullExportTemplatesDir(out godot_string dest);
|
||||
godot_icall_Internal_FullExportTemplatesDir(out godot_string dest);
|
||||
using (dest)
|
||||
return Marshaling.mono_string_from_godot(dest);
|
||||
}
|
||||
|
|
@ -26,99 +27,161 @@ namespace GodotTools.Internals
|
|||
public static bool IsMacOSAppBundleInstalled(string bundleId)
|
||||
{
|
||||
using godot_string bundleIdIn = Marshaling.mono_string_to_godot(bundleId);
|
||||
return internal_IsMacOSAppBundleInstalled(bundleIdIn);
|
||||
return godot_icall_Internal_IsMacOSAppBundleInstalled(bundleIdIn);
|
||||
}
|
||||
|
||||
public static bool GodotIs32Bits() => internal_GodotIs32Bits();
|
||||
public static bool GodotIs32Bits() => godot_icall_Internal_GodotIs32Bits();
|
||||
|
||||
public static bool GodotIsRealTDouble() => internal_GodotIsRealTDouble();
|
||||
public static bool GodotIsRealTDouble() => godot_icall_Internal_GodotIsRealTDouble();
|
||||
|
||||
public static void GodotMainIteration() => internal_GodotMainIteration();
|
||||
public static void GodotMainIteration() => godot_icall_Internal_GodotMainIteration();
|
||||
|
||||
public static bool IsAssembliesReloadingNeeded() => internal_IsAssembliesReloadingNeeded();
|
||||
public static bool IsAssembliesReloadingNeeded() => godot_icall_Internal_IsAssembliesReloadingNeeded();
|
||||
|
||||
public static void ReloadAssemblies(bool softReload) => internal_ReloadAssemblies(softReload);
|
||||
public static void ReloadAssemblies(bool softReload) => godot_icall_Internal_ReloadAssemblies(softReload);
|
||||
|
||||
public static void EditorDebuggerNodeReloadScripts() => internal_EditorDebuggerNodeReloadScripts();
|
||||
public static void EditorDebuggerNodeReloadScripts() => godot_icall_Internal_EditorDebuggerNodeReloadScripts();
|
||||
|
||||
public static bool ScriptEditorEdit(Resource resource, int line, int col, bool grabFocus = true) =>
|
||||
internal_ScriptEditorEdit(resource.NativeInstance, line, col, grabFocus);
|
||||
godot_icall_Internal_ScriptEditorEdit(resource.NativeInstance, line, col, grabFocus);
|
||||
|
||||
public static void EditorNodeShowScriptScreen() => internal_EditorNodeShowScriptScreen();
|
||||
public static void EditorNodeShowScriptScreen() => godot_icall_Internal_EditorNodeShowScriptScreen();
|
||||
|
||||
public static string MonoWindowsInstallRoot
|
||||
{
|
||||
get
|
||||
{
|
||||
internal_MonoWindowsInstallRoot(out godot_string dest);
|
||||
godot_icall_Internal_MonoWindowsInstallRoot(out godot_string dest);
|
||||
using (dest)
|
||||
return Marshaling.mono_string_from_godot(dest);
|
||||
}
|
||||
}
|
||||
|
||||
public static void EditorRunPlay() => internal_EditorRunPlay();
|
||||
public static void EditorRunPlay() => godot_icall_Internal_EditorRunPlay();
|
||||
|
||||
public static void EditorRunStop() => internal_EditorRunStop();
|
||||
public static void EditorRunStop() => godot_icall_Internal_EditorRunStop();
|
||||
|
||||
public static void ScriptEditorDebugger_ReloadScripts() => internal_ScriptEditorDebugger_ReloadScripts();
|
||||
public static void ScriptEditorDebugger_ReloadScripts() =>
|
||||
godot_icall_Internal_ScriptEditorDebugger_ReloadScripts();
|
||||
|
||||
public static unsafe string[] CodeCompletionRequest(CodeCompletionRequest.CompletionKind kind,
|
||||
string scriptFile)
|
||||
{
|
||||
using godot_string scriptFileIn = Marshaling.mono_string_to_godot(scriptFile);
|
||||
internal_CodeCompletionRequest((int)kind, scriptFileIn, out godot_packed_string_array res);
|
||||
godot_icall_Internal_CodeCompletionRequest((int)kind, scriptFileIn, out godot_packed_string_array res);
|
||||
using (res)
|
||||
return Marshaling.PackedStringArray_to_mono_array(&res);
|
||||
}
|
||||
|
||||
#region Internal
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern void internal_FullExportTemplatesDir(out godot_string dest);
|
||||
private const string GodotDllName = "__Internal";
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern bool internal_IsMacOSAppBundleInstalled(in godot_string bundleId);
|
||||
[DllImport(GodotDllName)]
|
||||
public static extern void godot_icall_GodotSharpDirs_ResMetadataDir(out godot_string r_dest);
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern bool internal_GodotIs32Bits();
|
||||
[DllImport(GodotDllName)]
|
||||
public static extern void godot_icall_GodotSharpDirs_ResTempAssembliesBaseDir(out godot_string r_dest);
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern bool internal_GodotIsRealTDouble();
|
||||
[DllImport(GodotDllName)]
|
||||
public static extern void godot_icall_GodotSharpDirs_MonoUserDir(out godot_string r_dest);
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern void internal_GodotMainIteration();
|
||||
[DllImport(GodotDllName)]
|
||||
public static extern void godot_icall_GodotSharpDirs_BuildLogsDirs(out godot_string r_dest);
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern bool internal_IsAssembliesReloadingNeeded();
|
||||
[DllImport(GodotDllName)]
|
||||
public static extern void godot_icall_GodotSharpDirs_ProjectSlnPath(out godot_string r_dest);
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern void internal_ReloadAssemblies(bool softReload);
|
||||
[DllImport(GodotDllName)]
|
||||
public static extern void godot_icall_GodotSharpDirs_ProjectCsProjPath(out godot_string r_dest);
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern void internal_EditorDebuggerNodeReloadScripts();
|
||||
[DllImport(GodotDllName)]
|
||||
public static extern void godot_icall_GodotSharpDirs_DataEditorToolsDir(out godot_string r_dest);
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern bool internal_ScriptEditorEdit(IntPtr resource, int line, int col, bool grabFocus);
|
||||
[DllImport(GodotDllName)]
|
||||
public static extern void godot_icall_EditorProgress_Create(in godot_string task, in godot_string label,
|
||||
int amount, bool canCancel);
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern void internal_EditorNodeShowScriptScreen();
|
||||
[DllImport(GodotDllName)]
|
||||
public static extern void godot_icall_EditorProgress_Dispose(in godot_string task);
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern void internal_MonoWindowsInstallRoot(out godot_string dest);
|
||||
[DllImport(GodotDllName)]
|
||||
public static extern bool godot_icall_EditorProgress_Step(in godot_string task, in godot_string state, int step,
|
||||
bool forceRefresh);
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern void internal_EditorRunPlay();
|
||||
[DllImport(GodotDllName)]
|
||||
private static extern void godot_icall_Internal_FullExportTemplatesDir(out godot_string dest);
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern void internal_EditorRunStop();
|
||||
[DllImport(GodotDllName)]
|
||||
private static extern void godot_icall_Internal_SimplifyGodotPath(in godot_string path, out godot_string dest);
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern void internal_ScriptEditorDebugger_ReloadScripts();
|
||||
[DllImport(GodotDllName)]
|
||||
private static extern bool godot_icall_Internal_IsMacOSAppBundleInstalled(in godot_string bundleId);
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern void internal_CodeCompletionRequest(int kind, in godot_string scriptFile,
|
||||
[DllImport(GodotDllName)]
|
||||
private static extern bool godot_icall_Internal_GodotIs32Bits();
|
||||
|
||||
[DllImport(GodotDllName)]
|
||||
private static extern bool godot_icall_Internal_GodotIsRealTDouble();
|
||||
|
||||
[DllImport(GodotDllName)]
|
||||
private static extern void godot_icall_Internal_GodotMainIteration();
|
||||
|
||||
[DllImport(GodotDllName)]
|
||||
private static extern bool godot_icall_Internal_IsAssembliesReloadingNeeded();
|
||||
|
||||
[DllImport(GodotDllName)]
|
||||
private static extern void godot_icall_Internal_ReloadAssemblies(bool softReload);
|
||||
|
||||
[DllImport(GodotDllName)]
|
||||
private static extern void godot_icall_Internal_EditorDebuggerNodeReloadScripts();
|
||||
|
||||
[DllImport(GodotDllName)]
|
||||
private static extern bool godot_icall_Internal_ScriptEditorEdit(IntPtr resource, int line, int col,
|
||||
bool grabFocus);
|
||||
|
||||
[DllImport(GodotDllName)]
|
||||
private static extern void godot_icall_Internal_EditorNodeShowScriptScreen();
|
||||
|
||||
[DllImport(GodotDllName)]
|
||||
private static extern void godot_icall_Internal_MonoWindowsInstallRoot(out godot_string dest);
|
||||
|
||||
[DllImport(GodotDllName)]
|
||||
private static extern void godot_icall_Internal_EditorRunPlay();
|
||||
|
||||
[DllImport(GodotDllName)]
|
||||
private static extern void godot_icall_Internal_EditorRunStop();
|
||||
|
||||
[DllImport(GodotDllName)]
|
||||
private static extern void godot_icall_Internal_ScriptEditorDebugger_ReloadScripts();
|
||||
|
||||
[DllImport(GodotDllName)]
|
||||
private static extern void godot_icall_Internal_CodeCompletionRequest(int kind, in godot_string scriptFile,
|
||||
out godot_packed_string_array res);
|
||||
|
||||
[DllImport(GodotDllName)]
|
||||
public static extern float godot_icall_Globals_EditorScale();
|
||||
|
||||
[DllImport(GodotDllName)]
|
||||
public static extern void godot_icall_Globals_GlobalDef(in godot_string setting, in godot_variant defaultValue,
|
||||
bool restartIfChanged, out godot_variant result);
|
||||
|
||||
[DllImport(GodotDllName)]
|
||||
public static extern void godot_icall_Globals_EditorDef(in godot_string setting, in godot_variant defaultValue,
|
||||
bool restartIfChanged, out godot_variant result);
|
||||
|
||||
[DllImport(GodotDllName)]
|
||||
public static extern void godot_icall_Globals_EditorShortcut(in godot_string setting, out godot_variant result);
|
||||
|
||||
[DllImport(GodotDllName)]
|
||||
public static extern void godot_icall_Globals_TTR(in godot_string text, out godot_string dest);
|
||||
|
||||
[DllImport(GodotDllName)]
|
||||
public static extern void godot_icall_Utils_OS_GetPlatformName(out godot_string dest);
|
||||
|
||||
[DllImport(GodotDllName)]
|
||||
public static extern bool godot_icall_Utils_OS_UnixFileHasExecutableAccess(in godot_string filePath);
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
using System;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.IO;
|
||||
using Godot;
|
||||
using GodotTools.Core;
|
||||
using JetBrains.Annotations;
|
||||
|
||||
namespace GodotTools.Utils
|
||||
{
|
||||
|
|
@ -30,7 +30,7 @@ namespace GodotTools.Utils
|
|||
return childPathNorm.PathStartsWithAlreadyNorm(parentPathNorm);
|
||||
}
|
||||
|
||||
[CanBeNull]
|
||||
[return: MaybeNull]
|
||||
public static string LocalizePathWithCaseChecked(string path)
|
||||
{
|
||||
string pathNorm = path.NormalizePath() + Path.DirectorySeparatorChar;
|
||||
|
|
|
|||
|
|
@ -6,19 +6,13 @@ using System.Diagnostics.CodeAnalysis;
|
|||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Runtime.CompilerServices;
|
||||
using JetBrains.Annotations;
|
||||
using GodotTools.Internals;
|
||||
|
||||
namespace GodotTools.Utils
|
||||
{
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
public static class OS
|
||||
{
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern void GetPlatformName(out godot_string dest);
|
||||
|
||||
[MethodImpl(MethodImplOptions.InternalCall)]
|
||||
private static extern bool UnixFileHasExecutableAccess(in godot_string filePath);
|
||||
|
||||
public static class Names
|
||||
{
|
||||
public const string Windows = "Windows";
|
||||
|
|
@ -66,7 +60,7 @@ namespace GodotTools.Utils
|
|||
|
||||
private static unsafe bool IsOS(string name)
|
||||
{
|
||||
GetPlatformName(out godot_string dest);
|
||||
Internal.godot_icall_Utils_OS_GetPlatformName(out godot_string dest);
|
||||
using (dest)
|
||||
{
|
||||
string platformName = Marshaling.mono_string_from_godot(dest);
|
||||
|
|
@ -76,7 +70,7 @@ namespace GodotTools.Utils
|
|||
|
||||
private static unsafe bool IsAnyOS(IEnumerable<string> names)
|
||||
{
|
||||
GetPlatformName(out godot_string dest);
|
||||
Internal.godot_icall_Utils_OS_GetPlatformName(out godot_string dest);
|
||||
using (dest)
|
||||
{
|
||||
string platformName = Marshaling.mono_string_from_godot(dest);
|
||||
|
|
@ -102,14 +96,23 @@ namespace GodotTools.Utils
|
|||
private static readonly Lazy<bool> _isHTML5 = new Lazy<bool>(() => IsOS(Names.HTML5));
|
||||
private static readonly Lazy<bool> _isUnixLike = new Lazy<bool>(() => IsAnyOS(UnixLikePlatforms));
|
||||
|
||||
// TODO SupportedOSPlatformGuard once we target .NET 6
|
||||
// [SupportedOSPlatformGuard("windows")]
|
||||
public static bool IsWindows => _isWindows.Value || IsUWP;
|
||||
// [SupportedOSPlatformGuard("osx")]
|
||||
public static bool IsMacOS => _isMacOS.Value;
|
||||
// [SupportedOSPlatformGuard("linux")]
|
||||
public static bool IsLinuxBSD => _isLinuxBSD.Value;
|
||||
// [SupportedOSPlatformGuard("linux")]
|
||||
public static bool IsServer => _isServer.Value;
|
||||
// [SupportedOSPlatformGuard("windows")]
|
||||
public static bool IsUWP => _isUWP.Value;
|
||||
public static bool IsHaiku => _isHaiku.Value;
|
||||
// [SupportedOSPlatformGuard("android")]
|
||||
public static bool IsAndroid => _isAndroid.Value;
|
||||
// [SupportedOSPlatformGuard("ios")]
|
||||
public static bool IsiOS => _isiOS.Value;
|
||||
// [SupportedOSPlatformGuard("browser")]
|
||||
public static bool IsHTML5 => _isHTML5.Value;
|
||||
public static bool IsUnixLike => _isUnixLike.Value;
|
||||
|
||||
|
|
@ -183,7 +186,7 @@ namespace GodotTools.Utils
|
|||
.FirstOrDefault(path =>
|
||||
{
|
||||
using godot_string pathIn = Marshaling.mono_string_to_godot(path);
|
||||
return File.Exists(path) && UnixFileHasExecutableAccess(pathIn);
|
||||
return File.Exists(path) && Internal.godot_icall_Utils_OS_UnixFileHasExecutableAccess(pathIn);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1143,9 +1143,7 @@ Error BindingsGenerator::generate_cs_core_project(const String &p_proj_dir) {
|
|||
cs_icalls_content.append(INDENT1 "[SuppressMessage(\"ReSharper\", \"InconsistentNaming\")]\n");
|
||||
cs_icalls_content.append(INDENT1 "[SuppressMessage(\"ReSharper\", \"RedundantUnsafeContext\")]\n");
|
||||
cs_icalls_content.append(INDENT1 "[SuppressMessage(\"ReSharper\", \"RedundantNameQualifier\")]\n");
|
||||
cs_icalls_content.append("#if NET\n");
|
||||
cs_icalls_content.append(INDENT1 "[System.Runtime.CompilerServices.SkipLocalsInit]\n");
|
||||
cs_icalls_content.append("#endif\n");
|
||||
cs_icalls_content.append(INDENT1 "internal static class " BINDINGS_CLASS_NATIVECALLS "\n" INDENT1 "{");
|
||||
|
||||
cs_icalls_content.append(MEMBER_BEGIN "internal static ulong godot_api_hash = ");
|
||||
|
|
@ -1252,9 +1250,7 @@ Error BindingsGenerator::generate_cs_editor_project(const String &p_proj_dir) {
|
|||
cs_icalls_content.append(INDENT1 "[SuppressMessage(\"ReSharper\", \"InconsistentNaming\")]\n");
|
||||
cs_icalls_content.append(INDENT1 "[SuppressMessage(\"ReSharper\", \"RedundantUnsafeContext\")]\n");
|
||||
cs_icalls_content.append(INDENT1 "[SuppressMessage(\"ReSharper\", \"RedundantNameQualifier\")]\n");
|
||||
cs_icalls_content.append("#if NET\n");
|
||||
cs_icalls_content.append(INDENT1 "[System.Runtime.CompilerServices.SkipLocalsInit]\n");
|
||||
cs_icalls_content.append("#endif\n");
|
||||
cs_icalls_content.append(INDENT1 "internal static class " BINDINGS_CLASS_NATIVECALLS_EDITOR "\n" OPEN_BLOCK_L1);
|
||||
|
||||
cs_icalls_content.append(INDENT2 "internal static ulong godot_api_hash = ");
|
||||
|
|
@ -1550,20 +1546,9 @@ Error BindingsGenerator::_generate_cs_type(const TypeInterface &itype, const Str
|
|||
// Add native constructor static field
|
||||
|
||||
output << MEMBER_BEGIN << "[DebuggerBrowsable(DebuggerBrowsableState.Never)]\n"
|
||||
|
||||
<< "#if NET\n"
|
||||
|
||||
<< INDENT2 "private static unsafe readonly delegate* unmanaged<IntPtr> "
|
||||
<< CS_STATIC_FIELD_NATIVE_CTOR " = " ICALL_CLASSDB_GET_CONSTRUCTOR
|
||||
<< "(" BINDINGS_NATIVE_NAME_FIELD ");\n"
|
||||
|
||||
<< "#else\n"
|
||||
|
||||
// Get rid of this one once we switch to .NET 5/6
|
||||
<< INDENT2 "private static readonly IntPtr " CS_STATIC_FIELD_NATIVE_CTOR
|
||||
<< " = " ICALL_CLASSDB_GET_CONSTRUCTOR "(" BINDINGS_NATIVE_NAME_FIELD ");\n"
|
||||
|
||||
<< "#endif\n";
|
||||
<< "(" BINDINGS_NATIVE_NAME_FIELD ");\n";
|
||||
}
|
||||
|
||||
if (is_derived_type) {
|
||||
|
|
@ -1576,20 +1561,9 @@ Error BindingsGenerator::_generate_cs_type(const TypeInterface &itype, const Str
|
|||
// The engine will initialize the pointer field of the managed side before calling the constructor
|
||||
// This is why we only allocate a new native object from the constructor if the pointer field is not set
|
||||
output << INDENT3 "if (" BINDINGS_PTR_FIELD " == IntPtr.Zero)\n" OPEN_BLOCK_L3
|
||||
|
||||
<< "#if NET\n"
|
||||
|
||||
<< INDENT4 "unsafe\n" INDENT4 OPEN_BLOCK
|
||||
<< INDENT5 BINDINGS_PTR_FIELD " = " CS_STATIC_FIELD_NATIVE_CTOR "();\n"
|
||||
<< CLOSE_BLOCK_L4
|
||||
|
||||
<< "#else\n"
|
||||
|
||||
// Get rid of this one once we switch to .NET 5/6
|
||||
<< INDENT4 BINDINGS_PTR_FIELD " = _gd__invoke_class_constructor(" CS_STATIC_FIELD_NATIVE_CTOR ");\n"
|
||||
|
||||
<< "#endif\n"
|
||||
|
||||
<< INDENT4 C_METHOD_TIE_MANAGED_TO_UNMANAGED "(this, " BINDINGS_PTR_FIELD ", "
|
||||
<< BINDINGS_NATIVE_NAME_FIELD << ", refCounted: " << (itype.is_ref_counted ? "true" : "false")
|
||||
<< ", ((object)this).GetType(), _cachedType);\n" CLOSE_BLOCK_L3
|
||||
|
|
@ -3337,6 +3311,8 @@ void BindingsGenerator::_populate_builtin_type_interfaces() {
|
|||
|
||||
// bool
|
||||
itype = TypeInterface::create_value_type(String("bool"));
|
||||
itype.cs_in = "%s.ToGodotBool()";
|
||||
itype.cs_out = "%5return %0(%1).ToBool();";
|
||||
itype.c_type = "godot_bool";
|
||||
itype.c_type_in = itype.c_type;
|
||||
itype.c_type_out = itype.c_type;
|
||||
|
|
|
|||
|
|
@ -49,23 +49,40 @@
|
|||
#include "../godotsharp_dirs.h"
|
||||
#include "../utils/macos_utils.h"
|
||||
#include "code_completion.h"
|
||||
#include "godotsharp_export.h"
|
||||
|
||||
#include "../interop_types.h"
|
||||
|
||||
void godot_icall_GodotSharpDirs_ResMetadataDir(godot_string *r_dest) {
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
#define MAYBE_UNUSED [[maybe_unused]]
|
||||
#else
|
||||
#define MAYBE_UNUSED
|
||||
#endif
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define GD_PINVOKE_EXPORT MAYBE_UNUSED __attribute__((visibility("default")))
|
||||
#elif defined(_WIN32)
|
||||
#define GD_PINVOKE_EXPORT MAYBE_UNUSED __declspec(dllexport)
|
||||
#else
|
||||
#define GD_PINVOKE_EXPORT MAYBE_UNUSED
|
||||
#endif
|
||||
|
||||
GD_PINVOKE_EXPORT void godot_icall_GodotSharpDirs_ResMetadataDir(godot_string *r_dest) {
|
||||
memnew_placement(r_dest, String(GodotSharpDirs::get_res_metadata_dir()));
|
||||
}
|
||||
|
||||
void godot_icall_GodotSharpDirs_ResTempAssembliesBaseDir(godot_string *r_dest) {
|
||||
GD_PINVOKE_EXPORT void godot_icall_GodotSharpDirs_ResTempAssembliesBaseDir(godot_string *r_dest) {
|
||||
memnew_placement(r_dest, String(GodotSharpDirs::get_res_temp_assemblies_base_dir()));
|
||||
}
|
||||
|
||||
void godot_icall_GodotSharpDirs_MonoUserDir(godot_string *r_dest) {
|
||||
GD_PINVOKE_EXPORT void godot_icall_GodotSharpDirs_MonoUserDir(godot_string *r_dest) {
|
||||
memnew_placement(r_dest, String(GodotSharpDirs::get_mono_user_dir()));
|
||||
}
|
||||
|
||||
void godot_icall_GodotSharpDirs_BuildLogsDirs(godot_string *r_dest) {
|
||||
GD_PINVOKE_EXPORT void godot_icall_GodotSharpDirs_BuildLogsDirs(godot_string *r_dest) {
|
||||
#ifdef TOOLS_ENABLED
|
||||
memnew_placement(r_dest, String(GodotSharpDirs::get_build_logs_dir()));
|
||||
#else
|
||||
|
|
@ -73,7 +90,7 @@ void godot_icall_GodotSharpDirs_BuildLogsDirs(godot_string *r_dest) {
|
|||
#endif
|
||||
}
|
||||
|
||||
void godot_icall_GodotSharpDirs_ProjectSlnPath(godot_string *r_dest) {
|
||||
GD_PINVOKE_EXPORT void godot_icall_GodotSharpDirs_ProjectSlnPath(godot_string *r_dest) {
|
||||
#ifdef TOOLS_ENABLED
|
||||
memnew_placement(r_dest, String(GodotSharpDirs::get_project_sln_path()));
|
||||
#else
|
||||
|
|
@ -81,7 +98,7 @@ void godot_icall_GodotSharpDirs_ProjectSlnPath(godot_string *r_dest) {
|
|||
#endif
|
||||
}
|
||||
|
||||
void godot_icall_GodotSharpDirs_ProjectCsProjPath(godot_string *r_dest) {
|
||||
GD_PINVOKE_EXPORT void godot_icall_GodotSharpDirs_ProjectCsProjPath(godot_string *r_dest) {
|
||||
#ifdef TOOLS_ENABLED
|
||||
memnew_placement(r_dest, String(GodotSharpDirs::get_project_csproj_path()));
|
||||
#else
|
||||
|
|
@ -89,7 +106,7 @@ void godot_icall_GodotSharpDirs_ProjectCsProjPath(godot_string *r_dest) {
|
|||
#endif
|
||||
}
|
||||
|
||||
void godot_icall_GodotSharpDirs_DataEditorToolsDir(godot_string *r_dest) {
|
||||
GD_PINVOKE_EXPORT void godot_icall_GodotSharpDirs_DataEditorToolsDir(godot_string *r_dest) {
|
||||
#ifdef TOOLS_ENABLED
|
||||
memnew_placement(r_dest, String(GodotSharpDirs::get_data_editor_tools_dir()));
|
||||
#else
|
||||
|
|
@ -97,39 +114,29 @@ void godot_icall_GodotSharpDirs_DataEditorToolsDir(godot_string *r_dest) {
|
|||
#endif
|
||||
}
|
||||
|
||||
void godot_icall_EditorProgress_Create(const godot_string *p_task, const godot_string *p_label, int32_t p_amount, bool p_can_cancel) {
|
||||
GD_PINVOKE_EXPORT void godot_icall_EditorProgress_Create(const godot_string *p_task, const godot_string *p_label, int32_t p_amount, bool p_can_cancel) {
|
||||
String task = *reinterpret_cast<const String *>(p_task);
|
||||
String label = *reinterpret_cast<const String *>(p_label);
|
||||
EditorNode::progress_add_task(task, label, p_amount, (bool)p_can_cancel);
|
||||
}
|
||||
|
||||
void godot_icall_EditorProgress_Dispose(const godot_string *p_task) {
|
||||
GD_PINVOKE_EXPORT void godot_icall_EditorProgress_Dispose(const godot_string *p_task) {
|
||||
String task = *reinterpret_cast<const String *>(p_task);
|
||||
EditorNode::progress_end_task(task);
|
||||
}
|
||||
|
||||
bool godot_icall_EditorProgress_Step(const godot_string *p_task, const godot_string *p_state, int32_t p_step, bool p_force_refresh) {
|
||||
GD_PINVOKE_EXPORT bool godot_icall_EditorProgress_Step(const godot_string *p_task, const godot_string *p_state, int32_t p_step, bool p_force_refresh) {
|
||||
String task = *reinterpret_cast<const String *>(p_task);
|
||||
String state = *reinterpret_cast<const String *>(p_state);
|
||||
return EditorNode::progress_task_step(task, state, p_step, (bool)p_force_refresh);
|
||||
}
|
||||
|
||||
uint32_t godot_icall_ExportPlugin_GetExportedAssemblyDependencies(const godot_dictionary *p_initial_assemblies,
|
||||
const godot_string *p_build_config, const godot_string *p_custom_bcl_dir, godot_dictionary *r_assembly_dependencies) {
|
||||
Dictionary initial_dependencies = *reinterpret_cast<const Dictionary *>(p_initial_assemblies);
|
||||
String build_config = *reinterpret_cast<const String *>(p_build_config);
|
||||
String custom_bcl_dir = *reinterpret_cast<const String *>(p_custom_bcl_dir);
|
||||
Dictionary assembly_dependencies = *reinterpret_cast<Dictionary *>(r_assembly_dependencies);
|
||||
|
||||
return GodotSharpExport::get_exported_assembly_dependencies(initial_dependencies, build_config, custom_bcl_dir, assembly_dependencies);
|
||||
}
|
||||
|
||||
void godot_icall_Internal_FullExportTemplatesDir(godot_string *r_dest) {
|
||||
GD_PINVOKE_EXPORT void godot_icall_Internal_FullExportTemplatesDir(godot_string *r_dest) {
|
||||
String full_templates_dir = EditorPaths::get_singleton()->get_export_templates_dir().plus_file(VERSION_FULL_CONFIG);
|
||||
memnew_placement(r_dest, String(full_templates_dir));
|
||||
}
|
||||
|
||||
bool godot_icall_Internal_IsMacOSAppBundleInstalled(const godot_string *p_bundle_id) {
|
||||
GD_PINVOKE_EXPORT bool godot_icall_Internal_IsMacOSAppBundleInstalled(const godot_string *p_bundle_id) {
|
||||
#ifdef MACOS_ENABLED
|
||||
String bundle_id = *reinterpret_cast<const String *>(p_bundle_id);
|
||||
return (bool)macos_is_app_bundle_installed(bundle_id);
|
||||
|
|
@ -139,11 +146,11 @@ bool godot_icall_Internal_IsMacOSAppBundleInstalled(const godot_string *p_bundle
|
|||
#endif
|
||||
}
|
||||
|
||||
bool godot_icall_Internal_GodotIs32Bits() {
|
||||
GD_PINVOKE_EXPORT bool godot_icall_Internal_GodotIs32Bits() {
|
||||
return sizeof(void *) == 4;
|
||||
}
|
||||
|
||||
bool godot_icall_Internal_GodotIsRealTDouble() {
|
||||
GD_PINVOKE_EXPORT bool godot_icall_Internal_GodotIsRealTDouble() {
|
||||
#ifdef REAL_T_IS_DOUBLE
|
||||
return (bool)true;
|
||||
#else
|
||||
|
|
@ -151,11 +158,11 @@ bool godot_icall_Internal_GodotIsRealTDouble() {
|
|||
#endif
|
||||
}
|
||||
|
||||
void godot_icall_Internal_GodotMainIteration() {
|
||||
GD_PINVOKE_EXPORT void godot_icall_Internal_GodotMainIteration() {
|
||||
Main::iteration();
|
||||
}
|
||||
|
||||
bool godot_icall_Internal_IsAssembliesReloadingNeeded() {
|
||||
GD_PINVOKE_EXPORT bool godot_icall_Internal_IsAssembliesReloadingNeeded() {
|
||||
#ifdef GD_MONO_HOT_RELOAD
|
||||
return (bool)CSharpLanguage::get_singleton()->is_assembly_reloading_needed();
|
||||
#else
|
||||
|
|
@ -163,26 +170,26 @@ bool godot_icall_Internal_IsAssembliesReloadingNeeded() {
|
|||
#endif
|
||||
}
|
||||
|
||||
void godot_icall_Internal_ReloadAssemblies(bool p_soft_reload) {
|
||||
GD_PINVOKE_EXPORT void godot_icall_Internal_ReloadAssemblies(bool p_soft_reload) {
|
||||
#ifdef GD_MONO_HOT_RELOAD
|
||||
mono_bind::GodotSharp::get_singleton()->call_deferred(SNAME("_reload_assemblies"), (bool)p_soft_reload);
|
||||
#endif
|
||||
}
|
||||
|
||||
void godot_icall_Internal_EditorDebuggerNodeReloadScripts() {
|
||||
GD_PINVOKE_EXPORT void godot_icall_Internal_EditorDebuggerNodeReloadScripts() {
|
||||
EditorDebuggerNode::get_singleton()->reload_scripts();
|
||||
}
|
||||
|
||||
bool godot_icall_Internal_ScriptEditorEdit(Resource *p_resource, int32_t p_line, int32_t p_col, bool p_grab_focus) {
|
||||
GD_PINVOKE_EXPORT bool godot_icall_Internal_ScriptEditorEdit(Resource *p_resource, int32_t p_line, int32_t p_col, bool p_grab_focus) {
|
||||
Ref<Resource> resource = p_resource;
|
||||
return (bool)ScriptEditor::get_singleton()->edit(resource, p_line, p_col, (bool)p_grab_focus);
|
||||
}
|
||||
|
||||
void godot_icall_Internal_EditorNodeShowScriptScreen() {
|
||||
GD_PINVOKE_EXPORT void godot_icall_Internal_EditorNodeShowScriptScreen() {
|
||||
EditorNode::get_singleton()->call("_editor_select", EditorNode::EDITOR_SCRIPT);
|
||||
}
|
||||
|
||||
void godot_icall_Internal_MonoWindowsInstallRoot(godot_string *r_dest) {
|
||||
GD_PINVOKE_EXPORT void godot_icall_Internal_MonoWindowsInstallRoot(godot_string *r_dest) {
|
||||
#ifdef WINDOWS_ENABLED
|
||||
String install_root_dir = GDMono::get_singleton()->get_mono_reg_info().install_root_dir;
|
||||
memnew_placement(r_dest, String(install_root_dir));
|
||||
|
|
@ -192,62 +199,62 @@ void godot_icall_Internal_MonoWindowsInstallRoot(godot_string *r_dest) {
|
|||
#endif
|
||||
}
|
||||
|
||||
void godot_icall_Internal_EditorRunPlay() {
|
||||
GD_PINVOKE_EXPORT void godot_icall_Internal_EditorRunPlay() {
|
||||
EditorNode::get_singleton()->run_play();
|
||||
}
|
||||
|
||||
void godot_icall_Internal_EditorRunStop() {
|
||||
GD_PINVOKE_EXPORT void godot_icall_Internal_EditorRunStop() {
|
||||
EditorNode::get_singleton()->run_stop();
|
||||
}
|
||||
|
||||
void godot_icall_Internal_ScriptEditorDebugger_ReloadScripts() {
|
||||
GD_PINVOKE_EXPORT void godot_icall_Internal_ScriptEditorDebugger_ReloadScripts() {
|
||||
EditorDebuggerNode *ed = EditorDebuggerNode::get_singleton();
|
||||
if (ed) {
|
||||
ed->reload_scripts();
|
||||
}
|
||||
}
|
||||
|
||||
void godot_icall_Internal_CodeCompletionRequest(int32_t p_kind, const godot_string *p_script_file, godot_packed_array *r_ret) {
|
||||
GD_PINVOKE_EXPORT void godot_icall_Internal_CodeCompletionRequest(int32_t p_kind, const godot_string *p_script_file, godot_packed_array *r_ret) {
|
||||
String script_file = *reinterpret_cast<const String *>(p_script_file);
|
||||
PackedStringArray suggestions = gdmono::get_code_completion((gdmono::CompletionKind)p_kind, script_file);
|
||||
memnew_placement(r_ret, PackedStringArray(suggestions));
|
||||
}
|
||||
|
||||
float godot_icall_Globals_EditorScale() {
|
||||
GD_PINVOKE_EXPORT float godot_icall_Globals_EditorScale() {
|
||||
return EDSCALE;
|
||||
}
|
||||
|
||||
void godot_icall_Globals_GlobalDef(const godot_string *p_setting, const godot_variant *p_default_value, bool p_restart_if_changed, godot_variant *r_result) {
|
||||
GD_PINVOKE_EXPORT void godot_icall_Globals_GlobalDef(const godot_string *p_setting, const godot_variant *p_default_value, bool p_restart_if_changed, godot_variant *r_result) {
|
||||
String setting = *reinterpret_cast<const String *>(p_setting);
|
||||
Variant default_value = *reinterpret_cast<const Variant *>(p_default_value);
|
||||
Variant result = _GLOBAL_DEF(setting, default_value, (bool)p_restart_if_changed);
|
||||
memnew_placement(r_result, Variant(result));
|
||||
}
|
||||
|
||||
void godot_icall_Globals_EditorDef(const godot_string *p_setting, const godot_variant *p_default_value, bool p_restart_if_changed, godot_variant *r_result) {
|
||||
GD_PINVOKE_EXPORT void godot_icall_Globals_EditorDef(const godot_string *p_setting, const godot_variant *p_default_value, bool p_restart_if_changed, godot_variant *r_result) {
|
||||
String setting = *reinterpret_cast<const String *>(p_setting);
|
||||
Variant default_value = *reinterpret_cast<const Variant *>(p_default_value);
|
||||
Variant result = _EDITOR_DEF(setting, default_value, (bool)p_restart_if_changed);
|
||||
memnew_placement(r_result, Variant(result));
|
||||
}
|
||||
|
||||
void godot_icall_Globals_EditorShortcut(const godot_string *p_setting, godot_variant *r_result) {
|
||||
GD_PINVOKE_EXPORT void godot_icall_Globals_EditorShortcut(const godot_string *p_setting, godot_variant *r_result) {
|
||||
String setting = *reinterpret_cast<const String *>(p_setting);
|
||||
Ref<Shortcut> result = ED_GET_SHORTCUT(setting);
|
||||
memnew_placement(r_result, Variant(result));
|
||||
}
|
||||
|
||||
void godot_icall_Globals_TTR(const godot_string *p_text, godot_string *r_dest) {
|
||||
GD_PINVOKE_EXPORT void godot_icall_Globals_TTR(const godot_string *p_text, godot_string *r_dest) {
|
||||
String text = *reinterpret_cast<const String *>(p_text);
|
||||
memnew_placement(r_dest, String(TTR(text)));
|
||||
}
|
||||
|
||||
void godot_icall_Utils_OS_GetPlatformName(godot_string *r_dest) {
|
||||
GD_PINVOKE_EXPORT void godot_icall_Utils_OS_GetPlatformName(godot_string *r_dest) {
|
||||
String os_name = OS::get_singleton()->get_name();
|
||||
memnew_placement(r_dest, String(os_name));
|
||||
}
|
||||
|
||||
bool godot_icall_Utils_OS_UnixFileHasExecutableAccess(const godot_string *p_file_path) {
|
||||
GD_PINVOKE_EXPORT bool godot_icall_Utils_OS_UnixFileHasExecutableAccess(const godot_string *p_file_path) {
|
||||
#ifdef UNIX_ENABLED
|
||||
String file_path = *reinterpret_cast<const String *>(p_file_path);
|
||||
return access(file_path.utf8().get_data(), X_OK) == 0;
|
||||
|
|
@ -256,49 +263,41 @@ bool godot_icall_Utils_OS_UnixFileHasExecutableAccess(const godot_string *p_file
|
|||
#endif
|
||||
}
|
||||
|
||||
void register_editor_internal_calls() {
|
||||
// GodotSharpDirs
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.GodotSharpDirs::internal_ResMetadataDir", godot_icall_GodotSharpDirs_ResMetadataDir);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.GodotSharpDirs::internal_ResTempAssembliesBaseDir", godot_icall_GodotSharpDirs_ResTempAssembliesBaseDir);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.GodotSharpDirs::internal_MonoUserDir", godot_icall_GodotSharpDirs_MonoUserDir);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.GodotSharpDirs::internal_BuildLogsDirs", godot_icall_GodotSharpDirs_BuildLogsDirs);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.GodotSharpDirs::internal_ProjectSlnPath", godot_icall_GodotSharpDirs_ProjectSlnPath);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.GodotSharpDirs::internal_ProjectCsProjPath", godot_icall_GodotSharpDirs_ProjectCsProjPath);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.GodotSharpDirs::internal_DataEditorToolsDir", godot_icall_GodotSharpDirs_DataEditorToolsDir);
|
||||
|
||||
// EditorProgress
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.EditorProgress::internal_Create", godot_icall_EditorProgress_Create);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.EditorProgress::internal_Dispose", godot_icall_EditorProgress_Dispose);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.EditorProgress::internal_Step", godot_icall_EditorProgress_Step);
|
||||
|
||||
// ExportPlugin
|
||||
GDMonoUtils::add_internal_call("GodotTools.Export.ExportPlugin::internal_GetExportedAssemblyDependencies", godot_icall_ExportPlugin_GetExportedAssemblyDependencies);
|
||||
|
||||
// Internals
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_FullExportTemplatesDir", godot_icall_Internal_FullExportTemplatesDir);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_IsMacOSAppBundleInstalled", godot_icall_Internal_IsMacOSAppBundleInstalled);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_GodotIs32Bits", godot_icall_Internal_GodotIs32Bits);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_GodotIsRealTDouble", godot_icall_Internal_GodotIsRealTDouble);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_GodotMainIteration", godot_icall_Internal_GodotMainIteration);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_IsAssembliesReloadingNeeded", godot_icall_Internal_IsAssembliesReloadingNeeded);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_ReloadAssemblies", godot_icall_Internal_ReloadAssemblies);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_EditorDebuggerNodeReloadScripts", godot_icall_Internal_EditorDebuggerNodeReloadScripts);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_ScriptEditorEdit", godot_icall_Internal_ScriptEditorEdit);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_EditorNodeShowScriptScreen", godot_icall_Internal_EditorNodeShowScriptScreen);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_MonoWindowsInstallRoot", godot_icall_Internal_MonoWindowsInstallRoot);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_EditorRunPlay", godot_icall_Internal_EditorRunPlay);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_EditorRunStop", godot_icall_Internal_EditorRunStop);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_ScriptEditorDebugger_ReloadScripts", godot_icall_Internal_ScriptEditorDebugger_ReloadScripts);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Internals.Internal::internal_CodeCompletionRequest", godot_icall_Internal_CodeCompletionRequest);
|
||||
|
||||
// Globals
|
||||
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
|
||||
GDMonoUtils::add_internal_call("GodotTools.Utils.OS::GetPlatformName", godot_icall_Utils_OS_GetPlatformName);
|
||||
GDMonoUtils::add_internal_call("GodotTools.Utils.OS::UnixFileHasExecutableAccess", godot_icall_Utils_OS_UnixFileHasExecutableAccess);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
void *godotsharp_editor_pinvoke_funcs[32] = {
|
||||
(void *)godot_icall_GodotSharpDirs_ResMetadataDir,
|
||||
(void *)godot_icall_GodotSharpDirs_ResTempAssembliesBaseDir,
|
||||
(void *)godot_icall_GodotSharpDirs_MonoUserDir,
|
||||
(void *)godot_icall_GodotSharpDirs_BuildLogsDirs,
|
||||
(void *)godot_icall_GodotSharpDirs_ProjectSlnPath,
|
||||
(void *)godot_icall_GodotSharpDirs_ProjectCsProjPath,
|
||||
(void *)godot_icall_GodotSharpDirs_DataEditorToolsDir,
|
||||
(void *)godot_icall_EditorProgress_Create,
|
||||
(void *)godot_icall_EditorProgress_Dispose,
|
||||
(void *)godot_icall_EditorProgress_Step,
|
||||
(void *)godot_icall_Internal_FullExportTemplatesDir,
|
||||
(void *)godot_icall_Internal_IsMacOSAppBundleInstalled,
|
||||
(void *)godot_icall_Internal_GodotIs32Bits,
|
||||
(void *)godot_icall_Internal_GodotIsRealTDouble,
|
||||
(void *)godot_icall_Internal_GodotMainIteration,
|
||||
(void *)godot_icall_Internal_IsAssembliesReloadingNeeded,
|
||||
(void *)godot_icall_Internal_ReloadAssemblies,
|
||||
(void *)godot_icall_Internal_EditorDebuggerNodeReloadScripts,
|
||||
(void *)godot_icall_Internal_ScriptEditorEdit,
|
||||
(void *)godot_icall_Internal_EditorNodeShowScriptScreen,
|
||||
(void *)godot_icall_Internal_MonoWindowsInstallRoot,
|
||||
(void *)godot_icall_Internal_EditorRunPlay,
|
||||
(void *)godot_icall_Internal_EditorRunStop,
|
||||
(void *)godot_icall_Internal_ScriptEditorDebugger_ReloadScripts,
|
||||
(void *)godot_icall_Internal_CodeCompletionRequest,
|
||||
(void *)godot_icall_Globals_EditorScale,
|
||||
(void *)godot_icall_Globals_GlobalDef,
|
||||
(void *)godot_icall_Globals_EditorDef,
|
||||
(void *)godot_icall_Globals_EditorShortcut,
|
||||
(void *)godot_icall_Globals_TTR,
|
||||
(void *)godot_icall_Utils_OS_GetPlatformName,
|
||||
(void *)godot_icall_Utils_OS_UnixFileHasExecutableAccess,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,144 +0,0 @@
|
|||
/*************************************************************************/
|
||||
/* godotsharp_export.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#include "godotsharp_export.h"
|
||||
|
||||
#include <mono/metadata/image.h>
|
||||
|
||||
#include "core/config/project_settings.h"
|
||||
#include "core/io/file_access_pack.h"
|
||||
#include "core/os/os.h"
|
||||
|
||||
#include "../mono_gd/gd_mono.h"
|
||||
#include "../mono_gd/gd_mono_assembly.h"
|
||||
#include "../mono_gd/gd_mono_cache.h"
|
||||
#include "../utils/macros.h"
|
||||
|
||||
namespace GodotSharpExport {
|
||||
|
||||
MonoAssemblyName *new_mono_assembly_name() {
|
||||
// Mono has no public API to create an empty MonoAssemblyName and the struct is private.
|
||||
// As such the only way to create it is with a stub name and then clear it.
|
||||
|
||||
MonoAssemblyName *aname = mono_assembly_name_new("stub");
|
||||
CRASH_COND(aname == nullptr);
|
||||
mono_assembly_name_free(aname); // Frees the string fields, not the struct
|
||||
return aname;
|
||||
}
|
||||
|
||||
struct AssemblyRefInfo {
|
||||
String name;
|
||||
uint16_t major = 0;
|
||||
uint16_t minor = 0;
|
||||
uint16_t build = 0;
|
||||
uint16_t revision = 0;
|
||||
};
|
||||
|
||||
AssemblyRefInfo get_assemblyref_name(MonoImage *p_image, int index) {
|
||||
const MonoTableInfo *table_info = mono_image_get_table_info(p_image, MONO_TABLE_ASSEMBLYREF);
|
||||
|
||||
uint32_t cols[MONO_ASSEMBLYREF_SIZE];
|
||||
|
||||
mono_metadata_decode_row(table_info, index, cols, MONO_ASSEMBLYREF_SIZE);
|
||||
|
||||
return {
|
||||
String::utf8(mono_metadata_string_heap(p_image, cols[MONO_ASSEMBLYREF_NAME])),
|
||||
(uint16_t)cols[MONO_ASSEMBLYREF_MAJOR_VERSION],
|
||||
(uint16_t)cols[MONO_ASSEMBLYREF_MINOR_VERSION],
|
||||
(uint16_t)cols[MONO_ASSEMBLYREF_BUILD_NUMBER],
|
||||
(uint16_t)cols[MONO_ASSEMBLYREF_REV_NUMBER]
|
||||
};
|
||||
}
|
||||
|
||||
Error get_assembly_dependencies(GDMonoAssembly *p_assembly, MonoAssemblyName *reusable_aname, const Vector<String> &p_search_dirs, Dictionary &r_assembly_dependencies) {
|
||||
MonoImage *image = p_assembly->get_image();
|
||||
|
||||
for (int i = 0; i < mono_image_get_table_rows(image, MONO_TABLE_ASSEMBLYREF); i++) {
|
||||
AssemblyRefInfo ref_info = get_assemblyref_name(image, i);
|
||||
|
||||
const String &ref_name = ref_info.name;
|
||||
|
||||
if (r_assembly_dependencies.has(ref_name)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
mono_assembly_get_assemblyref(image, i, reusable_aname);
|
||||
|
||||
GDMonoAssembly *ref_assembly = nullptr;
|
||||
if (!GDMono::get_singleton()->load_assembly(ref_name, reusable_aname, &ref_assembly, p_search_dirs)) {
|
||||
ERR_FAIL_V_MSG(ERR_CANT_RESOLVE, "Cannot load assembly (refonly): '" + ref_name + "'.");
|
||||
}
|
||||
|
||||
r_assembly_dependencies[ref_name] = ref_assembly->get_path();
|
||||
|
||||
Error err = get_assembly_dependencies(ref_assembly, reusable_aname, p_search_dirs, r_assembly_dependencies);
|
||||
ERR_FAIL_COND_V_MSG(err != OK, err, "Cannot load one of the dependencies for the assembly: '" + ref_name + "'.");
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
Error get_exported_assembly_dependencies(const Dictionary &p_initial_assemblies,
|
||||
const String &p_build_config, const String &p_custom_bcl_dir, Dictionary &r_assembly_dependencies) {
|
||||
MonoDomain *export_domain = GDMonoUtils::create_domain("GodotEngine.Domain.ProjectExport");
|
||||
ERR_FAIL_NULL_V(export_domain, FAILED);
|
||||
_GDMONO_SCOPE_EXIT_DOMAIN_UNLOAD_(export_domain);
|
||||
|
||||
_GDMONO_SCOPE_DOMAIN_(export_domain);
|
||||
|
||||
Vector<String> search_dirs;
|
||||
GDMonoAssembly::fill_search_dirs(search_dirs, p_build_config, p_custom_bcl_dir);
|
||||
|
||||
if (p_custom_bcl_dir.length()) {
|
||||
// Only one mscorlib can be loaded. We need this workaround to make sure we get it from the right BCL directory.
|
||||
r_assembly_dependencies["mscorlib"] = p_custom_bcl_dir.plus_file("mscorlib.dll").simplify_path();
|
||||
}
|
||||
|
||||
for (const Variant *key = p_initial_assemblies.next(); key; key = p_initial_assemblies.next(key)) {
|
||||
String assembly_name = *key;
|
||||
String assembly_path = p_initial_assemblies[*key];
|
||||
|
||||
GDMonoAssembly *assembly = nullptr;
|
||||
bool load_success = GDMono::get_singleton()->load_assembly_from(assembly_name, assembly_path, &assembly);
|
||||
|
||||
ERR_FAIL_COND_V_MSG(!load_success, ERR_CANT_RESOLVE, "Cannot load assembly (refonly): '" + assembly_name + "'.");
|
||||
|
||||
MonoAssemblyName *reusable_aname = new_mono_assembly_name();
|
||||
SCOPE_EXIT { mono_free(reusable_aname); };
|
||||
|
||||
Error err = get_assembly_dependencies(assembly, reusable_aname, search_dirs, r_assembly_dependencies);
|
||||
if (err != OK) {
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
} // namespace GodotSharpExport
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
/*************************************************************************/
|
||||
/* godotsharp_export.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#ifndef GODOTSHARP_EXPORT_H
|
||||
#define GODOTSHARP_EXPORT_H
|
||||
|
||||
#include "core/error/error_list.h"
|
||||
#include "core/string/ustring.h"
|
||||
#include "core/variant/dictionary.h"
|
||||
|
||||
namespace GodotSharpExport {
|
||||
|
||||
Error get_exported_assembly_dependencies(const Dictionary &p_initial_assemblies,
|
||||
const String &p_build_config, const String &p_custom_lib_dir, Dictionary &r_assembly_dependencies);
|
||||
} // namespace GodotSharpExport
|
||||
|
||||
#endif // GODOTSHARP_EXPORT_H
|
||||
Loading…
Add table
Add a link
Reference in a new issue