summaryrefslogtreecommitdiffstats
path: root/source/slang/parser.cpp
diff options
context:
space:
mode:
authorYONGH\yongh <yonghe@outlook.com>2017-11-02 19:21:15 -0400
committerYONGH\yongh <yonghe@outlook.com>2017-11-02 19:21:15 -0400
commitd5e2319c33115d0241dd9d2047c0a5f029553dde (patch)
treeb89aef27f2330e7c568b0f799f0902015fdd4f18 /source/slang/parser.cpp
parente2b97607977977fd2dbe298c2bb4512f4715dd4c (diff)
work inprogress
Diffstat (limited to 'source/slang/parser.cpp')
-rw-r--r--source/slang/parser.cpp25
1 files changed, 24 insertions, 1 deletions
diff --git a/source/slang/parser.cpp b/source/slang/parser.cpp
index 224450a66..bf85356db 100644
--- a/source/slang/parser.cpp
+++ b/source/slang/parser.cpp
@@ -2113,7 +2113,30 @@ namespace Slang
auto nameToken = parser->ReadToken(TokenType::Identifier);
assocTypeDecl->nameAndLoc = NameLoc(nameToken);
assocTypeDecl->loc = nameToken.loc;
- parseOptionalInheritanceClause(parser, assocTypeDecl.Ptr());
+ if (AdvanceIf(parser, TokenType::Colon))
+ {
+ while (!parser->tokenReader.IsAtEnd())
+ {
+ auto paramConstraint = new GenericTypeConstraintDecl();
+ parser->FillPosition(paramConstraint);
+
+ auto paramType = DeclRefType::Create(
+ parser->getSession(),
+ DeclRef<Decl>(assocTypeDecl, nullptr));
+
+ auto paramTypeExpr = new SharedTypeExpr();
+ paramTypeExpr->loc = assocTypeDecl->loc;
+ paramTypeExpr->base.type = paramType;
+ paramTypeExpr->type = QualType(getTypeType(paramType));
+
+ paramConstraint->sub = TypeExp(paramTypeExpr);
+ paramConstraint->sup = parser->ParseTypeExp();
+
+ AddMember(assocTypeDecl, paramConstraint);
+ if (!AdvanceIf(parser, TokenType::Comma))
+ break;
+ }
+ }
parser->ReadToken(TokenType::Semicolon);
return assocTypeDecl;
}