問題タブ [libclang]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - Python clang がシステム インクルード パスを検索しない
Python から libclang を使用する場合、システムのインクルード パスが自動的に検索されないようです。
これらのパスを取得する信頼できる方法はありますか? さまざまな UNIX システムで実行されるコードを書いているので、パスをハードコーディングするのは好きではありません。
たとえば、test.cpp の場合
とtest.py
実行python test.py
すると次のように出力されます。
もちろん、次のようにしてシステムのインクルード パスを見つけることができます。
そして引数リストに追加"-Isome/path"
します。つまりparse
これは実際に機能し、エラーは発生しません。
ただし、これは移植性がありません。プログラムで clang に自動的に使用させることができれば、非常に便利です。
c - libclang を使用して for ループで条件評価を見つける
私はclangを(Pythonバインディングを介してlibclang経由で)使用して、コードレビューボットをまとめています。すべての FOR_STMT カーソルには 4 つの子があると仮定しています。INIT、EVAL、INC、および BODY..
これは、次のような python で評価式の内容を確認できることを意味します。
このアプローチは...そもそも素晴らしいとは言えませんが、libclangの結果として受け入れ、特にPythonバインディングはかなりまばらです。しかし、私は最近、次のようなループに気付きました:
には 3 つの子しかありません。評価は 2 番目ではなく 1 番目になります。私はいつも libclang が FOR_STMT の未使用部分に対して NULL_STMT を返すだけだと思っていました...明らかに、私は間違っていました。
FOR_STMT を解析するための適切なアプローチは何ですか? libclang でこれに役立つものは見つかりません。
更新: libclang のソースを調べてみると、これらの 4 つのコンポーネントは、ビジター オブジェクトを使用して clang::ForStmt クラスからばかに追加されているようです。ForStmt オブジェクトは null ステートメント オブジェクトを返す必要がありますが、どこかのレイヤーが訪問したノード ベクトルからこれらを取り除いているようです...?
c++ - clang によるコード補完の高速化
私は、clang のコード補完メカニズムを使用しているときに、潜在的なコード補完のスピードアップを調査しています。以下に説明するフローは、Anders Bakken によるrtagsで見つけたものです。
翻訳単位は、ファイルの変更を監視するデーモンによって解析されます。これは、呼び出されたclang_parseTranslationUnit
関連関数 ( reparse*
、dispose*
) によって行われます。ユーザーがソース ファイルの特定の行と列で補完を要求すると、デーモンはソース ファイルの最後に保存されたバージョンと現在のソース ファイルのキャッシュされた翻訳単位を に渡しますclang_codeCompleteAt
。( Clang CodeComplete ドキュメント)。
clang_parseTranslationUnit
( CompletionThread::process の 271 行目から)に渡されるフラグはCXTranslationUnit_PrecompiledPreamble|CXTranslationUnit_CacheCompletionResults|CXTranslationUnit_SkipFunctionBodes
. clang_codeCompleteAt
( CompletionThread::process の 305 行目から)に渡されるフラグはCXCodeComplete_IncludeMacros|CXCodeComplete_IncludeCodePatterns
.
の呼び出しclang_codeCompleteAt
は非常に遅いです。完了の場所が正当なメンバー アクセス コードである場合でも、完了を取得するのに約 3 ~ 5 秒かかりますclang_codeCompleteAt
。これは、IDE のコード補完基準では遅すぎるようです。これを高速化する方法はありますか?
c++ - Clang c-api の総メモリ使用量
特定の翻訳単位のclang c-apiの合計メモリ使用量を取得するには?
ありますが、各エントリが特定のカテゴリを説明するエントリclang_getCXTUResourceUsage
に分割されたメモリ使用量を返します。
更新 1:
ドキュメントCXTUResourceUsageEntry::amount
には、依存の単位が記載されており、その方法は記載されCXTUResourceUsageEntry::kind
ていません。そのため、それをどのように要約するかは明確ではありません。
vim - vim youcompleteme で cstdint が見つかりません
Unix スタイルの Makefile で CMake を使用し、youcompleteme プラグインで vim を使用して Mac (Xcode 6 を使用する Yosemite) で C++ プロジェクトをセットアップしようとして問題が発生しました (私は Linux のベテランであり、Mac の初心者なので、このセットアップを好むXcode)。コードはビルドされて実行されますが、youcompleteme はいくつかの偽のエラーをスローします。
Linuxでも試してみましたが、同じ問題がありました。
Cake によって生成された compile_commands.json を使用するように .ycm_extra_conf.py を構成しました。compile_commands.json の「コマンド」行では、次のフラグを使用します。
stdint を直接の親として含むディレクトリへの明示的な参照はないようです。
コマンドラインでc ++を実行しているときに動作するように見えるディレクトリを暗黙的に見つけることができるような方法で、libclangで作業を行うようにyoucompletemeを取得できる方法はありますか? または、適切なシステム ヘッダー パスを配線せずに cmake に追加させる最善の方法は何ですか? CMakeLists.txt を移植可能にし、ツールチェーンのアップグレードに対応できるようにしたいと考えています。
私の .ycm_extra_conf.py は、提供された例のほとんどのコピーであり、配置した compile_commands.json を見つけるために少し変更されています。