@@ -396,10 +396,24 @@ impl Getter for RustCode {
396396 use Rust :: * ;
397397
398398 match node. kind_id ( ) . into ( ) {
399+ // `||` is treated as an operator only if it's part of a binary expression.
400+ // This prevents misclassification inside macros where closures without arguments (e.g., `let closure = || { /* ... */ };`)
401+ // are not recognized as `ClosureExpression` and their `||` node is identified as `PIPEPIPE` instead of `ClosureParameters`.
402+ //
403+ // Similarly, exclude `/` when it corresponds to the third slash in `///` (`OuterDocCommentMarker`)
404+ PIPEPIPE | SLASH => match node. parent ( ) {
405+ Some ( parent) if matches ! ( parent. kind_id( ) . into( ) , BinaryExpression ) => HalsteadType :: Operator ,
406+ _ => HalsteadType :: Unknown
407+ }
408+ // Ensure `!` is counted as an operator unless it belongs to an `InnerDocCommentMarker` `//!`
409+ BANG => match node. parent ( ) {
410+ Some ( parent) if !matches ! ( parent. kind_id( ) . into( ) , InnerDocCommentMarker ) => HalsteadType :: Operator ,
411+ _ => HalsteadType :: Unknown
412+ }
399413 LPAREN | LBRACE | LBRACK | EQGT | PLUS | STAR | Async | Await | Continue | For | If
400- | Let | Loop | Match | Return | Unsafe | While | BANG | EQ | COMMA | DASHGT | QMARK
401- | LT | GT | AMP | MutableSpecifier | DOTDOT | DOTDOTEQ | DASH | AMPAMP | PIPEPIPE
402- | PIPE | CARET | EQEQ | BANGEQ | LTEQ | GTEQ | LTLT | GTGT | SLASH | PERCENT
414+ | Let | Loop | Match | Return | Unsafe | While | EQ | COMMA | DASHGT | QMARK
415+ | LT | GT | AMP | MutableSpecifier | DOTDOT | DOTDOTEQ | DASH | AMPAMP
416+ | PIPE | CARET | EQEQ | BANGEQ | LTEQ | GTEQ | LTLT | GTGT | PERCENT
403417 | PLUSEQ | DASHEQ | STAREQ | SLASHEQ | PERCENTEQ | AMPEQ | PIPEEQ | CARETEQ
404418 | LTLTEQ | GTGTEQ | Move | DOT | PrimitiveType | Fn | SEMI => HalsteadType :: Operator ,
405419 Identifier | StringLiteral | RawStringLiteral | IntegerLiteral | FloatLiteral
@@ -478,13 +492,17 @@ impl Getter for CppCode {
478492 match node. kind_id ( ) . into ( ) {
479493 DOT | LPAREN | LPAREN2 | COMMA | STAR | GTGT | COLON | SEMI | Return | Break
480494 | Continue | If | Else | Switch | Case | Default | For | While | Goto | Do | Delete
481- | New | Try | Catch | Throw | EQ | AMPAMP | PIPEPIPE | DASH | DASHDASH | DASHGT
495+ | New | Try | Try2 | Catch | Throw | EQ | AMPAMP | PIPEPIPE | DASH | DASHDASH | DASHGT
482496 | PLUS | PLUSPLUS | SLASH | PERCENT | PIPE | AMP | LTLT | TILDE | LT | LTEQ | EQEQ
483497 | BANGEQ | GTEQ | GT | GT2 | PLUSEQ | BANG | STAREQ | SLASHEQ | PERCENTEQ | GTGTEQ
484498 | LTLTEQ | AMPEQ | CARET | CARETEQ | PIPEEQ | LBRACK | LBRACE | QMARK | COLONCOLON
485499 | PrimitiveType | TypeSpecifier | Sizeof => HalsteadType :: Operator ,
486500 Identifier | TypeIdentifier | FieldIdentifier | RawStringLiteral | StringLiteral
487- | NumberLiteral | True | False | Null | Nullptr | DOTDOTDOT => HalsteadType :: Operand ,
501+ | NumberLiteral | True | False | Null | DOTDOTDOT => HalsteadType :: Operand ,
502+ NamespaceIdentifier => match node. parent ( ) {
503+ Some ( parent) if matches ! ( parent. kind_id( ) . into( ) , NamespaceDefinition ) => HalsteadType :: Operand ,
504+ _ => HalsteadType :: Unknown ,
505+ } ,
488506 _ => HalsteadType :: Unknown ,
489507 }
490508 }
0 commit comments