diff --git a/src/dreamchecker/README.md b/src/dreamchecker/README.md index 9ea8d534..4429d5c9 100644 --- a/src/dreamchecker/README.md +++ b/src/dreamchecker/README.md @@ -54,13 +54,13 @@ be enabled: #define SHOULD_CALL_PARENT(X) set SpacemanDMM_should_call_parent = X #define UNLINT(X) SpacemanDMM_unlint(X) #define SHOULD_NOT_OVERRIDE(X) set SpacemanDMM_should_not_override = X - #define FINAL_VAR var/final + #define FINAL_VAR var/final #else #define RETURN_TYPE(X) #define SHOULD_CALL_PARENT(X) #define UNLINT(X) X #define SHOULD_NOT_OVERRIDE(X) - #define FINAL_VAR var + #define FINAL_VAR var #endif ``` @@ -92,7 +92,7 @@ Use `set SpacemanDMM_should_not_override = 1` to raise a warning for any child procs that override this one, regardless of if it calls parent or not. This functions in a similar way to the `final` keyword in some languages. -### `final` vars +### Final variables Use the above definition of FINAL_VAR to declare vars as `final`, `var/final/foo` such that overriding their value isn't permitted by types that inherit it. ``` diff --git a/src/dreamchecker/lib.rs b/src/dreamchecker/lib.rs index f091f46c..70984b40 100644 --- a/src/dreamchecker/lib.rs +++ b/src/dreamchecker/lib.rs @@ -497,28 +497,24 @@ fn error>(location: Location, desc: S) -> DMError { // Variable analyzer pub fn check_var_defs(objtree: &ObjectTree, context: &Context) { - for (path, nodeindex) in objtree.types.iter() { - guard!(let Some(atype) = objtree.graph.node_weight(*nodeindex) - else { continue }); - + for (path, _) in objtree.types.iter() { guard!(let Some(typeref) = objtree.find(path) else { continue }); - for parent_typeref in typeref.iter_parent_types() { - if parent_typeref.is_root() { + for parent in typeref.iter_parent_types() { + if parent.is_root() { break; } - let parent = parent_typeref.get(); - if &parent.path == path { - continue + continue; } - for (varname, typevar) in atype.vars.iter() { + for (varname, typevar) in typeref.vars.iter() { if varname == "vars" { continue; } + guard!(let Some(parentvar) = parent.vars.get(varname) else { continue }); @@ -530,16 +526,15 @@ pub fn check_var_defs(objtree: &ObjectTree, context: &Context) { continue; } DMError::new(mydecl.location, format!("{} redeclares {}", path, varname)) - .with_note(decl.location, "var declared here") - .register(context); + .with_note(decl.location, "var declared here") + .register(context); } if decl.var_type.is_final { DMError::new(typevar.value.location, format!("{} overrides final var {}", path, varname)) - .with_note(decl.location, "var declared here") - .register(context); + .with_note(decl.location, "var declared here") + .register(context); } - } } }