Skip to content

Add model-name-resource-suffix linter rule#4462

Draft
haiyuazhang wants to merge 3 commits into
mainfrom
haiyzhan/linter-resource-suffix-rename
Draft

Add model-name-resource-suffix linter rule#4462
haiyuazhang wants to merge 3 commits into
mainfrom
haiyzhan/linter-resource-suffix-rename

Conversation

@haiyuazhang
Copy link
Copy Markdown
Member

Summary

New lint rule that flags model names ending with Resource and suggests dropping the suffix or renaming to Data, per Azure SDK .NET Mgmt Naming Conventions.

Closes #4451

Changes

  • Rule: model-name-resource-suffix in @azure-tools/typespec-client-generator-core
    • Checks C#-scoped model name (respects @clientName overrides)
    • Excludes well-known base types: TrackedResource, ProxyResource, ExtensionResource, GenericResource
    • Two codefixes: drop Resource suffix, or rename to Data suffix
  • Ruleset: Added to resource-manager mega-ruleset (management plane only)
  • Tests: 12 tests covering positive/negative cases, well-known exclusions, @clientName overrides, case sensitivity, and codefixes
  • Docs: Rule documentation page
  • Changelog: .chronus/changes entry

New lint rule that flags model names ending with Resource and suggests
dropping the suffix or renaming to Data. Excludes well-known base types
(TrackedResource, ProxyResource, ExtensionResource, GenericResource).
Includes two codefixes: drop suffix and rename to Data.

Registered in TCGC best-practices:csharp ruleset and resource-manager
mega-ruleset.

Closes #4451

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@microsoft-github-policy-service microsoft-github-policy-service Bot added lib:tcgc Issues for @azure-tools/typespec-client-generator-core library meta:website TypeSpec.io updates labels May 19, 2026
@azure-sdk
Copy link
Copy Markdown
Collaborator

azure-sdk commented May 19, 2026

All changed packages have been documented.

  • @azure-tools/typespec-azure-rulesets
  • @azure-tools/typespec-client-generator-core
Show changes

@azure-tools/typespec-client-generator-core - feature ✏️

Add model-name-resource-suffix linter rule that flags model names ending with Resource and suggests dropping the suffix or renaming to Data/Info, per Azure SDK .NET naming conventions. Includes auto-fix codefixes via @clientName.

@azure-tools/typespec-azure-rulesets - feature ✏️

Add model-name-resource-suffix linter rule that flags model names ending with Resource and suggests dropping the suffix or renaming to Data/Info, per Azure SDK .NET naming conventions. Includes auto-fix codefixes via @clientName.

Haiyuan Zhang and others added 2 commits May 20, 2026 01:33
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The linter rule tester does not process suppress directives, so this
is documented as a comment rather than a test.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@azure-sdk
Copy link
Copy Markdown
Collaborator

azure-sdk commented May 19, 2026

You can try these changes here

🛝 Playground 🌐 Website

@github-actions
Copy link
Copy Markdown
Contributor

⚡ Benchmark Results

⚠️ 27 metric(s) regressed above the +5% threshold:

Metric Baseline Current Change
total 🔴 581.2ms 🔴 786.6ms +35.3% 🔴
loader 🟢 108.4ms 🟢 158.3ms +46.0% 🔴
resolver 🟢 13.5ms 🟢 16.4ms +21.1% 🔴
checker 🟢 135.4ms 🟢 186.9ms +38.0% 🔴
validation 🟢 32.0ms 🟢 40.8ms +27.4% 🔴
 ↳ validation/@azure-tools/typespec-azure-core 🟢 4.4ms 🟢 6.3ms +42.7% 🔴
 ↳ validation/@typespec/http 🟢 3.8ms 🟢 5.3ms +40.5% 🔴
 ↳ validation/@typespec/versioning 🔴 21.6ms 🔴 26.9ms +24.5% 🔴
