Sorting out how bindings are added to name lookup. (#2869)

This shifts logic so that bindings are added to name lookup only after the scope is complete, removing logic around adding/removing/re-adding names in certain scopes.

This does mean that things like a function's forward declaration will need to go through an extra hoop for name conflict checks, because under this approach a function definition does conflict checking when it adds names for the body's use. But, that seems easy to address, and better than the current hoops.
This commit is contained in:
Jon Ross-Perkins
2023-06-01 16:50:34 -07:00
committed by GitHub
parent a1a7251716
commit 39f7aae98d
76 changed files with 484 additions and 620 deletions
@@ -4,9 +4,9 @@
//
// AUTOUPDATE
// CHECK:STDOUT: cross_reference_irs_size: 1
// CHECK:STDOUT: callables: [
// CHECK:STDOUT: {param_refs: block2, return_type: type0},
// CHECK:STDOUT: {param_refs: block0},
// CHECK:STDOUT: functions: [
// CHECK:STDOUT: {name: str1, param_refs: block2, return_type: type0, body: block4},
// CHECK:STDOUT: {name: str2, param_refs: block0, body: block5},
// CHECK:STDOUT: ]
// CHECK:STDOUT: integer_literals: [
// CHECK:STDOUT: ]
@@ -27,14 +27,12 @@
// CHECK:STDOUT: {kind: VarStorage, type: type0},
// CHECK:STDOUT: {kind: BindName, arg0: str0, arg1: node+2, type: type0},
// CHECK:STDOUT: {kind: StructValue, arg0: block0, type: type0},
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: str1, arg1: callable0},
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: function0},
// CHECK:STDOUT: {kind: ReturnExpression, arg0: node+2, type: type0},
// CHECK:STDOUT: {kind: FunctionDefinition, arg0: node+5, arg1: block4},
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: str2, arg1: callable1},
// CHECK:STDOUT: {kind: FunctionDeclaration, arg0: function1},
// CHECK:STDOUT: {kind: StructValue, arg0: block0, type: type0},
// CHECK:STDOUT: {kind: StubReference, arg0: node+9, type: type0},
// CHECK:STDOUT: {kind: Call, arg0: block6, arg1: callable0, type: type0},
// CHECK:STDOUT: {kind: FunctionDefinition, arg0: node+8, arg1: block5},
// CHECK:STDOUT: {kind: StubReference, arg0: node+8, type: type0},
// CHECK:STDOUT: {kind: Call, arg0: block6, arg1: function0, type: type0},
// CHECK:STDOUT: ]
// CHECK:STDOUT: node_blocks: [
// CHECK:STDOUT: [
@@ -52,19 +50,17 @@
// CHECK:STDOUT: node+4,
// CHECK:STDOUT: node+5,
// CHECK:STDOUT: node+7,
// CHECK:STDOUT: node+8,
// CHECK:STDOUT: node+12,
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node+6,
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node+8,
// CHECK:STDOUT: node+9,
// CHECK:STDOUT: node+10,
// CHECK:STDOUT: node+11,
// CHECK:STDOUT: ],
// CHECK:STDOUT: [
// CHECK:STDOUT: node+10,
// CHECK:STDOUT: node+9,
// CHECK:STDOUT: ],
// CHECK:STDOUT: ]