package-private visibility

This commit is contained in:
2026-08-01 22:55:35 +02:00
parent 304880a9aa
commit f267e8c3cb
11 changed files with 301 additions and 185 deletions
+21 -21
View File
@@ -109,7 +109,7 @@ Node :: struct {
tuple: bool,
opaque: bool,
declared: bool,
file_hidden: bool,
package_hidden: bool,
explicit_backing: bool,
}
@@ -193,43 +193,38 @@ intern :: proc(store: ^Store, candidate: Node) -> Type {
return id
}
named :: proc(store: ^Store, pkg, name: u32, qualifier: u32 = 0, file: u32 = 0xffff_ffff, file_hidden := false) -> Type {
normalized_file := file if qualifier != 0 || file_hidden else u32(0)
named :: proc(store: ^Store, pkg, name: u32, qualifier: u32 = 0, file: u32 = 0xffff_ffff, package_hidden := false) -> Type {
normalized_file := file if qualifier != 0 else u32(0)
for existing, index in store.nodes {
visibility_matches := existing.file_hidden == file_hidden &&
(!file_hidden || existing.file == normalized_file)
if (existing.kind == .Named || existing.kind == .Alias || existing.kind == .Distinct ||
existing.kind == .Enum || existing.kind == .Struct || existing.kind == .Union) &&
existing.pkg == pkg && existing.name == name && existing.qualifier == qualifier &&
(visibility_matches || qualifier == 0 && existing.file_hidden != file_hidden) {
(qualifier == 0 || existing.file == normalized_file) {
return DYNAMIC_START+Type(index)
}
}
return intern(store, Node{kind=.Named, pkg=pkg, name=name, qualifier=qualifier, file=normalized_file, file_hidden=file_hidden})
return intern(store, Node{
kind=.Named,
pkg=pkg,
name=name,
qualifier=qualifier,
file=normalized_file,
})
}
find_named :: proc(store: ^Store, pkg, name: u32, qualifier: u32 = 0, file: u32 = 0xffff_ffff) -> Type {
if file != 0xffff_ffff {
for existing, index in store.nodes {
if (existing.kind == .Named || existing.kind == .Alias || existing.kind == .Distinct ||
existing.kind == .Enum || existing.kind == .Struct || existing.kind == .Union) &&
existing.pkg == pkg && existing.name == name && existing.qualifier == qualifier &&
existing.file_hidden && existing.file == file {
return DYNAMIC_START+Type(index)
}
}
}
for existing, index in store.nodes {
if (existing.kind == .Named || existing.kind == .Alias || existing.kind == .Distinct ||
existing.kind == .Enum || existing.kind == .Struct || existing.kind == .Union) &&
existing.pkg == pkg && existing.name == name && existing.qualifier == qualifier && !existing.file_hidden {
existing.pkg == pkg && existing.name == name && existing.qualifier == qualifier &&
(!existing.package_hidden || file != 0xffff_ffff) {
return DYNAMIC_START+Type(index)
}
}
return INVALID
}
define_alias :: proc(store: ^Store, id, child: Type) -> bool {
define_alias :: proc(store: ^Store, id, child: Type, package_hidden := false) -> bool {
existing, ok := node(store, id)
if !ok || existing.kind != .Named || existing.declared {
return false
@@ -237,11 +232,12 @@ define_alias :: proc(store: ^Store, id, child: Type) -> bool {
index := int(id-DYNAMIC_START)
store.nodes[index].kind = .Alias
store.nodes[index].child = child
store.nodes[index].package_hidden = package_hidden
store.nodes[index].declared = true
return true
}
define_distinct :: proc(store: ^Store, id, child: Type) -> bool {
define_distinct :: proc(store: ^Store, id, child: Type, package_hidden := false) -> bool {
existing, ok := node(store, id)
if !ok || existing.kind != .Named || existing.declared {
return false
@@ -249,11 +245,12 @@ define_distinct :: proc(store: ^Store, id, child: Type) -> bool {
index := int(id-DYNAMIC_START)
store.nodes[index].kind = .Distinct
store.nodes[index].child = child
store.nodes[index].package_hidden = package_hidden
store.nodes[index].declared = true
return true
}
define_enum :: proc(store: ^Store, id, backing: Type, members: []Enum_Member, explicit_backing: bool) -> bool {
define_enum :: proc(store: ^Store, id, backing: Type, members: []Enum_Member, explicit_backing: bool, package_hidden := false) -> bool {
existing, ok := node(store, id)
if !ok || existing.kind != .Named || existing.declared {
return false
@@ -264,6 +261,7 @@ define_enum :: proc(store: ^Store, id, backing: Type, members: []Enum_Member, ex
store.nodes[index].field_start = u32(len(store.enum_members))
store.nodes[index].field_count = u32(len(members))
store.nodes[index].explicit_backing = explicit_backing
store.nodes[index].package_hidden = package_hidden
store.nodes[index].declared = true
append(&store.enum_members, ..members)
return true
@@ -280,6 +278,7 @@ define_record :: proc(
tag: Type = INVALID,
declared_tag: Type = INVALID,
tuple := false,
package_hidden := false,
) -> bool {
existing, ok := node(store, id)
if !ok || (existing.kind != .Named && existing.kind != .Struct && existing.kind != .Union) ||
@@ -291,6 +290,7 @@ define_record :: proc(
store.nodes[index].c_layout = c_layout
store.nodes[index].tuple = tuple
store.nodes[index].opaque = opaque
store.nodes[index].package_hidden = package_hidden
store.nodes[index].declared = true
store.nodes[index].explicit_size = explicit_size
store.nodes[index].explicit_alignment = explicit_alignment