* cc-mode: Make all parameters introduced in Emacs 26 optional @ 2018-01-22 8:09 Jostein Kjønigsen 2018-01-22 20:32 ` Alan Mackenzie 0 siblings, 1 reply; 15+ messages in thread From: Jostein Kjønigsen @ 2018-01-22 8:09 UTC (permalink / raw) To: emacs-devel; +Cc: Alan Mackenzie [-- Attachment #1: Type: text/plain, Size: 1289 bytes --] Hey everyone. While cc-mode seems to be a foundation for lots of the major-modes shipped with Emacs, it's also used by third-party packages. For major-modes shipped with Emacs, changes to the core cc-mode functions is not that big of a problem, since they can be changed in tandem with the changes to cc-mode itself. For third party modules (like csharp-mode, which I maintain), changes to cc-mode core-functions are more problematic due to Emacs lacking reliable introspection capabilities. As an example in the Emacs 26 branch c-font-lock-declarators is now declared like this: (defun c-font-lock-declarators (limit list types not-top &optional template- class) ...) While in Emacs 25.3 and earlier it's declared like this: (defun c-font-lock-declarators (limit list types) ...) Basically the number of mandatory parameters has been bumped from 3 to 4, with another optional parameter added. These kinds of changes makes it harder for third party modules to maintain compatibility across Emacs-versions. Wouldn't it be better to make *all *the new parameters optional and thus maintain compatibility? Are there any good reasons not to do so? -- Regards Jostein Kjønigsen jostein@kjonigsen.net 🍵 jostein@gmail.com https://jostein.kjonigsen.net [-- Attachment #2: Type: text/html, Size: 2291 bytes --] ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: cc-mode: Make all parameters introduced in Emacs 26 optional 2018-01-22 8:09 cc-mode: Make all parameters introduced in Emacs 26 optional Jostein Kjønigsen @ 2018-01-22 20:32 ` Alan Mackenzie 2018-02-03 5:59 ` Matthew Carter 2018-03-12 20:16 ` Jostein Kjønigsen 0 siblings, 2 replies; 15+ messages in thread From: Alan Mackenzie @ 2018-01-22 20:32 UTC (permalink / raw) To: jostein; +Cc: emacs-devel Hello, Jostein. On Mon, Jan 22, 2018 at 09:09:21 +0100, Jostein Kjønigsen wrote: > Hey everyone. > While cc-mode seems to be a foundation for lots of the major-modes > shipped with Emacs, it's also used by third-party packages. > For major-modes shipped with Emacs, changes to the core cc-mode > functions is not that big of a problem, since they can be changed in > tandem with the changes to cc-mode itself. > For third party modules (like csharp-mode, which I maintain), changes to > cc-mode core-functions are more problematic due to Emacs lacking > reliable introspection capabilities. There's a convention in CC Mode that functions, macros, and variables with a doc string are regarded as part of an "API" to derived modes, but objects with merely a "doc comment" are regarded as internal to CC Mode, and _much_ less secure against random changes. > As an example in the Emacs 26 branch c-font-lock-declarators is now > declared like this: > (defun c-font-lock-declarators (limit list types not-top &optional template- > class) ...) > While in Emacs 25.3 and earlier it's declared like this: > (defun c-font-lock-declarators (limit list types) > ...) > Basically the number of mandatory parameters has been bumped from 3 to > 4, with another optional parameter added. c-font-lock-declarators is one of these functions intended to be "internal". If a derived mode like csharp-mode is using it directly, one of the following is true: (i) There's a need for functionality which is currently lacking in CC Mode. (ii) The maintainer of the derived mode is unaware of existing CC Mode functionality which would satisfy his need. (iii) ??? > These kinds of changes makes it harder for third party modules to > maintain compatibility across Emacs-versions. Why is csharp-mode using c-font-lock-declarators at all? Could it be you're wanting to do something which currently can't be done with the "API" functions/macros/variables? If so, it might well be better to amend CC Mode to provide this functionality. > Wouldn't it be better to make *all *the new parameters optional and thus > maintain compatibility? Are there any good reasons not to do so? Well, to work properly, the caller of c-font-lock-declarators will need to determine the `not-top' argument rather than just relying on a randomish default. The meaning of the function has changed. `not-top' doesn't seem suitable for being &optional. Again, why is csharp-mode using this function? Are there any other "internal" functions/macros/variables it is using? > -- > Regards > Jostein Kjønigsen > jostein@kjonigsen.net 🍵 jostein@gmail.com > https://jostein.kjonigsen.net -- Alan Mackenzie (Nuremberg, Germany). ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: cc-mode: Make all parameters introduced in Emacs 26 optional 2018-01-22 20:32 ` Alan Mackenzie @ 2018-02-03 5:59 ` Matthew Carter 2018-02-03 6:13 ` Matthew Carter 2018-03-12 20:16 ` Jostein Kjønigsen 1 sibling, 1 reply; 15+ messages in thread From: Matthew Carter @ 2018-02-03 5:59 UTC (permalink / raw) To: Alan Mackenzie; +Cc: jostein, emacs-devel Alan Mackenzie <acm@muc.de> writes: > Hello, Jostein. > > On Mon, Jan 22, 2018 at 09:09:21 +0100, Jostein Kjønigsen wrote: >> Hey everyone. > >> While cc-mode seems to be a foundation for lots of the major-modes >> shipped with Emacs, it's also used by third-party packages. >> For major-modes shipped with Emacs, changes to the core cc-mode >> functions is not that big of a problem, since they can be changed in >> tandem with the changes to cc-mode itself. > >> For third party modules (like csharp-mode, which I maintain), changes to >> cc-mode core-functions are more problematic due to Emacs lacking >> reliable introspection capabilities. > > There's a convention in CC Mode that functions, macros, and variables > with a doc string are regarded as part of an "API" to derived modes, but > objects with merely a "doc comment" are regarded as internal to CC Mode, > and _much_ less secure against random changes. > >> As an example in the Emacs 26 branch c-font-lock-declarators is now >> declared like this: >> (defun c-font-lock-declarators (limit list types not-top &optional template- >> class) ...) >> While in Emacs 25.3 and earlier it's declared like this: > >> (defun c-font-lock-declarators (limit list types) >> ...) > >> Basically the number of mandatory parameters has been bumped from 3 to >> 4, with another optional parameter added. > > c-font-lock-declarators is one of these functions intended to be > "internal". If a derived mode like csharp-mode is using it directly, > one of the following is true: > (i) There's a need for functionality which is currently lacking in CC > Mode. > (ii) The maintainer of the derived mode is unaware of existing CC Mode > functionality which would satisfy his need. > (iii) ??? > >> These kinds of changes makes it harder for third party modules to >> maintain compatibility across Emacs-versions. > > Why is csharp-mode using c-font-lock-declarators at all? Could it be > you're wanting to do something which currently can't be done with the > "API" functions/macros/variables? If so, it might well be better to > amend CC Mode to provide this functionality. > >> Wouldn't it be better to make *all *the new parameters optional and thus >> maintain compatibility? Are there any good reasons not to do so? > > Well, to work properly, the caller of c-font-lock-declarators will need > to determine the `not-top' argument rather than just relying on a > randomish default. The meaning of the function has changed. `not-top' > doesn't seem suitable for being &optional. > > Again, why is csharp-mode using this function? Are there any other > "internal" functions/macros/variables it is using? > >> -- >> Regards >> Jostein Kjønigsen > >> jostein@kjonigsen.net 🍵 jostein@gmail.com >> https://jostein.kjonigsen.net Somewhat on this subject - recent versions of Emacs have seemed to have changed single quotes with text between the quotes with a length greater than 1 to use a warn font face on the quotes, instead of the font string face (likely because in C the single quote denotes a char, but in many of the derived modes that cc-mode mentions in it's own comment set (php-mode, dart-mode etc.), a single quoted string and double quoted string are used interchangeably). Does cc-mode have a setting to correct this and restore the old behavior? -- Matthew Carter (m@ahungry.com) http://ahungry.com ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: cc-mode: Make all parameters introduced in Emacs 26 optional 2018-02-03 5:59 ` Matthew Carter @ 2018-02-03 6:13 ` Matthew Carter 2018-02-03 11:44 ` Alan Mackenzie 0 siblings, 1 reply; 15+ messages in thread From: Matthew Carter @ 2018-02-03 6:13 UTC (permalink / raw) To: Alan Mackenzie; +Cc: jostein, emacs-devel Matthew Carter <m@ahungry.com> writes: > Alan Mackenzie <acm@muc.de> writes: > >> Hello, Jostein. >> >> On Mon, Jan 22, 2018 at 09:09:21 +0100, Jostein Kjønigsen wrote: >>> Hey everyone. >> >>> While cc-mode seems to be a foundation for lots of the major-modes >>> shipped with Emacs, it's also used by third-party packages. >>> For major-modes shipped with Emacs, changes to the core cc-mode >>> functions is not that big of a problem, since they can be changed in >>> tandem with the changes to cc-mode itself. >> >>> For third party modules (like csharp-mode, which I maintain), changes to >>> cc-mode core-functions are more problematic due to Emacs lacking >>> reliable introspection capabilities. >> >> There's a convention in CC Mode that functions, macros, and variables >> with a doc string are regarded as part of an "API" to derived modes, but >> objects with merely a "doc comment" are regarded as internal to CC Mode, >> and _much_ less secure against random changes. >> >>> As an example in the Emacs 26 branch c-font-lock-declarators is now >>> declared like this: >>> (defun c-font-lock-declarators (limit list types not-top &optional template- >>> class) ...) >>> While in Emacs 25.3 and earlier it's declared like this: >> >>> (defun c-font-lock-declarators (limit list types) >>> ...) >> >>> Basically the number of mandatory parameters has been bumped from 3 to >>> 4, with another optional parameter added. >> >> c-font-lock-declarators is one of these functions intended to be >> "internal". If a derived mode like csharp-mode is using it directly, >> one of the following is true: >> (i) There's a need for functionality which is currently lacking in CC >> Mode. >> (ii) The maintainer of the derived mode is unaware of existing CC Mode >> functionality which would satisfy his need. >> (iii) ??? >> >>> These kinds of changes makes it harder for third party modules to >>> maintain compatibility across Emacs-versions. >> >> Why is csharp-mode using c-font-lock-declarators at all? Could it be >> you're wanting to do something which currently can't be done with the >> "API" functions/macros/variables? If so, it might well be better to >> amend CC Mode to provide this functionality. >> >>> Wouldn't it be better to make *all *the new parameters optional and thus >>> maintain compatibility? Are there any good reasons not to do so? >> >> Well, to work properly, the caller of c-font-lock-declarators will need >> to determine the `not-top' argument rather than just relying on a >> randomish default. The meaning of the function has changed. `not-top' >> doesn't seem suitable for being &optional. >> >> Again, why is csharp-mode using this function? Are there any other >> "internal" functions/macros/variables it is using? >> >>> -- >>> Regards >>> Jostein Kjønigsen >> >>> jostein@kjonigsen.net 🍵 jostein@gmail.com >>> https://jostein.kjonigsen.net > > Somewhat on this subject - recent versions of Emacs have seemed to have > changed single quotes with text between the quotes with a length greater > than 1 to use a warn font face on the quotes, instead of the font string > face (likely because in C the single quote denotes a char, but in many > of the derived modes that cc-mode mentions in it's own comment set > (php-mode, dart-mode etc.), a single quoted string and double quoted > string are used interchangeably). > > Does cc-mode have a setting to correct this and restore the old behavior? I hate to respond to my own post, but I have tracked this down to #'c-parse-quotes-after-change (defined in cc-mode.el). -- Matthew Carter (m@ahungry.com) http://ahungry.com ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: cc-mode: Make all parameters introduced in Emacs 26 optional 2018-02-03 6:13 ` Matthew Carter @ 2018-02-03 11:44 ` Alan Mackenzie 2019-03-30 13:51 ` Alan Mackenzie 0 siblings, 1 reply; 15+ messages in thread From: Alan Mackenzie @ 2018-02-03 11:44 UTC (permalink / raw) To: Matthew Carter; +Cc: jostein, emacs-devel Hello, Matthew. On Sat, Feb 03, 2018 at 01:13:57 -0500, Matthew Carter wrote: > Matthew Carter <m@ahungry.com> writes: > > Somewhat on this subject - recent versions of Emacs have seemed to have > > changed single quotes with text between the quotes with a length greater > > than 1 to use a warn font face on the quotes, instead of the font string > > face (likely because in C the single quote denotes a char, .... That's indeed what's been changed. > > .... but in many of the derived modes that cc-mode mentions in it's > > own comment set (php-mode, dart-mode etc.), a single quoted string > > and double quoted string are used interchangeably). Ah. This is indeed a CC Mode bug. > > Does cc-mode have a setting to correct this and restore the old behavior? It doesn't, but it will soon get one. This will be a "lang variable", to be set by each derived mode appropriately, as part of the language definition. > I hate to respond to my own post, but I have tracked this down to > #'c-parse-quotes-after-change (defined in cc-mode.el). I don't hate it at all - it saves me work. :-) Thanks indeed for taking the trouble to report this bug. > -- > Matthew Carter (m@ahungry.com) > http://ahungry.com -- Alan Mackenzie (Nuremberg, Germany). ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: cc-mode: Make all parameters introduced in Emacs 26 optional 2018-02-03 11:44 ` Alan Mackenzie @ 2019-03-30 13:51 ` Alan Mackenzie 2019-03-30 16:39 ` Stefan Monnier 0 siblings, 1 reply; 15+ messages in thread From: Alan Mackenzie @ 2019-03-30 13:51 UTC (permalink / raw) To: Matthew Carter; +Cc: jostein, emacs-devel Hello again, Matthew. Excuse the top post, but it seems the easiest way to reply given how long ago the previous post was (apologies for this). I've just committed a fix to CC Mode (both CC Mode standalone version at SourceForge and the Emacs master branch on savannah), to allow 's to be used as string delimiters in modes derived from CC Mode. To set up a CC Mode derived mode to recognise strings 'like this', do the following: (i) Set the derived mode's value of `c-single-quotes-quote-strings' to t. (This is done with `c-lang-defconst' in the derived mode's .el file). (ii) Make sure the derived mode's value of `c-get-state-before-change-function' does not include `c-parse-quotes-before-change'. (iii) Similarly ensure `c-before-font-lock-functions' doesn't contain `c-parse-quotes-after-change'. The two function in (ii) and (iii) are what fontify single character literals in C, C++, etc. (iv) Ensure the derived mode's value of `c-get-state-before-change-function' contains `c-before-change-check-unbalanced-strings' and that of `c-before-font-lock-functions' contains 'c-after-change-mark-abnormal-strings'. (v) Make sure `c-has-quoted-numbers' is nil. (This is a pure C++ facility for writing numbers as 4'294'967'295.) The two functions in (iv) are the ones which actually analyse strings for fontification. (vi) Ensure `c-multiline-string-start-char' (which allows strings to continue over line ends without \) is set correctly for the mode. Please feel free to test this "new" part of CC Mode, and to report any bugs you find. Since I lack a proper mode to test this with, my testing of it hasn't been all that thorough. Thanks again for the bug report! -- Alan Mackenzie (Nuremberg, Germany). On Sat, Feb 03, 2018 at 11:44:51 +0000, Alan Mackenzie wrote: > On Sat, Feb 03, 2018 at 01:13:57 -0500, Matthew Carter wrote: > > Matthew Carter <m@ahungry.com> writes: > > > Somewhat on this subject - recent versions of Emacs have seemed to > > > have changed single quotes with text between the quotes with a > > > length greater than 1 to use a warn font face on the quotes, > > > instead of the font string face (likely because in C the single > > > quote denotes a char, .... > That's indeed what's been changed. > > > .... but in many of the derived modes that cc-mode mentions in it's > > > own comment set (php-mode, dart-mode etc.), a single quoted string > > > and double quoted string are used interchangeably). > Ah. This is indeed a CC Mode bug. > > > Does cc-mode have a setting to correct this and restore the old behavior? > It doesn't, but it will soon get one. This will be a "lang variable", to > be set by each derived mode appropriately, as part of the language > definition. > > I hate to respond to my own post, but I have tracked this down to > > #'c-parse-quotes-after-change (defined in cc-mode.el). > I don't hate it at all - it saves me work. :-) > Thanks indeed for taking the trouble to report this bug. > > -- > > Matthew Carter (m@ahungry.com) > > http://ahungry.com > -- > Alan Mackenzie (Nuremberg, Germany). ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: cc-mode: Make all parameters introduced in Emacs 26 optional 2019-03-30 13:51 ` Alan Mackenzie @ 2019-03-30 16:39 ` Stefan Monnier 2019-03-30 19:42 ` Alan Mackenzie 0 siblings, 1 reply; 15+ messages in thread From: Stefan Monnier @ 2019-03-30 16:39 UTC (permalink / raw) To: emacs-devel Hi Alan, > To set up a CC Mode derived mode to recognise strings 'like this', do the > following: > (i) Set the derived mode's value of `c-single-quotes-quote-strings' to t. > (This is done with `c-lang-defconst' in the derived mode's .el file). > (ii) Make sure the derived mode's value of > `c-get-state-before-change-function' does not include > `c-parse-quotes-before-change'. > (iii) Similarly ensure `c-before-font-lock-functions' doesn't contain > `c-parse-quotes-after-change'. > (iv) Ensure the derived mode's value of > `c-get-state-before-change-function' contains > `c-before-change-check-unbalanced-strings' and that of > `c-before-font-lock-functions' contains > 'c-after-change-mark-abnormal-strings'. > (v) Make sure `c-has-quoted-numbers' is nil. (This is a pure C++ > facility for writing numbers as 4'294'967'295.) > (vi) Ensure `c-multiline-string-start-char' (which allows strings to > continue over line ends without \) is set correctly for the mode. In non-CC modes, all it takes is (modify-syntax-entry ?' "\"" st) so is there somewhere in CC-mode's code where there's some comment or something that explains why this simple approach isn't sufficient? I understand that things aren't always that simple: - you need to handle the 4'294'967'295 thingies in C++, but that should only affect C++ and I'd assume that the C++ code handles it by recognizing something like "[0-9]'" and changing the syntax-class of those quotes so it shouldn't prevent multichar single-quoted strings. - you apparently want to help the user catch the erroneous use of single-quoted strings in those languages where single quotes are used for chars rather than strings. but again this would seem to only explain the need for c-single-quotes-quote-strings. But the above sounds surprisingly complex&scary, Stefan ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: cc-mode: Make all parameters introduced in Emacs 26 optional 2019-03-30 16:39 ` Stefan Monnier @ 2019-03-30 19:42 ` Alan Mackenzie 2019-03-30 20:17 ` Stefan Monnier 0 siblings, 1 reply; 15+ messages in thread From: Alan Mackenzie @ 2019-03-30 19:42 UTC (permalink / raw) To: Stefan Monnier; +Cc: emacs-devel Hello, Stefan. On Sat, Mar 30, 2019 at 12:39:55 -0400, Stefan Monnier wrote: > Hi Alan, > > To set up a CC Mode derived mode to recognise strings 'like this', do the > > following: > > (i) Set the derived mode's value of `c-single-quotes-quote-strings' to t. > > (This is done with `c-lang-defconst' in the derived mode's .el file). > > (ii) Make sure the derived mode's value of > > `c-get-state-before-change-function' does not include > > `c-parse-quotes-before-change'. > > (iii) Similarly ensure `c-before-font-lock-functions' doesn't contain > > `c-parse-quotes-after-change'. > > (iv) Ensure the derived mode's value of > > `c-get-state-before-change-function' contains > > `c-before-change-check-unbalanced-strings' and that of > > `c-before-font-lock-functions' contains > > 'c-after-change-mark-abnormal-strings'. > > (v) Make sure `c-has-quoted-numbers' is nil. (This is a pure C++ > > facility for writing numbers as 4'294'967'295.) > > (vi) Ensure `c-multiline-string-start-char' (which allows strings to > > continue over line ends without \) is set correctly for the mode. > In non-CC modes, all it takes is > (modify-syntax-entry ?' "\"" st) Maybe, but that doesn't give you the facilities that CC Mode offers, namely that the delimiters of invalid constructs (such as unterminated strings, or invalid character constants) get fontified with warning face. > so is there somewhere in CC-mode's code where there's some comment or > something that explains why this simple approach isn't sufficient? There're comments which explain the strategems used to get the font-lock-warning-face. One question which has just occurred to me is why am I doing this in CC Mode rather than the syntax and font-lock functionality handling it directly? Languages where strings don't extend over unescaped newlines aren't exactly a rarity. > I understand that things aren't always that simple: > - you need to handle the 4'294'967'295 thingies in C++, but that should > only affect C++ and I'd assume that the C++ code handles it by > recognizing something like "[0-9]'" and changing the syntax-class of > those quotes so it shouldn't prevent multichar single-quoted strings. More or less, although it checks there aren't two adjacent 's, and things like that. > - you apparently want to help the user catch the erroneous use of > single-quoted strings in those languages where single quotes are used > for chars rather than strings. but again this would seem to only > explain the need for c-single-quotes-quote-strings. > But the above sounds surprisingly complex&scary, It only looks like that because I've spelled it out so laboriously. There are two hook variables, each of which needs one function and the lack of another. There are two boolean constants which need setting. It needs to be done once when writing a mode, and only then when there's something unusual, like 'strings like this'. > Stefan -- Alan Mackenzie (Nuremberg, Germany). ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: cc-mode: Make all parameters introduced in Emacs 26 optional 2019-03-30 19:42 ` Alan Mackenzie @ 2019-03-30 20:17 ` Stefan Monnier 2019-03-30 21:53 ` Ergus 0 siblings, 1 reply; 15+ messages in thread From: Stefan Monnier @ 2019-03-30 20:17 UTC (permalink / raw) To: emacs-devel >> (modify-syntax-entry ?' "\"" st) > > Maybe, but that doesn't give you the facilities that CC Mode offers, > namely that the delimiters of invalid constructs (such as unterminated > strings, or invalid character constants) get fontified with warning face. ... or quotes-in-numbers, indeed. > One question which has just occurred to me is why am I doing this in CC > Mode rather than the syntax and font-lock functionality handling it > directly? Languages where strings don't extend over unescaped newlines > aren't exactly a rarity. I think doing it in the syntax part is not necessary: the design of the syntax is made simpler and more efficient by assuming that the behavior on invalid code is largely irrelevant. And efficiency is important there when we need to parse-partial-sexp a large buffer. But providing support for highlighting such errors in font-lock (e.g. within font-lock-fontify-syntactically-region) would make a lot of sense, yes. Or maybe the simplest would be to provide a `font-lock-flag-multiline-strings` function that modes can add to font-lock-keywords. >> But the above sounds surprisingly complex&scary, > It only looks like that because I've spelled it out so laboriously. There > are two hook variables, each of which needs one function and the lack of > another. After re-reading the description I wonder if it couldn't be made simpler by making those hook functions check c-single-quotes-quote-strings instead (or have separate code in the cc-mode setup which adds/removes those hooks as needed based on c-single-quotes-quote-strings, essentially replacing the docstring text with executable code)? Also I still wonder why c-has-quoted-numbers is incompatible with c-single-quotes-quote-strings. I guess c-has-quoted-numbers only exists in C++, so in practice no language needs both features, but I can't see any reason why the CC-mode code wouldn't work just as well when both features are set. While both have to do with ' they seem fundamentally orthogonal. Stefan ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: cc-mode: Make all parameters introduced in Emacs 26 optional 2019-03-30 20:17 ` Stefan Monnier @ 2019-03-30 21:53 ` Ergus 0 siblings, 0 replies; 15+ messages in thread From: Ergus @ 2019-03-30 21:53 UTC (permalink / raw) To: Stefan Monnier; +Cc: emacs-devel Hi Stefan: Sorry, maybe my question is a bit orthogonal to this thread, but somehow I feel it is related. In CC mode is there a way (when activating a high level for font-lock-mode) to highlight escape sequences, and numbers as in default vim? I am talking about something simple like the packages: highlight-escape-sequences and highlight-numbers. But maybe simpler and that doesn't rely on an external package for a simpler functionality like this? This is just a question, you can ignore it. Thanks in advance Ergus On Sat, Mar 30, 2019 at 04:17:25PM -0400, Stefan Monnier wrote: >>> (modify-syntax-entry ?' "\"" st) >> >> Maybe, but that doesn't give you the facilities that CC Mode offers, >> namely that the delimiters of invalid constructs (such as unterminated >> strings, or invalid character constants) get fontified with warning face. > >... or quotes-in-numbers, indeed. > >> One question which has just occurred to me is why am I doing this in CC >> Mode rather than the syntax and font-lock functionality handling it >> directly? Languages where strings don't extend over unescaped newlines >> aren't exactly a rarity. > >I think doing it in the syntax part is not necessary: the design of the >syntax is made simpler and more efficient by assuming that the behavior >on invalid code is largely irrelevant. And efficiency is important >there when we need to parse-partial-sexp a large buffer. > >But providing support for highlighting such errors in font-lock >(e.g. within font-lock-fontify-syntactically-region) would make a lot of >sense, yes. > >Or maybe the simplest would be to provide >a `font-lock-flag-multiline-strings` function that modes can add to >font-lock-keywords. > >>> But the above sounds surprisingly complex&scary, >> It only looks like that because I've spelled it out so laboriously. There >> are two hook variables, each of which needs one function and the lack of >> another. > >After re-reading the description I wonder if it couldn't be made simpler >by making those hook functions check c-single-quotes-quote-strings >instead (or have separate code in the cc-mode setup which adds/removes >those hooks as needed based on c-single-quotes-quote-strings, >essentially replacing the docstring text with executable code)? > >Also I still wonder why c-has-quoted-numbers is incompatible with >c-single-quotes-quote-strings. I guess c-has-quoted-numbers only >exists in C++, so in practice no language needs both features, but >I can't see any reason why the CC-mode code wouldn't work just as >well when both features are set. While both have to do with ' they seem >fundamentally orthogonal. > > > Stefan > > ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: cc-mode: Make all parameters introduced in Emacs 26 optional 2018-01-22 20:32 ` Alan Mackenzie 2018-02-03 5:59 ` Matthew Carter @ 2018-03-12 20:16 ` Jostein Kjønigsen 2018-03-12 22:40 ` Stefan Monnier 1 sibling, 1 reply; 15+ messages in thread From: Jostein Kjønigsen @ 2018-03-12 20:16 UTC (permalink / raw) To: Alan Mackenzie, jostein; +Cc: emacs-devel [-- Attachment #1: Type: text/plain, Size: 3698 bytes --] Hey Alan. Thanks for your answer! > There's a convention in CC Mode that functions, macros, and variables> with a doc string are regarded as part of an "API" to derived > modes, but> objects with merely a "doc comment" are regarded as internal to > CC Mode,> and __much__ less secure against random changes. I was unaware of such a convention, but that's definitely useful to know for the future. > c-font-lock-declarators is one of these functions intended to be > "internal". If a derived mode like csharp-mode is using it directly,> one of the following is true: > (i) There's a need for functionality which is currently lacking in CC> Mode. > (ii) The maintainer of the derived mode is unaware of existing CC Mode> functionality which would satisfy his need. > (iii) ??? That sounds like a valid assessment. > Why is csharp-mode using c-font-lock-declarators at all? Could it be> you're wanting to do something which currently can't be done with the> "API" functions/macros/variables? If so, it might well be better to > amend CC Mode to provide this functionality. I'd hate to pass ball on this one, but I didn't write this original code. It's fairly messy and dirty I picked up from the internet and decided to patch up when it started breaking with Emacs 24. Since then I've done my best to keep it working, but I've never had time to clean it properly up and I'm definitely not 100% in control w.r.t. what all parts of the code actually does. Why this particular function was chosen is something I cannot directly answer for. This particular section of code has been unchanged since the first commit in any version-controlled version of this code I can find, by Dino Chiesa. As such, it's lacking a change/context which can further explain the choice of function. Definitely not an optimal situation. > Well, to work properly, the caller of c-font-lock-declarators > will need> to determine the `not-top' argument rather than just relying on a > randomish default. The meaning of the function has changed. > `not-top'> doesn't seem suitable for being &optional. That's a reasonable position indeed. I guess that puts me in the position where I need to better figure out how this particular part of the code actually works. I'm sure I'll appreciate that on some level further down the road. When/if I can get that done, that leaves me in a position where I'll have to make a choice: 1. try to replace this broken section of code with something different (with a understanding of what it needs to do)2. keep using c-font-lock-declarators, in case I don't have time for a rewrite. In the latter case, I will face a compatibility-issue between Emacs versions. Is there any way for package to know how many mandatory arguments a function has, to be able to branch out for compatibility reasons? My research so far haven't given me any obvious answer. > Again, why is csharp-mode using this function? Are there any other > "internal" functions/macros/variables it is using? That's indeed a good question. Seeing the kind of problems such usage lands me in, I'd definitely want to reduce the scope of that. A quick skim of the source-code uncovers at least the following "internal" members used: * c-safe * c-put-character-property * c-put-font-lock-face * c-fontify-types-and-refs * c-forward-keyword-clause * c-font-lock-declarators * Not to mention it does monkey-patch/advice c-inside-bracelist-p and c-forward-objc-directive. Like I said. This is dirty code, and I'm definitely not happy about the state of affairs. As such, any advice appreciated. -- Regards Jostein Kjønigsen [-- Attachment #2: Type: text/html, Size: 5221 bytes --] ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: cc-mode: Make all parameters introduced in Emacs 26 optional 2018-03-12 20:16 ` Jostein Kjønigsen @ 2018-03-12 22:40 ` Stefan Monnier 2018-03-12 23:29 ` Clément Pit-Claudel 2018-03-13 20:08 ` Jostein Kjønigsen 0 siblings, 2 replies; 15+ messages in thread From: Stefan Monnier @ 2018-03-12 22:40 UTC (permalink / raw) To: emacs-devel > Is there any way for package to know how many mandatory arguments a > function has, to be able to branch out for compatibility reasons? The way I recommend is: (condition-case nil (call1 ...) (wrong-number-of-arguments (call2 ...))) -- Stefan ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: cc-mode: Make all parameters introduced in Emacs 26 optional 2018-03-12 22:40 ` Stefan Monnier @ 2018-03-12 23:29 ` Clément Pit-Claudel 2018-03-13 1:00 ` Stefan Monnier 2018-03-13 20:08 ` Jostein Kjønigsen 1 sibling, 1 reply; 15+ messages in thread From: Clément Pit-Claudel @ 2018-03-12 23:29 UTC (permalink / raw) To: emacs-devel On 2018-03-12 18:40, Stefan Monnier wrote: >> Is there any way for package to know how many mandatory arguments a >> function has, to be able to branch out for compatibility reasons? > > The way I recommend is: > > (condition-case nil > (call1 ...) > (wrong-number-of-arguments > (call2 ...))) Out of (mostly theoretical) curiosity: is there a way to restrict that condition-case to that specific function call? (rather than catching all incorrect calls in that call tree) ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: cc-mode: Make all parameters introduced in Emacs 26 optional 2018-03-12 23:29 ` Clément Pit-Claudel @ 2018-03-13 1:00 ` Stefan Monnier 0 siblings, 0 replies; 15+ messages in thread From: Stefan Monnier @ 2018-03-13 1:00 UTC (permalink / raw) To: emacs-devel >> (condition-case nil >> (call1 ...) >> (wrong-number-of-arguments >> (call2 ...))) > > Out of (mostly theoretical) curiosity: is there a way to restrict that > condition-case to that specific function call? (rather than catching all > incorrect calls in that call tree) No. Actually just defining the notion of "that specific function call" is already pretty tricky if you consider the case where `call1` is advised, for example. Stefan ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: cc-mode: Make all parameters introduced in Emacs 26 optional 2018-03-12 22:40 ` Stefan Monnier 2018-03-12 23:29 ` Clément Pit-Claudel @ 2018-03-13 20:08 ` Jostein Kjønigsen 1 sibling, 0 replies; 15+ messages in thread From: Jostein Kjønigsen @ 2018-03-13 20:08 UTC (permalink / raw) To: emacs-devel, Stefan Monnier [-- Attachment #1: Type: text/plain, Size: 802 bytes --] Thanks Stefan. That's great help and for now will allow me to provide working C# support to Emacs 26 users, while I work out what to do with our troublesome usage of internal cc-mode functions. I really appreciate it. I picked up this project as a community service when editing C# stopped working sometime in Emacs 24, and it would be pretty daft to simply give up on it now. :) -- Regards Jostein Kjønigsen On Mon, Mar 12, 2018, at 11:40 PM, Stefan Monnier wrote: >> Is there any way for package to know how many mandatory arguments a >> function has, to be able to branch out for compatibility reasons? > > The way I recommend is: > > (condition-case nil > (call1 ...) > (wrong-number-of-arguments > (call2 ...))) > > > -- Stefan > > [-- Attachment #2: Type: text/html, Size: 1601 bytes --] ^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2019-03-30 21:53 UTC | newest] Thread overview: 15+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2018-01-22 8:09 cc-mode: Make all parameters introduced in Emacs 26 optional Jostein Kjønigsen 2018-01-22 20:32 ` Alan Mackenzie 2018-02-03 5:59 ` Matthew Carter 2018-02-03 6:13 ` Matthew Carter 2018-02-03 11:44 ` Alan Mackenzie 2019-03-30 13:51 ` Alan Mackenzie 2019-03-30 16:39 ` Stefan Monnier 2019-03-30 19:42 ` Alan Mackenzie 2019-03-30 20:17 ` Stefan Monnier 2019-03-30 21:53 ` Ergus 2018-03-12 20:16 ` Jostein Kjønigsen 2018-03-12 22:40 ` Stefan Monnier 2018-03-12 23:29 ` Clément Pit-Claudel 2018-03-13 1:00 ` Stefan Monnier 2018-03-13 20:08 ` Jostein Kjønigsen
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).