Pular para o conteúdo

O mapa de símbolos

De onde vem cada nome de um arquivo — o análogo do mapa que um ligador escreve, e a resposta para a pergunta que mais custa num projeto grande.

Num projeto de duzentos arquivos, "de onde vem este nome?" é a pergunta que mais custa a responder à mão. Um ligador escreve isso num arquivo de mapa; aqui ele sai do mesmo caminho que o check usa para atravessar arquivos.

dataforge
adopt Arcane.Abi as Abi
adopt Arcane.IO as IO
adopt Arcane.OS as OS

caminho := $"{OS.temp_dir()}/exemplo-{randint(100000, 999999)}.df"
IO.write(caminho, "adopt Arcane.Math as M\n\n" +
                  "action calcular(n):\n" +
                  "    yield M.sqrt(n) + len(\"abc\") + fantasma\n")

origem := {e["nome"]: e["origem"] cycle e in Abi.mapa(caminho)}

assert origem["M"] is "modulo"              // veio de um adopt
assert origem["len"] is "embutido"          // uma das 228 globais
assert origem["calcular"] is "local"        // declarado neste arquivo
assert origem["fantasma"] is "desconhecido" // NINGUEM prove este nome

IO.delete(caminho)
OrigemO que quer dizer
moduloveio de um adopt; de traz o módulo e linha, a linha do import
localdeclarado neste arquivo — ação, record, blueprint, enum ou variável de topo
embutidouma das 228 funções globais, sem import
desconhecidoninguém provê este nome — é isto que interessa

O nome sem dono#

A linha desconhecido é a que paga o mapa. Um nome que nenhum adopt, nenhuma declaração local e nenhum embutido provê é, quase sempre, uma das três coisas: um erro de digitação, um adopt que alguém apagou, ou um nome que vem de um arquivo vizinho que este não importa.

O `check` já acusa o nome indefinido quando consegue provar. O mapa é a outra metade: ele lista tudo, com a origem de cada um, e serve para revisar um arquivo inteiro de uma vez em vez de esperar o analisador tropeçar.