Index: /trunk/abdev/BasicCompiler_Common/NumOpe_GetType.cpp
===================================================================
--- /trunk/abdev/BasicCompiler_Common/NumOpe_GetType.cpp	(revision 427)
+++ /trunk/abdev/BasicCompiler_Common/NumOpe_GetType.cpp	(revision 428)
@@ -310,6 +310,21 @@
 	if(ArrayElements[0]){
 		Type classType;
-		GetMemberType( leftType, VarName, classType, 0, false );
-		if( classType.IsObject() ){
+		if( VarName[0] == '\0' )
+		{
+			classType = leftType;
+
+			if( classType.IsObject() )
+			{
+				// 既にuseRegにオブジェクトポインタが格納されており、それに対するインデクサを呼び出す場合
+				// ※「プロパティ値として返ってきたオブジェクトインスタンスのインデクサを呼び出す」場合にここにくる
+			}
+		}
+		else
+		{
+			GetMemberType( leftType, VarName, classType, 0, false );
+		}
+
+		if( classType.IsObject() )
+		{
 			if( !GetReturnTypeOfIndexerGetterProc( classType, resultType ) ){
 				SetError(1,NULL,cp);
@@ -343,6 +358,7 @@
 	char parameter[VN_SIZE];
 	ReferenceKind refType;
+	PareOrBracket pareOrBracket = None;
 	lstrcpy( methodName, member );
-	GetVarFormatString(methodName,parameter,lpPtrOffset,dummy,refType);
+	GetVarFormatString( methodName, parameter, lpPtrOffset, dummy, refType, &pareOrBracket );
 
 	vector<const UserProc *> userProcs;
@@ -352,5 +368,26 @@
 		const UserProc *pUserProc = OverloadSolutionWithStrParam(termFull,userProcs,parameter,termLeft);
 
-		if( pUserProc ){
+		if( pUserProc )
+		{
+			if(
+				pUserProc->Params().size() == 0				// 仮引数の個数は0
+				&& parameter[0]								// 実引数は1つ以上
+				&& pUserProc->ReturnType().IsObject()		// 戻り値がクラス型の場合
+				&& pareOrBracket == Bracket )				// 実引数は[]で囲まれている
+			{
+				// プロパティ値として返ってきたオブジェクトインスタンスのインデクサを呼び出す
+
+				// まずはプロパティ値を取得
+				bool dummyIsVariable;
+				GetMemberTermType( leftType, baseType, resultType, termFull, termLeft, methodName, &dummyIsVariable );
+
+				// 戻り値のオブジェクトインスタンスのインデクサを呼び出す
+				char temporary[VN_SIZE], temp2[VN_SIZE];
+				sprintf( temporary, "[%s]", parameter );
+				sprintf( temp2, "%s.%s", termLeft, methodName );
+				Type classType = resultType;
+				return GetMemberTermType( classType, baseType, resultType, termFull, temp2, temporary, pIsVariable );
+			}
+
 			resultType = pUserProc->ReturnType();
 
