| ... | @@ -11,6 +11,7 @@ pub const Node = struct { | ... | @@ -11,6 +11,7 @@ pub const Node = struct { |
| 11 | pub const Id = enum { | 11 | pub const Id = enum { |
| 12 | Root, | 12 | Root, |
| 13 | VarDecl, | 13 | VarDecl, |
| | 14 | ErrorSetDecl, |
| 14 | ContainerDecl, | 15 | ContainerDecl, |
| 15 | StructField, | 16 | StructField, |
| 16 | UnionTag, | 17 | UnionTag, |
| ... | @@ -44,6 +45,7 @@ pub const Node = struct { | ... | @@ -44,6 +45,7 @@ pub const Node = struct { |
| 44 | return switch (base.id) { | 45 | return switch (base.id) { |
| 45 | Id.Root => @fieldParentPtr(NodeRoot, "base", base).iterate(index), | 46 | Id.Root => @fieldParentPtr(NodeRoot, "base", base).iterate(index), |
| 46 | Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).iterate(index), | 47 | Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).iterate(index), |
| | 48 | Id.ErrorSetDecl => @fieldParentPtr(NodeErrorSetDecl, "base", base).iterate(index), |
| 47 | Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).iterate(index), | 49 | Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).iterate(index), |
| 48 | Id.StructField => @fieldParentPtr(NodeStructField, "base", base).iterate(index), | 50 | Id.StructField => @fieldParentPtr(NodeStructField, "base", base).iterate(index), |
| 49 | Id.UnionTag => @fieldParentPtr(NodeUnionTag, "base", base).iterate(index), | 51 | Id.UnionTag => @fieldParentPtr(NodeUnionTag, "base", base).iterate(index), |
| ... | @@ -78,6 +80,7 @@ pub const Node = struct { | ... | @@ -78,6 +80,7 @@ pub const Node = struct { |
| 78 | return switch (base.id) { | 80 | return switch (base.id) { |
| 79 | Id.Root => @fieldParentPtr(NodeRoot, "base", base).firstToken(), | 81 | Id.Root => @fieldParentPtr(NodeRoot, "base", base).firstToken(), |
| 80 | Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).firstToken(), | 82 | Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).firstToken(), |
| | 83 | Id.ErrorSetDecl => @fieldParentPtr(NodeErrorSetDecl, "base", base).firstToken(), |
| 81 | Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).firstToken(), | 84 | Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).firstToken(), |
| 82 | Id.StructField => @fieldParentPtr(NodeStructField, "base", base).firstToken(), | 85 | Id.StructField => @fieldParentPtr(NodeStructField, "base", base).firstToken(), |
| 83 | Id.UnionTag => @fieldParentPtr(NodeUnionTag, "base", base).firstToken(), | 86 | Id.UnionTag => @fieldParentPtr(NodeUnionTag, "base", base).firstToken(), |
| ... | @@ -112,6 +115,7 @@ pub const Node = struct { | ... | @@ -112,6 +115,7 @@ pub const Node = struct { |
| 112 | return switch (base.id) { | 115 | return switch (base.id) { |
| 113 | Id.Root => @fieldParentPtr(NodeRoot, "base", base).lastToken(), | 116 | Id.Root => @fieldParentPtr(NodeRoot, "base", base).lastToken(), |
| 114 | Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).lastToken(), | 117 | Id.VarDecl => @fieldParentPtr(NodeVarDecl, "base", base).lastToken(), |
| | 118 | Id.ErrorSetDecl => @fieldParentPtr(NodeErrorSetDecl, "base", base).lastToken(), |
| 115 | Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).lastToken(), | 119 | Id.ContainerDecl => @fieldParentPtr(NodeContainerDecl, "base", base).lastToken(), |
| 116 | Id.StructField => @fieldParentPtr(NodeStructField, "base", base).lastToken(), | 120 | Id.StructField => @fieldParentPtr(NodeStructField, "base", base).lastToken(), |
| 117 | Id.UnionTag => @fieldParentPtr(NodeUnionTag, "base", base).lastToken(), | 121 | Id.UnionTag => @fieldParentPtr(NodeUnionTag, "base", base).lastToken(), |
| ... | @@ -212,6 +216,30 @@ pub const NodeVarDecl = struct { | ... | @@ -212,6 +216,30 @@ pub const NodeVarDecl = struct { |
| 212 | } | 216 | } |
| 213 | }; | 217 | }; |
| 214 | | 218 | |
| | 219 | pub const NodeErrorSetDecl = struct { |
| | 220 | base: Node, |
| | 221 | error_token: Token, |
| | 222 | decls: ArrayList(&NodeIdentifier), |
| | 223 | rbrace_token: Token, |
| | 224 | |
| | 225 | pub fn iterate(self: &NodeErrorSetDecl, index: usize) ?&Node { |
| | 226 | var i = index; |
| | 227 | |
| | 228 | if (i < self.decls.len) return self.decls.at(i); |
| | 229 | i -= self.decls.len; |
| | 230 | |
| | 231 | return null; |
| | 232 | } |
| | 233 | |
| | 234 | pub fn firstToken(self: &NodeErrorSetDecl) Token { |
| | 235 | return self.error_token; |
| | 236 | } |
| | 237 | |
| | 238 | pub fn lastToken(self: &NodeErrorSetDecl) Token { |
| | 239 | return self.rbrace_token; |
| | 240 | } |
| | 241 | }; |
| | 242 | |
| 215 | pub const NodeContainerDecl = struct { | 243 | pub const NodeContainerDecl = struct { |
| 216 | base: Node, | 244 | base: Node, |
| 217 | ltoken: Token, | 245 | ltoken: Token, |
| ... | @@ -251,23 +279,8 @@ pub const NodeContainerDecl = struct { | ... | @@ -251,23 +279,8 @@ pub const NodeContainerDecl = struct { |
| 251 | InitArg.Enum => { } | 279 | InitArg.Enum => { } |
| 252 | } | 280 | } |
| 253 | | 281 | |
| 254 | if (i < self.decls.len) return self.decls.at(i); | 282 | if (i < self.fields_and_decls.len) return self.fields_and_decls.at(i); |
| 255 | i -= self.decls.len; | 283 | i -= self.fields_and_decls.len; |
| 256 | | | |
| 257 | switch (self.kind) { | | |
| 258 | Kind.Struct => |fields| { | | |
| 259 | if (i < fields.len) return fields.at(i); | | |
| 260 | i -= fields.len; | | |
| 261 | }, | | |
| 262 | Kind.Enum => |tags| { | | |
| 263 | if (i < tags.len) return tags.at(i); | | |
| 264 | i -= tags.len; | | |
| 265 | }, | | |
| 266 | Kind.Union => |tags| { | | |
| 267 | if (i < tags.len) return tags.at(i); | | |
| 268 | i -= tags.len; | | |
| 269 | }, | | |
| 270 | } | | |
| 271 | | 284 | |
| 272 | return null; | 285 | return null; |
| 273 | } | 286 | } |