Changeset 301 in dev for trunk/abdev/BasicCompiler_Common


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

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler_Common/NumOpe_GetType.cpp

    r299 r301  
    303303bool GetTermType( const char *term, Type &resultType, bool &isLiteral, bool *pIsClassName )
    304304{
    305     if( (string)term=="a[1]")
    306     {
    307         int test=0;
    308     }
    309305    char parameter[VN_SIZE];
    310306
  • trunk/abdev/BasicCompiler_Common/VariableOpe.cpp

    r299 r301  
    473473    resultType = pMember->GetType();
    474474
    475 
    476     /////////////////////////////////////////////////////////
    477     // ☆★☆ ジェネリクスサポート ☆★☆
    478 
    479     if( resultType.IsTypeParameter() )
    480     {
    481         // 型パラメータだったとき
    482 
    483         int ptrLevel = PTR_LEVEL( resultType.GetBasicType() );
    484 
    485         if( classType.HasActualGenericType() )
    486         {
    487             // TODO: GetDummyActualGenericTypeを適切な形に実装し直す
    488             resultType = classType.GetDummyActualGenericType();
    489         }
    490         else
    491         {
    492             // TODO: ベースオブジェクト(指定されていないときはObjectクラス)にセットする
    493             resultType.SetBasicType( DEF_OBJECT );
    494         }
    495 
    496         for( int i=0; i<ptrLevel; i++ )
    497         {
    498             resultType.PtrLevelUp();
    499         }
    500     }
    501 
    502     //
    503     /////////////////////////////////////////////////////////
     475    // 型パラメータを解決
     476    ResolveFormalGenericTypeParameter( resultType, classType );
    504477
    505478
     
    838811
    839812        for(i+=2,i2=0;;i++,i2++){
    840             if(buffer[i]==','||buffer[i]=='('||buffer[i]=='\0'){
     813            if(buffer[i]=='('||buffer[i]=='\0'){
    841814                temporary[i2]=0;
    842815                break;
     
    868841        }
    869842
    870         if( (string)temporary == "T" )
    871         {
    872             int test=0;
    873         }
    874 
    875843        if( !compiler.StringToType( temporary, type ) ){
    876844            SetError(3,temporary,cp);
     
    11601128            continue;
    11611129        }
     1130        if( Parameter[i] == '<' && IsStr == 0 )
     1131        {
     1132            if( IsGenericTypeSourcePart( Parameter + i ) )
     1133            {
     1134                // ジェネリクス構文
     1135                i3=GetStringInGenericBracket(temporary+i2,Parameter+i);
     1136                i+=i3-1;
     1137                i2+=i3-1;
     1138                continue;
     1139            }
     1140            else
     1141            {
     1142                // 一般構文
     1143            }
     1144        }
    11621145        if((Parameter[i]==','&&IsStr==0)||
    11631146            Parameter[i]=='\0'){
  • trunk/abdev/BasicCompiler_Common/include/Type.h

    r299 r301  
    227227
    228228    // 未完成
    229     const Type &GetDummyActualGenericType() const;
     229    const Type &GetActualGenericType( int index ) const;
    230230    bool HasActualGenericType() const;
    231231
  • 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.