PMunch / futhark

Automatic wrapping of C headers in Nim
MIT License
357 stars 19 forks source link

querySetting(nimcacheDir) points to non-existing folder for nimsuggest #12

Open arkanoid87 opened 2 years ago

arkanoid87 commented 2 years ago

https://github.com/PMunch/futhark/blob/875a7f5cf727483bc4c4d394f7d3c23699002aa8/src/futhark.nim#L456

querySetting(nimcacheDir) seems to hold different values:

As a result futhark works at build time and at runtime, but nimsuggest fails and as a result code completion and error checking is not available for all imported C code.

opir -I/usr/lib/clang/10/include -I/usr/include/gdal /home/jack/.cache/nim/nimmap_check/futhark-includes.h
Fatal: '/home/jack/.cache/nim/nimmap_check/futhark-includes.h' file not found
Tried to parse: /home/jack/.cache/nim/nimmap_check/futhark-includes.h
With arguments: -I/usr/lib/clang/10/include -I/usr/include/gdal
Unable to parse translation unit succesfully. Quitting

Running: opir -I/usr/lib/clang/10/include -I/usr/include/gdal /home/jack/.cache/nim/nimmap_check/futhark-includes.h [User]

image

As a workaround, I've been copying the futhark generated nim file into project folder, switching from futhark to import when needed like in:

when not defined(useFuthark):
  import gdal
else:
  import futhark
  importc:
    absPath "/usr/lib/clang/10/include"
    path "/usr/include/gdal"
    "gdal.h"
    "ogr_core.h"
    "ogr_api.h"
arkanoid87 commented 2 years ago

this ugly fix solves the problem, as long as you don't build release

cacheDir = querySetting(nimcacheDir).replace("_check","_d")
arkanoid87 commented 2 years ago

I wonder why I realized this with vscode but you said to have futhark autocompletion out of the box with vim. Shouldn't both solution be based on nimsuggest?

PMunch commented 2 years ago

Hmm, this appears to be something that VSCode does or the plugin passes to nimsuggest. On my machine I don't have any _check folders in my ~/.cache/nim folder and as long as I've built the library once I get completion in Vim.

arkanoid87 commented 2 years ago

I'm not finding "check" suffix in saem vscode extension, but I see it calling "nim check", so it might be that.

arkanoid87 commented 2 years ago

Hmm, this appears to be something that VSCode does or the plugin passes to nimsuggest. On my machine I don't have any _check folders in my ~/.cache/nim folder and as long as I've built the library once I get completion in Vim.

I also don't have the myproj_check folder, just myproj_d and myproj_r, not sure if that folder lives for just a moment and then gets deleted, or if it is a different kind of deal

arkanoid87 commented 2 years ago

I can confirm that this happens in nim check

import std/[compilesettings]

static:
  echo querySetting(nimcacheDir)

nim c -r main.nim

/home/jack/.cache/nim/vscodecache_d

nim check main.nim

/home/jack/.cache/nim/vscodecache_check

I think your experience with nimlsp may help track the issue in https://github.com/saem/vscode-nim

arkanoid87 commented 2 years ago

I've created a minimal test to replicate the problem

vscodecache.nim

import std/[os, compilesettings, macros]

const cacheFile = querySetting(nimcacheDir) / "test.nim"

static:
  writeFile(cacheFile, "let foo* = 42")

macro loadFromCache: untyped =
  return quote do:
    include `cacheFile`

loadFromCache()
echo foo

nim c -r vscodecache.nim

42

vscode error == nim check vscodecache.nim

