From 11d5128cbf3b32abab54d105b607422b2303b2f1 Mon Sep 17 00:00:00 2001 From: Joakim Hove Date: Thu, 17 Sep 2020 11:21:31 +0200 Subject: [PATCH] Use KeywordLocation instead of passing keyword and filename separately --- opm/parser/eclipse/Parser/ParserKeyword.hpp | 2 +- opm/parser/eclipse/Parser/ParserRecord.hpp | 3 ++- src/opm/parser/eclipse/Parser/Parser.cpp | 3 +-- .../parser/eclipse/Parser/ParserKeyword.cpp | 9 ++++----- .../parser/eclipse/Parser/ParserRecord.cpp | 6 ++++-- tests/parser/DeckTests.cpp | 3 ++- tests/parser/ParserTests.cpp | 19 ++++++++++--------- 7 files changed, 24 insertions(+), 21 deletions(-) diff --git a/opm/parser/eclipse/Parser/ParserKeyword.hpp b/opm/parser/eclipse/Parser/ParserKeyword.hpp index 093620624..5db6dcaec 100644 --- a/opm/parser/eclipse/Parser/ParserKeyword.hpp +++ b/opm/parser/eclipse/Parser/ParserKeyword.hpp @@ -123,7 +123,7 @@ namespace Opm { SectionNameSet::const_iterator validSectionNamesBegin() const; SectionNameSet::const_iterator validSectionNamesEnd() const; - DeckKeyword parse(const ParseContext& parseContext, ErrorGuard& errors, RawKeyword& rawKeyword, UnitSystem& active_unitsystem, UnitSystem& default_unitsystem, const std::string& filename) const; + DeckKeyword parse(const ParseContext& parseContext, ErrorGuard& errors, RawKeyword& rawKeyword, UnitSystem& active_unitsystem, UnitSystem& default_unitsystem) const; enum ParserKeywordSizeEnum getSizeType() const; const KeywordSize& getKeywordSize() const; bool isDataKeyword() const; diff --git a/opm/parser/eclipse/Parser/ParserRecord.hpp b/opm/parser/eclipse/Parser/ParserRecord.hpp index cd7081f7a..9eb9acbc8 100644 --- a/opm/parser/eclipse/Parser/ParserRecord.hpp +++ b/opm/parser/eclipse/Parser/ParserRecord.hpp @@ -35,6 +35,7 @@ namespace Opm { class RawRecord; class ErrorGuard; class UnitSystem; + class KeywordLocation; class ParserRecord { public: @@ -44,7 +45,7 @@ namespace Opm { void addDataItem( ParserItem item ); const ParserItem& get(size_t index) const; const ParserItem& get(const std::string& itemName) const; - DeckRecord parse( const ParseContext&, ErrorGuard&, RawRecord&, UnitSystem& active_unitsystem, UnitSystem& default_unitsystem, const std::string& keyword, const std::string& filename) const; + DeckRecord parse( const ParseContext&, ErrorGuard&, RawRecord&, UnitSystem& active_unitsystem, UnitSystem& default_unitsystem, const KeywordLocation& location) const; bool isDataRecord() const; bool equal(const ParserRecord& other) const; bool hasDimension() const; diff --git a/src/opm/parser/eclipse/Parser/Parser.cpp b/src/opm/parser/eclipse/Parser/Parser.cpp index 23dd5d041..fb1b08063 100644 --- a/src/opm/parser/eclipse/Parser/Parser.cpp +++ b/src/opm/parser/eclipse/Parser/Parser.cpp @@ -919,8 +919,7 @@ bool parseState( ParserState& parserState, const Parser& parser ) { parserState.errors, *rawKeyword, parserState.deck.getActiveUnitSystem(), - parserState.deck.getDefaultUnitSystem(), - filename ) ); + parserState.deck.getDefaultUnitSystem())); } catch (const std::exception& exc) { /* This catch-all of parsing errors is to be able to write a good diff --git a/src/opm/parser/eclipse/Parser/ParserKeyword.cpp b/src/opm/parser/eclipse/Parser/ParserKeyword.cpp index 007cabc7c..1e0074f7a 100644 --- a/src/opm/parser/eclipse/Parser/ParserKeyword.cpp +++ b/src/opm/parser/eclipse/Parser/ParserKeyword.cpp @@ -532,8 +532,7 @@ void set_dimensions( ParserItem& item, ErrorGuard& errors, RawKeyword& rawKeyword, UnitSystem& active_unitsystem, - UnitSystem& default_unitsystem, - const std::string& filename) const { + UnitSystem& default_unitsystem) const { if( !rawKeyword.isFinished() ) throw std::invalid_argument("Tried to create a deck keyword from an incomplete raw keyword " + rawKeyword.getKeywordName()); @@ -555,8 +554,8 @@ void set_dimensions( ParserItem& item, record_nr = 0; } else { - keyword.addRecord( this->getRecord( record_nr ).parse( parseContext, errors, rawRecord, active_unitsystem, default_unitsystem, rawKeyword.getKeywordName(), filename ) ); - record_nr++; + keyword.addRecord( this->getRecord( record_nr ).parse( parseContext, errors, rawRecord, active_unitsystem, default_unitsystem, rawKeyword.location() ) ); + record_nr++; } } } @@ -566,7 +565,7 @@ void set_dimensions( ParserItem& item, if( m_records.size() == 0 && rawRecord.size() > 0 ) throw std::invalid_argument("Missing item information " + rawKeyword.getKeywordName()); - keyword.addRecord( this->getRecord( record_nr ).parse( parseContext, errors, rawRecord, active_unitsystem, default_unitsystem, rawKeyword.getKeywordName(), filename ) ); + keyword.addRecord( this->getRecord( record_nr ).parse( parseContext, errors, rawRecord, active_unitsystem, default_unitsystem, rawKeyword.location() ) ); record_nr++; } } diff --git a/src/opm/parser/eclipse/Parser/ParserRecord.cpp b/src/opm/parser/eclipse/Parser/ParserRecord.cpp index 83340ada4..bb72b735a 100644 --- a/src/opm/parser/eclipse/Parser/ParserRecord.cpp +++ b/src/opm/parser/eclipse/Parser/ParserRecord.cpp @@ -24,6 +24,8 @@ #include #include +#include + #include "raw/RawRecord.hpp" namespace Opm { @@ -118,14 +120,14 @@ namespace { } - DeckRecord ParserRecord::parse(const ParseContext& parseContext , ErrorGuard& errors , RawRecord& rawRecord, UnitSystem& active_unitsystem, UnitSystem& default_unitsystem, const std::string& keyword, const std::string& filename) const { + DeckRecord ParserRecord::parse(const ParseContext& parseContext , ErrorGuard& errors , RawRecord& rawRecord, UnitSystem& active_unitsystem, UnitSystem& default_unitsystem, const KeywordLocation& location) const { std::vector< DeckItem > items; items.reserve( this->size() + 20 ); for( const auto& parserItem : *this ) items.emplace_back( parserItem.scan( rawRecord, active_unitsystem, default_unitsystem ) ); if (rawRecord.size() > 0) { - std::string msg = "The RawRecord for keyword \"" + keyword + "\" in file\"" + filename + "\" contained " + + std::string msg = "The RawRecord for keyword \"" + location.keyword + "\" in file\"" + location.filename + "\" contained " + std::to_string(rawRecord.size()) + " too many items according to the spec. RawRecord was: " + rawRecord.getRecordString(); parseContext.handleError(ParseContext::PARSE_EXTRA_DATA , msg, errors); diff --git a/tests/parser/DeckTests.cpp b/tests/parser/DeckTests.cpp index 009dc3b98..932e18ad7 100644 --- a/tests/parser/DeckTests.cpp +++ b/tests/parser/DeckTests.cpp @@ -485,10 +485,11 @@ BOOST_AUTO_TEST_CASE(StringsWithSpaceOK) { ParseContext parseContext; ErrorGuard errors; UnitSystem active_unitsystem(UnitSystem::UnitType::UNIT_TYPE_LAB); + KeywordLocation loc; record1.addItem( itemString ); - const auto deckRecord = record1.parse( parseContext, errors , rawRecord, active_unitsystem, active_unitsystem, "KEYWORD", "filename" ); + const auto deckRecord = record1.parse( parseContext, errors , rawRecord, active_unitsystem, active_unitsystem, loc); BOOST_CHECK_EQUAL(" VALUE " , deckRecord.getItem(0).get< std::string >(0)); } diff --git a/tests/parser/ParserTests.cpp b/tests/parser/ParserTests.cpp index 34f254f1b..7c42bb3f4 100644 --- a/tests/parser/ParserTests.cpp +++ b/tests/parser/ParserTests.cpp @@ -1056,7 +1056,7 @@ BOOST_AUTO_TEST_CASE(parse_validRecord_noThrow) { ErrorGuard errors; RawRecord raw( std::string_view( "100 443" ) ); UnitSystem unit_system; - BOOST_CHECK_NO_THROW(record.parse(parseContext, errors, raw , unit_system, unit_system, "KEYWORD", "filename") ); + BOOST_CHECK_NO_THROW(record.parse(parseContext, errors, raw , unit_system, unit_system, KeywordLocation()) ); } BOOST_AUTO_TEST_CASE(parse_validRecord_deckRecordCreated) { @@ -1065,7 +1065,7 @@ BOOST_AUTO_TEST_CASE(parse_validRecord_deckRecordCreated) { ParseContext parseContext; ErrorGuard errors; UnitSystem unit_system; - const auto deckRecord = record.parse(parseContext , errors, rawRecord, unit_system, unit_system, "KEYWORD", "filename"); + const auto deckRecord = record.parse(parseContext , errors, rawRecord, unit_system, unit_system, KeywordLocation()); BOOST_CHECK_EQUAL(2U, deckRecord.size()); } @@ -1097,7 +1097,7 @@ BOOST_AUTO_TEST_CASE(parse_validMixedRecord_noThrow) { ParseContext parseContext; ErrorGuard errors; UnitSystem unit_system; - BOOST_CHECK_NO_THROW(record.parse(parseContext, errors, rawRecord, unit_system, unit_system, "KEYWORD", "filename")); + BOOST_CHECK_NO_THROW(record.parse(parseContext, errors, rawRecord, unit_system, unit_system, KeywordLocation())); } BOOST_AUTO_TEST_CASE(Equal_Equal_ReturnsTrue) { @@ -1223,13 +1223,13 @@ BOOST_AUTO_TEST_CASE(Parse_RawRecordTooManyItems_Throws) { RawRecord rawRecord( "3 3 3 " ); UnitSystem unit_system; - BOOST_CHECK_NO_THROW(parserRecord.parse(parseContext, errors, rawRecord, unit_system, unit_system, "KEYWORD", "filename")); + BOOST_CHECK_NO_THROW(parserRecord.parse(parseContext, errors, rawRecord, unit_system, unit_system, KeywordLocation())); RawRecord rawRecordOneExtra( "3 3 3 4 " ); - BOOST_CHECK_THROW(parserRecord.parse(parseContext, errors, rawRecordOneExtra, unit_system, unit_system, "KEYWORD", "filename"), std::invalid_argument); + BOOST_CHECK_THROW(parserRecord.parse(parseContext, errors, rawRecordOneExtra, unit_system, unit_system, KeywordLocation()), std::invalid_argument); RawRecord rawRecordForgotRecordTerminator( "3 3 3 \n 4 4 4 " ); - BOOST_CHECK_THROW(parserRecord.parse(parseContext, errors, rawRecordForgotRecordTerminator, unit_system, unit_system, "KEYWORD", "filename"), std::invalid_argument); + BOOST_CHECK_THROW(parserRecord.parse(parseContext, errors, rawRecordForgotRecordTerminator, unit_system, unit_system, KeywordLocation()), std::invalid_argument); } @@ -1248,10 +1248,11 @@ BOOST_AUTO_TEST_CASE(Parse_RawRecordTooFewItems) { ErrorGuard errors; RawRecord rawRecord( "3 3 " ); UnitSystem unit_system; + KeywordLocation location; // no default specified for the third item, record can be parsed just fine but trying // to access the data will raise an exception...; - BOOST_CHECK_NO_THROW(parserRecord.parse(parseContext, errors, rawRecord, unit_system, unit_system, "KEWYORD", "filename")); - auto record = parserRecord.parse(parseContext, errors , rawRecord, unit_system, unit_system, "KEYWORD", "filename"); + BOOST_CHECK_NO_THROW(parserRecord.parse(parseContext, errors, rawRecord, unit_system, unit_system, location)); + auto record = parserRecord.parse(parseContext, errors , rawRecord, unit_system, unit_system, location); BOOST_CHECK_NO_THROW(record.getItem(2)); BOOST_CHECK_THROW(record.getItem(2).get< int >(0), std::invalid_argument); } @@ -1633,7 +1634,7 @@ BOOST_AUTO_TEST_CASE(ParseEmptyRecord) { record.addItem(item); tabdimsKeyword.addRecord( record ); - const auto deckKeyword = tabdimsKeyword.parse( parseContext, errors, rawkeyword , unit_system, unit_system, "filename"); + const auto deckKeyword = tabdimsKeyword.parse( parseContext, errors, rawkeyword , unit_system, unit_system); BOOST_REQUIRE_EQUAL( 1U , deckKeyword.size()); const auto& deckRecord = deckKeyword.getRecord(0);