Changeset 299 in dev for trunk/abdev/BasicCompiler_Common/src/Class.cpp
- Timestamp:
- Aug 23, 2007, 6:17:00 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler_Common/src/Class.cpp
r297 r299 188 188 } 189 189 190 // ジェネリクス構文を分解 190 191 char className[VN_SIZE]; 191 std::vector<std::string> typeParameters; 192 SplitGenericClassInstance( temporary, className, typeParameters ); 192 Jenga::Common::Strings typeParameterStrings; 193 SplitGenericClassInstance( temporary, className, typeParameterStrings ); 194 195 // 型パラメータ文字列から型データを取得 196 std::vector<Type> actualTypeParameters; 197 BOOST_FOREACH( const std::string &typeParameterStr, typeParameterStrings ) 198 { 199 Type type; 200 compiler.StringToType( typeParameterStr, type ); 201 actualTypeParameters.push_back( type ); 202 } 193 203 194 204 //継承元クラスを取得 … … 206 216 isInheritsClass = true; 207 217 208 if( !InheritsClass( *pInheritsClass, nowLine ) ){218 if( !InheritsClass( *pInheritsClass, actualTypeParameters, nowLine ) ){ 209 219 return false; 210 220 } … … 223 233 if( !isInheritsClass ){ 224 234 // クラスを一つも継承していないとき 225 if( !InheritsClass( *compiler.GetObjectModule().meta.GetClasses().GetObjectClassPtr(), nowLine ) ){235 if( !InheritsClass( *compiler.GetObjectModule().meta.GetClasses().GetObjectClassPtr(), Types(), nowLine ) ){ 226 236 return false; 227 237 } … … 241 251 242 252 char className[VN_SIZE]; 243 std::vector<std::string>typeParameters;253 Jenga::Common::Strings typeParameters; 244 254 SplitGenericClassInstance( temporary, className, typeParameters ); 245 255 … … 273 283 return true; 274 284 } 275 bool CClass::InheritsClass( const CClass &inheritsClass, int nowLine ){285 bool CClass::InheritsClass( const CClass &inheritsClass, const Types &actualTypeParameters, int nowLine ){ 276 286 277 287 //ループ継承でないかをチェック … … 300 310 } 301 311 312 // メンバのみ、型パラメータを解決する(メソッドのほうは呼び出し時に解決する) 313 if( pMember->GetType().IsTypeParameter() ) 314 { 315 pMember->ResetType( actualTypeParameters[pMember->GetType().GetFormalTypeIndex()] ); 316 } 317 302 318 dynamicMembers.push_back( pMember ); 303 319 } … … 332 348 //継承先のクラスをメンバとして保持する 333 349 SetSuperClass( &inheritsClass ); 350 SetSuperClassActualTypeParameters( actualTypeParameters ); 334 351 335 352 return true; … … 1075 1092 namespaceScopes.clear(); 1076 1093 1094 // 呼び出し元でコンパイル中のクラスポインタをバックアップ 1095 const CClass *pBackCompilingClass = compiler.pCompilingClass; 1096 1077 1097 for(i=0;;i++){ 1078 1098 if(basbuf[i]=='\0') break; … … 1162 1182 1163 1183 //継承させる 1164 if( !pobj_c->InheritsClass( *pInheritsClass, i ) ){1184 if( !pobj_c->InheritsClass( *pInheritsClass, Types(), i ) ){ 1165 1185 goto Interface_InheritsError; 1166 1186 } … … 1270 1290 1271 1291 char className[VN_SIZE]; 1272 std::vector<std::string>typeParameters;1292 Jenga::Common::Strings typeParameters; 1273 1293 SplitGenericClassInstance( temporary, className, typeParameters ); 1274 1294 … … 1476 1496 if(!MemberVar_LoopRefCheck(pobj_c->GetDynamicMembers()[pobj_c->GetDynamicMembers().size()-1]->GetType().GetClass())){ 1477 1497 //エラー回避 1478 pobj_c->GetDynamicMembers()[pobj_c->GetDynamicMembers().size()-1]->GetType().SetBasicType( DEF_PTR_VOID ); 1498 Type &type = const_cast<Type &>(pobj_c->GetDynamicMembers().back()->GetType()); 1499 type.SetBasicType( DEF_PTR_VOID ); 1479 1500 } 1480 1501 pobj_LoopRefCheck->del(pobj_c->GetName().c_str()); … … 1524 1545 } 1525 1546 1547 // 呼び出し元でコンパイル中のクラスポインタを元に戻す 1548 compiler.pCompilingClass = pBackCompilingClass; 1526 1549 1527 1550 // 名前空間を元に戻す
Note:
See TracChangeset
for help on using the changeset viewer.