ATLやC++/CLIにおいて,関数宣言・定義の前に
[属性, 属性]を付けた場合,[]内部を属性と認識して
内部の括弧を関数宣言と誤認しないようにした.
* [属性1(param), 属性2(param="")] のパターンに対応
* __interfaceキーワードをインターフェースとして認識する
* クラス定義の継承元クラスの中で()が使われていると
そこを関数と誤認する問題を修正.
:と{の間に()があっても関数とはみなさない.
ATLのサーバコードでは __uuid() がテンプレートに
与えられることがあるのでこの影響を受ける.
dev:4837
差分ファイル
Logged In: YES
user_id=86076
Originator: YES
忘れた頃に自己レビュー(^^)
C++/CLI用に 新たな状態 M2_ATTRIBUTE を追加.
M2_NORMALかつ関数レベル=0,括弧レベル0の場合に[があったら
M2_ATTRIBUTEに遷移する.[]()はその状態でも数え,]でレベル=0になったら
M2_NORMALに戻る.
M2_ATTRIBUTEでは関数判定処理は行わない.
__interface はclassと並列に処理を追加しただけなので問題なさそう.
CDlgFuncList::SetTreeJava()にて「インターフェース」(8文字16bytes)
追加に伴って,バッファ拡張済み
pFuncName = new char[ strlen(pWork) + 1 + 18 ];
Logged In: YES
user_id=86076
Originator: YES
補足: テスト内容と確認内容
http://msdn2.microsoft.com/ja-jp/library/65t81w8a\(VS.80).aspx
よりダウンロードしたファイル(複数)にて確認しました.
クラスの前,関数の前に[]があるパターン
// IDispCtl
[
object,
uuid(0F4098BD-0318-4F89-A505-A954211198CE),
dual,
helpstring("IDispCtl Interface"),
pointer_default(unique)
]
__interface IDispCtl : public IDispatch
{
[id(1), helpstring("method Connect")] HRESULT Connect();
[id(2), helpstring("method Disconnect")] HRESULT Disconnect();
[id(3), helpstring("method Send")] HRESULT Send(VARIANT data);
};
__uuidof を含むクラス
// CDispCtl
[
(略)
]
class ATL_NO_VTABLE CDispCtl :
public IDispCtl,
public IPersistStreamInitImpl<cdispctl>,
public IOleControlImpl<cdispctl>,
public IOleObjectImpl<cdispctl>,
public IOleInPlaceActiveObjectImpl<cdispctl>,
public IViewObjectExImpl<cdispctl>,
public IOleInPlaceObjectWindowlessImpl<cdispctl>,
public IDataObjectImpl<cdispctl>,
public IProvideClassInfo2Impl<&__uuidof(CDispCtl), NULL>,
public CComControl<cdispctl>
{</cdispctl></cdispctl></cdispctl></cdispctl></cdispctl></cdispctl></cdispctl></cdispctl>
Logged In: YES
user_id=86076
Originator: YES
sakura/trunk#1196でcommitしました.