add _ wildcard for type definitions

and make line/file indicators in errors
gray instead of fully white
This commit is contained in:
Mark 2024-06-12 20:11:22 +02:00
parent 945e19e10a
commit 1e2f0cb63c
3 changed files with 40 additions and 17 deletions

View File

@ -1,6 +1,6 @@
[package] [package]
name = "mers_lib" name = "mers_lib"
version = "0.8.3" version = "0.8.4"
edition = "2021" edition = "2021"
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
description = "library to use the mers language in other projects" description = "library to use the mers language in other projects"

View File

@ -276,20 +276,28 @@ impl CheckError {
if first_line_nr == last_line_nr { if first_line_nr == last_line_nr {
writeln!( writeln!(
f, f,
"{}",
format!(
"{}Line {first_line_nr} ({}..{}){}", "{}Line {first_line_nr} ({}..{}){}",
indent!(true, false), indent!(true, false),
start_with_comments + 1 - first_line_start, start_with_comments + 1 - first_line_start,
end_with_comments - last_line_start, end_with_comments - last_line_start,
src_from, src_from,
)
.bright_black()
)?; )?;
} else { } else {
writeln!( writeln!(
f, f,
"{}",
format!(
"{}Lines {first_line_nr}-{last_line_nr} ({}..{}){}", "{}Lines {first_line_nr}-{last_line_nr} ({}..{}){}",
indent!(true, false), indent!(true, false),
start_with_comments + 1 - first_line_start, start_with_comments + 1 - first_line_start,
end_with_comments - last_line_start, end_with_comments - last_line_start,
src_from, src_from,
)
.bright_black()
)?; )?;
} }
let lines = if cfg.show_comments { let lines = if cfg.show_comments {

View File

@ -1,5 +1,7 @@
use std::{fmt::Debug, sync::Arc}; use std::{fmt::Debug, sync::Arc};
use colored::Colorize;
use crate::{ use crate::{
data::{Data, Type}, data::{Data, Type},
errors::{CheckError, SourceRange}, errors::{CheckError, SourceRange},
@ -33,12 +35,25 @@ impl MersStatement for CustomType {
if init_to.is_some() { if init_to.is_some() {
return Err("can't init to `type` statement".to_string().into()); return Err("can't init to `type` statement".to_string().into());
} }
let t = (self.source)(info)?; let t = (self.source)(info);
if self.name != "_" {
info.scopes info.scopes
.last_mut() .last_mut()
.unwrap() .unwrap()
.types .types
.insert(self.name.clone(), t); .insert(self.name.clone(), t?);
} else {
if let Err(e) = t {
return Err(CheckError::new()
.msg(format!(
" {} {} {} (`[[_] := ...]` indicates that `...` must be type-correct)",
"<<".bright_red(),
"Custom type-test failed!".bright_red(),
">>".bright_red(),
))
.err(e));
}
}
Ok(Type::empty_tuple()) Ok(Type::empty_tuple())
} }
fn run_custom(&self, _info: &mut Info) -> Data { fn run_custom(&self, _info: &mut Info) -> Data {