diff --git a/src/asm/fstack.cpp b/src/asm/fstack.cpp index d32cf63f..f5bb92f4 100644 --- a/src/asm/fstack.cpp +++ b/src/asm/fstack.cpp @@ -21,6 +21,7 @@ #include "backtrace.hpp" #include "helpers.hpp" #include "linkdefs.hpp" +#include "platform.hpp" // strncasecmp #include "verbosity.hpp" #include "asm/lexer.hpp" @@ -381,6 +382,26 @@ bool fstk_RunInclude(std::string const &path, bool isQuiet) { return fstk_FileError(path, "INCLUDE"); } +static char const *suggestDef(std::shared_ptr const macroArgs) { + std::shared_ptr arg = macroArgs->getArg(1); + if (!arg) { + return nullptr; + } + + char const *str = arg->c_str(); + static char const *types[] = {"EQUS", "EQU", "RB", "RW", "RL", "="}; + for (size_t i = 0; i < std::size(types); ++i) { + if (char const *type = types[i]; strncasecmp(str, type, strlen(type)) == 0) { + return type; + } + } + if (strncasecmp(str, "SET", literal_strlen("SET")) == 0) { + return "="; + } + + return nullptr; +} + void fstk_RunMacro( std::string const ¯oName, std::shared_ptr macroArgs, bool isQuiet ) { @@ -389,6 +410,13 @@ void fstk_RunMacro( if (!macro) { if (sym_IsPurgedExact(macroName)) { error("Undefined macro `%s`; it was purged", macroName.c_str()); + } else if (char const *defType = suggestDef(macroArgs); defType) { + error( + "Undefined macro `%s` (did you mean \"DEF %s %s ...\"?)", + macroName.c_str(), + macroName.c_str(), + defType + ); } else { error("Undefined macro `%s`", macroName.c_str()); } diff --git a/test/asm/suggest-def.asm b/test/asm/suggest-def.asm new file mode 100644 index 00000000..bfd5bf9a --- /dev/null +++ b/test/asm/suggest-def.asm @@ -0,0 +1,8 @@ +section "test", rom0 +constant equ 1 +variable = 2 +variable set 3 +string equs "four" +byte rb 1 +word rw 1 +long rl 1 diff --git a/test/asm/suggest-def.err b/test/asm/suggest-def.err new file mode 100644 index 00000000..1dc6c37f --- /dev/null +++ b/test/asm/suggest-def.err @@ -0,0 +1,15 @@ +error: Undefined macro `constant` (did you mean "DEF constant EQU ..."?) + at suggest-def.asm(2) +error: Undefined macro `variable` (did you mean "DEF variable = ..."?) + at suggest-def.asm(3) +error: Undefined macro `variable` (did you mean "DEF variable = ..."?) + at suggest-def.asm(4) +error: Undefined macro `string` (did you mean "DEF string EQUS ..."?) + at suggest-def.asm(5) +error: Undefined macro `byte` (did you mean "DEF byte RB ..."?) + at suggest-def.asm(6) +error: Undefined macro `word` (did you mean "DEF word RW ..."?) + at suggest-def.asm(7) +error: Undefined macro `long` (did you mean "DEF long RL ..."?) + at suggest-def.asm(8) +Assembly aborted with 7 errors!