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
+17 -25
View File
@@ -1251,12 +1251,12 @@ load_package :: proc(
declaration_conflicts :: proc(module: ^ast.Module, pkg: ast.Package_Id, file: ast.File_Id, name: symbol.Id) -> bool {
for function in module.functions {
if function.pkg == pkg && function.name == name && (!function.file_hidden || function.file == file) {
if function.pkg == pkg && function.name == name {
return true
}
}
for global in module.globals {
if global.pkg == pkg && global.name == name && (!global.file_hidden || global.file == file) {
if global.pkg == pkg && global.name == name {
return true
}
}
@@ -1327,8 +1327,7 @@ find_visible_enum_global :: proc(
public_only := false,
) -> ast.Global_Id {
for global, index in module.globals {
if global.pkg == pkg && global.name == name &&
(!global.file_hidden || !public_only && global.file == file) {
if global.pkg == pkg && global.name == name && (!global.package_hidden || !public_only) {
return ast.global_id(index)
}
}
@@ -1449,26 +1448,20 @@ resolve_enum_values :: proc(state: ^State) {
}
}
alias_declarations_conflict :: proc(left_file: ast.File_Id, left_hidden: bool, right_file: ast.File_Id, right_hidden: bool) -> bool {
return left_file == right_file if left_hidden && right_hidden else true
}
alias_conflicts_with_declaration :: proc(module: ^ast.Module, alias: ast.Declaration_Alias) -> bool {
for function in module.functions {
if function.pkg == alias.pkg && function.name == alias.name &&
alias_declarations_conflict(alias.file, alias.file_hidden, function.file, function.file_hidden) {
if function.pkg == alias.pkg && function.name == alias.name {
return true
}
}
for global in module.globals {
if global.pkg == alias.pkg && global.name == alias.name &&
alias_declarations_conflict(alias.file, alias.file_hidden, global.file, global.file_hidden) {
if global.pkg == alias.pkg && global.name == alias.name {
return true
}
}
for item in module.type_store.nodes {
if item.declared && item.pkg == u32(alias.pkg) && item.name == u32(alias.name) &&
alias_declarations_conflict(alias.file, alias.file_hidden, ast.File_Id(item.file), item.file_hidden) {
if item.declared && item.pkg == u32(alias.pkg) && item.name == u32(alias.name) {
return true
}
}
@@ -1480,7 +1473,7 @@ direct_alias_target :: proc(module: ^ast.Module, pkg: ast.Package_Id, name: symb
target: u32
kinds := 0
for function, index in module.functions {
if function.pkg == pkg && function.name == name && !function.generated && !function.file_hidden {
if function.pkg == pkg && function.name == name && !function.generated && !function.package_hidden {
kind = .Function
target = u32(ast.function_id(index))
kinds += 1
@@ -1488,7 +1481,7 @@ direct_alias_target :: proc(module: ^ast.Module, pkg: ast.Package_Id, name: symb
}
}
for global, index in module.globals {
if global.pkg == pkg && global.name == name && !global.file_hidden {
if global.pkg == pkg && global.name == name && !global.package_hidden {
kind = .Global
target = u32(ast.global_id(index))
kinds += 1
@@ -1507,22 +1500,22 @@ direct_alias_target :: proc(module: ^ast.Module, pkg: ast.Package_Id, name: symb
hidden_alias_target_exists :: proc(module: ^ast.Module, pkg: ast.Package_Id, name: symbol.Id) -> bool {
for function in module.functions {
if function.pkg == pkg && function.name == name && function.file_hidden {
if function.pkg == pkg && function.name == name && function.package_hidden {
return true
}
}
for global in module.globals {
if global.pkg == pkg && global.name == name && global.file_hidden {
if global.pkg == pkg && global.name == name && global.package_hidden {
return true
}
}
for item in module.type_store.nodes {
if item.declared && item.pkg == u32(pkg) && item.name == u32(name) && item.file_hidden {
if item.declared && item.pkg == u32(pkg) && item.name == u32(name) && item.package_hidden {
return true
}
}
for alias in module.aliases {
if alias.valid && alias.pkg == pkg && alias.name == name && alias.file_hidden {
if alias.valid && alias.pkg == pkg && alias.name == name && alias.package_hidden {
return true
}
}
@@ -1531,7 +1524,7 @@ hidden_alias_target_exists :: proc(module: ^ast.Module, pkg: ast.Package_Id, nam
find_public_alias :: proc(module: ^ast.Module, pkg: ast.Package_Id, name: symbol.Id) -> int {
for alias, index in module.aliases {
if alias.valid && alias.pkg == pkg && alias.name == name && !alias.file_hidden {
if alias.valid && alias.pkg == pkg && alias.name == name && !alias.package_hidden {
return index
}
}
@@ -1592,7 +1585,7 @@ resolve_declaration_alias :: proc(state: ^State, index: int, states: []u8) -> bo
alias.diagnostic = source.addf(
state.diagnostics,
alias.span,
"package member '%s.%s' is file-hidden",
"package member '%s.%s' is package-hidden",
symbol.resolve(state.symbols, alias.qualifier),
symbol.resolve(state.symbols, alias.member),
)
@@ -1618,8 +1611,7 @@ validate_declaration_aliases :: proc(state: ^State) {
continue
}
for previous in state.module.aliases[:index] {
if previous.pkg == alias.pkg && previous.name == alias.name &&
alias_declarations_conflict(alias.file, alias.file_hidden, previous.file, previous.file_hidden) {
if previous.pkg == alias.pkg && previous.name == alias.name {
alias.diagnostic = source.addf(state.diagnostics, alias.span, "duplicate declaration alias '%s'", name)
alias.valid = false
break
@@ -1669,9 +1661,9 @@ validate_declaration_aliases :: proc(state: ^State) {
u32(alias.pkg),
u32(alias.name),
file=u32(alias.file),
file_hidden=alias.file_hidden,
package_hidden=alias.package_hidden,
)
if !types.define_alias(&state.module.type_store, id, types.Type(alias.target)) {
if !types.define_alias(&state.module.type_store, id, types.Type(alias.target), alias.package_hidden) {
alias.diagnostic = source.addf(state.diagnostics, alias.span, "duplicate type declaration '%s'", symbol.resolve(state.symbols, alias.name))
alias.valid = false
}