1use {
2 std::{
3 iter::Cloned,
4 slice::Iter,
5 cell::{Cell, RefCell}
6 },
7 crate::{
8 makepad_live_id::*,
9 makepad_live_compiler::*,
10 makepad_live_compiler::makepad_live_tokenizer::Delim,
11 shader_ast::*,
12 shader_registry::{ShaderRegistry, LiveNodeFindResult}
13 }
14};
15
16#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, Ord, PartialOrd)]
17pub enum ShaderParserDep {
18 Struct(StructPtr),
19 Function(Option<StructPtr>, FnPtr)
20}
21
22pub struct ShaderParser<'a> {
23 pub token_index: usize,
24 pub dsl_expand_index: usize,
25 pub origin_file_id: LiveFileId,
26 pub tokens_with_span: Cloned<Iter<'a, TokenWithSpan >>,
27 pub live_registry: &'a LiveRegistry,
28 pub shader_registry: &'a ShaderRegistry,
29 pub type_deps: &'a mut Vec<ShaderParserDep>,
30 pub closure_defs: Vec<ClosureDef>,
31 pub token_with_span: TokenWithSpan,
32 pub self_kind: Option<FnSelfKind>,
33 pub end: TextPos,
34}
35
36impl<'a> ShaderParser<'a> {
37 pub fn new(
38 live_registry: &'a LiveRegistry,
39 shader_registry: &'a ShaderRegistry,
40 tokens: &'a [TokenWithSpan],
41 type_deps: &'a mut Vec<ShaderParserDep>,
42 self_kind: Option<FnSelfKind>,
43 dsl_expand_index: usize,
44 origin_file_id: LiveFileId,
45 token_start: usize
46 ) -> Self {
47 let mut tokens_with_span = tokens.iter().cloned();
48 let token_with_span = tokens_with_span.next().unwrap();
49 ShaderParser {
50 closure_defs: Vec::new(),
51 live_registry,
52 shader_registry,
53 dsl_expand_index,
54 origin_file_id,
55 type_deps,
56 tokens_with_span,
57 token_with_span,
58 token_index: token_start,
59 end: TextPos::default(),
60 self_kind
61 }
62 }
63}
64
65impl<'a> ShaderParser<'a> {
66
67 #[inline]
68 fn peek_span(&self) -> TextSpan {
69 self.token_with_span.span
70 }
71
72 #[inline]
73 fn peek_token(&self) -> LiveToken {
74 self.token_with_span.token.clone()
75 }
76
77 #[inline]
78 fn eat_token(&mut self) -> LiveToken {
79 let token = self.peek_token();
80 self.skip_token();
81 token
82 }
83
84 #[inline]
85 fn skip_token(&mut self) {
86 self.end = self.token_with_span.span.end;
87 if LiveToken::Eof == self.token_with_span.token {
88 return
89 }
90
91 if let Some(token_with_span) = self.tokens_with_span.next() {
92 self.token_with_span = token_with_span;
93 self.token_index += 1;
94 }
95 else {
96 self.token_with_span = TokenWithSpan {
97 span: self.token_with_span.span,
98 token: LiveToken::Eof
99 };
100 self.token_index += 1;
101 }
102 }
103
104 fn error(&mut self, origin: LiveErrorOrigin, message: String) -> LiveError {
105 LiveError {
106 origin,
107 span: self.token_with_span.span.into(),
108 message,
109 }
110 }
111
112 fn end(&self) -> TextPos {
113 self.end
114 }
115
116 fn token_end(&self) -> TextPos {
117 self.token_with_span.span.end
118 }
119
120 #[inline]
121 fn accept_ident(&mut self) -> Option<Ident> {
122 if let LiveToken::Ident(id) = self.peek_token() {
123 self.skip_token();
124 Some(Ident(id))
125 }
126 else {
127 None
128 }
129 }
130
131 fn expect_ident_path(&mut self) -> Result<IdentPath, LiveError> {
132 let mut ident_path = IdentPath::default();
133 let span = self.begin_span();
134 match self.peek_token() {
135 LiveToken::Ident(ident) => {
136 self.skip_token();
137 ident_path.push(Ident(ident));
138 },
139 token => {
140 return Err(span.error(self, live_error_origin!(), format!("expected ident_path, unexpected token `{}`", token)));
141 }
142 };
143
144 loop {
145 if !self.accept_token(LiveToken::Punct(live_id!(::))) {
146 return Ok(ident_path);
147 }
148 match self.peek_token() {
149 LiveToken::Ident(ident) => {
150 self.skip_token();
151 if !ident_path.push(Ident(ident)) {
152 return Err(span.error(self, live_error_origin!(), format!("identifier too long `{}`", ident_path)));
153 }
154 },
155 _ => {
156 return Ok(ident_path);
157 }
158 }
159 }
160 }
161
162 #[inline]
163 fn accept_token(&mut self, token: LiveToken) -> bool {
164 if self.peek_token() != token {
165 return false;
166 }
167 self.skip_token();
168 true
169 }
170
171 #[inline]
172 fn expect_ident(&mut self, live_error_origin: LiveErrorOrigin) -> Result<Ident, LiveError> {
173 match self.peek_token() {
174 LiveToken::Ident(id) => {
175 self.skip_token();
176 Ok(Ident(id))
177 }
178 token => Err(self.error(live_error_origin, format!("expected ident, unexpected token `{}`", token))),
179 }
180 }
181
182 #[inline]
183 fn expect_specific_ident(&mut self, specific_id: LiveId) -> Result<(), LiveError> {
184 match self.peek_token() {
185 LiveToken::Ident(id) if id == id => {
186 self.skip_token();
187 Ok(())
188 }
189 token => Err(self.error(live_error_origin!(), format!("expected ident {}, unexpected token `{}`", specific_id, token))),
190 }
191 }
192
193 #[inline]
194 fn expect_token(&mut self, expected: LiveToken) -> Result<(), LiveError> {
195 let actual = self.peek_token();
196 if actual != expected {
197 return Err(self.error(live_error_origin!(), format!("expected {} unexpected token `{}`", expected, actual)));
198 }
199 self.skip_token();
200 Ok(())
201 }
202
203 #[inline]
204 fn begin_span(&self) -> SpanTracker {
205 SpanTracker {
206 file_id: self.token_with_span.span.file_id,
207 start: self.token_with_span.span.start,
208 start_index: self.token_index
209 }
210 }
211
212 pub fn expect_self_decl(&mut self, ident: Ident, decl_node_ptr: LivePtr) -> Result<Option<DrawShaderFieldDef>, LiveError> {
214 let span = self.begin_span();
215 let decl_ty = self.expect_ident(live_error_origin!()) ?;
216 let decl_name = self.expect_ident(live_error_origin!()) ?;
217 if decl_name != ident {
218 panic!()
219 }
220 self.expect_token(LiveToken::Punct(live_id!(:))) ?;
221 let ty_expr = self.expect_ty_expr() ?;
223 match decl_ty {
224 Ident(live_id!(geometry)) => {
225 return span.end(self, | span | Ok(Some(DrawShaderFieldDef {
226 kind: DrawShaderFieldKind::Geometry {
227 is_used_in_pixel_shader: Cell::new(false),
228 var_def_ptr: Some(VarDefPtr(decl_node_ptr)),
229 },
230 span,
231 ident,
232 ty_expr
233 })))
234 }
235 Ident(live_id!(instance)) => {
236 return span.end(self, | span | Ok(Some(DrawShaderFieldDef {
237 kind: DrawShaderFieldKind::Instance {
238 is_used_in_pixel_shader: Cell::new(false),
239 live_field_kind: LiveFieldKind::Live,
240 var_def_ptr: Some(VarDefPtr(decl_node_ptr)),
241 },
243 span,
244 ident,
245 ty_expr
246 })))
247 }
248 Ident(live_id!(uniform)) => {
249 let block_ident = if self.accept_token(LiveToken::Ident(live_id!(in))) {
250 self.expect_ident(live_error_origin!()) ?
251 }
252 else {
253 Ident(live_id!(user))
254 };
255 return span.end(self, | span | Ok(Some(DrawShaderFieldDef {
256 kind: DrawShaderFieldKind::Uniform {
257 var_def_ptr: Some(VarDefPtr(decl_node_ptr)),
258 block_ident,
260 },
261 span,
262 ident,
263 ty_expr
264 })))
265 }
266 Ident(live_id!(varying)) => {
267 return span.end(self, | span | Ok(Some(DrawShaderFieldDef {
268 kind: DrawShaderFieldKind::Varying {
269 var_def_ptr: VarDefPtr(decl_node_ptr),
270 },
271 span,
272 ident,
273 ty_expr
274 })))
275 }
276 Ident(live_id!(texture)) => {
277 return span.end(self, | span | Ok(Some(DrawShaderFieldDef {
278 kind: DrawShaderFieldKind::Texture {
279 var_def_ptr: Some(VarDefPtr(decl_node_ptr)),
280 },
282 span,
283 ident,
284 ty_expr
285 })))
286 }
287 Ident(live_id!(const)) => {
288 return Ok(None)
289 }
290 _ => {
291 return Err(span.error(self, live_error_origin!(), format!("unexpected decl type `{}`", decl_ty)))
292 }
293 }
294 }
295
296 pub fn expect_const_def(&mut self, ident: Ident) -> Result<ConstDef, LiveError> {
298 let span = self.begin_span();
299 let decl_ty = self.expect_ident(live_error_origin!()) ?;
300 let decl_name = self.expect_ident(live_error_origin!()) ?;
301 if decl_name != ident {
302 panic!()
303 }
304 self.expect_token(LiveToken::Punct(live_id!(:))) ?;
305 let ty_expr = self.expect_ty_expr() ?;
307 self.expect_token(LiveToken::Punct(live_id!( =))) ?;
308
309 let expr = self.expect_expr() ?;
310
311 if decl_ty != Ident(live_id!(const)) {
312 panic!()
313 }
314
315 return span.end(self, | span | Ok(ConstDef {
317 span,
318 ident,
319 ty_expr,
320 expr
321 }))
322 }
323
324 pub fn expect_method_def(mut self, fn_ptr: FnPtr, outer_ident: Ident) -> Result<Option<FnDef>, LiveError> {
353
354 let span = self.begin_span();
355 self.expect_specific_ident(live_id!(fn)) ?;
356 let ident = self.expect_ident(live_error_origin!()) ?;
357 if ident != outer_ident {
358 panic!();
359 }
360 self.expect_token(LiveToken::Open(Delim::Paren)) ?;
361 let mut params = Vec::new();
362 if !self.accept_token(LiveToken::Close(Delim::Paren)) {
363
364 let span = self.begin_span();
365 let is_inout = self.accept_token(LiveToken::Ident(live_id!(inout)));
366
367 if self.peek_token() != LiveToken::Ident(live_id!(self)) {
368 return Ok(None)
369 }
370 self.skip_token();
371 let kind = self.self_kind.unwrap().to_ty_expr_kind();
374 params.push(span.end(&mut self, | span | Param {
375 span,
376 is_inout,
377 ident: Ident(live_id!(self)),
378 shadow: Cell::new(None),
379 ty_expr: TyExpr {
380 span,
381 ty: RefCell::new(None),
382 kind
383 },
384 }));
385
386 while self.accept_token(LiveToken::Punct(live_id!(,))) {
387 params.push(self.expect_param() ?);
388 }
389 self.expect_token(LiveToken::Close(Delim::Paren)) ?;
390 }
391 let return_ty_expr = if self.accept_token(LiveToken::Punct(live_id!( ->))) {
392 Some(self.expect_ty_expr() ?)
393 } else {
394 None
395 };
396 let block = self.expect_block() ?;
397 let self_kind = self.self_kind.clone();
398 let span = span.end(&mut self, | span | span);
399 Ok(Some(FnDef::new(
400 fn_ptr,
401 span,
402 ident,
403 self_kind,
404 params,
405 return_ty_expr,
406 block,
407 self.closure_defs
408 )))
409 }
410
411 pub fn expect_plain_fn_def(mut self, fn_ptr: FnPtr, outer_ident: Ident) -> Result<FnDef, LiveError> {
413 let span = self.begin_span();
414 self.expect_specific_ident(live_id!(fn)) ?;
415 let ident = self.expect_ident(live_error_origin!()) ?;
416 if ident != outer_ident {
417 panic!();
418 }
419 self.expect_token(LiveToken::Open(Delim::Paren)) ?;
420 let mut params = Vec::new();
421 if !self.accept_token(LiveToken::Close(Delim::Paren)) {
422 if self.peek_token() == LiveToken::Ident(live_id!(self)) {
423 return Err(span.error(&mut self, live_error_origin!(), format!("use of self not allowed in plain function")))
424 }
425 let param = self.expect_param() ?;
426
427 params.push(param);
428 while self.accept_token(LiveToken::Punct(live_id!(,))) {
429 params.push(self.expect_param() ?);
430 }
431 self.expect_token(LiveToken::Close(Delim::Paren)) ?;
432 }
433 let return_ty_expr = if self.accept_token(LiveToken::Punct(live_id!( ->))) {
434 Some(self.expect_ty_expr() ?)
435 } else {
436 None
437 };
438 let block = self.expect_block() ?;
439 let self_kind = self.self_kind.clone();
440 let span = span.end(&mut self, | span | span);
441 Ok(FnDef::new(
442 fn_ptr,
443 span,
444 ident,
445 self_kind,
446 params,
447 return_ty_expr,
448 block,
449 self.closure_defs
450 ))
451 }
452
453 fn expect_ty_expr(&mut self) -> Result<TyExpr, LiveError> {
454 let span = self.begin_span();
455 let mut acc = self.expect_prim_ty_expr() ?;
456 if self.accept_token(LiveToken::Open(Delim::Bracket)) {
457 let elem_ty_expr = Box::new(acc);
458 let token = self.peek_token();
459 if let Some(Lit::Int(len)) = Lit::from_token(&token) {
460 self.skip_token();
461 self.expect_token(LiveToken::Close(Delim::Bracket)) ?;
462 acc = span.end(self, | span | TyExpr {
463 ty: RefCell::new(None),
464 span,
465 kind: TyExprKind::Array {
466 elem_ty_expr,
467 len: len as u32,
468 },
469 });
470 }
471 else {
472 return Err(span.error(self, live_error_origin!(), format!("unexpected token `{}`", token)))
473 }
474 }
475 Ok(acc)
476 }
477
478 fn expect_prim_ty_expr(&mut self) -> Result<TyExpr, LiveError> {
479 let span = self.begin_span();
480 match self.peek_token() {
481 LiveToken::Ident(id) => {
482 if id == live_id!(fn) {
484 self.skip_token();
485 self.expect_token(LiveToken::Open(Delim::Paren)) ?;
487 let mut params = Vec::new();
488 if !self.accept_token(LiveToken::Close(Delim::Paren)) {
489 params.push(self.expect_param() ?);
490 while self.accept_token(LiveToken::Punct(live_id!(,))) {
491 params.push(self.expect_param() ?);
492 }
493 self.expect_token(LiveToken::Close(Delim::Paren)) ?;
494 }
495 let return_ty_expr = if self.accept_token(LiveToken::Punct(live_id!( ->))) {
496 Some(self.expect_ty_expr() ?)
497 } else {
498 None
499 };
500 Ok(span.end(self, | span | TyExpr {
501 ty: RefCell::new(None),
502 span,
503 kind: TyExprKind::ClosureDecl {
504 params,
505 return_ty: RefCell::new(None),
506 return_ty_expr: Box::new(return_ty_expr)
507 },
508 }))
509 }
510 else
511 if let Some(ty_lit) = TyLit::from_id(id) {
512 self.skip_token();
513 Ok(span.end(self, | span | TyExpr {
514 ty: RefCell::new(None),
515 span,
516 kind: TyExprKind::Lit {ty_lit: ty_lit},
517 }))
518 }
519 else {
520 if id == live_id!(Self) {
521 self.skip_token();
522 if let Some(FnSelfKind::Struct(struct_node_ptr)) = self.self_kind {
523 return Ok(span.end(self, | span | TyExpr {
524 span,
525 ty: RefCell::new(None),
526 kind: TyExprKind::Struct(struct_node_ptr),
527 }))
528 }
529 return Err(span.error(self, live_error_origin!(), "Use of Self not allowed here".to_string()));
530 }
531 let ident_path = self.expect_ident_path() ?;
534
535 if let Some(ptr) = self.live_registry.find_scope_ptr_via_expand_index(self.origin_file_id, self.dsl_expand_index, ident_path.segs[0]) {
536 match self.shader_registry.find_live_node_by_path(self.live_registry, ptr, &ident_path.segs[1..ident_path.len()]) {
537 LiveNodeFindResult::Error(err) => {
538 return Err(err)
539 }
540 LiveNodeFindResult::NotFound => {
541 return Err(span.error(self, live_error_origin!(), format!("Struct not found `{}`", ident_path)))
542 }
543 LiveNodeFindResult::Function(_)
544 | LiveNodeFindResult::Component(_)
545 | LiveNodeFindResult::LiveValue(_, _)
546 | LiveNodeFindResult::PossibleStatic(_, _) => {
547 return Err(span.error(self, live_error_origin!(), format!("Not a Struct type `{}`", ident_path)))
548 }
549 LiveNodeFindResult::Struct(struct_ptr) => {
550 self.type_deps.push(ShaderParserDep::Struct(struct_ptr));
552 return Ok(span.end(self, | span | TyExpr {
553 span,
554 ty: RefCell::new(None),
555 kind: TyExprKind::Struct(struct_ptr),
556 }))
557 }
558 }
559 }
560 else {
561 return Err(span.error(self, live_error_origin!(), format!("Cannot find type `{}`", ident_path).into()));
562 }
563 }
564 }
565 token => Err(span.error(self, live_error_origin!(), format!("unexpected token `{}`", token).into())),
566 }
567 }
568
569 fn expect_param(&mut self) -> Result<Param, LiveError> {
570 let span = self.begin_span();
571 let is_inout = self.accept_token(LiveToken::Ident(live_id!(inout)));
572 let ident = self.expect_ident(live_error_origin!()) ?;
573 self.expect_token(LiveToken::Punct(live_id!(:))) ?;
574 let ty_expr = self.expect_ty_expr() ?;
575 Ok(span.end(self, | span | Param {
576 shadow: Cell::new(None),
577 span,
578 is_inout,
579 ident,
580 ty_expr,
581 }))
582 }
583
584 fn expect_block(&mut self) -> Result<Block, LiveError> {
585 self.expect_token(LiveToken::Open(Delim::Brace)) ?;
586 let mut stmts = Vec::new();
587 while !self.accept_token(LiveToken::Close(Delim::Brace)) {
588 stmts.push(self.expect_stmt() ?);
589 }
590 Ok(Block {stmts})
591 }
592
593
594 fn expect_stmt(&mut self) -> Result<Stmt, LiveError> {
595 match self.peek_token() {
596 LiveToken::Ident(live_id!(break)) => self.expect_break_stmt(),
597 LiveToken::Ident(live_id!(continue)) => self.expect_continue_stmt(),
598 LiveToken::Ident(live_id!(for)) => self.expect_for_stmt(),
599 LiveToken::Ident(live_id!(if)) => self.expect_if_stmt(),
600 LiveToken::Ident(live_id!(match)) => self.expect_match_stmt(),
601 LiveToken::Ident(live_id!(let)) => self.expect_let_stmt(),
602 LiveToken::Ident(live_id!(return)) => self.expect_return_stmt(),
603 _ => self.expect_expr_stmt(),
604 }
605 }
606
607 fn expect_break_stmt(&mut self) -> Result<Stmt, LiveError> {
608 let span = self.begin_span();
609 self.expect_token(LiveToken::Ident(live_id!(break))) ?;
610 self.accept_optional_delim();
611 Ok(span.end(self, | span | Stmt::Break {span}))
613 }
614
615 fn expect_continue_stmt(&mut self) -> Result<Stmt, LiveError> {
616 let span = self.begin_span();
617 self.expect_token(LiveToken::Ident(live_id!(continue))) ?;
618 self.accept_optional_delim();
619 Ok(span.end(self, | span | Stmt::Continue {span}))
621 }
622
623 fn expect_for_stmt(&mut self) -> Result<Stmt, LiveError> {
624 let span = self.begin_span();
625 self.expect_token(LiveToken::Ident(live_id!(for))) ?;
626 let ident = self.expect_ident(live_error_origin!()) ?;
627
628 self.expect_token(LiveToken::Ident(live_id!(in))) ?;
629
630 let from_expr = self.expect_expr() ?;
631 self.expect_token(LiveToken::Punct(live_id!(..))) ?;
632 let to_expr = self.expect_expr() ?;
634 let step_expr = if self.accept_token(LiveToken::Ident(live_id!(step_by))) {
635 Some(self.expect_expr() ?)
636 } else {
637 None
638 };
639 let block = Box::new(self.expect_block() ?);
640 Ok(span.end(self, | span | Stmt::For {
641 span,
642 ident,
643 from_expr,
644 to_expr,
645 step_expr,
646 block,
647 }))
648 }
649
650
651 fn expect_if_stmt(&mut self) -> Result<Stmt, LiveError> {
652 let span = self.begin_span();
653 self.expect_token(LiveToken::Ident(live_id!(if))) ?;
654 let expr = self.expect_expr() ?;
655 let block_if_true = Box::new(self.expect_block() ?);
656 let block_if_false = if self.accept_token(LiveToken::Ident(live_id!(else))) {
657 if self.peek_token() == LiveToken::Ident(live_id!(if)) {
658 Some(Box::new(Block {
659 stmts: vec![self.expect_if_stmt() ?],
660 }))
661 } else {
662 Some(Box::new(self.expect_block() ?))
663 }
664 } else {
665 None
666 };
667 Ok(span.end(self, | span | Stmt::If {
668 span,
669 expr,
670 block_if_true,
671 block_if_false,
672 }))
673 }
674
675 fn expect_match_item(&mut self) -> Result<Match, LiveError> {
676 let span = self.begin_span();
677 let enum_name = self.expect_ident(live_error_origin!()) ?;
678 self.expect_token(LiveToken::Punct(live_id!(::))) ?;
679 let enum_variant = self.expect_ident(live_error_origin!()) ?;
680
681 self.expect_token(LiveToken::Punct(live_id!( =>))) ?;
682 let block = self.expect_block() ?;
683 Ok(span.end(self, | span | Match {
684 span,
685 enum_name,
686 enum_variant,
687 enum_value: Cell::new(None),
688 block
689 }))
690 }
691
692 fn expect_match_stmt(&mut self) -> Result<Stmt, LiveError> {
693 let span = self.begin_span();
694 self.expect_token(LiveToken::Ident(live_id!(match))) ?;
695
696 let expr = self.expect_expr() ?;
697
698 self.expect_token(LiveToken::Open(Delim::Brace)) ?;
700
701 let mut matches = Vec::new();
702 while !self.accept_token(LiveToken::Close(Delim::Brace)) {
703 matches.push(self.expect_match_item() ?);
704 }
705
706 Ok(span.end(self, | span | Stmt::Match {
707 span,
708 expr,
709 matches,
710 }))
711 }
712
713 fn expect_let_stmt(&mut self) -> Result<Stmt, LiveError> {
714 let span = self.begin_span();
715 self.expect_token(LiveToken::Ident(live_id!(let))) ?;
716 let ident = self.expect_ident(live_error_origin!()) ?;
717 let ty_expr = if self.accept_token(LiveToken::Punct(live_id!(:))) {
718 Some(self.expect_ty_expr() ?)
719 } else {
720 None
721 };
722 let expr = if self.accept_token(LiveToken::Punct(live_id!( =))) {
723 Some(self.expect_expr() ?)
724 } else {
725 None
726 };
727 self.accept_optional_delim();
728 Ok(span.end(self, | span | Stmt::Let {
730 span,
731 shadow: Cell::new(None),
732 ty: RefCell::new(None),
733 ident,
734 ty_expr,
735 expr,
736 }))
737 }
738
739 fn expect_return_stmt(&mut self) -> Result<Stmt, LiveError> {
740 let span = self.begin_span();
741 self.expect_token(LiveToken::Ident(live_id!(return))) ?;
742 let expr = if !self.accept_token(LiveToken::Punct(live_id!(;))) {
745 if self.peek_token() == LiveToken::Close(Delim::Brace) {
746 None
747 }
748 else {
749 let expr = self.expect_expr() ?;
750 self.accept_optional_delim();
751 Some(expr)
752 }
753 } else {
754 None
755 };
756 Ok(span.end(self, | span | Stmt::Return {span, expr}))
757 }
758
759 fn expect_expr_stmt(&mut self) -> Result<Stmt, LiveError> {
760 let span = self.begin_span();
761 let expr = self.expect_expr() ?;
762 self.accept_optional_delim();
763 Ok(span.end(self, | span | Stmt::Expr {span, expr}))
764 }
765
766 fn expect_expr(&mut self) -> Result<Expr, LiveError> {
767 self.expect_assign_expr()
768 }
769
770 fn expect_assign_expr(&mut self) -> Result<Expr, LiveError> {
771 let span = self.begin_span();
772 let expr = self.expect_cond_expr() ?;
773 Ok(if let Some(op) = BinOp::from_assign_op(self.peek_token()) {
774 self.skip_token();
775 let left_expr = Box::new(expr);
776 let right_expr = Box::new(self.expect_assign_expr() ?);
777 span.end(self, | span | Expr {
778 span,
779 ty: RefCell::new(None),
780 const_val: RefCell::new(None),
781 const_index: Cell::new(None),
782 kind: ExprKind::Bin {
783 span,
784 op,
785 left_expr,
786 right_expr,
787 },
788 })
789 } else {
790 expr
791 })
792 }
793
794
795 fn expect_cond_expr(&mut self) -> Result<Expr, LiveError> {
796 let span = self.begin_span();
797 let expr = self.expect_or_expr() ?;
798 Ok(if self.accept_token(LiveToken::Punct(live_id!( ?))) {
799 let expr = Box::new(expr);
800 let expr_if_true = Box::new(self.expect_expr() ?);
801 self.expect_token(LiveToken::Punct(live_id!(:))) ?;
802 let expr_if_false = Box::new(self.expect_cond_expr() ?);
803 span.end(self, | span | Expr {
804 span,
805 ty: RefCell::new(None),
806 const_val: RefCell::new(None),
807 const_index: Cell::new(None),
808 kind: ExprKind::Cond {
809 span,
810 expr,
811 expr_if_true,
812 expr_if_false,
813 },
814 })
815 } else {
816 expr
817 })
818 }
819
820
821 fn expect_or_expr(&mut self) -> Result<Expr, LiveError> {
822 let span = self.begin_span();
823 let mut acc = self.expect_and_expr() ?;
824 while let Some(op) = BinOp::from_or_op(self.peek_token()) {
825 self.skip_token();
826 let left_expr = Box::new(acc);
827 let right_expr = Box::new(self.expect_and_expr() ?);
828 acc = span.end(self, | span | Expr {
829 span,
830 ty: RefCell::new(None),
831 const_val: RefCell::new(None),
832 const_index: Cell::new(None),
833 kind: ExprKind::Bin {
834 span,
835 op,
836 left_expr,
837 right_expr,
838 },
839 });
840 }
841 Ok(acc)
842 }
843
844
845 fn expect_and_expr(&mut self) -> Result<Expr, LiveError> {
846 let span = self.begin_span();
847 let mut acc = self.expect_eq_expr() ?;
848 while let Some(op) = BinOp::from_and_op(self.peek_token()) {
849 self.skip_token();
850 let left_expr = Box::new(acc);
851 let right_expr = Box::new(self.expect_eq_expr() ?);
852 acc = span.end(self, | span | Expr {
853 span,
854 ty: RefCell::new(None),
855 const_val: RefCell::new(None),
856 const_index: Cell::new(None),
857 kind: ExprKind::Bin {
858 span,
859 op,
860 left_expr,
861 right_expr,
862 },
863 });
864 }
865 Ok(acc)
866 }
867
868
869 fn expect_eq_expr(&mut self) -> Result<Expr, LiveError> {
870 let span = self.begin_span();
871 let mut acc = self.expect_rel_expr() ?;
872 while let Some(op) = BinOp::from_eq_op(self.peek_token()) {
873 self.skip_token();
874 let left_expr = Box::new(acc);
875 let right_expr = Box::new(self.expect_rel_expr() ?);
876 acc = span.end(self, | span | Expr {
877 span,
878 ty: RefCell::new(None),
879 const_val: RefCell::new(None),
880 const_index: Cell::new(None),
881 kind: ExprKind::Bin {
882 span,
883 op,
884 left_expr,
885 right_expr,
886 },
887 });
888 }
889 Ok(acc)
890 }
891
892 fn expect_rel_expr(&mut self) -> Result<Expr, LiveError> {
893 let span = self.begin_span();
894 let mut acc = self.expect_add_expr() ?;
895 while let Some(op) = BinOp::from_rel_op(self.peek_token()) {
896 self.skip_token();
897 let left_expr = Box::new(acc);
898 let right_expr = Box::new(self.expect_add_expr() ?);
899 acc = span.end(self, | span | Expr {
900 span,
901 ty: RefCell::new(None),
902 const_val: RefCell::new(None),
903 const_index: Cell::new(None),
904 kind: ExprKind::Bin {
905 span,
906 op,
907 left_expr,
908 right_expr,
909 },
910 });
911 }
912 Ok(acc)
913 }
914
915 fn expect_add_expr(&mut self) -> Result<Expr, LiveError> {
916 let span = self.begin_span();
917 let mut acc = self.expect_mul_expr() ?;
918 while let Some(op) = BinOp::from_add_op(self.peek_token()) {
919 self.skip_token();
920 let left_expr = Box::new(acc);
921 let right_expr = Box::new(self.expect_mul_expr() ?);
922 acc = span.end(self, | span | Expr {
923 span,
924 ty: RefCell::new(None),
925 const_val: RefCell::new(None),
926 const_index: Cell::new(None),
927 kind: ExprKind::Bin {
928 span,
929 op,
930 left_expr,
931 right_expr,
932 },
933 });
934 }
935 Ok(acc)
936 }
937
938 fn expect_mul_expr(&mut self) -> Result<Expr, LiveError> {
939 let span = self.begin_span();
940 let mut acc = self.expect_un_expr() ?;
941 while let Some(op) = BinOp::from_mul_op(self.peek_token()) {
942 self.skip_token();
943 let left_expr = Box::new(acc);
944 let right_expr = Box::new(self.expect_un_expr() ?);
945 acc = span.end(self, | span | Expr {
946 span,
947 ty: RefCell::new(None),
948 const_val: RefCell::new(None),
949 const_index: Cell::new(None),
950 kind: ExprKind::Bin {
951 span,
952 op,
953 left_expr,
954 right_expr,
955 },
956 });
957 }
958 Ok(acc)
959 }
960
961 fn expect_un_expr(&mut self) -> Result<Expr, LiveError> {
962 let span = self.begin_span();
963 Ok(if let Some(op) = UnOp::from_un_op(self.peek_token()) {
964 self.skip_token();
965 let expr = Box::new(self.expect_un_expr() ?);
966 span.end(self, | span | Expr {
967 span,
968 ty: RefCell::new(None),
969 const_val: RefCell::new(None),
970 const_index: Cell::new(None),
971 kind: ExprKind::Un {span, op, expr},
972 })
973 } else {
974 self.expect_postfix_expr() ?
975 })
976 }
977
978 fn expect_postfix_expr(&mut self) -> Result<Expr, LiveError> {
979 let span = self.begin_span();
980 let mut acc = self.expect_prim_expr() ?;
981 loop {
982 match self.peek_token() {
983 LiveToken::Punct(live_id!(.)) => {
984 self.skip_token();
985 let ident = self.expect_ident(live_error_origin!()) ?;
986 acc = if self.accept_token(LiveToken::Open(Delim::Paren)) {
987 let mut arg_exprs = vec![acc];
988 if !self.accept_token(LiveToken::Close(Delim::Paren)) {
989 loop {
990 arg_exprs.push(self.expect_expr() ?);
991 if !self.accept_token(LiveToken::Punct(live_id!(,))) {
992 break;
993 }
994 }
995 self.expect_token(LiveToken::Close(Delim::Paren)) ?;
996 }
997 span.end(self, | span | Expr {
998 span,
999 ty: RefCell::new(None),
1000 const_val: RefCell::new(None),
1001 const_index: Cell::new(None),
1002 kind: ExprKind::MethodCall {
1003 span,
1004 ident,
1005 arg_exprs,
1006 closure_site_index: Cell::new(None)
1007 },
1008 })
1009 } else {
1010 let expr = Box::new(acc);
1011 span.end(self, | span | Expr {
1012 span,
1013 ty: RefCell::new(None),
1014 const_val: RefCell::new(None),
1015 const_index: Cell::new(None),
1016 kind: ExprKind::Field {
1017 span,
1018 expr,
1019 field_ident: ident,
1020 },
1021 })
1022 }
1023 }
1024 LiveToken::Close(Delim::Bracket) => {
1025 self.skip_token();
1026 let expr = Box::new(acc);
1027 let index_expr = Box::new(self.expect_expr() ?);
1028 self.expect_token(LiveToken::Close(Delim::Bracket)) ?;
1029 acc = span.end(self, | span | Expr {
1030 span,
1031 ty: RefCell::new(None),
1032 const_val: RefCell::new(None),
1033 const_index: Cell::new(None),
1034 kind: ExprKind::Index {
1035 span,
1036 expr,
1037 index_expr,
1038 },
1039 });
1040 }
1041 _ => break,
1042 }
1043 }
1044 Ok(acc)
1045 }
1046
1047
1048 fn expect_prim_expr(&mut self) -> Result<Expr, LiveError> {
1049 let span = self.begin_span();
1050 match self.peek_token() {
1051 LiveToken::Ident(ident) => {
1052 if let Some(ty_lit) = TyLit::from_id(ident) {
1053 self.skip_token();
1054 self.expect_token(LiveToken::Open(Delim::Paren)) ?;
1055 let mut arg_exprs = Vec::new();
1056 if !self.accept_token(LiveToken::Close(Delim::Paren)) {
1057 loop {
1058 arg_exprs.push(self.expect_expr() ?);
1059 if !self.accept_token(LiveToken::Punct(live_id!(,))) {
1060 break;
1061 }
1062 }
1063 self.expect_token(LiveToken::Close(Delim::Paren)) ?;
1064 }
1065 return Ok(span.end(self, | span | Expr {
1066 span,
1067 ty: RefCell::new(None),
1068 const_val: RefCell::new(None),
1069 const_index: Cell::new(None),
1070 kind: ExprKind::ConsCall {
1071 span,
1072 ty_lit,
1073 arg_exprs,
1074 },
1075 }))
1076 }
1077 else {
1078 let ident_path = self.expect_ident_path() ?;
1079 match self.peek_token() {
1080 LiveToken::Open(Delim::Brace) => { let struct_ptr = if ident_path.len() == 1 && ident_path.segs[0] == live_id!(Self) {
1083 if let Some(FnSelfKind::Struct(struct_node_ptr)) = self.self_kind {
1084 struct_node_ptr
1085 }
1086 else {
1087 return Err(span.error(self, live_error_origin!(), format!("Use of Self not allowed here").into()));
1088 }
1089 }
1090 else if let Some(ptr) = self.live_registry.find_scope_ptr_via_expand_index(self.origin_file_id, self.dsl_expand_index, ident_path.segs[0]) {
1091 match self.shader_registry.find_live_node_by_path(self.live_registry, ptr, &ident_path.segs[1..ident_path.len()]) {
1092 LiveNodeFindResult::Error(err) => {
1093 return Err(err)
1094 }
1095 LiveNodeFindResult::Struct(struct_ptr) => {
1096 self.type_deps.push(ShaderParserDep::Struct(struct_ptr));
1097 struct_ptr
1098 }
1099 LiveNodeFindResult::NotFound => {
1100 return Err(span.error(self, live_error_origin!(), format!("Struct not found `{}`", ident_path).into()))
1101 }
1102 LiveNodeFindResult::PossibleStatic(_, _)
1103 | LiveNodeFindResult::Function(_)
1104 | LiveNodeFindResult::Component(_)
1105 | LiveNodeFindResult::LiveValue(_, _) => {
1107 return Err(span.error(self, live_error_origin!(), format!("Not a struct `{}`", ident_path).into()))
1108 }
1109 }
1110 }
1111 else {
1112 return Err(span.error(self, live_error_origin!(), format!("Struct not found `{}`", ident_path).into()))
1113 };
1114
1115 self.skip_token();
1116 let mut args = Vec::new();
1117 loop {
1118 let name = self.expect_ident(live_error_origin!()) ?;
1119 self.expect_token(LiveToken::Punct(live_id!(:))) ?;
1120 let expr = self.expect_expr() ?;
1121 self.accept_token(LiveToken::Punct(live_id!(,)));
1122 args.push((name, expr));
1123 match self.peek_token() {
1125 LiveToken::Eof => {
1126 return Err(span.error(self, live_error_origin!(), format!("Unexpected Eof").into()))
1127 }
1128 LiveToken::Close(Delim::Brace) => {
1129 self.skip_token();
1130 return Ok(span.end(self, | span | Expr {
1131 span,
1132 ty: RefCell::new(None),
1133 const_val: RefCell::new(None),
1134 const_index: Cell::new(None),
1135 kind: ExprKind::StructCons {
1136 struct_ptr,
1137 span,
1138 args
1139 },
1140 }))
1141 }
1142 _ => ()
1143 }
1144
1145 }
1146 }
1147 LiveToken::Open(Delim::Paren) => {
1148 let arg_exprs = self.expect_arg_exprs() ?;
1149 if ident_path.len() == 1 && self.shader_registry.builtins.get(&Ident(ident_path.segs[0])).is_some() {
1150 Ok(span.end(self, | span | Expr {
1151 span,
1152 ty: RefCell::new(None),
1153 const_val: RefCell::new(None),
1154 const_index: Cell::new(None),
1155 kind: ExprKind::BuiltinCall {
1156 span,
1157 ident: Ident(ident_path.segs[0]),
1158 arg_exprs,
1159 },
1160 }))
1161 }
1162 else if let Some(ptr) = self.live_registry.find_scope_ptr_via_expand_index(self.origin_file_id, self.dsl_expand_index, ident_path.segs[0]) {
1163 match self.shader_registry.find_live_node_by_path(self.live_registry, ptr, &ident_path.segs[1..ident_path.len()]) {
1164 LiveNodeFindResult::Error(err) => {
1165 return Err(err)
1166 }
1167 LiveNodeFindResult::NotFound => {
1168 Err(span.error(self, live_error_origin!(), format!("Function not found `{}`", ident_path).into()))
1169 }
1170 LiveNodeFindResult::Component(_)
1171 | LiveNodeFindResult::Struct(_)
1172 | LiveNodeFindResult::LiveValue(_, _) => {
1174 Err(span.error(self, live_error_origin!(), format!("Not a function `{}`", ident_path).into()))
1175 }
1176 LiveNodeFindResult::Function(fn_ptr) => {
1177 self.type_deps.push(ShaderParserDep::Function(None, fn_ptr));
1178 Ok(span.end(self, | span | Expr {
1179 span,
1180 ty: RefCell::new(None),
1181 const_val: RefCell::new(None),
1182 const_index: Cell::new(None),
1183 kind: ExprKind::PlainCall {
1184 span,
1185 fn_ptr: Some(fn_ptr),
1186 ident: if ident_path.len() == 1 {Some(Ident(ident_path.segs[0]))}else {None},
1187 arg_exprs,
1188 param_index: Cell::new(None),
1189 closure_site_index: Cell::new(None),
1190 },
1191 }))
1192 }
1194 LiveNodeFindResult::PossibleStatic(struct_ptr, fn_ptr) => {
1195 self.type_deps.push(ShaderParserDep::Struct(struct_ptr));
1197 self.type_deps.push(ShaderParserDep::Function(Some(struct_ptr), fn_ptr));
1198 Ok(span.end(self, | span | Expr {
1199 span,
1200 ty: RefCell::new(None),
1201 const_val: RefCell::new(None),
1202 const_index: Cell::new(None),
1203 kind: ExprKind::PlainCall {
1204 span,
1205 ident: if ident_path.len() == 1 {Some(Ident(ident_path.segs[0]))}else {None},
1206 fn_ptr: Some(fn_ptr),
1207 arg_exprs,
1208 param_index: Cell::new(None),
1209 closure_site_index: Cell::new(None),
1210 },
1211 }))
1212 }
1214
1215 }
1216 }
1217 else if ident_path.len() == 1 {
1218 Ok(span.end(self, | span | Expr {
1220 span,
1221 ty: RefCell::new(None),
1222 const_val: RefCell::new(None),
1223 const_index: Cell::new(None),
1224 kind: ExprKind::PlainCall {
1225 span,
1226 ident: Some(Ident(ident_path.segs[0])),
1227 fn_ptr: None,
1228 arg_exprs,
1229 param_index: Cell::new(None),
1230 closure_site_index: Cell::new(None),
1231 },
1232 }))
1233 }
1234 else {
1235 Err(span.error(self, live_error_origin!(), format!("Call not found `{}`", ident_path).into()))
1236 }
1237 }
1238 _ => {
1239 let mut var_resolve = VarResolve::NotFound;
1242
1243 if let Some(ptr) = self.live_registry.find_scope_ptr_via_expand_index(self.origin_file_id, self.dsl_expand_index, ident_path.segs[0]) {
1244
1245 let find_result = self.shader_registry.find_live_node_by_path(self.live_registry, ptr, &ident_path.segs[1..ident_path.len()]);
1246 match find_result {
1247 LiveNodeFindResult::Error(err)=>{
1248 return Err(err)
1249 }
1250 LiveNodeFindResult::LiveValue(value_ptr, ty) => {
1251 var_resolve = VarResolve::LiveValue(value_ptr, ty);
1252 }
1253 LiveNodeFindResult::Function(fn_ptr) => {
1258 self.type_deps.push(ShaderParserDep::Function(None, fn_ptr));
1259 var_resolve = VarResolve::Function(fn_ptr);
1260 }
1261 _ => {}
1262 }
1263 }
1264 if let VarResolve::NotFound = var_resolve {
1265 if ident_path.len()>1 {
1266 return Err(span.error(self, live_error_origin!(), format!("Identifier not found `{}`", ident_path).into()))
1267 }
1268 }
1269
1270 Ok(span.end(self, | span | Expr {
1271 span,
1272 ty: RefCell::new(None),
1273 const_val: RefCell::new(None),
1274 const_index: Cell::new(None),
1275 kind: ExprKind::Var {
1276 ident: if ident_path.len()>1 {None} else {Some(Ident(ident_path.segs[0]))},
1277 span,
1278 var_resolve,
1279 kind: Cell::new(None),
1280 },
1281 }))
1282 },
1283 }
1284 }
1285 }
1286 LiveToken::Bool(v) => {
1287 self.skip_token();
1288 Ok(span.end(self, | span | Expr {
1289 span,
1290 ty: RefCell::new(None),
1291 const_val: RefCell::new(None),
1292 const_index: Cell::new(None),
1293 kind: ExprKind::Lit {span, lit: Lit::Bool(v)},
1294 }))
1295 }
1296 LiveToken::Int(v) => {
1297 self.skip_token();
1298 Ok(span.end(self, | span | Expr {
1299 span,
1300 ty: RefCell::new(None),
1301 const_val: RefCell::new(None),
1302 const_index: Cell::new(None),
1303 kind: ExprKind::Lit {span, lit: Lit::Float(v as f32)},
1304 }))
1305 }
1306 LiveToken::Float(v) => {
1307 self.skip_token();
1308 Ok(span.end(self, | span | Expr {
1309 span,
1310 ty: RefCell::new(None),
1311 const_val: RefCell::new(None),
1312 const_index: Cell::new(None),
1313 kind: ExprKind::Lit {span, lit: Lit::Float(v as f32)},
1314 }))
1315 }
1316 LiveToken::Color(v) => {
1317 self.skip_token();
1318 Ok(span.end(self, | span | Expr {
1319 span,
1320 ty: RefCell::new(None),
1321 const_val: RefCell::new(None),
1322 const_index: Cell::new(None),
1323 kind: ExprKind::Lit {span, lit: Lit::Color(v)},
1324 }))
1325 }
1326 LiveToken::Punct(live_id!( |)) => {
1327 self.skip_token();
1329 let mut params = Vec::new();
1330 if !self.accept_token(LiveToken::Punct(live_id!( |))) {
1331 loop {
1332 let span = self.begin_span();
1333 params.push(ClosureParam {
1334 ident: self.expect_ident(live_error_origin!()) ?,
1335 span: span.end(self, | span | span),
1336 shadow: Cell::new(None)
1337 });
1338 if !self.accept_token(LiveToken::Punct(live_id!(,))) {
1339 break;
1340 }
1341 }
1342 self.expect_token(LiveToken::Punct(live_id!( |))) ?;
1343 }
1344 if self.peek_token() == LiveToken::Open(Delim::Brace) {
1345 let block = self.expect_block() ?;
1346 let span = span.end(self, | span | span);
1347 let closure_def_index = ClosureDefIndex(self.closure_defs.len());
1348 self.closure_defs.push(ClosureDef {
1349 span,
1350 params,
1351 closed_over_syms: RefCell::new(None),
1352 kind: ClosureDefKind::Block(block)
1353 });
1354 Ok(Expr {
1355 span,
1356 ty: RefCell::new(None),
1357 const_val: RefCell::new(None),
1358 const_index: Cell::new(None),
1359 kind: ExprKind::ClosureDef(closure_def_index)
1360 })
1361 }
1362 else {
1363 let expr = self.expect_expr() ?;
1364 let span = span.end(self, | span | span);
1365 let closure_def_index = ClosureDefIndex(self.closure_defs.len());
1366 self.closure_defs.push(ClosureDef {
1367 span,
1368 params,
1369 closed_over_syms: RefCell::new(None),
1370 kind: ClosureDefKind::Expr(expr)
1371 });
1372 Ok(Expr {
1373 span,
1374 ty: RefCell::new(None),
1375 const_val: RefCell::new(None),
1376 const_index: Cell::new(None),
1377 kind: ExprKind::ClosureDef(closure_def_index)
1378 })
1379 }
1380 }
1381 LiveToken::Open(Delim::Paren) => {
1382 self.skip_token();
1383 let expr = self.expect_expr() ?;
1384 self.expect_token(LiveToken::Close(Delim::Paren)) ?;
1385 Ok(expr)
1386 }
1387 token => Err(span.error(self, live_error_origin!(), format!("unexpected token `{}`", token).into())),
1388 }
1389 }
1390
1391 fn expect_arg_exprs(&mut self) -> Result<Vec<Expr>, LiveError> {
1392 self.expect_token(LiveToken::Open(Delim::Paren)) ?;
1393 let mut arg_exprs = Vec::new();
1394 if !self.accept_token(LiveToken::Close(Delim::Paren)) {
1395 loop {
1396 arg_exprs.push(self.expect_expr() ?);
1397 if !self.accept_token(LiveToken::Punct(live_id!(,))) {
1398 break;
1399 }
1400 }
1401 self.expect_token(LiveToken::Close(Delim::Paren)) ?;
1402 }
1403 Ok(arg_exprs)
1404 }
1405
1406 pub fn accept_optional_delim(&mut self) {
1407 while self.accept_token(LiveToken::Punct(live_id!(;))) {};
1408 }
1409}
1410
1411
1412pub struct SpanTracker {
1413 pub file_id: LiveFileId,
1414 pub start: TextPos,
1415 pub start_index: usize,
1416}
1417
1418impl SpanTracker {
1419 pub fn end<F, R>(&self, parser: &mut ShaderParser, f: F) -> R
1420 where
1421 F: FnOnce(TokenSpan) -> R,
1422 {
1423 f(TokenSpan {
1424 token_id: LiveTokenId::new(self.file_id, self.start_index),
1425 len: parser.token_index - self.start_index
1426 })
1427 }
1428
1429 pub fn error(&self, parser: &mut ShaderParser, origin: LiveErrorOrigin, message: String) -> LiveError {
1430 LiveError {
1431 origin,
1432 span: TextSpan {
1433 file_id: self.file_id,
1434 start: self.start,
1435 end: parser.token_end(),
1436 }.into(),
1437 message,
1438 }
1439 }
1440}