From ea0845285b0307d153a91d6f0a5010fc2d7219ed Mon Sep 17 00:00:00 2001 From: Yong He Date: Mon, 5 Sep 2022 00:38:45 -0700 Subject: Multi parameter `__subscript` (#2392) * Multi parameter `__subscript` * Fix. * Fix bugs. * Fix. Co-authored-by: Yong He --- source/slang/slang-parser.cpp | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) (limited to 'source/slang/slang-parser.cpp') diff --git a/source/slang/slang-parser.cpp b/source/slang/slang-parser.cpp index 594ca4cc3..77a2319d2 100644 --- a/source/slang/slang-parser.cpp +++ b/source/slang/slang-parser.cpp @@ -1476,7 +1476,8 @@ namespace Slang void visitIndexExpr(IndexExpr * expr) { expr->baseExpression->accept(this, nullptr); - expr->indexExpression->accept(this, nullptr); + for (auto arg : expr->indexExprs) + arg->accept(this, nullptr); } void visitMemberExpr(MemberExpr * expr) { @@ -1824,7 +1825,8 @@ namespace Slang auto arrayTypeExpr = astBuilder->create(); arrayTypeExpr->loc = arrayDeclarator->openBracketLoc; arrayTypeExpr->baseExpression = ioInfo->typeSpec; - arrayTypeExpr->indexExpression = arrayDeclarator->elementCountExpr; + if (arrayDeclarator->elementCountExpr) + arrayTypeExpr->indexExprs.add(arrayDeclarator->elementCountExpr); ioInfo->typeSpec = arrayTypeExpr; declarator = arrayDeclarator->inner; @@ -2045,7 +2047,7 @@ namespace Slang parser->ReadToken(TokenType::LBracket); if (!parser->LookAheadToken(TokenType::RBracket)) { - arrType->indexExpression = parser->ParseExpression(); + arrType->indexExprs.add(parser->ParseExpression()); } parser->ReadToken(TokenType::RBracket); typeExpr = arrType; @@ -5779,18 +5781,23 @@ namespace Slang IndexExpr* indexExpr = parser->astBuilder->create(); indexExpr->baseExpression = expr; parser->FillPosition(indexExpr); - parser->ReadToken(TokenType::LBracket); - // TODO: eventually we may want to support multiple arguments inside the `[]` - if (!parser->LookAheadToken(TokenType::RBracket)) - { - indexExpr->indexExpression = parser->ParseExpression(); - } - else + auto lBracket = parser->ReadToken(TokenType::LBracket); + indexExpr->argumentDelimeterLocs.add(lBracket.loc); + while (!parser->tokenReader.isAtEnd()) { - indexExpr->indexExpression = parser->astBuilder->create(); + if (!parser->LookAheadToken(TokenType::RBracket)) + indexExpr->indexExprs.add(parser->ParseArgExpr()); + else + { + break; + } + if (!parser->LookAheadToken(TokenType::Comma)) + break; + auto comma = parser->ReadToken(TokenType::Comma); + indexExpr->argumentDelimeterLocs.add(comma.loc); } - parser->ReadToken(TokenType::RBracket); - + auto rBracket = parser->ReadToken(TokenType::RBracket); + indexExpr->argumentDelimeterLocs.add(rBracket.loc); expr = indexExpr; } break; -- cgit v1.2.3