Skip to content

Commit eccad9f

Browse files
committed
parser: minor optimization for tuple expression handling
1 parent 1a6fab6 commit eccad9f

File tree

2 files changed

+34
-11
lines changed

2 files changed

+34
-11
lines changed

std/jule/parser/expr.jule

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -649,20 +649,20 @@ impl exprBuilder {
649649
// Remove expression tokens.
650650
// Holds only indexing tokens.
651651
// Includes brackets.
652-
tokens = tokens[len(exprTokens):]
652+
mut bracketTokens := tokens[len(exprTokens):]
653653

654654
// Catch slicing expressions.
655-
mut splitTokens := tokens[1 : len(tokens)-1] // Remove brackets.
655+
mut splitTokens := bracketTokens[1 : len(bracketTokens)-1] // Remove brackets.
656656
mut start, mut to := splitDelim(splitTokens, token::Colon)
657657
if start != nil || to != nil {
658-
ret self.buildSlicing(exprTokens, start, to, errorToken, tokens[len(tokens)-1])
658+
ret self.buildSlicing(exprTokens, start, to, errorToken, bracketTokens[len(bracketTokens)-1])
659659
}
660-
if tokens[1].Id == token::DblColon {
660+
if bracketTokens[1].Id == token::DblColon {
661661
// Special case: catch x[::] and x[::index3] like expressions.
662662
self.pushErr(errorToken, log::MiddleIndexRequired)
663663
ret nil
664664
}
665-
ret self.buildIndexing(exprTokens, tokens, errorToken)
665+
ret self.buildIndexing(exprTokens, bracketTokens, errorToken)
666666
}
667667

668668
fn buildExclRight(mut self, mut &tokens: []&token::Token): ast::ExprData {
@@ -818,12 +818,14 @@ impl exprBuilder {
818818
}
819819

820820
fn buildKind(mut self, mut &tokens: []&token::Token): ast::ExprData {
821-
mut parts, errors := parts(tokens, token::Comma, true)
822-
if errors != nil {
823-
self.p.errors = append(self.p.errors, errors...)
824-
ret nil
825-
} else if len(parts) > 1 {
826-
ret self.buildTuple(parts)
821+
if isTupleExpr(tokens) {
822+
mut parts, errors := parts(tokens, token::Comma, true)
823+
if errors != nil {
824+
self.p.errors = append(self.p.errors, errors...)
825+
ret nil
826+
} else if len(parts) > 1 {
827+
ret self.buildTuple(parts)
828+
}
827829
}
828830
ret self.build(tokens)
829831
}

std/jule/parser/parser.jule

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,27 @@ fn parts(mut &tokens: []&token::Token, id: int, exprMust: bool): (parts: [][]&to
128128
ret
129129
}
130130

131+
fn isTupleExpr(mut &tokens: []&token::Token): bool {
132+
if len(tokens) == 0 {
133+
ret false
134+
}
135+
mut rangeN := 0
136+
for _, token in tokens {
137+
match token.Id {
138+
| token::LBrace | token::LBracket | token::LParent:
139+
rangeN++
140+
| token::RBrace | token::RBracket | token::RParent:
141+
rangeN--
142+
| token::Comma:
143+
if rangeN > 0 {
144+
continue
145+
}
146+
ret true
147+
}
148+
}
149+
ret false
150+
}
151+
131152
fn getCloseOfBrace(left: int): int {
132153
match left {
133154
| token::RParent:

0 commit comments

Comments
 (0)