From 4b284daeb0cc3f6df0835befad4326c81abeb374 Mon Sep 17 00:00:00 2001 From: Yong He Date: Tue, 9 Jan 2018 13:26:42 -0800 Subject: Support nested generics fixes #362 --- source/slang/parser.cpp | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) (limited to 'source/slang/parser.cpp') diff --git a/source/slang/parser.cpp b/source/slang/parser.cpp index 11e3eb159..1378191ca 100644 --- a/source/slang/parser.cpp +++ b/source/slang/parser.cpp @@ -2216,20 +2216,9 @@ namespace Slang return blockVarDecl; } - static RefPtr ParseExtensionDecl(Parser* parser, void* /*userData*/) - { - RefPtr decl = new ExtensionDecl(); - parser->FillPosition(decl.Ptr()); - decl->targetType = parser->ParseTypeExp(); - - parseAggTypeDeclBody(parser, decl.Ptr()); - - return decl; - } - - static void parseOptionalInheritanceClause(Parser* parser, AggTypeDecl* decl) + static void parseOptionalInheritanceClause(Parser* parser, AggTypeDeclBase* decl) { - if( AdvanceIf(parser, TokenType::Colon) ) + if (AdvanceIf(parser, TokenType::Colon)) { do { @@ -2242,10 +2231,22 @@ namespace Slang AddMember(decl, inheritanceDecl); - } while( AdvanceIf(parser, TokenType::Comma) ); + } while (AdvanceIf(parser, TokenType::Comma)); } } + static RefPtr ParseExtensionDecl(Parser* parser, void* /*userData*/) + { + RefPtr decl = new ExtensionDecl(); + parser->FillPosition(decl.Ptr()); + decl->targetType = parser->ParseTypeExp(); + parseOptionalInheritanceClause(parser, decl); + parseAggTypeDeclBody(parser, decl.Ptr()); + + return decl; + } + + void parseOptionalGenericConstraints(Parser * parser, ContainerDecl* decl) { if (AdvanceIf(parser, TokenType::Colon)) @@ -2255,6 +2256,7 @@ namespace Slang RefPtr paramConstraint = new GenericTypeConstraintDecl(); parser->FillPosition(paramConstraint); + // substitution needs to be filled during check RefPtr paramType = DeclRefType::Create( parser->getSession(), DeclRef(decl, nullptr)); @@ -2279,7 +2281,7 @@ namespace Slang auto nameToken = parser->ReadToken(TokenType::Identifier); assocTypeDecl->nameAndLoc = NameLoc(nameToken); assocTypeDecl->loc = nameToken.loc; - parseOptionalInheritanceClause(parser, assocTypeDecl); + parseOptionalGenericConstraints(parser, assocTypeDecl); parser->ReadToken(TokenType::Semicolon); return assocTypeDecl; } -- cgit v1.2.3