mirror of
https://github.com/nim-lang/Nim.git
synced 2026-02-15 07:43:26 +00:00
fixes private fields
This commit is contained in:
@@ -506,12 +506,12 @@ proc semGenericStmt(c: PContext, n: PNode,
|
||||
result[i] = semGenericStmt(c, n[i], flags, ctx)
|
||||
if result[0].kind == nkSym:
|
||||
let fmoduleId = getModule(result[0].sym).id
|
||||
var isVisable = false
|
||||
var isVisible = false
|
||||
for module in c.friendModules:
|
||||
if module.id == fmoduleId:
|
||||
isVisable = true
|
||||
isVisible = true
|
||||
break
|
||||
if isVisable:
|
||||
if isVisible:
|
||||
for i in 1..<result.len:
|
||||
if result[i].kind == nkExprColonExpr:
|
||||
result[i][1].flags.incl nfSkipFieldChecking
|
||||
|
||||
@@ -433,10 +433,12 @@ proc replaceObjConstr(c: PContext; field: PNode, result: PNode, iterField: var i
|
||||
if matchedBranch != nil:
|
||||
replaceObjConstr(c, matchedBranch.lastSon, result, iterField, flags)
|
||||
of nkSym:
|
||||
if result[iterField].kind != nkExprColonExpr:
|
||||
result[iterField] = newTree(nkExprColonExpr, field, result[iterField])
|
||||
if result[iterField].kind == nkExprColonExpr and field.sym.name.id == considerQuotedIdent(c, result[iterField][0]).id:
|
||||
inc iterField
|
||||
elif field.sym.name.id == considerQuotedIdent(c, result[iterField][0]).id:
|
||||
elif not fieldVisible(c, field.sym):
|
||||
discard
|
||||
elif result[iterField].kind != nkExprColonExpr:
|
||||
result[iterField] = newTree(nkExprColonExpr, field, result[iterField])
|
||||
inc iterField
|
||||
else:
|
||||
localError(c.config, result.info, "When mixing named fields and unnamed fields, every field needs to be initialized in order")
|
||||
@@ -488,9 +490,11 @@ proc filterObjConstr(c: PContext; field: PNode, n: PNode, iterField: var int, fl
|
||||
result = false
|
||||
|
||||
of nkSym:
|
||||
if n[iterField].kind != nkExprColonExpr:
|
||||
if n[iterField].kind == nkExprColonExpr and field.sym.name.id == considerQuotedIdent(c, n[iterField][0]).id:
|
||||
inc iterField
|
||||
elif field.sym.name.id == considerQuotedIdent(c, n[iterField][0]).id:
|
||||
elif not fieldVisible(c, field.sym):
|
||||
discard
|
||||
elif n[iterField].kind != nkExprColonExpr:
|
||||
inc iterField
|
||||
else:
|
||||
result = false
|
||||
|
||||
@@ -1,6 +1,25 @@
|
||||
type
|
||||
Noice* = object
|
||||
hidden: int
|
||||
|
||||
template jjj*: Noice =
|
||||
Noice(hidden: 15)
|
||||
|
||||
Ciao* = object
|
||||
hidden1: int
|
||||
hidden2: int
|
||||
|
||||
Gull* = ref object
|
||||
hidden1: int
|
||||
field*: int
|
||||
hidden2: int
|
||||
field2*: int
|
||||
|
||||
|
||||
template jjj*(): Noice =
|
||||
var x = 7
|
||||
Noice(hidden: 15)
|
||||
|
||||
template said*(): Ciao =
|
||||
var x = 7
|
||||
Ciao(hidden1: 15 + x, 1)
|
||||
|
||||
proc foo*: Gull =
|
||||
result = Gull(1, 2, 3, 4)
|
||||
|
||||
@@ -3,7 +3,19 @@ import m3770
|
||||
|
||||
doAssert $jjj() == "(hidden: 15)" # works
|
||||
|
||||
doAssert $said() == "(hidden1: 22, hidden2: 1)"
|
||||
|
||||
proc someGeneric(_: type) =
|
||||
doAssert $jjj() == "(hidden: 15)" # fails: "Error: the field 'hidden' is not accessible."
|
||||
when false: # todo somehow make it work?
|
||||
doAssert $said() == "(hidden1: 22, hidden2: 1)"
|
||||
|
||||
someGeneric(int)
|
||||
|
||||
doAssert $(foo()[]) == "(hidden1: 1, field: 2, hidden2: 3, field2: 4)"
|
||||
|
||||
proc bar() =
|
||||
var s = Gull(13, 14)
|
||||
doAssert $(s[]) == "(hidden1: 0, field: 13, hidden2: 0, field2: 14)"
|
||||
|
||||
bar()
|
||||
|
||||
Reference in New Issue
Block a user