Index: trunk/ab5.0/abdev/BasicCompiler_Common/src/Compiler.cpp
===================================================================
--- trunk/ab5.0/abdev/BasicCompiler_Common/src/Compiler.cpp	(revision 628)
+++ trunk/ab5.0/abdev/BasicCompiler_Common/src/Compiler.cpp	(revision 632)
@@ -14,62 +14,106 @@
 }
 
-ActiveBasic::Compiler::Error::StringToTypeErrorCode::EnumType Compiler::StringToTypeEx( const std::string &typeName, Type &type, bool isResolveGenerics )
-{
-	type.SetIndex( -1 );
-
-
-	/////////////////////////////////////////////////////////
-	// ☆★☆ ジェネリクスサポート ☆★☆
-
-	if( strstr( typeName.c_str(), "<" ) )
-	{
-		// ジェネリッククラスをインスタンス化した型の場合
-		int i = 0;
-		char className[VN_SIZE];
-		GetIdentifierToken( className, typeName.c_str(), i );
-
-		// ジェネリクスクラスを取得
-		const CClass *pGenericClass = this->GetObjectModule().meta.FindClassSupportedTypeDef( 
-			LexicalAnalyzer::FullNameToSymbol( className )
-		);
-
-		if( !pGenericClass )
-		{
-			return ActiveBasic::Compiler::Error::StringToTypeErrorCode::NotfoundGenericClass;
-		}
-
-		if( typeName[i] != '<' )
-		{
-			Jenga::Throw( "StringToType内でジェネリクス構文の解析に失敗" );
-		}
-
-		GenericTypes genericTypes;
-		while( true )
-		{
-			i++;
-
-			char typeParameter[VN_SIZE];
-			GetIdentifierToken( typeParameter, typeName.c_str(), i );
-
-			// 型パラメータの型情報を取得
-			Type baseType;
-			StringToType( typeParameter, baseType );
-
-			genericTypes.push_back( GenericType( "(non support)", baseType ) );
-
-			if( typeName[i] != ',' )
-			{
-				break;
-			}
-		}
-
-		// 基本型をセット
-		type.SetBasicType( DEF_OBJECT );
+ActiveBasic::Compiler::Error::StringToTypeErrorCode::EnumType Compiler::StringToGenericTypeEx( const std::string &typeName, Type &type )
+{
+	// ジェネリッククラスをインスタンス化した型の場合
+	int i = 0;
+	char className[VN_SIZE];
+	GetIdentifierToken( className, typeName.c_str(), i );
+
+	// ジェネリクスクラスを取得
+	const CClass *pGenericClass = this->GetObjectModule().meta.FindClassSupportedTypeDef( 
+		LexicalAnalyzer::FullNameToSymbol( className )
+	);
+
+	if( !pGenericClass )
+	{
+		return ActiveBasic::Compiler::Error::StringToTypeErrorCode::NotfoundGenericClass;
+	}
+
+	if( typeName[i] != '<' )
+	{
+		Jenga::Throw( "StringToType内でジェネリクス構文の解析に失敗" );
+	}
+
+	GenericTypes genericTypes;
+	bool isValueType = false;
+	while( true )
+	{
+		i++;
+
+		char typeParameterStr[VN_SIZE];
+		GetIdentifierToken( typeParameterStr, typeName.c_str(), i );
+
+		// 型パラメータの型情報を取得
+		Type typeParameterType;
+		StringToType( typeParameterStr, typeParameterType );
+
+		genericTypes.push_back( GenericType( "(non support)", typeParameterType ) );
+
+		if( typeParameterType.IsValueType() )
+		{
+			// 値型の場合
+			isValueType = true;
+		}
+
+		if( typeName[i] != ',' )
+		{
+			break;
+		}
+	}
+
+	// 基本型をセット
+	type.SetBasicType( DEF_OBJECT );
+
+	if( isValueType )
+	{
+		// 型パラメータに値型が指定された場合
+
+		// 仮型パラメータを実型パラメータに変換
+		Types actualTypes;
+		BOOST_FOREACH( const GenericType &genericType, genericTypes )
+		{
+			actualTypes.push_back( genericType.GetType() );
+		}
+
+		// テンプレートとしてクラスを展開する
+		const CClass *pExpandedClass = LexicalAnalyzer::TemplateExpand( *const_cast<CClass *>(pGenericClass), actualTypes );
+
+		if( pExpandedClass )
+		{
+			// 拡張情報をセット
+			type.SetClassPtr( pExpandedClass );
+		}
+		else
+		{
+			// TODO: 消す
+			goto Generic;
+		}
+	}
+	else
+	{
+Generic:
+		// 型パラメータにクラス型が指定された場合
+
+		// ジェネリック クラスとして利用する
 
 		// 拡張情報をセット
 		type.SetClassPtr( pGenericClass );
 		type.SetActualGenericTypes( genericTypes );
-
-		return ActiveBasic::Compiler::Error::StringToTypeErrorCode::Successful;
+	}
+
+	return ActiveBasic::Compiler::Error::StringToTypeErrorCode::Successful;
+}
+ActiveBasic::Compiler::Error::StringToTypeErrorCode::EnumType Compiler::StringToTypeEx( const std::string &typeName, Type &type, bool isResolveGenerics )
+{
+	type.SetIndex( -1 );
+
+
+	/////////////////////////////////////////////////////////
+	// ☆★☆ ジェネリクスサポート ☆★☆
+
+	if( strstr( typeName.c_str(), "<" ) )
+	{
+		return StringToGenericTypeEx( typeName, type );
 	}
 
@@ -147,13 +191,24 @@
 	// TypeDefされた型
 	////////////////////
-	int i=this->GetObjectModule().meta.GetTypeDefs().GetIndex( LexicalAnalyzer::FullNameToSymbol( typeName ) );
-	if(i!=-1)
-	{
-		type = this->GetObjectModule().meta.GetTypeDefs()[i].GetBaseType();
+	const TypeDef *pTypeDef = this->GetObjectModule().meta.GetTypeDefs().Find( LexicalAnalyzer::FullNameToSymbol( typeName ) );
+	if( pTypeDef )
+	{
+		type = pTypeDef->GetBaseType();
+
+		if( type.IsObject() )
+		{
+			if( isResolveGenerics && !type.HasActualGenericType() )
+			{
+				// ジェネリッククラスの場合
+				trace( "型解決されていない" );
+				return ActiveBasic::Compiler::Error::StringToTypeErrorCode::FailedResolveGenericType;
+			}
+		}
+
 		return ActiveBasic::Compiler::Error::StringToTypeErrorCode::Successful;
 	}
 
 	//クラス
-	const CClass *pobj_c = this->GetObjectModule().meta.GetClasses().FindEx( LexicalAnalyzer::FullNameToSymbol( typeName ) );
+	const CClass *pobj_c = this->GetObjectModule().meta.FindClassSupportedTypeDef( LexicalAnalyzer::FullNameToSymbol( typeName ) );
 	if(pobj_c)
 	{
