##// END OF EJS Templates
added support for global binary arithmetic operators...
florianlink -
r74:489aa998d2ad
parent child
Show More
@@ -294,6 +294,46 void AbstractMetaBuilder::traverseStreamOperator(FunctionModelItem item)
294 294 }
295 295 }
296 296
297 void AbstractMetaBuilder::traverseBinaryArithmeticOperator(FunctionModelItem item)
298 {
299 ArgumentList arguments = item->arguments();
300 if (arguments.size() == 2 && item->accessPolicy() == CodeModel::Public) {
301 AbstractMetaClass *aClass = argumentToClass(arguments.at(0));
302 AbstractMetaClass *bClass = argumentToClass(arguments.at(1));
303
304 if (!aClass) return;
305
306 AbstractMetaClass *old_current_class = m_current_class;
307 m_current_class = aClass;
308 AbstractMetaFunction *streamFunction = traverseFunction(item);
309 if (streamFunction != 0 && !streamFunction->isInvalid()) {
310 QString name = rename_operator(item->name().mid(8));
311 if (name.isEmpty()) return;
312
313 streamFunction->setFunctionType(AbstractMetaFunction::GlobalScopeFunction);
314 streamFunction->setName(name);
315
316 // Strip away the first argument, since that is the operator object
317 AbstractMetaArgumentList arguments = streamFunction->arguments();
318 arguments.removeFirst();
319 streamFunction->setArguments(arguments);
320
321 *streamFunction += AbstractMetaAttributes::Final;
322 *streamFunction += AbstractMetaAttributes::Public;
323 streamFunction->setOriginalAttributes(streamFunction->attributes());
324
325 setupFunctionDefaults(streamFunction, aClass);
326
327 aClass->addFunction(streamFunction);
328 if (bClass) {
329 aClass->typeEntry()->addExtraInclude(bClass->typeEntry()->include());
330 }
331
332 m_current_class = old_current_class;
333 }
334 }
335 }
336
297 337 void AbstractMetaBuilder::fixQObjectForScope(TypeDatabase *types,
298 338 NamespaceModelItem scope)
299 339 {
@@ -502,9 +542,14 bool AbstractMetaBuilder::build()
502 542 traverseCompareOperator(item);
503 543 }
504 544 }
505 // TODO XXX search and add operator+ etc. to the classes here!
506 545
507 546 {
547 FunctionList stream_operators = m_dom->findFunctions("operator+") + m_dom->findFunctions("operator-") + m_dom->findFunctions("operator/") + m_dom->findFunctions("operator*");
548 foreach (FunctionModelItem item, stream_operators) {
549 traverseBinaryArithmeticOperator(item);
550 }
551 }
552 {
508 553 FunctionList stream_operators = m_dom->findFunctions("operator<<") + m_dom->findFunctions("operator>>");
509 554 foreach (FunctionModelItem item, stream_operators) {
510 555 traverseStreamOperator(item);
@@ -80,6 +80,8 public:
80 80 void traverseFields(ScopeModelItem item, AbstractMetaClass *parent);
81 81 void traverseStreamOperator(FunctionModelItem function_item);
82 82 void traverseCompareOperator(FunctionModelItem item);
83 void traverseBinaryArithmeticOperator(FunctionModelItem item);
84
83 85 AbstractMetaFunction *traverseFunction(FunctionModelItem function);
84 86 AbstractMetaField *traverseField(VariableModelItem field, const AbstractMetaClass *cls);
85 87 void checkFunctionModifications();
General Comments 0
You need to be logged in to leave comments. Login now