linter 🟢 93.5ms 🟢 134.6ms +43.9% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/byos 🟢 4.1ms 🟢 5.6ms +36.0% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/no-header-explode 🟡 12.7ms 🔴 20.0ms +58.0% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/no-query-explode 🟡 13.0ms 🔴 20.3ms +56.3% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/no-response-body 🟡 16.6ms 🔴 23.2ms +39.6% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/no-route-parameter-name-mismatch 🟢 3.5ms 🟢 5.4ms +55.3% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/response-schema-problem 🟡 15.5ms 🔴 22.0ms +42.2% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/use-standard-names 🟢 3.3ms 🟢 5.2ms +54.6% 🔴
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-common-types-version 🟢 3.0ms 🟢 4.3ms +44.5% 🔴
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-delete-operation-response-codes 🟢 3.8ms 🟢 5.5ms +46.7% 🔴
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-no-path-casing-conflicts 🟢 3.4ms 🟢 4.6ms +36.4% 🔴
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-operation-response 🟢 3.6ms 🟢 4.8ms +31.9% 🔴
 ↳ linter/@azure-tools/typespec-azure-resource-manager/lro-location-header 🟢 9.2ms 🟡 14.7ms +59.5% 🔴
 ↳ linter/@azure-tools/typespec-azure-resource-manager/no-response-body 🟡 14.6ms 🔴 22.9ms +56.8% 🔴
emit 🟢 192.6ms 🟡 247.5ms +28.5% 🔴
 ↳ emit/@azure-tools/typespec-autorest 🟢 120.0ms 🟢 155.0ms +29.1% 🔴
 ↳ emit/@typespec/openapi3 🟢 107.7ms 🟢 137.0ms +27.3% 🔴
 ↳ emit/@typespec/openapi3/compute 🟢 96.5ms 🟢 123.7ms +28.2% 🔴
 ↳ emit/@typespec/openapi3/write 🟢 11.0ms 🟢 13.5ms +22.6% 🔴
Full details – comparing 32969c2 vs baseline 213d2b2
Metric Baseline Current Change
total 🔴 581.2ms 🔴 786.6ms +35.3% 🔴
loader 🟢 108.4ms 🟢 158.3ms +46.0% 🔴
resolver 🟢 13.5ms 🟢 16.4ms +21.1% 🔴
checker 🟢 135.4ms 🟢 186.9ms +38.0% 🔴
validation 🟢 32.0ms 🟢 40.8ms +27.4% 🔴
 ↳ validation/@azure-tools/typespec-azure-core 🟢 4.4ms 🟢 6.3ms +42.7% 🔴
 ↳ validation/@typespec/http 🟢 3.8ms 🟢 5.3ms +40.5% 🔴
 ↳ validation/@typespec/rest 🟢 0.4ms 🟢 0.5ms +2.5%
 ↳ validation/@typespec/versioning 🔴 21.6ms 🔴 26.9ms +24.5% 🔴
 ↳ validation/compiler 🟢 1.3ms 🟢 1.4ms +10.7%
