File indexing completed on 2024-05-05 05:51:37

0001 /***************************************************************************
0002  *   SPDX-FileCopyrightText: 2001-2002 Bernd Gehrmann *
0003  *   bernd@kdevelop.org                                                    *
0004  *                                                                         *
0005  *   SPDX-License-Identifier: GPL-2.0-or-later
0006  *                                                                         *
0007  ***************************************************************************/
0008 
0009 #include "ctagskinds.h"
0010 
0011 #include <KLazyLocalizedString>
0012 
0013 struct CTagsKindMapping {
0014     char abbrev;
0015     const KLazyLocalizedString verbose;
0016 };
0017 
0018 struct CTagsExtensionMapping {
0019     const char *extension;
0020     const CTagsKindMapping *kinds;
0021 };
0022 
0023 static const CTagsKindMapping kindMappingAsm[] = {{'d', kli18nc("Tag Type", "define")},
0024                                                   {'l', kli18nc("Tag Type", "label")},
0025                                                   {'m', kli18nc("Tag Type", "macro")},
0026                                                   {0, {}}};
0027 
0028 static const CTagsKindMapping kindMappingAsp[] = {{'f', kli18nc("Tag Type", "function")}, {'s', kli18nc("Tag Type", "subroutine")}, {0, {}}};
0029 
0030 static const CTagsKindMapping kindMappingAwk[] = {{'f', kli18nc("Tag Type", "function")}, {0, {}}};
0031 
0032 static const CTagsKindMapping kindMappingBeta[] = {{'f', kli18nc("Tag Type", "fragment definition")},
0033                                                    {'p', kli18nc("Tag Type", "any pattern")},
0034                                                    {'s', kli18nc("Tag Type", "slot")},
0035                                                    {'v', kli18nc("Tag Type", "pattern")},
0036                                                    {0, {}}};
0037 
0038 static const CTagsKindMapping kindMappingC[] = {{'c', kli18nc("Tag Type", "class")},
0039                                                 {'d', kli18nc("Tag Type", "macro")},
0040                                                 {'e', kli18nc("Tag Type", "enumerator")},
0041                                                 {'f', kli18nc("Tag Type", "function")},
0042                                                 {'g', kli18nc("Tag Type", "enumeration")},
0043                                                 {'m', kli18nc("Tag Type", "member")},
0044                                                 {'n', kli18nc("Tag Type", "namespace")},
0045                                                 {'p', kli18nc("Tag Type", "prototype")},
0046                                                 {'s', kli18nc("Tag Type", "struct")},
0047                                                 {'t', kli18nc("Tag Type", "typedef")},
0048                                                 {'u', kli18nc("Tag Type", "union")},
0049                                                 {'v', kli18nc("Tag Type", "variable")},
0050                                                 {'x', kli18nc("Tag Type", "external variable")},
0051                                                 {0, {}}};
0052 
0053 static const CTagsKindMapping kindMappingCobol[] = {{'p', kli18nc("Tag Type", "paragraph")}, {0, {}}};
0054 
0055 static const CTagsKindMapping kindMappingEiffel[] = {{'c', kli18nc("Tag Type", "class")},
0056                                                      {'f', kli18nc("Tag Type", "feature")},
0057                                                      {'l', kli18nc("Tag Type", "local entity")},
0058                                                      {0, {}}};
0059 
0060 static const CTagsKindMapping kindMappingFortran[] = {{'b', kli18nc("Tag Type", "block")},
0061                                                       {'c', kli18nc("Tag Type", "common")},
0062                                                       {'e', kli18nc("Tag Type", "entry")},
0063                                                       {'f', kli18nc("Tag Type", "function")},
0064                                                       {'i', kli18nc("Tag Type", "interface")},
0065                                                       {'k', kli18nc("Tag Type", "type component")},
0066                                                       {'l', kli18nc("Tag Type", "label")},
0067                                                       {'L', kli18nc("Tag Type", "local")},
0068                                                       {'m', kli18nc("Tag Type", "module")},
0069                                                       {'n', kli18nc("Tag Type", "namelist")},
0070                                                       {'p', kli18nc("Tag Type", "program")},
0071                                                       {'s', kli18nc("Tag Type", "subroutine")},
0072                                                       {'t', kli18nc("Tag Type", "type")},
0073                                                       {'v', kli18nc("Tag Type", "variable")},
0074                                                       {0, {}}};
0075 
0076 static const CTagsKindMapping kindMappingJava[] = {{'c', kli18nc("Tag Type", "class")},
0077                                                    {'f', kli18nc("Tag Type", "field")},
0078                                                    {'i', kli18nc("Tag Type", "interface")},
0079                                                    {'m', kli18nc("Tag Type", "method")},
0080                                                    {'p', kli18nc("Tag Type", "package")},
0081                                                    {0, {}}};
0082 
0083 static const CTagsKindMapping kindMappingLisp[] = {{'f', kli18nc("Tag Type", "function")}, {0, {}}};
0084 
0085 static const CTagsKindMapping kindMappingMake[] = {{'m', kli18nc("Tag Type", "macro")}, {0, {}}};
0086 
0087 static const CTagsKindMapping kindMappingPascal[] = {{'f', kli18nc("Tag Type", "function")}, {'p', kli18nc("Tag Type", "procedure")}, {0, {}}};
0088 
0089 static const CTagsKindMapping kindMappingPerl[] = {{'s', kli18nc("Tag Type", "subroutine")}, {0, {}}};
0090 
0091 static const CTagsKindMapping kindMappingPHP[] = {{'c', kli18nc("Tag Type", "class")}, {'f', kli18nc("Tag Type", "function")}, {0, {}}};
0092 
0093 static const CTagsKindMapping kindMappingPython[] = {{'c', kli18nc("Tag Type", "class")}, {'f', kli18nc("Tag Type", "function")}, {0, {}}};
0094 
0095 static const CTagsKindMapping kindMappingRexx[] = {{'s', kli18nc("Tag Type", "subroutine")}, {0, {}}};
0096 
0097 static const CTagsKindMapping kindMappingRuby[] = {{'c', kli18nc("Tag Type", "class")},
0098                                                    {'f', kli18nc("Tag Type", "function")},
0099                                                    {'m', kli18nc("Tag Type", "mixin")},
0100                                                    {0, {}}};
0101 
0102 static const CTagsKindMapping kindMappingScheme[] = {{'f', kli18nc("Tag Type", "function")}, {'s', kli18nc("Tag Type", "set")}, {0, {}}};
0103 
0104 static const CTagsKindMapping kindMappingSh[] = {{'f', kli18nc("Tag Type", "function")}, {0, {}}};
0105 
0106 static const CTagsKindMapping kindMappingSlang[] = {{'f', kli18nc("Tag Type", "function")}, {'n', kli18nc("Tag Type", "namespace")}, {0, {}}};
0107 
0108 static const CTagsKindMapping kindMappingTcl[] = {{'p', kli18nc("Tag Type", "procedure")}, {0, {}}};
0109 
0110 static const CTagsKindMapping kindMappingVim[] = {{'f', kli18nc("Tag Type", "function")}, {0, {}}};
0111 
0112 static CTagsExtensionMapping extensionMapping[] = {
0113     {"asm", kindMappingAsm},     {"s", kindMappingAsm},         {"S", kindMappingAsm},       {"asp", kindMappingAsp},
0114     {"asa", kindMappingAsp},     {"awk", kindMappingAwk},       {"c++", kindMappingC},       {"cc", kindMappingC},
0115     {"cp", kindMappingC},        {"cpp", kindMappingC},         {"cxx", kindMappingC},       {"h", kindMappingC},
0116     {"h++", kindMappingC},       {"hh", kindMappingC},          {"hp", kindMappingC},        {"hpp", kindMappingC},
0117     {"hxx", kindMappingC},       {"beta", kindMappingBeta},     {"cob", kindMappingCobol},   {"COB", kindMappingCobol},
0118     {"e", kindMappingEiffel},    {"f", kindMappingFortran},     {"for", kindMappingFortran}, {"ftn", kindMappingFortran},
0119     {"f77", kindMappingFortran}, {"f90", kindMappingFortran},   {"f95", kindMappingFortran}, {"java", kindMappingJava},
0120     {"cl", kindMappingLisp},     {"clisp", kindMappingLisp},    {"el", kindMappingLisp},     {"l", kindMappingLisp},
0121     {"lisp", kindMappingLisp},   {"lsp", kindMappingLisp},      {"ml", kindMappingLisp},     {"mak", kindMappingMake},
0122     {"p", kindMappingPascal},    {"pas", kindMappingPascal},    {"pl", kindMappingPerl},     {"pm", kindMappingPerl},
0123     {"perl", kindMappingPerl},   {"php", kindMappingPHP},       {"php3", kindMappingPHP},    {"phtml", kindMappingPHP},
0124     {"py", kindMappingPython},   {"python", kindMappingPython}, {"cmd", kindMappingRexx},    {"rexx", kindMappingRexx},
0125     {"rx", kindMappingRexx},     {"rb", kindMappingRuby},       {"sch", kindMappingScheme},  {"scheme", kindMappingScheme},
0126     {"scm", kindMappingScheme},  {"sm", kindMappingScheme},     {"SCM", kindMappingScheme},  {"SM", kindMappingScheme},
0127     {"sh", kindMappingSh},       {"SH", kindMappingSh},         {"bsh", kindMappingSh},      {"bash", kindMappingSh},
0128     {"ksh", kindMappingSh},      {"zsh", kindMappingSh},        {"sl", kindMappingSlang},    {"tcl", kindMappingTcl},
0129     {"wish", kindMappingTcl},    {"vim", kindMappingVim},       {nullptr, nullptr}};
0130 
0131 static const CTagsKindMapping *findKindMapping(const char *pextension)
0132 {
0133     CTagsExtensionMapping *pem = extensionMapping;
0134     while (pem->extension != nullptr) {
0135         if (strcmp(pem->extension, pextension) == 0) {
0136             return pem->kinds;
0137         }
0138         ++pem;
0139     }
0140 
0141     return nullptr;
0142 }
0143 
0144 QString CTagsKinds::findKind(const char *kindChar, const QString &extension)
0145 {
0146     if (kindChar == nullptr || extension.isEmpty()) {
0147         return QString();
0148     }
0149 
0150     const CTagsKindMapping *kindMapping = findKindMapping(extension.toLocal8Bit().constData());
0151     if (kindMapping) {
0152         const CTagsKindMapping *pkm = kindMapping;
0153         while (!pkm->verbose.isEmpty()) {
0154             if (pkm->abbrev == *kindChar) {
0155                 return pkm->verbose.toString();
0156             }
0157             ++pkm;
0158         }
0159     }
0160 
0161     return QString();
0162 }
0163 
0164 QString CTagsKinds::findKindNoi18n(const char *kindChar, const QStringView &extension)
0165 {
0166     if (kindChar == nullptr || extension.isEmpty()) {
0167         return QString();
0168     }
0169 
0170     const CTagsKindMapping *kindMapping = findKindMapping(extension.toLocal8Bit().constData());
0171     if (kindMapping) {
0172         const CTagsKindMapping *pkm = kindMapping;
0173         while (!pkm->verbose.isEmpty()) {
0174             if (pkm->abbrev == *kindChar) {
0175                 return pkm->verbose.toString();
0176             }
0177             ++pkm;
0178         }
0179     }
0180 
0181     return QString();
0182 }