method_name: Option<Token> -> Option<Identifier>

This commit is contained in:
Shunsuke Shibayama 2022-09-09 16:46:36 +09:00
parent 892ab6df2f
commit 7a682db817
6 changed files with 55 additions and 25 deletions

View file

@ -1024,7 +1024,7 @@ impl CodeGenerator {
} }
} }
fn emit_call_method(&mut self, obj: Expr, method_name: Token, args: Args) { fn emit_call_method(&mut self, obj: Expr, method_name: Identifier, args: Args) {
log!(info "entered {}", fn_name!()); log!(info "entered {}", fn_name!());
if &method_name.inspect()[..] == "update!" { if &method_name.inspect()[..] == "update!" {
return self.emit_call_update(obj, args); return self.emit_call_update(obj, args);
@ -1035,7 +1035,7 @@ impl CodeGenerator {
self.emit_load_method_instr( self.emit_load_method_instr(
&class, &class,
uniq_obj_name.as_ref().map(|s| &s[..]), uniq_obj_name.as_ref().map(|s| &s[..]),
method_name.content, method_name.name.into_token().content,
) )
.unwrap_or_else(|err| { .unwrap_or_else(|err| {
self.errs.push(err); self.errs.push(err);

View file

@ -11,7 +11,7 @@ use erg_common::{enum_unwrap, fmt_option, fmt_slice, log, set};
use Type::*; use Type::*;
use ast::VarName; use ast::VarName;
use erg_parser::ast; use erg_parser::ast::{self, Identifier};
use erg_parser::token::Token; use erg_parser::token::Token;
use erg_type::constructors::{func, mono, mono_proj, poly, ref_, ref_mut, refinement, subr_t}; use erg_type::constructors::{func, mono, mono_proj, poly, ref_, ref_mut, refinement, subr_t};
@ -332,7 +332,7 @@ impl Context {
fn search_callee_t( fn search_callee_t(
&self, &self,
obj: &hir::Expr, obj: &hir::Expr,
method_name: &Option<Token>, method_name: &Option<Identifier>,
namespace: &Str, namespace: &Str,
) -> TyCheckResult<Type> { ) -> TyCheckResult<Type> {
if let Some(method_name) = method_name.as_ref() { if let Some(method_name) = method_name.as_ref() {
@ -592,7 +592,7 @@ impl Context {
fn substitute_call( fn substitute_call(
&self, &self,
obj: &hir::Expr, obj: &hir::Expr,
method_name: &Option<Token>, method_name: &Option<Identifier>,
instance: &Type, instance: &Type,
pos_args: &[hir::PosArg], pos_args: &[hir::PosArg],
kw_args: &[hir::KwArg], kw_args: &[hir::KwArg],
@ -605,8 +605,12 @@ impl Context {
self.substitute_call(obj, method_name, &refine.t, pos_args, kw_args) self.substitute_call(obj, method_name, &refine.t, pos_args, kw_args)
} }
Type::Subr(subr) => { Type::Subr(subr) => {
let callee = if let Some(name) = method_name { let callee = if let Some(ident) = method_name {
let attr = hir::Attribute::new(obj.clone(), name.clone(), Type::Uninited); let attr = hir::Attribute::new(
obj.clone(),
ident.name.clone().into_token(),
Type::Uninited,
);
let acc = hir::Expr::Accessor(hir::Accessor::Attr(attr)); let acc = hir::Expr::Accessor(hir::Accessor::Attr(attr));
acc acc
} else { } else {
@ -829,7 +833,7 @@ impl Context {
pub(crate) fn get_call_t( pub(crate) fn get_call_t(
&self, &self,
obj: &hir::Expr, obj: &hir::Expr,
method_name: &Option<Token>, method_name: &Option<Identifier>,
pos_args: &[hir::PosArg], pos_args: &[hir::PosArg],
kw_args: &[hir::KwArg], kw_args: &[hir::KwArg],
namespace: &Str, namespace: &Str,
@ -843,7 +847,7 @@ impl Context {
let found = self.search_callee_t(obj, method_name, namespace)?; let found = self.search_callee_t(obj, method_name, namespace)?;
log!( log!(
"Found:\ncallee: {obj}{}\nfound: {found}", "Found:\ncallee: {obj}{}\nfound: {found}",
fmt_option!(pre ".", method_name.as_ref().map(|t| &t.content)) fmt_option!(pre ".", method_name.as_ref().map(|ident| &ident.name))
); );
let instance = self.instantiate(found, obj)?; let instance = self.instantiate(found, obj)?;
log!( log!(

View file

@ -937,7 +937,7 @@ impl UnaryOp {
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct Call { pub struct Call {
pub obj: Box<Expr>, pub obj: Box<Expr>,
pub method_name: Option<Token>, pub method_name: Option<Identifier>,
pub args: Args, pub args: Args,
/// 全体の型(引数自体の型は関係ない)、e.g. `abs(-1)` -> `Neg -> Nat` /// 全体の型(引数自体の型は関係ない)、e.g. `abs(-1)` -> `Neg -> Nat`
pub sig_t: Type, pub sig_t: Type,
@ -949,7 +949,7 @@ impl NestedDisplay for Call {
f, f,
"({}){} (: {}):", "({}){} (: {}):",
self.obj, self.obj,
fmt_option!(pre ".", self.method_name.as_ref().map(|t| t.inspect())), fmt_option!(self.method_name),
self.sig_t self.sig_t
)?; )?;
self.args.fmt_nest(f, level + 1) self.args.fmt_nest(f, level + 1)
@ -992,7 +992,7 @@ impl Locational for Call {
} }
impl Call { impl Call {
pub fn new(obj: Expr, method_name: Option<Token>, args: Args, sig_t: Type) -> Self { pub fn new(obj: Expr, method_name: Option<Identifier>, args: Args, sig_t: Type) -> Self {
Self { Self {
obj: Box::new(obj), obj: Box::new(obj),
method_name, method_name,

View file

@ -384,11 +384,19 @@ impl ASTLowerer {
let class = self.lower_expr(*pack.class)?; let class = self.lower_expr(*pack.class)?;
let args = self.lower_record(pack.args)?; let args = self.lower_record(pack.args)?;
let args = vec![hir::PosArg::new(hir::Expr::Record(args))]; let args = vec![hir::PosArg::new(hir::Expr::Record(args))];
let method_name = Token::new( let method_name = ast::Identifier::new(
TokenKind::Symbol, Some(Token::new(
Str::rc("new"), TokenKind::Dot,
Str::ever("."),
pack.connector.lineno, pack.connector.lineno,
pack.connector.col_begin, pack.connector.col_begin,
)),
ast::VarName::new(Token::new(
TokenKind::Symbol,
Str::ever("new"),
pack.connector.lineno,
pack.connector.col_begin,
)),
); );
let sig_t = self.ctx.get_call_t( let sig_t = self.ctx.get_call_t(
&class, &class,

View file

@ -856,7 +856,7 @@ impl UnaryOp {
#[derive(Clone, Debug, PartialEq, Eq, Hash)] #[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct Call { pub struct Call {
pub obj: Box<Expr>, pub obj: Box<Expr>,
pub method_name: Option<Token>, pub method_name: Option<Identifier>,
pub args: Args, pub args: Args,
} }
@ -864,7 +864,7 @@ impl NestedDisplay for Call {
fn fmt_nest(&self, f: &mut std::fmt::Formatter<'_>, level: usize) -> std::fmt::Result { fn fmt_nest(&self, f: &mut std::fmt::Formatter<'_>, level: usize) -> std::fmt::Result {
write!(f, "({})", self.obj)?; write!(f, "({})", self.obj)?;
if let Some(method_name) = self.method_name.as_ref() { if let Some(method_name) = self.method_name.as_ref() {
write!(f, ".{}", method_name.content)?; write!(f, "{}", method_name)?;
} }
writeln!(f, ":")?; writeln!(f, ":")?;
self.args.fmt_nest(f, level + 1) self.args.fmt_nest(f, level + 1)
@ -884,7 +884,7 @@ impl Locational for Call {
} }
impl Call { impl Call {
pub fn new(obj: Expr, method_name: Option<Token>, args: Args) -> Self { pub fn new(obj: Expr, method_name: Option<Identifier>, args: Args) -> Self {
Self { Self {
obj: Box::new(obj), obj: Box::new(obj),
method_name, method_name,
@ -1777,7 +1777,7 @@ impl fmt::Display for Identifier {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match &self.dot { match &self.dot {
Some(_dot) => write!(f, ".{}", self.name), Some(_dot) => write!(f, ".{}", self.name),
None => write!(f, "{}", self.name), None => write!(f, "::{}", self.name),
} }
} }
} }

View file

@ -980,7 +980,8 @@ impl Parser {
.transpose() .transpose()
.map_err(|_| self.stack_dec())? .map_err(|_| self.stack_dec())?
{ {
let call = Call::new(obj, Some(symbol), args); let ident = Identifier::new(None, VarName::new(symbol));
let call = Call::new(obj, Some(ident), args);
stack.push(ExprOrOp::Expr(Expr::Call(call))); stack.push(ExprOrOp::Expr(Expr::Call(call)));
} else { } else {
let acc = Accessor::attr(obj, vis, Local::new(symbol)); let acc = Accessor::attr(obj, vis, Local::new(symbol));
@ -1038,7 +1039,8 @@ impl Parser {
.transpose() .transpose()
.map_err(|_| self.stack_dec())? .map_err(|_| self.stack_dec())?
{ {
let call = Call::new(obj, Some(symbol), args); let ident = Identifier::new(Some(vis), VarName::new(symbol));
let call = Call::new(obj, Some(ident), args);
stack.push(ExprOrOp::Expr(Expr::Call(call))); stack.push(ExprOrOp::Expr(Expr::Call(call)));
} else { } else {
let acc = Accessor::attr(obj, vis, Local::new(symbol)); let acc = Accessor::attr(obj, vis, Local::new(symbol));
@ -1192,7 +1194,8 @@ impl Parser {
.transpose() .transpose()
.map_err(|_| self.stack_dec())? .map_err(|_| self.stack_dec())?
{ {
let call = Call::new(obj, Some(symbol), args); let ident = Identifier::new(Some(vis), VarName::new(symbol));
let call = Call::new(obj, Some(ident), args);
stack.push(ExprOrOp::Expr(Expr::Call(call))); stack.push(ExprOrOp::Expr(Expr::Call(call)));
} else { } else {
let acc = Accessor::attr(obj, vis, Local::new(symbol)); let acc = Accessor::attr(obj, vis, Local::new(symbol));
@ -1382,7 +1385,22 @@ impl Parser {
if let Some(res) = self.opt_reduce_args() { if let Some(res) = self.opt_reduce_args() {
let args = res.map_err(|_| self.stack_dec())?; let args = res.map_err(|_| self.stack_dec())?;
let (obj, method_name) = match acc { let (obj, method_name) = match acc {
Accessor::Attr(attr) => (*attr.obj, Some(attr.name.symbol)), Accessor::Attr(attr) => {
if attr.vis.is(Dot) {
(
*attr.obj,
Some(Identifier::new(
Some(attr.vis),
VarName::new(attr.name.symbol),
)),
)
} else {
(
*attr.obj,
Some(Identifier::new(None, VarName::new(attr.name.symbol))),
)
}
}
Accessor::Local(local) => (Expr::Accessor(Accessor::Local(local)), None), Accessor::Local(local) => (Expr::Accessor(Accessor::Local(local)), None),
_ => todo!(), _ => todo!(),
}; };