Index: trunk/ab5.0/abdev/BasicCompiler_Common/src/Class.cpp
===================================================================
--- trunk/ab5.0/abdev/BasicCompiler_Common/src/Class.cpp	(revision 507)
+++ trunk/ab5.0/abdev/BasicCompiler_Common/src/Class.cpp	(revision 511)
@@ -12,4 +12,6 @@
 #endif
 
+using namespace ActiveBasic::Compiler;
+
 
 Interface::Interface( const CClass *pInterfaceClass, const Types &actualTypeParameters )
@@ -167,81 +169,6 @@
 }
 
-bool CClass::Inherits( const char *inheritNames, int nowLine ){
-	int i = 0;
-	bool isInheritsClass = false;
-	while( true ){
-
-		char temporary[VN_SIZE];
-		for( int i2=0;; i++, i2++ ){
-			if( inheritNames[i] == '\0' || inheritNames[i] == ',' ){
-				temporary[i2] = 0;
-				break;
-			}
-			temporary[i2] = inheritNames[i];
-		}
-
-		// ジェネリクス構文を分解
-		char className[VN_SIZE];
-		Jenga::Common::Strings typeParameterStrings;
-		SplitGenericClassInstance( temporary, className, typeParameterStrings );
-
-		// 型パラメータ文字列から型データを取得
-		Types actualTypeParameters;
-		BOOST_FOREACH( const std::string &typeParameterStr, typeParameterStrings )
-		{
-			Type type;
-			compiler.StringToType( typeParameterStr, type );
-			actualTypeParameters.push_back( type );
-		}
-
-		//継承元クラスを取得
-		const CClass *pInheritsClass = compiler.GetObjectModule().meta.GetClasses().Find(className);
-		if( !pInheritsClass ){
-			compiler.errorMessenger.Output(106,className,nowLine);
-			return false;
-		}
-
-		if( pInheritsClass->IsClass() ){
-			// クラスを継承する
-			isInheritsClass = true;
-
-			if( !InheritsClass( *pInheritsClass, actualTypeParameters, nowLine ) ){
-				return false;
-			}
-		}
-		else{
-			compiler.errorMessenger.Output(135,pInheritsClass->GetFullName().c_str(),nowLine);
-			return false;
-		}
-
-		if( inheritNames[i] == '\0' ){
-			break;
-		}
-		i++;
-	}
-
-	if( !isInheritsClass ){
-		// クラスを一つも継承していないとき
-		if( !InheritsClass( *compiler.GetObjectModule().meta.GetClasses().GetObjectClassPtr(), Types(), nowLine ) ){
-			return false;
-		}
-	}
-
-	return true;
-}
 bool CClass::InheritsClass( const CClass &inheritsClass, const Types &actualTypeParameters, int nowLine )
 {
-	//ループ継承でないかをチェック
-	if( !compiler.GetObjectModule().meta.GetClasses().LoopRefCheck(inheritsClass) )
-	{
-		compiler.errorMessenger.Output(123,inheritsClass.GetName(),nowLine);
-		return false;
-	}
-
-	if( !inheritsClass.IsReady() ){
-		//継承先が読み取られていないとき
-		compiler.GetObjectModule().meta.GetClasses().LookaheadClass(inheritsClass.GetName().c_str());
-	}
-
 	//メソッドをコピー
 	BOOST_FOREACH( const CMethod *pBaseMethod, inheritsClass.GetDynamicMethods() ){
@@ -299,9 +226,4 @@
 	}
 
-	if( !interfaceClass.IsReady() ){
-		// インターフェイスが未解析のとき
-		compiler.GetObjectModule().meta.GetClasses().LookaheadClass( interfaceClass.GetName().c_str() );
-	}
-
 	::Interface *pDestInterface = new ::Interface( &interfaceClass, actualTypeParameters );
 
@@ -332,13 +254,28 @@
 		// Function Operator() As ITest
 
-		char temporary[1024];
-		sprintf(temporary,"%c%c%c%c()%c%c%s",
-			1, ESC_FUNCTION,
-			1, ESC_OPERATOR,
-			1, ESC_AS,
-			pDestInterface->GetFullNameWithActualGenericTypeParameters().c_str()
-		);
-
-		this->AddMethod(this,
+		char methodName[255] = { 1, ESC_OPERATOR, CALC_AS, '\0' };
+
+		//関数ハッシュへ登録
+		UserProc *pUserProc = new UserProc(
+			NamespaceScopes(),
+			NamespaceScopesCollection(),
+			methodName,
+			Procedure::Function,
+			false,
+			false,
+			false );
+		pUserProc->SetParentClass( this );
+
+		Parameters params;
+		params.push_back( new Parameter( "_System_LocalThis", Type( DEF_PTR_VOID ) ) );
+		pUserProc->SetRealParams( params );
+
+		pUserProc->SetReturnType( Type( DEF_OBJECT, interfaceClass ) );
+		pUserProc->_paramStr = "";
+		pUserProc->Using();
+		compiler.GetObjectModule().meta.GetUserProcs().Insert( pUserProc, -1 );
+
+		LexicalAnalyzer::AddMethod(this,
+			pUserProc,
 			Prototype::Public,
 			0,
@@ -347,42 +284,10 @@
 			false,			// isVirtual
 			false,			// isOverride
+			"",
 			true,			// isAutoGeneration
-			temporary,
 			-1
 		);
 	}
 
-
-	return true;
-}
-bool CClass::Implements( const char *interfaceNames, int nowLine )
-{
-	Jenga::Common::Strings paramStrs;
-	SplitParameter( interfaceNames, paramStrs );
-	
-	BOOST_FOREACH( const std::string &paramStr, paramStrs )
-	{
-		char className[VN_SIZE];
-		Jenga::Common::Strings typeParameterStrings;
-		SplitGenericClassInstance( paramStr.c_str(), className, typeParameterStrings );
-
-		Types actualTypeParameters;
-		BOOST_FOREACH( const std::string &typeParameterStr, typeParameterStrings )
-		{
-			Type type;
-			compiler.StringToType( typeParameterStr, type );
-			actualTypeParameters.push_back( type );
-		}
-
-		//継承元クラスを取得
-		const CClass *pInterfaceClass = compiler.GetObjectModule().meta.GetClasses().Find( className );
-		if( !pInterfaceClass ){
-			compiler.errorMessenger.Output(106,paramStr.c_str(),nowLine);
-			continue;
-		}
-
-		// インターフェイスを継承する
-		Implements( *pInterfaceClass, actualTypeParameters, nowLine );
-	}
 
 	return true;
@@ -419,150 +324,4 @@
 		CreateMember( accessibility, isConst, isRef, buffer, nowLine )
 	);
