Skip to content

Commit 276d974

Browse files
authored
Merge pull request #107 from Pivot-Studio/Chronostasys/issue103
Chronostasys/issue103
2 parents 619f4fb + 6ead74f commit 276d974

File tree

15 files changed

+863
-778
lines changed

15 files changed

+863
-778
lines changed

src/ast/ctx.rs

Lines changed: 3 additions & 738 deletions
Large diffs are not rendered by default.

src/ast/gcapi.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ use inkwell::{
44
AddressSpace,
55
};
66

7-
use super::ctx::{Ctx, FNType, Mod};
7+
use super::ctx::{Ctx, Mod};
8+
use super::pltype::FNType;
89

910
impl<'a, 'ctx> Ctx<'a, 'ctx> {
1011
pub fn mv2heap(&self, val: BasicValueEnum<'ctx>) -> BasicValueEnum<'ctx> {

src/ast/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ pub mod diag;
55
pub mod dot;
66
pub mod gcapi;
77
pub mod node;
8+
pub mod pltype;
89
pub mod range;
910
pub mod tokens;

src/ast/node/control.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
use super::statement::StatementsNode;
22
use super::*;
3-
use crate::ast::ctx::{Ctx, PriType};
3+
use crate::ast::ctx::Ctx;
44
use crate::ast::diag::ErrorCode;
5+
use crate::ast::pltype::PriType;
56
use internal_macro::range;
67

78
#[range]

src/ast/node/function.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
use super::statement::StatementsNode;
22
use super::*;
33
use super::{alloc, types::TypedIdentifierNode, Node, TypeNode};
4-
use crate::ast::ctx::{FNType, PLType};
54
use crate::ast::diag::ErrorCode;
65
use crate::ast::node::{deal_line, tab};
6+
use crate::ast::pltype::{FNType, PLType};
77
use crate::utils::read_config::enter;
88
use inkwell::debug_info::*;
99
use inkwell::values::FunctionValue;
@@ -354,6 +354,7 @@ pub struct FuncTypeNode {
354354
pub ret: Box<TypeNodeEnum>,
355355
pub doc: Vec<Box<NodeEnum>>,
356356
pub declare: bool,
357+
pub generics: Option<Box<GenericDefNode>>,
357358
}
358359
impl FuncTypeNode {
359360
pub fn emit_func_type<'a, 'ctx>(

src/ast/node/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,9 @@ use self::ret::*;
2626
use self::statement::*;
2727
use self::types::*;
2828

29-
use super::ctx::{PLDiag, PLType};
29+
use super::ctx::PLDiag;
3030
use super::diag::ErrorCode;
31+
use super::pltype::PLType;
3132
use super::range::{Pos, Range};
3233

3334
pub mod comment;

src/ast/node/operator.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use super::primary::VarNode;
22
use super::*;
33
use crate::ast::ctx::Ctx;
4-
use crate::ast::ctx::PLType;
5-
use crate::ast::ctx::PriType;
4+
use crate::ast::pltype::PLType;
5+
use crate::ast::pltype::PriType;
66
use crate::ast::tokens::TokenType;
77

88
use crate::ast::diag::ErrorCode;

src/ast/node/pkg.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@ use lsp_types::SemanticTokenType;
55

66
use crate::{
77
ast::{
8-
ctx::{get_ns_path_completions, Ctx, PLType},
8+
ctx::{get_ns_path_completions, Ctx},
99
diag::ErrorCode,
1010
node::{deal_line, tab},
11+
pltype::PLType,
1112
},
1213
utils::read_config::enter,
1314
};

src/ast/node/primary.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use super::*;
2-
use crate::ast::ctx::{Ctx, PLType, PriType};
2+
use crate::ast::ctx::Ctx;
33
use crate::ast::diag::ErrorCode;
4+
use crate::ast::pltype::{PLType, PriType};
45
use internal_macro::range;
56
use lsp_types::SemanticTokenType;
67

src/ast/node/types.rs

Lines changed: 60 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ use std::rc::Rc;
33

44
use super::primary::VarNode;
55
use super::*;
6-
use crate::ast::ctx::{ARRType, Ctx, Field, PLType, STType};
6+
use crate::ast::ctx::Ctx;
77
use crate::ast::diag::ErrorCode;
8+
use crate::ast::pltype::{ARRType, Field, PLType, STType};
89
use crate::ast::range::Range;
910
use crate::utils::read_config::enter;
1011
use inkwell::types::{AnyType, BasicType};
@@ -248,7 +249,13 @@ impl StructDefNode {
248249
refs: Rc::new(RefCell::new(vec![])),
249250
doc: vec![],
250251
methods: FxHashMap::default(),
252+
generics: None,
253+
is_generic_place_holder: false,
251254
})));
255+
// skip generics
256+
if self.generics.is_some() {
257+
return;
258+
}
252259
ctx.context
253260
.opaque_struct_type(&ctx.plmod.get_full_name(&self.id.name));
254261
_ = ctx.add_type(self.id.name.clone(), stu, self.range);
@@ -289,30 +296,34 @@ impl StructDefNode {
289296
i = i + 1;
290297
}
291298
let name = self.id.name.as_str();
292-
let st = ctx
293-
.module
294-
.get_struct_type(&ctx.plmod.get_full_name(name))
295-
.unwrap();
296299
let newf = order_fields.clone();
297-
st.set_body(
298-
&order_fields
299-
.into_iter()
300-
.map(|order_field| {
301-
order_field
302-
.pltype
303-
.get_type(ctx)
304-
.unwrap()
305-
.borrow()
306-
.get_basic_type(&ctx)
307-
})
308-
.collect::<Vec<_>>(),
309-
false,
310-
);
300+
// skip generics
301+
if self.generics.is_none() {
302+
let st = ctx
303+
.module
304+
.get_struct_type(&ctx.plmod.get_full_name(name))
305+
.unwrap();
306+
st.set_body(
307+
&order_fields
308+
.into_iter()
309+
.map(|order_field| {
310+
order_field
311+
.pltype
312+
.get_type(ctx)
313+
.unwrap()
314+
.borrow()
315+
.get_basic_type(&ctx)
316+
})
317+
.collect::<Vec<_>>(),
318+
false,
319+
);
320+
}
311321
let tp = ctx.get_type(&self.id.name.as_str(), self.range).unwrap();
312322
if let PLType::STRUCT(st) = &mut *tp.borrow_mut() {
313323
st.fields = fields;
314324
st.ordered_fields = newf;
315325
st.doc = self.doc.clone();
326+
st.generics = self.generics.clone();
316327
}
317328
ctx.set_if_refs_tp(tp.clone(), self.range);
318329
ctx.add_doc_symbols(tp.clone());
@@ -521,3 +532,33 @@ impl Node for ArrayInitNode {
521532
pub struct GenericDefNode {
522533
pub generics: Vec<Box<VarNode>>,
523534
}
535+
536+
impl GenericDefNode {
537+
pub fn child_ctx<'a, 'ctx>(&'a mut self, ctx: &'a mut Ctx<'a, 'ctx>) -> Ctx<'a, 'ctx> {
538+
let mut child = ctx.new_child(self.range.start);
539+
for gen in self.generics.iter() {
540+
let range = gen.range();
541+
let name = "__generic__".to_string() + gen.name.clone().as_str();
542+
let pltype = PLType::STRUCT(STType {
543+
name,
544+
path: ctx.plmod.path.clone(),
545+
fields: FxHashMap::default(),
546+
ordered_fields: vec![],
547+
range,
548+
refs: Rc::new(RefCell::new(vec![])),
549+
doc: vec![],
550+
methods: FxHashMap::default(),
551+
generics: None,
552+
is_generic_place_holder: true,
553+
});
554+
_ = child.add_type(gen.name.clone(), Rc::new(RefCell::new(pltype)), range);
555+
}
556+
child
557+
}
558+
}
559+
560+
#[range]
561+
#[derive(Clone, PartialEq, Eq, Debug)]
562+
pub struct GenericParamNode {
563+
pub generics: Vec<Box<NodeEnum>>,
564+
}

0 commit comments

Comments
 (0)