Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add position for each name in identifier #608

Merged
merged 1 commit into from
Jul 17, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading