about summary refs log tree commit diff
path: root/src/tools/rust-analyzer/crates/parser
diff options
context:
space:
mode:
authorLukas Wirth <lukastw97@gmail.com>2024-09-05 12:40:41 +0200
committerLukas Wirth <lukastw97@gmail.com>2024-09-05 12:40:48 +0200
commitf3b6965f90e764fc29ff627a6965ccfc68d38ead (patch)
tree25dc9463dc851470d0651309d8028c92475e75e4 /src/tools/rust-analyzer/crates/parser
parent304f54e023cf5784163a319b22316950c71c58f2 (diff)
Give InlineAsmOperand a HIR representation
Diffstat (limited to 'src/tools/rust-analyzer/crates/parser')
-rw-r--r--src/tools/rust-analyzer/crates/parser/src/grammar/expressions/atom.rs16
-rw-r--r--src/tools/rust-analyzer/crates/parser/src/syntax_kind/generated.rs2
-rw-r--r--src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/asm_expr.rast52
3 files changed, 41 insertions, 29 deletions
diff --git a/src/tools/rust-analyzer/crates/parser/src/grammar/expressions/atom.rs b/src/tools/rust-analyzer/crates/parser/src/grammar/expressions/atom.rs
index d6ccf38e743..39ca26fc508 100644
--- a/src/tools/rust-analyzer/crates/parser/src/grammar/expressions/atom.rs
+++ b/src/tools/rust-analyzer/crates/parser/src/grammar/expressions/atom.rs
@@ -329,11 +329,11 @@ fn parse_asm_expr(p: &mut Parser<'_>, m: Marker) -> Option<CompletedMarker> {
             break;
         }
 
-        let op = p.start();
+        let op_n = p.start();
         // Parse clobber_abi
         if p.eat_contextual_kw(T![clobber_abi]) {
             parse_clobber_abi(p);
-            op.complete(p, ASM_CLOBBER_ABI);
+            op_n.complete(p, ASM_CLOBBER_ABI);
             allow_templates = false;
             continue;
         }
