fixes private fields

This commit is contained in:
ringabout
2023-03-25 15:47:38 +08:00
parent bde9abb2f7
commit c1c53bebf1
4 changed files with 46 additions and 11 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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()