summaryrefslogtreecommitdiffstats
path: root/src/declarative/qml/rewriter/rewriter_p.h
blob: 892c006ce196e775c3f3d0f4c53b9c2faaf20f13 (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
#ifndef REWRITER_H
#define REWRITER_H

#include <QtCore/QList>
#include <QtCore/QString>

#include "textwriter_p.h"
#include "javascriptastvisitor_p.h"

QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE

QT_MODULE(Declarative)

namespace JavaScript {

////////////////////////////////////////////////////////////////////////////////
// Replacement
////////////////////////////////////////////////////////////////////////////////
class Replacement
{
    int _offset;
    int _length;
    QString _text;

public:
    Replacement(int offset = 0, int length = 0, const QString &text = QString())
        : _offset(offset), _length(length), _text(text)
    { }

    bool isNull() const { return _offset == _length; }
    operator bool() const { return ! isNull(); }

    int offset() const { return _offset; }
    int length() const { return _length; }
    QString text() const { return _text; }
};



////////////////////////////////////////////////////////////////////////////////
// Rewriter
////////////////////////////////////////////////////////////////////////////////
class Rewriter: public AST::Visitor
{
protected:
    TextWriter textWriter;
public:
    //
    // Token based API
    //

    /// Returns the text of the token at the given \a location.
    QString textAt(const AST::SourceLocation &location) const;

    QString textAt(const AST::SourceLocation &firstLoc,
                   const AST::SourceLocation &lastLoc) const;

    /// Replace the token at \a loc with the given \a text.
    void replace(const AST::SourceLocation &loc, const QString &text);

    /// Remove the token at the given \a location.
    void remove(const AST::SourceLocation &location);

    /// Remove all tokens in the range [\a firstLoc, \a lastLoc].
    void remove(const AST::SourceLocation &firstLoc, const AST::SourceLocation &lastLoc);

    /// Insert \a text before the token at the given \a location.
    void insertTextBefore(const AST::SourceLocation &location, const QString &text);

    /// Insert \a text after the token at the given \a location.
    void insertTextAfter(const AST::SourceLocation &loc, const QString &text);

    void moveTextBefore(const AST::SourceLocation &firstLoc,
                        const AST::SourceLocation &lastLoc,
                        const AST::SourceLocation &loc);

    void moveTextAfter(const AST::SourceLocation &firstLoc,
                       const AST::SourceLocation &lastLoc,
                       const AST::SourceLocation &loc);

    //
    // low-level offset based API
    //
    void replace(int offset, int length, const QString &text);
    void insertText(int offset, const QString &text);
    void removeText(int offset, int length);

    /// Visit the given \a node.
    void accept(AST::Node *node);

    /// Returns the original unchanged source code.
    QString code() const { return _code; }

    /// Returns the list of replacements.
    QList<Replacement> replacementList() const { return _replacementList; }

protected:
    /// \internal
    void setCode(const QString &code) { _code = code; }

private:
    QString _code;
    QList<Replacement> _replacementList;
};

} // end of namespace JavaScript

QT_END_NAMESPACE
QT_END_HEADER

#endif // REWRITER_H