bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#71784: 31.0.50; Inconsistent fontification for field_identifier in c


From: Ergus
Subject: bug#71784: 31.0.50; Inconsistent fontification for field_identifier in c++-ts-mode
Date: Thu, 27 Jun 2024 00:24:46 +0200

On Wed, Jun 26, 2024 at 06:46:04PM GMT, Eli Zaretskii wrote:
Date: Wed, 26 Jun 2024 16:13:47 +0200
From:  Ergus via "Bug reports for GNU Emacs,
 the Swiss army knife of text editors" <bug-gnu-emacs@gnu.org>

Using the c++-ts-mode I found that there is some inconsistent
fontification for the `fields_identifier`:

See the fontification in this example with `emacs -Q`.

```test.cpp

std::string key;
bool inserted;

struct name_t {
        std::string key;
        bool inserted;
};

name_t keys = {"aaa", true};

keys.inserted = false;
bool a = keys.inserted;
```

1. The `keys.inserted` values are shown differently before or after the
= (the inserted word is fontified is some cases, but not in all)

2. The variable names are fontified differently outside or
inside the struct.

3. The escape sequence (\t) is fontified differently to the rest of the
text inside the string. I don't know if that is intentional or not. If
it is intentional, just ignore this comment.

The inconsistencies 1 and 2 are not only different to c++-mode but they
are semantically incorrect.

What does treesit-explore-mode tell you about these instances of
keys.inserted?

This is the whole explorer buffer for the example code:

(translation_unit
 (declaration
  type: (qualified_identifier scope: (namespace_identifier) :: name: 
(type_identifier))
  declarator: (identifier) ;)
 (declaration type: (primitive_type) declarator: (identifier) ;)
 (struct_specifier struct name: (type_identifier)
body: (field_declaration_list {
    (field_declaration
     type: (qualified_identifier scope: (namespace_identifier) :: name: 
(type_identifier))
     declarator: (field_identifier) ;)
    (field_declaration type: (primitive_type) declarator: (field_identifier) ;)
    }))
 ;
 (declaration type: (type_identifier)
declarator: (init_declarator declarator: (identifier) = value: (initializer_list {
      (string_literal " (string_content) ")
      , (true) }))
  ;)
 (expression_statement
  (assignment_expression
   left: (field_expression argument: (identifier) operator: . field: 
(field_identifier))
   operator: = right: (false))
  ;)
 (declaration type: (primitive_type)
declarator: (init_declarator declarator: (identifier) =
    value: (field_expression argument: (identifier) operator: . field: 
(field_identifier)))
  ;))

The faces are:

1. Inside the struct insert has: font-lock-property-name-face
   It says `declarator: (field_identifier)` and I thin is applying the
   function c-ts-mode--fontify-declarator.

2. In `keys.inserted = false;` the `insert` words has: 
font-lock-property-use-face
   It says `field: (field_identifier)` and applies (I think) :feature 'property

3. In `bool a = keys.inserted;` is not fontified.
   But it says `field: (field_identifier)` like in 2.


Hope this helps.
Ergus




reply via email to

[Prev in Thread] Current Thread [Next in Thread]