[csharp] Auto-resolve ModelProvider.BaseModelProvider from BaseType via CSharpTypeMap#10600
Conversation
Agent-Logs-Url: https://github.com/microsoft/typespec/sessions/96294dad-fa6c-4b21-a8c7-8fcfb0107c92 Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com>
Agent-Logs-Url: https://github.com/microsoft/typespec/sessions/60279f78-9af0-440e-97b7-7026b39783c9 Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com>
commit: |
Agent-Logs-Url: https://github.com/microsoft/typespec/sessions/5b6fcac7-58a2-4f8e-be3e-2b2870fbeed0 Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com>
Agent-Logs-Url: https://github.com/microsoft/typespec/sessions/cab911a0-953a-4889-b96d-18aaccf1af83 Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com>
|
No changes needing a change description found. |
That check was an early-exit in the old |
jorgerangel-msft
left a comment
There was a problem hiding this comment.
@copilot can we add a test that validates that if BuildBaseType is overridden with a custom TypeProvider (not a ModelProvider) that BaseModelProvider returns null?
…es BaseModelProvider to null Agent-Logs-Url: https://github.com/microsoft/typespec/sessions/b96d6016-7d00-4f8f-904a-f073b5f2e121 Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com>
Added in a856150. The new test |
…ed test Agent-Logs-Url: https://github.com/microsoft/typespec/sessions/2e5a0923-a771-4653-b62b-63eb879324ab Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com>
Agent-Logs-Url: https://github.com/microsoft/typespec/sessions/18ff54a4-2957-47ba-a9fe-dad844a23b49 Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com>
Agent-Logs-Url: https://github.com/microsoft/typespec/sessions/488ed6a5-0f9f-409a-896f-0c806507dc52 Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com>
ModelProvider.BuildBaseTypeisvirtualand emitters override it to redirect the C# base class (e.g., to a framework type they own), butBuildBaseModelProviderwasprivate, soBaseModelProviderkept walkingInputModelType.BaseModeland diverged from the generated class hierarchy. Visitors traversingBaseModelProviderwould see "inherited" properties from a parent that is no longer the actual C# base.Changes
BuildBaseTypeandBuildBaseModelProviderso thatBaseTypeis the source of truth andBaseModelProviderderives from it:BuildBaseTypenow resolves the C# baseCSharpTypedirectly fromCustomCodeView.BaseType(including the empty-namespaceTypeProvidersByNamefallback with theCreateModelwarm-up loop, plus aCSharpTypeMapfallback so a customized base that matches an existing generatedModelProviderreturns that provider'sType) or from_inputModel.BaseModelviaCreateModel(...).Type. It no longer readsBaseModelProvider, so the previous chicken-and-egg cycle is broken.BuildBaseModelProviderremainsprivateand now looks upBaseTypeinCSharpTypeMap, returning the registeredModelProviderif any, elsenull. No recursion sinceBuildBaseTypedoesn't readBaseModelProvider.ModelProviderTestscovering:BuildBaseTyperedirect to another generated model auto-resolvesBaseModelProvidervia the map.BuildBaseTyperedirect to a framework / external type auto-resolvesBaseModelProvidertonull.BuildBaseTyperedirect to a non-ModelProviderTypeProviderregistered inCSharpTypeMapauto-resolvesBaseModelProvidertonull.nullfor both.MockHelpers.LoadMockGenerator(createModelCore: ...)to mock the type factory so it returns the customModelProvidersubclass for the relevantInputModelType, matching the pattern in existing tests likeInputLibraryVisitorTests.Example: emitter redirecting to a framework base
Emitters now only need to override
BuildBaseType.BaseModelProvideris automaticallynullbecause the frameworkCSharpTypeisn't aModelProviderinCSharpTypeMap:If
BuildBaseTypeis redirected to another generated model'sCSharpType,BaseModelProviderautomatically resolves to that model'sModelProvider.BaseTypeandBaseModelProviderstay in lock-step in all cases.