Changeset 560 in dev for trunk/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Class.cpp
- Timestamp:
- May 5, 2008, 12:49:01 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Class.cpp
r558 r560 408 408 } 409 409 410 bool LexicalAnalyzer::Inherits( CClass & currentClass, const char *inheritNames, int nowLine ){410 bool LexicalAnalyzer::Inherits( CClass &_class, const char *inheritNames, int nowLine ){ 411 411 int i = 0; 412 412 bool isInheritsClass = false; … … 462 462 } 463 463 464 if( ! currentClass.InheritsClass( *pInheritsClass, actualTypeParameters, nowLine ) ){464 if( !_class.InheritsClass( *pInheritsClass, actualTypeParameters, nowLine ) ){ 465 465 return false; 466 466 } … … 495 495 496 496 // クラスを一つも継承していないとき 497 if( ! currentClass.InheritsClass( *pObjectClass, Types(), nowLine ) ){497 if( !_class.InheritsClass( *pObjectClass, Types(), nowLine ) ){ 498 498 return false; 499 499 } … … 503 503 } 504 504 505 bool LexicalAnalyzer::Implements( CClass ¤tClass, const char *interfaceNames, int nowLine ) 505 void LexicalAnalyzer::Implements( CClass &_class, Interface *pInterface, std::vector<DynamicMethod::OverrideResult> &overrideResults ) 506 { 507 _class.AddInterface( pInterface ); 508 509 510 ///////////////////////////////////////////////////////////////// 511 // 基底クラスのメソッドからインターフェイスメソッドを再実装する 512 ///////////////////////////////////////////////////////////////// 513 BOOST_FOREACH( CMethod *pMethod, _class.GetDynamicMethods() ) 514 { 515 DynamicMethod *pMethodForOverride = pInterface->GetDynamicMethods().FindForOverride( pInterface->GetActualTypeParameters(), &pMethod->GetUserProc() ); 516 if( pMethodForOverride ) 517 { 518 DynamicMethod::OverrideResult result; 519 result.enumType = pMethodForOverride->Override( &pMethod->GetUserProc(), pMethod->GetAccessibility(), false ); 520 result.pMethod = pMethod; 521 overrideResults.push_back( result ); 522 523 // 実装元になるメソッドは呼び出し不可にしておく(オーバーロードの解決から除外する) 524 pMethod->SetNotUseMark( true ); 525 } 526 } 527 528 529 ///////////////////////////////////////////////////////////////// 530 // キャストメソッドを追加(内部コードは自動生成すること) 531 // ※COMインターフェイスは除外すること 532 ///////////////////////////////////////////////////////////////// 533 if( pInterface->GetClass().IsInterface() ) 534 { 535 // Function Operator() As ITest 536 537 char methodName[255] = { 1, ESC_OPERATOR, CALC_AS, '\0' }; 538 539 //関数ハッシュへ登録 540 UserProc *pUserProc = new UserProc( 541 NamespaceScopes(), 542 NamespaceScopesCollection(), 543 methodName, 544 Procedure::Function, 545 false, 546 false, 547 false ); 548 pUserProc->SetParentClass( &_class ); 549 550 Parameters params; 551 params.push_back( new Parameter( "_System_LocalThis", Type( DEF_PTR_VOID ) ) ); 552 pUserProc->SetRealParams( params ); 553 554 pUserProc->SetReturnType( Type( DEF_OBJECT, pInterface->GetClass() ) ); 555 pUserProc->_paramStr = ""; 556 pUserProc->Using(); 557 compiler.GetObjectModule().meta.GetUserProcs().Insert( pUserProc, -1 ); 558 559 LexicalAnalyzer::AddMethod( 560 &_class, 561 pUserProc, 562 Prototype::Public, 563 0, 564 false, // isConst 565 false, // isAbstract 566 false, // isVirtual 567 false, // isOverride 568 "", 569 true, // isAutoGeneration 570 -1 571 ); 572 } 573 } 574 575 bool LexicalAnalyzer::Implements( CClass &_class, const char *interfaceNames, int nowLine ) 506 576 { 507 577 Jenga::Common::Strings paramStrs; … … 541 611 // インターフェイスを継承する 542 612 std::vector<DynamicMethod::OverrideResult> overrideResults; 543 currentClass.Implements( *pInterfaceClass, actualTypeParameters, overrideResults ); 613 Implements( 614 _class, 615 new ::Interface( pInterfaceClass, actualTypeParameters ), 616 overrideResults 617 ); 544 618 545 619 // エラーチェック
Note:
See TracChangeset
for help on using the changeset viewer.