Add environment variable support for modules (#331)

* Add 'expor env' dummy command

* (WIP) Abstract away module exportables as Overlay

* Switch to Overlays for use/hide

Works for decls only right now.

* Fix passing import patterns of hide to eval

* Simplify use/hide of decls

* Add ImportPattern as Expr; Add use env eval

Still no parsing of "export env" so I can't test it yet.

* Refactor export parsing; Add InternalError

* Add env var export and activation; Misc changes

Now it is possible to `use` env var that was exported from a module.

This commit also adds some new errors and other small changes.

* Add env var hiding

* Fix eval not recognizing hidden decls

Without this change, calling `hide foo`, the evaluator does not know
whether a custom command named "foo" was hidden during parsing,
therefore, it is not possible to reliably throw an error about the "foo"
name not found.

* Add use/hide/export env var tests; Cleanup; Notes

* Ignore hide env related tests for now

* Fix main branch merge mess

* Fixed multi-word export def

* Fix hiding tests on Windows

* Remove env var hiding for now
This commit is contained in:
Jakub Žádník
2021-11-16 01:16:06 +02:00
committed by GitHub
parent ab22619f4a
commit 5459d30a24
22 changed files with 1050 additions and 261 deletions

View File

@ -7,8 +7,9 @@ use crate::{
use nu_protocol::{
ast::{
Block, Call, CellPath, Expr, Expression, FullCellPath, ImportPattern, ImportPatternMember,
Operator, PathMember, Pipeline, RangeInclusion, RangeOperator, Statement,
Block, Call, CellPath, Expr, Expression, FullCellPath, ImportPattern, ImportPatternHead,
ImportPatternMember, Operator, PathMember, Pipeline, RangeInclusion, RangeOperator,
Statement,
},
engine::StateWorkingSet,
span, Flag, PositionalArg, Signature, Span, Spanned, SyntaxShape, Type, Unit, VarId,
@ -1788,12 +1789,18 @@ pub fn parse_import_pattern(
) -> (ImportPattern, Option<ParseError>) {
let mut error = None;
let head = if let Some(head_span) = spans.get(0) {
working_set.get_span_contents(*head_span).to_vec()
let (head, head_span) = if let Some(head_span) = spans.get(0) {
(
working_set.get_span_contents(*head_span).to_vec(),
head_span,
)
} else {
return (
ImportPattern {
head: vec![],
head: ImportPatternHead {
name: vec![],
span: Span::unknown(),
},
members: vec![],
},
Some(ParseError::WrongImportPattern(span(spans))),
@ -1806,7 +1813,10 @@ pub fn parse_import_pattern(
if tail == b"*" {
(
ImportPattern {
head,
head: ImportPatternHead {
name: head,
span: *head_span,
},
members: vec![ImportPatternMember::Glob { span: *tail_span }],
},
error,
@ -1830,7 +1840,10 @@ pub fn parse_import_pattern(
(
ImportPattern {
head,
head: ImportPatternHead {
name: head,
span: *head_span,
},
members: vec![ImportPatternMember::List { names: output }],
},
error,
@ -1838,7 +1851,10 @@ pub fn parse_import_pattern(
}
_ => (
ImportPattern {
head,
head: ImportPatternHead {
name: head,
span: *head_span,
},
members: vec![],
},
Some(ParseError::ExportNotFound(result.span)),
@ -1848,7 +1864,10 @@ pub fn parse_import_pattern(
let tail = trim_quotes(tail);
(
ImportPattern {
head,
head: ImportPatternHead {
name: head,
span: *head_span,
},
members: vec![ImportPatternMember::Name {
name: tail.to_vec(),
span: *tail_span,
@ -1860,7 +1879,10 @@ pub fn parse_import_pattern(
} else {
(
ImportPattern {
head,
head: ImportPatternHead {
name: head,
span: *head_span,
},
members: vec![],
},
None,
@ -3419,6 +3441,7 @@ pub fn find_captures_in_expr(
let result = find_captures_in_expr(working_set, &cell_path.head, seen);
output.extend(&result);
}
Expr::ImportPattern(_) => {}
Expr::Garbage => {}
Expr::GlobPattern(_) => {}
Expr::Int(_) => {}