1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-01-22 17:53:53 +00:00
openmw/apps/opencs/model/tools/scriptcheck.cpp
fteppe 20da0892ef openMW_test_suite compiles and runs
Slowly moving through the open-cs errors

Good progress in openCS

Very good progress on openCS

Getting closer with openCS

OpenCS compiles and runs! Didn't have time to test it all though

ix openMW

everything compiles on windows??

Fix gcc

Fix Clang
2022-12-27 19:15:55 +01:00

157 lines
4.4 KiB
C++

#include "scriptcheck.hpp"
#include <exception>
#include <sstream>
#include <string>
#include <apps/opencs/model/doc/messages.hpp>
#include <apps/opencs/model/prefs/category.hpp>
#include <apps/opencs/model/prefs/setting.hpp>
#include <apps/opencs/model/world/idcollection.hpp>
#include <apps/opencs/model/world/record.hpp>
#include <apps/opencs/model/world/scriptcontext.hpp>
#include <apps/opencs/model/world/universalid.hpp>
#include <components/compiler/exception.hpp>
#include <components/compiler/extensions0.hpp>
#include <components/compiler/fileparser.hpp>
#include <components/compiler/scanner.hpp>
#include <components/compiler/tokenloc.hpp>
#include <components/esm3/loadscpt.hpp>
#include "../doc/document.hpp"
#include "../world/data.hpp"
#include "../prefs/state.hpp"
CSMDoc::Message::Severity CSMTools::ScriptCheckStage::getSeverity(Type type)
{
switch (type)
{
case WarningMessage:
return CSMDoc::Message::Severity_Warning;
case ErrorMessage:
return CSMDoc::Message::Severity_Error;
}
return CSMDoc::Message::Severity_SeriousError;
}
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 << message << " (" << loc.mLiteral << ")"
<< " @ line " << loc.mLine + 1 << ", column " << loc.mColumn;
std::ostringstream hintStream;
hintStream << "l:" << loc.mLine + 1 << " " << loc.mColumn;
mMessages->add(id, stream.str(), hintStream.str(), getSeverity(type));
}
void CSMTools::ScriptCheckStage::report(const std::string& message, Type type)
{
CSMWorld::UniversalId id(CSMWorld::UniversalId::Type_Script, mId);
std::ostringstream stream;
stream << message;
mMessages->add(id, stream.str(), "", getSeverity(type));
}
CSMTools::ScriptCheckStage::ScriptCheckStage(const CSMDoc::Document& document)
: mDocument(document)
, mContext(document.getData())
, mMessages(nullptr)
, mWarningMode(Mode_Ignore)
{
/// \todo add an option to configure warning mode
setWarningsMode(0);
Compiler::registerExtensions(mExtensions);
mContext.setExtensions(&mExtensions);
mIgnoreBaseRecords = false;
}
int CSMTools::ScriptCheckStage::setup()
{
std::string warnings = CSMPrefs::get()["Scripts"]["warnings"].toString();
if (warnings == "Ignore")
mWarningMode = Mode_Ignore;
else if (warnings == "Normal")
mWarningMode = Mode_Normal;
else if (warnings == "Strict")
mWarningMode = Mode_Strict;
mContext.clear();
mMessages = nullptr;
mId = ESM::RefId::sEmpty;
Compiler::ErrorHandler::reset();
mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue();
return mDocument.getData().getScripts().getSize();
}
void CSMTools::ScriptCheckStage::perform(int stage, CSMDoc::Messages& messages)
{
const CSMWorld::Record<ESM::Script>& record = mDocument.getData().getScripts().getRecord(stage);
mId = mDocument.getData().getScripts().getId(stage);
if (mDocument.isBlacklisted(CSMWorld::UniversalId(CSMWorld::UniversalId::Type_Script, mId)))
return;
// Skip "Base" records (setting!) and "Deleted" records
if ((mIgnoreBaseRecords && record.mState == CSMWorld::RecordBase::State_BaseOnly) || record.isDeleted())
return;
mMessages = &messages;
switch (mWarningMode)
{
case Mode_Ignore:
setWarningsMode(0);
break;
case Mode_Normal:
setWarningsMode(1);
break;
case Mode_Strict:
setWarningsMode(2);
break;
}
try
{
mFile = record.get().mId.getRefIdString();
std::istringstream input(record.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)
{
CSMWorld::UniversalId id(CSMWorld::UniversalId::Type_Script, mId);
std::ostringstream stream;
stream << error.what();
messages.add(id, stream.str(), "", CSMDoc::Message::Severity_SeriousError);
}
mMessages = nullptr;
}