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 self.accept_token(LiveToken::Ident(live_id!(mut)));
717 let ident = self.expect_ident(live_error_origin!()) ?;
718
719 let ty_expr = if self.accept_token(LiveToken::Punct(live_id!(:))) {
720 Some(self.expect_ty_expr() ?)
721 } else {
722 None
723 };
724 let expr = if self.accept_token(LiveToken::Punct(live_id!( =))) {
725 Some(self.expect_expr() ?)
726 } else {
727 None
728 };
729 self.accept_optional_delim();
730 Ok(span.end(self, | span | Stmt::Let {
732 span,
733 shadow: Cell::new(None),
734 ty: RefCell::new(None),
735 ident,
736 ty_expr,
737 expr,
738 }))
739 }
740
741 fn expect_return_stmt(&mut self) -> Result<Stmt, LiveError> {
742 let span = self.begin_span();
743 self.expect_token(LiveToken::Ident(live_id!(return))) ?;
744 let expr = if !self.accept_token(LiveToken::Punct(live_id!(;))) {
747 if self.peek_token() == LiveToken::Close(Delim::Brace) {
748 None
749 }
750 else {
751 let expr = self.expect_expr() ?;
752 self.accept_optional_delim();
753 Some(expr)
754 }
755 } else {
756 None
757 };
758 Ok(span.end(self, | span | Stmt::Return {span, expr}))
759 }
760
761 fn expect_expr_stmt(&mut self) -> Result<Stmt, LiveError> {
762 let span = self.begin_span();
763 let expr = self.expect_expr() ?;
764 self.accept_optional_delim();
765 Ok(span.end(self, | span | Stmt::Expr {span, expr}))
766 }
767
768 fn expect_expr(&mut self) -> Result<Expr, LiveError> {
769 self.expect_assign_expr()
770 }
771
772 fn expect_assign_expr(&mut self) -> Result<Expr, LiveError> {
773 let span = self.begin_span();
774 let expr = self.expect_cond_expr() ?;
775 Ok(if let Some(op) = BinOp::from_assign_op(self.peek_token()) {
776 self.skip_token();
777 let left_expr = Box::new(expr);
778 let right_expr = Box::new(self.expect_assign_expr() ?);
779 span.end(self, | span | Expr {
780 span,
781 ty: RefCell::new(None),
782 const_val: RefCell::new(None),
783 const_index: Cell::new(None),
784 kind: ExprKind::Bin {
785 span,
786 op,
787 left_expr,
788 right_expr,
789 },
790 })
791 } else {
792 expr
793 })
794 }
795
796
797 fn expect_cond_expr(&mut self) -> Result<Expr, LiveError> {
798 let span = self.begin_span();
799 let expr = self.expect_or_expr() ?;
800 Ok(if self.accept_token(LiveToken::Punct(live_id!( ?))) {
801 let expr = Box::new(expr);
802 let expr_if_true = Box::new(self.expect_expr() ?);
803 self.expect_token(LiveToken::Punct(live_id!(:))) ?;
804 let expr_if_false = Box::new(self.expect_cond_expr() ?);
805 span.end(self, | span | Expr {
806 span,
807 ty: RefCell::new(None),
808 const_val: RefCell::new(None),
809 const_index: Cell::new(None),
810 kind: ExprKind::Cond {
811 span,
812 expr,
813 expr_if_true,
814 expr_if_false,
815 },
816 })
817 } else {
818 expr
819 })
820 }
821
822
823 fn expect_or_expr(&mut self) -> Result<Expr, LiveError> {
824 let span = self.begin_span();
825 let mut acc = self.expect_and_expr() ?;
826 while let Some(op) = BinOp::from_or_op(self.peek_token()) {
827 self.skip_token();
828 let left_expr = Box::new(acc);
829 let right_expr = Box::new(self.expect_and_expr() ?);
830 acc = span.end(self, | span | Expr {
831 span,
832 ty: RefCell::new(None),
833 const_val: RefCell::new(None),
834 const_index: Cell::new(None),
835 kind: ExprKind::Bin {
836 span,
837 op,
838 left_expr,
839 right_expr,
840 },
841 });
842 }
843 Ok(acc)
844 }
845
846
847 fn expect_and_expr(&mut self) -> Result<Expr, LiveError> {
848 let span = self.begin_span();
849 let mut acc = self.expect_eq_expr() ?;
850 while let Some(op) = BinOp::from_and_op(self.peek_token()) {
851 self.skip_token();
852 let left_expr = Box::new(acc);
853 let right_expr = Box::new(self.expect_eq_expr() ?);
854 acc = span.end(self, | span | Expr {
855 span,
856 ty: RefCell::new(None),
857 const_val: RefCell::new(None),
858 const_index: Cell::new(None),
859 kind: ExprKind::Bin {
860 span,
861 op,
862 left_expr,
863 right_expr,
864 },
865 });
866 }
867 Ok(acc)
868 }
869
870
871 fn expect_eq_expr(&mut self) -> Result<Expr, LiveError> {
872 let span = self.begin_span();
873 let mut acc = self.expect_rel_expr() ?;
874 while let Some(op) = BinOp::from_eq_op(self.peek_token()) {
875 self.skip_token();
876 let left_expr = Box::new(acc);
877 let right_expr = Box::new(self.expect_rel_expr() ?);
878 acc = span.end(self, | span | Expr {
879 span,
880 ty: RefCell::new(None),
881 const_val: RefCell::new(None),
882 const_index: Cell::new(None),
883 kind: ExprKind::Bin {
884 span,
885 op,
886 left_expr,
887 right_expr,
888 },
889 });
890 }
891 Ok(acc)
892 }
893
894 fn expect_rel_expr(&mut self) -> Result<Expr, LiveError> {
895 let span = self.begin_span();
896 let mut acc = self.expect_add_expr() ?;
897 while let Some(op) = BinOp::from_rel_op(self.peek_token()) {
898 self.skip_token();
899 let left_expr = Box::new(acc);
900 let right_expr = Box::new(self.expect_add_expr() ?);
901 acc = span.end(self, | span | Expr {
902 span,
903 ty: RefCell::new(None),
904 const_val: RefCell::new(None),
905 const_index: Cell::new(None),
906 kind: ExprKind::Bin {
907 span,
908 op,
909 left_expr,
910 right_expr,
911 },
912 });
913 }
914 Ok(acc)
915 }
916
917 fn expect_add_expr(&mut self) -> Result<Expr, LiveError> {
918 let span = self.begin_span();
919 let mut acc = self.expect_mul_expr() ?;
920 while let Some(op) = BinOp::from_add_op(self.peek_token()) {
921 self.skip_token();
922 let left_expr = Box::new(acc);
923 let right_expr = Box::new(self.expect_mul_expr() ?);
924 acc = span.end(self, | span | Expr {
925 span,
926 ty: RefCell::new(None),
927 const_val: RefCell::new(None),
928 const_index: Cell::new(None),
929 kind: ExprKind::Bin {
930 span,
931 op,
932 left_expr,
933 right_expr,
934 },
935 });
936 }
937 Ok(acc)
938 }
939
940 fn expect_mul_expr(&mut self) -> Result<Expr, LiveError> {
941 let span = self.begin_span();
942 let mut acc = self.expect_un_expr() ?;
943 while let Some(op) = BinOp::from_mul_op(self.peek_token()) {
944 self.skip_token();
945 let left_expr = Box::new(acc);
946 let right_expr = Box::new(self.expect_un_expr() ?);
947 acc = span.end(self, | span | Expr {
948 span,
949 ty: RefCell::new(None),
950 const_val: RefCell::new(None),
951 const_index: Cell::new(None),
952 kind: ExprKind::Bin {
953 span,
954 op,
955 left_expr,
956 right_expr,
957 },
958 });
959 }
960 Ok(acc)
961 }
962
963 fn expect_un_expr(&mut self) -> Result<Expr, LiveError> {
964 let span = self.begin_span();
965 Ok(if let Some(op) = UnOp::from_un_op(self.peek_token()) {
966 self.skip_token();
967 let expr = Box::new(self.expect_un_expr() ?);
968 span.end(self, | span | Expr {
969 span,
970 ty: RefCell::new(None),
971 const_val: RefCell::new(None),
972 const_index: Cell::new(None),
973 kind: ExprKind::Un {span, op, expr},
974 })
975 } else {
976 self.expect_postfix_expr() ?
977 })
978 }
979
980 fn expect_postfix_expr(&mut self) -> Result<Expr, LiveError> {
981 let span = self.begin_span();
982 let mut acc = self.expect_prim_expr() ?;
983 loop {
984 match self.peek_token() {
985 LiveToken::Punct(live_id!(.)) => {
986 self.skip_token();
987 let ident = self.expect_ident(live_error_origin!()) ?;
988 acc = if self.accept_token(LiveToken::Open(Delim::Paren)) {
989 let mut arg_exprs = vec![acc];
990 if !self.accept_token(LiveToken::Close(Delim::Paren)) {
991 loop {
992 arg_exprs.push(self.expect_expr() ?);
993 if !self.accept_token(LiveToken::Punct(live_id!(,))) {
994 break;
995 }
996 }
997 self.expect_token(LiveToken::Close(Delim::Paren)) ?;
998 }
999 span.end(self, | span | Expr {
1000 span,
1001 ty: RefCell::new(None),
1002 const_val: RefCell::new(None),
1003 const_index: Cell::new(None),
1004 kind: ExprKind::MethodCall {
1005 span,
1006 ident,
1007 arg_exprs,
1008 closure_site_index: Cell::new(None)
1009 },
1010 })
1011 } else {
1012 let expr = Box::new(acc);
1013 span.end(self, | span | Expr {
1014 span,
1015 ty: RefCell::new(None),
1016 const_val: RefCell::new(None),
1017 const_index: Cell::new(None),
1018 kind: ExprKind::Field {
1019 span,
1020 expr,
1021 field_ident: ident,
1022 },
1023 })
1024 }
1025 }
1026 LiveToken::Close(Delim::Bracket) => {
1027 self.skip_token();
1028 let expr = Box::new(acc);
1029 let index_expr = Box::new(self.expect_expr() ?);
1030 self.expect_token(LiveToken::Close(Delim::Bracket)) ?;
1031 acc = span.end(self, | span | Expr {
1032 span,
1033 ty: RefCell::new(None),
1034 const_val: RefCell::new(None),
1035 const_index: Cell::new(None),
1036 kind: ExprKind::Index {
1037 span,
1038 expr,
1039 index_expr,
1040 },
1041 });
1042 }
1043 _ => break,
1044 }
1045 }
1046 Ok(acc)
1047 }
1048
1049
1050 fn expect_prim_expr(&mut self) -> Result<Expr, LiveError> {
1051 let span = self.begin_span();
1052 match self.peek_token() {
1053 LiveToken::Ident(ident) => {
1054 if let Some(ty_lit) = TyLit::from_id(ident) {
1055 self.skip_token();
1056 self.expect_token(LiveToken::Open(Delim::Paren)) ?;
1057 let mut arg_exprs = Vec::new();
1058 if !self.accept_token(LiveToken::Close(Delim::Paren)) {
1059 loop {
1060 arg_exprs.push(self.expect_expr() ?);
1061 if !self.accept_token(LiveToken::Punct(live_id!(,))) {
1062 break;
1063 }
1064 }
1065 self.expect_token(LiveToken::Close(Delim::Paren)) ?;
1066 }
1067 return Ok(span.end(self, | span | Expr {
1068 span,
1069 ty: RefCell::new(None),
1070 const_val: RefCell::new(None),
1071 const_index: Cell::new(None),
1072 kind: ExprKind::ConsCall {
1073 span,
1074 ty_lit,
1075 arg_exprs,
1076 },
1077 }))
1078 }
1079 else {
1080 let ident_path = self.expect_ident_path() ?;
1081 match self.peek_token() {
1082 LiveToken::Open(Delim::Brace) => { let struct_ptr = if ident_path.len() == 1 && ident_path.segs[0] == live_id!(Self) {
1085 if let Some(FnSelfKind::Struct(struct_node_ptr)) = self.self_kind {
1086 struct_node_ptr
1087 }
1088 else {
1089 return Err(span.error(self, live_error_origin!(), format!("Use of Self not allowed here").into()));
1090 }
1091 }
1092 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]) {
1093 match self.shader_registry.find_live_node_by_path(self.live_registry, ptr, &ident_path.segs[1..ident_path.len()]) {
1094 LiveNodeFindResult::Error(err) => {
1095 return Err(err)
1096 }
1097 LiveNodeFindResult::Struct(struct_ptr) => {
1098 self.type_deps.push(ShaderParserDep::Struct(struct_ptr));
1099 struct_ptr
1100 }
1101 LiveNodeFindResult::NotFound => {
1102 return Err(span.error(self, live_error_origin!(), format!("Struct not found `{}`", ident_path).into()))
1103 }
1104 LiveNodeFindResult::PossibleStatic(_, _)
1105 | LiveNodeFindResult::Function(_)
1106 | LiveNodeFindResult::Component(_)
1107 | LiveNodeFindResult::LiveValue(_, _) => {
1109 return Err(span.error(self, live_error_origin!(), format!("Not a struct `{}`", ident_path).into()))
1110 }
1111 }
1112 }
1113 else {
1114 return Err(span.error(self, live_error_origin!(), format!("Struct not found `{}`", ident_path).into()))
1115 };
1116
1117 self.skip_token();
1118 let mut args = Vec::new();
1119 loop {
1120 let name = self.expect_ident(live_error_origin!()) ?;
1121 self.expect_token(LiveToken::Punct(live_id!(:))) ?;
1122 let expr = self.expect_expr() ?;
1123 self.accept_token(LiveToken::Punct(live_id!(,)));
1124 args.push((name, expr));
1125 match self.peek_token() {
1127 LiveToken::Eof => {
1128 return Err(span.error(self, live_error_origin!(), format!("Unexpected Eof").into()))
1129 }
1130 LiveToken::Close(Delim::Brace) => {
1131 self.skip_token();
1132 return Ok(span.end(self, | span | Expr {
1133 span,
1134 ty: RefCell::new(None),
1135 const_val: RefCell::new(None),
1136 const_index: Cell::new(None),
1137 kind: ExprKind::StructCons {
1138 struct_ptr,
1139 span,
1140 args
1141 },
1142 }))
1143 }
1144 _ => ()
1145 }
1146
1147 }
1148 }
1149 LiveToken::Open(Delim::Paren) => {
1150 let arg_exprs = self.expect_arg_exprs() ?;
1151 if ident_path.len() == 1 && self.shader_registry.builtins.get(&Ident(ident_path.segs[0])).is_some() {
1152 Ok(span.end(self, | span | Expr {
1153 span,
1154 ty: RefCell::new(None),
1155 const_val: RefCell::new(None),
1156 const_index: Cell::new(None),
1157 kind: ExprKind::BuiltinCall {
1158 span,
1159 ident: Ident(ident_path.segs[0]),
1160 arg_exprs,
1161 },
1162 }))
1163 }
1164 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]) {
1165 match self.shader_registry.find_live_node_by_path(self.live_registry, ptr, &ident_path.segs[1..ident_path.len()]) {
1166 LiveNodeFindResult::Error(err) => {
1167 return Err(err)
1168 }
1169 LiveNodeFindResult::NotFound => {
1170 Err(span.error(self, live_error_origin!(), format!("Function not found `{}`", ident_path).into()))
1171 }
1172 LiveNodeFindResult::Component(_)
1173 | LiveNodeFindResult::Struct(_)
1174 | LiveNodeFindResult::LiveValue(_, _) => {
1176 Err(span.error(self, live_error_origin!(), format!("Not a function `{}`", ident_path).into()))
1177 }
1178 LiveNodeFindResult::Function(fn_ptr) => {
1179 self.type_deps.push(ShaderParserDep::Function(None, fn_ptr));
1180 Ok(span.end(self, | span | Expr {
1181 span,
1182 ty: RefCell::new(None),
1183 const_val: RefCell::new(None),
1184 const_index: Cell::new(None),
1185 kind: ExprKind::PlainCall {
1186 span,
1187 fn_ptr: Some(fn_ptr),
1188 ident: if ident_path.len() == 1 {Some(Ident(ident_path.segs[0]))}else {None},
1189 arg_exprs,
1190 param_index: Cell::new(None),
1191 closure_site_index: Cell::new(None),
1192 },
1193 }))
1194 }
1196 LiveNodeFindResult::PossibleStatic(struct_ptr, fn_ptr) => {
1197 self.type_deps.push(ShaderParserDep::Struct(struct_ptr));
1199 self.type_deps.push(ShaderParserDep::Function(Some(struct_ptr), fn_ptr));
1200 Ok(span.end(self, | span | Expr {
1201 span,
1202 ty: RefCell::new(None),
1203 const_val: RefCell::new(None),
1204 const_index: Cell::new(None),
1205 kind: ExprKind::PlainCall {
1206 span,
1207 ident: if ident_path.len() == 1 {Some(Ident(ident_path.segs[0]))}else {None},
1208 fn_ptr: Some(fn_ptr),
1209 arg_exprs,
1210 param_index: Cell::new(None),
1211 closure_site_index: Cell::new(None),
1212 },
1213 }))
1214 }
1216
1217 }
1218 }
1219 else if ident_path.len() == 1 {
1220 Ok(span.end(self, | span | Expr {
1222 span,
1223 ty: RefCell::new(None),
1224 const_val: RefCell::new(None),
1225 const_index: Cell::new(None),
1226 kind: ExprKind::PlainCall {
1227 span,
1228 ident: Some(Ident(ident_path.segs[0])),
1229 fn_ptr: None,
1230 arg_exprs,
1231 param_index: Cell::new(None),
1232 closure_site_index: Cell::new(None),
1233 },
1234 }))
1235 }
1236 else {
1237 Err(span.error(self, live_error_origin!(), format!("Call not found `{}`", ident_path).into()))
1238 }
1239 }
1240 _ => {
1241 let mut var_resolve = VarResolve::NotFound;
1244
1245 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]) {
1246
1247 let find_result = self.shader_registry.find_live_node_by_path(self.live_registry, ptr, &ident_path.segs[1..ident_path.len()]);
1248 match find_result {
1249 LiveNodeFindResult::Error(err)=>{
1250 return Err(err)
1251 }
1252 LiveNodeFindResult::LiveValue(value_ptr, ty) => {
1253 var_resolve = VarResolve::LiveValue(value_ptr, ty);
1254 }
1255 LiveNodeFindResult::Function(fn_ptr) => {
1260 self.type_deps.push(ShaderParserDep::Function(None, fn_ptr));
1261 var_resolve = VarResolve::Function(fn_ptr);
1262 }
1263 _ => {}
1264 }
1265 }
1266 if let VarResolve::NotFound = var_resolve {
1267 if ident_path.len()>1 {
1268 return Err(span.error(self, live_error_origin!(), format!("Identifier not found `{}`", ident_path).into()))
1269 }
1270 }
1271
1272 Ok(span.end(self, | span | Expr {
1273 span,
1274 ty: RefCell::new(None),
1275 const_val: RefCell::new(None),
1276 const_index: Cell::new(None),
1277 kind: ExprKind::Var {
1278 ident: if ident_path.len()>1 {None} else {Some(Ident(ident_path.segs[0]))},
1279 span,
1280 var_resolve,
1281 kind: Cell::new(None),
1282 },
1283 }))
1284 },
1285 }
1286 }
1287 }
1288 LiveToken::Bool(v) => {
1289 self.skip_token();
1290 Ok(span.end(self, | span | Expr {
1291 span,
1292 ty: RefCell::new(None),
1293 const_val: RefCell::new(None),
1294 const_index: Cell::new(None),
1295 kind: ExprKind::Lit {span, lit: Lit::Bool(v)},
1296 }))
1297 }
1298 LiveToken::Int(v) => {
1299 self.skip_token();
1300 Ok(span.end(self, | span | Expr {
1301 span,
1302 ty: RefCell::new(None),
1303 const_val: RefCell::new(None),
1304 const_index: Cell::new(None),
1305 kind: ExprKind::Lit {span, lit: Lit::Float(v as f32)},
1306 }))
1307 }
1308 LiveToken::Float(v) => {
1309 self.skip_token();
1310 Ok(span.end(self, | span | Expr {
1311 span,
1312 ty: RefCell::new(None),
1313 const_val: RefCell::new(None),
1314 const_index: Cell::new(None),
1315 kind: ExprKind::Lit {span, lit: Lit::Float(v as f32)},
1316 }))
1317 }
1318 LiveToken::Color(v) => {
1319 self.skip_token();
1320 Ok(span.end(self, | span | Expr {
1321 span,
1322 ty: RefCell::new(None),
1323 const_val: RefCell::new(None),
1324 const_index: Cell::new(None),
1325 kind: ExprKind::Lit {span, lit: Lit::Color(v)},
1326 }))
1327 }
1328 LiveToken::Punct(live_id!( |)) => {
1329 self.skip_token();
1331 let mut params = Vec::new();
1332 if !self.accept_token(LiveToken::Punct(live_id!( |))) {
1333 loop {
1334 let span = self.begin_span();
1335 params.push(ClosureParam {
1336 ident: self.expect_ident(live_error_origin!()) ?,
1337 span: span.end(self, | span | span),
1338 shadow: Cell::new(None)
1339 });
1340 if !self.accept_token(LiveToken::Punct(live_id!(,))) {
1341 break;
1342 }
1343 }
1344 self.expect_token(LiveToken::Punct(live_id!( |))) ?;
1345 }
1346 if self.peek_token() == LiveToken::Open(Delim::Brace) {
1347 let block = self.expect_block() ?;
1348 let span = span.end(self, | span | span);
1349 let closure_def_index = ClosureDefIndex(self.closure_defs.len());
1350 self.closure_defs.push(ClosureDef {
1351 span,
1352 params,
1353 closed_over_syms: RefCell::new(None),
1354 kind: ClosureDefKind::Block(block)
1355 });
1356 Ok(Expr {
1357 span,
1358 ty: RefCell::new(None),
1359 const_val: RefCell::new(None),
1360 const_index: Cell::new(None),
1361 kind: ExprKind::ClosureDef(closure_def_index)
1362 })
1363 }
1364 else {
1365 let expr = self.expect_expr() ?;
1366 let span = span.end(self, | span | span);
1367 let closure_def_index = ClosureDefIndex(self.closure_defs.len());
1368 self.closure_defs.push(ClosureDef {
1369 span,
1370 params,
1371 closed_over_syms: RefCell::new(None),
1372 kind: ClosureDefKind::Expr(expr)
1373 });
1374 Ok(Expr {
1375 span,
1376 ty: RefCell::new(None),
1377 const_val: RefCell::new(None),
1378 const_index: Cell::new(None),
1379 kind: ExprKind::ClosureDef(closure_def_index)
1380 })
1381 }
1382 }
1383 LiveToken::Open(Delim::Paren) => {
1384 self.skip_token();
1385 let expr = self.expect_expr() ?;
1386 self.expect_token(LiveToken::Close(Delim::Paren)) ?;
1387 Ok(expr)
1388 }
1389 token => Err(span.error(self, live_error_origin!(), format!("unexpected token `{}`", token).into())),
1390 }
1391 }
1392
1393 fn expect_arg_exprs(&mut self) -> Result<Vec<Expr>, LiveError> {
1394 self.expect_token(LiveToken::Open(Delim::Paren)) ?;
1395 let mut arg_exprs = Vec::new();
1396 if !self.accept_token(LiveToken::Close(Delim::Paren)) {
1397 loop {
1398 arg_exprs.push(self.expect_expr() ?);
1399 if !self.accept_token(LiveToken::Punct(live_id!(,))) {
1400 break;
1401 }
1402 }
1403 self.expect_token(LiveToken::Close(Delim::Paren)) ?;
1404 }
1405 Ok(arg_exprs)
1406 }
1407
1408 pub fn accept_optional_delim(&mut self) {
1409 while self.accept_token(LiveToken::Punct(live_id!(;))) {};
1410 }
1411}
1412
1413
1414pub struct SpanTracker {
1415 pub file_id: LiveFileId,
1416 pub start: TextPos,
1417 pub start_index: usize,
1418}
1419
1420impl SpanTracker {
1421 pub fn end<F, R>(&self, parser: &mut ShaderParser, f: F) -> R
1422 where
1423 F: FnOnce(TokenSpan) -> R,
1424 {
1425 f(TokenSpan {
1426 token_id: LiveTokenId::new(self.file_id, self.start_index),
1427 len: parser.token_index - self.start_index
1428 })
1429 }
1430
1431 pub fn error(&self, parser: &mut ShaderParser, origin: LiveErrorOrigin, message: String) -> LiveError {
1432 LiveError {
1433 origin,
1434 span: TextSpan {
1435 file_id: self.file_id,
1436 start: self.start,
1437 end: parser.token_end(),
1438 }.into(),
1439 message,
1440 }
1441 }
1442}