既存のlibclangAPIを使用してclangで宣言が不完全なC++を解析することは可能ですか?つまり、すべてのヘッダーを含めずに.cppファイルを解析し、その場で宣言を推測します。したがって、たとえば次のテキスト:
A B::Foo(){return stuff();}
未知のシンボルAを検出し、Aを差し引くコールバックを呼び出します。これは私の魔法のヒューリスティックを使用したクラスです。次に、このコールバックをBやFooなどで同じように呼び出します。結局、クラスBのメンバーFooがAを返すのを見たと推測できるようにしたいと思います。そして、ものは関数です。コンテキスト:すべてのヘッダーを非常に迅速に解析せずに、適切な構文の強調表示とオンザフライのコード分析を実行できるかどうかを確認したいと思います。
[編集]明確にするために、私は非常に厳しく制限されたC ++解析を探しています。おそらく、いくつかの制限を解除するためのヒューリスティックがあります。
C ++の文法は、コンテキストの依存関係でいっぱいです。Foo()は関数呼び出しですか、それともクラスFooの一時的な構造ですか?Foo<Bar>のものです。テンプレートFoo<Bar>のインスタンス化と変数の宣言、またはオーバーロードされた演算子<と演算子>への奇妙な2つの呼び出しですか?コンテキストでのみ伝えることが可能であり、コンテキストは多くの場合、ヘッダーの解析から発生します。
私が探しているのは、カスタムの慣習規則をプラグインする方法です。たとえば、Win32シンボルをオーバーロードしないことを知っているので、CreateFileは常に関数であり、その署名さえ知っていると安全に想定できます。また、すべてのクラスが大文字で始まり、名詞であり、関数は通常動詞であるため、FooとBarはクラス名であると合理的に推測できます。より複雑なシナリオでは、a<b>cのような副作用のない式を記述しないことを私は知っています。したがって、aは常にテンプレートのインスタンス化であると想定できます。等々。
したがって、問題は、Clang APIを使用して、不明なシンボルに遭遇するたびにコールバックし、私自身の非C++ヒューリスティックを使用して回答を与えることができるかどうかです。私のヒューリスティックが失敗した場合、明らかに解析は失敗します。そして私はBoostライブラリの解析について話していません:)私は非常に単純なC++について話していて、おそらくテンプレートがなく、この場合clangが処理できる最小限に制限されています。