Skip to content

Commit aacaf10

Browse files
live1206Copilot
andcommitted
docs(csharp): explain provider reference map flow
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 2c17e8c commit aacaf10

1 file changed

Lines changed: 12 additions & 2 deletions

File tree

packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/PostProcessing/ProviderReferenceMapAnalyzer.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ public static void ApplyPreWriteAccessibility(IReadOnlyList<TypeProvider> provid
4242
return;
4343
}
4444

45+
// Accessibility is applied to providers before TypeProviderWriter runs so generated source
46+
// starts with the final public/internal shape instead of being rewritten by Roslyn later.
4547
var (internalizeCandidates, publicizeCandidates) = GetPreWriteAccessibilityCandidates(providers, customCodeProject);
4648
foreach (var provider in GetGeneratedProviders(providers))
4749
{
@@ -76,6 +78,9 @@ public static void RestorePreWriteModelFactoryMethods()
7678
public static void Analyze(IReadOnlyList<TypeProvider> providers, Project project)
7779
{
7880
var generatedProviders = GetGeneratedProviders(providers);
81+
// The provider graph replaces the old Roslyn-generated-source reference map for generated
82+
// code. We still keep custom-source syntax/symbol checks because users can reference
83+
// generated types from arbitrary C# that is not represented by TypeProviders.
7984
var graph = BuildGraph(generatedProviders);
8085
var publicGraph = BuildGraph(generatedProviders, publicOnly: true);
8186

@@ -143,8 +148,9 @@ public static void Analyze(IReadOnlyList<TypeProvider> providers, Project projec
143148
.OrderBy(static name => name, StringComparer.Ordinal)
144149
.ToArray();
145150

146-
// Body-only generated dependencies are needed to avoid deleting helper files, but they do
147-
// not contribute to public API reachability for internalization.
151+
// Body-only generated dependencies are intentionally added after public reachability is
152+
// computed: they keep helper files from being removed but must not force public API types
153+
// to remain public.
148154
AddGeneratedXmlDocCrefReferences(project, graph, publicOnly: false);
149155
AddGeneratedBodyReferences(project, providers, graph);
150156

@@ -824,6 +830,10 @@ private static void AddMatchingSymbolName(HashSet<string> target, INamedTypeSymb
824830

825831
private static ProviderReferenceGraph BuildGraph(IReadOnlyList<TypeProvider> generatedProviders, bool publicOnly = false)
826832
{
833+
// Each generated provider becomes a node, and provider metadata supplies the edges:
834+
// inheritance, signatures, properties, fields, nested/serialization providers, attributes,
835+
// and selected implementation dependencies. This avoids parsing generated C# just to
836+
// rediscover generated-to-generated references.
827837
var serializationProviderNamesByType = generatedProviders
828838
.Where(static provider => provider.SerializationProviders.Count > 0)
829839
.GroupBy(static provider => GetProviderTypeName(provider.Type), StringComparer.Ordinal)

0 commit comments

Comments
 (0)