Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RFC: new Attribute#ivar API #2110

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

amomchilov
Copy link
Contributor

My proposal for fixing #2109. Feedback welcome!

@@ -304,6 +304,21 @@ def update(name: self.name, type: self.type, ivar_name: self.ivar_name, kind: se
visibility: visibility
)
end

def ivar
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Now the semantics are clear: You either get back an InstanceVariable object, or nil (meaning this attribute was declared with no backing ivar declaration, e.g. attr_reader foo(): Foo).

Open question: How should we model the difference between these two?

attr_reader a: Foo     # Ivar name is inferred
attr_reader a(@a): Foo # Same ivar name, but explicit

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No difference between the two looks fine, if we consider this is a kind of utility class.
If we really need the detail of the syntax, we can use the old API.

@@ -185,6 +185,8 @@ module RBS
include _HashEqual

def update: (?name: Symbol, ?type: Types::t, ?ivar_name: Symbol | false | nil, ?kind: kind, ?annotations: Array[Annotation], ?location: loc?, ?comment: Comment?, ?visibility: visibility?) -> instance

def ivar: () -> InstanceVariable?
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Simple return type! :)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does it still make sense for ivar_name to accept false in the constructor and the attr_reader?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good question, since there's backwards compatibility concerns there.

We can add a new keyword arg (perhaps explicit_ivar_name:?) and use that, while still supporting the old.

self.ivar_name # Use the custom instance variable name given by the user
end

InstanceVariable.new(name: ivar_name, type: type, location: location, comment: comment)
Copy link
Contributor Author

@amomchilov amomchilov Dec 2, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Open question: what should the location and comment be? The same as the attribute, or nil?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we should have the comment attribute, because it's given to the attribute syntax, not to the instance variable name.

Not very sure about location, but I think going without location should work for now.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We still have to fill in the parameters, are you suggesting I pass location: nil, comment: nil?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oops, I'm sorry. I was confused.

I thought the InstanceVariable is a new class for this API, but actually it is an existing class which models instance variable declaration.

@amomchilov amomchilov marked this pull request as ready for review December 10, 2024 19:37
@soutaro
Copy link
Member

soutaro commented Dec 18, 2024

I'm generally good for this. My suggestion is dropping location and comment.

@soutaro
Copy link
Member

soutaro commented Dec 19, 2024

I'm sorry for confusion. 🙇‍♂️

I think reusing the AST structure is good for this, while introducing a new class looks a bit too much.

Simply adding a new methods seem the best way:

  • instance_variable_name: Symbol | nil -- the new method!
  • raw_instance_variable_name: Symbol | false | nil -- to avoid information loss
  • ivar_name: Symbol | false | nil -- keep it for compatibility until rbs-4.0, which will be deprecated soon.

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

Successfully merging this pull request may close these issues.

3 participants