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
|