mirror of
https://github.com/nushell/nushell
synced 2024-12-29 06:23:11 +00:00
Fix up global span logic
This commit is contained in:
parent
37f8ff0efc
commit
8c6feb7e80
4 changed files with 33 additions and 17 deletions
|
@ -110,7 +110,10 @@ fn main() -> std::io::Result<()> {
|
||||||
use reedline::{DefaultPrompt, FileBackedHistory, Reedline, Signal};
|
use reedline::{DefaultPrompt, FileBackedHistory, Reedline, Signal};
|
||||||
|
|
||||||
let mut line_editor = Reedline::new()
|
let mut line_editor = Reedline::new()
|
||||||
.with_history(Box::new(FileBackedHistory::new(1000)))?
|
.with_history(Box::new(FileBackedHistory::with_file(
|
||||||
|
1000,
|
||||||
|
"history.txt".into(),
|
||||||
|
)?))?
|
||||||
.with_highlighter(Box::new(NuHighlighter {
|
.with_highlighter(Box::new(NuHighlighter {
|
||||||
parser_state: parser_state.clone(),
|
parser_state: parser_state.clone(),
|
||||||
}));
|
}));
|
||||||
|
|
|
@ -994,7 +994,7 @@ impl<'a> ParserWorkingSet<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
let span = Span { start, end };
|
let span = Span { start, end };
|
||||||
let source = &self.delta.file_contents[..span.end];
|
let source = self.get_span_contents(span);
|
||||||
|
|
||||||
let (output, err) = lex(&source, span.start, &[b'\n', b','], &[b':']);
|
let (output, err) = lex(&source, span.start, &[b'\n', b','], &[b':']);
|
||||||
error = error.or(err);
|
error = error.or(err);
|
||||||
|
@ -1008,7 +1008,8 @@ impl<'a> ParserWorkingSet<'a> {
|
||||||
contents: crate::TokenContents::Item,
|
contents: crate::TokenContents::Item,
|
||||||
span,
|
span,
|
||||||
} => {
|
} => {
|
||||||
let contents = &self.delta.file_contents[span.start..span.end];
|
let span = *span;
|
||||||
|
let contents = self.get_span_contents(span);
|
||||||
|
|
||||||
if contents == b":" {
|
if contents == b":" {
|
||||||
match parse_mode {
|
match parse_mode {
|
||||||
|
@ -1017,7 +1018,7 @@ impl<'a> ParserWorkingSet<'a> {
|
||||||
}
|
}
|
||||||
ParseMode::TypeMode => {
|
ParseMode::TypeMode => {
|
||||||
// We're seeing two types for the same thing for some reason, error
|
// We're seeing two types for the same thing for some reason, error
|
||||||
error = error.or(Some(ParseError::Mismatch("type".into(), *span)));
|
error = error.or(Some(ParseError::Mismatch("type".into(), span)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -1042,7 +1043,7 @@ impl<'a> ParserWorkingSet<'a> {
|
||||||
{
|
{
|
||||||
error = error.or(Some(ParseError::Mismatch(
|
error = error.or(Some(ParseError::Mismatch(
|
||||||
"short flag".into(),
|
"short flag".into(),
|
||||||
*span,
|
span,
|
||||||
)));
|
)));
|
||||||
short_flag
|
short_flag
|
||||||
} else {
|
} else {
|
||||||
|
@ -1064,7 +1065,7 @@ impl<'a> ParserWorkingSet<'a> {
|
||||||
} else {
|
} else {
|
||||||
error = error.or(Some(ParseError::Mismatch(
|
error = error.or(Some(ParseError::Mismatch(
|
||||||
"short flag".into(),
|
"short flag".into(),
|
||||||
*span,
|
span,
|
||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1079,7 +1080,7 @@ impl<'a> ParserWorkingSet<'a> {
|
||||||
if chars.len() > 1 {
|
if chars.len() > 1 {
|
||||||
error = error.or(Some(ParseError::Mismatch(
|
error = error.or(Some(ParseError::Mismatch(
|
||||||
"short flag".into(),
|
"short flag".into(),
|
||||||
*span,
|
span,
|
||||||
)));
|
)));
|
||||||
|
|
||||||
args.push(Arg::Flag(Flag {
|
args.push(Arg::Flag(Flag {
|
||||||
|
@ -1104,7 +1105,7 @@ impl<'a> ParserWorkingSet<'a> {
|
||||||
let short_flag = if !short_flag.ends_with(b")") {
|
let short_flag = if !short_flag.ends_with(b")") {
|
||||||
error = error.or(Some(ParseError::Mismatch(
|
error = error.or(Some(ParseError::Mismatch(
|
||||||
"short flag".into(),
|
"short flag".into(),
|
||||||
*span,
|
span,
|
||||||
)));
|
)));
|
||||||
short_flag
|
short_flag
|
||||||
} else {
|
} else {
|
||||||
|
@ -1121,7 +1122,7 @@ impl<'a> ParserWorkingSet<'a> {
|
||||||
if flag.short.is_some() {
|
if flag.short.is_some() {
|
||||||
error = error.or(Some(ParseError::Mismatch(
|
error = error.or(Some(ParseError::Mismatch(
|
||||||
"one short flag".into(),
|
"one short flag".into(),
|
||||||
*span,
|
span,
|
||||||
)));
|
)));
|
||||||
} else {
|
} else {
|
||||||
flag.short = Some(chars[0]);
|
flag.short = Some(chars[0]);
|
||||||
|
@ -1130,14 +1131,14 @@ impl<'a> ParserWorkingSet<'a> {
|
||||||
_ => {
|
_ => {
|
||||||
error = error.or(Some(ParseError::Mismatch(
|
error = error.or(Some(ParseError::Mismatch(
|
||||||
"unknown flag".into(),
|
"unknown flag".into(),
|
||||||
*span,
|
span,
|
||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
error = error.or(Some(ParseError::Mismatch(
|
error = error.or(Some(ParseError::Mismatch(
|
||||||
"short flag".into(),
|
"short flag".into(),
|
||||||
*span,
|
span,
|
||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -1186,7 +1187,10 @@ impl<'a> ParserWorkingSet<'a> {
|
||||||
contents: crate::TokenContents::Comment,
|
contents: crate::TokenContents::Comment,
|
||||||
span,
|
span,
|
||||||
} => {
|
} => {
|
||||||
let contents = &self.delta.file_contents[span.start + 1..span.end];
|
let contents = self.get_span_contents(Span {
|
||||||
|
start: span.start + 1,
|
||||||
|
end: span.end,
|
||||||
|
});
|
||||||
|
|
||||||
let mut contents = String::from_utf8_lossy(contents).to_string();
|
let mut contents = String::from_utf8_lossy(contents).to_string();
|
||||||
contents = contents.trim().into();
|
contents = contents.trim().into();
|
||||||
|
@ -1276,7 +1280,7 @@ impl<'a> ParserWorkingSet<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
let span = Span { start, end };
|
let span = Span { start, end };
|
||||||
let source = &self.delta.file_contents[..span.end];
|
let source = self.get_span_contents(span);
|
||||||
|
|
||||||
let (output, err) = lex(&source, span.start, &[b'\n', b','], &[]);
|
let (output, err) = lex(&source, span.start, &[b'\n', b','], &[]);
|
||||||
error = error.or(err);
|
error = error.or(err);
|
||||||
|
@ -1340,7 +1344,7 @@ impl<'a> ParserWorkingSet<'a> {
|
||||||
|
|
||||||
let span = Span { start, end };
|
let span = Span { start, end };
|
||||||
|
|
||||||
let source = &self.delta.file_contents[..end];
|
let source = self.get_span_contents(span);
|
||||||
|
|
||||||
let (output, err) = lex(&source, start, &[b'\n', b','], &[]);
|
let (output, err) = lex(&source, start, &[b'\n', b','], &[]);
|
||||||
error = error.or(err);
|
error = error.or(err);
|
||||||
|
@ -1430,7 +1434,7 @@ impl<'a> ParserWorkingSet<'a> {
|
||||||
|
|
||||||
let span = Span { start, end };
|
let span = Span { start, end };
|
||||||
|
|
||||||
let source = &self.delta.file_contents[..end];
|
let source = self.get_span_contents(span);
|
||||||
|
|
||||||
let (output, err) = lex(&source, start, &[], &[]);
|
let (output, err) = lex(&source, start, &[], &[]);
|
||||||
error = error.or(err);
|
error = error.or(err);
|
||||||
|
@ -1441,8 +1445,6 @@ impl<'a> ParserWorkingSet<'a> {
|
||||||
let (output, err) = self.parse_block(&output, true);
|
let (output, err) = self.parse_block(&output, true);
|
||||||
error = error.or(err);
|
error = error.or(err);
|
||||||
|
|
||||||
println!("{:?} {:?}", output, error);
|
|
||||||
|
|
||||||
let block_id = self.add_block(output);
|
let block_id = self.add_block(output);
|
||||||
|
|
||||||
(
|
(
|
||||||
|
|
|
@ -210,6 +210,10 @@ impl<'a> ParserWorkingSet<'a> {
|
||||||
self.permanent_state.next_span_start() + self.delta.file_contents.len()
|
self.permanent_state.next_span_start() + self.delta.file_contents.len()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn global_span_offset(&self) -> usize {
|
||||||
|
self.permanent_state.next_span_start()
|
||||||
|
}
|
||||||
|
|
||||||
pub fn add_file(&mut self, filename: String, contents: &[u8]) -> usize {
|
pub fn add_file(&mut self, filename: String, contents: &[u8]) -> usize {
|
||||||
let next_span_start = self.next_span_start();
|
let next_span_start = self.next_span_start();
|
||||||
|
|
||||||
|
|
|
@ -12,4 +12,11 @@ impl Span {
|
||||||
pub fn unknown() -> Span {
|
pub fn unknown() -> Span {
|
||||||
Span { start: 0, end: 0 }
|
Span { start: 0, end: 0 }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn offset(&self, offset: usize) -> Span {
|
||||||
|
Span {
|
||||||
|
start: self.start - offset,
|
||||||
|
end: self.end - offset,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue