@@ -613,24 +613,38 @@ class Expression::Call final : public Expression {
613
613
614
614
explicit Call (Expression_Arena::Array_Ptr<Expression *> children,
615
615
Source_Code_Span left_paren_span, const Char8 *span_end,
616
- std::optional<Source_Code_Span> optional_chaining_op_ )
616
+ std::optional<Source_Code_Span> optional_chaining_operator )
617
617
: Expression(kind),
618
618
call_left_paren_begin_(left_paren_span.begin()),
619
619
span_end_(span_end),
620
620
children_(children),
621
- optional_chaining_operator_(optional_chaining_op_) {
621
+ optional_chaining_operator_begin_(
622
+ optional_chaining_operator.has_value()
623
+ ? optional_chaining_operator->begin()
624
+ : nullptr) {
622
625
QLJS_ASSERT (left_paren_span.size () == 1 );
626
+ if (optional_chaining_operator.has_value ()) {
627
+ QLJS_ASSERT (optional_chaining_operator->size () == 2 );
628
+ }
623
629
}
624
630
625
631
Source_Code_Span left_paren_span () const {
626
632
return Source_Code_Span (this ->call_left_paren_begin_ ,
627
633
this ->call_left_paren_begin_ + 1 );
628
634
}
629
635
636
+ std::optional<Source_Code_Span> optional_chaining_operator_span () const {
637
+ if (this ->optional_chaining_operator_begin_ == nullptr ) {
638
+ return std::nullopt;
639
+ }
640
+ return Source_Code_Span (this ->optional_chaining_operator_begin_ ,
641
+ this ->optional_chaining_operator_begin_ + 2 );
642
+ }
643
+
630
644
const Char8 *call_left_paren_begin_;
631
645
const Char8 *span_end_;
632
646
Expression_Arena::Array_Ptr<Expression *> children_;
633
- std::optional<Source_Code_Span> optional_chaining_operator_ ;
647
+ const Char8 *optional_chaining_operator_begin_ = nullptr ;
634
648
};
635
649
static_assert (Expression_Arena::is_allocatable<Expression::Call>);
636
650
@@ -690,17 +704,32 @@ class Expression::Index final : public Expression {
690
704
691
705
explicit Index (Expression *container, Expression *subscript,
692
706
Source_Code_Span left_square_span, const Char8 *subscript_end,
693
- std::optional<Source_Code_Span> optional_chaining_op_ )
707
+ std::optional<Source_Code_Span> optional_chaining_operator )
694
708
: Expression(kind),
695
709
index_subscript_end_(subscript_end),
696
710
left_square_span(left_square_span),
697
711
children_{container, subscript},
698
- optional_chaining_operator_ (optional_chaining_op_) {}
712
+ optional_chaining_operator_begin_ (
713
+ optional_chaining_operator.has_value()
714
+ ? optional_chaining_operator->begin ()
715
+ : nullptr) {
716
+ if (optional_chaining_operator.has_value ()) {
717
+ QLJS_ASSERT (optional_chaining_operator->size () == 2 );
718
+ }
719
+ }
720
+
721
+ std::optional<Source_Code_Span> optional_chaining_operator_span () const {
722
+ if (this ->optional_chaining_operator_begin_ == nullptr ) {
723
+ return std::nullopt;
724
+ }
725
+ return Source_Code_Span (this ->optional_chaining_operator_begin_ ,
726
+ this ->optional_chaining_operator_begin_ + 2 );
727
+ }
699
728
700
729
const Char8 *index_subscript_end_;
701
730
Source_Code_Span left_square_span;
702
731
std::array<Expression *, 2 > children_;
703
- std::optional<Source_Code_Span> optional_chaining_operator_ ;
732
+ const Char8 *optional_chaining_operator_begin_ ;
704
733
};
705
734
static_assert (Expression_Arena::is_allocatable<Expression::Index>);
706
735
0 commit comments