---
id: LSN-0019
ticket: pbs-learn-to-discussion-lessons-migration
title: PBS Name Resolution and Linking Legacy Import
created: 2026-03-27
tags: [compiler, pbs, legacy-import, linking, name-resolution, imports]
---

## Context

Legacy import from `docs/compiler/pbs/learn/02. Name Resolution and Linking.md`.

This lesson preserves the durable namespace and phase-boundary model for PBS frontend resolution after the domain workflow artifacts were pruned.

## Key Decisions

### Module scope is assembled before visibility filtering

**What:** PBS collects declarations across all `.pbs` files in a module before `mod.barrel` visibility is applied.

**Why:** `mod.barrel` is a visibility filter, not a declaration factory.

**Trade-offs:** Module assembly must be explicit and deterministic, but the resulting linking model is much cleaner.

### Linking owns visible-space conflicts

**What:** Different-origin imported collisions, local-versus-import clashes, and barrel-driven visibility conflicts are rejected in linking before callsite analysis.

**Why:** Static semantics should operate only after the visible declaration space is already unambiguous.

**Trade-offs:** Linking becomes stricter, but overload resolution and typing stop carrying unrelated ambiguity debt.

## Patterns and Algorithms

- Build module scope before import visibility decisions.
- Resolve callable imports as exported callable sets, not isolated overload fragments.
- Reject same-name different-origin conflicts before overload resolution.
- Keep builtin simple types separate from imported builtin shells.
- Treat aliasing as local spelling only; canonical identity must remain stable.

## Pitfalls

- Treating `mod.barrel` as if it creates declarations.
- Deferring imported-origin conflicts until callsite resolution.
- Letting local and imported same-name declarations silently coexist.
- Promoting imported builtin shells to the same status as always-available builtin simple types.

## Takeaways

- Linking decides what is visible; static semantics decides what a visible thing means.
- `mod.barrel` filters visibility but does not define declaration existence.
- Canonical identity must outrank textual spelling during import and linking work.
