diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2019-03-06 20:16:20 -0500 |
|---|---|---|
| committer | Tim Foley <tfoleyNV@users.noreply.github.com> | 2019-03-06 17:16:20 -0800 |
| commit | c850ba44164ac2bee895137abdd184beb4123090 (patch) | |
| tree | f6e42ce5998038a1162e95c2a879bb7b06d0573f /source/slang/parser.cpp | |
| parent | 87610f6def3e3dceac0082c1b60abbe2aee09014 (diff) | |
* Add support for enum and type lookup via :: (scope operator) (#882)
* Added test for scope operator
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: { |
