Skip to content

Commit 1db5682

Browse files
author
Unity Technologies
committed
com.unity.netcode@1.10.0
## [1.10.0] - 2025-11-09 ### Added * World state save can now correctly save zero sized components. * Netcode Profiler - added a context menu in the Ghost Snapshot View's TreeView Labels to quickly access and inspect Ghost Prefabs and Components. ### Changed * Dependent version of com.unity.entities is updated to 1.4.2. * Source generators will now only run as part of compilation within Unity, and not in IDEs (tested with Rider and Visual Studio, please report a bug if you use another IDE where they are not disabled). This will disable generated sources from showing up in your IDE, but will significantly speed up Roslyn processes in IDEs. ### Removed * Usage of obsolete entities method `GetRefRWOptional` ### Fixed * Erroneous Assert in the `PredictedGhostSpawnSystem` incorrectly stating that the `InitJob` does not support enableable components, despite the fact that the query itself polls for disabled entities. * Removed warning that spams console when `ClientServerTickRate.TargetFrameRateMode` is set to `Sleep`. * Rare issue where an exception would happen in the first run of the prediction loop, only happens when `PredictionUpdateLoopMode` is set to `AlwaysRun` * You can again add multiple `Entity` types to your ghost components and commands. * Shorts are now properly supported in components and commands. * Missing Physics-related API docs have been re-added.
1 parent 62cef25 commit 1db5682

File tree

137 files changed

+3258
-2103
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

137 files changed

+3258
-2103
lines changed

.attestation.p7m

1 Byte
Binary file not shown.

