Skip to content

Commit

Permalink
nativetoolservice
Browse files Browse the repository at this point in the history
  • Loading branch information
HendrikMennen committed Dec 14, 2023
1 parent 8f627b7 commit 497b779
Show file tree
Hide file tree
Showing 29 changed files with 298 additions and 271 deletions.
4 changes: 3 additions & 1 deletion src/OneWare.Core/App.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,10 @@ protected override void RegisterTypes(IContainerRegistry containerRegistry)
containerRegistry.RegisterSingleton<IPluginService, PluginService>();
containerRegistry.RegisterSingleton<IHttpService, HttpService>();
containerRegistry.RegisterSingleton<IApplicationCommandService, ApplicationCommandService>();
containerRegistry.RegisterSingleton<IPackageService, PackageService>();
containerRegistry.RegisterSingleton<IProjectManagerService, ProjectManagerService>();
containerRegistry.RegisterSingleton<ILanguageManager, LanguageManager>();
containerRegistry.RegisterSingleton<IApplicationStateService, ApplicationStateService>();
containerRegistry.RegisterSingleton<INativeToolService, NativeToolService>();
containerRegistry.RegisterSingleton<IDockService, DockService>();
containerRegistry.RegisterSingleton<IWindowService, WindowService>();
containerRegistry.RegisterSingleton<IModuleTracker, ModuleTracker>();
Expand Down Expand Up @@ -100,6 +100,8 @@ protected override AvaloniaObject CreateShell()
settingsService.RegisterSettingCategory("Editor", 0, "BoxIcons.RegularCode");

settingsService.RegisterSettingCategory("Tools", 0, "FeatherIcons.Tool");

settingsService.RegisterSettingCategory("Languages", 0, "FluentIcons.ProofreadLanguageRegular");

