Add getMemberAttributes and getMemberType traits#22545
Draft
CyberShadow wants to merge 1 commit intodlang:masterfrom
Draft
Add getMemberAttributes and getMemberType traits#22545CyberShadow wants to merge 1 commit intodlang:masterfrom
CyberShadow wants to merge 1 commit intodlang:masterfrom
Conversation
New lightweight traits for member introspection that use sym.search() instead of full expressionSemantic, avoiding circular dependency errors when iterating allMembers on types with auto-return methods. __traits(getMemberAttributes, T, "name") returns UDAs on the named member. __traits(getMemberType, T, "name") returns the member's type, usable in is() expressions for return type extraction, function type checks, etc. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Contributor
|
Thanks for your pull request, @CyberShadow! Bugzilla referencesYour PR doesn't reference any Bugzilla issue. If your PR contains non-trivial changes, please reference a Bugzilla issue or create a manual changelog. Testing this PR locallyIf you don't have a local development environment setup, you can use Digger to test this PR: dub run digger -- build "master + dmd#22545" |
CyberShadow
commented
Feb 9, 2026
Comment on lines
+1353
to
+1357
| if (fd.overnext) | ||
| { | ||
| deprecation(e.loc, "`__traits(getMemberAttributes)` may only be used for individual functions, not the overload set `%s`", fd.toChars()); | ||
| deprecationSupplemental(e.loc, "the result of `__traits(getOverloads)` may be used to select the desired function to extract attributes from"); | ||
| } |
Member
Author
There was a problem hiding this comment.
Seems weird to emit deprecation warnings from a new feature. However, this is what getMember does today, so this copies its behavior to remain consistent.
Which does raise the question of what to do with overload sets. We could also add getOverloadAttributes, getOverloadType, etc. granting the same benefit as this (eliding full semantic analysis), but it becomes a quadratic explosion of traits.
This was referenced Feb 9, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Generated by Claude Opus 4.6, usual disclaimers apply.
Alternative to #22541 / #22542.
CC @dkorpel
New lightweight traits for member introspection that use
sym.search()instead of fullexpressionSemantic, avoiding circular dependency errors when iterating allMembers on types with auto-return methods.__traits(getMemberAttributes, T, "name")returns UDAs on the named member.__traits(getMemberType, T, "name")returns the member's type, usable inis()expressions for return type extraction, function type checks, etc.