summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2023-02-02 14:13:56 +0100
committerLaurenz <laurmaedje@gmail.com>2023-02-02 14:13:56 +0100
commit5f5c65927982447133b625edea3f5c9bab4f9e3d (patch)
treeaa5edb320e21466d16a1d15ad320d164f94738db /src
parent21dd99926a24d7cc69bf6b032d1107c78a04a5cf (diff)
Math tests
Diffstat (limited to 'src')
-rw-r--r--src/model/eval.rs34
-rw-r--r--src/syntax/ast.rs7
-rw-r--r--src/syntax/lexer.rs8
3 files changed, 24 insertions, 25 deletions
diff --git a/src/model/eval.rs b/src/model/eval.rs
index 6e03d440..1fbf4125 100644
--- a/src/model/eval.rs
+++ b/src/model/eval.rs
@@ -919,32 +919,26 @@ impl Eval for ast::FuncCall {
// field access and does not evaluate to a module.
let (callee, mut args) = if let ast::Expr::FieldAccess(access) = callee {
let target = access.target();
- let method = access.field();
- let method_span = method.span();
- let method = method.take();
- let point = || Tracepoint::Call(Some(method.clone()));
- if methods::is_mutating(&method) {
+ let field = access.field();
+ let field_span = field.span();
+ let field = field.take();
+ let point = || Tracepoint::Call(Some(field.clone()));
+ if methods::is_mutating(&field) {
let args = args.eval(vm)?;
- let value = target.access(vm)?;
-
- let value = if let Value::Module(module) = &value {
- module.get(&method).cloned().at(method_span)?
- } else {
- return methods::call_mut(value, &method, args, span)
+ let target = target.access(vm)?;
+ if !matches!(target, Value::Symbol(_) | Value::Module(_)) {
+ return methods::call_mut(target, &field, args, span)
.trace(vm.world, point, span);
- };
-
- (value, args)
+ }
+ (target.field(&field).at(field_span)?, args)
} else {
let target = target.eval(vm)?;
let args = args.eval(vm)?;
- let value = if let Value::Module(module) = &target {
- module.get(&method).cloned().at(method_span)?
- } else {
- return methods::call(vm, target, &method, args, span)
+ if !matches!(target, Value::Symbol(_) | Value::Module(_)) {
+ return methods::call(vm, target, &field, args, span)
.trace(vm.world, point, span);
- };
- (value, args)
+ }
+ (target.field(&field).at(field_span)?, args)
}
} else {
(callee.eval(vm)?, args.eval(vm)?)
diff --git a/src/syntax/ast.rs b/src/syntax/ast.rs
index 1cc29b04..e844f622 100644
--- a/src/syntax/ast.rs
+++ b/src/syntax/ast.rs
@@ -426,11 +426,14 @@ node! {
impl Shorthand {
/// A list of all shorthands.
pub const LIST: &[(&'static str, char)] = &[
+ // Text only.
("~", '\u{00A0}'),
("--", '\u{2013}'),
("---", '\u{2014}'),
("-?", '\u{00AD}'),
- ("...", '…'),
+ // Math only.
+ ("-", '\u{2212}'),
+ ("'", '′'),
("*", '∗'),
("!=", '≠'),
("<<", '≪'),
@@ -450,6 +453,8 @@ impl Shorthand {
("[|", '⟦'),
("|]", '⟧'),
("||", '‖'),
+ // Both.
+ ("...", '…'),
];
/// Get the shorthanded character.
diff --git a/src/syntax/lexer.rs b/src/syntax/lexer.rs
index 471e437a..0bf7966f 100644
--- a/src/syntax/lexer.rs
+++ b/src/syntax/lexer.rs
@@ -380,17 +380,16 @@ impl Lexer<'_> {
'\\' => self.backslash(),
'"' => self.string(),
- '*' => SyntaxKind::Shorthand,
'.' if self.s.eat_if("..") => SyntaxKind::Shorthand,
'|' if self.s.eat_if("->") => SyntaxKind::Shorthand,
'|' if self.s.eat_if("=>") => SyntaxKind::Shorthand,
- '!' if self.s.eat_if('=') => SyntaxKind::Shorthand,
'<' if self.s.eat_if("<<") => SyntaxKind::Shorthand,
- '<' if self.s.eat_if('<') => SyntaxKind::Shorthand,
'>' if self.s.eat_if(">>") => SyntaxKind::Shorthand,
- '>' if self.s.eat_if('>') => SyntaxKind::Shorthand,
'<' if self.s.eat_if("=>") => SyntaxKind::Shorthand,
'<' if self.s.eat_if("->") => SyntaxKind::Shorthand,
+ '!' if self.s.eat_if('=') => SyntaxKind::Shorthand,
+ '<' if self.s.eat_if('<') => SyntaxKind::Shorthand,
+ '>' if self.s.eat_if('>') => SyntaxKind::Shorthand,
'<' if self.s.eat_if('=') => SyntaxKind::Shorthand,
'>' if self.s.eat_if('=') => SyntaxKind::Shorthand,
'<' if self.s.eat_if('-') => SyntaxKind::Shorthand,
@@ -400,6 +399,7 @@ impl Lexer<'_> {
'[' if self.s.eat_if('|') => SyntaxKind::Shorthand,
'|' if self.s.eat_if(']') => SyntaxKind::Shorthand,
'|' if self.s.eat_if('|') => SyntaxKind::Shorthand,
+ '*' | '\'' | '-' => SyntaxKind::Shorthand,
'#' => SyntaxKind::Hashtag,
'_' => SyntaxKind::Underscore,