Changeset 558 in dev for trunk/ab5.0/abdev


Ignore:
Timestamp:
May 5, 2008, 10:41:25 AM (17 years ago)
Author:
dai_9181
Message:

Overrideメソッド内で発生したエラーのエラーメッセージ表示処理は呼び出し元で行うようにした。

Location:
trunk/ab5.0/abdev/BasicCompiler_Common
Files:
5 edited

Legend:

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

    r557 r558  
    316316
    317317    // インターフェイス実装
    318     void Implements( const CClass &interfaceClass, const Types &actualTypeParameters, int nowLine );
     318    void Implements( const CClass &interfaceClass, const Types &actualTypeParameters, std::vector<DynamicMethod::OverrideResult> &overrideResults );
    319319
    320320    //メンバ、メソッドの追加
  • trunk/ab5.0/abdev/BasicCompiler_Common/include/Method.h

    r523 r558  
    3737        this->pUserProc = pUserProc;
    3838    }
    39 
    40     virtual bool Override( const UserProc *pUserProc, Prototype::Accessibility accessibility, bool isOverrideModifier ) = 0;
    4139
    4240    virtual bool IsAbstract() const = 0;
     
    5452class DynamicMethod : public CMethod
    5553{
     54public:
     55    struct OverrideResult
     56    {
     57        enum EnumType
     58        {
     59            Successful = 0,             // オーバーライドに成功
     60            NotVirtual,                 // 非Virtualメソッドに対してオーバーライドを行おうとした
     61            NotUseOverrideModifier,     // Override修飾子が無い状況で基底クラスの実体メソッドをオーバーライドしようとした
     62            DifferentAccesibility,      // オーバーライド元、先のアクセシビリティに相違がある
     63        };
     64
     65        EnumType enumType;
     66        const CMethod *pMethod;
     67    };
     68
     69private:
    5670    bool isAbstract;
    5771    bool isVirtual;
     
    100114    }
    101115
    102     virtual bool Override( const UserProc *pUserProc, Prototype::Accessibility accessibility, bool isOverrideModifier );
     116    DynamicMethod::OverrideResult::EnumType Override( const UserProc *pUserProc, Prototype::Accessibility accessibility, bool isOverrideModifier );
    103117
    104118    virtual bool IsAbstract() const
     
    250264            pUserProc 照らし合わせる関数
    251265    */
    252     CMethod *FindForOverride( const Types &actualTypeParametersForThisMethods, const UserProc *pUserProc );
     266    DynamicMethod *FindForOverride( const Types &actualTypeParametersForThisMethods, const UserProc *pUserProc );
    253267
    254268    const CMethod *GetMethodPtr( const UserProc *pUserProc ) const;
  • trunk/ab5.0/abdev/BasicCompiler_Common/src/Class.cpp

    r557 r558  
    185185}
    186186
    187 void CClass::Implements( const CClass &interfaceClass, const Types &actualTypeParameters, int nowLine )
     187void CClass::Implements( const CClass &interfaceClass, const Types &actualTypeParameters, std::vector<DynamicMethod::OverrideResult> &overrideResults )
    188188{
    189189    ::Interface *pDestInterface = new ::Interface( &interfaceClass, actualTypeParameters );
     
    197197    BOOST_FOREACH( CMethod *pMethod, GetDynamicMethods() )
    198198    {
    199         CMethod *pMethodForOverride = pDestInterface->GetDynamicMethods().FindForOverride( pDestInterface->GetActualTypeParameters(), &pMethod->GetUserProc() );
     199        DynamicMethod *pMethodForOverride = pDestInterface->GetDynamicMethods().FindForOverride( pDestInterface->GetActualTypeParameters(), &pMethod->GetUserProc() );
    200200        if( pMethodForOverride )
    201201        {
    202             pMethodForOverride->Override( &pMethod->GetUserProc(), pMethod->GetAccessibility(), false );
     202            DynamicMethod::OverrideResult result;
     203            result.enumType = pMethodForOverride->Override( &pMethod->GetUserProc(), pMethod->GetAccessibility(), false );
     204            result.pMethod = pMethod;
     205            overrideResults.push_back( result );
    203206
    204207            // 実装元になるメソッドは呼び出し不可にしておく(オーバーロードの解決から除外する)
  • trunk/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Class.cpp

    r557 r558  
    248248}
    249249
     250void OverrideErrorCheck( const DynamicMethod::OverrideResult &result )
     251{
     252    switch( result.enumType )
     253    {
     254    case DynamicMethod::OverrideResult::Successful:
     255        break;
     256    case DynamicMethod::OverrideResult::NotVirtual:
     257        compiler.errorMessenger.Output(136, result.pMethod->GetUserProc().GetName(), cp);
     258        break;
     259    case DynamicMethod::OverrideResult::NotUseOverrideModifier:
     260        compiler.errorMessenger.Output(127, result.pMethod->GetUserProc().GetName(), cp);
     261        break;
     262    case DynamicMethod::OverrideResult::DifferentAccesibility:
     263        compiler.errorMessenger.Output(128, result.pMethod->GetUserProc().GetName(), cp);
     264        break;
     265    default:
     266        throw;
     267    }
     268}
     269
    250270void LexicalAnalyzer::AddMethod(CClass *pobj_c, UserProc *pUserProc, Prototype::Accessibility accessibility, BOOL bStatic, bool isConst, bool isAbstract,
    251271    bool isVirtual, bool isOverride, const char *interfaceName, bool isAutoGeneration, int nowLine)
     
    320340
    321341    // メソッドのオーバーライド
    322     CMethod *pMethodForOverride = pobj_c->GetDynamicMethods().FindForOverride( pobj_c->GetSuperClassActualTypeParameters(), pUserProc );
     342    DynamicMethod *pMethodForOverride = pobj_c->GetDynamicMethods().FindForOverride( pobj_c->GetSuperClassActualTypeParameters(), pUserProc );
    323343    if( pMethodForOverride )
    324344    {
    325         pMethodForOverride->Override( pUserProc, accessibility, isOverride );
     345        DynamicMethod::OverrideResult result;
     346        result.enumType = pMethodForOverride->Override( pUserProc, accessibility, isOverride );
     347        result.pMethod = pMethodForOverride;
     348        OverrideErrorCheck( result );
     349
    326350        pUserProc->SetMethod( pMethodForOverride );
    327351        return;
     
    349373            }
    350374
    351             CMethod *pMethodForOverride = pInterface->GetDynamicMethods().FindForOverride( pInterface->GetActualTypeParameters(), pUserProc );
     375            DynamicMethod *pMethodForOverride = pInterface->GetDynamicMethods().FindForOverride( pInterface->GetActualTypeParameters(), pUserProc );
    352376            if( pMethodForOverride )
    353377            {
    354                 pMethodForOverride->Override( pUserProc, accessibility, isOverride );
     378                DynamicMethod::OverrideResult result;
     379                result.enumType = pMethodForOverride->Override( pUserProc, accessibility, isOverride );
     380                result.pMethod = pMethodForOverride;
     381                OverrideErrorCheck( result );
     382
    355383                pUserProc->SetMethod( pMethodForOverride );
    356384                return;
     
    512540        {
    513541            // インターフェイスを継承する
    514             currentClass.Implements( *pInterfaceClass, actualTypeParameters, nowLine );
     542            std::vector<DynamicMethod::OverrideResult> overrideResults;
     543            currentClass.Implements( *pInterfaceClass, actualTypeParameters, overrideResults );
     544
     545            // エラーチェック
     546            BOOST_FOREACH( const DynamicMethod::OverrideResult result, overrideResults )
     547            {
     548                OverrideErrorCheck( result );
     549            }
    515550        }
    516551        else
  • trunk/ab5.0/abdev/BasicCompiler_Common/src/Method.cpp

    r523 r558  
    44
    55
    6 bool DynamicMethod::Override( const UserProc *pUserProc, Prototype::Accessibility accessibility, bool isOverrideModifier )
     6DynamicMethod::OverrideResult::EnumType DynamicMethod::Override( const UserProc *pUserProc, Prototype::Accessibility accessibility, bool isOverrideModifier )
    77{
    8     if( this->IsVirtual()
    9         && !this->IsAbstract()
    10         && isOverrideModifier == false )
    11     {
    12         // Override修飾子が無い状況で基底クラスの実体メソッドをオーバーライドしようとした
    13         compiler.errorMessenger.Output(127,NULL,cp);
    14     }
     8    bool isAbstractBefore = this->IsAbstract();
    159
    1610    //メンバ関数を上書き
     
    1812    this->SetAbstractMark( false );
    1913
    20     if( !this->IsVirtual() )
     14    if( this->IsVirtual() )
    2115    {
    22         // オーバーライドミス
    23         compiler.errorMessenger.Output(136, pUserProc->GetName(), cp);
     16        if( !isAbstractBefore && isOverrideModifier == false )
     17        {
     18            return OverrideResult::NotUseOverrideModifier;
     19        }
    2420    }
    25     if(this->GetAccessibility() != accessibility )
     21    else
    2622    {
    27         compiler.errorMessenger.Output(128,NULL,cp);
     23        return OverrideResult::NotVirtual;
    2824    }
    2925
    30     return true;
     26    if( this->GetAccessibility() != accessibility )
     27    {
     28        return OverrideResult::DifferentAccesibility;
     29    }
     30
     31    return OverrideResult::Successful;
    3132}
    3233
     
    7172}
    7273
    73 CMethod *Methods::FindForOverride( const Types &actualTypeParametersForThisMethods, const UserProc *pUserProc )
     74DynamicMethod *Methods::FindForOverride( const Types &actualTypeParametersForThisMethods, const UserProc *pUserProc )
    7475{
    7576    //メソッドのオーバーライド
     
    7980        if( !pMethod->IsNotUse() && pMethod->GetUserProc().IsEqualForOverride( actualTypeParametersForThisMethods, pUserProc ) )
    8081        {
    81             return pMethod;
     82            return dynamic_cast<DynamicMethod *>(pMethod);
    8283        }
    8384    }
Note: See TracChangeset for help on using the changeset viewer.