| 121 | } |
| 122 | |
| 123 | std::optional<SourceNameMap> ObjectParser::tryParseSourceNameMapping() const |
| 124 | { |
| 125 | // @use-src 0:"abc.sol", 1:"foo.sol", 2:"bar.sol" |
| 126 | // |
| 127 | // UseSrcList := UseSrc (',' UseSrc)* |
| 128 | // UseSrc := [0-9]+ ':' FileName |
| 129 | // FileName := "(([^\"]|\.)*)" |
| 130 | |
| 131 | // Matches some "@use-src TEXT". |
| 132 | static std::regex const lineRE = std::regex( |
| 133 | "(^|\\s)@use-src\\b", |
| 134 | std::regex_constants::ECMAScript | std::regex_constants::optimize |
| 135 | ); |
| 136 | std::smatch sm; |
| 137 | if (!std::regex_search(m_scanner->currentCommentLiteral(), sm, lineRE)) |
| 138 | return std::nullopt; |
| 139 | |
| 140 | solAssert(sm.size() == 2, ""); |
| 141 | auto text = m_scanner->currentCommentLiteral().substr(static_cast<size_t>(sm.position() + sm.length())); |
| 142 | CharStream charStream(text, ""); |
| 143 | Scanner scanner(charStream); |
| 144 | if (scanner.currentToken() == Token::EOS) |
| 145 | return SourceNameMap{}; |
| 146 | SourceNameMap sourceNames; |
| 147 | |
| 148 | while (scanner.currentToken() != Token::EOS) |
| 149 | { |
| 150 | if (scanner.currentToken() != Token::Number) |
| 151 | break; |
| 152 | auto sourceIndex = toUnsignedInt(scanner.currentLiteral()); |
| 153 | if (!sourceIndex) |
| 154 | break; |
| 155 | if (scanner.next() != Token::Colon) |
| 156 | break; |
| 157 | if (scanner.next() != Token::StringLiteral) |
| 158 | break; |
| 159 | sourceNames[*sourceIndex] = std::make_shared<std::string const>(scanner.currentLiteral()); |
| 160 | |
| 161 | Token const next = scanner.next(); |
| 162 | if (next == Token::EOS) |
| 163 | return {std::move(sourceNames)}; |
| 164 | if (next != Token::Comma) |
| 165 | break; |
| 166 | scanner.next(); |
| 167 | } |
| 168 | |
| 169 | m_errorReporter.syntaxError( |
| 170 | 9804_error, |
| 171 | m_scanner->currentCommentLocation(), |
| 172 | "Error parsing arguments to @use-src. Expected: <number> \":\" \"<filename>\", ..." |
| 173 | ); |
| 174 | return std::nullopt; |
| 175 | } |
| 176 | |
| 177 | std::shared_ptr<AST> ObjectParser::parseBlock(std::optional<SourceNameMap> _sourceNames) |
| 178 | { |
nothing calls this directly
no test coverage detected