Changeset 382 in dev for trunk/abdev/BasicCompiler_Common


Ignore:
Timestamp:
Jan 2, 2008, 12:50:34 AM (16 years ago)
Author:
dai_9181
Message:

ジェネリクスインターフェイス実装時のオーバーロード解決ロジックを改良。(型パラメータを戻り値に持つメソッドのオーバーロードをミスしてしまうバグを修正)

Location:
trunk/abdev/BasicCompiler_Common
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler_Common/include/Class.h

    r379 r382  
    44#include <Program.h>
    55#include <Prototype.h>
     6#include <Type.h>
    67#include <Method.h>
    78#include <Member.h>
     
    148149    GenericTypes formalGenericTypes;
    149150
    150     // 継承クラス
     151    // 基底クラス
    151152    const CClass *pSuperClass;
    152153
    153     // 継承クラスの型パラメータ(実パラメータ)
     154    // 基底クラスの型パラメータ(実パラメータ)
    154155    Types superClassActualTypeParameters;
    155156
  • trunk/abdev/BasicCompiler_Common/include/Member.h

    r299 r382  
    77#include <Program.h>
    88#include <Prototype.h>
    9 #include <Type.h>
    109
    1110using namespace std;
  • trunk/abdev/BasicCompiler_Common/include/Method.h

    r353 r382  
    230230    void AddStatic(UserProc *pUserProc,Prototype::Accessibility accessibility);
    231231
    232     // オーバーライドのための検索
    233     CMethod *FindForOverride( const UserProc *pUserProc );
     232    /*!
     233    @brief  オーバーライドのための検索
     234    @param  actualTypeParametersForThisMethods thisオブジェクトで保有するメソッド群を対象とした実型パラメータ
     235            pUserProc 照らし合わせる関数
     236    */
     237    CMethod *FindForOverride( const Types &actualTypeParametersForThisMethods, const UserProc *pUserProc );
    234238
    235239    const CMethod *GetMethodPtr( const UserProc *pUserProc ) const;
  • trunk/abdev/BasicCompiler_Common/include/Procedure.h

    r364 r382  
    55#include <Program.h>
    66#include <Class.h>
    7 #include <Method.h>
    87#include <Procedure.h>
    98#include <Parameter.h>
     
    225224    }
    226225
    227     // オーバーライド用に関数同士が等しいかどうかをチェックする
    228     bool IsEqualForOverride( const UserProc *pUserProc ) const
    229     {
    230         if( this->GetName() == pUserProc->GetName()                     // 名前空間及び名前が等しい
    231             && this->Params().Equals( pUserProc->Params() )             // パラメータが等しい
    232             && this->returnType.Equals( pUserProc->returnType ) )       // 戻り値が等しい
    233         {
    234             return true;
    235         }
    236         return false;
    237     }
     226    /*!
     227    @brief  オーバーライド用に関数同士が等しいかどうかをチェックする
     228    @param  actualTypeParametersForThisProc thisオブジェクトで保有するメソッドを対象とした実型パラメータ
     229            pUserProc 照らし合わせる関数
     230    */
     231    bool IsEqualForOverride( const Types &actualTypeParametersForThisProc, const UserProc *pUserProc ) const;
    238232
    239233    bool IsMacro() const
  • trunk/abdev/BasicCompiler_Common/src/Class.cpp

    r380 r382  
    340340    BOOST_FOREACH( CMethod *pMethod, GetDynamicMethods() )
    341341    {
    342         CMethod *pMethodForOverride = pDestInterface->GetDynamicMethods().FindForOverride( &pMethod->GetUserProc() );
     342        CMethod *pMethodForOverride = pDestInterface->GetDynamicMethods().FindForOverride( pDestInterface->GetActualTypeParameters(), &pMethod->GetUserProc() );
    343343        if( pMethodForOverride )
    344344        {
     
    524524        if( pMethod->GetInheritsClassPtr() ) continue;
    525525
    526         if( pMethod->GetUserProc().IsEqualForOverride( pUserProc ) )
     526        if( pMethod->GetUserProc().IsEqualForOverride( pobj_c->GetSuperClassActualTypeParameters(), pUserProc ) )
    527527        {
    528528            //関数名、パラメータ、戻り値が合致したとき
     
    536536
    537537    // メソッドのオーバーライド
    538     CMethod *pMethodForOverride = pobj_c->GetDynamicMethods().FindForOverride( pUserProc );
     538    CMethod *pMethodForOverride = pobj_c->GetDynamicMethods().FindForOverride( pobj_c->GetSuperClassActualTypeParameters(), pUserProc );
    539539    if( pMethodForOverride )
    540540    {
     
    545545    else
    546546    {
     547   
     548        if( pUserProc->GetName() == "GenericProc" )
     549        {
     550            int test=0;
     551        }
     552
    547553        // インターフェイス メソッドのオーバーライド
    548554        BOOST_FOREACH( ::Interface *pInterface, pobj_c->GetInterfaces() )
     
    562568            }
    563569
    564             CMethod *pMethodForOverride = pInterface->GetDynamicMethods().FindForOverride( pUserProc );
     570            CMethod *pMethodForOverride = pInterface->GetDynamicMethods().FindForOverride( pInterface->GetActualTypeParameters(), pUserProc );
    565571            if( pMethodForOverride )
    566572            {
  • trunk/abdev/BasicCompiler_Common/src/Method.cpp

    r370 r382  
    7171}
    7272
    73 CMethod *Methods::FindForOverride( const UserProc *pUserProc )
     73CMethod *Methods::FindForOverride( const Types &actualTypeParametersForThisMethods, const UserProc *pUserProc )
    7474{
    7575    //メソッドのオーバーライド
     
    7777    BOOST_FOREACH( CMethod *pMethod, methods )
    7878    {
    79         if( !pMethod->IsNotUse() && pMethod->GetUserProc().IsEqualForOverride( pUserProc ) )
     79        if( !pMethod->IsNotUse() && pMethod->GetUserProc().IsEqualForOverride( actualTypeParametersForThisMethods, pUserProc ) )
    8080        {
    8181            return pMethod;
  • trunk/abdev/BasicCompiler_Common/src/Procedure.cpp

    r364 r382  
    1616#endif
    1717
     18
     19bool UserProc::IsEqualForOverride( const Types &actualTypeParametersForThisProc, const UserProc *pUserProc ) const
     20{
     21    if( this->GetName() == pUserProc->GetName()                     // 名前空間及び名前が等しい
     22        && this->Params().Equals( pUserProc->Params() ) )           // パラメータが等しい
     23    {
     24        if( this->returnType.Equals( pUserProc->returnType ) )
     25        {
     26            // 戻り値が等しい
     27            return true;
     28        }
     29
     30        if( this->returnType.IsTypeParameter() )
     31        {
     32            // 型パラメータだったとき
     33            if( actualTypeParametersForThisProc[this->returnType.GetFormalTypeIndex()].Equals( pUserProc->returnType ) )
     34            {
     35                // 戻り値が等しい
     36                return true;
     37            }
     38        }
     39    }
     40    return false;
     41}
     42   
    1843
    1944std::string UserProc::GetFullName() const
Note: See TracChangeset for help on using the changeset viewer.