Ignore:
Timestamp:
Aug 23, 2007, 6:17:00 PM (17 years ago)
Author:
dai_9181
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler_Common/src/Class.cpp

    r297 r299  
    188188        }
    189189
     190        // ジェネリクス構文を分解
    190191        char className[VN_SIZE];
    191         std::vector<std::string> typeParameters;
    192         SplitGenericClassInstance( temporary, className, typeParameters );
     192        Jenga::Common::Strings typeParameterStrings;
     193        SplitGenericClassInstance( temporary, className, typeParameterStrings );
     194
     195        // 型パラメータ文字列から型データを取得
     196        std::vector<Type> actualTypeParameters;
     197        BOOST_FOREACH( const std::string &typeParameterStr, typeParameterStrings )
     198        {
     199            Type type;
     200            compiler.StringToType( typeParameterStr, type );
     201            actualTypeParameters.push_back( type );
     202        }
    193203
    194204        //継承元クラスを取得
     
    206216            isInheritsClass = true;
    207217
    208             if( !InheritsClass( *pInheritsClass, nowLine ) ){
     218            if( !InheritsClass( *pInheritsClass, actualTypeParameters, nowLine ) ){
    209219                return false;
    210220            }
     
    223233    if( !isInheritsClass ){
    224234        // クラスを一つも継承していないとき
    225         if( !InheritsClass( *compiler.GetObjectModule().meta.GetClasses().GetObjectClassPtr(), nowLine ) ){
     235        if( !InheritsClass( *compiler.GetObjectModule().meta.GetClasses().GetObjectClassPtr(), Types(), nowLine ) ){
    226236            return false;
    227237        }
     
    241251
    242252        char className[VN_SIZE];
    243         std::vector<std::string> typeParameters;
     253        Jenga::Common::Strings typeParameters;
    244254        SplitGenericClassInstance( temporary, className, typeParameters );
    245255
     
    273283    return true;
    274284}
    275 bool CClass::InheritsClass( const CClass &inheritsClass, int nowLine ){
     285bool CClass::InheritsClass( const CClass &inheritsClass, const Types &actualTypeParameters, int nowLine ){
    276286
    277287    //ループ継承でないかをチェック
     
    300310        }
    301311
     312        // メンバのみ、型パラメータを解決する(メソッドのほうは呼び出し時に解決する)
     313        if( pMember->GetType().IsTypeParameter() )
     314        {
     315            pMember->ResetType( actualTypeParameters[pMember->GetType().GetFormalTypeIndex()] );
     316        }
     317
    302318        dynamicMembers.push_back( pMember );
    303319    }
     
    332348    //継承先のクラスをメンバとして保持する
    333349    SetSuperClass( &inheritsClass );
     350    SetSuperClassActualTypeParameters( actualTypeParameters );
    334351
    335352    return true;
     
    10751092    namespaceScopes.clear();
    10761093
     1094    // 呼び出し元でコンパイル中のクラスポインタをバックアップ
     1095    const CClass *pBackCompilingClass = compiler.pCompilingClass;
     1096
    10771097    for(i=0;;i++){
    10781098        if(basbuf[i]=='\0') break;
     
    11621182
    11631183                //継承させる
    1164                 if( !pobj_c->InheritsClass( *pInheritsClass, i ) ){
     1184                if( !pobj_c->InheritsClass( *pInheritsClass, Types(), i ) ){
    11651185                    goto Interface_InheritsError;
    11661186                }
     
    12701290
    12711291            char className[VN_SIZE];
    1272             std::vector<std::string> typeParameters;
     1292            Jenga::Common::Strings typeParameters;
    12731293            SplitGenericClassInstance( temporary, className, typeParameters );
    12741294
     
    14761496                            if(!MemberVar_LoopRefCheck(pobj_c->GetDynamicMembers()[pobj_c->GetDynamicMembers().size()-1]->GetType().GetClass())){
    14771497                                //エラー回避
    1478                                 pobj_c->GetDynamicMembers()[pobj_c->GetDynamicMembers().size()-1]->GetType().SetBasicType( DEF_PTR_VOID );
     1498                                Type &type = const_cast<Type &>(pobj_c->GetDynamicMembers().back()->GetType());
     1499                                type.SetBasicType( DEF_PTR_VOID );
    14791500                            }
    14801501                            pobj_LoopRefCheck->del(pobj_c->GetName().c_str());
     
    15241545    }
    15251546
     1547    // 呼び出し元でコンパイル中のクラスポインタを元に戻す
     1548    compiler.pCompilingClass = pBackCompilingClass;
    15261549
    15271550    // 名前空間を元に戻す
Note: See TracChangeset for help on using the changeset viewer.