EOSIO / eosio.cdt

EOSIO.CDT (Contract Development Toolkit) is a suite of tools used to build EOSIO contracts
http://eosio.github.io/eosio.cdt
MIT License
511 stars 289 forks source link

Smart contracts and `clangd` #992

Open johndebord opened 3 years ago

johndebord commented 3 years ago

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"
}
avral commented 2 years ago

Any support for clangd?