From c850ba44164ac2bee895137abdd184beb4123090 Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Wed, 6 Mar 2019 20:16:20 -0500 Subject: * Add support for enum and type lookup via :: (scope operator) (#882) * Added test for scope operator --- source/slang/parser.cpp | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) (limited to 'source/slang/parser.cpp') 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 parseMemberType(Parser * parser, RefPtr base) { + // When called the :: or . have been consumed, so don't need to consume here. + RefPtr 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 = 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: { -- cgit v1.2.3