mirror of
https://github.com/erg-lang/erg.git
synced 2025-10-03 05:54:33 +00:00
fix: declared type instantiation bug
This commit is contained in:
parent
9a031ad514
commit
53172d5132
2 changed files with 26 additions and 25 deletions
|
@ -621,13 +621,6 @@ impl Context {
|
||||||
self.inc_ref(ident.inspect(), vi, ident, self);
|
self.inc_ref(ident.inspect(), vi, ident, self);
|
||||||
return Ok(*t);
|
return Ok(*t);
|
||||||
}
|
}
|
||||||
if let Some(outer) = &self.outer {
|
|
||||||
if let Ok(t) =
|
|
||||||
outer.instantiate_mono_t(ident, opt_decl_t, tmp_tv_cache, not_found_is_qvar)
|
|
||||||
{
|
|
||||||
return Ok(t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if let Some(typ) = self
|
if let Some(typ) = self
|
||||||
.consts
|
.consts
|
||||||
.get(ident.inspect())
|
.get(ident.inspect())
|
||||||
|
@ -636,8 +629,16 @@ impl Context {
|
||||||
if let Some((_, vi)) = self.get_var_info(ident.inspect()) {
|
if let Some((_, vi)) = self.get_var_info(ident.inspect()) {
|
||||||
self.inc_ref(ident.inspect(), vi, ident, self);
|
self.inc_ref(ident.inspect(), vi, ident, self);
|
||||||
}
|
}
|
||||||
Ok(typ)
|
return Ok(typ);
|
||||||
} else if let Some(ctx) = self.get_type_ctx(ident.inspect()) {
|
}
|
||||||
|
if let Some(outer) = &self.outer {
|
||||||
|
if let Ok(t) =
|
||||||
|
outer.instantiate_mono_t(ident, opt_decl_t, tmp_tv_cache, not_found_is_qvar)
|
||||||
|
{
|
||||||
|
return Ok(t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if let Some(ctx) = self.get_type_ctx(ident.inspect()) {
|
||||||
if let Some((_, vi)) = self.get_var_info(ident.inspect()) {
|
if let Some((_, vi)) = self.get_var_info(ident.inspect()) {
|
||||||
self.inc_ref(ident.inspect(), vi, ident, self);
|
self.inc_ref(ident.inspect(), vi, ident, self);
|
||||||
}
|
}
|
||||||
|
@ -836,23 +837,23 @@ impl Context {
|
||||||
Ok(Type::NamedTuple(ts))
|
Ok(Type::NamedTuple(ts))
|
||||||
}
|
}
|
||||||
other => {
|
other => {
|
||||||
if let Some(outer) = &self.outer {
|
|
||||||
if let Ok(t) = outer.instantiate_local_poly_t(
|
|
||||||
name,
|
|
||||||
args,
|
|
||||||
opt_decl_t,
|
|
||||||
tmp_tv_cache,
|
|
||||||
not_found_is_qvar,
|
|
||||||
) {
|
|
||||||
return Ok(t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let Some(ctx) = self.get_type_ctx(other).or_else(|| {
|
let Some(ctx) = self.get_type_ctx(other).or_else(|| {
|
||||||
self.consts
|
self.consts
|
||||||
.get(other)
|
.get(other)
|
||||||
.and_then(|v| self.convert_value_into_type(v.clone()).ok())
|
.and_then(|v| self.convert_value_into_type(v.clone()).ok())
|
||||||
.and_then(|typ| self.get_nominal_type_ctx(&typ))
|
.and_then(|typ| self.get_nominal_type_ctx(&typ))
|
||||||
}) else {
|
}) else {
|
||||||
|
if let Some(outer) = &self.outer {
|
||||||
|
if let Ok(t) = outer.instantiate_local_poly_t(
|
||||||
|
name,
|
||||||
|
args,
|
||||||
|
opt_decl_t,
|
||||||
|
tmp_tv_cache,
|
||||||
|
not_found_is_qvar,
|
||||||
|
) {
|
||||||
|
return Ok(t);
|
||||||
|
}
|
||||||
|
}
|
||||||
if let Some(decl_t) = opt_decl_t {
|
if let Some(decl_t) = opt_decl_t {
|
||||||
return Ok(decl_t.typ().clone());
|
return Ok(decl_t.typ().clone());
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
# {Tensor!;} = pyimport "torch"
|
{Tensor!;} = pyimport "torch"
|
||||||
{Parameter;} = pyimport "torch/nn/parameter"
|
{Parameter;} = pyimport "torch/nn/parameter"
|
||||||
|
|
||||||
.Module: ClassType
|
.Module: ClassType
|
||||||
.Module <: InheritableType
|
.Module <: InheritableType
|
||||||
.Module|<: GenericCallable|.
|
.Module|<: GenericCallable|.
|
||||||
__call__: |M <: .Module|(
|
__call__: |T|(
|
||||||
self: M,
|
self: .Module,
|
||||||
input: Obj #Tensor!(T, _),
|
input: Tensor!(T, _),
|
||||||
) -> Obj #Tensor!(T, _)
|
) -> Tensor!(T, _)
|
||||||
.Module.
|
.Module.
|
||||||
parameters: (self: Ref(.Module), recurse := Bool) -> Iterator Parameter
|
parameters: (self: Ref(.Module), recurse := Bool) -> Iterator Parameter
|
||||||
named_parameters: (self: Ref(.Module), prefix := Str, recurse := Bool, remove_duplicate := Bool) -> Iterator((Str, Parameter))
|
named_parameters: (self: Ref(.Module), prefix := Str, recurse := Bool, remove_duplicate := Bool) -> Iterator((Str, Parameter))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue