Skip to content

Commit dafaa6d

Browse files
committed
Parse type params for defs
1 parent 255499c commit dafaa6d

11 files changed

+299
-20
lines changed

src/compiler.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
use crate::errors::SourceError;
22
use crate::parser::{AstNode, Block, Expr, NodeId};
33
use crate::protocol::Command;
4-
use crate::resolver::{DeclId, Frame, NameBindings, ScopeId, VarId, Variable};
4+
use crate::resolver::{
5+
DeclId, Frame, NameBindings, ScopeId, TypeDecl, TypeDeclId, VarId, Variable,
6+
};
57
use crate::typechecker::{TypeId, Types};
68
use std::collections::HashMap;
79

@@ -57,6 +59,10 @@ pub struct Compiler {
5759
pub variables: Vec<Variable>,
5860
/// Mapping of variable's name node -> Variable
5961
pub var_resolution: HashMap<NodeId, VarId>,
62+
/// Type declarations, indexed by TypeDeclId
63+
pub type_decls: Vec<TypeDecl>,
64+
/// Mapping of type decl's name node -> TypeDecl
65+
pub type_resolution: HashMap<NodeId, TypeDeclId>,
6066
/// Declarations (commands, aliases, externs), indexed by DeclId
6167
pub decls: Vec<Box<dyn Command>>,
6268
/// Declaration NodeIds, indexed by DeclId
@@ -96,6 +102,8 @@ impl Compiler {
96102
scope_stack: vec![],
97103
variables: vec![],
98104
var_resolution: HashMap::new(),
105+
type_decls: vec![],
106+
type_resolution: HashMap::new(),
99107
decls: vec![],
100108
decl_nodes: vec![],
101109
decl_resolution: HashMap::new(),
@@ -160,6 +168,8 @@ impl Compiler {
160168
self.scope_stack.extend(name_bindings.scope_stack);
161169
self.variables.extend(name_bindings.variables);
162170
self.var_resolution.extend(name_bindings.var_resolution);
171+
self.type_decls.extend(name_bindings.type_decls);
172+
self.type_resolution.extend(name_bindings.type_resolution);
163173
self.decls.extend(name_bindings.decls);
164174
self.decl_nodes.extend(name_bindings.decl_nodes);
165175
self.decl_resolution.extend(name_bindings.decl_resolution);

src/parser.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ pub enum Stmt {
133133
// Definitions
134134
Def {
135135
name: NodeId,
136+
type_params: Option<NodeId>,
136137
params: NodeId,
137138
in_out_types: Option<NodeId>,
138139
block: NodeId,
@@ -175,6 +176,8 @@ pub enum AstNode {
175176
Type(TypeAst),
176177

177178
Name,
179+
/// For now, each type parameter is a Name
180+
TypeParams(Vec<NodeId>),
178181
TypeArgs(Vec<NodeId>),
179182
VarDecl,
180183

@@ -958,6 +961,32 @@ impl Parser {
958961
self.create_node(AstNode::Params(param_list), span_start, span_end)
959962
}
960963

964+
pub fn type_params(&mut self) -> NodeId {
965+
let _span = span!();
966+
let span_start = self.position();
967+
self.less_than();
968+
969+
let mut param_list = vec![];
970+
971+
while self.has_tokens() {
972+
if self.is_greater_than() {
973+
break;
974+
}
975+
976+
if self.is_comma() {
977+
self.tokens.advance();
978+
continue;
979+
}
980+
981+
param_list.push(self.name());
982+
}
983+
984+
let span_end = self.position() + 1;
985+
self.greater_than();
986+
987+
self.create_node(AstNode::TypeParams(param_list), span_start, span_end)
988+
}
989+
961990
pub fn type_args(&mut self) -> NodeId {
962991
let _span = span!();
963992
let span_start = self.position();
@@ -1099,6 +1128,12 @@ impl Parser {
10991128
_ => return self.error("expected def name"),
11001129
};
11011130

1131+
let type_params = if self.is_less_than() {
1132+
Some(self.type_params())
1133+
} else {
1134+
None
1135+
};
1136+
11021137
let params = self.signature_params(ParamsContext::Squares);
11031138
let in_out_types = if self.is_colon() {
11041139
Some(self.in_out_types())
@@ -1112,6 +1147,7 @@ impl Parser {
11121147
self.create_stmt(
11131148
Stmt::Def {
11141149
name,
1150+
type_params,
11151151
params,
11161152
in_out_types,
11171153
block,

0 commit comments

Comments
 (0)