diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..60ed6b2 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,40 @@ +{ + "permissions": { + "allow": [ + "mcp__serena__initial_instructions", + "mcp__serena__switch_modes", + "mcp__serena__find_file", + "mcp__serena__get_symbols_overview", + "mcp__serena__find_symbol", + "mcp__serena__search_for_pattern", + "mcp__serena__think_about_task_adherence", + "mcp__serena__replace_regex", + "Bash(uv run:*)", + "mcp__serena__list_dir", + "Bash(uv sync:*)", + "mcp__serena__check_onboarding_performed", + "mcp__serena__read_memory", + "mcp__serena__read_file", + "mcp__zen__thinkdeep", + "mcp__serena__replace_symbol_body", + "Bash(uv pip:*)", + "mcp__serena__summarize_changes", + "Bash(grep:*)", + "mcp__serena__think_about_collected_information", + "mcp__serena__think_about_whether_you_are_done", + "mcp__zen__planner", + "Bash(python test_csharp_indexing.py:*)", + "Bash(rm:*)", + "mcp__serena__list_memories", + "mcp__serena__execute_shell_command", + "mcp__zen__debug", + "Bash(find:*)", + "mcp__serena__activate_project", + "mcp__serena__get_current_config", + "mcp__zen__chat", + "Bash(mkdir:*)", + "Bash(python -m pytest test/solidlsp/csharp/test_csharp_basic.py::TestCSharpBasic::test_language_server_starts -v --no-header)" + ], + "deny": [] + } +} \ No newline at end of file diff --git a/docker_build_and_run.sh b/docker_build_and_run.sh old mode 100755 new mode 100644 diff --git a/serena.sln b/serena.sln new file mode 100644 index 0000000..ef7a131 --- /dev/null +++ b/serena.sln @@ -0,0 +1,38 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.2.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{0C88DD14-F956-CE84-757C-A364CCF449FC}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "resources", "resources", "{EF7103B4-4C75-1E6D-A485-A154A88D107A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "repos", "repos", "{E2326EEF-E677-6A44-0935-7677816F09E7}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "csharp", "csharp", "{C21E6CE7-177A-86D9-040F-A317F18B6DBF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestProject", "test\resources\repos\csharp\test_repo\TestProject.csproj", "{A4D04E18-760A-73F9-3303-0542F6298C84}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A4D04E18-760A-73F9-3303-0542F6298C84}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A4D04E18-760A-73F9-3303-0542F6298C84}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A4D04E18-760A-73F9-3303-0542F6298C84}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A4D04E18-760A-73F9-3303-0542F6298C84}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {EF7103B4-4C75-1E6D-A485-A154A88D107A} = {0C88DD14-F956-CE84-757C-A364CCF449FC} + {E2326EEF-E677-6A44-0935-7677816F09E7} = {EF7103B4-4C75-1E6D-A485-A154A88D107A} + {C21E6CE7-177A-86D9-040F-A317F18B6DBF} = {E2326EEF-E677-6A44-0935-7677816F09E7} + {A4D04E18-760A-73F9-3303-0542F6298C84} = {C21E6CE7-177A-86D9-040F-A317F18B6DBF} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {BDCA748E-D888-4BAF-BF24-DAC683113BFC} + EndGlobalSection +EndGlobal diff --git a/src/solidlsp/language_servers/csharp_language_server/__init__.py b/src/solidlsp/language_servers/csharp_language_server/__init__.py new file mode 100644 index 0000000..f7ec562 --- /dev/null +++ b/src/solidlsp/language_servers/csharp_language_server/__init__.py @@ -0,0 +1 @@ +# Empty __init__.py file to make this directory a Python package diff --git a/src/solidlsp/language_servers/csharp_language_server/csharp_language_server.py b/src/solidlsp/language_servers/csharp_language_server/csharp_language_server.py new file mode 100644 index 0000000..baab351 --- /dev/null +++ b/src/solidlsp/language_servers/csharp_language_server/csharp_language_server.py @@ -0,0 +1,339 @@ +""" +CSharp Language Server using csharp-ls (Roslyn-based LSP server) +""" + +import logging +import os +import pathlib +import shutil +import subprocess +import threading + +from overrides import override + +from solidlsp.config import LanguageServerConfig +from solidlsp.exceptions import LanguageServerException +from solidlsp.logger import LanguageServerLogger +from solidlsp.ls import SolidLanguageServer +from solidlsp.ls_handler import ProcessLaunchInfo +from solidlsp.ls_types import InitializeParams + + +def breadth_first_file_scan(root_dir): + """ + Perform a breadth-first scan of files in the given directory. + Yields file paths in breadth-first order. + """ + queue = [root_dir] + while queue: + current_dir = queue.pop(0) + try: + for item in os.listdir(current_dir): + if item.startswith("."): + continue + item_path = os.path.join(current_dir, item) + if os.path.isdir(item_path): + queue.append(item_path) + elif os.path.isfile(item_path): + yield item_path + except (PermissionError, OSError): + # Skip directories we can't access + pass + + +def find_solution_or_project_file(root_dir) -> str | None: + """ + Find the first .sln file in breadth-first order. + If no .sln file is found, look for a .csproj file. + """ + sln_file = None + csproj_file = None + + for filename in breadth_first_file_scan(root_dir): + if filename.endswith(".sln") and sln_file is None: + sln_file = filename + elif filename.endswith(".csproj") and csproj_file is None: + csproj_file = filename + + # If we found a .sln file, return it immediately + if sln_file: + return sln_file + + # If no .sln file was found, return the first .csproj file + return csproj_file + + +class CSharpLanguageServer(SolidLanguageServer): + """ + Provides C# specific instantiation of the LanguageServer class using csharp-ls. + csharp-ls is a Roslyn-based LSP server that provides modern C# language features. + """ + + def __init__(self, config: LanguageServerConfig, logger: LanguageServerLogger, repository_root_path: str): + """ + Creates a CSharpLanguageServer instance. This class is not meant to be instantiated directly. + Use LanguageServer.create() instead. + """ + csharp_ls_path = self.setup_runtime_dependencies(logger, config) + + # Find solution or project file + solution_or_project = find_solution_or_project_file(repository_root_path) + + # Build command + cmd_parts = [csharp_ls_path] + + # Add logging level if debug is enabled + if logger.logger.level <= logging.DEBUG: + cmd_parts.extend(["--loglevel", "info"]) + else: + cmd_parts.extend(["--loglevel", "error"]) + + # Add solution file if found + if solution_or_project: + # Extract relative path from repository root + rel_path = os.path.relpath(solution_or_project, repository_root_path) + cmd_parts.extend(["--solution", rel_path]) + logger.log(f"Using solution/project file: {rel_path}", logging.INFO) + else: + logger.log("No .sln or .csproj file found, csharp-ls will attempt auto-discovery", logging.WARNING) + + cmd = " ".join(cmd_parts) + + super().__init__( + config, + logger, + repository_root_path, + ProcessLaunchInfo(cmd=cmd, cwd=repository_root_path), + "csharp", + ) + + self.initialization_complete = threading.Event() + + @override + def is_ignored_dirname(self, dirname: str) -> bool: + return super().is_ignored_dirname(dirname) or dirname in ["bin", "obj", "packages", ".vs"] + + def setup_runtime_dependencies(self, logger: LanguageServerLogger, config: LanguageServerConfig) -> str: + """ + Set up csharp-ls by ensuring it's installed as a dotnet tool. + Returns the path to the csharp-ls executable. + """ + # First check if csharp-ls is already available in PATH + csharp_ls_path = shutil.which("csharp-ls") + if csharp_ls_path: + logger.log(f"Found csharp-ls in PATH: {csharp_ls_path}", logging.INFO) + return csharp_ls_path + + # Check if dotnet is available + dotnet_path = shutil.which("dotnet") + if not dotnet_path: + raise LanguageServerException( + "dotnet SDK is not installed or not in PATH. " + "Please install the .NET SDK from https://dotnet.microsoft.com/download" + ) + + # Check if csharp-ls is installed as a global tool + try: + result = subprocess.run( + ["dotnet", "tool", "list", "-g"], + capture_output=True, + text=True, + check=True + ) + if "csharp-ls" in result.stdout: + # csharp-ls is installed, but not in PATH + # Try to find it in the default dotnet tools directory + home = os.path.expanduser("~") + possible_paths = [ + os.path.join(home, ".dotnet", "tools", "csharp-ls"), + os.path.join(home, ".dotnet", "tools", "csharp-ls.exe"), + ] + for path in possible_paths: + if os.path.exists(path): + logger.log(f"Found csharp-ls at: {path}", logging.INFO) + return path + except subprocess.CalledProcessError: + pass + + # Install csharp-ls as a global tool + logger.log("Installing csharp-ls as a global dotnet tool...", logging.INFO) + try: + subprocess.run( + ["dotnet", "tool", "install", "-g", "csharp-ls"], + check=True, + capture_output=True, + text=True + ) + logger.log("Successfully installed csharp-ls", logging.INFO) + except subprocess.CalledProcessError as e: + # It might already be installed but failed to update + if "is already installed" in e.stderr: + logger.log("csharp-ls is already installed", logging.INFO) + else: + raise LanguageServerException(f"Failed to install csharp-ls: {e.stderr}") + + # After installation, try to find it again + csharp_ls_path = shutil.which("csharp-ls") + if csharp_ls_path: + return csharp_ls_path + + # Try the default locations again + home = os.path.expanduser("~") + possible_paths = [ + os.path.join(home, ".dotnet", "tools", "csharp-ls"), + os.path.join(home, ".dotnet", "tools", "csharp-ls.exe"), + ] + for path in possible_paths: + if os.path.exists(path): + logger.log(f"Found csharp-ls at: {path}", logging.INFO) + return path + + raise LanguageServerException( + "Failed to find csharp-ls after installation. " + "Please ensure ~/.dotnet/tools is in your PATH" + ) + + def _get_initialize_params(self, repository_absolute_path: str) -> InitializeParams: + """ + Returns the initialize params for the csharp-ls Language Server. + """ + initialize_params: InitializeParams = { # type: ignore + "processId": os.getpid(), + "rootPath": repository_absolute_path, + "rootUri": pathlib.Path(repository_absolute_path).as_uri(), + "capabilities": { + "workspace": { + "applyEdit": True, + "workspaceEdit": {"documentChanges": True}, + "didChangeConfiguration": {"dynamicRegistration": True}, + "didChangeWatchedFiles": {"dynamicRegistration": True}, + "symbol": { + "dynamicRegistration": True, + "symbolKind": { + "valueSet": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26] + }, + }, + "executeCommand": {"dynamicRegistration": True}, + }, + "textDocument": { + "synchronization": { + "dynamicRegistration": True, + "willSave": True, + "willSaveWaitUntil": True, + "didSave": True + }, + "completion": { + "dynamicRegistration": True, + "contextSupport": True, + "completionItem": { + "snippetSupport": True, + "commitCharactersSupport": True, + "documentationFormat": ["markdown", "plaintext"], + "deprecatedSupport": True, + "preselectSupport": True, + }, + "completionItemKind": { + "valueSet": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25] + }, + }, + "hover": {"dynamicRegistration": True, "contentFormat": ["markdown", "plaintext"]}, + "signatureHelp": { + "dynamicRegistration": True, + "signatureInformation": { + "documentationFormat": ["markdown", "plaintext"], + "parameterInformation": {"labelOffsetSupport": True}, + }, + }, + "definition": {"dynamicRegistration": True}, + "references": {"dynamicRegistration": True}, + "documentHighlight": {"dynamicRegistration": True}, + "documentSymbol": { + "dynamicRegistration": True, + "symbolKind": { + "valueSet": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26] + }, + "hierarchicalDocumentSymbolSupport": True, + }, + "codeAction": { + "dynamicRegistration": True, + "codeActionLiteralSupport": { + "codeActionKind": { + "valueSet": [ + "", + "quickfix", + "refactor", + "refactor.extract", + "refactor.inline", + "refactor.rewrite", + "source", + "source.organizeImports", + ] + } + }, + }, + "codeLens": {"dynamicRegistration": True}, + "formatting": {"dynamicRegistration": True}, + "rangeFormatting": {"dynamicRegistration": True}, + "onTypeFormatting": {"dynamicRegistration": True}, + "rename": {"dynamicRegistration": True}, + "publishDiagnostics": {"relatedInformation": True}, + }, + }, + "workspaceFolders": [ + {"uri": pathlib.Path(repository_absolute_path).as_uri(), "name": os.path.basename(repository_absolute_path)} + ], + } + + return initialize_params + + def _start_server(self): + """ + Starts the csharp-ls Language Server. + + Usage: + ``` + async with lsp.start_server(): + # LanguageServer has been initialized + await lsp.request_definition(...) + await lsp.request_references(...) + # Shutdown the LanguageServer on exit from scope + # LanguageServer has been shutdown cleanly + ``` + """ + + def do_nothing(params): + return + + def window_log_message(msg): + """Log messages from the language server.""" + message_text = msg.get("message", "") + self.logger.log(f"LSP: window/logMessage: {message_text}", logging.INFO) + + # Set up notification handlers + self.server.on_notification("window/logMessage", window_log_message) + self.server.on_notification("$/progress", do_nothing) + self.server.on_notification("textDocument/publishDiagnostics", do_nothing) + + self.logger.log("Starting csharp-ls server process", logging.INFO) + self.server.start() + + # Send initialization + initialize_params = self._get_initialize_params(self.repository_root_path) + + self.logger.log("Sending initialize request to csharp-ls server", logging.INFO) + init_response = self.server.send.initialize(initialize_params) + self.logger.log(f"Received initialize response: {init_response}", logging.DEBUG) + + # Verify required capabilities + capabilities = init_response.get("capabilities", {}) + assert "textDocumentSync" in capabilities + assert "definitionProvider" in capabilities + assert "referencesProvider" in capabilities + assert "documentSymbolProvider" in capabilities + + # Complete initialization + self.server.notify.initialized({}) + self.initialization_complete.set() + self.completions_available.set() + + self.logger.log("csharp-ls server initialized and ready", logging.INFO) diff --git a/src/solidlsp/ls.py b/src/solidlsp/ls.py index 162b52a..43266fc 100644 --- a/src/solidlsp/ls.py +++ b/src/solidlsp/ls.py @@ -135,9 +135,9 @@ class SolidLanguageServer(ABC): ls = RustAnalyzer(config, logger, repository_root_path) elif config.code_language == Language.CSHARP: - from solidlsp.language_servers.omnisharp.omnisharp import OmniSharp + from solidlsp.language_servers.csharp_language_server.csharp_language_server import CSharpLanguageServer - ls = OmniSharp(config, logger, repository_root_path) + ls = CSharpLanguageServer(config, logger, repository_root_path) elif config.code_language == Language.TYPESCRIPT: from solidlsp.language_servers.typescript_language_server.typescript_language_server import ( diff --git a/test/resources/repos/csharp/test_repo/Models/Person.cs b/test/resources/repos/csharp/test_repo/Models/Person.cs new file mode 100644 index 0000000..c771195 --- /dev/null +++ b/test/resources/repos/csharp/test_repo/Models/Person.cs @@ -0,0 +1,26 @@ +namespace TestProject.Models +{ + public class Person + { + public string Name { get; set; } + public int Age { get; set; } + public string Email { get; set; } + + public Person(string name, int age, string email) + { + Name = name; + Age = age; + Email = email; + } + + public override string ToString() + { + return $"{Name} ({Age}) - {Email}"; + } + + public bool IsAdult() + { + return Age >= 18; + } + } +} \ No newline at end of file diff --git a/test/resources/repos/csharp/test_repo/Program.cs b/test/resources/repos/csharp/test_repo/Program.cs new file mode 100644 index 0000000..55c8d22 --- /dev/null +++ b/test/resources/repos/csharp/test_repo/Program.cs @@ -0,0 +1,43 @@ +using System; + +namespace TestProject +{ + class Program + { + static void Main(string[] args) + { + Console.WriteLine("Hello, World!"); + + var calculator = new Calculator(); + int result = calculator.Add(5, 3); + Console.WriteLine($"5 + 3 = {result}"); + } + } + + public class Calculator + { + public int Add(int a, int b) + { + return a + b; + } + + public int Subtract(int a, int b) + { + return a - b; + } + + public int Multiply(int a, int b) + { + return a * b; + } + + public double Divide(int a, int b) + { + if (b == 0) + { + throw new DivideByZeroException("Cannot divide by zero"); + } + return (double)a / b; + } + } +} \ No newline at end of file diff --git a/test/resources/repos/csharp/test_repo/TestProject.csproj b/test/resources/repos/csharp/test_repo/TestProject.csproj new file mode 100644 index 0000000..c28018d --- /dev/null +++ b/test/resources/repos/csharp/test_repo/TestProject.csproj @@ -0,0 +1,10 @@ + + + + Exe + net8.0 + enable + enable + + + \ No newline at end of file diff --git a/test/resources/repos/csharp/test_repo/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/test/resources/repos/csharp/test_repo/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs new file mode 100644 index 0000000..2217181 --- /dev/null +++ b/test/resources/repos/csharp/test_repo/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")] diff --git a/test/resources/repos/csharp/test_repo/obj/Debug/net8.0/TestProject.AssemblyInfo.cs b/test/resources/repos/csharp/test_repo/obj/Debug/net8.0/TestProject.AssemblyInfo.cs new file mode 100644 index 0000000..e0a71f9 --- /dev/null +++ b/test/resources/repos/csharp/test_repo/obj/Debug/net8.0/TestProject.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("TestProject")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+13d2051bab6be61a27562a1dec345394d9406ed5")] +[assembly: System.Reflection.AssemblyProductAttribute("TestProject")] +[assembly: System.Reflection.AssemblyTitleAttribute("TestProject")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/test/resources/repos/csharp/test_repo/obj/Debug/net8.0/TestProject.AssemblyInfoInputs.cache b/test/resources/repos/csharp/test_repo/obj/Debug/net8.0/TestProject.AssemblyInfoInputs.cache new file mode 100644 index 0000000..82bba34 --- /dev/null +++ b/test/resources/repos/csharp/test_repo/obj/Debug/net8.0/TestProject.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d236faca0a9516c65821191c66ef2203410e818d52783134b3f85ef04a27b229 diff --git a/test/resources/repos/csharp/test_repo/obj/Debug/net8.0/TestProject.GeneratedMSBuildEditorConfig.editorconfig b/test/resources/repos/csharp/test_repo/obj/Debug/net8.0/TestProject.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..130dd46 --- /dev/null +++ b/test/resources/repos/csharp/test_repo/obj/Debug/net8.0/TestProject.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,17 @@ +is_global = true +build_property.TargetFramework = net8.0 +build_property.TargetFrameworkIdentifier = .NETCoreApp +build_property.TargetFrameworkVersion = v8.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = TestProject +build_property.ProjectDir = \\wsl.localhost\Ubuntu\home\thomh\dev\serena\test\resources\repos\csharp\test_repo\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/test/resources/repos/csharp/test_repo/obj/Debug/net8.0/TestProject.GlobalUsings.g.cs b/test/resources/repos/csharp/test_repo/obj/Debug/net8.0/TestProject.GlobalUsings.g.cs new file mode 100644 index 0000000..d12bcbc --- /dev/null +++ b/test/resources/repos/csharp/test_repo/obj/Debug/net8.0/TestProject.GlobalUsings.g.cs @@ -0,0 +1,8 @@ +// +global using System; +global using System.Collections.Generic; +global using System.IO; +global using System.Linq; +global using System.Net.Http; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/test/resources/repos/csharp/test_repo/obj/Debug/net8.0/TestProject.assets.cache b/test/resources/repos/csharp/test_repo/obj/Debug/net8.0/TestProject.assets.cache new file mode 100644 index 0000000..af60b7a Binary files /dev/null and b/test/resources/repos/csharp/test_repo/obj/Debug/net8.0/TestProject.assets.cache differ diff --git a/test/resources/repos/csharp/test_repo/obj/TestProject.csproj.nuget.dgspec.json b/test/resources/repos/csharp/test_repo/obj/TestProject.csproj.nuget.dgspec.json new file mode 100644 index 0000000..4ac3642 --- /dev/null +++ b/test/resources/repos/csharp/test_repo/obj/TestProject.csproj.nuget.dgspec.json @@ -0,0 +1,360 @@ +{ + "format": 1, + "restore": { + "\\\\wsl.localhost\\Ubuntu\\home\\thomh\\dev\\serena\\test\\resources\\repos\\csharp\\test_repo\\TestProject.csproj": {} + }, + "projects": { + "\\\\wsl.localhost\\Ubuntu\\home\\thomh\\dev\\serena\\test\\resources\\repos\\csharp\\test_repo\\TestProject.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "\\\\wsl.localhost\\Ubuntu\\home\\thomh\\dev\\serena\\test\\resources\\repos\\csharp\\test_repo\\TestProject.csproj", + "projectName": "TestProject", + "projectPath": "\\\\wsl.localhost\\Ubuntu\\home\\thomh\\dev\\serena\\test\\resources\\repos\\csharp\\test_repo\\TestProject.csproj", + "packagesPath": "C:\\Users\\thomh\\.nuget\\packages\\", + "outputPath": "\\\\wsl.localhost\\Ubuntu\\home\\thomh\\dev\\serena\\test\\resources\\repos\\csharp\\test_repo\\obj\\", + "projectStyle": "PackageReference", + "fallbackFolders": [ + "D:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" + ], + "configFilePaths": [ + "C:\\Users\\thomh\\AppData\\Roaming\\NuGet\\NuGet.Config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" + ], + "originalTargetFrameworks": [ + "net8.0" + ], + "sources": { + "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.100" + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.100-preview.4.25204.4/PortableRuntimeIdentifierGraph.json", + "packagesToPrune": { + "Microsoft.CSharp": "(, 4.7.32767]", + "Microsoft.NETCore.App": "(, 2.1.32767]", + "Microsoft.VisualBasic": "(, 10.3.32767]", + "Microsoft.Win32.Primitives": "(, 4.3.32767]", + "Microsoft.Win32.Registry": "(, 5.0.32767]", + "runtime.any.System.Collections": "(, 4.3.32767]", + "runtime.any.System.Diagnostics.Tools": "(, 4.3.32767]", + "runtime.any.System.Diagnostics.Tracing": "(, 4.3.32767]", + "runtime.any.System.Globalization": "(, 4.3.32767]", + "runtime.any.System.Globalization.Calendars": "(, 4.3.32767]", + "runtime.any.System.IO": "(, 4.3.32767]", + "runtime.any.System.Reflection": "(, 4.3.32767]", + "runtime.any.System.Reflection.Extensions": "(, 4.3.32767]", + "runtime.any.System.Reflection.Primitives": "(, 4.3.32767]", + "runtime.any.System.Resources.ResourceManager": "(, 4.3.32767]", + "runtime.any.System.Runtime": "(, 4.3.32767]", + "runtime.any.System.Runtime.Handles": "(, 4.3.32767]", + "runtime.any.System.Runtime.InteropServices": "(, 4.3.32767]", + "runtime.any.System.Text.Encoding": "(, 4.3.32767]", + "runtime.any.System.Text.Encoding.Extensions": "(, 4.3.32767]", + "runtime.any.System.Threading.Tasks": "(, 4.3.32767]", + "runtime.any.System.Threading.Timer": "(, 4.3.32767]", + "runtime.aot.System.Collections": "(, 4.3.32767]", + "runtime.aot.System.Diagnostics.Tools": "(, 4.3.32767]", + "runtime.aot.System.Diagnostics.Tracing": "(, 4.3.32767]", + "runtime.aot.System.Globalization": "(, 4.3.32767]", + "runtime.aot.System.Globalization.Calendars": "(, 4.3.32767]", + "runtime.aot.System.IO": "(, 4.3.32767]", + "runtime.aot.System.Reflection": "(, 4.3.32767]", + "runtime.aot.System.Reflection.Extensions": "(, 4.3.32767]", + "runtime.aot.System.Reflection.Primitives": "(, 4.3.32767]", + "runtime.aot.System.Resources.ResourceManager": "(, 4.3.32767]", + "runtime.aot.System.Runtime": "(, 4.3.32767]", + "runtime.aot.System.Runtime.Handles": "(, 4.3.32767]", + "runtime.aot.System.Runtime.InteropServices": "(, 4.3.32767]", + "runtime.aot.System.Text.Encoding": "(, 4.3.32767]", + "runtime.aot.System.Text.Encoding.Extensions": "(, 4.3.32767]", + "runtime.aot.System.Threading.Tasks": "(, 4.3.32767]", + "runtime.aot.System.Threading.Timer": "(, 4.3.32767]", + "runtime.debian.8-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.debian.9-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.native.System.Security.Cryptography.Apple": "(, 4.3.32767]", + "runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "(, 4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.unix.Microsoft.Win32.Primitives": "(, 4.3.32767]", + "runtime.unix.System.Console": "(, 4.3.32767]", + "runtime.unix.System.Diagnostics.Debug": "(, 4.3.32767]", + "runtime.unix.System.IO.FileSystem": "(, 4.3.32767]", + "runtime.unix.System.Net.Primitives": "(, 4.3.32767]", + "runtime.unix.System.Net.Sockets": "(, 4.3.32767]", + "runtime.unix.System.Private.Uri": "(, 4.3.32767]", + "runtime.unix.System.Runtime.Extensions": "(, 4.3.32767]", + "runtime.win.Microsoft.Win32.Primitives": "(, 4.3.32767]", + "runtime.win.System.Console": "(, 4.3.32767]", + "runtime.win.System.Diagnostics.Debug": "(, 4.3.32767]", + "runtime.win.System.IO.FileSystem": "(, 4.3.32767]", + "runtime.win.System.Net.Primitives": "(, 4.3.32767]", + "runtime.win.System.Net.Sockets": "(, 4.3.32767]", + "runtime.win.System.Runtime.Extensions": "(, 4.3.32767]", + "runtime.win10-arm-aot.runtime.native.System.IO.Compression": "(, 4.0.32767]", + "runtime.win10-arm64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.win10-x64-aot.runtime.native.System.IO.Compression": "(, 4.0.32767]", + "runtime.win10-x86-aot.runtime.native.System.IO.Compression": "(, 4.0.32767]", + "runtime.win7-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.win7-x86.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.win7.System.Private.Uri": "(, 4.3.32767]", + "runtime.win8-arm.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "System.AppContext": "(, 4.3.32767]", + "System.Buffers": "(, 4.5.32767]", + "System.Collections": "(, 4.3.32767]", + "System.Collections.Concurrent": "(, 4.3.32767]", + "System.Collections.Immutable": "(, 8.0.32767]", + "System.Collections.NonGeneric": "(, 4.3.32767]", + "System.Collections.Specialized": "(, 4.3.32767]", + "System.ComponentModel": "(, 4.3.32767]", + "System.ComponentModel.Annotations": "(, 5.0.32767]", + "System.ComponentModel.EventBasedAsync": "(, 4.3.32767]", + "System.ComponentModel.Primitives": "(, 4.3.32767]", + "System.ComponentModel.TypeConverter": "(, 4.3.32767]", + "System.Console": "(, 4.3.32767]", + "System.Data.Common": "(, 4.3.32767]", + "System.Data.DataSetExtensions": "(, 4.5.32767]", + "System.Diagnostics.Contracts": "(, 4.3.32767]", + "System.Diagnostics.Debug": "(, 4.3.32767]", + "System.Diagnostics.DiagnosticSource": "(, 8.0.32767]", + "System.Diagnostics.FileVersionInfo": "(, 4.3.32767]", + "System.Diagnostics.Process": "(, 4.3.32767]", + "System.Diagnostics.StackTrace": "(, 4.3.32767]", + "System.Diagnostics.TextWriterTraceListener": "(, 4.3.32767]", + "System.Diagnostics.Tools": "(, 4.3.32767]", + "System.Diagnostics.TraceSource": "(, 4.3.32767]", + "System.Diagnostics.Tracing": "(, 4.3.32767]", + "System.Drawing.Primitives": "(, 4.3.32767]", + "System.Dynamic.Runtime": "(, 4.3.32767]", + "System.Formats.Asn1": "(, 8.0.32767]", + "System.Globalization": "(, 4.3.32767]", + "System.Globalization.Calendars": "(, 4.3.32767]", + "System.Globalization.Extensions": "(, 4.3.32767]", + "System.IO": "(, 4.3.32767]", + "System.IO.Compression": "(, 4.3.32767]", + "System.IO.Compression.ZipFile": "(, 4.3.32767]", + "System.IO.FileSystem": "(, 4.3.32767]", + "System.IO.FileSystem.AccessControl": "(, 5.0.32767]", + "System.IO.FileSystem.DriveInfo": "(, 4.3.32767]", + "System.IO.FileSystem.Primitives": "(, 4.3.32767]", + "System.IO.FileSystem.Watcher": "(, 4.3.32767]", + "System.IO.IsolatedStorage": "(, 4.3.32767]", + "System.IO.MemoryMappedFiles": "(, 4.3.32767]", + "System.IO.Pipes": "(, 4.3.32767]", + "System.IO.Pipes.AccessControl": "(, 4.6.32767]", + "System.IO.UnmanagedMemoryStream": "(, 4.3.32767]", + "System.Linq": "(, 4.3.32767]", + "System.Linq.Expressions": "(, 4.3.32767]", + "System.Linq.Parallel": "(, 4.3.32767]", + "System.Linq.Queryable": "(, 4.3.32767]", + "System.Memory": "(, 4.5.32767]", + "System.Net.Http": "(, 4.3.32767]", + "System.Net.Http.Json": "(, 8.0.32767]", + "System.Net.NameResolution": "(, 4.3.32767]", + "System.Net.NetworkInformation": "(, 4.3.32767]", + "System.Net.Ping": "(, 4.3.32767]", + "System.Net.Primitives": "(, 4.3.32767]", + "System.Net.Requests": "(, 4.3.32767]", + "System.Net.Security": "(, 4.3.32767]", + "System.Net.Sockets": "(, 4.3.32767]", + "System.Net.WebHeaderCollection": "(, 4.3.32767]", + "System.Net.WebSockets": "(, 4.3.32767]", + "System.Net.WebSockets.Client": "(, 4.3.32767]", + "System.Numerics.Vectors": "(, 4.5.32767]", + "System.ObjectModel": "(, 4.3.32767]", + "System.Private.DataContractSerialization": "(, 4.3.32767]", + "System.Private.Uri": "(, 4.3.32767]", + "System.Reflection": "(, 4.3.32767]", + "System.Reflection.DispatchProxy": "(, 4.7.32767]", + "System.Reflection.Emit": "(, 4.7.32767]", + "System.Reflection.Emit.ILGeneration": "(, 4.7.32767]", + "System.Reflection.Emit.Lightweight": "(, 4.7.32767]", + "System.Reflection.Extensions": "(, 4.3.32767]", + "System.Reflection.Metadata": "(, 8.0.32767]", + "System.Reflection.Primitives": "(, 4.3.32767]", + "System.Reflection.TypeExtensions": "(, 4.7.32767]", + "System.Resources.Reader": "(, 4.3.32767]", + "System.Resources.ResourceManager": "(, 4.3.32767]", + "System.Resources.Writer": "(, 4.3.32767]", + "System.Runtime": "(, 4.3.32767]", + "System.Runtime.CompilerServices.Unsafe": "(, 6.0.32767]", + "System.Runtime.CompilerServices.VisualC": "(, 4.3.32767]", + "System.Runtime.Extensions": "(, 4.3.32767]", + "System.Runtime.Handles": "(, 4.3.32767]", + "System.Runtime.InteropServices": "(, 4.3.32767]", + "System.Runtime.InteropServices.RuntimeInformation": "(, 4.3.32767]", + "System.Runtime.InteropServices.WindowsRuntime": "(, 4.3.32767]", + "System.Runtime.Loader": "(, 4.3.32767]", + "System.Runtime.Numerics": "(, 4.3.32767]", + "System.Runtime.Serialization.Formatters": "(, 4.3.32767]", + "System.Runtime.Serialization.Json": "(, 4.3.32767]", + "System.Runtime.Serialization.Primitives": "(, 4.3.32767]", + "System.Runtime.Serialization.Xml": "(, 4.3.32767]", + "System.Runtime.WindowsRuntime": "(, 4.7.32767]", + "System.Runtime.WindowsRuntime.UI.Xaml": "(, 4.7.32767]", + "System.Security.AccessControl": "(, 6.0.32767]", + "System.Security.Claims": "(, 4.3.32767]", + "System.Security.Cryptography.Algorithms": "(, 4.3.32767]", + "System.Security.Cryptography.Cng": "(, 4.6.32767]", + "System.Security.Cryptography.Csp": "(, 4.3.32767]", + "System.Security.Cryptography.Encoding": "(, 4.3.32767]", + "System.Security.Cryptography.OpenSsl": "(, 5.0.32767]", + "System.Security.Cryptography.Primitives": "(, 4.3.32767]", + "System.Security.Cryptography.X509Certificates": "(, 4.3.32767]", + "System.Security.Cryptography.Xml": "(, 4.4.32767]", + "System.Security.Principal": "(, 4.3.32767]", + "System.Security.Principal.Windows": "(, 5.0.32767]", + "System.Security.SecureString": "(, 4.3.32767]", + "System.Text.Encoding": "(, 4.3.32767]", + "System.Text.Encoding.CodePages": "(, 8.0.32767]", + "System.Text.Encoding.Extensions": "(, 4.3.32767]", + "System.Text.Encodings.Web": "(, 8.0.32767]", + "System.Text.Json": "(, 8.0.32767]", + "System.Text.RegularExpressions": "(, 4.3.32767]", + "System.Threading": "(, 4.3.32767]", + "System.Threading.Channels": "(, 8.0.32767]", + "System.Threading.Overlapped": "(, 4.3.32767]", + "System.Threading.Tasks": "(, 4.3.32767]", + "System.Threading.Tasks.Dataflow": "(, 8.0.32767]", + "System.Threading.Tasks.Extensions": "(, 4.5.32767]", + "System.Threading.Tasks.Parallel": "(, 4.3.32767]", + "System.Threading.Thread": "(, 4.3.32767]", + "System.Threading.ThreadPool": "(, 4.3.32767]", + "System.Threading.Timer": "(, 4.3.32767]", + "System.ValueTuple": "(, 4.5.32767]", + "System.Xml.ReaderWriter": "(, 4.3.32767]", + "System.Xml.XDocument": "(, 4.3.32767]", + "System.Xml.XmlDocument": "(, 4.3.32767]", + "System.Xml.XmlSerializer": "(, 4.3.32767]", + "System.Xml.XPath": "(, 4.3.32767]", + "System.Xml.XPath.XDocument": "(, 4.3.32767]" + } + } + } + } + } +} \ No newline at end of file diff --git a/test/resources/repos/csharp/test_repo/obj/TestProject.csproj.nuget.g.props b/test/resources/repos/csharp/test_repo/obj/TestProject.csproj.nuget.g.props new file mode 100644 index 0000000..c45681d --- /dev/null +++ b/test/resources/repos/csharp/test_repo/obj/TestProject.csproj.nuget.g.props @@ -0,0 +1,16 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\thomh\.nuget\packages\;D:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages + PackageReference + 6.14.0 + + + + + + \ No newline at end of file diff --git a/test/resources/repos/csharp/test_repo/obj/TestProject.csproj.nuget.g.targets b/test/resources/repos/csharp/test_repo/obj/TestProject.csproj.nuget.g.targets new file mode 100644 index 0000000..3dc06ef --- /dev/null +++ b/test/resources/repos/csharp/test_repo/obj/TestProject.csproj.nuget.g.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/test/resources/repos/csharp/test_repo/obj/project.assets.json b/test/resources/repos/csharp/test_repo/obj/project.assets.json new file mode 100644 index 0000000..2ed7ae8 --- /dev/null +++ b/test/resources/repos/csharp/test_repo/obj/project.assets.json @@ -0,0 +1,366 @@ +{ + "version": 3, + "targets": { + "net8.0": {} + }, + "libraries": {}, + "projectFileDependencyGroups": { + "net8.0": [] + }, + "packageFolders": { + "C:\\Users\\thomh\\.nuget\\packages\\": {}, + "D:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "\\\\wsl.localhost\\Ubuntu\\home\\thomh\\dev\\serena\\test\\resources\\repos\\csharp\\test_repo\\TestProject.csproj", + "projectName": "TestProject", + "projectPath": "\\\\wsl.localhost\\Ubuntu\\home\\thomh\\dev\\serena\\test\\resources\\repos\\csharp\\test_repo\\TestProject.csproj", + "packagesPath": "C:\\Users\\thomh\\.nuget\\packages\\", + "outputPath": "\\\\wsl.localhost\\Ubuntu\\home\\thomh\\dev\\serena\\test\\resources\\repos\\csharp\\test_repo\\obj\\", + "projectStyle": "PackageReference", + "fallbackFolders": [ + "D:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" + ], + "configFilePaths": [ + "C:\\Users\\thomh\\AppData\\Roaming\\NuGet\\NuGet.Config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" + ], + "originalTargetFrameworks": [ + "net8.0" + ], + "sources": { + "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.100" + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.100-preview.4.25204.4/PortableRuntimeIdentifierGraph.json", + "packagesToPrune": { + "Microsoft.CSharp": "(, 4.7.32767]", + "Microsoft.NETCore.App": "(, 2.1.32767]", + "Microsoft.VisualBasic": "(, 10.3.32767]", + "Microsoft.Win32.Primitives": "(, 4.3.32767]", + "Microsoft.Win32.Registry": "(, 5.0.32767]", + "runtime.any.System.Collections": "(, 4.3.32767]", + "runtime.any.System.Diagnostics.Tools": "(, 4.3.32767]", + "runtime.any.System.Diagnostics.Tracing": "(, 4.3.32767]", + "runtime.any.System.Globalization": "(, 4.3.32767]", + "runtime.any.System.Globalization.Calendars": "(, 4.3.32767]", + "runtime.any.System.IO": "(, 4.3.32767]", + "runtime.any.System.Reflection": "(, 4.3.32767]", + "runtime.any.System.Reflection.Extensions": "(, 4.3.32767]", + "runtime.any.System.Reflection.Primitives": "(, 4.3.32767]", + "runtime.any.System.Resources.ResourceManager": "(, 4.3.32767]", + "runtime.any.System.Runtime": "(, 4.3.32767]", + "runtime.any.System.Runtime.Handles": "(, 4.3.32767]", + "runtime.any.System.Runtime.InteropServices": "(, 4.3.32767]", + "runtime.any.System.Text.Encoding": "(, 4.3.32767]", + "runtime.any.System.Text.Encoding.Extensions": "(, 4.3.32767]", + "runtime.any.System.Threading.Tasks": "(, 4.3.32767]", + "runtime.any.System.Threading.Timer": "(, 4.3.32767]", + "runtime.aot.System.Collections": "(, 4.3.32767]", + "runtime.aot.System.Diagnostics.Tools": "(, 4.3.32767]", + "runtime.aot.System.Diagnostics.Tracing": "(, 4.3.32767]", + "runtime.aot.System.Globalization": "(, 4.3.32767]", + "runtime.aot.System.Globalization.Calendars": "(, 4.3.32767]", + "runtime.aot.System.IO": "(, 4.3.32767]", + "runtime.aot.System.Reflection": "(, 4.3.32767]", + "runtime.aot.System.Reflection.Extensions": "(, 4.3.32767]", + "runtime.aot.System.Reflection.Primitives": "(, 4.3.32767]", + "runtime.aot.System.Resources.ResourceManager": "(, 4.3.32767]", + "runtime.aot.System.Runtime": "(, 4.3.32767]", + "runtime.aot.System.Runtime.Handles": "(, 4.3.32767]", + "runtime.aot.System.Runtime.InteropServices": "(, 4.3.32767]", + "runtime.aot.System.Text.Encoding": "(, 4.3.32767]", + "runtime.aot.System.Text.Encoding.Extensions": "(, 4.3.32767]", + "runtime.aot.System.Threading.Tasks": "(, 4.3.32767]", + "runtime.aot.System.Threading.Timer": "(, 4.3.32767]", + "runtime.debian.8-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.debian.9-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.native.System.Security.Cryptography.Apple": "(, 4.3.32767]", + "runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "(, 4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System": "(, 4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Http": "(, 4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Security": "(, 4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Security.Cryptography": "(, 4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(, 4.3.32767]", + "runtime.unix.Microsoft.Win32.Primitives": "(, 4.3.32767]", + "runtime.unix.System.Console": "(, 4.3.32767]", + "runtime.unix.System.Diagnostics.Debug": "(, 4.3.32767]", + "runtime.unix.System.IO.FileSystem": "(, 4.3.32767]", + "runtime.unix.System.Net.Primitives": "(, 4.3.32767]", + "runtime.unix.System.Net.Sockets": "(, 4.3.32767]", + "runtime.unix.System.Private.Uri": "(, 4.3.32767]", + "runtime.unix.System.Runtime.Extensions": "(, 4.3.32767]", + "runtime.win.Microsoft.Win32.Primitives": "(, 4.3.32767]", + "runtime.win.System.Console": "(, 4.3.32767]", + "runtime.win.System.Diagnostics.Debug": "(, 4.3.32767]", + "runtime.win.System.IO.FileSystem": "(, 4.3.32767]", + "runtime.win.System.Net.Primitives": "(, 4.3.32767]", + "runtime.win.System.Net.Sockets": "(, 4.3.32767]", + "runtime.win.System.Runtime.Extensions": "(, 4.3.32767]", + "runtime.win10-arm-aot.runtime.native.System.IO.Compression": "(, 4.0.32767]", + "runtime.win10-arm64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.win10-x64-aot.runtime.native.System.IO.Compression": "(, 4.0.32767]", + "runtime.win10-x86-aot.runtime.native.System.IO.Compression": "(, 4.0.32767]", + "runtime.win7-x64.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.win7-x86.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "runtime.win7.System.Private.Uri": "(, 4.3.32767]", + "runtime.win8-arm.runtime.native.System.IO.Compression": "(, 4.3.32767]", + "System.AppContext": "(, 4.3.32767]", + "System.Buffers": "(, 4.5.32767]", + "System.Collections": "(, 4.3.32767]", + "System.Collections.Concurrent": "(, 4.3.32767]", + "System.Collections.Immutable": "(, 8.0.32767]", + "System.Collections.NonGeneric": "(, 4.3.32767]", + "System.Collections.Specialized": "(, 4.3.32767]", + "System.ComponentModel": "(, 4.3.32767]", + "System.ComponentModel.Annotations": "(, 5.0.32767]", + "System.ComponentModel.EventBasedAsync": "(, 4.3.32767]", + "System.ComponentModel.Primitives": "(, 4.3.32767]", + "System.ComponentModel.TypeConverter": "(, 4.3.32767]", + "System.Console": "(, 4.3.32767]", + "System.Data.Common": "(, 4.3.32767]", + "System.Data.DataSetExtensions": "(, 4.5.32767]", + "System.Diagnostics.Contracts": "(, 4.3.32767]", + "System.Diagnostics.Debug": "(, 4.3.32767]", + "System.Diagnostics.DiagnosticSource": "(, 8.0.32767]", + "System.Diagnostics.FileVersionInfo": "(, 4.3.32767]", + "System.Diagnostics.Process": "(, 4.3.32767]", + "System.Diagnostics.StackTrace": "(, 4.3.32767]", + "System.Diagnostics.TextWriterTraceListener": "(, 4.3.32767]", + "System.Diagnostics.Tools": "(, 4.3.32767]", + "System.Diagnostics.TraceSource": "(, 4.3.32767]", + "System.Diagnostics.Tracing": "(, 4.3.32767]", + "System.Drawing.Primitives": "(, 4.3.32767]", + "System.Dynamic.Runtime": "(, 4.3.32767]", + "System.Formats.Asn1": "(, 8.0.32767]", + "System.Globalization": "(, 4.3.32767]", + "System.Globalization.Calendars": "(, 4.3.32767]", + "System.Globalization.Extensions": "(, 4.3.32767]", + "System.IO": "(, 4.3.32767]", + "System.IO.Compression": "(, 4.3.32767]", + "System.IO.Compression.ZipFile": "(, 4.3.32767]", + "System.IO.FileSystem": "(, 4.3.32767]", + "System.IO.FileSystem.AccessControl": "(, 5.0.32767]", + "System.IO.FileSystem.DriveInfo": "(, 4.3.32767]", + "System.IO.FileSystem.Primitives": "(, 4.3.32767]", + "System.IO.FileSystem.Watcher": "(, 4.3.32767]", + "System.IO.IsolatedStorage": "(, 4.3.32767]", + "System.IO.MemoryMappedFiles": "(, 4.3.32767]", + "System.IO.Pipes": "(, 4.3.32767]", + "System.IO.Pipes.AccessControl": "(, 4.6.32767]", + "System.IO.UnmanagedMemoryStream": "(, 4.3.32767]", + "System.Linq": "(, 4.3.32767]", + "System.Linq.Expressions": "(, 4.3.32767]", + "System.Linq.Parallel": "(, 4.3.32767]", + "System.Linq.Queryable": "(, 4.3.32767]", + "System.Memory": "(, 4.5.32767]", + "System.Net.Http": "(, 4.3.32767]", + "System.Net.Http.Json": "(, 8.0.32767]", + "System.Net.NameResolution": "(, 4.3.32767]", + "System.Net.NetworkInformation": "(, 4.3.32767]", + "System.Net.Ping": "(, 4.3.32767]", + "System.Net.Primitives": "(, 4.3.32767]", + "System.Net.Requests": "(, 4.3.32767]", + "System.Net.Security": "(, 4.3.32767]", + "System.Net.Sockets": "(, 4.3.32767]", + "System.Net.WebHeaderCollection": "(, 4.3.32767]", + "System.Net.WebSockets": "(, 4.3.32767]", + "System.Net.WebSockets.Client": "(, 4.3.32767]", + "System.Numerics.Vectors": "(, 4.5.32767]", + "System.ObjectModel": "(, 4.3.32767]", + "System.Private.DataContractSerialization": "(, 4.3.32767]", + "System.Private.Uri": "(, 4.3.32767]", + "System.Reflection": "(, 4.3.32767]", + "System.Reflection.DispatchProxy": "(, 4.7.32767]", + "System.Reflection.Emit": "(, 4.7.32767]", + "System.Reflection.Emit.ILGeneration": "(, 4.7.32767]", + "System.Reflection.Emit.Lightweight": "(, 4.7.32767]", + "System.Reflection.Extensions": "(, 4.3.32767]", + "System.Reflection.Metadata": "(, 8.0.32767]", + "System.Reflection.Primitives": "(, 4.3.32767]", + "System.Reflection.TypeExtensions": "(, 4.7.32767]", + "System.Resources.Reader": "(, 4.3.32767]", + "System.Resources.ResourceManager": "(, 4.3.32767]", + "System.Resources.Writer": "(, 4.3.32767]", + "System.Runtime": "(, 4.3.32767]", + "System.Runtime.CompilerServices.Unsafe": "(, 6.0.32767]", + "System.Runtime.CompilerServices.VisualC": "(, 4.3.32767]", + "System.Runtime.Extensions": "(, 4.3.32767]", + "System.Runtime.Handles": "(, 4.3.32767]", + "System.Runtime.InteropServices": "(, 4.3.32767]", + "System.Runtime.InteropServices.RuntimeInformation": "(, 4.3.32767]", + "System.Runtime.InteropServices.WindowsRuntime": "(, 4.3.32767]", + "System.Runtime.Loader": "(, 4.3.32767]", + "System.Runtime.Numerics": "(, 4.3.32767]", + "System.Runtime.Serialization.Formatters": "(, 4.3.32767]", + "System.Runtime.Serialization.Json": "(, 4.3.32767]", + "System.Runtime.Serialization.Primitives": "(, 4.3.32767]", + "System.Runtime.Serialization.Xml": "(, 4.3.32767]", + "System.Runtime.WindowsRuntime": "(, 4.7.32767]", + "System.Runtime.WindowsRuntime.UI.Xaml": "(, 4.7.32767]", + "System.Security.AccessControl": "(, 6.0.32767]", + "System.Security.Claims": "(, 4.3.32767]", + "System.Security.Cryptography.Algorithms": "(, 4.3.32767]", + "System.Security.Cryptography.Cng": "(, 4.6.32767]", + "System.Security.Cryptography.Csp": "(, 4.3.32767]", + "System.Security.Cryptography.Encoding": "(, 4.3.32767]", + "System.Security.Cryptography.OpenSsl": "(, 5.0.32767]", + "System.Security.Cryptography.Primitives": "(, 4.3.32767]", + "System.Security.Cryptography.X509Certificates": "(, 4.3.32767]", + "System.Security.Cryptography.Xml": "(, 4.4.32767]", + "System.Security.Principal": "(, 4.3.32767]", + "System.Security.Principal.Windows": "(, 5.0.32767]", + "System.Security.SecureString": "(, 4.3.32767]", + "System.Text.Encoding": "(, 4.3.32767]", + "System.Text.Encoding.CodePages": "(, 8.0.32767]", + "System.Text.Encoding.Extensions": "(, 4.3.32767]", + "System.Text.Encodings.Web": "(, 8.0.32767]", + "System.Text.Json": "(, 8.0.32767]", + "System.Text.RegularExpressions": "(, 4.3.32767]", + "System.Threading": "(, 4.3.32767]", + "System.Threading.Channels": "(, 8.0.32767]", + "System.Threading.Overlapped": "(, 4.3.32767]", + "System.Threading.Tasks": "(, 4.3.32767]", + "System.Threading.Tasks.Dataflow": "(, 8.0.32767]", + "System.Threading.Tasks.Extensions": "(, 4.5.32767]", + "System.Threading.Tasks.Parallel": "(, 4.3.32767]", + "System.Threading.Thread": "(, 4.3.32767]", + "System.Threading.ThreadPool": "(, 4.3.32767]", + "System.Threading.Timer": "(, 4.3.32767]", + "System.ValueTuple": "(, 4.5.32767]", + "System.Xml.ReaderWriter": "(, 4.3.32767]", + "System.Xml.XDocument": "(, 4.3.32767]", + "System.Xml.XmlDocument": "(, 4.3.32767]", + "System.Xml.XmlSerializer": "(, 4.3.32767]", + "System.Xml.XPath": "(, 4.3.32767]", + "System.Xml.XPath.XDocument": "(, 4.3.32767]" + } + } + } + } +} \ No newline at end of file diff --git a/test/resources/repos/csharp/test_repo/obj/project.nuget.cache b/test/resources/repos/csharp/test_repo/obj/project.nuget.cache new file mode 100644 index 0000000..bafd5cf --- /dev/null +++ b/test/resources/repos/csharp/test_repo/obj/project.nuget.cache @@ -0,0 +1,8 @@ +{ + "version": 2, + "dgSpecHash": "sU5VuO9sK6M=", + "success": true, + "projectFilePath": "\\\\wsl.localhost\\Ubuntu\\home\\thomh\\dev\\serena\\test\\resources\\repos\\csharp\\test_repo\\TestProject.csproj", + "expectedPackageFiles": [], + "logs": [] +} \ No newline at end of file diff --git a/test/serena/test_serena_agent.py b/test/serena/test_serena_agent.py index 4e29785..7ebf04a 100644 --- a/test/serena/test_serena_agent.py +++ b/test/serena/test_serena_agent.py @@ -31,7 +31,7 @@ def serena_config(): """Create an in-memory configuration for tests with test repositories pre-registered.""" # Create test projects for all supported languages test_projects = [] - for language in [Language.PYTHON, Language.GO, Language.JAVA, Language.RUST, Language.TYPESCRIPT, Language.PHP]: + for language in [Language.PYTHON, Language.GO, Language.JAVA, Language.RUST, Language.TYPESCRIPT, Language.PHP, Language.CSHARP]: repo_path = get_repo_path(language) if repo_path.exists(): project_name = f"test_repo_{language}" @@ -94,6 +94,7 @@ class TestSerenaAgent: pytest.param(Language.RUST, "add", "Function", "lib.rs", marks=pytest.mark.rust), pytest.param(Language.TYPESCRIPT, "DemoClass", "Class", "index.ts", marks=pytest.mark.typescript), pytest.param(Language.PHP, "helperFunction", "Function", "helper.php", marks=pytest.mark.php), + pytest.param(Language.CSHARP, "Calculator", "Class", "Program.cs", marks=pytest.mark.csharp), ], indirect=["serena_agent"], ) @@ -132,6 +133,7 @@ class TestSerenaAgent: pytest.param(Language.RUST, "add", os.path.join("src", "lib.rs"), os.path.join("src", "main.rs"), marks=pytest.mark.rust), pytest.param(Language.TYPESCRIPT, "helperFunction", "index.ts", "use_helper.ts", marks=pytest.mark.typescript), pytest.param(Language.PHP, "helperFunction", "helper.php", "index.php", marks=pytest.mark.php), + pytest.param(Language.CSHARP, "Calculator", "Program.cs", "Program.cs", marks=pytest.mark.csharp), ], indirect=["serena_agent"], ) diff --git a/test/solidlsp/csharp/test_csharp_basic.py b/test/solidlsp/csharp/test_csharp_basic.py new file mode 100644 index 0000000..aeb8cf1 --- /dev/null +++ b/test/solidlsp/csharp/test_csharp_basic.py @@ -0,0 +1,82 @@ +""" +Basic tests for C# language server functionality. +""" + +import os +from pathlib import Path + +import pytest + +from solidlsp import SolidLanguageServer +from solidlsp.ls_config import Language +from test.conftest import create_ls + + +@pytest.fixture +def csharp_ls() -> SolidLanguageServer: + """Create a C# language server instance for testing.""" + repo_path = Path(__file__).parent.parent.parent / "resources" / "repos" / "csharp" / "test_repo" + return create_ls(Language.CSHARP, str(repo_path)) + + +class TestCSharpBasic: + """Basic tests for C# language server.""" + + def test_language_server_starts(self, csharp_ls: SolidLanguageServer): + """Test that the C# language server starts successfully.""" + assert csharp_ls is not None + assert csharp_ls.language == Language.CSHARP + + def test_get_document_symbols(self, csharp_ls: SolidLanguageServer): + """Test getting document symbols from a C# file.""" + file_path = os.path.join("Program.cs") + symbols = csharp_ls.get_document_symbols(file_path) + + # Check that we have symbols + assert len(symbols) > 0 + + # Look for expected classes + class_names = [s.name for s in symbols if "class" in s.kind.name.lower()] + assert "Program" in class_names + assert "Calculator" in class_names + + def test_find_definition(self, csharp_ls: SolidLanguageServer): + """Test finding definition of a symbol.""" + file_path = os.path.join("Program.cs") + + # Open the file first + with csharp_ls.open_file(file_path): + # Find usage of Calculator class (line 11, column 28) + definitions = csharp_ls.request_definition(file_path, 11, 28) + + # Should find the Calculator class definition + assert len(definitions) > 0 + assert any("Calculator" in str(d) for d in definitions) + + def test_find_references(self, csharp_ls: SolidLanguageServer): + """Test finding references to a symbol.""" + file_path = os.path.join("Program.cs") + + # Open the file first + with csharp_ls.open_file(file_path): + # Find references to the Add method (line 19) + references = csharp_ls.request_references(file_path, 19, 20, include_declaration=True) + + # Should find at least the definition and one usage + assert len(references) >= 2 + + def test_nested_namespace_symbols(self, csharp_ls: SolidLanguageServer): + """Test getting symbols from nested namespace.""" + file_path = os.path.join("Models", "Person.cs") + symbols = csharp_ls.get_document_symbols(file_path) + + # Check that we have the Person class + assert any(s.name == "Person" and "class" in s.kind.name.lower() for s in symbols) + + # Check for properties and methods + symbol_names = [s.name for s in symbols] + assert "Name" in symbol_names + assert "Age" in symbol_names + assert "Email" in symbol_names + assert "ToString" in symbol_names + assert "IsAdult" in symbol_names