unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Dmitry Gutov <dgutov@yandex.ru>
To: Eli Zaretskii <eliz@gnu.org>
Cc: 22241@debbugs.gnu.org
Subject: bug#22241: 25.0.50; etags Ruby parser problems
Date: Sat, 23 Jan 2016 22:29:02 +0300	[thread overview]
Message-ID: <56A3D47E.3030802@yandex.ru> (raw)
In-Reply-To: <83oacc3yx7.fsf@gnu.org>

On 01/23/2016 09:59 PM, Eli Zaretskii wrote:

> So I guess I will leave constants out for now: etags has no notion of
> expressions.

That would be a noticeable omission. Can't you just look for

^[ \t]([A-Z][a-z0-9_])[ \t]*=[ \t]*

? Then record the first group, and simply don't look at what's being 
assigned. The right hand value is an expression, and you need to skip 
over paired {} and do-end's, but the etags parser has to do that anyway, 
right?

> Is the telltale part "<<" or "self" (or both)?  If it's "<<", then are
> there other such tokens that "invalidate" a class?

It's "class << self" as a whole. Instead of self, there could be a 
variable, or a class name, but let's ignore those cases for now.

If we see "class <<" - it's not a class definition. If it's followed by 
"self", record the methods inside the scope as class methods. If it's 
followed by something other than "self"... maybe even skip the following 
scope altogether.

> Looks complicated, but I will look into this.  I hope no identifier
> can be named "end", as in
>
>    def foo
>      bar = end
>    end
>
> ?

No variable can be named 'end'. But 'end' can be a method name (so 
foo.end is valid syntax). You should also be on the lookout for :end or 
end:, that's an :end Symbol, not a keyword.

In practice, the 'end' keyword is almost always either preceded by ^[ 
\t]* or by ;[ \t]*.

>> It's common to use '#' in the qualified names of instance methods
>
> What part of the source makes 'foo!' an instance method?

An instance method is a "normal" method, i.e. a method you can call on 
an "instance" of a class. Example:

class C
   def foo
   end
end

(That's C#foo).

c = C.new # instantiate
c.foo # call

>> Because 'attr_writer :bar' effectively expands to
>>
>> def bar=(val)
>>     @bar = val
>> end
>>
>> and 'attr_accessor :tee' expands into
>>
>> def tee
>>     @tee
>> end
>>
>> def tee=(val)
>>     @tee = val
>> end
>
> So you are saying that attr_writer and attr_accessor cause the '=' to
> be appended?

They generate a method with the name bar=, yes.

To clarify the meaning of this: you can't have '=' in a name of a 
variable, only at the end of a method name. And if you have 'bar=(val)' 
defined in class C, it gets called during assignment:

class C
   def bar=(val)
     @bar = val
   end

   def foo
     @bar * 3
   end
end

c = C.new
c.bar = 4
c.foo # => 12

So attr_writer, attr_reader and attr_accessor generate "accessor" 
methods for the instance variables in the given class.





  reply	other threads:[~2016-01-23 19:29 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-26  3:59 bug#22241: 25.0.50; etags Ruby parser problems Dmitry Gutov
2015-12-26  4:13 ` Dmitry Gutov
2015-12-26  4:34 ` Dmitry Gutov
2016-01-23 16:38 ` Eli Zaretskii
2016-01-23 18:23   ` Dmitry Gutov
2016-01-23 18:59     ` Eli Zaretskii
2016-01-23 19:29       ` Dmitry Gutov [this message]
2016-01-23 20:48         ` Eli Zaretskii
2016-01-23 21:43           ` Dmitry Gutov
2016-01-24 15:44             ` Eli Zaretskii
2016-01-30 12:21               ` Eli Zaretskii
2016-01-30 22:06                 ` Dmitry Gutov
2016-01-31  3:37                   ` Eli Zaretskii
2016-01-31  5:43                     ` Dmitry Gutov
2016-01-31 18:11                       ` Eli Zaretskii
2016-02-01  8:40                         ` Dmitry Gutov
2016-02-02 18:16                           ` Eli Zaretskii
2016-02-02 19:59                             ` Dmitry Gutov
2016-02-03 16:26                               ` Eli Zaretskii
2016-02-03 23:21                                 ` Dmitry Gutov
2016-02-04  3:43                                   ` Eli Zaretskii
2016-02-04  8:24                                     ` Dmitry Gutov
2016-02-04 17:24                                       ` Eli Zaretskii
2016-02-04 20:06                                         ` Dmitry Gutov
2016-01-31 18:01                     ` Eli Zaretskii
2016-02-01  8:24                       ` Dmitry Gutov
2016-02-02 18:13                         ` Eli Zaretskii
2016-01-30 10:52     ` Eli Zaretskii
2016-01-30 16:43       ` Dmitry Gutov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=56A3D47E.3030802@yandex.ru \
    --to=dgutov@yandex.ru \
    --cc=22241@debbugs.gnu.org \
    --cc=eliz@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).