eosio.cdt
eosio.cdt copied to clipboard
Smart contracts and `clangd`
From a user perspective, if someone wants to navigate smart contracts with clangd a compilation database is needed.
~/eosio.contracts/build $ cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..
-- The C compiler identification is AppleClang 12.0.0.12000032
-- The CXX compiler identification is AppleClang 12.0.0.12000032
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Setting up Eosio Wasm Toolchain 1.7.0 at //usr/local
-- Building eosio.contracts v1.9.1
-- Using eosio.cdt version 1.7.0
-- Unit tests will not be built. To build unit tests, set BUILD_TESTS to true.
-- Configuring done
-- Generating done
CMake Warning:
Manually-specified variables were not used by the project:
CMAKE_EXPORT_COMPILE_COMMANDS
-- Build files have been written to: /Users/john.debord/eosio.contracts/build
~/eosio.contracts/build $ ls
CMakeCache.txt CMakeFiles Makefile cmake_install.cmake contracts contracts_project-prefix
~/eosio.contracts/build $
Investigating further by modifying https://github.com/EOSIO/eosio.contracts/blob/master/CMakeLists.txt#L48-L58:
ExternalProject_Add(
contracts_project
SOURCE_DIR ${CMAKE_SOURCE_DIR}/contracts
BINARY_DIR ${CMAKE_BINARY_DIR}/contracts
CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${EOSIO_CDT_ROOT}/lib/cmake/eosio.cdt/EosioWasmToolchain.cmake
+ -DCMAKE_EXPORT_COMPILE_COMMANDS=${CMAKE_EXPORT_COMPILE_COMMANDS}
UPDATE_COMMAND ""
PATCH_COMMAND ""
TEST_COMMAND ""
INSTALL_COMMAND ""
BUILD_ALWAYS 1
)
Generates the compile_commands.json file:
[
{
"directory": "/Users/john.debord/eosio.contracts/build/contracts/eosio.bios",
"command": "//usr/local/bin/eosio-cpp -I/Users/john.debord/eosio.contracts/contracts/eosio.bios/include -O3 -abigen -abigen_output=/Users/john.debord/eosio.contracts/build/contracts/eosio.bios/eosio.bios.abi -contract eosio.bios -R/Users/john.debord/eosio.contracts/contracts/eosio.bios/ricardian -R/Users/john.debord/eosio.contracts/build/contracts/eosio.bios/ricardian -o CMakeFiles/eosio.bios.dir/src/eosio.bios.cpp.obj -c /Users/john.debord/eosio.contracts/contracts/eosio.bios/src/eosio.bios.cpp",
"file": "/Users/john.debord/eosio.contracts/contracts/eosio.bios/src/eosio.bios.cpp"
},
...
...
...
clangd starts up correctly, but is unable to recognize the AST. I'm assuming because it's incompatible with WASM.
V[18:32:31.913] <<< {
"id": 79,
"jsonrpc": "2.0",
"method": "textDocument/definition",
"params": {
"position": {
"character": 6,
"line": 69
},
"textDocument": {
"uri": "file:///Users/john.debord/eosio.contracts/contracts/eosio.system/src/eosio.system.cpp"
}
}
}
I[18:32:31.913] <-- textDocument/definition(79)
I[18:32:31.914] --> reply:textDocument/definition(79) 0 ms, error: invalid AST
V[18:32:31.914] >>> {
"error": {
"code": -32001,
"message": "invalid AST"
},
"id": 79,
"jsonrpc": "2.0"
}
Any support for clangd?