diff --git a/apps/openmw/mwgui/console.cpp b/apps/openmw/mwgui/console.cpp index 471b2810b..35381a957 100644 --- a/apps/openmw/mwgui/console.cpp +++ b/apps/openmw/mwgui/console.cpp @@ -1,6 +1,8 @@ #include "console.hpp" +#include + #include #include "../mwscript/extensions.hpp" @@ -26,6 +28,12 @@ namespace MWGui bool Console::compile (const std::string& cmd, Compiler::Output& output) { + + listNames(); + for (std::vector::iterator iter (mNames.begin()); iter!=mNames.end(); ++iter) + std::cout << *iter << ", "; + std::cout << std::endl; + try { ErrorHandler::reset(); @@ -67,6 +75,20 @@ namespace MWGui printError ((type==ErrorMessage ? "error: " : "warning: ") + message); } + void Console::listNames() + { + if (mNames.empty()) + { + std::istringstream input (""); + + Compiler::Scanner scanner (*this, input, mCompilerContext.getExtensions()); + + scanner.listKeywords (mNames); + + std::sort (mNames.begin(), mNames.end()); + } + } + Console::Console(int w, int h, MWWorld::Environment& environment, const Compiler::Extensions& extensions) : Layout("openmw_console_layout.xml"), diff --git a/apps/openmw/mwgui/console.hpp b/apps/openmw/mwgui/console.hpp index 25212d627..4a80cde99 100644 --- a/apps/openmw/mwgui/console.hpp +++ b/apps/openmw/mwgui/console.hpp @@ -21,10 +21,11 @@ namespace MWGui class Console : private OEngine::GUI::Layout, private Compiler::ErrorHandler { private: - + MWScript::CompilerContext mCompilerContext; MWWorld::Environment& mEnvironment; - + std::vector mNames; + bool compile (const std::string& cmd, Compiler::Output& output); /// Report error to the user. @@ -32,7 +33,11 @@ namespace MWGui /// Report a file related error virtual void report (const std::string& message, Type type); - + + void listNames(); + ///< Write all valid identifiers and keywords into mNames and sort them. + /// \note If mNames is not empty, this function is a no-op. + public: MyGUI::EditPtr command; MyGUI::EditPtr history; diff --git a/components/compiler/extensions.cpp b/components/compiler/extensions.cpp index 3b1d180b1..c6a74b234 100644 --- a/components/compiler/extensions.cpp +++ b/components/compiler/extensions.cpp @@ -207,4 +207,11 @@ namespace Compiler throw std::logic_error ("unsupported code segment"); } } + + void Extensions::listKeywords (std::vector& keywords) const + { + for (std::map::const_iterator iter (mKeywords.begin()); + iter!=mKeywords.end(); ++iter) + keywords.push_back (iter->first); + } } diff --git a/components/compiler/extensions.hpp b/components/compiler/extensions.hpp index 960cac157..53ebfa31b 100644 --- a/components/compiler/extensions.hpp +++ b/components/compiler/extensions.hpp @@ -78,6 +78,9 @@ namespace Compiler void generateInstructionCode (int keyword, std::vector& code, Literals& literals, const std::string& id, int optionalArguments) const; ///< Append code for function to \a code. + + void listKeywords (std::vector& keywords) const; + ///< Append all known keywords to \æ kaywords. }; } diff --git a/components/compiler/scanner.cpp b/components/compiler/scanner.cpp index 310fc9ec5..080ca7d98 100644 --- a/components/compiler/scanner.cpp +++ b/components/compiler/scanner.cpp @@ -230,27 +230,27 @@ namespace Compiler return true; } + static const char *keywords[] = + { + "begin", "end", + "short", "long", "float", + "if", "endif", "else", "elseif", + "while", "endwhile", + "return", + "messagebox", + "set", "to", + "getsquareroot", + "menumode", + "random", + "startscript", "stopscript", "scriptrunning", + "getdistance", + "getsecondspassed", + "enable", "disable", "getdisabled", + 0 + }; + bool Scanner::scanName (char c, Parser& parser, bool& cont) { - static const char *keywords[] = - { - "begin", "end", - "short", "long", "float", - "if", "endif", "else", "elseif", - "while", "endwhile", - "return", - "messagebox", - "set", "to", - "getsquareroot", - "menumode", - "random", - "startscript", "stopscript", "scriptrunning", - "getdistance", - "getsecondspassed", - "enable", "disable", "getdisabled", - 0 - }; - std::string name; if (!scanName (c, name)) @@ -513,4 +513,13 @@ namespace Compiler mPutbackCode = keyword; mPutbackLoc = loc; } + + void Scanner::listKeywords (std::vector& keywords) + { + for (int i=0; Compiler::keywords[i]; ++i) + keywords.push_back (Compiler::keywords[i]); + + if (mExtensions) + mExtensions->listKeywords (keywords); + } } diff --git a/components/compiler/scanner.hpp b/components/compiler/scanner.hpp index da0bfa17a..53cb92ef2 100644 --- a/components/compiler/scanner.hpp +++ b/components/compiler/scanner.hpp @@ -3,6 +3,7 @@ #include #include +#include #include "tokenloc.hpp" @@ -24,7 +25,7 @@ namespace Compiler Putback_None, Putback_Special, Putback_Integer, Putback_Float, Putback_Name, Putback_Keyword }; - + ErrorHandler& mErrorHandler; TokenLoc mLoc; TokenLoc mPrevLoc; @@ -101,21 +102,23 @@ namespace Compiler void scan (Parser& parser); ///< Scan a token and deliver it to the parser. - void putbackSpecial (int code, const TokenLoc& loc); + void putbackSpecial (int code, const TokenLoc& loc); ///< put back a special token - void putbackInt (int value, const TokenLoc& loc); - ///< put back an integer token + void putbackInt (int value, const TokenLoc& loc); + ///< put back an integer token - void putbackFloat (float value, const TokenLoc& loc); - ///< put back a float token + void putbackFloat (float value, const TokenLoc& loc); + ///< put back a float token - void putbackName (const std::string& name, const TokenLoc& loc); + void putbackName (const std::string& name, const TokenLoc& loc); ///< put back a name toekn - void putbackKeyword (int keyword, const TokenLoc& loc); + void putbackKeyword (int keyword, const TokenLoc& loc); ///< put back a keyword token - + + void listKeywords (std::vector& keywords); + ///< Append all known keywords to \æ kaywords. }; }