refactor(tvix/eval): generalise error variant for dynamic keys
Change-Id: I08f40b4b53652a519e76d6e8344c7c3fe10a0689 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6767 Tested-by: BuildkiteCI Reviewed-by: sterni <sternenseemann@systemli.org>
This commit is contained in:
parent
71a8db108d
commit
846215ae2b
2 changed files with 17 additions and 31 deletions
|
@ -56,9 +56,7 @@ impl Compiler<'_> {
|
||||||
let name = match self.expr_static_attr_str(&attr) {
|
let name = match self.expr_static_attr_str(&attr) {
|
||||||
Some(name) => name,
|
Some(name) => name,
|
||||||
None => {
|
None => {
|
||||||
// TODO(tazjin): error variant for dynamic
|
self.emit_error(&attr, ErrorKind::DynamicKeyInScope("inherit"));
|
||||||
// key in *inherit* (or generalise it)
|
|
||||||
self.emit_error(&attr, ErrorKind::DynamicKeyInLet);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -95,9 +93,7 @@ impl Compiler<'_> {
|
||||||
let name = match self.expr_static_attr_str(&attr) {
|
let name = match self.expr_static_attr_str(&attr) {
|
||||||
Some(name) => name,
|
Some(name) => name,
|
||||||
None => {
|
None => {
|
||||||
// TODO(tazjin): error variant for dynamic
|
self.emit_error(&attr, ErrorKind::DynamicKeyInScope("inherit"));
|
||||||
// key in *inherit* (or generalise it)
|
|
||||||
self.emit_error(&attr, ErrorKind::DynamicKeyInLet);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -303,9 +299,7 @@ impl Compiler<'_> {
|
||||||
let name = match self.expr_static_attr_str(&attr) {
|
let name = match self.expr_static_attr_str(&attr) {
|
||||||
Some(name) => name,
|
Some(name) => name,
|
||||||
None => {
|
None => {
|
||||||
// TODO(tazjin): error variant for dynamic
|
self.emit_error(&attr, ErrorKind::DynamicKeyInScope("inherit"));
|
||||||
// key in *inherit* (or generalise it)
|
|
||||||
self.emit_error(&attr, ErrorKind::DynamicKeyInLet);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -342,9 +336,7 @@ impl Compiler<'_> {
|
||||||
let name = match self.expr_static_attr_str(&attr) {
|
let name = match self.expr_static_attr_str(&attr) {
|
||||||
Some(name) => name,
|
Some(name) => name,
|
||||||
None => {
|
None => {
|
||||||
// TODO(tazjin): error variant for dynamic
|
self.emit_error(&attr, ErrorKind::DynamicKeyInScope("inherit"));
|
||||||
// key in *inherit* (or generalise it)
|
|
||||||
self.emit_error(&attr, ErrorKind::DynamicKeyInLet);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -627,8 +619,14 @@ impl Compiler<'_> {
|
||||||
/// a string if possible, or raise an error about the node being
|
/// a string if possible, or raise an error about the node being
|
||||||
/// dynamic.
|
/// dynamic.
|
||||||
fn binding_name(&self, node: ast::Attr) -> EvalResult<String> {
|
fn binding_name(&self, node: ast::Attr) -> EvalResult<String> {
|
||||||
self.expr_static_attr_str(&node)
|
match self.expr_static_attr_str(&node) {
|
||||||
.ok_or_else(|| self.dynamic_key_error(&node))
|
Some(s) => Ok(s),
|
||||||
|
None => Err(Error {
|
||||||
|
// this code path will go away soon, hence the TODO below
|
||||||
|
kind: ErrorKind::DynamicKeyInScope("TODO"),
|
||||||
|
span: self.span_for(&node),
|
||||||
|
}),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Normalises identifier fragments into a single string vector
|
/// Normalises identifier fragments into a single string vector
|
||||||
|
@ -641,18 +639,6 @@ impl Compiler<'_> {
|
||||||
path.map(|node| self.binding_name(node)).collect()
|
path.map(|node| self.binding_name(node)).collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Construct the error returned when a dynamic attribute is found
|
|
||||||
/// in a `let`-expression.
|
|
||||||
fn dynamic_key_error<N>(&self, node: &N) -> Error
|
|
||||||
where
|
|
||||||
N: ToSpan,
|
|
||||||
{
|
|
||||||
Error {
|
|
||||||
kind: ErrorKind::DynamicKeyInLet,
|
|
||||||
span: self.span_for(node),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Convert a non-dynamic string expression to a string if possible.
|
/// Convert a non-dynamic string expression to a string if possible.
|
||||||
fn expr_static_str(&self, node: &ast::Str) -> Option<String> {
|
fn expr_static_str(&self, node: &ast::Str) -> Option<String> {
|
||||||
let mut parts = node.normalized_parts();
|
let mut parts = node.normalized_parts();
|
||||||
|
|
|
@ -47,8 +47,8 @@ pub enum ErrorKind {
|
||||||
/// Resolving a user-supplied path literal failed in some way.
|
/// Resolving a user-supplied path literal failed in some way.
|
||||||
PathResolution(String),
|
PathResolution(String),
|
||||||
|
|
||||||
/// Dynamic keys are not allowed in let.
|
/// Dynamic keys are not allowed in some scopes.
|
||||||
DynamicKeyInLet,
|
DynamicKeyInScope(&'static str),
|
||||||
|
|
||||||
/// Unknown variable in statically known scope.
|
/// Unknown variable in statically known scope.
|
||||||
UnknownStaticVariable,
|
UnknownStaticVariable,
|
||||||
|
@ -175,8 +175,8 @@ impl Error {
|
||||||
|
|
||||||
ErrorKind::PathResolution(err) => format!("could not resolve path: {}", err),
|
ErrorKind::PathResolution(err) => format!("could not resolve path: {}", err),
|
||||||
|
|
||||||
ErrorKind::DynamicKeyInLet => {
|
ErrorKind::DynamicKeyInScope(scope) => {
|
||||||
"dynamically evaluated keys are not allowed in let-bindings".to_string()
|
format!("dynamically evaluated keys are not allowed in {}", scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorKind::UnknownStaticVariable => "variable not found".to_string(),
|
ErrorKind::UnknownStaticVariable => "variable not found".to_string(),
|
||||||
|
@ -260,7 +260,7 @@ to a missing value in the attribute set(s) included via `with`."#,
|
||||||
ErrorKind::TypeError { .. } => "E006",
|
ErrorKind::TypeError { .. } => "E006",
|
||||||
ErrorKind::Incomparable { .. } => "E007",
|
ErrorKind::Incomparable { .. } => "E007",
|
||||||
ErrorKind::PathResolution(_) => "E008",
|
ErrorKind::PathResolution(_) => "E008",
|
||||||
ErrorKind::DynamicKeyInLet => "E009",
|
ErrorKind::DynamicKeyInScope(_) => "E009",
|
||||||
ErrorKind::UnknownStaticVariable => "E010",
|
ErrorKind::UnknownStaticVariable => "E010",
|
||||||
ErrorKind::UnknownDynamicVariable(_) => "E011",
|
ErrorKind::UnknownDynamicVariable(_) => "E011",
|
||||||
ErrorKind::VariableAlreadyDefined(_) => "E012",
|
ErrorKind::VariableAlreadyDefined(_) => "E012",
|
||||||
|
|
Loading…
Reference in a new issue