.signature

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"timestamp":1762944007,"signature":"E5UI6KZ0qU5v8Qg70uNIUglJEwbkRp6kPtL62BbX53M0hSjj1kl19yOs4etoAIAc5g2W/JTfd7eG8+uR3q3reQZBmQg+6Qe8IbhNo0V2GuErbrKjmddkYlc6PzUtErXWFGWtthKn/Rmi24G91IOP5l1cfX3xO3SpNnHEqH7rTX3GIFMCtddjcM0kbw85Y/qr+1+5NNLubk/BZssyNjdEosXQvp5WqpmxZ/VJvMZ51LB+Pp0bf6dVE1E+aF0V6yOuOAFSV534jxX8A+QCOnASiekeC+udA25IZKcqaztJPzhNmRce4Art0/f9CfE0bfWoTUyNTfz/cuefMcfK5E9owxT7xMqU1Vp+ga4rxB7UELxCgvAQ7nb1Vc9Jmd8DgzqoM1FeAh2jJXzc3BdxcY+4JsWzFaSa6/u2FwK2mKH0rzEKmrIXH/r1PXaYZ3E78MzmUCvLZ0oGi1fIChv5ORhZnqLCOHXKhLeAj55rYDbd4Kd/eoZdDwqiFN2DnWBfE3Z2","publicKey":"LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQm9qQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FZOEFNSUlCaWdLQ0FZRUFzdUhXYUhsZ0I1cVF4ZEJjTlJKSAordHR4SmoxcVY1NTdvMlZaRE1XaXhYRVBkRTBEMVFkT1JIRXNSS1RscmplUXlERU83ZlNQS0ZwZ1A3MU5TTnJCCkFHM2NFSU45aHNQVDhOVmllZmdWem5QTkVMenFkVmdEbFhpb2VpUnV6OERKWFgvblpmU1JWKytwbk9ySTRibG4KS0twelJlNW14OTc1SjhxZ1FvRktKT0NNRlpHdkJMR2MxSzZZaEIzOHJFODZCZzgzbUovWjBEYkVmQjBxZm13cgo2ZDVFUXFsd0E5Y3JZT1YyV1VpWXprSnBLNmJZNzRZNmM1TmpBcEFKeGNiaTFOaDlRVEhUcU44N0ZtMDF0R1ZwCjVNd1pXSWZuYVRUemEvTGZLelR5U0pka0tldEZMVGdkYXpMYlpzUEE2aHBSK0FJRTJhc0tLTi84UUk1N3UzU2cKL2xyMnZKS1IvU2l5eEN1Q20vQWJkYnJMbXk0WjlSdm1jMGdpclA4T0lLQWxBRWZ2TzV5Z2hSKy8vd1RpTFlzUQp1SllDM0V2UE16ZGdKUzdGR2FscnFLZzlPTCsxVzROY05yNWdveVdSUUJ0cktKaWlTZEJVWmVxb0RvSUY5NHpCCndGbzJJT1JFdXFqcU51M3diMWZIM3p1dGdtalFra3IxVjJhd3hmcExLWlROQWdNQkFBRT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg"}
1+
{"timestamp":1763565376,"signature":"gjfzyCpyeFwn7eVrPrSwc17RJFFFkGFkkrcdiAwNQdvKmqcyFGyUAGQEQdGnWBAwzZTRBp/81w6W4WYcR21F0KlhM5JITXktlpGWncZyNdTuoOE/mss8BMoK49OkDxzHwlaikl0z64Rf3ZY/8Nam5mL6CrL7PtaPOBbr7Bja2IISDSkGqk5HFJd8HyHgcFL6w6GIVKnyO3cDrGTLs236fMsNgeYx1eFmMeOqy6R+A/M1Ho5xX4gg5mlzdx7q6MFR2HINY0KIuGy/fp/2/VNuXyL28wh9t9ua+UfWENeVMK8fbIuXIwPTLCf9+CC55gC2hnEvaSbgmbjNwGnewCzCawSkpda6jQ9Qrhiiw3nHR/5XwivnJ8EWNLA4iBrM/MLqYNbT9lM9R2ywjqpHEBrF+W7m0DH74LMCDhPsYs867KgYOViFvBUdAnZ9Go7VIwfmMcs+yR+LoeqHfTbG/KK91BHiAAPR3CI5aAjFknMxTQ4CpF90PFwUzprN/yEw4aPy","publicKey":"LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQm9qQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FZOEFNSUlCaWdLQ0FZRUFzdUhXYUhsZ0I1cVF4ZEJjTlJKSAordHR4SmoxcVY1NTdvMlZaRE1XaXhYRVBkRTBEMVFkT1JIRXNSS1RscmplUXlERU83ZlNQS0ZwZ1A3MU5TTnJCCkFHM2NFSU45aHNQVDhOVmllZmdWem5QTkVMenFkVmdEbFhpb2VpUnV6OERKWFgvblpmU1JWKytwbk9ySTRibG4KS0twelJlNW14OTc1SjhxZ1FvRktKT0NNRlpHdkJMR2MxSzZZaEIzOHJFODZCZzgzbUovWjBEYkVmQjBxZm13cgo2ZDVFUXFsd0E5Y3JZT1YyV1VpWXprSnBLNmJZNzRZNmM1TmpBcEFKeGNiaTFOaDlRVEhUcU44N0ZtMDF0R1ZwCjVNd1pXSWZuYVRUemEvTGZLelR5U0pka0tldEZMVGdkYXpMYlpzUEE2aHBSK0FJRTJhc0tLTi84UUk1N3UzU2cKL2xyMnZKS1IvU2l5eEN1Q20vQWJkYnJMbXk0WjlSdm1jMGdpclA4T0lLQWxBRWZ2TzV5Z2hSKy8vd1RpTFlzUQp1SllDM0V2UE16ZGdKUzdGR2FscnFLZzlPTCsxVzROY05yNWdveVdSUUJ0cktKaWlTZEJVWmVxb0RvSUY5NHpCCndGbzJJT1JFdXFqcU51M3diMWZIM3p1dGdtalFra3IxVjJhd3hmcExLWlROQWdNQkFBRT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg"}

CHANGELOG.md

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,31 @@
22
uid: changelog
33
---
44

5-
## [1.9.3] - 2025-11-06
5+
## [1.10.0] - 2025-11-09
66

7-
### Fixed
7+
### Added
88

9-
* You can again add multiple `Entity` types to your ghost components and commands.
10-
* Shorts are now properly supported in components and commands.
11-
* Missing Physics-related API docs have been re-added.
9+
* World state save can now correctly save zero sized components.
10+
* Netcode Profiler - added a context menu in the Ghost Snapshot View's TreeView Labels to quickly access and inspect Ghost Prefabs and Components.
1211

