Ignore:
Timestamp:
May 29, 2008, 1:36:02 AM (16 years ago)
Author:
dai_9181
Message:

ジェネリクス型の型解決ができない場合のエラーメッセージを実装した。

File:
1 edited

Legend:

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

    r603 r628  
    1414}
    1515
    16 bool Compiler::StringToType( const std::string &typeName, Type &type ){
     16ActiveBasic::Compiler::Error::StringToTypeErrorCode::EnumType Compiler::StringToTypeEx( const std::string &typeName, Type &type, bool isResolveGenerics )
     17{
    1718    type.SetIndex( -1 );
    1819
     
    3536        if( !pGenericClass )
    3637        {
    37             return false;
     38            return ActiveBasic::Compiler::Error::StringToTypeErrorCode::NotfoundGenericClass;
    3839        }
    3940
     
    7071        type.SetActualGenericTypes( genericTypes );
    7172
    72         return true;
     73        return ActiveBasic::Compiler::Error::StringToTypeErrorCode::Successful;
    7374    }
    7475
     
    102103            type.SetBasicType( DEF_PTR_PROC );
    103104            type.SetIndex( this->GetObjectModule().meta.GetProcPointers().size() - 1 );
    104             return true;
     105            return ActiveBasic::Compiler::Error::StringToTypeErrorCode::Successful;
    105106        }
    106107
    107108        const std::string &nextTypeName = typeName.substr( 1 );
    108109
    109         if( !StringToType( nextTypeName, type ) ){
    110             return false;
     110        ActiveBasic::Compiler::Error::StringToTypeErrorCode::EnumType result = StringToTypeEx( nextTypeName, type, isResolveGenerics );
     111        if( result != ActiveBasic::Compiler::Error::StringToTypeErrorCode::Successful )
     112        {
     113            return result;
    111114        }
    112115
    113116        type.PtrLevelUp();
    114117
    115         return true;
     118        return ActiveBasic::Compiler::Error::StringToTypeErrorCode::Successful;
    116119    }
    117120
    118121    {
    119122        int basicType;
    120         if( Type::StringToBasicType( typeName, basicType ) ){
     123        if( Type::StringToBasicType( typeName, basicType ) )
     124        {
    121125            // 基本型だったとき
    122126            type.SetBasicType( basicType );
    123             return true;
     127            return ActiveBasic::Compiler::Error::StringToTypeErrorCode::Successful;
    124128        }
    125129    }
    126130
    127131    // Object型だったとき
    128     if( typeName == "Object" ){
     132    if( typeName == "Object" )
     133    {
    129134        type.SetType( DEF_OBJECT, this->GetObjectModule().meta.GetClasses().GetObjectClassPtr() );
    130         return true;
     135        return ActiveBasic::Compiler::Error::StringToTypeErrorCode::Successful;
    131136    }
    132137
    133138    // String型だったとき
    134     if( typeName == "String" ){
     139    if( typeName == "String" )
     140    {
    135141        type.SetType( DEF_OBJECT, this->GetObjectModule().meta.GetClasses().GetStringClassPtr() );
    136         return true;
     142        return ActiveBasic::Compiler::Error::StringToTypeErrorCode::Successful;
    137143    }
    138144
     
    142148    ////////////////////
    143149    int i=this->GetObjectModule().meta.GetTypeDefs().GetIndex( LexicalAnalyzer::FullNameToSymbol( typeName ) );
    144     if(i!=-1){
     150    if(i!=-1)
     151    {
    145152        type = this->GetObjectModule().meta.GetTypeDefs()[i].GetBaseType();
    146         return true;
     153        return ActiveBasic::Compiler::Error::StringToTypeErrorCode::Successful;
    147154    }
    148155
    149156    //クラス
    150157    const CClass *pobj_c = this->GetObjectModule().meta.GetClasses().FindEx( LexicalAnalyzer::FullNameToSymbol( typeName ) );
    151     if(pobj_c){
    152         if( pobj_c->IsStructure() ){
     158    if(pobj_c)
     159    {
     160        if( isResolveGenerics )
     161        {
     162            if( pobj_c->IsGeneric() )
     163            {
     164                // ジェネリッククラスの場合
     165                trace( "型解決されていない" );
     166                return ActiveBasic::Compiler::Error::StringToTypeErrorCode::FailedResolveGenericType;
     167            }
     168        }
     169
     170        if( pobj_c->IsStructure() )
     171        {
    153172            type.SetBasicType( DEF_STRUCT );
    154173        }
    155         else{
     174        else
     175        {
    156176            type.SetBasicType( DEF_OBJECT );
    157177        }
    158178        type.SetClassPtr( pobj_c );
    159         return true;
     179        return ActiveBasic::Compiler::Error::StringToTypeErrorCode::Successful;
    160180    }
    161181
     
    176196            type.SetFormalTypeName( typeName );
    177197            type.SetFormalTypeIndex( formalTypeIndex );
    178             return true;
     198            return ActiveBasic::Compiler::Error::StringToTypeErrorCode::Successful;
    179199        }
    180200    }
     
    183203    /////////////////////////////////////////////////////////
    184204
    185     return false;
     205    return ActiveBasic::Compiler::Error::StringToTypeErrorCode::NotfoundType;
     206}
     207
     208bool Compiler::StringToType( const std::string &typeName, Type &type )
     209{
     210    return ( StringToTypeEx( typeName, type, false ) == ActiveBasic::Compiler::Error::StringToTypeErrorCode::Successful );
    186211}
    187212
Note: See TracChangeset for help on using the changeset viewer.