Exporting Natspec documentation to a JSON interface

- Adding a getDocumentation() function to solidity compiler stack
  so that we can obtain the natspec interface for a contract

- Adding libjsoncpp as a dependency of libsolidity. This is done
  in a dirty way, using libjsonrpc-cpp s an intermediate dependency
  for the moment. Will fix soon.

- Start of a test file for Natspec exporting to JSON
This commit is contained in:
Lefteris Karapetsas 2014-12-01 17:03:04 +01:00
parent 3fc2708d65
commit 43d6726dd7
4 changed files with 35 additions and 1 deletions

2
AST.h
View File

@ -199,7 +199,7 @@ public:
Block& getBody() { return *m_body; }
/// @return A shared pointer of an ASTString.
/// Can contain a nullptr in which case indicates absence of documentation
ASTPointer<ASTString> const& getDocumentation() { return m_documentation; }
ASTPointer<ASTString> const& getDocumentation() const { return m_documentation; }
void addLocalVariable(VariableDeclaration const& _localVariable) { m_localVariables.push_back(&_localVariable); }
std::vector<VariableDeclaration const*> const& getLocalVariables() const { return m_localVariables; }

View File

@ -16,6 +16,10 @@ endif()
include_directories(..)
target_link_libraries(${EXECUTABLE} evmcore devcore)
# TODO: Temporary until PR 532 https://github.com/ethereum/cpp-ethereum/pull/532
# gets accepted. Then we can simply add jsoncpp as a dependency and not the
# whole of JSONRPC as we are doing right here
target_link_libraries(${EXECUTABLE} ${JSONRPC_LS})
install( TARGETS ${EXECUTABLE} ARCHIVE DESTINATION lib LIBRARY DESTINATION lib )
install( FILES ${HEADERS} DESTINATION include/${EXECUTABLE} )

View File

@ -28,6 +28,8 @@
#include <libsolidity/Compiler.h>
#include <libsolidity/CompilerStack.h>
#include <jsonrpc/json/json.h>
using namespace std;
namespace dev
@ -125,6 +127,30 @@ string const& CompilerStack::getInterface()
return m_interface;
}
string const& CompilerStack::getDocumentation()
{
Json::StyledWriter writer;
if (!m_parseSuccessful)
BOOST_THROW_EXCEPTION(CompilerError() << errinfo_comment("Parsing was not successful."));
if (m_documentation.empty())
{
Json::Value doc;
Json::Value methods;
vector<FunctionDefinition const*> exportedFunctions = m_contractASTNode->getInterfaceFunctions();
for (FunctionDefinition const* f: exportedFunctions)
{
Json::Value user;
user["user"] = Json::Value(*f->getDocumentation());
methods[f->getName()] = user;
}
doc["methods"] = methods;
m_documentation = writer.write(doc);
}
return m_documentation;
}
bytes CompilerStack::staticCompile(std::string const& _sourceCode, bool _optimize)
{
CompilerStack stack;

View File

@ -62,6 +62,9 @@ public:
/// Returns a string representing the contract interface in JSON.
/// Prerequisite: Successful call to parse or compile.
std::string const& getInterface();
/// Returns a string representing the contract documentation in JSON.
/// Prerequisite: Successful call to parse or compile.
std::string const& getDocumentation();
/// Returns the previously used scanner, useful for counting lines during error reporting.
Scanner const& getScanner() const { return *m_scanner; }
@ -77,6 +80,7 @@ private:
std::shared_ptr<ContractDefinition> m_contractASTNode;
bool m_parseSuccessful;
std::string m_interface;
std::string m_documentation;
std::shared_ptr<Compiler> m_compiler;
bytes m_bytecode;
};