mirror of
https://github.com/OpenMW/openmw.git
synced 2025-01-22 03:53:54 +00:00
added script verifier
This commit is contained in:
parent
0ff744c2ff
commit
e17af4231a
6 changed files with 153 additions and 2 deletions
|
@ -38,7 +38,7 @@ opencs_units (model/tools
|
||||||
|
|
||||||
opencs_units_noqt (model/tools
|
opencs_units_noqt (model/tools
|
||||||
mandatoryid skillcheck classcheck factioncheck racecheck soundcheck regioncheck
|
mandatoryid skillcheck classcheck factioncheck racecheck soundcheck regioncheck
|
||||||
birthsigncheck spellcheck referenceablecheck
|
birthsigncheck spellcheck referenceablecheck scriptcheck
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
98
apps/opencs/model/tools/scriptcheck.cpp
Normal file
98
apps/opencs/model/tools/scriptcheck.cpp
Normal file
|
@ -0,0 +1,98 @@
|
||||||
|
|
||||||
|
#include "scriptcheck.hpp"
|
||||||
|
|
||||||
|
#include <components/compiler/tokenloc.hpp>
|
||||||
|
#include <components/compiler/scanner.hpp>
|
||||||
|
#include <components/compiler/fileparser.hpp>
|
||||||
|
#include <components/compiler/exception.hpp>
|
||||||
|
#include <components/compiler/extensions0.hpp>
|
||||||
|
|
||||||
|
#include "../world/data.hpp"
|
||||||
|
|
||||||
|
void CSMTools::ScriptCheckStage::report (const std::string& message, const Compiler::TokenLoc& loc,
|
||||||
|
Type type)
|
||||||
|
{
|
||||||
|
std::ostringstream stream;
|
||||||
|
|
||||||
|
CSMWorld::UniversalId id (CSMWorld::UniversalId::Type_Script, mId);
|
||||||
|
|
||||||
|
stream << id.toString() << "|";
|
||||||
|
|
||||||
|
if (type==ErrorMessage)
|
||||||
|
stream << "error ";
|
||||||
|
else
|
||||||
|
stream << "warning ";
|
||||||
|
|
||||||
|
stream
|
||||||
|
<< "line " << loc.mLine << ", column " << loc.mColumn
|
||||||
|
<< " (" << loc.mLiteral << "): " << message;
|
||||||
|
|
||||||
|
mMessages->push_back (stream.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMTools::ScriptCheckStage::report (const std::string& message, Type type)
|
||||||
|
{
|
||||||
|
std::ostringstream stream;
|
||||||
|
|
||||||
|
CSMWorld::UniversalId id (CSMWorld::UniversalId::Type_Script, mId);
|
||||||
|
|
||||||
|
stream << id.toString() << "|";
|
||||||
|
|
||||||
|
if (type==ErrorMessage)
|
||||||
|
stream << "error: ";
|
||||||
|
else
|
||||||
|
stream << "warning: ";
|
||||||
|
|
||||||
|
stream << message;
|
||||||
|
|
||||||
|
mMessages->push_back (stream.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
CSMTools::ScriptCheckStage::ScriptCheckStage (const CSMWorld::Data& data)
|
||||||
|
: mData (data), mContext (data), mMessages (0)
|
||||||
|
{
|
||||||
|
Compiler::registerExtensions (mExtensions);
|
||||||
|
mContext.setExtensions (&mExtensions);
|
||||||
|
}
|
||||||
|
|
||||||
|
int CSMTools::ScriptCheckStage::setup()
|
||||||
|
{
|
||||||
|
mContext.clear();
|
||||||
|
mMessages = 0;
|
||||||
|
mId.clear();
|
||||||
|
|
||||||
|
return mData.getScripts().getSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMTools::ScriptCheckStage::perform (int stage, std::vector<std::string>& messages)
|
||||||
|
{
|
||||||
|
mMessages = &messages;
|
||||||
|
mId = mData.getScripts().getId (stage);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
std::istringstream input (mData.getScripts().getRecord (stage).get().mScriptText);
|
||||||
|
|
||||||
|
Compiler::Scanner scanner (*this, input, mContext.getExtensions());
|
||||||
|
|
||||||
|
Compiler::FileParser parser (*this, mContext);
|
||||||
|
|
||||||
|
scanner.scan (parser);
|
||||||
|
}
|
||||||
|
catch (const Compiler::SourceException&)
|
||||||
|
{
|
||||||
|
// error has already been reported via error handler
|
||||||
|
}
|
||||||
|
catch (const std::exception& error)
|
||||||
|
{
|
||||||
|
std::ostringstream stream;
|
||||||
|
|
||||||
|
CSMWorld::UniversalId id (CSMWorld::UniversalId::Type_Script, mId);
|
||||||
|
|
||||||
|
stream << id.toString() << "|Critical compile error: " << error.what();
|
||||||
|
|
||||||
|
messages.push_back (stream.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
mMessages = 0;
|
||||||
|
}
|
40
apps/opencs/model/tools/scriptcheck.hpp
Normal file
40
apps/opencs/model/tools/scriptcheck.hpp
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
#ifndef CSM_TOOLS_SCRIPTCHECK_H
|
||||||
|
#define CSM_TOOLS_SCRIPTCHECK_H
|
||||||
|
|
||||||
|
#include <components/compiler/errorhandler.hpp>
|
||||||
|
#include <components/compiler/extensions.hpp>
|
||||||
|
|
||||||
|
#include "../doc/stage.hpp"
|
||||||
|
|
||||||
|
#include "../world/scriptcontext.hpp"
|
||||||
|
|
||||||
|
namespace CSMTools
|
||||||
|
{
|
||||||
|
/// \brief VerifyStage: make sure that scripts compile
|
||||||
|
class ScriptCheckStage : public CSMDoc::Stage, private Compiler::ErrorHandler
|
||||||
|
{
|
||||||
|
const CSMWorld::Data& mData;
|
||||||
|
Compiler::Extensions mExtensions;
|
||||||
|
CSMWorld::ScriptContext mContext;
|
||||||
|
std::string mId;
|
||||||
|
std::vector<std::string> *mMessages;
|
||||||
|
|
||||||
|
virtual void report (const std::string& message, const Compiler::TokenLoc& loc, Type type);
|
||||||
|
///< Report error to the user.
|
||||||
|
|
||||||
|
virtual void report (const std::string& message, Type type);
|
||||||
|
///< Report a file related error
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
ScriptCheckStage (const CSMWorld::Data& data);
|
||||||
|
|
||||||
|
virtual int setup();
|
||||||
|
///< \return number of steps
|
||||||
|
|
||||||
|
virtual void perform (int stage, std::vector<std::string>& messages);
|
||||||
|
///< Messages resulting from this tage will be appended to \a messages.
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -20,6 +20,7 @@
|
||||||
#include "birthsigncheck.hpp"
|
#include "birthsigncheck.hpp"
|
||||||
#include "spellcheck.hpp"
|
#include "spellcheck.hpp"
|
||||||
#include "referenceablecheck.hpp"
|
#include "referenceablecheck.hpp"
|
||||||
|
#include "scriptcheck.hpp"
|
||||||
|
|
||||||
CSMDoc::Operation *CSMTools::Tools::get (int type)
|
CSMDoc::Operation *CSMTools::Tools::get (int type)
|
||||||
{
|
{
|
||||||
|
@ -77,6 +78,8 @@ CSMDoc::Operation *CSMTools::Tools::getVerifier()
|
||||||
mVerifier->appendStage (new SpellCheckStage (mData.getSpells()));
|
mVerifier->appendStage (new SpellCheckStage (mData.getSpells()));
|
||||||
|
|
||||||
mVerifier->appendStage (new ReferenceableCheckStage (mData.getReferenceables().getDataSet(), mData.getRaces(), mData.getClasses(), mData.getFactions()));
|
mVerifier->appendStage (new ReferenceableCheckStage (mData.getReferenceables().getDataSet(), mData.getRaces(), mData.getClasses(), mData.getFactions()));
|
||||||
|
|
||||||
|
mVerifier->appendStage (new ScriptCheckStage (mData));
|
||||||
}
|
}
|
||||||
|
|
||||||
return mVerifier;
|
return mVerifier;
|
||||||
|
|
|
@ -15,7 +15,7 @@ CSMWorld::ScriptContext::ScriptContext (const Data& data) : mData (data), mIdsUp
|
||||||
|
|
||||||
bool CSMWorld::ScriptContext::canDeclareLocals() const
|
bool CSMWorld::ScriptContext::canDeclareLocals() const
|
||||||
{
|
{
|
||||||
return false;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
char CSMWorld::ScriptContext::getGlobalType (const std::string& name) const
|
char CSMWorld::ScriptContext::getGlobalType (const std::string& name) const
|
||||||
|
@ -116,3 +116,10 @@ void CSMWorld::ScriptContext::invalidateIds()
|
||||||
{
|
{
|
||||||
mIdsUpdated = false;
|
mIdsUpdated = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CSMWorld::ScriptContext::clear()
|
||||||
|
{
|
||||||
|
mIds.clear();
|
||||||
|
mIdsUpdated = false;
|
||||||
|
mLocals.clear();
|
||||||
|
}
|
|
@ -43,6 +43,9 @@ namespace CSMWorld
|
||||||
///< Does \a name match a journal ID?
|
///< Does \a name match a journal ID?
|
||||||
|
|
||||||
void invalidateIds();
|
void invalidateIds();
|
||||||
|
|
||||||
|
void clear();
|
||||||
|
///< Remove all cached data.
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue