diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/core/macros.nim | 35 | ||||
-rw-r--r-- | lib/packages/docutils/rst.nim | 29 |
2 files changed, 48 insertions, 16 deletions
diff --git a/lib/core/macros.nim b/lib/core/macros.nim index aec766068..e7ef89551 100644 --- a/lib/core/macros.nim +++ b/lib/core/macros.nim @@ -1321,17 +1321,18 @@ proc customPragmaNode(n: NimNode): NimNode = return typ.getImpl()[0][1] if n.kind in {nnkDotExpr, nnkCheckedFieldExpr}: - let name = (if n.kind == nnkCheckedFieldExpr: n[0][1] else: n[1]) + let name = $(if n.kind == nnkCheckedFieldExpr: n[0][1] else: n[1]) var typDef = getImpl(getTypeInst(if n.kind == nnkCheckedFieldExpr or n[0].kind == nnkHiddenDeref: n[0][0] else: n[0])) while typDef != nil: typDef.expectKind(nnkTypeDef) - typDef[2].expectKind({nnkRefTy, nnkPtrTy, nnkObjectTy}) - let isRef = typDef[2].kind in {nnkRefTy, nnkPtrTy} - if isRef and typDef[2][0].kind in {nnkSym, nnkBracketExpr}: # defines ref type for another object(e.g. X = ref X) - typDef = getImpl(typDef[2][0]) + let typ = typDef[2] + typ.expectKind({nnkRefTy, nnkPtrTy, nnkObjectTy}) + let isRef = typ.kind in {nnkRefTy, nnkPtrTy} + if isRef and typ[0].kind in {nnkSym, nnkBracketExpr}: # defines ref type for another object(e.g. X = ref X) + typDef = getImpl(typ[0]) else: # object definition, maybe an object directly defined as a ref type let - obj = (if isRef: typDef[2][0] else: typDef[2]) + obj = (if isRef: typ[0] else: typ) var identDefsStack = newSeq[NimNode](obj[2].len) for i in 0..<identDefsStack.len: identDefsStack[i] = obj[2][i] while identDefsStack.len > 0: @@ -1339,19 +1340,25 @@ proc customPragmaNode(n: NimNode): NimNode = if identDefs.kind == nnkRecCase: identDefsStack.add(identDefs[0]) for i in 1..<identDefs.len: + let varNode = identDefs[i] # if it is and empty branch, skip - if identDefs[i][0].kind == nnkNilLit: continue - if identDefs[i][1].kind == nnkIdentDefs: - identDefsStack.add(identDefs[i][1]) + if varNode[0].kind == nnkNilLit: continue + if varNode[1].kind == nnkIdentDefs: + identDefsStack.add(varNode[1]) else: # nnkRecList - for j in 0..<identDefs[i][1].len: - identDefsStack.add(identDefs[i][1][j]) + for j in 0 ..< varNode[1].len: + identDefsStack.add(varNode[1][j]) else: for i in 0 .. identDefs.len - 3: - if identDefs[i].kind == nnkPragmaExpr and - identDefs[i][0].kind == nnkIdent and $identDefs[i][0] == $name: - return identDefs[i][1] + let varNode = identDefs[i] + if varNode.kind == nnkPragmaExpr: + var varName = varNode[0] + if varName.kind == nnkPostfix: + # This is a public field. We are skipping the postfix * + varName = varName[1] + if eqIdent(varName.strVal, name): + return varNode[1] if obj[1].kind == nnkOfInherit: # explore the parent object typDef = getImpl(obj[1][0]) diff --git a/lib/packages/docutils/rst.nim b/lib/packages/docutils/rst.nim index d35f109e7..161509afe 100644 --- a/lib/packages/docutils/rst.nim +++ b/lib/packages/docutils/rst.nim @@ -363,6 +363,12 @@ proc addNodes(n: PRstNode): string = addNodesAux(n, result) proc rstnodeToRefnameAux(n: PRstNode, r: var string, b: var bool) = + template special(s) = + if b: + add(r, '-') + b = false + add(r, s) + if n == nil: return if n.kind == rnLeaf: for i in countup(0, len(n.text) - 1): @@ -373,7 +379,7 @@ proc rstnodeToRefnameAux(n: PRstNode, r: var string, b: var bool) = b = false if len(r) == 0: add(r, 'Z') add(r, n.text[i]) - of 'a'..'z': + of 'a'..'z', '\128'..'\255': if b: add(r, '-') b = false @@ -383,8 +389,27 @@ proc rstnodeToRefnameAux(n: PRstNode, r: var string, b: var bool) = add(r, '-') b = false add(r, chr(ord(n.text[i]) - ord('A') + ord('a'))) + of '$': special "dollar" + of '%': special "percent" + of '&': special "amp" + of '^': special "roof" + of '!': special "emark" + of '?': special "qmark" + of '*': special "star" + of '+': special "plus" + of '-': special "minus" + of '/': special "slash" + of '\\': special "backslash" + of '=': special "eq" + of '<': special "lt" + of '>': special "gt" + of '~': special "tilde" + of ':': special "colon" + of '.': special "dot" + of '@': special "at" + of '|': special "bar" else: - if (len(r) > 0): b = true + if len(r) > 0: b = true else: for i in countup(0, len(n) - 1): rstnodeToRefnameAux(n.sons[i], r, b) |