Skip to content

Commit

Permalink
feat: add position for each name in identifier (#608)
Browse files Browse the repository at this point in the history
  • Loading branch information
He1pa committed Jul 17, 2023
1 parent 64401fa commit 0630513
Show file tree
Hide file tree
Showing 180 changed files with 2,071 additions and 529 deletions.
19 changes: 13 additions & 6 deletions kclvm/ast/src/ast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -492,7 +492,7 @@ impl SchemaStmt {
attr_list.push((
unification_stmt.target.line,
unification_stmt.target.column,
unification_stmt.target.node.names[0].to_string(),
unification_stmt.target.node.names[0].node.to_string(),
));
}
Stmt::Assign(assign_stmt) => {
Expand All @@ -501,7 +501,7 @@ impl SchemaStmt {
attr_list.push((
target.line,
target.column,
target.node.names[0].to_string(),
target.node.names[0].node.to_string(),
));
}
}
Expand All @@ -511,7 +511,7 @@ impl SchemaStmt {
attr_list.push((
aug_assign_stmt.target.line,
aug_assign_stmt.target.column,
aug_assign_stmt.target.node.names[0].to_string(),
aug_assign_stmt.target.node.names[0].node.to_string(),
));
}
}
Expand Down Expand Up @@ -642,14 +642,21 @@ pub enum Expr {
/// ```
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Identifier {
pub names: Vec<String>,
pub names: Vec<Node<String>>,
pub pkgpath: String,
pub ctx: ExprContext,
}

impl Identifier {
pub fn get_name(&self) -> String {
self.names.join(".")
self.get_names().join(".")
}

pub fn get_names(&self) -> Vec<String> {
self.names
.iter()
.map(|node| node.node.clone())
.collect::<Vec<String>>()
}
}

Expand Down Expand Up @@ -1512,7 +1519,7 @@ impl ToString for Type {
match typ {
Type::Any => w.push_str("any"),
Type::Named(x) => {
w.push_str(&x.names.join("."));
w.push_str(&x.get_name());
}
Type::Basic(x) => {
w.push_str(match x {
Expand Down
2 changes: 1 addition & 1 deletion kclvm/ast/src/path.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ use crate::ast;
/// use kclvm_ast::path::get_key_path;
///
/// let ident = Some(Box::new(ast::Node::dummy_node(ast::Expr::Identifier(ast::Identifier {
/// names: vec!["alice".to_string()],
/// names: vec![ast::Node::dummy_node("alice".to_string())],
/// pkgpath: "".to_string(),
/// ctx: ast::ExprContext::Load,
/// }))));
Expand Down
25 changes: 14 additions & 11 deletions kclvm/ast/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use crate::{ast, ast::*};
/// Construct an AssignStmt node with assign_value as value
fn build_assign_node(attr_name: &str, assign_value: NodeRef<Expr>) -> NodeRef<Stmt> {
let iden = node_ref!(Identifier {
names: vec![attr_name.to_string()],
names: vec![Node::dummy_node(attr_name.to_string())],
pkgpath: String::new(),
ctx: ExprContext::Store
});
Expand All @@ -28,7 +28,7 @@ fn get_dummy_assign_ast() -> ast::Node<ast::AssignStmt> {
ast::AssignStmt {
targets: vec![Box::new(ast::Node::new(
ast::Identifier {
names: vec![String::from("a")],
names: vec![Node::dummy_node(String::from("a"))],
pkgpath: String::from(filename),
ctx: ast::ExprContext::Load,
},
Expand Down Expand Up @@ -71,7 +71,7 @@ fn get_dummy_assign_binary_ast() -> ast::Node<ast::AssignStmt> {
ast::AssignStmt {
targets: vec![Box::new(ast::Node::new(
ast::Identifier {
names: vec![String::from("a")],
names: vec![Node::dummy_node(String::from("a"))],
pkgpath: String::from(filename),
ctx: ast::ExprContext::Load,
},
Expand All @@ -86,7 +86,7 @@ fn get_dummy_assign_binary_ast() -> ast::Node<ast::AssignStmt> {
op: ast::BinOrCmpOp::Bin(ast::BinOp::Add),
left: Box::new(ast::Node::new(
ast::Expr::Identifier(ast::Identifier {
names: vec![String::from("a")],
names: vec![Node::dummy_node(String::from("a"))],
pkgpath: String::from(filename),
ctx: ast::ExprContext::Load,
}),
Expand All @@ -98,7 +98,7 @@ fn get_dummy_assign_binary_ast() -> ast::Node<ast::AssignStmt> {
)),
right: Box::new(ast::Node::new(
ast::Expr::Identifier(ast::Identifier {
names: vec![String::from("a")],
names: vec![Node::dummy_node(String::from("a"))],
pkgpath: String::from(filename),
ctx: ast::ExprContext::Load,
}),
Expand Down Expand Up @@ -147,15 +147,15 @@ fn test_mut_walker() {
pub struct VarMutSelfMutWalker;
impl<'ctx> MutSelfMutWalker<'ctx> for VarMutSelfMutWalker {
fn walk_identifier(&mut self, identifier: &'ctx mut ast::Identifier) {
if identifier.names[0] == "a" {
if identifier.names[0].node == "a" {
let id_mut = identifier.names.get_mut(0).unwrap();
*id_mut = "x".to_string();
id_mut.node = "x".to_string();
}
}
}
let mut assign_stmt = get_dummy_assign_ast();
VarMutSelfMutWalker {}.walk_assign_stmt(&mut assign_stmt.node);
assert_eq!(assign_stmt.node.targets[0].node.names[0], "x")
assert_eq!(assign_stmt.node.targets[0].node.names[0].node, "x")
}

#[test]
Expand Down Expand Up @@ -235,7 +235,10 @@ fn test_filter_schema_with_mult_schema() {
#[test]
fn test_build_assign_stmt() {
let test_expr = node_ref!(ast::Expr::Identifier(Identifier {
names: vec!["name1".to_string(), "name2".to_string()],
names: vec![
Node::dummy_node("name1".to_string()),
Node::dummy_node("name2".to_string())
],
pkgpath: "test".to_string(),
ctx: ast::ExprContext::Load
}));
Expand All @@ -244,8 +247,8 @@ fn test_build_assign_stmt() {
if let ast::Stmt::Assign(ref assign) = assgin_stmt.node {
if let ast::Expr::Identifier(ref iden) = &assign.value.node {
assert_eq!(iden.names.len(), 2);
assert_eq!(iden.names[0], "name1".to_string());
assert_eq!(iden.names[1], "name2".to_string());
assert_eq!(iden.names[0].node, "name1".to_string());
assert_eq!(iden.names[1].node, "name2".to_string());
assert_eq!(iden.pkgpath, "test".to_string());
match iden.ctx {
ast::ExprContext::Load => {}
Expand Down
2 changes: 1 addition & 1 deletion kclvm/ast_pretty/src/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -852,7 +852,7 @@ impl<'p> Printer<'p> {
let names = &identifier.names;

let re = fancy_regex::Regex::new(IDENTIFIER_REGEX).unwrap();
let need_right_brace = !names.iter().all(|n| re.is_match(n).unwrap_or(false));
let need_right_brace = !names.iter().all(|n| re.is_match(&n.node).unwrap_or(false));
let count = if need_right_brace {
self.write(
&names
Expand Down
2 changes: 1 addition & 1 deletion kclvm/compiler/src/codegen/llvm/module.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ impl<'ctx> LLVMCodeGenContext<'ctx> {
for target in &assign_stmt.targets {
let names = &target.node.names;
if names.len() == 1 {
self.add_or_update_global_variable(&names[0], self.undefined_value());
self.add_or_update_global_variable(&names[0].node, self.undefined_value());
}
}
}
Expand Down
48 changes: 24 additions & 24 deletions kclvm/compiler/src/codegen/llvm/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ impl<'ctx> TypedResultWalker<'ctx> for LLVMCodeGenContext<'ctx> {
fn walk_unification_stmt(&self, unification_stmt: &'ctx ast::UnificationStmt) -> Self::Result {
check_backtrack_stop!(self);
self.local_vars.borrow_mut().clear();
let name = &unification_stmt.target.node.names[0];
let name = &unification_stmt.target.node.names[0].node;
self.target_vars.borrow_mut().push(name.clone());
// The right value of the unification_stmt is a schema_expr.
let value = self
Expand Down Expand Up @@ -147,7 +147,7 @@ impl<'ctx> TypedResultWalker<'ctx> for LLVMCodeGenContext<'ctx> {
for name in &assign_stmt.targets {
self.target_vars
.borrow_mut()
.push(name.node.names[0].clone());
.push(name.node.names[0].node.clone());
}
// Load the right value
let mut value = self
Expand Down Expand Up @@ -181,7 +181,7 @@ impl<'ctx> TypedResultWalker<'ctx> for LLVMCodeGenContext<'ctx> {
check_backtrack_stop!(self);
self.target_vars
.borrow_mut()
.push(aug_assign_stmt.target.node.names[0].clone());
.push(aug_assign_stmt.target.node.names[0].node.clone());
// Load the right value
let right_value = self
.walk_expr(&aug_assign_stmt.value)
Expand Down Expand Up @@ -1281,7 +1281,7 @@ impl<'ctx> TypedResultWalker<'ctx> for LLVMCodeGenContext<'ctx> {
{
let mut local_vars = self.local_vars.borrow_mut();
for v in variables {
let name = &v.node.names[0];
let name = &v.node.names[0].node;
local_vars.insert(name.clone());
}
}
Expand Down Expand Up @@ -1539,7 +1539,7 @@ impl<'ctx> TypedResultWalker<'ctx> for LLVMCodeGenContext<'ctx> {
let right_value = if is_membership_as_op {
match &binary_expr.right.node {
ast::Expr::Identifier(id) => {
let name = id.names.join(".");
let name = id.get_names().join(".");
self.string_value(&name)
}
_ => self.none_value(),
Expand Down Expand Up @@ -1634,7 +1634,7 @@ impl<'ctx> TypedResultWalker<'ctx> for LLVMCodeGenContext<'ctx> {
.walk_expr(&selector_expr.value)
.expect(kcl_error::COMPILE_ERROR_MSG);
let string_ptr_value = self
.native_global_string(selector_expr.attr.node.names[0].as_str(), "")
.native_global_string(selector_expr.attr.node.names[0].node.as_str(), "")
.into();
let fn_name = if selector_expr.has_question {
&ApiFunc::kclvm_value_load_attr_option
Expand All @@ -1643,7 +1643,7 @@ impl<'ctx> TypedResultWalker<'ctx> for LLVMCodeGenContext<'ctx> {
};
value = self.build_call(&fn_name.name(), &[value, string_ptr_value]);
for name in &selector_expr.attr.node.names[1..] {
let string_ptr_value = self.native_global_string(name, "").into();
let string_ptr_value = self.native_global_string(&name.node, "").into();
value = self.build_call(
&ApiFunc::kclvm_value_load_attr.name(),
&[value, string_ptr_value],
Expand Down Expand Up @@ -1672,7 +1672,7 @@ impl<'ctx> TypedResultWalker<'ctx> for LLVMCodeGenContext<'ctx> {
} else {
self.none_value()
};
self.dict_insert(dict_value, name.as_str(), value, 0, -1);
self.dict_insert(dict_value, name.node.as_str(), value, 0, -1);
}
let pkgpath = self.native_global_string_value(&self.current_pkgpath());
let is_in_schema =
Expand Down Expand Up @@ -1933,7 +1933,7 @@ impl<'ctx> TypedResultWalker<'ctx> for LLVMCodeGenContext<'ctx> {
} else {
self.none_value()
};
self.dict_insert(dict_value, name.as_str(), value, 0, -1);
self.dict_insert(dict_value, name.node.as_str(), value, 0, -1);
}
let pkgpath = self.native_global_string_value(&self.current_pkgpath());
let schema = self.build_call(
Expand Down Expand Up @@ -2285,7 +2285,7 @@ impl<'ctx> LLVMCodeGenContext<'ctx> {
match identifier_ctx {
ast::ExprContext::Store => {
if identifier.names.len() == 1 {
let name = identifier.names[0].as_str();
let name = identifier.names[0].node.as_str();
let tpe = self.value_ptr_type();
// Global variables
if self.scope_level() == GLOBAL_LEVEL {
Expand Down Expand Up @@ -2416,7 +2416,7 @@ impl<'ctx> LLVMCodeGenContext<'ctx> {
}
} else {
let names = &identifier.names;
let name = names[0].as_str();
let name = names[0].node.as_str();
let mut value = if is_in_schema {
self.get_variable_in_schema(name)
.expect(kcl_error::INTERNAL_ERROR_MSG)
Expand All @@ -2425,7 +2425,7 @@ impl<'ctx> LLVMCodeGenContext<'ctx> {
.expect(kcl_error::INTERNAL_ERROR_MSG)
};
for i in 0..names.len() - 1 {
let attr = names[i + 1].as_str();
let attr = names[i + 1].node.as_str();
let ctx = if matches!(identifier_ctx, ast::ExprContext::Store)
&& i != names.len() - 2
&& names.len() > 2
Expand Down Expand Up @@ -2459,7 +2459,7 @@ impl<'ctx> LLVMCodeGenContext<'ctx> {
Ok(right_value.expect(kcl_error::INTERNAL_ERROR_MSG))
}
ast::ExprContext::Load => {
let name = identifier.names[0].as_str();
let name = identifier.names[0].node.as_str();
let is_local_var = {
let local_vars = self.local_vars.borrow_mut();
local_vars.contains(name)
Expand All @@ -2472,7 +2472,7 @@ impl<'ctx> LLVMCodeGenContext<'ctx> {
}
} else {
let names = &identifier.names;
let name = names[0].as_str();
let name = names[0].node.as_str();
let mut value = if identifier.pkgpath.is_empty() {
if is_in_schema && !is_local_var {
self.get_variable_in_schema(name)
Expand All @@ -2485,7 +2485,7 @@ impl<'ctx> LLVMCodeGenContext<'ctx> {
self.ok_result().expect(kcl_error::INTERNAL_ERROR_MSG)
};
for i in 0..names.len() - 1 {
let attr = names[i + 1].as_str();
let attr = names[i + 1].node.as_str();
let ctx = if matches!(identifier_ctx, ast::ExprContext::Store)
&& i != names.len() - 2
&& names.len() > 2
Expand Down Expand Up @@ -2560,7 +2560,7 @@ impl<'ctx> LLVMCodeGenContext<'ctx> {
} else {
self.none_value()
};
self.dict_insert(dict_value, name.as_str(), value, 0, -1);
self.dict_insert(dict_value, name.node.as_str(), value, 0, -1);
}
let name = match &decorator.func.node {
ast::Expr::Identifier(ident) if ident.names.len() == 1 => ident.names[0].clone(),
Expand All @@ -2571,7 +2571,7 @@ impl<'ctx> LLVMCodeGenContext<'ctx> {
Ok(self.build_call(
&ApiFunc::kclvm_value_Decorator.name(),
&[
self.native_global_string_value(name.as_str()),
self.native_global_string_value(name.node.as_str()),
list_value,
dict_value,
schema_config_meta,
Expand Down Expand Up @@ -2629,14 +2629,14 @@ impl<'ctx> LLVMCodeGenContext<'ctx> {
&ApiFunc::kclvm_list_get_option.name(),
&[args, self.native_int_value(i as i32)],
);
self.store_variable(&arg_name.names[0], arg_value);
self.store_variable(&arg_name.names[0].node, arg_value);
}
// for loop in 0..argument_len in LLVM end
self.br(end_block);
self.builder.position_at_end(end_block);
// Keyword arguments
for arg_name in arg_names.iter() {
let name = &arg_name.names[0];
let name = &arg_name.names[0].node;
let string_ptr_value = self.native_global_string(name.as_str(), "").into();
let has_key = self
.build_call(
Expand All @@ -2660,7 +2660,7 @@ impl<'ctx> LLVMCodeGenContext<'ctx> {
&[kwargs, string_ptr_value],
);
// Find argument name in the scope
self.store_variable(&arg_name.names[0], arg);
self.store_variable(&arg_name.names[0].node, arg);
self.br(else_block);
self.builder.position_at_end(else_block);
}
Expand Down Expand Up @@ -2704,7 +2704,7 @@ impl<'ctx> LLVMCodeGenContext<'ctx> {
{
let mut local_vars = self.local_vars.borrow_mut();
for v in targets {
let name = &v.node.names[0];
let name = &v.node.names[0].node;
local_vars.insert(name.clone());
}
}
Expand Down Expand Up @@ -2780,7 +2780,7 @@ impl<'ctx> LLVMCodeGenContext<'ctx> {
{
let mut local_vars = self.local_vars.borrow_mut();
for v in targets {
let name = &v.node.names[0];
let name = &v.node.names[0].node;
local_vars.remove(name);
}
}
Expand All @@ -2797,7 +2797,7 @@ impl<'ctx> LLVMCodeGenContext<'ctx> {
if let Some(key) = &item.node.key {
let mut insert_index = -1;
let optional_name = match &key.node {
ast::Expr::Identifier(identifier) => Some(identifier.names[0].clone()),
ast::Expr::Identifier(identifier) => Some(identifier.names[0].node.clone()),
ast::Expr::StringLit(string_lit) => Some(string_lit.value.clone()),
ast::Expr::Subscript(subscript) => {
let mut name = None;
Expand All @@ -2806,7 +2806,7 @@ impl<'ctx> LLVMCodeGenContext<'ctx> {
if let ast::Expr::NumberLit(number) = &index_node.node {
if let ast::NumberLitValue::Int(v) = number.value {
insert_index = v;
name = Some(identifier.names[0].clone())
name = Some(identifier.names[0].node.clone())
}
}
}
Expand Down
Loading

0 comments on commit 0630513

Please sign in to comment.