@@ -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