12+
### Changed
1313

14-
## [1.9.2] - 2025-10-31
14+
* Dependent version of com.unity.entities is updated to 1.4.2.
15+
* Source generators will now only run as part of compilation within Unity, and not in IDEs (tested with Rider and Visual Studio, please report a bug if you use another IDE where they are not disabled). This will disable generated sources from showing up in your IDE, but will significantly speed up Roslyn processes in IDEs.
16+
17+
### Removed
18+
19+
* Usage of obsolete entities method `GetRefRWOptional`
1520

1621
### Fixed
1722

23+
* Erroneous Assert in the `PredictedGhostSpawnSystem` incorrectly stating that the `InitJob` does not support enableable components, despite the fact that the query itself polls for disabled entities.
1824
* Removed warning that spams console when `ClientServerTickRate.TargetFrameRateMode` is set to `Sleep`.
25+
* Rare issue where an exception would happen in the first run of the prediction loop, only happens when `PredictionUpdateLoopMode` is set to `AlwaysRun`
26+
* You can again add multiple `Entity` types to your ghost components and commands.
27+
* Shorts are now properly supported in components and commands.
28+
* Missing Physics-related API docs have been re-added.
29+
1930

2031

2132
## [1.9.1] - 2025-10-11

Documentation~/client-server-worlds.md