linter 🟢 93.5ms 🟢 134.6ms +43.9% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/auth-required 🟢 0.0ms 🟢 0.0ms +14.4%
 ↳ linter/@azure-tools/typespec-azure-core/bad-record-type 🟢 0.1ms 🟢 0.2ms +25.2%
 ↳ linter/@azure-tools/typespec-azure-core/byos 🟢 4.1ms 🟢 5.6ms +36.0% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/casing-style 🟢 0.4ms 🟢 0.5ms +25.2%
 ↳ linter/@azure-tools/typespec-azure-core/composition-over-inheritance 🟢 0.1ms 🟢 0.1ms +9.1%
 ↳ linter/@azure-tools/typespec-azure-core/documentation-required 🟢 0.6ms 🟢 0.8ms +23.0%
 ↳ linter/@azure-tools/typespec-azure-core/friendly-name 🟢 0.4ms 🟢 0.6ms +29.5%
 ↳ linter/@azure-tools/typespec-azure-core/key-visibility-required 🟢 0.1ms 🟢 0.1ms +28.6%
 ↳ linter/@azure-tools/typespec-azure-core/known-encoding 🟢 0.2ms 🟢 0.2ms +11.4%
 ↳ linter/@azure-tools/typespec-azure-core/long-running-polling-operation-required 🟢 0.2ms 🟢 0.3ms +36.8%
 ↳ linter/@azure-tools/typespec-azure-core/no-case-mismatch 🟢 0.2ms 🟢 0.2ms +12.8%
 ↳ linter/@azure-tools/typespec-azure-core/no-closed-literal-union 🟢 0.2ms 🟢 0.2ms +29.2%
 ↳ linter/@azure-tools/typespec-azure-core/no-enum 🟢 0.0ms 🟢 0.0ms +18.4%
 ↳ linter/@azure-tools/typespec-azure-core/no-error-status-codes 🟢 0.1ms 🟢 0.1ms +22.7%
 ↳ linter/@azure-tools/typespec-azure-core/no-explicit-routes-resource-ops 🟢 0.1ms 🟢 0.1ms +27.2%
 ↳ linter/@azure-tools/typespec-azure-core/no-format 🟢 0.3ms 🟢 0.4ms +28.4%
 ↳ linter/@azure-tools/typespec-azure-core/no-generic-numeric 🟢 0.3ms 🟢 0.4ms +16.6%
 ↳ linter/@azure-tools/typespec-azure-core/no-header-explode 🟡 12.7ms 🔴 20.0ms +58.0% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/no-legacy-usage 🟢 0.8ms 🟢 1.0ms +23.7%
 ↳ linter/@azure-tools/typespec-azure-core/no-multiple-discriminator 🟢 0.0ms 🟢 0.1ms +35.4%
 ↳ linter/@azure-tools/typespec-azure-core/no-nullable 🟢 0.2ms 🟢 0.2ms +34.0%
 ↳ linter/@azure-tools/typespec-azure-core/no-offsetdatetime 🟢 0.9ms 🟢 1.2ms +24.5%
 ↳ linter/@azure-tools/typespec-azure-core/no-openapi 🟢 1.4ms 🟢 1.7ms +18.3%
 ↳ linter/@azure-tools/typespec-azure-core/no-private-usage 🟢 1.4ms 🟢 1.7ms +19.2%
 ↳ linter/@azure-tools/typespec-azure-core/no-query-explode 🟡 13.0ms 🔴 20.3ms +56.3% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/no-response-body 🟡 16.6ms 🔴 23.2ms +39.6% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/no-rest-library-interfaces 🟢 0.0ms 🟢 0.0ms +10.2%
 ↳ linter/@azure-tools/typespec-azure-core/no-route-parameter-name-mismatch 🟢 3.5ms 🟢 5.4ms +55.3% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/no-rpc-path-params 🟢 0.1ms 🟢 0.2ms +39.2%
 ↳ linter/@azure-tools/typespec-azure-core/no-string-discriminator 🟢 0.0ms 🟢 0.0ms +28.2%
 ↳ linter/@azure-tools/typespec-azure-core/no-unknown 🟢 0.1ms 🟢 0.1ms +30.9%
 ↳ linter/@azure-tools/typespec-azure-core/no-unnamed-union 🟢 0.2ms 🟢 0.3ms +30.3%
 ↳ linter/@azure-tools/typespec-azure-core/operation-missing-api-version 🟢 0.1ms 🟢 0.1ms +12.4%
 ↳ linter/@azure-tools/typespec-azure-core/request-body-problem 🟢 0.2ms 🟢 0.2ms +20.0%
 ↳ linter/@azure-tools/typespec-azure-core/require-versioned 🟢 0.0ms 🟢 0.0ms -7.4%
 ↳ linter/@azure-tools/typespec-azure-core/response-schema-problem 🟡 15.5ms 🔴 22.0ms +42.2% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/rpc-operation-request-body 🟢 0.2ms 🟢 0.3ms +45.8%
 ↳ linter/@azure-tools/typespec-azure-core/spread-discriminated-model 🟢 0.2ms 🟢 0.2ms +23.9%
 ↳ linter/@azure-tools/typespec-azure-core/use-standard-names 🟢 3.3ms 🟢 5.2ms +54.6% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/use-standard-operations 🟢 0.1ms 🟢 0.1ms +46.7%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-common-types-version 🟢 3.0ms 🟢 4.3ms +44.5% 🔴
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-custom-resource-no-key 🟢 0.1ms 🟢 0.1ms +52.5%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-custom-resource-usage-discourage 🟢 0.0ms 🟢 0.1ms +38.2%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-delete-operation-response-codes 🟢 3.8ms 🟢 5.5ms +46.7% 🔴
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-no-path-casing-conflicts 🟢 3.4ms 🟢 4.6ms +36.4% 🔴
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-no-record 🟢 0.3ms 🟢 0.3ms +20.5%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-post-operation-response-codes 🟢 0.4ms 🟢 0.5ms +38.3%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-put-operation-response-codes 🟢 0.0ms 🟢 0.0ms -9.2%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-action-no-segment 🟢 0.2ms 🟢 0.2ms +42.5%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-duplicate-property 🟢 0.1ms 🟢 0.1ms +51.2%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-interface-requires-decorator 🟢 0.0ms 🟢 0.0ms +16.8%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-invalid-action-verb 🟢 0.1ms 🟢 0.1ms +30.2%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-invalid-envelope-property 🟢 0.1ms 🟢 0.1ms +24.3%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-invalid-version-format 🟢 0.0ms 🟢 0.0ms +28.1%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-key-invalid-chars 🟢 0.2ms 🟢 0.2ms +35.0%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-name-pattern 🟢 0.0ms 🟢 0.0ms +2.9%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-operation 🟢 0.1ms 🟢 0.1ms +13.5%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-operation-response 🟢 3.6ms 🟢 4.8ms +31.9% 🔴
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-patch 🟢 0.2ms 🟢 0.3ms +35.4%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-path-segment-invalid-chars 🟢 0.1ms 🟢 0.2ms +36.7%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-provisioning-state 🟢 0.1ms 🟢 0.1ms +44.5%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/beyond-nesting-levels 🟢 0.1ms 🟢 0.1ms +42.9%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/empty-updateable-properties 🟢 0.1ms 🟢 0.1ms +35.2%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/improper-subscription-list-operation 🟢 0.0ms 🟢 0.0ms +12.0%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/lro-location-header 🟢 9.2ms 🟡 14.7ms +59.5% 🔴
 ↳ linter/@azure-tools/typespec-azure-resource-manager/missing-operations-endpoint 🟢 0.0ms 🟢 0.0ms +25.0%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/missing-x-ms-identifiers 🟢 0.2ms 🟢 0.3ms +25.0%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/no-empty-model 🟢 0.1ms 🟢 0.1ms +30.6%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/no-resource-delete-operation 🟢 0.1ms 🟢 0.2ms +41.5%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/no-response-body 🟡 14.6ms 🔴 22.9ms +56.8% 🔴
 ↳ linter/@azure-tools/typespec-azure-resource-manager/patch-envelope 🟢 0.1ms 🟢 0.1ms +33.4%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/resource-name 🟢 0.1ms 🟢 0.1ms +36.2%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/secret-prop 🟢 1.9ms 🟢 2.0ms +4.3%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/unsupported-type 🟢 0.3ms 🟢 0.4ms +30.4%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/version-progression 🟢 0.0ms 🟢 0.0ms +8.6%
 ↳ linter/@azure-tools/typespec-client-generator-core/model-name-resource-suffix 🟢 0.0ms 🟢 0.7ms +100.0%
 ↳ linter/@azure-tools/typespec-client-generator-core/property-name-conflict 🟢 0.7ms 🟢 0.9ms +22.7%
 ↳ linter/@azure-tools/typespec-client-generator-core/require-client-suffix 🟢 0.2ms 🟢 0.2ms +3.5%