@@ -341,7 +341,7 @@ fn parse_asm_expr(p: &mut Parser<'_>, m: Marker) -> Option<CompletedMarker> {
         // Parse options
         if p.eat_contextual_kw(T![options]) {
             parse_options(p);
-            op.complete(p, ASM_OPTIONS);
+            op_n.complete(p, ASM_OPTIONS);
             allow_templates = false;
             continue;
         }
@@ -356,12 +356,14 @@ fn parse_asm_expr(p: &mut Parser<'_>, m: Marker) -> Option<CompletedMarker> {
             false
         };
 
+        let op = p.start();
         let dir_spec = p.start();
         if p.eat(T![in]) || p.eat_contextual_kw(T![out]) || p.eat_contextual_kw(T![lateout]) {
             dir_spec.complete(p, ASM_DIR_SPEC);
             parse_reg(p);
             expr(p);
             op.complete(p, ASM_REG_OPERAND);
+            op_n.complete(p, ASM_OPERAND_NAMED);
         } else if p.eat_contextual_kw(T![inout]) || p.eat_contextual_kw(T![inlateout]) {
             dir_spec.complete(p, ASM_DIR_SPEC);
             parse_reg(p);
@@ -370,21 +372,26 @@ fn parse_asm_expr(p: &mut Parser<'_>, m: Marker) -> Option<CompletedMarker> {
                 expr(p);
             }
             op.complete(p, ASM_REG_OPERAND);
+            op_n.complete(p, ASM_OPERAND_NAMED);
         } else if p.eat_contextual_kw(T![label]) {
             dir_spec.abandon(p);
             block_expr(p);
-            op.complete(p, ASM_LABEL);
+            op.complete(p, ASM_OPERAND_NAMED);
+            op_n.complete(p, ASM_LABEL);
         } else if p.eat(T![const]) {
             dir_spec.abandon(p);
             expr(p);
             op.complete(p, ASM_CONST);
+            op_n.complete(p, ASM_OPERAND_NAMED);
         } else if p.eat_contextual_kw(T![sym]) {
             dir_spec.abandon(p);
             paths::type_path(p);
             op.complete(p, ASM_SYM);
+            op_n.complete(p, ASM_OPERAND_NAMED);
         } else if allow_templates {
             dir_spec.abandon(p);
             op.abandon(p);
+            op_n.abandon(p);
             if expr(p).is_none() {
                 p.err_and_bump("expected asm template");
             }
@@ -392,6 +399,7 @@ fn parse_asm_expr(p: &mut Parser<'_>, m: Marker) -> Option<CompletedMarker> {
         } else {
             dir_spec.abandon(p);
             op.abandon(p);
+            op_n.abandon(p);
             p.err_and_bump("expected asm operand");
             if p.at(T!['}']) {
                 break;
diff --git a/src/tools/rust-analyzer/crates/parser/src/syntax_kind/generated.rs b/src/tools/rust-analyzer/crates/parser/src/syntax_kind/generated.rs
index ee3adac158f..288a07ef44d 100644
--- a/src/tools/rust-analyzer/crates/parser/src/syntax_kind/generated.rs
+++ b/src/tools/rust-analyzer/crates/parser/src/syntax_kind/generated.rs
@@ -169,8 +169,10 @@ pub enum SyntaxKind {
     ASM_LABEL,
     ASM_OPERAND,
     ASM_OPERAND_EXPR,
+    ASM_OPERAND_NAMED,
     ASM_OPTION,
     ASM_OPTIONS,
+    ASM_PIECE,
     ASM_REG_OPERAND,
     ASM_REG_SPEC,
     ASM_SYM,
diff --git a/src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/asm_expr.rast b/src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/asm_expr.rast
index 2360135db7c..4afa9daf590 100644
--- a/src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/asm_expr.rast
+++ b/src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/asm_expr.rast
@@ -35,43 +35,45 @@ SOURCE_FILE
               STRING "\"add {x}, {tmp}\""
             COMMA ","
             WHITESPACE "\n        "
-            ASM_REG_OPERAND
+            ASM_OPERAND_NAMED
               NAME
                 IDENT "x"
               WHITESPACE " "
               EQ "="
               WHITESPACE " "
-              ASM_DIR_SPEC
-                INOUT_KW "inout"
-              L_PAREN "("
-              ASM_REG_SPEC
-                NAME_REF
-                  IDENT "reg"
-              R_PAREN ")"
-              WHITESPACE " "
-              PATH_EXPR
-                PATH
-                  PATH_SEGMENT
-                    NAME_REF
-                      IDENT "x"
+              ASM_REG_OPERAND
+                ASM_DIR_SPEC
+                  INOUT_KW "inout"
+                L_PAREN "("
+                ASM_REG_SPEC
+                  NAME_REF
+                    IDENT "reg"
+                R_PAREN ")"
+                WHITESPACE " "
+                PATH_EXPR
+                  PATH
+                    PATH_SEGMENT
+                      NAME_REF
+                        IDENT "x"
             COMMA ","
             WHITESPACE "\n        "
-            ASM_REG_OPERAND
+            ASM_OPERAND_NAMED
               NAME
                 IDENT "tmp"
               WHITESPACE " "
               EQ "="
               WHITESPACE " "
-              ASM_DIR_SPEC
-                OUT_KW "out"
-              L_PAREN "("
-              ASM_REG_SPEC
-                NAME_REF
-                  IDENT "reg"
-              R_PAREN ")"
-              WHITESPACE " "
-              UNDERSCORE_EXPR
-                UNDERSCORE "_"
+              ASM_REG_OPERAND
+                ASM_DIR_SPEC
+                  OUT_KW "out"
+                L_PAREN "("
+                ASM_REG_SPEC
+                  NAME_REF
+                    IDENT "reg"
+                R_PAREN ")"
+                WHITESPACE " "
+                UNDERSCORE_EXPR
+                  UNDERSCORE "_"
             COMMA ","
             WHITESPACE "\n    "
             R_PAREN ")"