void CppTree2Uml::parseTemplateDeclaration(TemplateDeclarationAST* ast) { TemplateParameterListAST* parmListAST = ast->templateParameterList(); if (parmListAST == NULL) return; QList<TemplateParameterAST*> parmList = parmListAST->templateParameterList(); for (int i = 0; i < parmList.size(); ++i) { // The template is either a typeParameter or a typeValueParameter. TemplateParameterAST* tmplParmNode = parmList.at(i); TypeParameterAST* typeParmNode = tmplParmNode->typeParameter(); if (typeParmNode) { NameAST* nameNode = typeParmNode->name(); if (nameNode) { QString typeName = nameNode->unqualifiedName()->text(); Model_Utils::NameAndType nt(typeName, NULL); m_templateParams.append(nt); } else { uError() << "nameNode is NULL"; } } ParameterDeclarationAST* valueNode = tmplParmNode->typeValueParameter(); if (valueNode) { TypeSpecifierAST* typeSpec = valueNode->typeSpec(); if (typeSpec == NULL) { uError() << "typeSpec is NULL"; continue; } QString typeName = typeSpec->name()->text(); UMLObject *t = Import_Utils::createUMLObject(UMLObject::ot_UMLObject, typeName, m_currentNamespace[m_nsCnt]); DeclaratorAST* declNode = valueNode->declarator(); NameAST* nameNode = declNode->declaratorId(); if (nameNode == NULL) { uError() << "CppTree2Uml::parseTemplateDeclaration(value):" << " nameNode is NULL"; continue; } QString paramName = nameNode->unqualifiedName()->text(); Model_Utils::NameAndType nt(paramName, t); m_templateParams.append(nt); } } if (ast->declaration()) TreeParser::parseDeclaration(ast->declaration()); }
void CppTree2Uml::parseEnumSpecifier(EnumSpecifierAST* ast) { NameAST *nameNode = ast->name(); if (nameNode == NULL) return; // skip constants QString typeName = nameNode->unqualifiedName()->text().trimmed(); if (typeName.isEmpty()) return; // skip constants UMLObject *o = Import_Utils::createUMLObject(UMLObject::ot_Enum, typeName, m_currentNamespace[m_nsCnt], ast->comment()); QList<EnumeratorAST*> l = ast->enumeratorList(); for (int i = 0; i < l.size(); ++i) { QString enumLiteral = l.at(i)->id()->text(); QString enumLiteralValue = QString(); if (l.at(i)->expr()) { enumLiteralValue = l.at(i)->expr()->text(); } Import_Utils::addEnumLiteral((UMLEnum*)o, enumLiteral, QString(), enumLiteralValue); } }
void TypeDesc::init( QString stri ) { m_data = 0; maybeInit(); if ( stri.isEmpty() ) return ; m_data->m_dec = stri; ///Store the decoration QStringList ls = splitType( stri ); QString str = ls.front().stripWhiteSpace(); ///Extract multiple types that may be written as a scope and put them to the next-types-list if ( !ls.isEmpty() ) { ls.pop_front(); if ( !ls.isEmpty() ) { m_data->m_nextType = TypeDescPointer( new TypeDescShared( ls.join( "::" ) ) ); } } while ( str.startsWith( QString( functionMark ) ) ) { m_data->m_functionDepth++; str = str.mid( strlen( functionMark ) ).stripWhiteSpace(); } bool isFunction = false, shorten = true; //Little hack done for performance-reasons, to do less comparing if( str.length() >= 4 ) { QChar c = str[0]; switch( c.latin1() ) { case 's': if( str[1] == 'h' ) { if( str.startsWith( "short" ) ) shorten = false; } else if( str[1] == 'i' ) { if( str.startsWith( "signed" ) ) shorten = false; } break; case 'l': if( str.startsWith( "long" ) ) shorten = false; break; case 'u': if( str.startsWith( "unsigned" ) ) shorten = false; break; case 'o': if( str.startsWith( "operator " ) ) { isFunction = true; shorten = false; } } } ///Since function-names are also processed by this function, this check has to be done if( shorten ) { ///Remove any prefixes like const or typename(very limited algorithm) int len = str.find( "<" ); if ( len == -1 ) len = str.length(); int currentStart = 0; bool wasEmpty = false; for ( int a = 0; a < len; a++ ) { if ( str[ a ] == ' ' ) { wasEmpty = true; } else if( wasEmpty && isValidIdentifierSign( str[a] ) ){ currentStart = a; wasEmpty = false; } } str = str.mid( currentStart ); } #ifdef USELEXER Driver d; Lexer lex( &d ); lex.setSource( str ); Parser parser( &d, &lex ); TypeSpecifierAST::Node typeSpec; if ( parser.parseTypeSpecifier( typeSpec ) ) { NameAST * name = typeSpec->name(); QPtrList<ClassOrNamespaceNameAST> l = name->classOrNamespaceNameList(); QPtrListIterator<ClassOrNamespaceNameAST> it( l ); QString type; while ( it.current() ) { if ( it.current() ->name() ) { type += it.current() ->name() ->text() + "::"; } ++it; } if ( name->unqualifiedName() && name->unqualifiedName() ->name() ) { type += name->unqualifiedName() ->name() ->text(); } m_data->m_cleanName = type.stripWhiteSpace(); takeTemplateParams( str ); m_data->m_pointerDepth = countExtract( '*', str ); } #else if( !isFunction ) { takeData( str ); m_data->m_pointerDepth = countExtract( '*', str ); } else { m_data->m_cleanName = str; } #endif }