MCPcopy Create free account
hub / github.com/dylan-sutton-chavez/edge-python / name_stmt

Method name_stmt

compiler/src/modules/parser/stmt.rs:366–556  ·  view source on GitHub ↗

Name-led statement: assign, augmented-op, attr, index, call, or tuple unpack. */

(&mut self, t: Token)

Source from the content-addressed store, hash-verified

364
365 /* Name-led statement: assign, augmented-op, attr, index, call, or tuple unpack. */
366 pub(super) fn name_stmt(&mut self, t: Token) -> bool {
367 let name = self.lexeme(&t).to_string();
368
369 if self.eat_if(TokenType::Colon) && !self.skip_annotation() {
370 return false;
371 }
372
373 match self.peek() {
374 Some(TokenType::Equal) => {
375 self.assign(name);
376 false
377 }
378 Some(t) if Self::augmented_op(&t).is_some() => {
379 let op = Self::augmented_op(&t).unwrap();
380 self.advance();
381 self.emit_load_ssa(name.clone());
382 self.expr();
383 // In-place variants so list `+=` and set `|=`/`&=`/`^=` mutate the shared object (alias-visible).
384 let op = match op {
385 OpCode::Add => OpCode::InPlaceAdd,
386 OpCode::BitOr => OpCode::InPlaceBitOr,
387 OpCode::BitAnd => OpCode::InPlaceBitAnd,
388 OpCode::BitXor => OpCode::InPlaceBitXor,
389 other => other,
390 };
391 self.chunk.emit(op, 0);
392 self.store_name(name);
393 false
394 }
395 Some(TokenType::Lsqb) => {
396 self.emit_load_ssa(name);
397 self.advance();
398 // Slice form: BuildSlice+StoreItem; runtime recognises HeapObj::Slice as splice index.
399 if self.parse_subscript() {
400 if matches!(self.peek(), Some(TokenType::Equal)) {
401 self.advance();
402 self.expr();
403 self.chunk.emit(OpCode::StoreItem, 0);
404 return false;
405 }
406 self.chunk.emit(OpCode::GetItem, 0);
407 self.expr_tails();
408 return true;
409 }
410 if matches!(self.peek(), Some(TokenType::Equal)) {
411 self.advance();
412 self.expr();
413 self.chunk.emit(OpCode::StoreItem, 0);
414 false
415 } else if let Some(op) = self.peek().and_then(|t| Self::augmented_op(&t)) {
416 self.emit_augmented_subscript(op);
417 false
418 } else {
419 self.chunk.emit(OpCode::GetItem, 0);
420 self.expr_tails();
421 true
422 }
423 }

Callers 1

stmtMethod · 0.80

Calls 15

pack_callFunction · 0.85
lexemeMethod · 0.80
eat_ifMethod · 0.80
skip_annotationMethod · 0.80
assignMethod · 0.80
advanceMethod · 0.80
emit_load_ssaMethod · 0.80
exprMethod · 0.80
emitMethod · 0.80
store_nameMethod · 0.80
parse_subscriptMethod · 0.80
expr_tailsMethod · 0.80

Tested by

no test coverage detected