Enable abi pragmas and fix formatting.

This commit is contained in:
Bhargava Shastry 2021-02-09 16:46:16 +01:00
parent 3669137297
commit e90248c136
2 changed files with 31 additions and 11 deletions

View File

@ -133,15 +133,12 @@ string SourceUnitGenerator::visit()
string PragmaGenerator::visit()
{
static constexpr const char* preamble = R"(
pragma solidity >= 0.0.0;
pragma experimental SMTChecker;
)";
// Choose equally at random from coder v1 and v2
string abiPragma = "pragma abicoder v" +
to_string(uRandDist->distributionOneToN(2)) +
";\n";
return preamble + abiPragma;
set<string> pragmas = uRandDist->subset(s_genericPragmas);
// Choose either abicoder v1 or v2 but not both.
pragmas.insert(s_abiPragmas[uRandDist->distributionOneToN(s_abiPragmas.size()) - 1]);
ostringstream pragmaString;
copy(pragmas.begin(), pragmas.end(), ostream_iterator<string>(pragmaString, "\n"));
return pragmaString.str() + "\n";
}
string ImportGenerator::visit()
@ -160,7 +157,7 @@ string ImportGenerator::visit()
os << "import "
<< "\""
<< state->randomPath()
<< "\";";
<< "\";\n";
}
else
{
@ -169,7 +166,7 @@ string ImportGenerator::visit()
os << "import "
<< "\""
<< state->randomNonCurrentPath()
<< "\";";
<< "\";\n";
}
return os.str();
}

View File

@ -77,6 +77,20 @@ struct UniformRandomDistribution
solAssert(_n > 0, "");
return distributionOneToN(_n) == 1;
}
/// @returns a subset whose elements are of type @param T
/// created from the set @param _container using
/// uniform selection.
template <typename T>
std::set<T> subset(std::set<T> const& _container)
{
size_t s = _container.size();
solAssert(s > 1, "");
std::set<T> subContainer;
for (auto const& item: _container)
if (probable(s))
subContainer.insert(item);
return subContainer;
}
std::unique_ptr<RandomEngine> randomEngine;
};
@ -231,6 +245,15 @@ public:
{}
std::string visit() override;
std::string name() override { return "Pragma generator"; }
private:
std::set<std::string> const s_genericPragmas = {
R"(pragma solidity >= 0.0.0;)",
R"(pragma experimental SMTChecker;)",
};
std::vector<std::string> const s_abiPragmas = {
R"(pragma abicoder v1;)",
R"(pragma abicoder v2;)"
};
};
class ImportGenerator: public GeneratorBase