[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