Ignore:
Timestamp:
Aug 23, 2007, 10:58:43 PM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev/BasicCompiler_Common/src
Files:
2 edited

Legend:

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

    r299 r301  
    2828        // ジェネリッククラスをインスタンス化した型の場合
    2929        int i = 0;
    30         char className[VN_SIZE], typeParameter[VN_SIZE];
     30        char className[VN_SIZE];
    3131        GetIdentifierToken( className, typeName.c_str(), i );
    32         i++;
    33         GetIdentifierToken( typeParameter, typeName.c_str(), i );
    3432
    3533        // ジェネリクスクラスを取得
    3634        const CClass *pGenericClass = this->GetObjectModule().meta.GetClasses().Find( className );
    3735
    38         // 型パラメータの型情報を取得
    39         Type baseType;
    40         StringToType( typeParameter, baseType );
     36        if( !pGenericClass )
     37        {
     38            Jenga::Throw( "StringToType内のジェネリクスクラス取得部分でpGenericClassがNULL" );
     39        }
     40
     41        if( typeName[i] != '<' )
     42        {
     43            Jenga::Throw( "StringToType内でジェネリクス構文の解析に失敗" );
     44        }
    4145
    4246        GenericTypes genericTypes;
    43         genericTypes.push_back( GenericType( "(non support)", baseType ) );
     47        while( true )
     48        {
     49            i++;
     50
     51            char typeParameter[VN_SIZE];
     52            GetIdentifierToken( typeParameter, typeName.c_str(), i );
     53
     54            // 型パラメータの型情報を取得
     55            Type baseType;
     56            StringToType( typeParameter, baseType );
     57
     58            genericTypes.push_back( GenericType( "(non support)", baseType ) );
     59
     60            if( typeName[i] != ',' )
     61            {
     62                break;
     63            }
     64        }
    4465
    4566        // 基本型をセット
  • trunk/abdev/BasicCompiler_Common/src/Type.cpp

    r299 r301  
    455455}
    456456
    457 const Type &Type::GetDummyActualGenericType() const
    458 {
    459     return actualGenericTypes[0].GetType();
     457const Type &Type::GetActualGenericType( int index ) const
     458{
     459    return actualGenericTypes[index].GetType();
    460460}
    461461bool Type::HasActualGenericType() const
     
    515515                    if( pClass->GetSuperClassActualTypeParameters().size() )
    516516                    {
     517                        // TODO: 適切な形に実装し直す(暫定的にトップの型を持ってきている)
    517518                        typeParameter = pClass->GetSuperClassActualTypeParameters()[0];
    518519                    }
     
    526527            if( classType.HasActualGenericType() )
    527528            {
    528                 // TODO: GetDummyActualGenericTypeを適切な形に実装し直す
    529                 typeParameter = classType.GetDummyActualGenericType();
     529                typeParameter = classType.GetActualGenericType( typeParameter.GetFormalTypeIndex() );
    530530            }
    531531            else
Note: See TracChangeset for help on using the changeset viewer.