File indexing completed on 2024-05-12 04:39:26

0001 /*
0002     SPDX-FileCopyrightText: 2014 Aleix Pol <aleixpol@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "declarationbuilder.h"
0008 #include <cmakeduchaintypes.h>
0009 #include <language/duchain/types/functiontype.h>
0010 #include <language/duchain/types/delayedtype.h>
0011 
0012 using namespace KDevelop;
0013 
0014 void DeclarationBuilder::startVisiting(CMakeContentIterator* node)
0015 {
0016     for(; node->hasNext(); ) {
0017         const CMakeFunctionDesc& func = node->next();
0018 
0019         if (func.name == QLatin1String("add_executable") || func.name == QLatin1String("add_library")) {
0020             if (func.arguments.isEmpty()) {
0021                 continue;
0022             }
0023             CMakeFunctionArgument arg = func.arguments.first();
0024 
0025             DUChainWriteLocker lock;
0026             auto* decl = openDeclaration<Declaration>(Identifier(arg.value), arg.range(), DeclarationIsDefinition);
0027             decl->setAbstractType(AbstractType::Ptr(new TargetType));
0028             closeDeclaration();
0029         } else if(func.name == QLatin1String("macro") || func.name == QLatin1String("function")) {
0030             if (func.arguments.isEmpty()) {
0031                 continue;
0032             }
0033             CMakeFunctionArgument arg = func.arguments.first();
0034             FunctionType::Ptr funcType(new FunctionType);
0035 
0036             auto it=func.arguments.constBegin()+1, itEnd = func.arguments.constEnd();
0037             for (; it!=itEnd; ++it)
0038             {
0039                 DelayedType::Ptr delayed(new DelayedType);
0040                 delayed->setIdentifier( IndexedTypeIdentifier(it->value) );
0041                 funcType->addArgument(delayed);
0042             }
0043 
0044             DUChainWriteLocker lock;
0045             auto* decl = openDeclaration<FunctionDeclaration>(Identifier(arg.value), arg.range(), DeclarationIsDefinition);
0046             decl->setAbstractType( funcType );
0047             closeDeclaration();
0048         }
0049     }
0050 }