docs: complete XML doc comments via fixdocs (2757 to 131 findings)

Add missing <returns>/<param>/<summary>/<typeparam> tags and clean up
misused inheritdoc across 481 files so the documented API surface is
complete. Documentation-only (zero code lines changed). The 131 remaining
findings are inheritdoc-style warnings deliberately left to preserve
hand-written implementation rationale (plan-decision notes, race-condition
explanations).
This commit is contained in:
Joseph Doherty
2026-06-03 12:34:34 -04:00
parent c6d9b20d9f
commit bd6c0b4d3d
481 changed files with 2550 additions and 1668 deletions
@@ -16,9 +16,7 @@ public sealed class GalaxyDiscovererTests
{
private sealed class FakeHierarchySource(IReadOnlyList<GalaxyObject> objects) : IGalaxyHierarchySource
{
/// <summary>Gets the hierarchy asynchronously from the fake source.</summary>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>A task that returns the pre-built Galaxy object list.</returns>
/// <inheritdoc />
public Task<IReadOnlyList<GalaxyObject>> GetHierarchyAsync(CancellationToken cancellationToken)
=> Task.FromResult(objects);
}
@@ -41,10 +39,7 @@ public sealed class GalaxyDiscovererTests
public FakeBuilder() : this(null) { }
private FakeBuilder(string? folder) { _currentFolder = folder; }
/// <summary>Adds a folder call to the recorded list.</summary>
/// <param name="browseName">The browse name for the folder.</param>
/// <param name="displayName">The display name for the folder.</param>
/// <returns>An IAddressSpaceBuilder scoped to the new folder.</returns>
/// <inheritdoc />
public IAddressSpaceBuilder Folder(string browseName, string displayName)
{
Folders.Add(new FolderCall(browseName, displayName));
@@ -52,11 +47,7 @@ public sealed class GalaxyDiscovererTests
return new ChildBuilder(this, browseName);
}
/// <summary>Adds a variable call to the recorded list.</summary>
/// <param name="browseName">The browse name for the variable.</param>
/// <param name="displayName">The display name for the variable.</param>
/// <param name="attributeInfo">The attribute metadata for the variable.</param>
/// <returns>An IVariableHandle for further configuration.</returns>
/// <inheritdoc />
public IVariableHandle Variable(string browseName, string displayName, DriverAttributeInfo attributeInfo)
{
var folder = _currentFolder ?? "<root>";
@@ -64,51 +55,36 @@ public sealed class GalaxyDiscovererTests
return new FakeVariableHandle(this, attributeInfo.FullName);
}
/// <summary>Adds a property call to the builder (not recorded in this fake).</summary>
/// <param name="browseName">The browse name for the property.</param>
/// <param name="dataType">The driver data type of the property.</param>
/// <param name="value">The property value.</param>
/// <inheritdoc />
public void AddProperty(string browseName, DriverDataType dataType, object? value) { }
/// <summary>Child folder routes Variable calls back to the parent's lists with its own scope.</summary>
private sealed class ChildBuilder(FakeBuilder parent, string folderBrowseName) : IAddressSpaceBuilder
{
/// <summary>Adds a child folder call to the parent builder's recorded list.</summary>
/// <param name="browseName">The browse name for the folder.</param>
/// <param name="displayName">The display name for the folder.</param>
/// <returns>An IAddressSpaceBuilder scoped to the new child folder.</returns>
/// <inheritdoc />
public IAddressSpaceBuilder Folder(string browseName, string displayName)
{
parent.Folders.Add(new FolderCall(browseName, displayName));
return new ChildBuilder(parent, browseName);
}
/// <summary>Adds a variable call to the parent builder's recorded list, scoped to this folder.</summary>
/// <param name="browseName">The browse name for the variable.</param>
/// <param name="displayName">The display name for the variable.</param>
/// <param name="attributeInfo">The attribute metadata for the variable.</param>
/// <returns>An IVariableHandle for further configuration.</returns>
/// <inheritdoc />
public IVariableHandle Variable(string browseName, string displayName, DriverAttributeInfo attributeInfo)
{
parent.Variables.Add(new VariableCall(folderBrowseName, browseName, attributeInfo));
return new FakeVariableHandle(parent, attributeInfo.FullName);
}
/// <summary>Adds a property call to the builder (not recorded in this fake).</summary>
/// <param name="browseName">The browse name for the property.</param>
/// <param name="dataType">The driver data type of the property.</param>
/// <param name="value">The property value.</param>
/// <inheritdoc />
public void AddProperty(string browseName, DriverDataType dataType, object? value) { }
}
private sealed class FakeVariableHandle(FakeBuilder owner, string fullRef) : IVariableHandle
{
/// <summary>Gets the full reference for this variable.</summary>
/// <inheritdoc />
public string FullReference { get; } = fullRef;
/// <summary>Marks this variable as an alarm condition and records it.</summary>
/// <param name="info">The alarm condition metadata.</param>
/// <returns>An IAlarmConditionSink for further alarm configuration.</returns>
/// <inheritdoc />
public IAlarmConditionSink MarkAsAlarmCondition(AlarmConditionInfo info)
{
owner.AlarmDeclarations[FullReference] = info;
@@ -118,8 +94,7 @@ public sealed class GalaxyDiscovererTests
private sealed class NoopSink : IAlarmConditionSink
{
/// <summary>Records an alarm transition event (no-op in this fake).</summary>
/// <param name="args">The alarm event arguments.</param>
/// <inheritdoc />
public void OnTransition(AlarmEventArgs args) { }
}
}
@@ -156,6 +131,7 @@ public sealed class GalaxyDiscovererTests
}
/// <summary>Verifies that discovery creates one folder per object and one variable per attribute.</summary>
/// <returns>A task that represents the asynchronous test operation.</returns>
[Fact]
public async Task DiscoverAsync_BuildsOneFolderPerObject_AndOneVariablePerAttribute()
{
@@ -178,6 +154,7 @@ public sealed class GalaxyDiscovererTests
}
/// <summary>Verifies that full reference defaults to tag.attribute format when not explicitly supplied.</summary>
/// <returns>A task that represents the asynchronous test operation.</returns>
[Fact]
public async Task DiscoverAsync_FullReference_DefaultsToTagDotAttribute()
{
@@ -193,6 +170,7 @@ public sealed class GalaxyDiscovererTests
}
/// <summary>Verifies that full reference uses gateway-supplied value when provided.</summary>
/// <returns>A task that represents the asynchronous test operation.</returns>
[Fact]
public async Task DiscoverAsync_FullReference_PrefersGwSuppliedFullTagReference()
{
@@ -208,6 +186,7 @@ public sealed class GalaxyDiscovererTests
}
/// <summary>Verifies that browse name falls back to tag name when contained name is empty.</summary>
/// <returns>A task that represents the asynchronous test operation.</returns>
[Fact]
public async Task DiscoverAsync_BrowseName_FallsBackToTagName_WhenContainedEmpty()
{
@@ -223,6 +202,7 @@ public sealed class GalaxyDiscovererTests
}
/// <summary>Verifies that attribute metadata fields are all propagated to the discovered variable.</summary>
/// <returns>A task that represents the asynchronous test operation.</returns>
[Fact]
public async Task DiscoverAsync_AttributeMetadata_PropagatesEveryField()
{
@@ -248,6 +228,7 @@ public sealed class GalaxyDiscovererTests
}
/// <summary>Verifies that alarm attributes populate all five sub-attribute references.</summary>
/// <returns>A task that represents the asynchronous test operation.</returns>
[Fact]
public async Task DiscoverAsync_AlarmAttribute_PopulatesAllFiveSubAttributeRefs()
{
@@ -270,6 +251,7 @@ public sealed class GalaxyDiscovererTests
}
/// <summary>Verifies that non-alarm attributes are not marked as alarm conditions.</summary>
/// <returns>A task that represents the asynchronous test operation.</returns>
[Fact]
public async Task DiscoverAsync_NonAlarmAttribute_DoesNotMarkCondition()
{
@@ -287,6 +269,7 @@ public sealed class GalaxyDiscovererTests
}
/// <summary>Verifies that objects with empty identity are skipped during discovery.</summary>
/// <returns>A task that represents the asynchronous test operation.</returns>
[Fact]
public async Task DiscoverAsync_SkipsObjectsWithEmptyIdentity()
{
@@ -304,6 +287,7 @@ public sealed class GalaxyDiscovererTests
}
/// <summary>Verifies that attributes with empty names are skipped during discovery.</summary>
/// <returns>A task that represents the asynchronous test operation.</returns>
[Fact]
public async Task DiscoverAsync_SkipsAttributesWithEmptyName()
{
@@ -320,6 +304,7 @@ public sealed class GalaxyDiscovererTests
}
/// <summary>Verifies that driver discovery routes through the injected hierarchy source.</summary>
/// <returns>A task that represents the asynchronous test operation.</returns>
[Fact]
public async Task DriverDiscoverAsync_RoutesThroughInjectedSource()
{