diff --git a/compiler/ast.nim b/compiler/ast.nim index bb06e7163d..49e050f6c1 100644 --- a/compiler/ast.nim +++ b/compiler/ast.nim @@ -190,6 +190,7 @@ type nkTypeOfExpr, # type(1+2) nkObjectTy, # object body nkTupleTy, # tuple body + nkTypeClassTy, # user-defined type class nkRecList, # list of object parts nkRecCase, # case section of object nkRecWhen, # when section of object diff --git a/compiler/parser.nim b/compiler/parser.nim index 699a50c629..72b0ba7960 100644 --- a/compiler/parser.nim +++ b/compiler/parser.nim @@ -927,9 +927,10 @@ proc parseExpr(p: var TParser): PNode = of tkTry: result = parseTry(p) else: result = simpleExpr(p) +proc parseEnum(p: var TParser): PNode proc parseObject(p: var TParser): PNode proc parseDistinct(p: var TParser): PNode -proc parseEnum(p: var TParser): PNode +proc parseTypeClass(p: var TParser): PNode proc primary(p: var TParser, mode: TPrimaryMode): PNode = #| typeKeyw = 'var' | 'ref' | 'ptr' | 'shared' | 'type' | 'tuple' @@ -983,6 +984,11 @@ proc primary(p: var TParser, mode: TPrimaryMode): PNode = else: result = newNodeP(nkObjectTy, p) getTok(p) + of tkGeneric: + if mode == pmTypeDef: + result = parseTypeClass(p) + else: + parMessage(p, errInvalidToken, p.tok) of tkDistinct: if mode == pmTypeDef: result = parseDistinct(p) @@ -1613,6 +1619,32 @@ proc parseObject(p: var TParser): PNode = return addSon(result, parseObjectPart(p)) +proc parseTypeClass(p: var TParser): PNode = + result = newNodeP(nkTypeClassTy, p) + getTok(p) + addSon(result, p.parseSymbol) + if p.tok.tokType == tkCurlyDotLe and p.validInd: + addSon(result, parsePragma(p)) + else: + addSon(result, ast.emptyNode) + if p.tok.tokType == tkOf and p.tok.indent < 0: + var a = newNodeP(nkOfInherit, p) + getTok(p) + while true: + addSon(a, parseTypeDesc(p)) + if p.tok.tokType != tkComma: break + getTok(p) + addSon(result, a) + else: + addSon(result, ast.emptyNode) + if p.tok.tokType == tkComment: + skipComment(p, result) + # an initial IND{>} HAS to follow: + if not realInd(p): + addSon(result, emptyNode) + else: + addSon(result, parseStmt(p)) + proc parseDistinct(p: var TParser): PNode = #| distinct = 'distinct' optInd typeDesc result = newNodeP(nkDistinctTy, p) diff --git a/lib/core/macros.nim b/lib/core/macros.nim index 879c66df7a..362e670e63 100644 --- a/lib/core/macros.nim +++ b/lib/core/macros.nim @@ -59,7 +59,7 @@ type nnkBindStmt, nnkMixinStmt, nnkCommentStmt, nnkStmtListExpr, nnkBlockExpr, nnkStmtListType, nnkBlockType, nnkTypeOfExpr, nnkObjectTy, - nnkTupleTy, nnkRecList, nnkRecCase, nnkRecWhen, + nnkTupleTy, nnkTypeClassTy, nnkRecList, nnkRecCase, nnkRecWhen, nnkRefTy, nnkPtrTy, nnkVarTy, nnkConstTy, nnkMutableTy, nnkDistinctTy,