@@ -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 | void AbstractMetaBuilder::fixQObjectForScope(TypeDatabase *types, |
|
337 | void AbstractMetaBuilder::fixQObjectForScope(TypeDatabase *types, | |
298 | NamespaceModelItem scope) |
|
338 | NamespaceModelItem scope) | |
299 | { |
|
339 | { | |
@@ -502,9 +542,14 bool AbstractMetaBuilder::build() | |||||
502 | traverseCompareOperator(item); |
|
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 | FunctionList stream_operators = m_dom->findFunctions("operator<<") + m_dom->findFunctions("operator>>"); |
|
553 | FunctionList stream_operators = m_dom->findFunctions("operator<<") + m_dom->findFunctions("operator>>"); | |
509 | foreach (FunctionModelItem item, stream_operators) { |
|
554 | foreach (FunctionModelItem item, stream_operators) { | |
510 | traverseStreamOperator(item); |
|
555 | traverseStreamOperator(item); |
@@ -80,6 +80,8 public: | |||||
80 | void traverseFields(ScopeModelItem item, AbstractMetaClass *parent); |
|
80 | void traverseFields(ScopeModelItem item, AbstractMetaClass *parent); | |
81 | void traverseStreamOperator(FunctionModelItem function_item); |
|
81 | void traverseStreamOperator(FunctionModelItem function_item); | |
82 | void traverseCompareOperator(FunctionModelItem item); |
|
82 | void traverseCompareOperator(FunctionModelItem item); | |
|
83 | void traverseBinaryArithmeticOperator(FunctionModelItem item); | |||
|
84 | ||||
83 | AbstractMetaFunction *traverseFunction(FunctionModelItem function); |
|
85 | AbstractMetaFunction *traverseFunction(FunctionModelItem function); | |
84 | AbstractMetaField *traverseField(VariableModelItem field, const AbstractMetaClass *cls); |
|
86 | AbstractMetaField *traverseField(VariableModelItem field, const AbstractMetaClass *cls); | |
85 | void checkFunctionModifications(); |
|
87 | void checkFunctionModifications(); |
General Comments 0
You need to be logged in to leave comments.
Login now