-}
-
-void CClass::AddMethod(CClass *pobj_c, Prototype::Accessibility accessibility, BOOL bStatic, bool isConst, bool isAbstract,
-						 bool isVirtual, bool isOverride, bool isAutoGeneration, char *buffer, int nowLine){
-	int i,i2;
-	char temporary[VN_SIZE];
-
-	i=2;
-	for(i2=0;;i++,i2++){
-		if(buffer[i]=='('||buffer[i]=='\0'){
-			temporary[i2]=0;
-			break;
-		}
-		temporary[i2]=buffer[i];
-	}
-
-
-	//関数ハッシュへ登録
-	char interfaceName[VN_SIZE] = "";
-	UserProc *pUserProc = compiler.GetObjectModule().meta.GetUserProcs().AddUserProc( NamespaceScopes(), NamespaceScopesCollection(), buffer,nowLine,isVirtual,pobj_c, (bStatic!=0), interfaceName );
-	if(!pUserProc) return;
-
-	if( isAutoGeneration )
-	{
-		// コード自動生成
-		pUserProc->ThisIsAutoGenerationProc();
-	}
-
-
-	////////////////////////////////////////////////////////////
-	// コンストラクタ、デストラクタの場合の処理
-	////////////////////////////////////////////////////////////
-	BOOL fConstructor=0,bDestructor=0;
-
-	if(lstrcmp(temporary,pobj_c->GetName().c_str())==0){
-		//コンストラクタの場合
-
-		//標準コンストラクタ（引数なし）
-		if(pUserProc->Params().size()==0) fConstructor=1;
-
-		//強制的にConst修飾子をつける
-		isConst = true;
-	}
-	else if(temporary[0]=='~'){
-		//デストラクタの場合はその名前が正しいかチェックを行う
-		if(lstrcmp(temporary+1,pobj_c->GetName().c_str())!=0)
-			compiler.errorMessenger.Output(117,NULL,nowLine);
-		else
-			bDestructor=1;
-	}
-	if(fConstructor||bDestructor){
-		// コンストラクタ、デストラクタのアクセシビリティをチェック
-
-		//強制的にConst修飾子をつける
-		isConst = true;
-	}
-
-	if( fConstructor == 1 )
-		pobj_c->SetConstructorMemberSubIndex( (int)pobj_c->GetDynamicMethods().size() );
-	else if( bDestructor )
-		pobj_c->SetDestructorMemberSubIndex( (int)pobj_c->GetDynamicMethods().size() );
-
-
-
-	//////////////////
-	// 重複チェック
-	//////////////////
-
-	if(pobj_c->DupliCheckMember(temporary)){
-		compiler.errorMessenger.Output(15,temporary,nowLine);
-		return;
-	}
-
-	//メソッド
-	BOOST_FOREACH( const CMethod *pMethod, pobj_c->GetDynamicMethods() )
-	{
-		//基底クラスと重複する場合はオーバーライドを行う
-		if( pMethod->GetInheritsClassPtr() ) continue;
-
-		if( pMethod->GetUserProc().IsEqualForOverride( pobj_c->GetSuperClassActualTypeParameters(), pUserProc ) )
-		{
-			//関数名、パラメータ、戻り値が合致したとき
-			compiler.errorMessenger.Output(15,pUserProc->GetName().c_str(),nowLine);
-			return;
-		}
-	}
-
-	//仮想関数の場合
-	if( isAbstract ) pUserProc->CompleteCompile();
-
-	// メソッドのオーバーライド
-	CMethod *pMethodForOverride = pobj_c->GetDynamicMethods().FindForOverride( pobj_c->GetSuperClassActualTypeParameters(), pUserProc );
-	if( pMethodForOverride )
-	{
-		pMethodForOverride->Override( pUserProc, accessibility, isOverride );
-		pUserProc->SetMethod( pMethodForOverride );
-		return;
-	}
-	else
-	{
-		// インターフェイス メソッドのオーバーライド
-		BOOST_FOREACH( ::Interface *pInterface, pobj_c->GetInterfaces() )
-		{
-			if( interfaceName[0] )
-			{
-				if( pInterface->GetClass().GetName() != interfaceName )
-				{
-					// 指定されたインターフェイス名と整合しないとき
-					continue;
-				}
-			}
-
-			if( !pInterface->GetClass().IsReady() ){
-				// インターフェイスが未解析のとき
-				compiler.GetObjectModule().meta.GetClasses().LookaheadClass( pInterface->GetClass().GetName().c_str() );
-			}
-
-			CMethod *pMethodForOverride = pInterface->GetDynamicMethods().FindForOverride( pInterface->GetActualTypeParameters(), pUserProc );
-			if( pMethodForOverride )
-			{
-				pMethodForOverride->Override( pUserProc, accessibility, isOverride );
-				pUserProc->SetMethod( pMethodForOverride );
-				return;
-			}
-		}
-	}
-
-	if( interfaceName[0] )
-	{
-		compiler.errorMessenger.Output(139,interfaceName,nowLine);
-	}
-
-	if( isVirtual ){
-		pobj_c->AddVtblNum( 1 );
-	}
-
-	if( isOverride ){
-		compiler.errorMessenger.Output(12,"Override",nowLine);
-	}
-
-	if(bStatic){
-		pobj_c->GetStaticMethods().AddStatic( pUserProc, accessibility );
-	}
-	else{
-		pobj_c->GetDynamicMethods().Add(pUserProc, accessibility, isConst, isAbstract, isVirtual);
-	}
 }
 