emit 🟢 192.6ms 🟡 247.5ms +28.5% 🔴
 ↳ emit/@azure-tools/typespec-autorest 🟢 120.0ms 🟢 155.0ms +29.1% 🔴
 ↳ emit/@typespec/openapi3 🟢 107.7ms 🟢 137.0ms +27.3% 🔴
 ↳ emit/@typespec/openapi3/compute 🟢 96.5ms 🟢 123.7ms +28.2% 🔴
 ↳ emit/@typespec/openapi3/write 🟢 11.0ms 🟢 13.5ms +22.6% 🔴

Averaged across 3 specs (azure-arm-resource-manager, azure-core-dataplane, azure-full).
Threshold: changes > ±5% are highlighted.
🟢 Fast · 🟡 Moderate (stages >200ms, rules >10ms) · 🔴 Slow (stages >400ms, rules >20ms)

@pkg-pr-new
Copy link
Copy Markdown

pkg-pr-new Bot commented May 19, 2026

Open in StackBlitz

npm i https://pkg.pr.new/@azure-tools/typespec-azure-rulesets@4462
npm i https://pkg.pr.new/@azure-tools/typespec-client-generator-core@4462

commit: 87e4157

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lib:tcgc Issues for @azure-tools/typespec-client-generator-core library meta:website TypeSpec.io updates

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Linter: Resource suffix handling — drop or rename to Data/Info

2 participants