settingsService.RegisterTitledCombo("Editor", "Appearance", "Editor_FontFamily", "Font",
"Editor Font Family",
Expand Down
54 changes: 54 additions & 0 deletions src/OneWare.Core/Services/NativeToolService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
using OneWare.SDK.Helpers;
using OneWare.SDK.NativeTools;
using OneWare.SDK.Services;

namespace OneWare.Core.Services;

public class NativeToolService(IHttpService httpService, ISettingsService settingsService, IPaths paths, ILogger logger) : INativeToolService
{
private readonly Dictionary<PlatformId, Dictionary<string, NativeTool>> _nativeTools = new();

public NativeTool Register(string id, string url, params PlatformId[] supportedPlatforms)
{
var nativeTool = new NativeTool(id, url, Path.Combine(paths.NativeToolsDirectory, id));
foreach (var platform in supportedPlatforms)
{
_nativeTools.TryAdd(platform, new Dictionary<string, NativeTool>());
_nativeTools[platform].Add(id, nativeTool);
}
return nativeTool;
}

public NativeTool? Get(string key)
{
if (_nativeTools.TryGetValue(PlatformHelper.Platform, out var platformTools))
{
if (platformTools.TryGetValue(key, out var nativeTool))
{
return nativeTool;
}
}
return null;
}

public async Task InstallAsync(NativeTool tool)
{
logger.Log($"Downloading {tool.Id}...");

await DownloadNativeToolAsync(tool);

foreach (var shortCut in tool.ShortCuts)
{
if(shortCut.Value.SettingKey != null)
settingsService.SetSettingValue(shortCut.Value.SettingKey, Path.Combine(tool.FullPath, shortCut.Value.RelativePath));
}
settingsService.Save(paths.SettingsPath);

logger.Log($"Download {tool.Id} finished!");
}

private async Task DownloadNativeToolAsync(NativeTool tool)
{
await httpService.DownloadAndExtractArchiveAsync(tool.Url, Path.Combine(paths.NativeToolsDirectory, tool.Id));
}
}
13 changes: 0 additions & 13 deletions src/OneWare.Core/Services/PackageService.cs

This file was deleted.

2 changes: 2 additions & 0 deletions src/OneWare.Core/Services/Paths.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ public class Paths : IPaths
public string ProjectsDirectory => Path.Combine(DocumentsDirectory, "Projects");
public string CrashReportsDirectory => Path.Combine(DocumentsDirectory, "CrashReports");
public string PackagesDirectory => Path.Combine(DocumentsDirectory, "Packages");
public string NativeToolsDirectory => Path.Combine(PackagesDirectory, "NativeTools");
public string PluginsDirectory => Path.Combine(PackagesDirectory, "Plugins");
public string ChangelogUrl => "https://raw.githubusercontent.com/ProtopSolutions/OneWareStudioWebsite/main/docs/studio/changelog.md";

Expand All @@ -38,6 +39,7 @@ public Paths(string appName, string appIconPath)
Directory.CreateDirectory(DocumentsDirectory);
Directory.CreateDirectory(PackagesDirectory);
Directory.CreateDirectory(PluginsDirectory);
Directory.CreateDirectory(NativeToolsDirectory);
Directory.CreateDirectory(CrashReportsDirectory);
Directory.CreateDirectory(ProjectsDirectory);
//...
Expand Down
18 changes: 16 additions & 2 deletions src/OneWare.Cpp/CppModule.cs
Original file line number Diff line number Diff line change
@@ -1,19 +1,33 @@
using OneWare.SDK.Services;
using OneWare.SDK.Helpers;
using OneWare.SDK.Services;
using Prism.Ioc;
using Prism.Modularity;

namespace OneWare.Cpp;

public class CppModule : IModule
{
public const string LspName = "clangd";
public const string LspPathSetting = "CppModule_ClangdPath";

public void RegisterTypes(IContainerRegistry containerRegistry)
{

}

public void OnInitialized(IContainerProvider containerProvider)
{
containerProvider.Resolve<IErrorService>().RegisterErrorSource("Clang");
var nativeToolService = containerProvider.Resolve<INativeToolService>();

nativeToolService.Register(LspName, "https://github.com/clangd/clangd/releases/download/17.0.3/clangd-windows-17.0.3.zip", PlatformId.WinX64)
.WithShortcut("LSP", Path.Combine("clangd_17.0.3", "bin", "clangd.exe"), LspPathSetting);

containerProvider.Resolve<ISettingsService>().RegisterTitledPath("Languages", "C++", LspPathSetting, "Clangd Path", "Path for clangd executable",
nativeToolService.Get(LspName)!.GetShorcutPath("LSP")!,
null, containerProvider.Resolve<IPaths>().PackagesDirectory, File.Exists);

containerProvider.Resolve<IErrorService>().RegisterErrorSource(LspName);

containerProvider.Resolve<ILanguageManager>().RegisterService(typeof(LanguageServiceCpp),false, ".cpp", ".h", ".c", ".hpp");
}
}
26 changes: 7 additions & 19 deletions src/OneWare.Cpp/LanguageServiceCpp.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,26 +9,14 @@

namespace OneWare.Cpp
{
public class LanguageServiceCpp : LanguageServiceLsp
public class LanguageServiceCpp : LanguageServiceLspAutoDownload
{
private static readonly string? StartPath;

static LanguageServiceCpp()
{
var assemblyPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)!;

StartPath = PlatformHelper.Platform switch
{
PlatformId.WinX64 => $"{assemblyPath}/native_tools/win-x64/clangd/clangd_16.0.2/bin/clangd.exe",
PlatformId.LinuxX64 => $"{assemblyPath}/native_tools/linux-x64/clangd/clangd_16.0.2/bin/clangd",
PlatformId.OsxX64 => $"{assemblyPath}/native_tools/osx-x64/clangd/clangd_16.0.2/bin/clangd",
PlatformId.OsxArm64 => $"{assemblyPath}/native_tools/osx-x64/clangd/clangd_16.0.2/bin/clangd",
_ => null
};
}

public LanguageServiceCpp(ISettingsService settingsService, IPaths paths) : base("Clang", StartPath,"--log=error",null)
public LanguageServiceCpp(INativeToolService nativeToolService, ISettingsService settingsService)
: base(settingsService.GetSettingObservable<string>(CppModule.LspPathSetting), () => nativeToolService.InstallAsync(nativeToolService.Get(CppModule.LspName)!),
CppModule.LspName, null)
{
Arguments = "--log=error";

// Global.Options.WhenAnyValue(x => x.CppLspNiosMode).Subscribe(x =>
// {
// if (IsActivated) _ = RestartAsync();
Expand All @@ -43,7 +31,7 @@ public LanguageServiceCpp(ISettingsService settingsService, IPaths paths) : base
// else if (!x && IsActivated) _ = DeactivateAsync();
// });
}

public override ITypeAssistance GetTypeAssistance(IEditor editor)
{
return new TypeAssistanceCpp(editor, this);
Expand Down
37 changes: 0 additions & 37 deletions src/OneWare.Cpp/OneWare.Cpp.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,42 +7,5 @@
<ItemGroup>
<ProjectReference Include="..\OneWare.SDK\OneWare.SDK.csproj" Private="false" ExcludeAssets="runtime" />
</ItemGroup>

<PropertyGroup Condition="'$(RuntimeIdentifier)' == 'win-x64' OR ('$(RuntimeIdentifier)' == '' AND $([MSBuild]::IsOSPlatform('Windows')))">
<UsePackageTarget>win-x64</UsePackageTarget>
<ExternalPackageUrl>https://github.com/clangd/clangd/releases/download/16.0.2/clangd-windows-16.0.2.zip</ExternalPackageUrl>
</PropertyGroup>

<PropertyGroup Condition="'$(RuntimeIdentifier)' == 'linux-x64' OR ('$(RuntimeIdentifier)' == '' AND $([MSBuild]::IsOSPlatform('Linux')))">
<UsePackageTarget>linux-x64</UsePackageTarget>
<ExternalPackageUrl>https://github.com/clangd/clangd/releases/download/16.0.2/clangd-linux-16.0.2.zip</ExternalPackageUrl>
</PropertyGroup>

<PropertyGroup Condition="'$(RuntimeIdentifier)' == 'osx-x64' OR ('$(RuntimeIdentifier)' == '' AND $([MSBuild]::IsOSPlatform('OSX')))">
<UsePackageTarget>osx-x64</UsePackageTarget>
<ExternalPackageUrl>https://github.com/clangd/clangd/releases/download/16.0.2/clangd-mac-16.0.2.zip</ExternalPackageUrl>
</PropertyGroup>

<PropertyGroup>
<PackageName>clangd</PackageName>
<ExtractionFolder>native_tools/$(UsePackageTarget)/$(PackageName)</ExtractionFolder>
</PropertyGroup>

<ItemGroup>
<Content Include="$(ExtractionFolder)/**" CopyToOutputDirectory="PreserveNewest"/>
</ItemGroup>

<Target Name="DownloadExternalPackage" BeforeTargets="BeforeBuild" Condition="'$(ExternalPackageUrl)' != '' AND !Exists('$(ExtractionFolder)')">
<DownloadFile
SourceUrl="$(ExternalPackageUrl)"
DestinationFileName="temp_package.tmp"
DestinationFolder="$(IntermediateOutputPath)"/>
<Uncompress TargetDirectory="$(ExtractionFolder)"
ArchivePath="$(IntermediateOutputPath)temp_package.tmp"/>
<Message Text="Downloaded Package from $(ExternalPackageUrl)" Importance="high"/>
<ItemGroup>
<Content Include="$(ExtractionFolder)/**" CopyToOutputDirectory="PreserveNewest"/>
</ItemGroup>
</Target>

</Project>
21 changes: 0 additions & 21 deletions src/OneWare.Cpp/TypeAssistanceCpp.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,26 +47,5 @@ public TypeAssistanceCpp(IEditor editor, LanguageServiceCpp ls) : base(editor, l

return string.IsNullOrWhiteSpace(info) ? null : info;
}

// protected override ICompletionData ConvertCompletionItem(CompletionItem comp, int offset)
// {
// var icon = TypeAssistanceIconStore.Instance.Icons.TryGetValue(comp.Kind, out var instanceIcon)
// ? instanceIcon
// : TypeAssistanceIconStore.Instance.CustomIcons["Default"];
//
// var newLabel = comp.Label.Length > 0 ? comp.Label.Remove(0, 1) : "";
// newLabel = newLabel.Split("(")[0].Split("<")[0];
//
// void AfterComplete()
// {
// _ = ShowSignatureHelpAsync();
// }
//
// var description = comp.Documentation != null ? (comp.Documentation.MarkupContent != null ? comp.Documentation.MarkupContent.Value : comp.Documentation.String) : null;
//
// description = description?.Replace("\n", "\n\n");
// return new CompletionData(comp.InsertText ?? "", newLabel, description, icon, 0,
// comp, offset, AfterComplete);
// }
}
}
1 change: 0 additions & 1 deletion src/OneWare.PackageManager/Serializer/Package.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ public class Package

public string? Description { get; init; }


public string? License { get; init; }

public string? IconUrl { get; init; }
Expand Down
30 changes: 11 additions & 19 deletions src/OneWare.SDK/LanguageService/LanguageServiceLsp.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,25 +22,15 @@

namespace OneWare.SDK.LanguageService
{
public abstract class LanguageServiceLsp : LanguageServiceBase
public abstract class LanguageServiceLsp(string name, string? workspace) : LanguageServiceBase(name, workspace)
{
private readonly Dictionary<ProgressToken, (ApplicationProcess, string)> _tokenRegister = new();
private LanguageClient? Client { get; set; }

private CancellationTokenSource? _cancellation;
private IChildProcess? _process;
private string? Arguments { get; set; }
private string? ExecutablePath { get; set; }

protected LanguageServiceLsp(string name, string? executablePath, string? arguments, string? workspace) : base(name, workspace)
{
if (executablePath != null && (RuntimeInformation.IsOSPlatform(OSPlatform.Linux) || RuntimeInformation.IsOSPlatform(OSPlatform.OSX)))
{
PlatformHelper.ChmodFile(executablePath);
}
ExecutablePath = executablePath;
Arguments = arguments;
}
protected string? Arguments { get; set; }
protected string? ExecutablePath { get; set; }

public override async Task ActivateAsync()
{
Expand All @@ -53,6 +43,11 @@ public override async Task ActivateAsync()
return;
}

if ((RuntimeInformation.IsOSPlatform(OSPlatform.Linux) || RuntimeInformation.IsOSPlatform(OSPlatform.OSX)))
{
PlatformHelper.ChmodFile(ExecutablePath);
}

_cancellation = new CancellationTokenSource();

if (ExecutablePath.StartsWith("wss://") || ExecutablePath.StartsWith("ws://"))
Expand Down Expand Up @@ -142,11 +137,8 @@ await Dispatcher.UIThread.InvokeAsync(async () =>
_cancellation?.Cancel();

Check warning on line 137 in src/OneWare.SDK/LanguageService/LanguageServiceLsp.cs

View workflow job for this annotation

GitHub Actions / build

Cancel synchronously blocks. Await CancelAsync instead. (https://github.com/Microsoft/vs-threading/blob/main/doc/analyzers/VSTHRD103.md)
_process?.Kill();
}

/// <summary>
/// After Activate
/// </summary>
protected async Task InitAsync(Stream input, Stream output, Action<LanguageClientOptions>? customOptions = null)

private async Task InitAsync(Stream input, Stream output, Action<LanguageClientOptions>? customOptions = null)
{
Client = LanguageClient.PreInit(
options =>
Expand All @@ -165,7 +157,6 @@ protected async Task InitAsync(Stream input, Stream output, Action<LanguageClien
options.OnLogTrace(x => ContainerLocator.Container.Resolve<ILogger>()?.Log(x.Message, ConsoleColor.Red));
options.OnPublishDiagnostics(PublishDiag);
options.OnApplyWorkspaceEdit(ApplyWorkspaceEditAsync);
options.EnableDynamicRegistration();
options.OnShowMessage(x => ContainerLocator.Container.Resolve<ILogger>()?.Log(x.Message, ConsoleColor.DarkCyan));
options.OnTelemetryEvent(x => { ContainerLocator.Container.Resolve<ILogger>()?.Log(x, ConsoleColor.Magenta); });

Expand Down Expand Up @@ -250,6 +241,7 @@ protected async Task InitAsync(Stream input, Stream output, Action<LanguageClien
ValueSet = new Container<CompletionItemTag>(CompletionItemTag.Deprecated)
}
},
LabelDetailsSupport = true,
},
CompletionItemKind = new CompletionItemKindCapabilityOptions
{
Expand Down
30 changes: 30 additions & 0 deletions src/OneWare.SDK/LanguageService/LanguageServiceLspAutoDownload.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using DynamicData.Binding;
using OneWare.SDK.NativeTools;
using OneWare.SDK.Services;
using OneWare.SDK.ViewModels;

namespace OneWare.SDK.LanguageService;

public abstract class LanguageServiceLspAutoDownload : LanguageServiceLsp
{
private readonly Func<Task> _installTask;
protected LanguageServiceLspAutoDownload(IObservable<string> executablePath, Func<Task> install, string name, string? workspace)
: base(name, workspace)
{
_installTask = install;

executablePath.Subscribe(x =>
{
ExecutablePath = x;
});
}

public override async Task ActivateAsync()
{
if (!File.Exists(ExecutablePath))
{
await _installTask.Invoke();
}
await base.ActivateAsync();
}
}
Loading

0 comments on commit 497b779

Please sign in to comment.