diff options
Diffstat (limited to 'source/slang/parser.cpp')
| -rw-r--r-- | source/slang/parser.cpp | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/source/slang/parser.cpp b/source/slang/parser.cpp index a7ccb7b8a..5cb712489 100644 --- a/source/slang/parser.cpp +++ b/source/slang/parser.cpp @@ -1738,8 +1738,10 @@ namespace Slang } static RefPtr<Expr> parseMemberType(Parser * parser, RefPtr<Expr> base) { + // When called the :: or . have been consumed, so don't need to consume here. + RefPtr<MemberExpr> memberExpr = new MemberExpr(); - parser->ReadToken(TokenType::Dot); + parser->FillPosition(memberExpr.Ptr()); memberExpr->BaseExpression = base; memberExpr->name = expectIdentifier(parser).name; @@ -1853,7 +1855,12 @@ namespace Slang case TokenType::OpLess: typeExpr = parseGenericApp(parser, typeExpr); break; + case TokenType::Scope: + parser->ReadToken(TokenType::Scope); + typeExpr = parseMemberType(parser, typeExpr); + break; case TokenType::Dot: + parser->ReadToken(TokenType::Dot); typeExpr = parseMemberType(parser, typeExpr); break; default: @@ -4192,6 +4199,26 @@ namespace Slang } break; + // Scope access `x::m` + case TokenType::Scope: + { + RefPtr<StaticMemberExpr> staticMemberExpr = new StaticMemberExpr(); + + // TODO(tfoley): why would a member expression need this? + staticMemberExpr->scope = parser->currentScope.Ptr(); + + parser->FillPosition(staticMemberExpr.Ptr()); + staticMemberExpr->BaseExpression = expr; + parser->ReadToken(TokenType::Scope); + staticMemberExpr->name = expectIdentifier(parser).name; + + if (peekTokenType(parser) == TokenType::OpLess) + expr = maybeParseGenericApp(parser, staticMemberExpr); + else + expr = staticMemberExpr; + + break; + } // Member access `x.m` case TokenType::Dot: { |
