Subject: bug#59234: CC Mode 5.35.2 (ObjC//l); Random fontification of nsterm.m

From: Alan Mackenzie <[email-masked]>
Date: Sun, 13 Nov 2022 19:46:44 +0000

Hello, Po.

On Sun, Nov 13, 2022 at 11:13:02 +0800, Po Lu via CC-Mode-help wrote:
> Package: cc-mode

> If you go to src/nsterm.m, around line 4020 there should be the
> following code:

> static void
> ns_draw_stretch_glyph_string (struct glyph_string *s)
> {
>   struct face *face;
>   NSColor *fg_color;

>   if (s->hl == DRAW_CURSOR
>       && !x_stretch_cursor_p)
>     {
>       /* If `x-stretch-cursor' is nil, don't draw a block cursor as
> 	 wide as the stretch glyph.  */
>       int width, background_width = s->background_width;
>       int x = s->x;

>       if (!s->row->reversed_p)
> 	{
> 	  int left_x = window_box_left_offset (s->w, TEXT_AREA);

> 	  if (x < left_x)
> 	    {
> 	      background_width -= left_x - x;
> 	      x = left_x;
> 	    }
> 	}
>       else
> 	{

> in it, "width" and "background_width" are seemingly randomly fontified
> as types.  Then, if you scroll up to line 3658, you will see the
> following code:

>       if (left_p && top_p)
> 	[NSBezierPath fillRect: NSMakeRect (NSMinX (outer),
> 					    NSMinY (outer),
> 					    1, 1)];

>       if (right_p && top_p)
> 	[NSBezierPath fillRect: NSMakeRect (NSMaxX (outer) - 1,
> 					    NSMinY (outer),
> 					    1, 1)];

>       if (right_p && bottom_p)
> 	[NSBezierPath fillRect: NSMakeRect (NSMaxX (outer) - 1,
> 					    NSMaxY (outer) - 1,
> 					    1, 1)];

>       if (left_p && bottom_p)
> 	[NSBezierPath fillRect: NSMakeRect (NSMinX (outer),
> 					    NSMaxY (outer) - 1,
> 					    1, 1)];

> NSBezierPath is a type, and is correctly fontified, but NSMinX and
> NSMaxX (and their Y variants) are functions, yet are fontified as types.

The problem here is the setting of the customisable variable
objc-font-lock-extra-types.  In Objective C's case, it causes all
identifiers beginning with an upper case letter and containing a lower
case letter to be recognised as types.

This is clearly not satisfactory, even if it was OK a long time ago.

I would recommend you to customize this variable to nil.  Note that CC
Mode internal stuff gets set up at an early stage of Objective C Mode's
initialisation, before buffer local variables or .dir-local.el get
processed.  So trying to change it in these places won't work (believe
me, I've tried ;-).

I'll try and think up a more satisfactory solution.

> Thanks.

> Emacs  : GNU Emacs 29.0.50 (build 1, x86_64-pc-linux-gnu)
>  of 2022-11-12
> Package: CC Mode 5.35.2 (ObjC//l)
> Buffer Style: GNU
> c-emacs-features: (pps-extended-state col-0-paren posix-char-classes gen-string-delim gen-comment-delim syntax-properties category-properties 1-bit)

[ .... ]

-- 
Alan Mackenzie (Nuremberg, Germany).