Improve associated functions so you can now call them on numbers too
This commit is contained in:
parent
a51a2c8f56
commit
c7f1b81c9d
@ -358,6 +358,7 @@ pub fn analyze_expr(
|
||||
})
|
||||
.collect::<Vec<_>>(),
|
||||
);
|
||||
set_autocomplete(map, meta.range.start, function_autocomplete.clone());
|
||||
set_autocomplete(map, meta.range.end, function_autocomplete.clone());
|
||||
}
|
||||
mir::ExprKind::If(IfExpression(cond, then_e, else_e)) => {
|
||||
|
@ -175,6 +175,20 @@ impl Parse for AssociatedFunctionCall {
|
||||
let ty = stream.parse()?;
|
||||
stream.expect(Token::Colon)?;
|
||||
stream.expect(Token::Colon)?;
|
||||
|
||||
if stream.next_is_whitespace() {
|
||||
stream.expecting_err_nonfatal("associated function name");
|
||||
return Ok(AssociatedFunctionCall(
|
||||
ty,
|
||||
FunctionCallExpression {
|
||||
name: String::new(),
|
||||
params: Vec::new(),
|
||||
range: stream.get_range_prev_curr().unwrap(),
|
||||
is_macro: false,
|
||||
},
|
||||
));
|
||||
}
|
||||
|
||||
match stream.parse() {
|
||||
Ok(fn_call) => Ok(AssociatedFunctionCall(ty, fn_call)),
|
||||
_ => {
|
||||
@ -187,7 +201,7 @@ impl Parse for AssociatedFunctionCall {
|
||||
FunctionCallExpression {
|
||||
name: fn_name,
|
||||
params: Vec::new(),
|
||||
range: stream.get_range_prev_single().unwrap(),
|
||||
range: stream.get_range_prev_curr().unwrap(),
|
||||
is_macro: false,
|
||||
},
|
||||
))
|
||||
@ -198,7 +212,7 @@ impl Parse for AssociatedFunctionCall {
|
||||
FunctionCallExpression {
|
||||
name: String::new(),
|
||||
params: Vec::new(),
|
||||
range: stream.get_range_prev_single().unwrap(),
|
||||
range: stream.get_range_prev_curr().unwrap(),
|
||||
is_macro: false,
|
||||
},
|
||||
))
|
||||
@ -660,11 +674,11 @@ impl Parse for ImportStatement {
|
||||
let mut import_list = Vec::new();
|
||||
|
||||
if let Some(Token::Identifier(name)) = stream.next() {
|
||||
import_list.push((name, stream.get_range_prev_single().unwrap()));
|
||||
import_list.push((name, stream.get_range_prev_curr().unwrap()));
|
||||
while stream.expect(Token::Colon).is_ok() && stream.expect(Token::Colon).is_ok() {
|
||||
if let Some(Token::Identifier(name)) = stream.peek() {
|
||||
stream.next(); // Consume identifier
|
||||
import_list.push((name, stream.get_range_prev_single().unwrap()));
|
||||
import_list.push((name, stream.get_range_prev_curr().unwrap()));
|
||||
} else {
|
||||
stream.expected_err_nonfatal("identifier");
|
||||
break;
|
||||
@ -954,7 +968,7 @@ impl Parse for DotIndexKind {
|
||||
stream.expecting_err_nonfatal("struct index");
|
||||
Ok(Self::StructValueIndex(
|
||||
String::new(),
|
||||
stream.get_range_prev_single().unwrap(),
|
||||
stream.get_range_prev_curr().unwrap(),
|
||||
))
|
||||
} else {
|
||||
Err(stream.expecting_err("struct index")?)
|
||||
|
@ -216,8 +216,8 @@ impl<'a, 'b> TokenStream<'a, 'b> {
|
||||
}
|
||||
|
||||
/// Gets range of the previous token only.
|
||||
pub fn get_range_prev_single(&self) -> Option<TokenRange> {
|
||||
self.ref_position.as_ref().map(|ref_pos| TokenRange {
|
||||
pub fn get_range_prev_curr(&self) -> Option<TokenRange> {
|
||||
Some(TokenRange {
|
||||
start: self.previous_token(self.position).0,
|
||||
end: self.previous_token(self.position).0,
|
||||
})
|
||||
|
@ -721,6 +721,7 @@ impl Expression {
|
||||
expr.resolve_ref(typerefs).cast_into(type_kind)
|
||||
}
|
||||
ExprKind::AssociatedFunctionCall(type_kind, function_call) => {
|
||||
*type_kind = type_kind.or_default().unwrap();
|
||||
let true_function = state
|
||||
.scope
|
||||
.get_associated_function(&pass::AssociatedFunctionKey(
|
||||
@ -732,7 +733,7 @@ impl Expression {
|
||||
type_kind.clone(),
|
||||
));
|
||||
|
||||
if let Some(f) = state.ok(true_function, self.1) {
|
||||
if let Some(f) = state.ok(true_function, function_call.meta) {
|
||||
let param_len_given = function_call.parameters.len();
|
||||
let param_len_expected = f.params.len();
|
||||
|
||||
|
@ -636,10 +636,12 @@ impl Expression {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
let ExprKind::Borrow(val, _) = &first_param.0 else {
|
||||
panic!()
|
||||
};
|
||||
*first_param = *val.clone();
|
||||
if let ExprKind::Borrow(val, _) = &first_param.0 {
|
||||
*first_param = *val.clone();
|
||||
}
|
||||
if let TypeKind::Borrow(inner_ty, _) = type_kind {
|
||||
*type_kind = *inner_ty.clone();
|
||||
}
|
||||
}
|
||||
|
||||
if !is_mutable {
|
||||
|
Loading…
Reference in New Issue
Block a user