aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/cppeditor/cppquickfixsettings.h
blob: d03351627689aebf0e7a878b2fd1c9772f2ebdf0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
// Copyright (C) 2020 Leander Schulten <Leander.Schulten@rwth-aachen.de>
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0

#pragma once

#include <QString>
#include <QStringList>

#include <optional>
#include <vector>

namespace Utils { class QtcSettings; }

namespace CppEditor {

class CppQuickFixSettings
{
public:
    static CppQuickFixSettings *instance()
    {
        static CppQuickFixSettings settings(true);
        return &settings;
    }
    struct CustomTemplate
    {
        bool operator==(const CustomTemplate &b) const
        {
            return types == b.types
                && equalComparison == b.equalComparison
                && returnExpression == b.returnExpression
                && returnType == b.returnType
                && assignment == b.assignment;
        }
        QStringList types;
        QString equalComparison;
        QString returnExpression;
        QString returnType;
        QString assignment;
    };

    struct GetterSetterTemplate
    {
        QString equalComparison = "<cur> == <new>";
        QString returnExpression = "<cur>";
        QString assignment = "<cur> = <new>";
        const static inline QString TYPE_PATTERN = "<type>";
        const static inline QString TEMPLATE_PARAMETER_PATTERN = "<T>";
        std::optional<QString> returnTypeTemplate;
        void replacePlaceholders(QString currentValueVariableName, QString newValueVariableName);
    };

    enum class FunctionLocation {
        InsideClass,
        OutsideClass,
        CppFile,
    };
    enum class MissingNamespaceHandling {
        CreateMissing,
        AddUsingDirective,
        RewriteType, // e.g. change classname to namespacename::classname in cpp file
    };

    explicit CppQuickFixSettings(bool loadGlobalSettings = false);

    void loadGlobalSettings();
    void loadSettingsFrom(Utils::QtcSettings *);
    void saveSettingsTo(Utils::QtcSettings *);
    void saveAsGlobalSettings();
    void setDefaultSettings();

    static QString replaceNamePlaceholders(const QString &nameTemplate, const QString &name);
    bool isValueType(QString type) const;
    GetterSetterTemplate findGetterSetterTemplate(QString fullyQualifiedType) const;

    QString getGetterName(const QString &variableName) const
    {
        return replaceNamePlaceholders(getterNameTemplate, variableName);
    }
    QString getSetterName(const QString &variableName) const
    {
        return replaceNamePlaceholders(setterNameTemplate, variableName);
    }
    QString getSignalName(const QString &variableName) const
    {
        return replaceNamePlaceholders(signalNameTemplate, variableName);
    }
    QString getResetName(const QString &variableName) const
    {
        return replaceNamePlaceholders(resetNameTemplate, variableName);
    }
    QString getSetterParameterName(const QString &variableName) const
    {
        return replaceNamePlaceholders(setterParameterNameTemplate, variableName);
    }
    QString getMemberVariableName(const QString &variableName) const
    {
        return replaceNamePlaceholders(memberVariableNameTemplate, variableName);
    }
    FunctionLocation determineGetterLocation(int lineCount) const;
    FunctionLocation determineSetterLocation(int lineCount) const;
    bool createMissingNamespacesinCppFile() const
    {
        return cppFileNamespaceHandling == MissingNamespaceHandling::CreateMissing;
    }
    bool addUsingNamespaceinCppFile() const
    {
        return cppFileNamespaceHandling == MissingNamespaceHandling::AddUsingDirective;
    }
    bool rewriteTypesinCppFile() const
    {
        return cppFileNamespaceHandling == MissingNamespaceHandling::RewriteType;
    }

public:
    int getterOutsideClassFrom = 0;
    int getterInCppFileFrom = 1;
    int setterOutsideClassFrom = 0;
    int setterInCppFileFrom = 1;
    QString getterAttributes;                 // e.g. [[nodiscard]]
    QString getterNameTemplate = "<name>";    // or get<Name>
    QString setterNameTemplate = "set<Name>"; // or set_<name> or Set<Name>
    QString setterParameterNameTemplate = "new<Name>";
    QString signalNameTemplate = "<name>Changed";
    QString resetNameTemplate = "reset<Name>";
    bool signalWithNewValue = false;
    bool setterAsSlot = false;
    MissingNamespaceHandling cppFileNamespaceHandling = MissingNamespaceHandling::CreateMissing;
    QString memberVariableNameTemplate = "m_<name>";
    QStringList valueTypes; // if contains use value. Ignores namespaces and template parameters
    bool returnByConstRef = false;
    bool useAuto = true;
    std::vector<CustomTemplate> customTemplates;
};
} // namespace CppEditor