Changeset 325 in dev for trunk/abdev/BasicCompiler_Common


Ignore:
Timestamp:
Sep 25, 2007, 8:56:38 AM (17 years ago)
Author:
dai_9181
Message:
 
Location:
trunk/abdev/BasicCompiler_Common
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler_Common/include/Class.h

    r299 r325  
    1010class UserProc;
    1111class CClass;
     12class Delegate;
    1213
    1314class InheritedInterface
     
    366367    }
    367368
     369    // デリゲート情報を取得
     370    const ::Delegate &GetDelegate() const;
     371
    368372    // vtblに存在する仮想関数の数
    369373    int GetVtblNum() const
  • trunk/abdev/BasicCompiler_Common/include/Delegate.h

    r322 r325  
    22
    33#include <Hashmap.h>
    4 #include <Symbol.h>
     4#include <Procedure.h>
    55
    66class Delegate : public Procedure, public Jenga::Common::ObjectInHashmap<Delegate>
  • trunk/abdev/BasicCompiler_Common/include/Parameter.h

    r322 r325  
    146146
    147147    bool Analyze( const char *sourceOfParams, int nowLine );
     148
     149    std::string GetString() const;
    148150};
  • trunk/abdev/BasicCompiler_Common/src/Class.cpp

    r322 r325  
    589589
    590590    return 0;
     591}
     592
     593const ::Delegate &CClass::GetDelegate() const
     594{
     595    const ::Delegate *dg = compiler.GetObjectModule().meta.GetDelegates().GetHashArrayElement( GetName().c_str() );
     596    while( dg )
     597    {
     598        if( dg->IsEqualSymbol( GetNamespaceScopes(), GetName() ) ){
     599            //名前空間とクラス名が一致した
     600            return *dg;
     601        }
     602        dg = dg->GetChainNext();
     603    }
     604
     605    Jenga::Throw( "CClass::GetDelegateメソッドに失敗" );
     606    static ::Delegate dummy;
     607    return dummy;
    591608}
    592609
  • trunk/abdev/BasicCompiler_Common/src/Delegate.cpp

    r322 r325  
    120120
    121121        std::map<std::string,std::string> values;
    122         values.insert( std::map<std::string,std::string>::value_type( "name", dg.GetName() ) );
    123         values.insert( std::map<std::string,std::string>::value_type( "params", "" ) );
     122
     123        if( dg.GetNamespaceScopes().size() )
     124        {
     125            std::string namespaceScopesCommandStr = "";
     126            std::string endNamespaceScopesCommandStr = "";
     127            BOOST_FOREACH( const std::string &namespaceStr, dg.GetNamespaceScopes() )
     128            {
     129                if( namespaceScopesCommandStr.size() )
     130                {
     131                    namespaceScopesCommandStr += ":";
     132                    endNamespaceScopesCommandStr += ":";
     133                }
     134                namespaceScopesCommandStr += "Namespace " + namespaceStr;
     135                endNamespaceScopesCommandStr += "End Namespace";
     136            }
     137
     138            values.insert( std::map<std::string,std::string>::value_type(
     139                "#namespace_begin#",
     140                namespaceScopesCommandStr
     141            ) );
     142            values.insert( std::map<std::string,std::string>::value_type(
     143                "#namespace_end#",
     144                endNamespaceScopesCommandStr
     145            ) );
     146        }
     147        else
     148        {
     149            values.insert( std::map<std::string,std::string>::value_type( "#namespace_begin#", "" ) );
     150            values.insert( std::map<std::string,std::string>::value_type( "#namespace_end#", "" ) );
     151        }
     152
     153        values.insert( std::map<std::string,std::string>::value_type( "#name#", dg.GetName() ) );
     154
     155        std::string paramsStr = dg.Params().GetString();
     156
     157        if( dg.IsFunction() )
     158        {
     159            values.insert( std::map<std::string,std::string>::value_type(
     160                "#call_method_begin#",
     161                (string)"Function Call(" + paramsStr + ") As " + compiler.TypeToString( dg.ReturnType() )
     162            ) );
     163
     164            values.insert( std::map<std::string,std::string>::value_type(
     165                "#call_method_end#",
     166                "End Function"
     167            ) );
     168
     169            values.insert( std::map<std::string,std::string>::value_type( "#result#", "Call=" ) );
     170        }
     171        else
     172        {
     173            values.insert( std::map<std::string,std::string>::value_type(
     174                "#call_method_begin#",
     175                (string)"Sub Call(" + paramsStr + ")"
     176            ) );
     177
     178            values.insert( std::map<std::string,std::string>::value_type(
     179                "#call_method_end#",
     180                "End Sub"
     181            ) );
     182
     183            values.insert( std::map<std::string,std::string>::value_type( "#result#", "" ) );
     184        }
     185
     186        values.insert( std::map<std::string,std::string>::value_type( "#params#", paramsStr ) );
     187
    124188        destSource += sourceTemplate.GetResult( values );
    125189    }
     190
     191    ts( destSource.c_str() );
    126192}
  • trunk/abdev/BasicCompiler_Common/src/Parameter.cpp

    r322 r325  
    159159    return true;
    160160}
     161
     162std::string Parameters::GetString() const
     163{
     164    std::string result;
     165
     166    const Parameters &params = *this;
     167    BOOST_FOREACH( const Parameter *pParam, params )
     168    {
     169        if( result.size() )
     170        {
     171            result += ",";
     172        }
     173
     174        result += pParam->GetVarName() + " As " + compiler.TypeToString( *pParam );
     175    }
     176    return result;
     177}
  • trunk/abdev/BasicCompiler_Common/src/Source.cpp

    r322 r325  
    10481048        while( true )
    10491049        {
    1050             std::string::size_type index = result.find( "#" + it->first + "#" );
     1050            std::string::size_type index = result.find( it->first );
    10511051            if( index == std::string::npos )
    10521052            {
     
    10541054            }
    10551055
    1056             result = result.substr( 0, index ) + it->second + result.substr( index + it->first.length() + 2 );
     1056            result = result.substr( 0, index ) + it->second + result.substr( index + it->first.length() );
    10571057        }
    10581058        it++;
Note: See TracChangeset for help on using the changeset viewer.