Lines changed: 6 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,7 @@ By default, systems are created and updated in the [`SimulationSystemGroup`](htt
8787

8888
When you specify a system group that your system belongs in, Unity automatically filters out your system in worlds where this system group isn't present. This means that systems in a system group inherit the world filter of said system group. For example:
8989

90-
```csharp
91-
[UpdateInGroup(typeof(GhostInputSystemGroup))]
92-
public class MyInputSystem : SystemBase
93-
{
94-
...
95-
}
96-
```
90+
[!code-cs[blobs](../Tests/Editor/DocCodeSamples/client-server-worlds.cs#SystemGroup)]
9791

9892
If you examine the `WorldSystemFilter` attribute on [`GhostInputSystemGroup`](https://docs.unity3d.com/Packages/com.unity.netcode@latest?subfolder=/api/Unity.NetCode.GhostInputSystemGroup.html), you will find that this system group only exists for client, thin client, and local simulation (offline) worlds. It also has a `childDefaultFlags` argument which specifies the flags that child systems, such as the example `MyInputSystem`, inherit (and this argument doesn't contain thin client worlds). Therefore, `MyInputSystem` will be present on full client and local simulation worlds exclusively (unless a `WorldSystemFilter` is added to `MyInputSystem` overriding this default).
9993

@@ -115,27 +109,11 @@ Use `WorldSystemFilter` to declare (at compile time) which of the following worl
115109

116110
In the following example, `MySystem` is defined such that it's only present for worlds that can be used to run the client simulation (any world that has the `WorldFlags.GameClient` set). `WorldSystemFilterFlags.Default` is used when this attribute isn't present and automatically inherits its filtering rules from its parent system group (in this case, that's the `SimulationSystemGroup`, because no `UpdateInGroup` attribute is specified).
117111

118-
```csharp
119-
[WorldSystemFilter(WorldSystemFilterFlags.ClientSimulation)]
120-
public class MySystem : SystemBase
121-
{
122-
...
123-
}
124-
```
112+
[!code-cs[blobs](../Tests/Editor/DocCodeSamples/client-server-worlds.cs#WorldSystemFilter)]
125113

126114
## Creating client and server worlds with bootstrapping
127115

128-
When you add Netcode for Entities to your project, the default [`ClientServerBootstrap` class](https://docs.unity3d.com/Packages/com.unity.netcode@latest/index.html?subfolder=/api/Unity.NetCode.ClientServerBootstrap.html) is added to the project. This bootstrapping class configures and creates the server and client worlds at runtime when your game starts (or when entering Play mode in the Unity Editor).
129-
130-
The default bootstrap creates the client and server worlds automatically at startup:
131-
132-
```c#
133-
public virtual bool Initialize(string defaultWorldName)
134-
{
135-
CreateDefaultClientServerWorlds();
136-
return true;
137-
}
138-
```
116+
When you add Netcode for Entities to your project, the default [`ClientServerBootstrap` class](https://docs.unity3d.com/Packages/com.unity.netcode@latest/index.html?subfolder=/api/Unity.NetCode.ClientServerBootstrap.html) is added to the project. This bootstrapping class configures and creates the server and client worlds at runtime when your game starts (or when entering Play mode in the Unity Editor). The default bootstrap creates the client and server worlds automatically at startup.
139117

140118
`ClientServerBootstrap` uses the same bootstrapping flows as defined by [Entities](https://docs.unity3d.com/Packages/com.unity.entities@latest?subfolder=/manual/index.html), which means that new worlds are populated using all the systems defined by the relevant world filtering set (such as `[WorldSystemFilter(...)]` attributes you have defined, `WorldSystemFilterFlags` rules your systems inherit, and other attributes like `DisableAutoCreation`). Netcode for Entities also injects many systems (and groups) automatically.
141119

@@ -149,39 +127,11 @@ You can create your own bootstrap class and customize your game flow by creating
149127

150128
The following code example shows how to override the default bootstrap to prevent automatic creation of the client and server worlds:
151129

152-
```c#
153-
public class MyGameSpecificBootstrap : ClientServerBootstrap
154-
{
155-
public override bool Initialize(string defaultWorldName)
156-
{
157-
//Create only a local simulation world without any multiplayer and netcode system in it.
158-
CreateLocalWorld(defaultWorldName);
159-
return true;
160-
}
161-
162-
}
163-
```
130+
[!code-cs[blobs](../Tests/Editor/DocCodeSamples/client-server-worlds.cs#CustomBootstrap)]
164131

165132
Then, when you're ready to create the various Netcode worlds, call:
166133

167-
```c#
168-
void OnPlayButtonClicked()
169-
{
170-
// Typically this:
171-
var clientWorld = ClientServerBootstrap.CreateClientWorld();
172-
// And/Or this:
173-
var serverWorld = ClientServerBootstrap.CreateServerWorld();
174-
175-
// And/Or something like this, for soak testing:
176-
AutomaticThinClientWorldsUtility.NumThinClientsRequested = 10;
177-
AutomaticThinClientWorldsUtility.BootstrapThinClientWorlds();
178-
179-
// Or the following, which creates worlds smartly based on:
180-
// - The Playmode Tool setting specified in the editor.
181-
// - The current build type, if used in a player.
182-
ClientServerBootstrap.CreateDefaultClientServerWorlds();
183-
}
184-
```
134+
[!code-cs[blobs](../Tests/Editor/DocCodeSamples/client-server-worlds.cs#UsingCustomBootstrap)]
185135

186136
There are [Netcode samples](https://github.com/Unity-Technologies/EntityComponentSystemSamples/blob/master/NetcodeSamples/README.md) showcasing how to manage scene and subscene loading with this world creation setup, as well as proper Netcode world disposal (when leaving the gameplay loop).
187137

@@ -233,28 +183,7 @@ The `ClientServerTickRate` configuration is sent (by the server, to the client)
233183

234184
If you want to destroy the world you're in and spin up another world without losing the connection state, you can use `DriverMigrationSystem`, which allows you to store and load transport-related information so a smooth world transition can be made.
235185

236-
```
237-
public World MigrateWorld(World sourceWorld)
238-
{
239-
DriverMigrationSystem migrationSystem = default;
240-
foreach (var world in World.All)
241-
{
242-
if ((migrationSystem = world.GetExistingSystem<DriverMigrationSystem>()) != null)
243-
break;
244-
}
245-
246-
var ticket = migrationSystem.StoreWorld(sourceWorld);
247-
sourceWorld.Dispose();
248-
249-
var newWorld = migrationSystem.LoadWorld(ticket);
250-
251-
// NOTE: LoadWorld must be executed before you populate your world with the systems it needs!
252-
// This is because LoadWorld creates a `MigrationTicket` Component that the NetworkStreamReceiveSystem needs in order to be able to Load
253-
// the correct Driver.
254-
255-
return ClientServerBootstrap.CreateServerWorld(DefaultWorld, newWorld.Name, newWorld);
256-
}
257-
```
186+
[!code-cs[blobs](../Tests/Editor/DocCodeSamples/client-server-worlds.cs#WorldMigration)]
258187

259188
## Additional resources
260189

Documentation~/command-stream.md

Lines changed: 7 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -57,76 +57,15 @@ The first and last steps are the same (as with the single-player input handling)
5757

5858
Simple input values for character movement (with jumping):
5959

60-
```c#
61-
using Unity.Entities;
62-
using Unity.NetCode;
63-
64-
[GenerateAuthoringComponent]
65-
public struct PlayerInput : IInputComponentData
66-
{
67-
public int Horizontal;
68-
public int Vertical;
69-
public InputEvent Jump;
70-
}
71-
```
60+
[!code-cs[blobs](../Tests/Editor/DocCodeSamples/command-stream.cs#InputEvents)]
7261

7362
The input gathering system, which takes current inputs and applies them to the input component data on the local player's entity.
7463

75-
```c#
76-
[UpdateInGroup(typeof(GhostInputSystemGroup))]
77-
[AlwaysSynchronizeSystem]
78-
public partial class GatherInputs : SystemBase
79-
{
80-
protected override void OnCreate()
81-
{
82-
RequireForUpdate<PlayerInput>();
83-
}
84-
85-
protected override void OnUpdate()
86-
{
87-
bool jump = UnityEngine.Input.GetKeyDown("space");
88-
bool left = UnityEngine.Input.GetKey("left");
89-
//...
90-
91-
var networkId = GetSingleton<NetworkId>().Value;
92-
Entities.WithName("GatherInput").WithAll<GhostOwnerIsLocal>().ForEach((ref PlayerInput inputData) =>
93-
{
94-
inputData = default;
95-
96-
if (jump)
97-
inputData.Jump.Set();
98-
if (left)
99-
inputData.Horizontal -= 1;
100-
//...
101-
}).ScheduleParallel();
102-
}
103-
}
104-
```
64+
[!code-cs[blobs](../Tests/Editor/DocCodeSamples/command-stream.cs#GatherInput)]
10565

10666
The processing input system, which takes the current input values stored on the player's input component and applies the equivalent movement actions.
10767

108-
```c#
109-
[UpdateInGroup(typeof(PredictedSimulationSystemGroup))]
110-
public partial class ProcessInputs : SystemBase
111-
{
112-
protected override void OnCreate()
113-
{
114-
RequireForUpdate<PlayerInput>();
115-
}
116-
protected override void OnUpdate()
117-
{
118-
var movementSpeed = Time.DeltaTime * 3;
119-
Entities.WithAll<Simulate>().WithName("ProcessInputForTick").ForEach(
120-
(ref PlayerInput input, ref Translation trans, ref PlayerMovement movement) =>
121-
{
122-
if (input.Jump.IsSet)
123-
movement.JumpVelocity = 10; // start jump routine
124-
125-
// handle jump event logic, movement logic etc
126-
}).ScheduleParallel();
127-
}
128-
}
129-
```
68+
[!code-cs[blobs](../Tests/Editor/DocCodeSamples/command-stream.cs#ProcessInput)]
13069

13170
## Creating commands
13271

@@ -232,67 +171,12 @@ Entities
232171

233172
To manually serialize commands:
234173
1. Add the [`[NetCodeDisableCommandCodeGen]`](https://docs.unity3d.com/Packages/com.unity.netcode@latest?subfolder=/api/Unity.NetCode.NetCodeDisableCommandCodeGenAttribute.html) attribute to the struct that impliments the `ICommandData` interface.
235-
2. Create a struct that implements [`ICommandDataSerializer<T>`](https://docs.unity3d.com/Packages/com.unity.netcode@latest?subfolder=/api/Unity.NetCode.ICommandDataSerializer-1.html), where `<T>` is your `ICommandData` struct.
174+
2. Create a struct that implements [`ICommandDataSerializer<T>`](https://docs.unity3d.com/Packages/com.unity.netcode@latest?subfolder=/api/Unity.NetCode.ICommandDataSerializer-1.html), where `<T>` is your `ICommandData` struct. Note that you can implement this on the same struct that implements `ICommandData` for convenience.
236175

237176
[`ICommandDataSerializer`](https://docs.unity3d.com/Packages/com.unity.netcode@latest?subfolder=/api/Unity.NetCode.ICommandDataSerializer-1.html) has two `Serialize` and two `Deserialize` methods: one pair for raw values, and one pair for delta compressed values. The system sends multiple inputs in each command packet. The first packet contains raw data but the rest are compressed using delta compression. Delta compression compresses inputs well because the rate of change is low.
238177

239178
As well as creating a struct, you also need to create specific instances of the generic systems `CommandSendSystem` and `CommandReceiveSystem`. To do this, extend the base system, for example with:
240179

241-
```c#
242-
[UpdateInGroup(typeof(CommandSendSystemGroup))]
243-
[BurstCompile]
244-
public partial struct MyCommandSendCommandSystem : ISystem
245-
{
246-
CommandSendSystem<MyCommandSerializer, MyCommand> m_CommandSend;
247-
[BurstCompile]
248-
struct SendJob : IJobChunk
249-
{
250-
public CommandSendSystem<MyCommandSerializer, MyCommand>.SendJobData data;
251-
public void Execute(in ArchetypeChunk chunk, int unfilteredChunkIndex,
252-
bool useEnabledMask, in v128 chunkEnabledMask)
253-
{
254-
data.Execute(chunk, unfilteredChunkIndex);
255-
}
256-
}
257-
[BurstCompile]
258-
public void OnCreate(ref SystemState state)
259-
{
260-
m_CommandSend.OnCreate(ref state);
261-
}
262-
[BurstCompile]
263-
public void OnUpdate(ref SystemState state)
264-
{
265-
if (!m_CommandSend.ShouldRunCommandJob(ref state))
266-
return;
267-
var sendJob = new SendJob{data = m_CommandSend.InitJobData(ref state)};
268-
state.Dependency = sendJob.Schedule(m_CommandSend.Query, state.Dependency);
269-
}
270-
}
271-
[UpdateInGroup(typeof(CommandReceiveSystemGroup))]
272-
[BurstCompile]
273-
public partial struct MyCommandReceiveCommandSystem : ISystem
274-
{
275-
CommandReceiveSystem<MyCommandSerializer, MyCommand> m_CommandRecv;
276-
[BurstCompile]
277-
struct ReceiveJob : IJobChunk
278-
{
279-
public CommandReceiveSystem<MyCommandSerializer, MyCommand>.ReceiveJobData data;
280-
public void Execute(in ArchetypeChunk chunk, int unfilteredChunkIndex,
281-
bool useEnabledMask, in v128 chunkEnabledMask)
282-
{
283-
data.Execute(chunk, unfilteredChunkIndex);
284-
}
285-
}
286-
[BurstCompile]
287-
public void OnCreate(ref SystemState state)
288-
{
289-
m_CommandRecv.OnCreate(ref state);
290-
}
291-
[BurstCompile]
292-
public void OnUpdate(ref SystemState state)
293-
{
294-
var recvJob = new ReceiveJob{data = m_CommandRecv.InitJobData(ref state)};
295-
state.Dependency = recvJob.Schedule(m_CommandRecv.Query, state.Dependency);
296-
}
297-
}
298-
```
180+
[!code-cs[blobs](../Tests/Editor/DocCodeSamples/command-stream.cs#ManualSerialization)]
181+
182+
[!code-cs[blobs](../Tests/Editor/DocCodeSamples/command-stream.cs#TestWrongAnchor)]

Documentation~/filter.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ apiRules:
3232
- exclude:
3333
uidRegex: ^Generated.*
3434
type: Namespace
35+
- exclude:
36+
uidRegex: ^DocumentationCodeSamples.*
37+
type: Namespace
3538
- exclude:
3639
uidRegex: \.ToString$
3740
type: Method

0 commit comments

Comments
 (0)