diff options
| author | Yong He <yonghe@outlook.com> | 2018-01-13 13:17:02 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-01-13 13:17:02 -0800 |
| commit | d4dab2cd3a409411c2d7caed01fc02a0fd3e8450 (patch) | |
| tree | 10c92df406a82e7a5eb24b56c17d9256a7183c44 /source/slang/parser.cpp | |
| parent | df6eeb93c1718334779ae328db277cdf7a9d7b04 (diff) | |
| parent | 4d2086f47e25aa4545df95ddfd260c8bc5aafdb2 (diff) | |
Merge pull request #364 from csyonghe/assoctype
Support nested generics
Diffstat (limited to 'source/slang/parser.cpp')
| -rw-r--r-- | source/slang/parser.cpp | 32 |
1 files changed, 17 insertions, 15 deletions
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<RefObject> ParseExtensionDecl(Parser* parser, void* /*userData*/) - { - RefPtr<ExtensionDecl> 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<RefObject> ParseExtensionDecl(Parser* parser, void* /*userData*/) + { + RefPtr<ExtensionDecl> 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<GenericTypeConstraintDecl> paramConstraint = new GenericTypeConstraintDecl(); parser->FillPosition(paramConstraint); + // substitution needs to be filled during check RefPtr<DeclRefType> paramType = DeclRefType::Create( parser->getSession(), DeclRef<Decl>(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; } |
