Ignore:
Timestamp:
Aug 21, 2007, 11:00:25 PM (17 years ago)
Author:
dai_9181
Message:

ジェネリクスのベースを実装

File:
1 edited

Legend:

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

    r273 r290  
    1919bool Compiler::StringToType( const string &typeName, Type &type ){
    2020    type.SetIndex( -1 );
     21
     22
     23    /////////////////////////////////////////////////////////
     24    // ☆★☆ ジェネリクスサポート ☆★☆
     25
     26    if( strstr( typeName.c_str(), "<" ) )
     27    {
     28        // ジェネリッククラスをインスタンス化した型の場合
     29        int i = 0;
     30        char className[VN_SIZE], typeParameter[VN_SIZE];
     31        GetIdentifierToken( className, typeName.c_str(), i );
     32        i++;
     33        GetIdentifierToken( typeParameter, typeName.c_str(), i );
     34
     35        // ジェネリクスクラスを取得
     36        const CClass *pGenericClass = compiler.GetObjectModule().meta.GetClasses().Find( className );
     37
     38        // 型パラメータの型情報を取得
     39        Type baseType;
     40        StringToType( typeParameter, baseType );
     41
     42        GenericTypes genericTypes;
     43        genericTypes.push_back( GenericType( "(non support)", baseType ) );
     44
     45        // 基本型をセット
     46        type.SetBasicType( DEF_OBJECT );
     47
     48        // 拡張情報をセット
     49        type.SetClassPtr( pGenericClass );
     50        type.SetActualGenericTypes( genericTypes );
     51
     52        return true;
     53    }
     54
     55    //
     56    /////////////////////////////////////////////////////////
     57
    2158
    2259    if( typeName[0] == '*' ){
     
    74111    const CClass *pobj_c = compiler.GetObjectModule().meta.GetClasses().Find( typeName );
    75112    if(pobj_c){
    76         type.SetClassPtr( pobj_c );
    77 
    78113        if( pobj_c->IsStructure() ){
    79114            type.SetBasicType( DEF_STRUCT );
     
    82117            type.SetBasicType( DEF_OBJECT );
    83118        }
     119        type.SetClassPtr( pobj_c );
    84120        return true;
    85121    }
     122
     123
     124    /////////////////////////////////////////////////////////
     125    // ☆★☆ ジェネリクスサポート ☆★☆
     126
     127    // 型パラメータ
     128    if( compiler.pCompilingClass )
     129    {
     130        // クラスに属するメソッドをコンパイルしているとき
     131        if( compiler.pCompilingClass->IsExistFormalGenericTypeParameter( typeName ) )
     132        {
     133            // コンパイル中クラスにおけるジェネリクス用の型パラメータのとき
     134            type.SetBasicType( DEF_TYPE_PARAMETER );
     135            type.SetClassPtr( compiler.GetObjectModule().meta.GetClasses().GetObjectClassPtr() );
     136            return true;
     137        }
     138    }
     139
     140    //
     141    /////////////////////////////////////////////////////////
    86142
    87143    return false;
Note: See TracChangeset for help on using the changeset viewer.