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