nim check vscodecache.nim
Hint: used config file '/home/jack/.choosenim/toolchains/nim-1.6.0/config/nim.cfg' [Conf]
Hint: used config file '/home/jack/.choosenim/toolchains/nim-1.6.0/config/config.nims' [Conf]
.......................................................................................
/home/jack/nim/vscodecache/vscodecache.nim(13, 14) template/generic instantiation of `loadFromCache` from here
/home/jack/nim/vscodecache/vscodecache.nim(9, 10) Error: cannot open file: /home/jack/.cache/nim/vscodecache_check/test.nim
/home/jack/nim/vscodecache/vscodecache.nim(14, 6) Error: undeclared identifier: 'foo'
candidates (edit distance, scope distance); see '--spellSuggest': 
 (2, 1): 'os' [module declared in /home/jack/nim/vscodecache/vscodecache.nim(1, 11)]
 (2, 3): 'bool' [type declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/basic_types.nim(15, 3)]
 (2, 3): 'io' [module declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system.nim(3132, 14)]
 (2, 3): 'low' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system.nim(1584, 6)]
 (2, 3): 'low' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system.nim(386, 6)]
 (2, 3): 'low' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system.nim(397, 6)]
 (2, 3): 'low' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system.nim(408, 6)]
 (2, 3): 'low' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system.nim(420, 6)]
 (2, 3): 'low' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system.nim(434, 6)]
 (2, 3): 'low' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system.nim(445, 6)]
 (2, 3): 'low' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system.nim(451, 6)]
 (2, 3): 'mod' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(216, 6)]
 (2, 3): 'mod' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(225, 6)]
 (2, 3): 'mod' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(226, 6)]
 (2, 3): 'mod' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(227, 6)]
 (2, 3): 'mod' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(228, 6)]
 (2, 3): 'mod' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(394, 6)]
 (2, 3): 'mod' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(397, 6)]
 (2, 3): 'mod' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(398, 6)]
 (2, 3): 'mod' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(399, 6)]
 (2, 3): 'mod' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(400, 6)]
 (2, 3): 'not' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system.nim(123, 6)]
 (2, 3): 'not' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(166, 6)]
 (2, 3): 'not' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(173, 6)]
 (2, 3): 'not' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(174, 6)]
 (2, 3): 'not' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(175, 6)]
 (2, 3): 'not' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(176, 6)]
 (2, 3): 'not' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(323, 6)]
 (2, 3): 'not' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(325, 6)]
 (2, 3): 'not' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(326, 6)]
 (2, 3): 'not' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(327, 6)]
 (2, 3): 'not' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(328, 6)]
 (2, 3): 'not' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/basic_types.nim(45, 6)]
 (2, 3): 'of' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system.nim(917, 6)]
 (2, 3): 'on' [const declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/basic_types.nim(19, 3)]
 (2, 3): 'or' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system.nim(117, 6)]
 (2, 3): 'or' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(302, 6)]
 (2, 3): 'or' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(307, 6)]
 (2, 3): 'or' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(308, 6)]
 (2, 3): 'or' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(309, 6)]
 (2, 3): 'or' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(310, 6)]
 (2, 3): 'or' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(351, 6)]
 (2, 3): 'or' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(353, 6)]
 (2, 3): 'or' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(354, 6)]
 (2, 3): 'or' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(355, 6)]
 (2, 3): 'or' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(356, 6)]
 (2, 3): 'or' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/basic_types.nim(53, 6)]
 (2, 3): 'or' [template declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/core/macros.nim(196, 10)]
 (2, 3): 'pop' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system.nim(1854, 6)]
 (2, 3): 'xor' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(312, 6)]
 (2, 3): 'xor' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(317, 6)]
 (2, 3): 'xor' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(318, 6)]
 (2, 3): 'xor' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(319, 6)]
 (2, 3): 'xor' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(320, 6)]
 (2, 3): 'xor' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(358, 6)]
 (2, 3): 'xor' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(360, 6)]
 (2, 3): 'xor' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(361, 6)]
 (2, 3): 'xor' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(362, 6)]
 (2, 3): 'xor' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/arithmetics.nim(363, 6)]
 (2, 3): 'xor' [proc declared in /home/jack/.choosenim/toolchains/nim-1.6.0/lib/system/basic_types.nim(58, 6)]